From 6b5ceb59a34c176c18cae0afe9d677ac20cee078 Mon Sep 17 00:00:00 2001 From: sunnamed434 <65300126+sunnamed434@users.noreply.github.com> Date: Tue, 8 Jul 2025 16:51:32 +0000 Subject: [PATCH] 08 July 2025 - Version 3.25.7.2-preview19137126 (19137126) --- .../redist-server-preview/Assembly-CSharp.dll | Bin 4170240 -> 4170752 bytes .../redist-server-preview/Assembly-CSharp.xml | 39918 ++++++++-------- ...RocketModFix.Unturned.Redist.Server.nuspec | 2 +- .../SDG.NetPak.Runtime.xml | 584 +- .../manifest.sha256.json | 4 +- .../version.preview.json | 8 +- 6 files changed, 20258 insertions(+), 20258 deletions(-) mode change 100644 => 100755 redist/redist-server-preview/Assembly-CSharp.dll mode change 100644 => 100755 redist/redist-server-preview/Assembly-CSharp.xml mode change 100644 => 100755 redist/redist-server-preview/SDG.NetPak.Runtime.xml diff --git a/redist/redist-server-preview/Assembly-CSharp.dll b/redist/redist-server-preview/Assembly-CSharp.dll old mode 100644 new mode 100755 index 7897cae92c9cb3edbfc30cefa8425ac5a4cabd30..9035515fea521848329ee2194307c9c6f9b98e7d GIT binary patch delta 475335 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

4xynP?)mMlqF$Yp`(rdUQrM=_sULN@b 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

{ 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 z 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

?M=vF8$%S}%glW8 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 delta 475188 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�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

GV^px11LAXMGZ_U!UX$HxnB3#D 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≠P6uw)io+CI&>aFz3h##Y-soolxrTy6Jb%IXue!#4c)h*lOy)R>~sg*N3tZ8K zjfGGZ%bDesq!_i#D3Od*<;q04y{)3~blSgQ)E9u5Df7hl(uY{;&j$rAVqHpfC%*7s4+UO8{ z#F8*x->7PtJ6LL=c%9J!mXRy;b5kwz97{%6?y-EB9Lm|ardzSz#E=B9d76F+2aVvM z=x`k;u=K(z3cC1NTCiYxs6z8u8bWBl)-oTk^h9CRam3U%^ITVDiK=Dv*Q0gJve)?m zY|)+=aSDxA*R0M#`Jd5)5e?0*ES1mTMghqd!4sE2uzr8p<+X^LCAuy)w5w5MM(hp|+EP^w<$8!R2MJE)2;o6A^=AV$j; zEuNrXIn#84gU;h%q>NrRe`G1o8TB@=vK&PWrRr_|#j==F^)_Q}>ni?*7yg zMlj_(&>YQ@jdLDkCbN9)rRb~&n`fAAak3%i9hNRn=zTxbe8@5$-yT!e!_AambYZO! zL-LwAm*qMaHo{!W(vee*G7I0)sm>XmPWHN4g{d75B0A7UoAp_mLMZDu%?y^REMv^o zEJA5Td5h&4tSf+N!(yTt{7t74xKYvlZKAo7YJL{GrfP2@bu%zsa( znsPN(cvV1?&5lg(g6cx1nB!S?BcsNUsb=fnb+W^p_1orXmM-h{)4@At^*?mXXb7z> z^^TePrUZB8GC_ zZx;Di7hg3|r#j%7t(h8tDCkRbI7<--75|kvg2jN)b{sONvy|tI4x5`;9&lkt%{%Vt!2VzSUMJR#(c_)(Uk9LeR`ZT%dm9BSx%Ro^JaOLnh=_Y zc)?7G)u~!?%tbR*Nunr&aRQn_|C4!*rNbF5m(1MRDOF^4z-2QjyGN8L&izT>nc^AE zoRcMpCJbCNFDOYA`57uCtYngs zNEUic7-i+pr!oqUe@9v6Gn>W4SBu|=6wwxCgk|EQ=qdGENNia21MTdX_&WJ6;t#nV z`@>oK1HHn{|JWbmW8=%j-$aTc;XhF3cOgZ?qBDOrHolHW0|}-6`v*uF>&<6W#f`qd zt1ntaS!;rlL}Mf*7WFP`P34&T8=}?iE8d#PG1)%ELehwdx8~~@)c_SsW7#ZgladT$ za#F1L$3wl!Ti2MD5kV?g#R^jK8OBpd__nqQ9^tIkELB)4S;;JKVo=CJnfTe%CLYn>ObOBW>Kx@(wW15@tsj&-Mr~PD>q(Xis3JWx zRJCer5!u$@!+Si`RkeDu4Bo0o*{fN}N;1TVMzNwYimzsU!!h@=sh=40L`~}q(?t+< z(Q8{P3ajEpD->S`$?8}eSQa6R_@|jHfG>@iQ-LbDa(6j^!35EDnF}Z4qVgX zw>GjwqZMg00@fv#cnDS6u?m&YsqSGyI*IhG`b?8BgiXm@>kP|n4hmZ3OX_5KN5rU@ z7S;%sw~JyTF;ca(b}7j)UYZase5iCQ>mJKkmey9eQaYb&czgH)V%k_eu~Sb@>1vHZ>G0v_UGWbU&+~lE~enzjY^G-7PfHyn0mThUM)pSy7A4YD>= z(?QQ8Xau%(u=PfDl~MQ#I@C(eY>^|rnYwZfw~$_4K|`Z@BdpJAssskD12zU(jI{Q% zOot>YIi@7TIF3Uj6*9^)YEh~T;||N~R)Ufg@ydl*H9=vtb)~k>`QA?u^sU5b>u09* zc#}<+h0)d@EcPNj+A-RC#B%>-J!~@CimRhD`s_*lVr#VZl#(RlMy*gjRao-X4oPQD z)$|$-TXPJx)b0X%3;VIo9c>dNV>36y{skSVHe#-m?~&6cah+ z-m~)MwNxF$C&qhL+01#l_{3QFe<#NK)(({*!|02-PxMxLv9*_FG=$ztFSahRT=@$h z8KZVftU@*wlVSYJveXJ{5gmHRh|`E!X3b~0btzh$@xI0TDr-Aa4NPvjh@h2Lf4|B| zoEVJt*iif$YZS|cuq3h2Y#OT28fyc~y5(5+0Vk=1#OVPuot^dFp%rOnR#fe*};s;i07Wo~r-YV2fXZ=0yGtuZrZL$I{ zYZ-|9X->!|R^k36iK4WtW~zANQ>#8xT@W3a+pOPNLhtXkTVjAt7TWDQtc5J0Z@zb0 zM_7JtsE_d7)*mdN1ob<h=r&!Dkda_0|8?r~Z|r^+77x%3uM zxIc$rr{HA+Ch7)H^pLmpxOJYTOM0yO;NZAbd79cXQIh3^mB6y; zPOPYkj}lH<_-K;0Uev_lLtm5sUc+od&14w_p~k;pZDBcv6-cOsE?T=-ZbB&LqE$If=RA3yKIne3 zj~GH=$O=nOZ)&sGocsQ{sEy==wK zrV2%l@GDj^C6O2HSFAHS#>ih^=X1sKE-{q>QASs+q8Tb9<9oc)coFS!)hfgC6Qq-p z1}x(+S-U6Xn$?VD2Bfc&)>=d>EJaF9ecg)5R5^<}SV^Q&Et2vc(_E$-)_5g}V#+f* z*-h&b$9xJYHd%<9R+%}f@x_X5`l@uxYRZy2LhtEYmiexZDT&YBsQ6pfEEc&ZR-_)l z4~|$%-&H+i%oF9$>u*_emQb?D9=c_fT&gqLe+c8BcoMv2&1Y%Z6a$^;(A>6$E~A(f zahEIot2LaZP(i&Jzgll<3E$CwwI(d%@sy-h`VsqAYZ)io2%*Q$U#+iL?tQGc?5=fE zi%|iObTqg2uJz<{RlKnrk972id)KO~MHTiccE??7sFDmL;KL7>LH@9oLU8`$p^E8G z>!b>riAio48%NN6tI!I)_1Rw0+wqqbvr5bQuoPIWC3M&N%PPwfYS+K4pV#P^^7o@f z5^_d9Ya#e3A>1H;TSbUaA$lsGf}p>xQc7kSc_A~DRN$D!^`g|B{-ITwrOcl(EY(=1 zmWXDlt0c0cA6h{rc%MZ57dk*5T2FnT>-bw8-P8}QQc5CKd}vir5;>_JS_w+_30eYu z3O-nUXdQnn)g$Yyk_=;P7aUvYo;g+Glk-tsyQRVMxK!erp*3@cnm1^zkk3OPvwR4pw}+Mlot#^E^JLoIXKI~AoF zZ-A(ym($+ILBqe-Tbs*1%rS34C?=PEoMU!C=-arb>@ys51ah)`6y%Z?u@935m!U#W z+hsqbN~ejdcVff`O+8H5u;(-V-ZBd7F<`=meT~J3Z?m>R^4T#T>15rJ(H=;Cdj`vM zxH^0ZDPZ4V$&U7*=6}W(8+EG7Xb&y@7;t#Ms{0)~!*HTP)9oV}hIYmd(9`)h<=4z{gt7{-UL*-RKi722!0zOfhww zVXdLqGU&e_-9|l}FjWOzM^JIQrAn3|s^y3izd}mbeU(H`v=a7EC0C+C8I`c-u!Qm{ zX>V78$?#|5#GlBgw0-fhe9G9~4NW4p6DBqysEnO|3)MPBJj92`zXdSXY4>Bf0*OOc zH{PDCC4738vu7#E5LL=zxD7Go?7&vN_1Sx&O(Es&@t=~+6j!TawR1=X`(bmY6=UN> zMNmb%=QbVG15yK0$^KPIWS>>C^KPe@3^6b!4nGRhsaSlOsK%M&@L#^hNKrN1rpr2D z`GL%h#o{Y?g|j5_BdEGvL&=q>X4g?0WLMn|usH9;3d*R4oyg*HOig z3i}*$BkWUJp7<_NPjIPiU-Fo4f~c_C_ShY?4Jl&(DSbJuV^3vSkx$=~>)0E#7|qaN zG*hOIy+ui)(UF=E>Fe0Lbxe3y)U|(9l40Z-p)aR(?JGOfoqU#23iJSjk9F;zIcO7l z8jbQ}P}Tlj$t>d_gnk;ap8by!tcQSa9+u)JP~VQ-sT;nmsncjXN|-31 zic_pDYW=)zd`4TACZai6Q+vLW45RkQXwexl&FrHrewOBT%r2d(8{{R#`0N179~k59 z53%e)yAgvaoniDb^8dvU$5kdl9|TlzjY@;+Q(Urh2;#V zx(}h-jkJGaIoDj@fTVqcWz^+R%&%HJV;e3obTO6oeGZy1Q6C`E{+A{H(O5A-Rmj+@ zTZn!vD)|zn>c>Jq7Bx-93}rd^B`qmI8+MYVCuAAKwa>G7v)9p55ZOe~9`S|F`Wy5} zc0*d)<5>oBOlv#;J{|K5$Gl*dWT9WCq6)RO$FtBcQ&EN5+Nmt_xk7F2J1k>7u2DPt zz9wVZ$9h}a+yAn>#7*7aj@z&I{YW${^=#VPxma!t(>tiWou6f0Gu_i`Zx>UNChqv- z#Mh`$dwZ6WnWDyS+~->KNg-Gg+2z)j#ai(O#rvrXab1RGsW+ z4(bXWsiV7$UF_m4eK6=wx8E*yNhN9GpKYkHl4%^%en5;Tt|Fr@_DrUs17gH&CG%K{ z){0T*eOG%iOFamk!CmduA&JGK5sv(B_J=GRH)3^AX zD6Dr!FMGTevG5HHjUlF&edw@m>87|62Gg1sw-W&SsZ>i z7W+TN-t~>9(x?&rFxVvfp^`M*jVTD9wAc;5rI<946EUwNqsewq$xQJe7ryXED^9g% zam)~jhDFR&dx??^(d&(9CDZJ69P{I072}Dw?Jb;92OKh#(K~ka?{s0g`(W`aWb}@G z=a`n(8}*ej-Hth~<;k$rXIcFVZrZqF1W!MQU4;Je_ex^O>yw0d`JH4%$wsAqHYF9v4DAOLm@?uyH zdJI0T#ai9=vkxfinW7{Hg#La8vzzSlEKj3~w{gqaX^&NsCh{SMntHdrf#qGqXgRMW zQT&AaBt5wAw#Wa)Ged5a)uR-m0-8-!8>on9Jll5&=tyL z`Q9$3#7h%1QCNEfov=UVpfxNf?VU<842hdE{j}dH`v6NP2wf{r+2)g~c;g^ikz#(Z zU6zlNbw}n0`vsOSAan@-U?*zvj2W1cPW{@`b}9$G2ce+T_6#k;hXJd;nAmd0p35=) zI_h528T);fF1PV1B=R|9uVkT*c_^PV_75x{ti#O?n|jv1z~a5S3R7?uU1Q2zgH_m+ z{K7JPwGcy;+}9!uyppB;de$DAQ#Wj_oOr9OVov7LyW{QV`f`53-te@RY9r&+_2Yuw zHn&cd>Zy-2vx$p#?R=U-KWKj0?yUsRyGWLftgqNhm7v28*$Vl`&RWxn9Pmlus zWF;BKY}}}BLJIn~u&iMzhbcl=1&wl=7J=9E=RpdHufhIsoFev_;eepk}Jh2;?nqf@c2 zzvr{Mu-549)I_R!{z4^mK6!KElhQ_@hW_%3(!`|ttf2p#%u$+j|QdUWtD1i$Rbz6M?ek?HF9Wb@V97diGPm^4(8UejIWG($U%Tv}f#oZ^- z^G9K={A*ci57KwV*8V{iC?-vO{DnU8+V~4qB*`#p&Bf#^q-x_Yp=6fP6fz#-wegqZ zpn{!sQ@`M^%94KurbnS${es_QDGs4AfEWB7Sc+ASRWUF62P#Q3>Om;xMgKI8d2$~v z+#7^w>tD!{>gu7{ww`~LqC`>qC|1GGhQ}rUXF4PC0~VB+h^E6ETO@X00}Xr29qs_U4yTk4x>XMgS*BpIS1Ut&A^yDEu{ly~+Qt4lE{!p3+5 z-Ag*|C6Up>uKtqsJPL{op>_2qHBfa_!$u3yL|y$Wvk1-p@9E#E z#rO#~D*C{xmw#WD82YZDm;a0s{G!pw z>g%uEh>Fh;<o5aJmQc#qI6`}nPIViMc6a1p-f46Lc|5qiEEt}wfpd_+o6Z{35 zQL2>i4w~RE&N5{*ejflmx(WVxC0>d#x{iJqJHg*b2Z>hG^_qBzq;zayIBFQH??gOOAG<+Q{ps-9V|CZ_1tLw;}j zQSAM$=!LQ~&X`de}J4orv@V-T~--$6;T@hxP6 zlAaus8Koy)toHX)l4Puc;OG#m{lj#OD1qniavt7sukj}{J&&t9eHFCEpT;u!oR+oz zO)Npk6cqM>znD+8mzeNl3}#i4lx4|}n0ZQevE;+Z(^ANK{~?wpka-qvTOa!SnL49e zNJc>${Ucb8;5_&Uve|#fuVd&Z2%2LMdaM6_7HM%Azw7PK7Kp_3h3xP@l|`09cKe^r zB41vP^2C0B^(=H5K}Y=cS?I?NHe+F?ul)_P$ZfmWPOLRb79vd96* zb$_QUatw0Y-zAG&g#70Ddot0(qQ&TDfPt(zX zge>w5#0cDP6^VHc@^qkf>xk5aJQMJGzYrlGs7T;W7HJK6HqftqB&H{%Y+xZvf!x{E zeWPMvrIJL^;JCgeRSazJNU0LVv8O{Z-zmXbd6V=#s$$@@$3eF-rbn|_Dh6(IP)T%9 zhN7@afu}p^;y=gm_BcqjKtYxdAyXlB0wq}9hs=i550qk|d=^3)1p+L~)?wOvE+Lu* zGCHZ-R-y>a{%96hu7koCm}Y^^N+MUqW`Tn`#;DpRPOL-L%>v&kNj4H7o0Od4n0+|N zM)bis6S%}N-$1q@rg`9YCw1Gxuh-x-9DoDO7xKL_QUqkG`PzY{YDMsj8-ZC(n zGa5BU{{mjiz<8Ducm|{@whW|Z$>=z~uW1=rmPLxM!YAK>16iaAhVt76vUgEC(a6&X z=M#!=A9$Js6A%n~MMGJ)4;17efl=|BDyW1ORqMIi@JsH21djPWLH8Lt1x%LaSkR90 z=@baERQn}bRBcGoHcLLgBIizlVM_4Yg3fz-R_GcSrzpdq^Pc)gT?13Js2^S_h?s7H z%q;Q{8FddV&m!6V7`zR9oJI0O`UJkpBJq%cf%95Cm34j4@W5>j`r|5&O~`A32U)}q z85uCTQZr_VlZc@X%IH827P?k8t4vZbi?l+jHv;ilq#a~Tpf-y~$-08x3Yb}fdP61z zI%bi(SQ%tdAW=!A%d$K$SxMyNTpn1cV~k($f(o-%#PYxjC5gt9 zSezWacgO}EBaXE5^c1rdf%BZKU8L~_?%cR>uL#ss zl5C_vs#nBsmIWH=nDF&uWx&U&sFS+`o3S$Bvfy2dr{=1y47|vsenb*03#|-vVF~?) zHpbegRUY-X8`ORUak2g|Dvnj5t;a7c^j3ZW+qY<&;iioT{e z!#wo*vGs})jaDFAC)ldHh zqF&b9L2t}x>vshzuuun<4!vE08Y~U)%%NjCu~-oFEj$GEVxlK`YP8*f0W9|`>O*gL zU^q+YXxJTilO=RC><&y|2^|f)15;Q+N5k$wI!owi@OB60GEKoeb*kg;z+x6UK(wr8 z2^|f)10S)3j)vWVPg&G{#ctgl*rOz}TXzQz>KO4R?gBT_(tEtXRi<7{djm1O^`6d& zKEYiC?F$51_U(!me?txgHnFrGkKbnuVD4|=JWICtXpswYIFP@O&L>A+tR)TkI?$Bm zNj$}uf_xkB`Z1M8vL>HKiDQ9jEYBiYMFbrWwC<}jy17I@q@M`Xe?<$8tI%3hCjvWJ zLd#X04BW^fHIdJ$z&|X zCh2n;LH%`wXf%lCf1C^4QIa7R;L1p&A3p|i51<&lZPkojnIwzpFrNhs{fN{G)mUR{}b?W(8aKHV(Au^AuK~6RKUWAs!8*(8R1ksP(^rZ7L|qNFSx2-~J6;*2&aG zW|WE%L)3OCNruEa<+8{uNKU7>l6^P_bW`VZrYXrVKE$Fm%Mg>#SxAD%cH=lx0cR}- zy;vNt@DNncIi@55}ZO7@CSOetrElE`hk zj5Fu4m@>{19pi;Fig(sL78LLN^jJpaoSToulym-gET)3<=&_gzPL*MiT}JnXN=_Xm z7`6}9x{}lMv7jnWfP+FYRh$Kn#Z+^aKNeHX`S7ur8qW5|Vrn==hjWFzXZ0nemQzMi zq#0{DRYO4>Q^%?QSWF$~oyTJ8IT??|)N|f{ET)08HXMW37PMa*IFB9+YUISdMseyp+45M7&-whZ z7|S{MSd8V|e=NrDh!K$u^Jwe+&XbBFTjn_VvIJ3#<1~FN#&rUZ#kkIkkHxfbx;z%s z!b!~YY<}EI7=RjY2zGyEapY$5s*9a^^f1)5*E`SWFkE$f!tDQ!93H;+2G3+7sQJ>W>9=bLRXv zNc3Q7^PIu(>88t+1A7^|mK zlVh%O%u9~fkb@p_&`XYwgF^k2XjU5M|Wcd5eRpF4BedaZ)&@5rks;IMa2E*#3sz z`o7M5B}v8;{q%!JUuU@2>i;Af1H$y|Xxbe~;yDQ2D*8GJ zN|Hrp?r8A`wxh2zo~6=RyyAuQcUCIVM|F&oO$>4-j*XmCPeBGdd$I^U{+1 zk#52WXVW-J7U?#PaDIA=M8E$ijEqJ&x3q{au~W+^>8ds(L+pppdxO`VEi8R7Z$iCE zaPG5&UJ1P6j2*9ETc{N^XfWXo=N}MyMB$tA8%}KEe=GEclS@fT_*8tuDWFBAs)`D| z;ndb5+7*ftA7C2XSSOifc8h4-ZLp5B({TcFreDQ)8APMrZ#gxR{#(4~y!3xENJ*rH zJZF3IU5TPTd`o1M?0l^xMKnPVpdDnQ zb4H75>MlxdWsyFRNlt}HRK+V#wC#w=>t98QRHufL3s2O6;6#HwuVbRTKlbY5Jk@E+ zbZMb}noo81v0TWdpWRcPTS_7aY^r0XMjC$*icfXgW|6$)GGs=2_vw4)*-E%+X4wet!~8%PVptaVaZUg(C|2VY?O*ExmKRMz3E-Uer=l0-p! zaRD;g;GATM-X14D`df&PoS1Z#%9y%8R%}OwHaewPPT{*}8pzq`RA9LTp~m0nG-pXF zrEd2v#3n~F%>dE(l}gu>!@@PW;$eI4iSm zD}0K!50%-j9^Gj5BmJ&(ax1*+lz3VGMfeYDStNuW3JZnOPwyUgzMd6n5jq=AIOml_ z&iqqO<=GUIA=1ysic84nl=DalCjY#Q$xx6pPVEdGv%7Jec<6zCblNhV0>xl{?|Ela z7Rd*>-jiQ8gkVslBqLV-2h)PKZP$|oz^U;aO_t?%ynlI%ci4P8WeKNG3Mx0 zcYDN%rV@SKU!1mzW{P<=qJ)E>yUqj-`l>XhBH_cb-<|C&gR0_(hY|CKGx%Md5yf=C zS0H~nQ(2lX#(WUOJa9I!&=&TFC&DTY2$2%VCtvxNvW;S{uzD~U={D=N&`bLpk)@NxSmbNVO z7U(sea?7rnD_)3i7BxEa`V074YP$M+vKWDi(9xSmF4rm4NjL%RkVkG;vd_rDgHw6s z5tetZ>0y<;@-)kAOwFM;J$dCdmgl#IV*X+&(n|M?^U8lbrtk1=A9bkn%BSC>t=%V9 z-qaP!D~qu#Jg@JNdF8V#723y&(WqixS)FCt34Idgl^c}o6-x{2H^q77btOq+wtF&O31xggpRY4@(>BlmZ5L^4j`zcJf?$;%f+!8gp#6*srVG*F65XJlV!LO zD^5d7$*C+UkPAvSX%X-98}HKc+ESH|Xowyq6<=CDxr_wgJ#PpHl~t4?LJeD5j$j!% zC01NR)}`fGmM8gzduch1B{z=q^{XiB+RG{HBvBA@7pcn1rAksnU?(PgLE`1C6{

zh<^h|H73uMlf75!I<9XQD{?|A$Pp|(aO4+)RFa!kQB0zk+Y1+4NL5*OwU#3oq^}LB zCTFl*!Sr^L>hd8=hNZW@hRnHEr}A!$)=#@N zK&ELjDh!Sl-4WDK&S81AT%72mWHn1YEaC8goURnmRj5(!ZJS2OIiH4bU z&H@*&eZ=R#Zd)HdB7 zE3h=7PF9lTYjmHr)MUwpc~4qQmO^1^AIc|3sPX%;EP0y6lW#H|E*uJ)#`mbI8brHgOMQf5o2@n2w}UklbTy;-_V3CSpriGGex2c@!<9v8}bE=z~#(6+8+ zse}81PPJ2un1q*%1J%L!Ez2C1M)D_4b&NM7LEhc&>21BWQfHkYqjr#_i8DB-yF3>q z5@aDI8DiquC@~yaHKZlpts$uOj9|YWe%ou)7_+* zoWZi?K(si7x5>@q*aJG%#A_JjK&s~Q#)E5VA1PeqBQ z)uV(Zx3J`VT8k}jvHXr-$DkO$EP06X!H4-jYYE5~wTM%Qp%!vvZxVX#*ag3hM#&sG zhm*a@BIQ9&mH?q-t~|qX@-zMQt1IuY)O|{S^zO>qhgI?71S(Cbg7Vf8Eulfjpq&3L zNv@3Wpkq)D&CK3|SJrDO@kbGUY~36sTFZyWR31hT{0c994ADjoKCWe54NP-I1GbTG zvh0AoujFl()%aFpCFBM9ZYTz_PRUx97Vq;1BrnP>OdUZq1?)w6fQ8m1q2k-h5#Q_L zPeIOnOOnWv_WEBB_qwaDrORmd0qwaDH%Vb>csjwb$63a{oWz<8?VtMJG zD7DLa%C#(I@DxHjv8T*;Qg7;bQ-1;9(~~8bGC-73Pg$9z8}2_;*h{iL%U}q_yd*7_ zCin4CJld?6Y{T**FuI zNt96^IiIB+gkt*0RV>xI>tm>|+|1GtLNR^i9+rN;>)r8+JmN8p08!8@@-)krQ*}^3 zd6ne^gkt*1dn|jf&K6auzZ9o*!=8XpOn;e+WnmG$%Ld58EW05TGeACfif;)$i|e3) zvL*+Ogiz2x*@We4hCV(9NtY!iQy(9LWJi|s{Jqz!vNy|J2<7vt9L6$(kB`A}_9=Bs z$S~G{=$sxbKMN&$qz|GY@+eC#jHFV`5P6ZMJcJIbq4GBtmt%&?*dKIzEP1Gpk6|(o z%Vr22AH(Fc5S;(`zUmJhG+fr_AR9tK!==TN__vOEO}1glfKbe9vO7!ipE_oQ9KbRM zLNO!c>nz#+(lH}t5((WB3V|qSq@2M)U!le5s2(Nfvs{5t%qY2vWh-a&y4)N}#reE0 z_pmJE4I3?wuzbuLHd>xmf|HYcozRW!E&1Ra6^0cWaEaBD^G8*@ z*mOZpi+W3Ty{0A9Kk?*AC21mgsP3_Na_Du6NfWPe&YrxcBtv+id!#2<-q0C^Ix(L7 zREyEx(r1S!zhbF9T3;lyL6Znieyt?(C^=r9R1$fT9WR&Mq_R?sQC{^JaR&`D zUan!92>C9YXJx6Xh2yLEI@QW`aD-(gQ*<6Xf?SRdMg2m?U|Q zrByME#8Xg`yvj6|GfI}fu*~F)lI4AtkGMh;rMRWH<4dm4MEL~EQJlbUBIgvDhvfnU zmrFYz!o5=+6dm}`diNR_o%sz9Q#R&1(FVA+M6X%5I_X|kM! z-QNGgS^@>45W|GMXk|XBh;c zm}zo6OIMut6!W%BWf=;gn73sbOKTi11w914Bj05j2BM&MWhsiypqMmyh^30!Fgy~c$>U6&aNbi;x;)D=2tpa9%PTA~ zT%norXO@Cop_%f&mT-r9mhADfK0YquV*?uToh4skxdp*%7Y{U)=}-kdEIeC|W;p?& zcQdnPq862Paa1uwF3BSF7?3HqD#2k%V&@?-%`wBmJaxhbh>wVbL25i zqAAlHc}q!}C^biS-{;8gztDDM80j;0cXW>I!?GMgSt5_y;VeiQe zEDN}-_oTOlY3v<+MOz?0W0?cNt`!U9d6t40OQ&a-g);vg-5v=ni=?0B_09Ubj`w9t zmI)Bb=Y2VpWn(s-&tkdMV>-yRM4n*zpo{KoEtTh3jzB1*rBeK=i{Ht`FO#)duCXka zudt+GOpE$RE9797;uy4WXEIvU^B!<4X_7dfA8NJ;>+=B(FkL|3~K3K^x=<4(bk}pbc^= zON}RW%!e|a#ez`GhjJB5-+VgeBe{WP1cYKflKWZiaLh(|goOG(0$)u~&_;QggBm}f zGuk9?u}BETY?3j*=@!})r<-xJtj}_U4rtW*Qq->jPw~ zyrY9u=YqN$TcvqV6(;WU;Kx?Eg(cM8*eYlIp<_ZliLJ8!BQ2qx#8w%M%7^Pmq))I_ zwpEhmg-1xX%0Y?}!o%D)hLYje2rBFM=-XsjB|2GcWVB7L*AlMKc6s2jnC-G@ zc9oBDq@sTDw?n?bax*Nwl^|!DiA!1UkTFk0nuuhly#M5X3 zT2z}+s@<}BuK&jDkpV5?n9t?PuwdkglI@ixbL(WGrv5@!))G$kg`A#6=$5lj&dDN_ z&pvr9Po&ZmvtORcA{4VUk45Jm+T%nu5 zA=!*&0EDi~hh$5ZdS~>F;;?MT(i%cBhvk4G9u=QqH02J!5jl*5+Hwcrh)iJ#^+>*! zZ?lAYBwx$LO47vg9C~E%sQj44!4ExCVMpaImZ7KgL)SObD4H+Rc`d$)`Zb#G{%>gT zxa?h2@0{mO#fgS^`~SV%sU^H~PRM;6^LBeZ3-*M($+DN_q|9AR=hK4al4h;_L*CLc!rztNoTB`*GJo0sW^`5tl|(W+CqGgW$>^N?PRAH` zmtuhaIefe$PqRcX!<%lgG0NRq=QE zvyw6nZE-vh2kYJ#!KBk1WofJC|F5-28ev&rVR zO~~hgQjGVI^}Ci3+1zO=D8=}YCEDGqMOCpd1_feVtEnz*u1{Ae*6pYy#i;*Fw7OWu zxjCCrOp5Uqzhlbo7G{|Qp>ry`TMmNqQ;es_>Tehfw>AeAg;0>;HfK3oI$Gpz5G9^) zTd~}LNL2a>w;Rifr(#7eykX1X4q({~>4=yd?r1G)Gq#{To^*5jP{quDM#oo*-v!9+ zqCE9}hGq}$hvW&1o@m(O4NNqo(1PJVghC62CA6qYQMU-?pQQdt_YQ6eQ*FI!?{Cp& zW!>soJP-RY{V!)IS}_sc9o{TtIgmPMLkPN(Jms0359_(J1% z??$d;ayG#!E=y4VF?`s{oQFQeTrCuUpK6Ym;tWwg3fUZ zE*aD@9q9H{qD!S4-5|G6JJm2oUHkxF1EhM@Ey?l%q=~1gy{>+!r##p_q$E=P!ETX` z|IKKyTb4y-gnS^K{+rJb_l%NAK0{oui_WL~+cbL60`KYENled!XyAW{JA)-ORez{E zhb1&sf2g}ui+B}XciL0KTr<-fA79P0QJ0b72Bao!1$jLzp(Y*UcJ8X{Lgx%E$1&FJ z#X{#y5~?!R9j7EwJef-mt&DT$u)MiM7d*}_){XK>6x}k>Pr`96#<_`1ulL2h9GBs7 z?pBumES~!-%f>!BCef|XU1zk6CCPn><;ct!@hq+}6Ww%{9W0aF&so+gLHU#2drb2< zXsTPjhuT&Vw@j~^^|m{{r;_lY{*HU6H%XE>`fiNqiZ*-4t^JCMF^=Kc=Vi!rcM!`( zmKp9+Eunm{)USJ~A0A9u5Mt>bsu!lZ+)7>E~Jun-l2hz`Ur?I>W zp{vSF_Zmy?`a0Dtx6lBck8iGiuJC5N30a7e&31b!iJYJr?jR-l$Q*(#%W#jqs(vkpD^&2a}Q(Wyou)w^!O(ErBF_uSNBDkISZlW*z5`<{DyxR%N2?b5Nj zz%BHe5`)(Mpj+SqH=boZgl>Tg+*(Q^m0sv3=$KGbi-m56l0;D#&)7+*&_dTcrh`Pw z_4@dH-~El{>2+~J#$bfq%{hXKk6gl*xV@A_&eSFDAT1&tKb1NaSub%rj?|mskJ8Tr zOWpIYYq>pFpB+ox>fRfQ!gXBg&KyG$+4oD`JxWrHPpjxRjZ57_EMG!smo0VMj@4OT z-4QM7*2FV`+jX3l7`!5*R$T6iw<2XxOG8BF^5pnpUOFngDtyY*Mc`e?>ac_^0w1{V zs^^y!UJo*14-fF<7|tNqoV%&iznHvM~a(`YDo6IcC;g zyu#{l;h^_GRK4}?K@M_qWEX8};>#uXJC11&$sZs&qhmyYpYgLRsPu>KUz2Dv z6GiAk|FN4p^ZkkVCG`*R=dIywqOIHn`7|tQD>Hweh)zF+?h5}Q6uLVsp$6IO4xOqR z)d*r5Np&>*7w%}5f#>v#w=dlBTEqeLSZG&#;a+0-9_47Urs>^9zeqHjdK+K39hlNF zsbX-_1YZHetEOcfK#(wo3HjOGnFB?u?nLcs>qs zRXpg&k%vJKx~o}eBxe_HhzH$$S>!Wp%Mtfd7WoSDt(!kX=R>JZKu)@j7Go5C zVUITBwA+Q{K2B~N&>b=5p+8gToImT1VhNq|XWe8ak#qi>J445W&!=M~gTDms{h<=fu)_EJe+mR(ix?WK|;EPbZNiuTn#t@2$39i&4UjJ5KD`JB==jfeAM_M-YWMhN9 zS>~3-B9VLWt8c+0ENSWhLHSPv?=giA$0vd%-qjh6-KH;0IfB($+TgIJgYU`USS69` zYtG3m@RkyN`jpGuF$Fun zHWHT%C#IdB04W`oP2=mO|{L;2ve_mvo@)IA5^n`M zO_hVSl|+iK8f>~m7hi0To^enu7*LXEG=SjKTOq0i+i=ijjH%MJgzCZWTEsc*#szo= zt{xo0ve}9gXM<6qM(_;F_H{yiEnG8ri{*pA^yh1}f?bzV@%TRUyuK3F3La9DB6=NF zw^C2k3SLtbIf`lp%P&*44qpsv1y?Fb6#vx6wW?7RQk`dcfa9tL3aJ}3m+Qj%B8EEH z^@5L9M1(HH^@Djm>6*pO+^zZea{BUJrhKuL;G9bJna=%X|Uw$?F56Uf^r zzCo}P#~i4mS9WL^e2L{p2o>KjxR7Ny2B&Gbx>0Z~OA3TW%^G>Z?V7^dnh@NzIZa392zF-E+a*i>BTUb``NRt)(jpZtqU!cvfgHaz) z&XM!QAFS*tN)$gY)CY(^*q0^yqL3_7qL1p9IEDPdQrmTV&=bv@$XW&~v(OU_HNFgf z%Q9%A9v5(fk61zr(FKFKcW_6A?o9L`6b!cBp|V!HgZ5C1;N+bo_+_A>*+d+UkCwqj zN+Jhro8b6e|J|}S!TCybrRmUX6TI{}#UzTmSXn{KjJ;}9H&Oh%CPe4=>Y&D$>eC6^ z+9vqQev%YpE5@s7O#6l45G9Gm*N~owc_BDjNs`FTL(wk=^M9%HsewM(D~M?uJj$}> zioR8}4+g$gqq>RW3;qzTeX!U!I$4f5tb2=O?Sltc{^FQU!F%88m}*J7(w&0WzSDB` zm5>xVu4V7LAvw?TO#T0nb>9ItT<^oc&)VYZtE^s@Aghb$J#5t3d#4_~OAwvKs$=b1 zJ=|asHF}M* zj8r1SFeW7xV@4_MNsf}lDRW4E0l5JAj8=}3+?N8+$&FE1R*_K>oAo*NsIf{rDe)|# zG`yD-&PZdG{v@+#3Oim&Ao-TsIzd@X^0qCu-d0jbDw9l9PLoW4Ux>r@fNrBa_K4!) zc!FPdi%k@-#AZV&I}tZ*yz(Tw5O>6hSE6zV!TUJBL(4$&3UQl}s7#fDF^?f8QMpwB zbFK|<@O%YgCn;)#Oy=1LHv`2F+ovc~Ne+-qRnkyc4GvHI!wcwP*w0(N%Dy6xsnjGNZC)~OmY_~he@L7Vc12AeVnL1Jq^1^xl3ZvboFcH z8Ob1;u70fqmyuOunL*fN7Aqx4oO$PBr6$P_aHNV^<`O0H1FSU77uiy!zD?xJ7ndpR zrQoq3E=`szMas&;Jgq*&JIX7RvLprw+)-vLlrrTghTik^jZ%@MJH6-W8|7n?)v)r? z4SLE-r9rutm@EZIoZ40@(G(>A+p6>+aZY?&m6=lFS$4SJTnnBN+oq(DWSNJnYde&y zmi%&8bQ)jA72D zZmJTE64=P8%4R9??7K_w{tY-#Q{_*KKxCnN3uVcKbnPDG8%jIDD_HA@P8S zsloTk_fn1qo~uYxUSLe1_(MwHkFfR5>e?ZtNev-xD*Fc|PErzU3^#qmSaw*sBqfoJ zrh)UYQubq6>p<4&%0d*m8AXNCm8h(|w;D6H1|g&kGuN^wu1KibMNN$w*XKPuZW z2!1sc%zDFTQjRGhwXq$CX)_*IGNj;M6qP=yRIVdp5?P5)Z~#83jFyrf^k@_|?4%M; zG0xlWPb&5_Np6i!Dhs8=v%B!QD9ri-iJMX8|Cj0w#ms|`ey1G>f(p&AiVUjaer^tyMT+PAhX8qr6y)*9~Wsucf$IpHcQuOveQHTn22SGs=%7 z&K5eOod5q){ffdGz)z{gc0HrKYFwa$Y?+%ZXA@EUyM+~yawq6gB(8d$QIeZt72Q-D zND57dx6?o~po&cw4EwrV8T*F(i<|na(z)6Dsn06oq_}0CRg$Hov)k~F98uM?%F+KX z<}~Hw?5DHJl4#7?*-z(S_Yyff>YQ?2id)z@M{{R2N_*#*ghW714aRwopm4+Y5?v)_8Zu>3KHQCRN}v76?P$sj59Q5b7f ziLv}KHMva1cEPjAqJI>K=_Dndy;uroTc83lUkDMG7!k|h71~f(ftZODG#fG!$s%G{ zJCRX5vp{Y_Ohily$)UHQ>>fzLnC|T{<}bKA`UIp<%ugggzi5woWwW^@A9qeSr~Vxl^sOsf*gvZ?UC;~2FwN=JC}Q(lmgG3ip= zJslZy35D(X8P>HRCNidc7m>=1DIHT?%AK6@{WYZ_sC3NO1x1#@f_f$RPdT_L>8_); z1gR1bG2!U5VBj)XN1X(J_$2TLF*o@Nq(wkP=-LIlMCdN~gBkdP2t5MQAs`s~c3HVv zcG4aAJXTDitY8BB9j@3fLulWabScT6ZN4CO2V_9Z3zDBm2F6tGDjJ&XInV~aRRb}D zV!D%DBpDntkK}4h5X*#^Au-2Do(r*ohQ_=>VvBY%_8MeZOmq*KH9H#|%7Qhxpo)nl ziERw)oglF>OGui|4QBa4M#Q9(@@b@(}W%$awjI>?Eb zH}6PukaIDWhr9W-2l*wY`#Uli>x-M z@9!kno`tgGAfevOcjO{SHt*%pm`cRl1t7?2UX!d?3}lp7AoqQw4fV z7m$y=4M}_?HN8V@Bo+(Q8-i+iUr2FBk2+p9L1g64UFvwhl#;}@pMrx9Qq}RUct>KT z^v1It3%w0LCIqSHeLylBK6oTXy!ze^6W=){wrMJ8=R{E$7M}#k8hEdu$iilUH1a-v zN9Kbx_EwIUsboyWOnA|ScRh(HUgR9@4WEQDLRLbmPrb2|ViiPB>mRKt`>+Q%MrX!aJ*`LrQP9M2u+-PxrTf9mLvt3%nzj z;76D--gFRoN_>_VPJWO~^^Tj2$(mGyuM0xfnm3cA5r~K}yoHl6=HEYIAs=E)?^F`e zVfTV?FPnlf(}LiBDM&l-YLag|!HqwV_TJS~A*KejBPZMrIt$dv8#zrRbN78$Z(0T99>OEz4XiBen%6TI zrRT$7))wTpxAHr}LGF2#cceGSLvQhUZmL+2XWo!xlnU^?$4rnczM2b#z?xj%U?z6G zo!!@+s8YosR(u*`Iemo}VNlJ;V73I3`+g)TS`1!Y0Wl?fnIySDL`+HFzpW*?Z7t;s zTZ!9aM7vP-CkM=?$*Kuj%Pdy>l}wS6;DSR+XF5`MSF>iBjL)rDWi<|!jq(Nf=$OOR20U+2}>{@3H- z_B==<-ySLMHfrKalj8P=CcaCQO8q&E{Q;?(_^y+DRVv6VtiAiB(wIP!{gbID#kbc z9jVCSIQRK>{hwrpFO7mCVIo!=k{P}No3VHgND~m#cbcToB$(BMSiUzTr@stl3JCW_ zZNXHxQs7xykaoUAl0!*w0s*nx``YcqAd##mPzPTu$wJ7wKS)R4o_Ay)|U& zvVIiIlErs@eJaV?JfUm`6xPf4m}J+DQ052e?Nh(Qd`ex1Z^D7}@!cYsu`86V2kGat z9}~TTFRX5r)O$B36Y?F%7rt%p$N`Z4zBeQh>)><>GQih)52jkTI+&dV8R(lyBCbi! zgADSez7ul|WU%jn{Z7y=pdr5EdoiQCQ2c$6p}xK((;G6D2{PRG6G?hXD0>Ss!go%J zyQxR`uA;ENci~5-M)+#)6FDcaPcPwpmytewpDie!9Up{qypg_fGRXa=I=LARxDfgtfRh;I_#F)SdWtvYt zAd2_1yK`Xi22xG)r5}_NIzOxOGL-cNn(m8D!=QsTLs%*J&DBg_rj%rM1$M_!i22eN zcNp8z9GFw_An0*UbZ}3I_goO!71KI4W`Hq|g+3IWhj{F9)-M9W7c?y!^%W+)f zV<)qZ4#7#GJ*@ZpA|;{Z2ifPV^^SZ1a=@pMtbyV`0!j0&mf~m2H-@mb&ou6hAAO2_zQNF8Ut76Vw@k zF8OZVS+H>%{1QS;p05Yah|c8sw}3e3$lJaLciu1hjxSS6GTVC?`WWPT#~1YnR=5Ye z3ScnEAHF#xAH!fKDexJ0 z7?%EonDXj}|0gC&ttKU&{Z79ji&EQ?EbffA@GGc&NUCv^imIJJR4N*&lDb?kNR(p^vPsi6_RaPfU@w1l6A?$CcbY*oe$zb@cf{?1} zVw)%t?t%)cuC5|k0m)v0)KE8(93`o#?j-5b2RbWs$lB_Dl4CZ*rHg3rM(93ZB? zdYq&WNkjGAQ+bZ`v+_iZ)n6!RDoIoI7D)uvx|y0UQ?%aC&QPVJ)#4;O>V>fV`C!tf zrjz`+0i~r{_Zg;A4u!CMP@z`p#Aosx>1X>Xqc&|l4)va zC?=~?Er?YFG1QVI`9NxbSZW=TtNn4~w^LP;=Y3H+sQpM5w!-bvNgXG|IY){Cq_Y~9 zQxulON<+6oDNC{dx)n+*DeiM#omEdRnJUmdJFDCB3yFu8b~!nEFhO zBl$6y$)8L0QKzH8T0kzOzUmSRii4;8#c!(msozR*_w*NP28pw$zff6(Xjw87d%8aC zjxW@*1%>!oP$BF?1JpevCki?eUI=6CHBf8OV+W{%iArR_17@H)iDW&zut*$2gVp&Y z(G)XOT~E@RVuq{xN!~`ns}CX72=z3{MR>wdlr>6iSQv{RYQrPyA}CI6PBc=7@0Np% zQQMIG`5Im`3o=&KNPgC^6OC8flMKngDo#)blT3mN8IWqCI+bK_KkSV0>U@&3ec=2j zice5C6KyF7zl;Q#tfrFGf;at(H|HdRd`nLr23H1!*jhB~%>x|%A*9ja%j$4~;t!VL9( zWl=nSy0arRY=-);6s$Bn=E2x3HLS|}wVtI`CUI&#OKmU3J@96!Ijf3Pe%bYUL)Np@ zxN0cVa^c%N=BcMi>cR7bgCS;~TDdyLJnab0u%Y$y)y+h8TL!T>2ufDXk1$Aufkl^fOY zS{Re_tn9Eh+pHEQ`W}gWt45NvgLAp)AKTO@k}UA(p^)urb&@u9QFf?xNlX}aL>Jzv zHkIN&o3l&pEyeAy_Ad3#C$dI?%c))J8!2ud-lZ07CSsDA(;IfFhLm^~(jMmxyVOA> z^?RUvr%oeT*$!p5x|*cCfwIR|znA3p;l1i5lt3TetH!m&;+-?zUiBD>Q=z?T!B)6o zE7A_ytCl3GK_{X8YI&0B6mvkes}gk|h$?#;wJJW*o$Y>H*K-?Ld3CfPR$u3 z#NCVM)GelLePAb^Q@@wu?!p8FKt>YQ5GLit!h$xus?q;)|# zuSSs+g~!T8stc+@(yu4VMRhRAcNWSebu7t+ZYY=4DOQAd4#LkKs7P1TxfGNb*gFt42oTj*DHH%VQRYiha_cMDxt^Yj!AbGOHJwKj;n>EmpW>uPrj z+DI3i*VVqgFqtzUyRNqChg;|?I`FQmCrL`=4U#jv8|pKXxiEaqhAQ4vBfr2@H@(=5 zTWX>Z_{Az41iw@jExWB|P*6Ua58hGt^v7fs;JHCDq})}D4?yWp#s8@eAX!IpUtLHt zmQp=Xa}LB*2dMamYOECa%HeaON9t(`Do7Q2to9y+$(oQnQU4`bPjkk<)ri3u)43Kl zBU3F&l1{zqnHnX<-5t->5u-(_WIHg6eXcG>3JfyO)ng>i?s%@A9wU>R?cutqOt0J*f=b3{h&;gL(r;YV?fj$B$TDSoC5 z#xX9J)`-L@K96RSJfzEvyjo8Zr$YI)FG!$5IR7c2#Y%EJNQCzJ{P!yqp-m)lDiopZ zk>Y1h;dCN)S%mg8$$T0=3Tn4V=FzOFkoJmXFNiIY71qL&MPY97MYP?E-Y>q0_A7}~ zd=bs_HO4sIvxpYH7{wVaifDIN2=Ozgdlu1t_y*;la2PFYIHrqge-b(Uv$$4ZB?dX& zv!oVBqS7U1DeV}E(>)`#&8sk#Gg_3-LtILodmll%zw&hGl`u3SzcpnFqt!4 zL}`6VobFjcODD;sVW*;|uEkWPsEU=eKS`YaQCSOGhcVPYY*tmvL*#Uj>RKTZr^kMz zMM`mZPz^2r4v~@DVQXmhNSqy1L+efA?4TOj#GRPR*+F&<&D@JMa`sRS?J~*lVh_O% z`dACvhcUf-V$ZLoRUr9`M)*3KM)E%paiv^O8%@%luALib-;%7ORE=!y0?|I81(2+X z_Ad#8Wa6^x6RrGyEZ(^+Z?1Vsp2HbWbm3362_(+&)j~@par#F~tyL=K{eYnW=nGStD)J) zMb_>bfT1lQan=9~EmewpDPm}aPs&t*IisPy`9(-PJNY9HafWv68cO8?cv)^}7p}?q zPdxhs-gPUM1uX4%3UU?-+G&qTHbIPdbiaf4mLvmqkdRJV_UoAS5|S=jA(D=is+(4p z(?XTZe1OLc~{|o&7poJ1v9U{W@G@w?$!Y{}`?f zxsSy=dvUlHN8;>`5!!STXLpR!7LYi*W3;wf3atN3qCGTL+fG4FZy2u~Bx!a#NdD@_ z){c`LCyCcCk@PEo53eR@+F!ELfn}@&%}?SqH9< zT6Yqst&_E3Bu-nWXf}z{)@j;I5~pD^v_&NLAP+n!44r6}ww7oCZI9X7P74eCBIcNb*oV3$#B-2GP;6NXsONvMFe>7W5ysbutAl)pCX57!|_A zi~YXSj*+YyiLzUJKyuIsl`(s?@cfvn5_}1Iw)oBDUaf|tBzY|$#;<*vLL$!PDC<_ zlGiY46mmeDD8(I`4r*ydWbtx$?1qhhP^(uAE3`2vtE_aIrb&rsr&v~T1lcT2`+}$s zjOQZjAGGn5%vlFNtSu&Sdc$EYO^Q2K9@ZuncZ(NW=&+U&B_x5}Tn)b=gzwiJ*6LM2 z`5lTEF?PDvOOm?|o~{ican`|)YU4?qb?{@_3=(G@{D0aa5@#L!Cv6>xvkrb-+e0!3 zwucx$PTCr)C~6eXK82NFaVVbBJS6=hQO;=LBzNH)D7Mf!Egwlk`cZ3!R+Qvd%IAVs zhQv9QU(%|RIQIpvX!Zh0Zr8h_Z6$HK-WBZvCF}i?$roW=(ZVZXrSp(n)l`ybl55%= zl8PiZw9_PyUtm5rwQ##KW;BL^ZfPn>0tMaCCXw_axvQm+oFw^E%Ou%E@<1zJ1#|W{ z#SZ&Wvq(n5oKbAWM_TVHHU?eVf;U_qYsabyaeMV+twcQ`e$R@1VQd;aKl@lKOR^7S zmXwB4l0D7fK_Bs2=_gtY$>7C~bU_JR@ITQ;)hj60f81roC)yec+PV^NEI!e;lZdbV z{Z}3Ca%-na*22#M55Zyfw^qEqsA4iZ)F4Dw=&9CMil1$~fOF_fZ3s!wd6ef`90-)} zXJ_ep_JuZ)f=ZCQ(x#GhxqyqRZ?riiIY|E17LrUQVfqS^sEe2?i@u&@7{!F>+k}Yq zpJgx~73;NO`W_1M6+-doX(WwksV%!6)d1VNsVjc?BZoeuAxiz@xIUOezc0nl#J(3- z2RZa2jYN!}iG435ryeB*)_=sl7fUI*^zg3VWahI@Rx%K-fHmghvrr~;)7_8%Zcu-MX_vF(*Aj$S4UUn7G z>ywlL5m!qEb%kU&#T3?ik<6!<8;PavsB3)FG7`Z}U#RM^M* zUJ{#brqt4pll(xttd9OG$^YoqT0Q*{$rfsB13jo6w*JLuSj9$qev(|zVf{zkI%%Sp zBWg-3pP%TxNuo%a>&r<-)6&wX`bCmMbWpX_?~yDcX|2B|8Tu=By|#Lu_E@3U=ivDd zap1-1QA7nP$fwsQxk?#nxvvPbYmV(P|3nq8}z%K?h7X{UXWHUofK{`a=?@3-{8Ccfgi8M|p2Oio`j{KhsZi z!kDdt#7#^X|31^_bQa_u_n+wNeWWTaNQu8K)rf|-ihQ9 zJm@Ss^(eg;$w9iwJzDQi(v1$+v9>;(D7_rs2_LVIC9z@tBQmn}1dJ?@4#L7_=sQWazywhgKTF?FaubpXnXMlt z(IH0c4!?e!q$#`~L-hQ)`YnmoOC}@!$nt;2b2^~U<^>C6Y zbaX7$3zKw$BUlu+T#qD4BKby-BDo)iRa~VvA*q-HWsS}gf!f`U8@CBnR|Nl9iO|d;JYbI?R~GPCTTCB+~rH89)x}HGtlo zCZy|4Nt^-Xh`xS`h;c`YBl?DoLfp~fh<=#F87+?Je@O8&=YHT3{izT!|8Z^z9@YP& zAm@JIk9v+xSRvhV-@#52xiBi^~d$_9YXA6 zCg>E<30;xoXK564QfE7{cp)O@XZ<6Tz>MgW-bjku`cry45~ua2^s$srBF%_S=~Ja7 z*@0{K(|Yl}SXhVIA?y+qc3PiGvU*z>yAE@~#S z)?1`wMo&&cGN{lUy%ovJ=pd#&2x5Qe^GHsS+|zR&!Bm||?(1<<=CRT6N~XGy>MuR# zQH;4X4WAl%sE3nezZ(kY-;VHfuby}egF0CFyvrj!=_euXa}kg9G?YM(d8B{%tB8qb zosD3;qSKp_Y=CEC#P$7S-E&Rm9O$r*_0CeTf5>kuJ=RAOIUVG&{xv3JPLF-8Zz6GS zvOm#xlVt6R`~GkJDM>%NTzRTjyN(UB=$2)s-k;=Xdq^do|9Pg5BAQ6gyFAx-l1!&( zd;ZZMIT_J4%?rKq4Y`E^+vBBP<(?3?=fBijk~j@}sSl9iXDd30O2hp3rQYi4`x(8` z&1bUKfsOV`?;<71lhg=aKbM!WSNdlpb3mp**L$T8BIy86!e@ou`dS}J(g!5B6dT2< zw9Ve=Qz$5U6g<5LFD`nc&nEGLhX{ zXQ?&t;x*W4^-AtC))Bt(^8pkVY|JHD4-3oUS~1l4hUD-tyu!?C*jtHOe}JdOY{mf+ z=X8?8I6>k}t8*IBV$gW!9GJ_<^)FU&f0i&-35w5UG$C=Wl*5eM^jfu9TxvXAm z_%#?L3pcJZ_>DT86@Qog6WVJG3PPC&D;H&;9TCP;U zs?m^2Jc3f#$U#z~59U+U$e+c=pnQ$tb)r?_!q})zLA@4Y)+LM-k{1JUU@l>JLNL|6 zevYgQMRB$nq>?h1O`MJSlr+YNi5Pc4D{1TrDzQYmh&OB?AZfu3L5c##iVCie8FuoFugJU_LSmaoegaU?Z1;$5OL#zrCbJMY0O zV`Rvncvh2MyjjMmSwLhI&xXRol48xSjG>W?hjCEI2S#_2m<_>9yg9e5v5@52GQ1yH z-iRuQ`P8GgL6$crNP+ub3OuVRP8H>isgiJaDA11b#?>O&jvIHwm;v&k@rp#WRY;Uk zswl>Y9VGIpU_?uS_rhkulTZc2PqKiPxGNaTP;54tsG@O@f(pWwkXQ+>WSk(GMr*oN zj5{Q&NU9l`B#R<3)klV>7`F93tqp%{gp-{89Jfa;<5F>1>B50;OV%2Tl7b$BQB~aw5W=Gf_wTxyYPO93*5GnDjYRfRz17d0$qe*ldrdDDv z)-hHRwSdQ{gw!>5lQ?_2o^gU?0HhLCtZx_AlNRPZ2V7+ z7bIW9$yD6CXkmob!s7pfC&Y!cGV+l)+oO$9mBiT|ZH&%R=qR(HFvXbJNMz(^BWM~K zV@zlwB-ztvO&A*kF+O9m6u)N_$V4e~FovC45BGRr98`@mpU70KA&rcx(U3%R>M4*) zHM%#)7_p`0`j25GO7gSTEpTWwjJG6RXs|SmdeK;@?Twoxi(%CHsw3S0>R>z~5+BVHV|7O(>QgMN3!QR08aLXY{1u90en+Em zTa+R9P*JvZMCtGeZjY|UWsMjAIm3DnH)mone%nk6BM3nQ2TUNh6tMTqU_k@}*HX8B;wW znQhD?@si9j9!r7wPc1rm_zh(NCi|FzzB1O6l%klqM#w^p$x1QvjP4|UlKDm|$y1uz zBpZbnVXADD&jKSB1%4w<$rc)?DQE-9BBRpRm@K!29qntQDM^3&k;P)8C&?+2CB_(% znIub%FG)t1!8y`0;~NrtKhX*!h3G8FO5;b8)+DQqD&FjCL5^NV-r=iZP62HOY6zWReFYdyIu7 z)yiU}_Zgc=T9<|2KZ$mv8V8BiQ_w-<49Q(8KFzpA5lA#sM-tHuM8k~ICgW@M5$=Z@<})}`2b=iG6_C`RI( zJ8l|PNaVRgd}`yC(S*o3dE7BH66fS`*XTv!oIL(CMvyq?jt9nc66f6U&{#s^oI4&H z-;&^&0@i>2HqwZkQ$?n6mc%(#JU4EUIA@9%#&Z%e{}E?_S4NFx*!pZVsef%mll)G{ z{TqXm6kICDN}Ihkl8K%!!Qu0*ae<@)ERl(<-x^OySOkuY{~BeMV_|Drgt2`v4F6}e zCvj!~%)GS%V@^@d%&hqhigQ}BnYn%?(iECFFf-~qln5QC63iTT5as9=M>5h-ocHB3 zQ$2zbywi!fa0(>`L^Ok$VW&}?GiQ)(7Leqg-?EsIXGD*|1kJv;z=mt~{^CU@RV+_h= z{zlS^7UpxCA#bqKNw6v)egT!o?C=)lAG*gMZuTbmasp0S^O?Q>!DQ-JTnkGu19VN{Hg|X7&BI`Kx zp_1lF5~u4$nwe7E4jXA!F9E5<{jU?WVI$4ifTC@AWOd$z{VOabQ zww#$pA}&=$w<>R*km7FF56$}|PK7=+3zQUP!Sg?14MJI5J;pvXRY`tU0zPdoB+5)B zNpBFuEMr z34WW8S$|}XCD}$XHOy%wJz&Bv?)=s?=aJN0fKLY0Hdm53-LtOwtrT}B)-z9|xa&Xl z%%L?zjogh^&zwQxY_xjjHYtAQY>#?o+mCU3I6tXqU>YQI&)_m^BeN699C$79Z?F}c zn7v2}*%4uKpM7GEB64co%uJBt*1Ea59wpHAnwzQhu=wX;S=l|vy198*N;12{@VYqK z99RGShDDpnB+Jv`{3nKjXfu_lJ$&KeF=P~N&TE2McWsLUNK3OoQ^kipqGsTDs748K4zpJ^RCl((IH&I2h?&f)t*)WY14-0fR{~$3)dYTVO#0MBcgluFX;w2eiZXqd03tRR;^EA<5x~DzJtUU-ba@sN2jF#fI zV~80!Ld2ldf!#60Y$V0+iHi5s!y&ifHYnF~pr_anra%Sk?m z&yk5OG}^Q`5Y2G)$A`Nnbm^d)rlT6)l8-sXYih3t{7uuGUvAYEHh;+%466aqU+5vkBvk5 z^?@VB$D`zc5e;J|lC1d4iD^Gk#3Zv@v=e8Uz2h;JbE2AM4vUxbA9uPj+nhi_hpAW3 zG53&EQi9n_SljWNBPU@-1?k@SSLS9CXJnjfwn)I3%-T3s&NF+G6#5WnfAh_F5V`*I z1FYnTb({I-92pePCNIW0{CxBAWRa0Oe9kuuPmvNh3C%YjE)wGQ^ZBOdYZRxS&o?Ve zanGFd&C^1}{Kq*_E-)`q(0zD+nfT%5BJ&2x^cd`(i_PH0B5U|i1O0M(iJ6_mIb4^T z1*N!^US`%s2~>KSIcd4b$98MI%v>VLoqR4ck4S+hndyL8W}YGWn&vjk&0k5JDy}f^ zkr*_E|Hgbq;#6^^8MZ&z}v64?#<&C7Z-kz$-nhz(}n z^_Y>E-5s0EJt&1=+aUff|WB@v%U7w3hY z=4z5V^t4ZkxtSz{Vs@FCB(3Q5`kncPBs)F(wcG6d6BaLjZ!P9Od(0C=e`erwse4U! z9D^>=19SV$xDzNPDWg<#J;_;0b->IZ@lY53-h6QqQ>~+X(#*1_NaWAfVgDa8b)v4~ zi6p4d4`y#EZf`hj{&`6xa}UMCX2@j}X9pcNqonvf1*+g<%ZJU!DC{5jb%5B?hs_ID zu=uNRT7ri;Y@i!N1zuy&5%afSFen;+!w5m_h*v{@CHivig?ER z$;|m1%5{1u_a}1*$)MF)SP$rWC(J!0J-!HK_3j3N^t*|voPKt~Hsd6@gTqPlDoS7+ zJZb7LL^8M=ngwQlko8HkgA~8~2KqoLJt!t3ZwQM8`PuACG37zVNEsr<{jt|6)AkdI zy(rFsr_4Q4;+g+(7(2Z`2;?!z>qlYi6Zm@cX|vT!QK5KtyA2LsXUuJ{P+r5aAf_Z| zOwVf+(N-a6&B9XLUUkmgZ~rS>7Wh%rIrBV;)2+^#FQxcdBJKNgX0883DnE#*!3= zpW%us{$@@jX+(0)kd_$RKwQ z-8SR$hzg;IeSh0r7$GE)eNYO&9eT&yNFu*B4^y-|<^huFMezQ@ALdaK=UjTv%n)Kj zMq-E+9pq25Zb6YX4l?o3WAB@nNSxmAzziuQV*G6PZXC}am|Y5^bc83p#B**B%-$r8 zF5_hUAuLg0jJ)WC?eW;mRYVA^|2P+&Pt4+y+}8hX)+{B0@PL^L75dveLE;=QPt9ji z;#pJZAEFsg&Ekxa2P9uX z9~Q}8nhi^1jCi0x$Sbq86nC}wwHYVHZN_VJ>W3l~Zdb9E@Y-w`g<^}#>Dkb-H|9@7 z&Zd5AvI-)|&(xJ+au|MVwjyyhvQ`xm&!*Y5 z?}M$nMB;%0(XtS0rWD-xD2q=^tZbVIC__b<9YCL1s4mGn-Xhio0R6Tazf}n@{1L0Z^gr)=VjGTXR@XKNk5U zc{Uft4|C?QUQ3Dh>;(}wr*l{#HDwGw|I-A%caYN>MdY+Bx3xk_JQJH*R4BKVzm`ZA zFFUM|JXWL>xA<^ta~%=mmmgi;22~8V{*>aLxbs@s>WUbg=F9m{UaO|0x$L(wA#67! z%WL(mj~ShW??0r26tL=mBtzhb2PoZ}U`%${hA4eopmggP z#D0T(3R)vcrq#ovlBPpDnEw>9inqj!8p9>kUC5}YwTPs4 zZ~V<(F>5V}8Hv~KC9It!bs%do#FnzsNSq~zNGpFU%-LCjC~cJ@>4Qu4HY;P9L~G&G z* zW0kiiN^yIPUEX?bVAlI!mh!L6D5ohUuo@U;bw**svSgJDFj3Z33scS6j2pIsmC+8R zaThGUg7u;!%B{6dOllV)$&AP1Iza{7it8$99$Wq}jCnf461x@E4THqcB-&BQitUc# z3{91+g;M;iCLHA$bBv_vWh|_cb-E{}>J^Y%QvB>gT3x7Q*-9@FY-GzrjtCPi}0$}8j|xQ)vWJG_JN4&$?DdRB+Du0BkK}L<26{t8dhI>02c3s8w~9l z!Aml&!6eNt!=5e;FJH1ol2pwa#G-P-n!hziN-|R@qgvKVlC|*l2eCbBSt*ptPfvr@ zvZf5gvd)!vV!j_}BQ-yUo3WOaA%l`xO1Cgpy12+Flaf7veI`CTQ`@RM2vdcP2w}}Y z>R8)I?q3dK;jk0yTG4|srVs7ude$bAV)SdkdRF@2BI5p+pM68WduU*V48dgabdlB2 zYD%(`mLM8goTSk&cy@1W^(JXcshV2fk=&8xM2n!mvGB zS*=Kld}1b+SfLZ|HE3(?qhz1%!Z#hXwGNTQo^a$C z$(^YotTeQvt#yhdwO| zKkN7rcE+}rXPOLRpVf-Q zzHQ>ZSFMgj`6)=V29N~7ltlCo-5O5PjxMJSYYfRO>S(4FPm)48Th>&PQ?$a)t=S~2 zY|6Twl}xm+I~La7T1rx!ZW?y5R+CJnwZD$m|D+^)UR1zK)lSxViun>gN+d>tPS!1w z565B7oh)?*ZlO7=Z9JWHwpI{@#bZzxtMW_?`e=I=+4`=QISZwIK8)#RC4PzWswPTz z>nceenEQ%t*2AhP<|@$5%aZi87Lp7s2)}<9XYO8>`Lzg2W@97p#PGSbO^Tn*NDY=T zpIbSXU`DHkhOsKp(fV06m!iZ#%j$v*vQ{iZNrEai2N`aiUXGHuKbXaUjIwThgYp%K zEs7s&tzL^H?of)2Ho+>r0mVlZnqWnd+^CM-bAmORBr_m$NG8C7LpvyJf)%n6^Vtjw z4nihc14vpl31Z!Cph?!kO&D~5<}FjKTO<$Q#*(Pe6f1Hk#vFk=gea*b&irSJRXqh` z9+tzH=~l*Wlr8rhxw(g=kr;Jg{F`pwBf0>;f*A-Enr;=|i$Rf3nUq;pE0XT*FlLUm znPf#R9KPmSk^3-JY526pNXTcdl}hpf3UwZT#jq4b)KopG~u=?9c!v3PXYTdX&S zk@l9yeZR%(n=T}o?Sc*>HuV>|Y z!dH)rSJ0$bqi>@`_Q1C8vgVR>r?cXBRw_wTdfa8VW!Jug$y(Hfm7W7ZY>(BRWHoH+ zWl*8L)^L(0uwlja*k{d=;5d2&L zzP$xiJZzni637vj2A^br{Ev06c9N6-PZqTJ)oe-CpcVy zyp>tAe;x0LqdIO)q>P?)$HGon?O9RTt$q*4T`7L{TWAnF3N1Tf^#~F%epc=U+^&RU;b$w6 zBsndZoraiGR)&;h_HY^=dl%DjNQAQ=U16^GC@>pzlmP(>lvEl)V6%7E5C zgbLlTo{&7GnBS}yBrR+jc5Yh5^J20VkahNIS=jH^5J$v`5;D4NHO!AODUj+J$e-5L z0x0+5aj1T3?TSEg&I?biRFZozpouCzx9*W_s}Ik=2>Qn=UXU_^th2xs>gke5~^iut23rg~-7l`@y*n~0~A*H%U$%x5?hCNAh+TUSZu(=`8$wXg`r{4z4k zX5o!!9+$0f?u*vs7XXSH=y3xea!%vf(rzQ4m{4UAou!bpS zcG-DQDa_hKl7kl|sZ6JwoV+7R4!Xq4#fOtr63hAG{#S0EA_+D%$D0s&_#2Y5(9gxX zULIaNQWWNn@OgM#X(@pbJ`ZmigBAMqhY(g4TAzo{kTRG39FUD9--1-^0_#6{_(4n- zxPS`hXQU*16d07nAr#IpVT|W95Yc18`3;KsyA57s<>h}+O!l^Tk(HM}!Wi~nZtR}< zxW_B1i08?Vy1@J=A0I^IoG2ssJSp(mx$kklG}E8!P~Vhcs`G%4F$24ICc!g8G0Wi@%oAe5eia0}JssU+Ld9XT-sV=871Wuo|+JY$%R zR22qYkx^ZKbr^~>AFRu7ksOB6TMQue_ydyiG#{+bGfDbEK4OWgK7T_J+XT031KxQ! z<~*h`N<+SPcu`#caW-rto+g9b&DfZq7%P(nx=dq!ONu+yY|LMb6EW^YrZN9?Jj!+W z!m?;sW8O~++(o2I_r`n(h+O|!N)wPK{1gQ_PkJ@wzmPaD>G_2JLE^lmrx|}r;=H7% zIscEuc}Y(+51)XoFHZgJQ{GgFnEz~tdmv&!ZNcMYP_k#q#Sl5{wB&zNGUr<#EqPhm zWzK6zTJiQIM_@b`OOLI2I*If1)i(SziSzT-w*0CTxc}w+T2gMdc@?_?h$VB$dY|V}+b=C+R$%gg!dNbUv5Fc0M{}@-;-x zM~67yP2zlXs2%?wiSvn}_WY_8x6&PX++tC@`xVHJd>)DOrO1x_kQ7MeJpa>?pOADX zs7hJ<6--C|c(usrPEggp_~Y`9{N4s3?-uq%%F&?FcfwdV_*+MwNzw^KZ0e5uImyl2 zPRvV^wA--$gF&y6vgHnTg8n7Ry1|j4jiUIYK_8BHDilmoJ|LkazL8EdvXZ<$m4(GZ z|LDlGk*pjA&p(S-$8_d7h)%%0&#E~Y>%wzMaogIJM@otJ*sb9M%utc8yfz9;rDk;H zUQEUOAQA9$kFK1PY^0cOe2A2zOl&h-WYmq{-XvSboR)Rt#W$lkweH5dZh3#>_u!vP z34F_w_2BVR+$#3q3s3@8?7_EUK3GK?>ez$tCUWZ7lV?c5I*Kax8U&Wq$9EnrK zo_xl(_p8{O&z0g`!e(}uHi8{5y4cnXFz>GZg3x%=vVeo7-|A%7o!V5G+ zg?jTM+eKmVo-27mNOY1yi=3EVBsJjyR7^FKWc-d`HU_poWVDN@B@hOslk~(Oh&dxA zNq%N_40NL2JcC4q6|yNHU+_aaWb4_4<*?8MGK8m-^aEK1GJ>zzDJ#u9Bd{!c3@@32 z?O0M6X$)_Q!k#}4V*kQSW(=Q5a&HEsUUO#ObhO`NA6*;~a_* za}&ksA7gpWKZL}y$fcOicy2eni$TuuI-XB`BqTAg;4q#qlmgE)G|0llr<=#~*Cb!H z3YM>0n!rmw7OC9Bbpo$0#qD|%_);lO*Mn77zSAa}3lk}^?ApGNZM0O63_Ya{VFE$F(ghEllV3v z;{88P9g}#T*YDSHDla6(t>RQ(LyEi0rt&rJs!Gp^u?Bu>Lt@alOm z2D&Fc|Gbialvj}3)|I@T6t}G_xhchM>q`Cw3LE+u56+c*8Ro;9Kg5G`C0|QYl44fz zG%4@Qe^&8<`QC5GD!!V;sr4$}FaP^hT*HS-ajUq7&y;f1&O<8km_&;KGB z0wN0Az&#PTU7bF(fnP0%Lep~_g4P#8ayrolt`l%Y&nbp6&KS3m zdrG1>yKEz0Atj!zgH)nIn|Xm!BF6n_y}g;=E{${=UaTZut+<)zDJgwg_j`6%RD zo={ncJ4f2eXOcLF;#R(p#JPgl%2^dmwhB;nlEV&Z&GSUu{=^zhygl*^l0@^-kWN z#Hsa8{rh5hGs9#?yLl6enGYgjcJo#k!@ekn`Rw7nPy&mydw86bc=l8cV!>VE zXAgXJjbh^XPxj0L3J2QHFUcTyD1{`I=lEDuF`gX-DFiVGcyTGop2;zo>U*w|tRhL{ z36v@wM5H>z=TS^KAEr9YkAXn>$(|-e>HIY%>kJ~29pO1^isF+!`MsFzN8XgA8p$y} zTuMCif{0ZA)1unwq$P8YrOPid*82hU?65QMkk4l3Fg9 zXzCR~vm(=6#sy8wO3MmYG%>MUFtx1Ar6{Gyw5+VG?9=S~pYxtM7p^@|4}X8}d*1V& zWzNiA43_bReN$M)gl6GQTC=diLw6c9~RJ+tyXtRPcRgFtwkT3Ylx^7(WF-gpL5M~jtYKgb+3qrO&m0r$yf8_whYAKv=LT4W9tYyT5t zy)dqgwN8@cf$&MxL_42LJ{u$n)v7Kea-tQUn?k9kT8Jb&KpNmpxy`lnl7!Br;b@^< zlB635uKzI>ru|Q%bqnaQDNL)fh(hlH;XdJ7BSCySp>S>5Gu-DWb56B|YjY%Vc1z(} z-NoeN{B#f3vWNtWGi`kR3)f1dle4D^*YZ|VG3N*%T#L;o;_UCkwY_f>arO)0TBia| zve^zyG=5&KmG<@yA~&|vOPX72rv*96=tu(fKceY7DUh@4jL`CSQL*gSK{!ZaEK5*VNRrzX$ctle{VPh_ zTujBDYfL9jVzh)q6#7+pm=L4oeMDr{<1`#G+O?BJ_=Whm*eWbWD>_A_@2j+#wbLej zOr#4=R`Yw#+G#5!xrY1hIPtdEiX>_#onp0eNrEMb(`tM|flkX}9kf_UCgO&II{2y4 zQQIX+Gf6sYv8Sn2vLs!#U6OQ^q?=cZ{gj;kT1?612A@*`!F3 zB=6!r0KP3GXf?j2Qv4>2O$d~rb&%x4&x6=oAbqv|k|cj2?~~PvBpHf(#(A8++8M7z zF$$GlrqB=g$Pcoz<}~(wwbCm@suVb6wcv`m-DFDK&@1e9QMttv{Vn&_FU&az5}v> z+DSot2V?`a1;2A2-*2OVTHf#C_-7HD-WB7490zLAe^6y#tPEgBkkBA)^$ii4mA)Uq z&VdZo&IsaLh&1iepCYt6W2kB4|03e7D4KR80C#g^v2s=vO$!Wc#E*ZDGG|HAw3Hz3 zl+A*0>pf3M)Aj}v$-`BEtEgVr8dW2bQb3zovX&spJ#DCmlC?BR8iM?dQps9wbt<*6 zH(gC|Yo(m<NF+4H#X5jY(8>i_6g(5>(|dqS)NTus z?Nw)TCTc15DaVuYH2g%Zln9F-N-M!cZAAm&!-5sLEXkcD$EU_a+-DKHc_WDR5tZF1 zNDd46Gl(UDJgN1OKHgc)=nP1vmL!n{!n<*Xc2Sb6PtmS(hW3Lb)v@d3K2K?`hE&-& z>?ir}o~N{Gk}Lw@J~OrElKhDj`EGiq7AZ+nFWO-uqgh&#KsY3lM?|wVy&Vtjo9DB& zr1nId9qw$cSQ2N4J6roOR`}5F73F7Z=ZUD3ytB2_9Vt%uTs;59bDXV3bt2^K15ueI z&erj?meiSioE`4dT7e+hjPDhBoVnUpK3l$fhU3zE$=JibBIZpx4XUybEME&XFA;YCZd{~D#qrNVEmxwUyYL_ea$Ky14iKSP z>p%z48hlLYbg*%GgoDUh$z zmS|f9Srr_D->NInA4{}SNm@$sqE_oMUfH7H!S$=Mb?{lLg$v?4NwZXom*kNoI;*%; z(}}RB4&s4)9Q`fTygv@5mN`r8OIp}45t@yM(#r~%+_dAByomgjaFkM1#*UL zjiw9Y>)3T#njpS@U8k)OWL5C1iFk1_5?ZH~jP&wAtAY2(6mBeZ525pL)`}o?rQS%DoYwJdBtsuT;Y}5)Q$&-86joL{N)Q?x}U#A})8@0wM zA~bs%gtud(7ADE7(r1&_QxMuw@p-;Un>3n|b{6kV+BHd>W^B?z$B>WHj7?h8RFL~B zwBuE+wcWK(c$D`&49;sBLNmOy%+(m51N{hOt0Hwkz5#hxOW-juemil==tqzpT9zcA zNU~FVOAudI?9vWN;&jC>?Gh2{2|gyfw3sv=dJ%IPzDr9KB%7T}!E>rOFS|?IEQvFu zyR~?en(1`KZmmcXrz>`A*ClbfVz;*05_QRwg{Z$!+a{22NDH-Ng7~gR6>8TdaTc>e zEg+*}ARgylK~}MxqN?mS^iZKzUy_$Q;l+9&d$j~f7EQ&Qy3(*F@6)D8WCPVmtHO%3 z)spONi_iOj9MtNJ<&~{s3)1kYB*+I^Xay1hazvX_fph>luFV{VXb&)SGdgg(S8Q4LTWckL-be8YZ2 zTOf#UYrmmACrdr}9^JZrLt7@v&K>wo8;SXILtE`v>`!f@blUP}5PKUb{;4f}lB#bt zK8O{8+|+`n5NY{HAUgqaOWPudFQGfyDe3cCSrukB!5t#nw~{og$=DZs{`{x?S^P2kW8JDD+4D16T-9HQf?qIs30Kk?Q(+>63+nrDOYC>|Xu4Ail1yq2Cn5*ZLZI z$aEf=e9mJw)X)bK2|n^Zo#UzL)yETJ*?3>W`!-$A=;Q=(`KD{fE;6&*YqNfOQH2B9Ka3dEYhv?o365W?Y zXQV^)rzF{j&u5TRjwF|@0P&5l5Phj6e}x80vR;yarh($CUm^NFB6zxu4lrx$C6X+> zf}ihUjMdiv@=8<>)%Q$yvAX&LGkD96vL0gtM4$)s7LuGtLK=!asP_@X*Rc=j!v$Hz zUTPS?ejbUtxAoDIBz;_!{Q%NPw**iAif#XLhn6G z?9&OwqOunH2y$ZKGIY59l3%e_dcGj5SRUTz$nV!}rQeq1(VqiYJmR#{lV(#hIOzit zp~uc8vI}Hs3Qj@lmq4)nuVS<1b1hMNr+MVGL6O6fWZ}DPys{|$3rSvA{&m?IrecJ0+hy+h;5y%?jq5D|9#e8a*85qQdp+92v@q*x)rr%!+U^Sk@ zv-)~;HaXS94Mm)E)Xxaw%es?ZdKW2|rTAXcKTL@ zyCk7_@84!Dg#GkEf~;c4n+C8Q!pD-Nyk`L02hv}ELy|8*4uK5RcL{)jv61?GN!o&Z+l8@FdaGy1r`K%E|BEQ5>pdm<8f*CpeCO2Aiv{sby=1*a z`gFxrhGN{dl&oK?K7(x(YRkj1bp5&@%h+JtK%?UhmFarpXL_6&D4XRqpY9#$t5~%mYyfbGPV!oclgZK3!bOYTR{E+nX9ur zB1s6um!@oeuOz98-1h?a@%3W1USAMr)xr9gt^anH)9p%5+-KraN^v^g{8ASe%d+)n zBpGht8{Q^Pm*|@%X>eZcRcLMyYX55J4sT$ z4G{hDoZey?uYNh(92F?Y^ZGhLoOa-xhW@r7)YgH4oP0w>T-D&0rk3a-FY!3p?0!5u z$BFkv{j@}>m+&?pWEqW3eZP-&$X1$;2l*3Ijx7TBeDh0Ht=F+b+;t# z=Au;~U+FU?`4~TNc=cuax(Z}F$YuRKNwV;J^nH+@^e@+m9pxg%mz2{$f9N&xsj?a% z-+}y3Pm!b^$X_5XBd-DpO2=Wf5w)I5J^M-kYXDNq7*>I_0I6eSO7h=E#$rI~8;v&5 z@lSB#X}W;)u(4$W1$uA;ojiNk$bFfUY-ZqQ`W`6uuyJ}bk-hH_X<~%FNhHx7#0J7A z)X0ZEhm$a) zWIK_=NkMEPNVt)thVt$B8$a6(-UVY9C{%K-ughj%oRRp^vdkl5bBqZg;kMY|3ocNZezDA)St62SYRmJuh_q`R)VZzOL2h8*VDen5=kyS79dDJW3MFMGy8Fk z9-Y?TD3xgOG`w>FWT0_Fk`LhX8pt4{(;-T+bx+)C2Qt{mszCODJZ2PEAV)xk8FfGK zl{ybH%E)wx7lD2SavPTj1vjy90CK{`JjM@#EDMeT`CO1+WwCl7)h+y_Ho`xo(45o; zNjFAUAoW2kV}&5T;m9yvBcI?CSFr!G*MUnwe28u61JYj5;WV=b^N#lwn zmmUbhH$Cx+$0gq~(B7GxQ_Px@pUKT0whPwG7epBYB* zF&@X))mcVEK~^!IP_IbFvWy5xctX9rK(mal67h_<(`;iGsGc^A3dJ~?YmBQ< ziW9GqB?)haj)by}ZGtRk#y(s-1j#kxOK3PoffO+>E}1)pe)7ZVk7pWBk00l`g2 zUZA$ec}9zZ```*ScY4w2B*_pEerM8)#^Zuqc2&oV#Nx0rE;XhQskT3oj_Q{gPfMSX ze+RHuxYcr*v6SMlJMf7|sh5nv6TB|m_0yd$+Iv?RBL!L%e0eaP?^tQ1Npb^(pKe)c zd?U%(59!X2RmNo^Y$ERN=eJC(GJch0r6Mm1{f)i*yyE!)!xN6R9iBtaIj!UyrtJ%((R z(duJSJ==VHCk5^#{h z_Y|)grGntnX+G_^Uo#?4lh5-Y`~uQzMz2qad>2Qh-Y_z}0%fyacovBVdc(+*P96|m z>SM!6*S zTyQbm)Xd&C;=iCc0hpe=sc##t&eHJ@I~Rd7kr<)3js6$N>B&X`Yz4?}W3nVOv#PQ* z4A22%jwBy~H24`0+Za7dsT3zq!sno|>uVy@EV|f!$O!(1lWg|s0ve!0#z_z_M;fx` z867fKUnHkd575j%WZb+&6f4Z3;ih!Ol9RsV2v8v7$g ze@XZkfO$ekjBS_6=RJAn{t+Yps;EretaHSe5{T2tXsUCo!4c#4+MM9{=k=~Gv6UY& z>fF!KBKDG;pGS@Ug5XI8bS$szsF7cX0)5+q5;|(Ms7vJKa>r+iBvDURWn0j&qeiAA zd825xIA)wB;$??^rLI0^++U9Z1zsmoVkAkD@kmw1e~2A7E(qe=E1oc}3F6!3oG^ZT zfX69wm15OfgxPSyxFN`@;6=;u!KMz3oic6-vMkuU8mPlxE}(!1d9hW&eWlaKMs-1! z1&@(F9~*Vahu!3twa~Ip486W6#rR0?1^LWa(ToUxwv!(>Tr{?ZapFt*qOnVm|h3ZCQi*4p-aB~Ci(^h_lS1knp{yn?{R2g{i z)(9T02nGL%yT-!MNg23n50K7^kZb!4SzQl5!_zQ$c^(Os4Iq7!ODfEU<#=UVzvOkT z_^iri?}pOr*83;FBgt_|1|}bpWPMZeNlZQ?Ng;0E;opNEBI}~Lc)^Yu8{WLm5Trf4 zQWB%>jIl`Dg27$MaLaz%F<5?vKVk6l5|b+%(4MKuS4AFFD~?>*wB(zDl)1h;ObgQV zB%Y5N1WQl4vS4sw(NJug-3-we%r-n zs9gB?%s_Ut6ru467>}Wx3D*V6z+D%?b&(?EI*7ZjhwF>V;6z=n2zOm=FL$EmD}xht zqaqabEAINiVHew~4BT}C5_n4y?z+`(J^`)^k-!dR;I8k&b+;lEbs}87%iwxI8Mx~~ zxE3oSTroaJk|&8?^o`Ha_fmccajCKBI*)z#T71z1w(0Hrg8GeoT_vw}{;1HYI5&E34+7AxX3>b+3D| zAXL}isH>*eeZ70-F}u&bum_Q9GEj(nwImk(JxYPxM{xVWSUj5Jt}6&tRu`m+JFR!+q(j|Bl8j$S z9ox(um_R=NlaZUb>kC408X`^$_gb%Xijq!Y?t%(VFO|4hOLtNq3iL!BIZ13nI67msarM z{SoWF34;249TMk`9#FYI;@p=6$!1P}#JT@RKB_pPVhcxm(w9}?lj>bqDH!_d%N^;M!KuJNcuP}>+1eb5~pEZ z-S-UUl~Ia(!gh7nBH~pip}V>tyvwP{U8Ln*B&q`8t?%j{Ac(K^@$N)PoYu#?uM?@} z{cI$@@q`Hy@4hLWoKcK-|0kWCw#K`Ihwyfkxn6G=#QKR+gCud<8t)!1i0>y)ygOA8 zU+d%D;|0lKe+33GHq4Hj79Q6<1@RtrBfRgY4L|&Km-)r(=lWy1S)ch;(<9{VEUf zEJ94WE5vknC%+Jx?gYOOneIfpX(mGCBgDMBLM(ER^b7Hf+v6AF8TSPHWgcQXLcDZW zh;{C1ej)PR^ZY{OyBFDwXN33aUV;!??h3KP{i0upo$hshA$Gc7eaz0E5#FWKqmv_au>^|-n;|KQ_eldP zt{4F+m;GV{ru^;~BQWKEkJ%5*#PsTf76DN-aTrQ@(l1gZA>7 z7!?B{V($vkJ0;XFL_$iWUx`Kq-C1bLTEw1SIfNZB8)>`_!)#^XY3v4>s|ckrXg1Q|+x)YY3_Oh` zDan3myqGf9FO3&dp0E$hMj9oEy{d8uyY|ya<17ptl!2%51IR0iP#VV5SibnWQBcXi z)7XvQIvZvpcsD{9xr6c9S{CqsDl=Q(GB$9!)?_DMERSn}a;~ z;`4PS1J9#8WrbfJ-=}Q!%j5f$ElKv5bHdw(bwKc|Dh97E0pu4&cy+hzHgl2LC>U-k z19zPWaz_!$Y{pz<#@Dov(a!V~F_2mP(cAqpYcTqNUuF$PA4#&W%tdCo2;Nx5;MJ`F zX|4!m)^#2-+X6#dW#Fy{LE;pl%yQ--Grm*~sAS-MHf;3Aewhs){iR=K!$*IcWdAh} znSF`inu@`zy9P2w5z1_U7nxO=fY;Y419xo*GEEW6Y?&9C@fCP+B?HgwrO`k6Www0u z-+q}bAN^mF9XKDEbwY4k#o*N?g1oE9pr!p3yAn=C+LH6F*QJ{5x3)&iuxB9z$l z1xTzX438=UcTEKutOzBxe*qHXd!PxG47|sl8uO@MVl&4K@k?yxm{E3{93-{?v7c5U zcy0M0ixi>6vU8BwdoZk02JZS5$SaCaV#jlk7~icGS2FO#J|2_mm)Iv`Ci*4z$(ZSO z*IXpVCgPz56@u5+2;`z7l-P^8NGu+P>&hT{4CG%$D6w<7nEiZb**MjIC?iwn_$AgR zb+KP!ZBmyGwFfT5exL89+TRtUW9k~e7@bmI^NZ0b_3fc{36H^dF+J{zk&wE_FGio# z5By^EN&RT3-FFdU@cqN!yJ8Ga{oF6ch}4UIF-D~RFw{Pb7~;Tk^j$Hm)a!mRGE#5* z#mGnvw0k`x4=kU&E5yvyn!_4b+HA8@8wldtY_n3E+6Q?EzFOwo6(TS75x)>Gq;~KN z@j_~MyW3)f;LF;YyF$F0+Rrb<=G5VSAvUMF?fpCiUw^jW6{0BB@(Xbwb&6kz1F2bd z=V#@C)S=2D>=&L5Zyx?V4x5fD1D~STL5?ZHr|5r|?6c2?$BHAVPbyh%*^Qq=kVTl) zUnm0)vK-``A~ML>=fY#fBrU6C;alMMso8#wxt#ifUt=z(t{i5ce+~x^{8;K*Z!WDXS$K~`rS11iBs%SwUn0?IpA55a_FsTZgstnvU0%WElGPMm$!ehmc#Ahp6cxubi{`5=j zr8L)YzIFSy<(JZ`*|lE8y3LQLR;duYI(|HruLxz9{vt919x?UyrYQBY}<>- zj4u%%RI>2QPNdy0^6>poI+^ycUuGxM!tKUOkr_XpI;}$R>iF^0IYlV5sY{XBQ^?~x zW#Fzag8Zb2%v81ex9IiSo;=hNr7vW;Hy$?TBT_j2};hs1Uq5 zemqrQ5z5TF44G|19%0JBU5|mZRYYc1vMfB-%NMl1l`Oo^hI$hHG8^X6{W2ToNfRW8 z9mNIqm|UDv@l5b5HNrE)uha<7Tv;jy*K%{cctl`?$Lr@b(({aT>V>P*=hon10MANE zzPJw;573-Zp4TMFYCuHu?DmVJdk$2HlZ(1^*;Ja87lQ5oy%Zi2#w~8u31ZYyLy98Q zw^7S+9Pu{{rZRBXJ0R(bkn2pidaF&wk(V-X*E%2*6%nrJ>?b|niY$E-bc*K}zm`n# z+>|X5-G+Rpczz#IdFMIRb4L)l!Fe&;rh2N5mp98ZT^4gHo8`%p#HnnS=MNdk zxxzflb4&U-r$lFYs-#jvPGz$^)dlfYHp|n1eALzK*~prq5`->=xG+H3p7L>`t**att3Q@rklzLIZ5<0dcLZ@J8s5O+ z2_DZ&<*@Boiui zEG9Q8BwS%(PfzNUG)4Uot&<`=(!=CoUXj+={UXeXkYa75X6__Mb8lFnY3gjO}ge!*pj_0CCjhfg2KL2_CBoaI_g&r$)nRRCH1}$Q*w4hsT zU1p>tk@z~o05e|_r>_FcHBVLUs{nHo5vQ+MfVoBb zIO7sv76{@SmjLsiEJfpj`UB0w5;>Ixn%ieqt}M{pM?_T?XckK!r?Nn^L=dX1G44wb zG~dYLak3e|Mqh&4WrEE2B+0KPZlJNfFNe1mxAWa=!n4vZjhf~u;q1%)KC@I1Ur*IC zFG=DgU(1|1t8((SOfM0Yd@Xa4^byJPL8xUe5y)3rEpxpr=1k!bbE70qWg%u@cIC=K z%o;>gWg%uA>ErZNh}lpOstZqY;MELfXMyOEhwhkOA*M%=qpT)AfW_}AuWin!VywY0 zfvgXFYMW~$>HS?GOTV`YyWiX;NH!bm4q%D!sbhXmK5EBb*9=_1lU~Ha->bq#Jb|ZD z>zZ*AEqsnoLcjm>|lh)U*RGbmRCsX%H9lEa4M`2WrT#vV2s z3gSz+iP_SxR1-5=mb!q$wmV)FYht#3hKF7i{8R*ezA)5`6T}xN)a)mSZ?=S*qXh9y z&8DUre-%Ha<*V5G&K{XlQUhKnu&r?WivzYGGFs!L2!e+yj!f9 zSzf{CNpyS*^TTI(W!da%7~TF6W}cN~p(HKMYl2YZ7MC#-TbqlY=f#e)z*BU4(j#WE zAlWSD4j${6;$n}OA$b(KAd2ooi!_@H;_HvLW;;QA{SjrxO5*fKl=;vLmHWdRWi}(E zHlHZ7wRCd&Bg%{s#8+9AnJ7y+n`*R~D~VHCw3)Dkl6LN5i8j*&DXW%-`;{7gix*IM z&GCd(_0i^&(#fel+RTzZ&*Fxqr_j~W=6*?>TRWo74+WtVyG1bg{854MpLH>2%@;-M z)vup+rZ+?)C+l|RXGE$6Bgbr1*3SG=`Z)XJc4nFMaZ+q&UUT9!3S!TQQc+8(GAG4$ zW=BDMz1Ys|>y=JUH?}wXOX4Kd-t4`s@|d+Z2N6+y*4`W@eVl~ao5_OsDr;{}kfofu zV$Dg*`caNfWwB<^^2(LPnl*{2%3{sB(#NSR)@)?QydECqehCflpcWIpZ{GmYSrKu> zfP?q$W(yI5vg0dKPcu@G9M&3(NxS}4Kn_cC0OxYr+52C|amLbyI6bMt@e1-m`YXaK z*k%X30oMns<7RPX;I8lEEj1$*p+k~EaP_={BvX`uyB30^D&icHSZ3`Nymu(=!|=&4 zn^qvaA>+)}g5~q&pkmnTPu5tEN?)oSUwlZ+n zp&E$vxzDbG0P@yN2KIh`imrCP`HFs_YBzA9$IdnQM#CjK52YkH}6ldNn8Xn>G){ zcA9+z@lC(oX1XB09nNkuw}KB}K6aZc1o17fd(4xP(Ds9!$sTjgT3(s&2j(7gwIIHI z&>nLm5w%I}G2f6r&L*|Td{+?P_PfU{mZhBSx6r&PiQIg>tk684U%C21^M)Y4>I=== zL{#;KX25!0%J<%xLi1iheAO4450Q^rJolQ7Bym;`?_RU-1`6byI@)UvA)+eVYmSsY zPFweyqXqF*w%42_OF3=bXHJpCscfIQUB+?h+UGU*NhfEe-e(p|C#SM~W{Dua%J!M( zWGSbz_smjBoXXxaXTDsyVegqtzB?+NaEok~nFfGVg4xoc1ZR>Lx)b zZT=j}DYK?M=)dNyj5pwNZ0M{%S9##hKx)`LnBHT6K z&W5Y^O&Fq;fxGSkX{QKx-HOKpI;7vK(0zP@bxaR@jgM6h`xa+2`N2TP^znlD#=KK{ zt{}b%);YaM5;5i;1n8VT|8*Y7w;Fd&Un_|31W@PnSBR)7*ExNw^l@fE=k#6D$2tGg zIsNa~?cD8n!KI1gnXal)yqOa~x+%h&$xm4JO8-y9@HL@#ddM4MN~$F_Aw5wNXWAyD zFWy?Y1qtb!1(6Fnu4=J_^lgMx6B5#QZnX#Qz)74B(C2+sGCaMHK>8~}W4nF_E(o55 z;W1_4u2(=tD8gOuOtCNTz?}vBc|fz01^3+T3~%18)>K?PRt6rVF~}rEM13ecJ-tZe zoWllAufn3>lbPPieqkrShKYYwJ)Hig4E#?Pc6`4Gepf zfxEr|vR@JIy3fAAU5~&}q72;ibC6StkZaRDaQz;JFO`A2{snSL5$<}gJ%PJEI1P7A zDg$?o0{K%Ba^22d2f+|%VWO#}L<6};5$>94|FcJSZ%8G>ExT7C=EXRasHY6Px@jQw z72z@XHRZ-u*EjiuU&Myv{jJ&XdDt3iZz`0x#5Aj1!2YvPR@&0f&}}ag-_QaNw8PrB` zE@cCJ`dU*e5WWTuu(B!;e*8JWdPWf6iZ{^8lSC{Rd% zLh0kIZv(A^g3#K;s~>2U2$I7VVhQHg$_82wZx;ijP5=$E!Uf4;V}%dibvMWw=I4}X zB}=ExaxG7^#!KSDJ6n0^!PXqVQbVj<=~GW0Vhpiv?c~+_j?f>o?%7o-AunDM6Cw~U zWaAwbJoIB$q9k7j5=pX#NKyyA%6*1fNsm1e?t>^o;QC2%ae4#a~i}cxm<(*frS;PH&bjvM$ zrXn2o(Y;otpOazDkxquJ-mupC`6OGfNFR@EN3ylk&&O@;mp*f(kK4LX!G}-J6w7-> zAm98PZC#VZ*`1BHlK1h}`+kj#woD>wdXBaxNFQf;@fqOw&u%H&Jo`jYp+)# zr?N5D#{Il9-`;{VGT&1xpeAF`Ck>L`eBo|{&0zc{8fNR}ESr@3hj zE~@an9v_c%YrJss4ToiIl*H*F%c}o=<9Q|5BvFnKLj5X)LFi#dnMmbFe0-zZwvZt3HUVurO>5+}tB>z{)>#jPFP?z#hoXIm$ai|WL_>N-k2ZIu#X zzmC9t7g*KjS~ny)4#Lx(XEp!GSBgkP1tP8;&a=7*g*D8=c z&Y20XRVaO&&h}ad1@Vow*ZNqNqOryXHs3lekyF`xEBpk{+BdTEt+qte$j-Ooq>oeC ze5;!vzRKoXiL#V4v9hhjlE}L7G9fGQ6JD8bNzJw%7Q|P5wiQl9RiACOkv>lK*;bq& zzUs5B1X;?det|V#5~r!&1=i}%D_6h3+98Oq`UTc|L{#+)tV7brseXZVTo7ON3#{|9 zlv90y%5tr(U)bM#h>hqy%=$%YJK$T!VUWd&@GavrJLWJBiobzjnKE$KD8y^&$HZT)p8iyrB%-wH?Ttif~u{Gx%L=yJ&>3H?~_R zWwV^#*kJ{p6>V1w+77Eo5Z}DpVVxx(x|Za{#iSk9H?o+sk?pX)mrl-L?69s&ALm-q z4y)xks?1q*cUVz^P>OsV*kN@PB!{)aanz$|*bZxmAkJbEOXtJsdu}trdPgd#rrv^Bnen$?(}@?G(hR9{avR>!4q;LhG0;_5`Z; zpje^xr6l|tc136ATI<9EEh>0`?jBsaJh z2=B9xt%-tUvlDgkJ|RrMPpk!!43Xrtm0vpCS3NKGsa5Nn%3b}L)ld*$il14{1<7G} zxjWm3gg&!6Nzw-scAp(}9Ba^rFq~J*2wzw}11VKREG+g+?)p6pmz9CL{t9wM5$<}+ zKFD4Fh2d9a;I7p&@j?|vDC#{Q!LH3Z-Uc%&g#(`^?{`!tsAg{ND=yw=Vqq)FZB8 zu21cMnnZk8b5}zbD}4knm_b*3X#)77X+)Ik2m26*f7lnAMhthYwA(a`hzd(?;$jo-$2TXc-oyBZi@07jlL>ts6RPbc z{MN9uo1x%TdrdP$J7t$Oi#X^?F5J{SVw}sBVpj``nCVI>%npmV=&IQsH`pxWp8&$8 z-B;6#rAx{;g$1RLwf!E;b80sDJQYwnlcFR>-f8J-Ssy*P8r$ zC{6LR{MT^&9I;=6rNIrL&LNC-`rXB*t20*g4r2}MpIb#VZx9N^%@4ucUh4kP zUG3JbBi6a9*+*JOG#_w(E1Y4%d8Ofv16h5kXMY*MrYyxve8FqtLpUwKpG8*tBZF83 zbUfZs%zsP;p(i-!ul0(vV;+f^=$dY?e+0cg8(vLe+0(5mn{OWi!o|l6k3^hv71-M& zA|7n;Asi+=z}R0m1KCNbhn=m;&f8@$*SrYyDf%l87s=1tL6H$VU77a2NOaqr!apM; zye`)-_Kda>sjf%tFWQ3kv1>=67x6ljD0JD|b_V~m!(JH`k=o#31p2fgWqbiWcolhF zLGFj`n$gJQILyBRIlm5jVQuHr=wrJZ%&s=}$Y>02ti3)uA}WS|d20<~@!8Z*>Mgh_ zd$82+K^xE>^vo#!H81<$=!oVuw*fW4vA|KhS9P!5CI+cKWDku&_$Ky*n24?ohPJ_L zViETNtox&+{u$o_aoY!CFfE<|!e=Jf_B&M(@*k8KPzJ=)zH=v#{V4T6c(>=T&{I*> z3cLjP2J}8e<<0pY^iVWyav^Ro#hZ<|Zg@M0)v)Kbi)bEp9v$w&WO?Nud@u-R{)Oy8 z?**|jQm=TL-$ii*uCB-JtL@OcYwZT@Bbvt?ln%entja!u=FN1=y16ctdOLExcTy0$ zYEMQn4Bs;Rsq$}Idr$j_$1#jeV=)%LAV6y*_66G68Ml)0>HF`!RatL)Xe>r~p8Y~B zYHnd4z`q(CgTrsKb^Iup_r}3=Oeec`9Gq|4gX0jgXS9nYw(*UA3`#uQp(-Aim>Y-r zx}@-GTtsh|YoXnyBZlLg-KQfqopQWZc{2(*`;i#r@mV5XOK)d)jF{OV8n3&K!R*}E zB7h}8UxoQSv~#FkyAx_2X%Fs%G}G<5ogz-SP8AO5j1{5VhW0L2qb+0Oaa6QdYWHXt zI}TkJoKGq4(+JwxxVXMAGl*TYf9`_puGv9d5%`)N*A>--*i*Y=Q;CXou|qia+KuIKn-wYb+}IeTO_spQ4o6pdLR0|AMR%3XDpWC)xU=jVukJL zf%WB({cjI!IN#ZQdPd~9+S|u_qPzdG<9bC*j0x$C%uwXzf%r1C)GfDQ$%DQMZrmHh zYGQTcKFe?(yr%tWFN}CInE6)H84E{i=puAa+UIzItsV9#=2V6~;885$8|?M`U$5DR z@MpkV@Z;;|-zx*z4(Mg*swLF|*gvEPkTb|h+o6bcENil;dM{d0QO8g-Zu?>=6>vHz^5W=gLC*~pglJMdDOEv z@jo5xBMIn-+4g`w$ngbxeILLT_96VKc?4&G%F&j8agX%J_HRH9_^BkG-oc@GuWl!N zrBBX^>vo&INaG)SLf?p6t_VA$A0|YSy|N#+;n%ujpei(jzuTTS<1O&*;2(U92bArv z`=R_oyFq_coZE|bOZ>Zt%L@nek2vPSf>(PWQhVHv8;F(Xh2AbU0CR)i2Ap3wbzsDP zm#f@vlZcV6ZqG=>I2YTs2V*WBwObEHvF{284~}T!aviZJ4~gg(^Fcpsqo{gKtpM?o zcs>%T87_83@>jv@_NS&UdLJ8r{rwO$D6FvFV-cUbTyNP|lTcHp9WyjyX3cvCVVE$V zuSMX!aQ5z@SpMIz>kUJ#yX?-xu#aq)h$RER9IK@VVK0|G3?2Qo{lzc@JYok8hu_zB z>*0uZ#GX1Fg}d0F@;@8wm=XAM#9lTcVrNaB4bQkwZDeK-9f_Uz5&QT^#5iOBGZG{C zh&^{y#2c<7g<%?BINbIGJt9>MVO|WTP9NMbW`Ch$mEe2IrijGbxDuZT;BD{B+iqtV zB8j(+h!<<}8DpSP$=$0mk3Aq6p-b)Gk}(CgjKY2k<=0iCFW#R-_#T*{kK1kB$YWjM zc6UTT71t$u_h@XT4;nO-{L4>0q~=E(L!euXo@Z}J7|KE}SpF%aLzIS<$p$O`OFQzIT6um|Q(VZK@$zxk!!@Oz-r zr?AjE{68Gn9e_^?5^(mllT

X;`-o*oV?0a%zSlrxi}hg+o1jR)*LO(lJPf>{;m; z#}4-TbQ}Qjk9!WlKIRduy)&TqVO^*@o$qzO=U)5mYF5O=n$^->tPDxMi+4?j*x43_ zvZcM{DYS&ebf% zG?;~>weKGeVCDAqaTxR`ZDTzC9JgH)kot8yYyv7~wg-R0qQ_wr(DTtPsxn7+hqkct zT);+t^eR5%VIP_h(XXZs*V@=#4`N%-D6IE*#67MC|BT1-(w_D(k4zvP8H8zK$4!iA zK5{tFCTun1Ft^4+AA;_UIS}*f9cX*rop7j+umh{R8Iw3g&H62iP8Nt~U|uY6bH(saxC2xVZ<+ zjnHBzc%;;teTbWe}{DZf-IO z2gBI;J9WoO9c5>8b1#_ZR4`{sJ<{IJ%@biRs$kwFb&g%e&Ff*lUBP@q>V0&C*N>X!O%yB9Y%nCxQLDwuCe-OZlL&4XZ$#Qb$i$4l+DH*xc1m?u>*&yhOY{*;?- zn736h7fJoD?RpaC<1pW@V7?(W#+#e}fH}U7ukKi>G2Yx?VI-0saOj-*sf_2ISrn{^A54GzU0q@GM3aOkgc=V zPs5VZp|gu|Bp!{h4*_BKabX(vlfCR2(<9ypJ24eo7^=*>Qk8uQ-5SRinfTRE3caR2 zW1s7|71-{TiLEEio|}n9cHA@^Yhdg^9!|AzBvbx?Mx{WZeHY?WwIP5K52KOoM+x7qoDa%+T`jAww(z$XSe3O_nZ z?XVe0=D6+QfBv!8&%iR(-0t%fy5=AI_)~xr?4X$usotB@T`ZWTp>eG;xw4?z2sIw6 zolq;FIto>arIOesDDo?Z;$?AH3YPUfGkBD8DDt}kMSjH@uL&gbc*W zOGSdAs7MVcDpFTj>nm#`WyKe5Wxz<~htE&RD6z_~lk)2?{k*{}Q8}K+vP>zILQx8r zpeTiMD9Re&sFF!vhoTbvO}SL!CX_6J<-ac)SA$`+*&xwJ1`a5wj}kD%ZM>rG{UNDH zqEuDb0VqpYV==>%gz5=3QmB>pIu*aB)B&ZY;HaL`%7mh{<|sB_vD_NC#=tAC!44>M zu~LVX<4MI%E4Bqc-I7Hz-(zuqU5xwBQq^FwSaef`bul&r-f#FyArx;?4Yn8C|5&K| zyetX(|B1r!3e;+$0&%)m&IKsSzmsC|iq*ijM}8qtqQ+c zpkB$u{YAm76(m(02}LtK8tM(<7z?#cs7_GZg^GvTBUDeQ{X!)`6${lL>WEN@P}E0B zP#+1F2SrIQt&eLgl=TWg%6c^vWt|U2S#N}*tT#iwBEoEeqNKM$QPMTAEXe+VqR1(V zr731XQElGwkW}4bWzJLPrOLVjijr9kMacv{>{J&FMb*`SqR=5w6uG|gYoz=_$N25dR%AiZte68uvtm9J&5B$oniY$oXjbHTA!%AH zg`#bH1=J^Ej8{XQ5h@?*f>0Zwz7c9O)OSK{fx05pHmIM4DuDW3s9jKh3$+*OwopY- zE^M+`|B4~2immrB)V)HLK!pf(5~`k1r=cDa>I_s9q0U3K5ULcawNRI!+6q+;)n2G; zP&6dhp=d~MK((Uv?bR6QHPYe<&)P2t|drKvCgsP*iaN6qVftMP>IwQQ0CWDtj1; z%9cQhvR?5$NGg09kP4rHqQd8)sBkG1^};16>VhAO7@kA*rjGZ2bqW-t^@%oreoC>rfuP&C?m zp=h*=plGyJQe`>5o7!By~tI6wUq`P}CnGP}CoFp{PF^K~b1cDC*W0 zP!y#V6h(1uin?Eiq7+h~D1|gAO2LAn z6vjhQt7Zmg`N*Zp>v@q^kOIqod-psS17;L$}eB}ZB%}np(uqd zP?W+pC`zHAsn==UEms zxm5~9bL$e6m|I>}4oQ>i3KUJQYfv<~u0zq}x&d`XtPnS$XmYV;PHzQ5QEvr9QE%0N zqTULDqF$&AMZHiTN*@0;f}}AHg`!?)0Y$yg3W|Cm8j1!d7K*Ct1Vz=wLs4}-q2!E$ zk~0cQ&L}83qncs;qv}QgQgta%R7n~XRWe?&Ns3K@qKY%2sNyUrs(20*Rh$b&@fJf- zygVo>>s_JDtCe}9Vw)A)0!2j%ly#S~?p4-eWj(B{Clx!b*m+`n{VP@Q5)@TZ4n=Lc z0!3}Q4n-}w0Yxpj2}LF5H+QVLP-I;UMb0X0vk)n3RPA@iXY3$+pI1)(-Wy(H8YrM4+m zpwup<_CndBL=jZJP{mN2ggOjGKh#Q~cpqW?>)+DpkVGizxFjg*I9*v&lr>FRZ?<;I z-iD&GfsZ&W7>ZbmVrhz5Q1bY1JS2@yk#a0nj)%FU*z#N9suj(ENGO?Vq{Bu)5j)w| zVW**poq?h#=b@;!(zaOtXmVWwqz#5&)S)f)3KVUr*Pv)a4UTp~*MOqXAy5>$E)<2X z4@Hq1K~dxpP?Ww7CCYl)(smByr_U*1etU;)gd(;XiYnQrtOd%tOIhp3Ib|C`QQ1%^ z*@Ma&DXil6Z?rNeD06>d=G#W1vW`$zU0G9<)l$~+$~s9|GnF+*7fQAcidxqQN;VEkHV#TQ4$3QA2Ps{C>Rx4}1v||0+sLY$8D9jcpN@g1rB~t)J$?Srn-r5UAy;TH7y;TfF zy>%Fhdg~+smljTCJcctw<`oViFXM;s_`jMIDNc=2D>OXf6$kj^->V`lT=)iVo%` zLD9k76ev2F%Y>qXxh$wFd`b7RIgme#)qOtH??UB5{VmjDsM|v2LDBERrBL*{ump;_ z^&}Ma+i583w=+=GZ@CGM-(IDPpxV&y-(pBAQliW!g_*B^rmQi|`#9!cC^CmYk+rU})>qa>P*hzg6jj#>ib_O6QFYN! z6t9!A#w)A0r!x0f=0s&qQdV7AQMH#RBCMmxu$}dy-WqBc~#dDx&i=GcfTXZfI zZPAONXp7E+qAhv_6pi+3C~8wa6eY7wSqqePm$L4K;;CZ&D}tmH4ntAE5-19I5{d$z zhN9M;fua)Up(yE6C`$Sg6eV2_MM+d3p*;o}Pk|r>CH38LAIO4QT{L4GD#!hO~g9hTI&A^^Y8HE64uB9F_=0g_EGD zu&%5r%9^IE7L=R;P}E0Lps0>aD2kT_CE|J6d}Yp6=EaVgzW{0vt$%wVDZ?Tt%CH!UT6`FaQYe9<6i!1?i8D}C z;ye_UD21XD<;w4h^1G(|t`EcdM~*j@<89>_INYfu7>X*X0Y#OBKvCJcP?T1EDC(I; zP`qbquyUxqVl_w^L90O(mL^pY>L10}0hohWAk;yjf~5*(Sy0r@IZ%|sd?-p`qvlvQ zLy>h06j`@HQG&aa-(KZcM1FkzE0&JcSdc+ss7 z$_gcC${2@*KoP48MI{bPE7rdfWj?9Qr=e)lv>t7KhZJ)(Zw0$0ik|)}rXxvXi$rEi*@NeExLa{XG&@2$@wqU_fbZAxs ziVn>}py-r+T_`$bUmuE2**Ag`r|i8f6q3%_w}7H^_N}1koP8t|owJXIqI34KQ2dlV z9#Vkf7nJeffmFe4E)?HngTxEIzY&vgn+G?52~{8!t~#2$r|J4HB(*&fipJA|qAhr-E$}ba&#yuh3DZ$@_LnRWSs6-MJMdmNR;U)0mz;vuXbd6sJq)C$k#V1V_ z_J6MK2hNJB{vZFj>|#r9hJ;0Zu;#j3f@x`D{)uXCyBQ=F6&m#+o9nIxNrj1th26RB z_6ZUT6_pfoZo3v38WtHA)!cSXC@eH8EUdZhTJQ-C`(RR0{$6L^?=$E1`}TPF=y~4f zeg4dunR93Fz3hGflG+H8%cmcb%V#kpd%#jiuAXI(Ts_Mnxq9qxy^*VDB_vl*49V3~ z8wBO@vA^?1E}u1!Ts~_dxqQ|^a`~)>s=%u-0=;gTvA?bP*B#qZVAIzt^7V66L)n$RmgWe@2fzS$(#)}h5U8F-?Z`VsdUHw}^(qUov*vl5aUD~9AsAB1G8 z`yja~vm$RCvil$YvBu^2`VLlbqL~c6JJ(cbfmO{+124{l)1igA0u{b1wA9^f?T`%8 z0m)=Ki`ZmHCNmY1ePLP=n_eh@WL3MN^}7Fk%q_^NkUbIjOYK*kSuUNB)u$#q?e_T^s)@9NjJ+u>1G8a-K>P9n;4SQGziIQS_R2z zS_8>xS_{c(S_jE#S`W!-+5pLEN+3B+!!=OO(?&?n(-uf(y%myKZ-ZpkX;C{`)b1#1 zcR_MUyCFHGy^!>`50d^e$o7Zlzj08S?1!YuK}c5N5G1Q`1d?u!Leh=7(oL%!l3qF> z>7^5rUM54*%T!3#avF5D?0?fiSE#q5S;F=s%sn5ROrn5RRsn6n^R%yS@F%h`~u zWeCYN-wVk#KL?VR@_AQc|C4KeK7w-1FM#BlUkL5bujNJ1ler@3Z@Ky*x#kx`NAuWH zNUr&1ki3*HhvZ3c1td>`E1~>J5I_Hd^6ia5NS*{&LGmQH29hViwU9gsu7l)Ba6M$7 z1o0gTNWQ$0K=S2{VMxBbu@RClZ)}F-%Ntvui?7O`|F(ki?Tu}ae0yU%^nPr{`0)(- zV6IW9Ki3XuNv>Vc$8zn4uFSOuT9IonbZxGE&}VaH(C2fFUy1#1P0sxY-jM4cbW5&7 z(CxVnLrJb9&|SHXLU-pf%kl3daY8t`K@IS1;6lwO!RY(4?#L{cj$4 zTppYcy(rfLXj-m?(22PgK_}&kpp$d;L#O6i44si{DfIeW%b+*pS`LM|RzPpfwGyhm zJ!cHQGuI%rAlEABeYw^^m*iRt_2pUzEzY$b`e?2V&?j;w(ABwyp_REdLiJpmq5sLX zr3PM?b1Sqq*EZ&?0*3y`(HPt``-*u z_P#D z86+K!L(<`XNIEsFtjPZH#S1{tM?sdGjwkr+X8(%*H&m-uG%*62RXMxKhBjx59Jz# zcIDauJ(6n|^y^%EAesJNNY-c{BuAG)cKV%W^lAwEAO1Gx3il&@?=^W_`}{Wtl*aQQ z+Zcbl2)aLiWs5%L2I+?+Z!u)^CYt5Y?=YE(W(D+ku9Yf$bOp%-_dwEiFC-J(2kGM@ss>#@CUuH)SYHIWPhN>-|qdaoLRhY0FCF@M+C_s^+S5t_sb(+JUlh3_6%@ODThQlwuUF9yW8ITNoDkKA+4#`^1 zf@CevS%v*i7IQX&vX~(xi#Z39ZstMK&3s6@SpZ2l3nA%c5hT4tko3|I$thV3$thV1 z<)@@(mVt6kmP7Kyy8@C^vJ#S05<_xI1|c~mt0378)Z*u?_LD;i}a9wksi`7(nIpZyC0G#-h+@l@g9QYiT5xhPrOGUdEz|^ z$rGh#5)y|C*En0Jn>G45x3}&VuBD_Z$chymtSa4ayU52+0#~FC=RxwsJ0FrK-UX06@h*hq ziFXksPrMN%PrUt*Jn=4uT2FYEr9g@2w zh2$<7h2$>T0m)sm3zEBJHzaq-9?0G$*#Gu|a+~af4#)x7DKW!OCedAWl+9<)XZ{FHjovNY#=Kk*+61QHjqI`Hjq`2Y#?hO z*+14ovVW|DWdB$X$^NkclKmrrWd9h3-Y7r+ZUkim*$l}BvIUY2WGf^a$TsNW{Gnt! zBpXNy$^J14$^NkelKo>BB>Ts1NcNAtklZi(zJUEtE{hC7xh%#ZxncH0a#b8EnjD6t z#nB>Wu5+<=NP6jjq?b-edYKIAwFSu(YSTgKFo2|SH)I=6G>ahn$>(t~Ur} z^okW$E1*~9S_z#7b(kY-jF|;>nyFvJua1E5K@`+PFB8pX72b7%Fa^8+?FVHF2O*il zAxP){C09EclG>?|)J}usE}6g99n%6x`dbLu7E{d38>DuMIYWhCVg}XhL*_(N0j=82 zT-7n=BB&d0m_N^aK-FO`gY3dhG9Ohv-&_TqjJ#vbwW?0@IjzN)yKi)l-x(zL+Bjq% z#3y3>n~Zr=zDONVm@nZb-O$@}&4A|RIu&|HuG69Uxn@D{ z&UFs7AlGc@;#$rSlxMwOXki|k1HB*WFfklwd;%84Uk+Z2_*Ny zFeLZE=9{tqN!RxvDB1$aAX_0Bb zBB*x--v66uB5+Z@=>57ko*joK=S$NF!Xh_ z?KGPUZ7sCD$QvzUyJ`jZ6xvs4!EJc9$va#K-3LuFNA8e!iYJ=huehHJ=Ropxn|Y9Y z*f<}O4;vS#I?Sp&-FaUF+0%~azqO!j2kRhtlv)qTBhm)wehiH7NkjG@qjZ`B2_D06 zedBHShTGE<$Ud6k*uREHuDr$6uj7#`*K9~G))115wHMOwKhFW>exC=){XQR(X)S={ zHEtm!PlAgec@m5uc@pf0WcrICc@kU-$&=tRNS*|jL-HiJ;_EecoGTHOSEm?~C&58T zo&;Ax@+7zhk|)8nkUR;lhveusKyq{mB%9eVBnP*3qa4U_<}t|r51;=&4%*9Xf@wka z-kxBdfb7dLo(&-B`T+E`Ja!P0K@LGO$YDqZIReQF9))BD%_g^k?U1Zs2Xwal{M!lI zB|O$#b$9VvuIe;Te?z_pF~LmS?6#)k3!SLyG?jbs%Z~6IaGYuXHda-xfUR!&(;%7j z0*!T=i?(9_lM88KQN0L~V~QYqOr53**}P7(MAc!A-{!hr@qp7xNCt@^>17a-mDy9| z?Je?Z`-;S+-*eq8gQT0~kaV*Gl5SQ)vcSu?yA~@TX|WQL7BM6(1|ey&3X)T@2Es*M z!*cEYkulS+u`d!&{MdDPKy@5`fJNiH_KlES3(E>Ehh*RtkPMtb^7uUt$sMsDl7SD7 zx?T=JHEDbpl*UIOne|afW^EpHjoTr)6+0lgkS0Sit*MaoH@%1jMXVc=F=jwA#_6>p zaaNHyyNHEF?7|{;kqUnm3$k|!-b&jk--(%EZiZ|OwW?0D1)7f)#IHfu*c8)*?4)Z` z%!A4fvlFsMJjFb$u?gl8NCsK-Q|t!l2EQ!_k~f$8A-mL_W-;{se2`_3y^ZniAY{K} zg9+L^)OMPckbT|gFw=Hn3i|mkC=1tXgJ_I*g^SocNEU8BBn!6yl9RI#k~6yql9Llb za&r11*(Vo6vQI9BS<3;UmJl*1*MmVw_Q_R{?2~IC*(cXR zvQMsqWS?9Q$v(LOlAo9pDF2DMW`@E2`4Mk~p3Jow`dh9oko?HJ6*`*7wn6d}^L9vn zVoo9XiFp)~72E;Is_ueh1$RTTZhIj8{9`XDi?k1tMam#qq;W{rXg?%tbP$p?It0lY z9fo9$jzF?TM$|6mMWRa#q^0vY>NY-dNBx@8vvPRvI ztkDce*6377*64Id)@T+aYt#?P%G4HvvNTH}S(;^#tjBW59tpl`3CV-!3dp`CfiGP` z@-np&k~isMNIrrYgyb$+1<6M+YasauW-Ww|U~1^*22i?Q2iXr}a34d`^?FD?me~Nw z$1({dAIl6w{rOF~5n7UKGxV`sTc9g*ZG~3k+6G;lYdci?Y|a$?e6CSwO|Bi#4Y_tf zx8&Ll-JWX?l;qkA-IZ$}WWPJzVKT^mpBg{sL$cKSAzA5zkgW8f8Yq{_VMyNTIReST z9ff4!%+KAzwL|jRRR<&=U3EgTMw1~~qp6Ur(KJZbXgVZo6hL;3@ch>e$|B8xWRXsV zWRXsXWQ}G)vPS1XvPQEZS)&k=HR^?AjpjhIM)M$9qxq1m(E{kfTE0jNL3y^B{|mgw zn=j@9=$p9~LR)h!f*yddp+a_R#XnzxfS?bBVWvTHd3}nAciR~7Wi+Va_FV^GC zsk^cN{V?yk7eVP}4kX>ogXD}YENT}OwNX*q56QN?7}9$PlKz%M(%%Y5`dbO*E%5yp zP?`)vvXifZWG7z($xgl&lKHQLWRqGC$tJY{l1(asWRn_(WRuzm$tJZKl1*w0^nQ8% z+X~7qwGEP;d^;q&R0_!^H44clwF8n(Y8ND%)NW{hzCrJW2A(_@8NXDog24#>V zkPLDZl0nQKH%L3APd<*2Qfq$WYTF^H?SS;(zeRgpbw4E4iy>*etf*aH z)UGIM&w0$XoefFb5R$fWQ9D@Ft}1HR)Id4Tbw%R(B5^~JxV5O=R@81UYDbIO9YyV~ zqISHf-Cxum)LQI+hl}bXMfFjw?!ZsjZh{?;@|#`9LCu^ecRjdOQL;Kt*ISk1uIReQkISR>TJNt2$7ebQP z3)#FW<^x4-RfXU13&|K;9@qE(@HKk`rSbNnNm|5q6tP`JY&Rs6*;~}^D{9A!*#07R z5Rw*$AenycFen$-QAjRA^Lsa$4oI*0A~v;%O)FwS5$i5urxvl(i`XnkrZ8J-?fw@Q z)xAY^l(~WXAz7KlkThOV)UGUQ#hg`CpR1Z;zFfq@G1ql3 zBwf#er0c~+?b4!lSy8(jl9d_MJnVm~io`WVVxrY}aVlyzkGp}lKr--FNCw^pN!QyU zeZhicEq6fDVi%+x7Oklf@59RCqmM78M56RXHGc2WbFSYn9o7- z4#*i(oGvQ#fkH2Rk*&q&AD!mO6QsjV^N&L17rWRKkbPqBG*{ub4a>k!Lo&#L*U1z* z&1tjn3z@Mk;}1){-mOO&k{{z<2}#?_irA9Z@YWIb%(jR&;x~jQ0R$56VH|o z@!6)T!<<&c-de=w7O~5U*pebvTU`Y0pT@A0nPToKV)qp~pu%cF_H&*I=4nW-if14> z&VOiLhxxY(FE!`5o=?QDhnF!f6xA@?RT@Nxv!xpha)~73l&Ct)6(4l5E2<@PR{nZ+ z6?9&%YarWor&(RpUSHJSP}JU4)NX=m()gaD`UgdI6O!5owYJT)pf_W{u2NzD_>j9;Pb~Dx58?ioD|luRe6Y|? zRfl;Pk`wWW3V$r_25EaTww*KapWWYIga1F4{37_T0~7N2f5Au8UGPf=Czt{3zvd12 z&o&;w|M%d(ufML%3{l+L#mm^{ESoRRH$as343GC3qyobB^pILn` zp>m3Ml{^Oj3pw}Wv8?OW;{SzPup78^s&|9jBxhuEnzvK#VKrWL*vVEF#0|(@g z9FbFUMmDdd{Xam#by_;zyG*W-tK?iJk=xFr0mwb%KJoy0=sfKI z$Lj4jLKPY8mUj$(^agz0^vt&W#~K%JdxON^gm{O5EYPbr!{63A}hWLPb+nF`| zsHKHpp<+b+3_PZuI;+jJ&6dGl4|l2G2luE~!d18!OyhSVKA?UGZcxsUjn{BwPog5F ziVigk7^&jBcfEJEE)~8Q>PUOT8Vg!0zaKH2w#~BZ^naeUgLkzn+kD z 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 z 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

O#J@M=}ufZ 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 - - - Assembly-CSharp - - - - - Helper for drawing label outline/shadow so that we can easily change it. - - - - - Helper for drawing label outline/shadow so that we can easily change it. - - - - - If true, SizeOffset_X and SizeOffset_Y are used when image is available. - Defaults to false. - - - - - If useImageDimensions is on and image width exceeds this value, scale down - respecting aspect ratio. - - - - - If useImageDimensions is on and image height exceeds this value, scale down - respecting aspect ratio. - - - - - If true, NVGs work in third-person, not just first-person. - Defaults to false. - - - - - Type the annotated class was generated for. - - - - - Method the annotated method was generated for. - - - - - Exposes the same API as the older Block class used by existing netcode, but implemented using new bit reader/writer. - - - - - Last realtime a request was sent. - Used to rate-limit clientside. - - - - - Perform rate limiting and update timestamp. - - True if we can proceed with request. - - - - Do we think the local player is eligible to send request? - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - Find difficulty asset (if valid) for navigation bound index. - - - - - Could potentially be reused generically. - - - - - When zombie falls outside the map it needs a replacement spawnpoint within the same navmesh area. - - - - - Find replacement spawnpoint for a zombie and teleport it there. - - - - - Kills night-only zombies at dawn. - - - - - Allows Unity events to call in airdrops. - - - - - Used by weather assets. - - - - - Distance inward from edge before intensity reaches 100%. - - - - - Alpha is 0.0 outside volume and 1.0 inside inner volume. - - - - - World space size of the box. - - - - - Half the world space size of the box. - - - - - World space size of inner falloff box when falloffDistance is non-zero. - For example a 24x12x6 box with a falloff of 4 has an inner box sized 16x4x0. - - - - - World space extents of inner falloff box when falloffDistance is non-zero. - - - - - Local space size of inner falloff box when falloffDistance is non-zero. - - - - - Local space extents of inner falloff box when falloffDistance is non-zero. - - - - - World space radius of the sphere. - - - - - Local space radius of the sphere. - - - - - World space radius of inner falloff sphere when falloffDistance is non-zero. - - - - - Local space radius of inner falloff sphere when falloffDistance is non-zero. - - - - - Useful for code which previously depended on creating the Unity collider to calculate bounding box. - - - - - Called in the level editor during registraion and when visibility is changed. - - - - - Editor-only solid/opaque child mesh renderer object. - - - - - If true during Awake the collider component will be added. - Otherwise only in the level editor. Some volume types like water use the collider in gameplay, - whereas most only need the collider for general-purpose selection in the level editor. - - - - - Camera does not rotate when the car rotates. - - - - - Camera rotates when the car rotates. - - - - - If hit from the left view rolls right, if hit from the right view rolls left. This may reduce motion - sickness for some players. - - - - - Rotate on all axes according to damage direction. This may induce motion sickness. - - - - - Unfortunately the version which added hitmarker style saved but didn't actually load (sigh). - - - - - Nelson 2023-12-28: this option was causing players to crash in the 3.23.14.0 update. Hopefully - it's resolved for the patch, but to be safe it will default to false. - - - - - Prior to 3.22.8.0 all scopes/optics had a base fov of 90 degrees. - - - - - If false, call Start and Stop recording before and after push-to-talk key is pressed. This was the - original default behavior, but causes a hitch for some players. As a workaround we can always keep - the microphone rolling and only send data when the push-to-talk key is held. (public issue #4248) - - - - - If true, group member name labels fade out when near the center of the screen. - Defaults to true. - - - - - If true, hide identifiable details of other multiplayer clients like avatars, player names, number of - players online, server name, etc. Live streamers may find this useful to help prevent stream sniping. - - Separated from the older "streamer mode" option. - - - - - If true, don't share details like "editing map X" or "join" with Steam. Useful for anyone who might be - targeted / followed into servers, or who has a project to keep secret. - - Separated from the older "streamer mode" option. - - - - - Controls whether hitmarkers are animated outward (newer) or just a static image ("classic"). - - - - - Determines how camera follows vehicle in third-person view. - - - - - Determines how camera follows aircraft vehicle in third-person view. - - - - - [0, 1] Blend factor between black and flashbang's desired color. - - - - - [0, 1] Multiplier for shake from . - - - - - Controls whether camera is constrained to roll-only or all axes. - - - - - Multiplier for flinch away from damage source in . - - - - - [0, 1] Intensity of FOV boost while sprinting. - - - - - [0, 1] Intensity of first-person motion caused by walking. - - - - - Invoked when custom UI colors are set. - - - - - Invoked when dark/light theme is set. - - - - - Number of times the player has clicked "Proceed" in the online safety menu. - - - - - If true, "don't show again" is checked in the online safety menu. - - - - - Prevents menu from being shown twice without a restart. - - - - - Nelson 2025-02-24: Warning that this is invoked *before* the item is actually removed from the items list. - (public issue #4894) - - - - checks whether a space contains any filled slots - - - checks whether an item can be dragged and takes into account if the item overlaps its old self - - - - checks whether the spot currently used by the old item is big enough to fit the new item - - - - - Please use SearchContents instead! To perform an equivalent search: - • Set ItemType to type. - • Set IncludeEmpty to false. - • Set IncludeMaxQuality to true. - - - - - Please use SearchContents instead! To perform an equivalent search: - • Set ItemType to type. - • Set IncludeEmpty to false. - • Set IncludeMaxQuality to true. - • Set CaliberId to caliber. - • Set IncludeUnspecifiedCaliber to allowZeroCaliber. - - - - - Please use SearchContents instead! To perform an equivalent search: - • Set AssetRef to id. - • Set IncludeEmpty to findEmpty. - • Set IncludeMaxQuality to findHealthy. - - - - - Please use SearchContents instead! To perform an equivalent search: - • Set MaxResultsCount to 1. - • Set AssetRef to id. - • Set IncludeEmpty to false. - • Set IncludeMaxQuality to true. - - - - - Invoked after any player's experience value changes (not including loading). - - - - - Invoked after any player's reputation value changes (not including loading). - - - - - Ugly hack for the awful skills enums. Eventually skills should be replaced. - - - - - Set every level to max and replicate. - - - - - Serverside only. - Called when skills weren't loaded (no save, or in arena mode), as well as when reseting skills after death. - - - - - Set this item as the dragging preview. - - - - - Standard shader mode changes are based on built-in StandardShaderGUI.cs - - - - - Does shader name match any of the standard shaders? - Standard, StandardSpecular and the Unturned "Decalable" variants all share nearly identical parameters. - - - - - Based on fixup routine in StandardShaderGUI SetMaterialKeywords. - - - - - Conditionally fixup older standard materials. - - True if material was edited. - - - - Parses mb:X from input string and filters assets using X master bundle. - - - - - List of all loaded blueprints potentially craftable by player. Updated when assets are refreshed. This - allows us to skip blueprints that will never be craftable (such as level-specific blueprints). - - - - - Recycled list of assets with blueprints. - - - - - Subset of loadedBlueprints. - - - - - Center column. - - - - - Used by inventory item context menu to override which blueprints are shown. - - - - - Left-hand column. - - - - - Right-hand column. - - - - - Returns true if all filtered blueprints are craftable. (hacked-in for item action menu) - - - - - If asset mapping has changed, find all assets with blueprints and gather the ones that can ever be crafted - on this level. (I.e., excluding ones that we shouldn't waste time considering.) - - - - - Accessible for UseableHousingPlanner. - - - - - Get a blank status from the pool or construct a new one. - - - - - Barricade asset's EBuild included in saves to fix state length problems. (public issue #3725) - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - Writable list of vehicle regions. Public add/remove methods should not be necessary. - - - - - Remove barricade instance on server and client. - - - - - Used by ownership change and damaged event to tell relevant clients the new health. - - - - - Legacy function for UseableBarricade. - - - - - Common code between dropping barricade onto vehicle or into world. - - - - - Spawn a new barricade attached to a vehicle and replicate it. - - - - - Spawn a new barricade and replicate it. - - - - - Not an instance method because structure might not exist yet, in which case we cancel instantiation. - - - - - Destroy barricades whose pivots are within sphere. - - - - - Clean up before loading vehicles. - - - - - Register a new vehicle as a valid parent for barricades. - Each train car is registered after the root of the train. - Note: Nobody knows why these are called plants. - - - - - Called before destroying a vehicle GameObject because storage needed to be ManualDestroyed. - - - - - Send all vehicle-mounted barricades to client. - Called after sending vehicles so all plant indexes will be valid. - - - - - Original server-only version that does not replicate changes to clients. - - - - - Only used by plugins. Replicates state change to clients. - - - - - Not ideal, but there was a problem because onLevelLoaded was not resetting these after disconnecting. - - - - - Maps prefab unique id to inactive list. - - - - - Sending yaw only costs 1 bit (flag) plus yaw bits, so compared to the old 24-bit rotation we may as well - make it high-precision. Quaternion mode uses 1+27 bits! - - - - - +0 = BarricadeDrop - +1 = root transform - +2 = Interactable (if exists) - - - - - ID unique to this zombie table in the level. If this table is deleted the ID will not be recycled. Used to - refer to zombie table from external files, e.g., NPC zombie kills condition. - - - - - Not an actual Steam ID or BattlEye ID, instead this is used to map player references to and from BE. - - - - - True for offline or listen server host. - - - - - Next time method is allowed to be called. - - - - - Number of times client has tried to invoke this method while rate-limited. - - - - - Get Steam item definition ID equipped for given vehicle. - - True if a skin was available. - - - - Build econ details struct from tags and dynamic_props. - Note that details cannot be modified because it's a struct and has copies of the data. - - - - - Add a recent ping sample to the average ping window. - Updates ping based on the average of several recent ping samples. - - Most recent ping value. - - - True if both players exist, are both members of groups, and are both members of the same group. - - - True if both players exist, are both members of groups, and are both members of the same group. - - - - Get real IPv4 address of remote player NOT the relay server. - - True if address was available, and not flagged as a relay server. - - - - See above, returns zero if failed. - - - - - Get real address of remote player NOT a relay server. - - Null if address was unavailable. - - - - Get string representation of remote end point. - - Null if address was unavailable. - - - - Players can set a "nickname" which is only shown to the members in their group. - - - - - Can be used by plugins to verify player is on a particular server. - - OnSteamAuthTicketForWebApiReceived will be invoked when the response is received. - Note that the client doesn't send anything if the request to Steam fails, so plugins may wish to kick - players if a certain amount of time passes. (e.g., if a cheat is canceling the request) - - - - - Component for the tactical laser attachment's red dot. - Resizes itself per-camera to maintain a constant on-screen size. - - - - - Used to tune the scale by distance so that far away laser is not quite as comically large. - - - - - This value is confusing because in the level editor it is the normalized radius, but in-game it is the square radius. - - - - - Load {Language}.dat and/or English.dat from folder path. - - - - - Note: as of 2025-04-23 this *can* be null. (E.g., audio-only effects.) - - - - - If set, use OneShotAudioParameters to play this audio. - - - - - If true the music option is respected when this effect is used by ambiance volume. - - - - - In multiplayer the effect will be spawned for players within this radius. - - - - - When loaded or spawned as a vehicle, creates a different vehicle instead. - For example, Off_Roader_Orange has ID 4. When that ID is loaded/spawned the new combined Off_Roader vehicle is - used instead. Can also optionally apply a paint color, allowing saves to be converted without losing colors. - - - - - Redirectors are in the Vehicle category so that legacy vehicle IDs point at the redirector. - - - - - Vehicle to use when attempting to load or spawn this asset. - - - - - If set, overrides the default random paint color when loading a vehicle from a save file. - Used to preserve colors of vehicles in existing saves. - - - - - If set, overrides the default random paint color when spawning a new vehicle. - Optionally used to preserve colors of vehicles in spawn tables. - - - - - Invoked prior to built-in death logic. - - - - - Event for plugins when player dies. - - - - - Invoked after player finishes respawning. - - - - - Tracks this player as an aggressor if they were recently an aggressor or if they haven't been attacked recently. - - Ignores rules and just make aggressive. - Whether to call markAggressive on group members. - - - Should damage be dealt even while inside safezone? - - - - Set bleeding state and replicate to owner if changed. - - - - - Set legs broken state and replicate to owner if changed. - - - - - Add to or subtract from stamina level. - Does not replicate the change. - - - - - Add to or subtract from stamina level. - Does not replicate the change. - - - - - Called from the server to modify stamina. - - - - - Add to or subtract from stamina level on the client and server. - - - - - Called from the server to induce a hallucination. - - - - - Add to or subtract from hallucination level on the client. - - - - - Add to or subtract from warmth level. - Does not replicate the change. - - - - - Called from the server to modify warmth. - - - - - Add to or subtract from warmth level on the client and server. - - - - - Add to or subtract from oxygen level. - Does not replicate the change. - - - - - Add to or subtract from health level. - Replicates change to owner. - - - - - Add to or subtract from food level. - Replicates change to owner. - - - - - Add to or subtract from water level. - Replicates change to owner. - - - - - Add to or subtract from virus level. - Replicates change to owner. - - - - - Used by plugins to respawn the player bypassing timers. Issue #2701 - - - - - Used to refill all client stats like stamina - - - - - Used by UI. True when underwater or inside non-breathable oxygen volume. - - - - - This value is confusing because in the level editor it is the normalized radius, but in-game it is the radius. - - - - - No longer used in vanilla. Kept in case plugins are using it. - - - - - No longer used in vanilla. Kept in case plugins are using it. - - - - - No longer used in vanilla. Kept in case plugins are using it. - - - - - Actual internal implementation. - - - - - World to local bounds only works well for axis-aligned icons. - - - - - Unity's Camera.orthographicSize is half the height of the viewing volume. Width is calculated from aspect ratio. - - - - - Fading in. - - - - - Finished fading in. - - - - - Fading out. - - - - - Finished fading out. - - - - - Extensions to the built-in Input class. - - - - - Wrapper for Input.GetKey, but returns false while typing in a uGUI text field. - - - - - Wrapper for Input.GetKeyDown, but returns false while typing in a uGUI text field. - - - - - Wrapper for Input.GetKeyUp, but returns false while typing in a uGUI text field. - - - - - Should be used anywhere that Input.GetKeyDown opens a UI. - - Each frame one input event can be consumed. This is a hack to prevent multiple UI-related key presses from - interfering during the same frame. Only the first input event proceeds, while the others are ignored. - - True if caller should proceed, false otherwise. - - - - Get mouse position in viewport coordinates where zero is the bottom left and one is the top right. - - - - - Original type on the Russia map which requires a mask with filters. - - - - - Requires a mask with filters and full body suit. - - - - - Damage dealt to players while inside the volume if they *don't* have clothing matching the deadzone type. - Could help prevent players from running in and out to grab a few items without dieing. - - - - - Damage dealt to players while inside the volume if they *do* have clothing matching the deadzone type. - For example, an area could be so dangerous that even with protection they take a constant 0.1 DPS. - - - - - Virus damage to players while inside the volume if they *don't* have clothing matching the deadzone type. - Defaults to 6.25 to preserve behavior from before adding this property. - - - - - Rate of depletion from gasmask filter's quality/durability. - Defaults to 0.4 to preserve behavior from before adding this property. - - - - - This value is confusing because in the level editor it is the normalized radius, but in-game it is the square radius. - - - - - Nelson 2024-06-10: Added this property after nodes were converted to volumes. i.e., only old levels from - before this property were added still have nodes, so it's expected that they won't deal damage over time. - - - - - Same description as . - - - - - Same description as . - - - - - Same description as . - - - - - Get real IPv4 address of remote player NOT the relay server. - - True if address was available, and not flagged as a relay server. - - - - See above, returns zero if failed. - - - - - When placing structures that snap to grid multiple requests can come - in to the server at the same time, and checking overlaps against structures - can be problematic, so as a backup we track pending build requests - and cancel ones which conflict. - - - - - Register a location as having something built there soon. - - Unique handle to later finish the request. - - - - Is a location available to build at (i.e. no pending builds)? - - False if there are any outstanding build requests for given location. - - - - Notify that a previously registered build has been completed. - - Unique handle. - - - - Nelson 2023-08-11: this probably should be rewritten a bit if used in the future - because the error context currently assumes this is an item reward for consumables. - - - - - Resolve table as items and grant random number to player. - - - - - Resolve table as items and grant random number to player. - - - - - Enumerate random number of valid assetIDs. - - - - - Converts Steam BBcode tokens into widgets displayable using Glazier UI. - - - - - If false, expect LineBreak tokens in input. (default false) - If true, insert line breaks where appropriate. - Steam's new visual editor doesn't emit newlines, instead inferring line breaks from paragraph blocks. To - make life easier we will do the same for the main menu announcement feed. - - - - - Vanilla maximum level. - - - - - If set, maximum skill level attainable through gameplay. - - - - - Multiplier for XP upgrade cost. - - - - - Get maximum level, or maxUnlockableLevel if set. - - - - - - - Implemented by components the player can talk with using DialogeAssets. (e.g., InteractableObjectNPC) - - - - - Used to test whether player is within range. - Ideally, this should be removed in the future in favor of the server resetting speaker when out of range. - - - - - Get a net ID that can be used with GetDialogueTargetFromNetId to resolve IDialogueTarget in multiplayer. - - - - - Called on server to test whether object conditions are met. - - - - - Called on server to find the start of conversation dialogue asset. - - - - - Used in error messages. - - - - - Called on client to format in UI. - - - - - Helper wrapping Unturned's usage of AudioListener.volume, which is the master volume level. - This makes it easier to track what controls the master volume and avoid bugs. - - - - - Is audio muted because this is a dedicated server? - - While dedicated server should not even be processing audio code, - older versions of Unity in particular have issues with headless audio. - - - - - Is audio muted because loading screen is visible? - - - - - Player's volume multiplier from the options menu. - - - - - Player's unfocused volume multiplier from the options menu. - - - - - Mute or un-mute audio depending whether camera is valid. - - - - - Synchronize AudioListener.volume with Unturned's parameters. - - - - - Note: new official code should be using per-method rate limit attribute. - This is kept for backwards compatibility with plugins however. - - Timestamp for server-side rate limiting. - - - - - Realtime this action was performed. - - - - - Realtime since performedRealtime. - - - - - if(myRateLimit.throttle(1.0)) - return; // less than 1s passed - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - List of all interactable items. Originally only used to clamp their distance from the drop point to ensure - clients can always pick them up, but now used to find items within a radius for nearby menu as well. - - - - - Kept for plugin backwards compatibility. - This one is problematic because on the client physics can move items between regions. - - - - - Find physically simulated items within radius. - - - - - Despawn any old items in the current despawn region. - - True if the region had items to search through. - - - - Attempt to respawn an item in the current respawn region. - - True if an item was succesfully respawned. - - - - Not ideal, but there was a problem because onLevelLoaded was not resetting these after disconnecting. - - - - - Instantiate at least this many items per frame even if we exceed our time budget. - - - - - Sort servers by name A to Z. - - - - - Sort servers by name Z to A. - - - - - Persistent identifier for server. Relies on server assigning a Game Server Login Token (GSLT). - i.e., servers without GSLT cannot be bookmarked. - - - - - IP address or DNS name to use as-is, or a web address to perform GET request. - Servers not using Fake IP can specify just a DNS entry and a static query port. - Servers using Fake IP are assigned random ports at startup, but can implement a web API endpoint to return - the IP and port. - - Nelson 2025-01-20: Making this optional now. The downside is we can't perform a Steam A2S query without - IP/port, but the upside is players can more easily join their non-port-forwarded servers. - - - - - Steam query port. Zero for servers using Fake IP. - - - - - Name updated from SteamServerAdvertisement. - - - - - Short description updated from SteamServerAdvertisement. - - - - - Small icon updated from SteamServerAdvertisement. - - - - - Used by UI to track whether it's been added/removed. - - - - - Allows player to save server advertisement to join again later. Semi-replacement for Steam's built-in favorites - and history lists because as of 2024-04-26 they don't seem to work properly with Fake IP. - - - - details if advertisement is bookmarked. - - - - Restore a removed bookmark. - - - - - Static functions for creating monitor instance on server. - - - - - Entry point called by dedicated server after loading level. - - - - - Create vanilla update monitor that watches for changes to workshop level file and any other mods. - - - - - Helper to get updated timestamp from workshop items loaded by DedicatedUGC. - - - - - Helper to create monitored item for use with default DedicatedWorkshopUpdateMonitor implementation. - - - - - For use with default DedicatedWorkshopUpdateMonitor implementation. - - - - - Get index within bounds assuming list is not empty. - - - - - Add a new item using its default constructor. - - - - - Apply shader name redirects until a final name is found, - and then load shader for compatible version of Unity. - - - - - Apply shader name redirects until a final name is found. - Used to fix renamed shaders loaded from old asset bundles. - - - - - Names of older shaders mapped to their renamed counterparts. - Used to fix shaders loaded from old asset bundles. - - - - - Delete all savedata folders for player's characters. - - - - - Number of Attack_# animations. - - - - - Number of Eat_# animations. - - - - - Number of Glance_# animations. - - - - - Number of Startle_# animations. - - - - - Maximum distance on the XZ plane. - - - - - Maximum distance on the XZ plane when attacking vehicles. - - - - - Maximum distance on the Y axis. - - - - - Minimum seconds between attacks. - - - - - Temporary until something better makes sense? For Spyjack. - - - - - If true, animal won't start moving until startle animation finishes. - - - - - Allows mappers to bulk replace assets by listing pairs in a text file. - https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/2275 - - - - - If a redirector for oldGuid exists, returns target asset. Otherwise null. - - - - - Component in the root Menu scene. - Additively loads decoration levels without modifying main scene. - - - - - Prevents static member from being initialized during MonoBehaviour construction. (Unity warning) - - - - - Nelson 2024-02-06: when looking into resolving public issue #3703 I figured since there is a common behavior - between InteractableObjectQuest, InteractableObjectNote, and InteractableObjectDropper (in that they all - request the server to do X we may as well support a "mod hook" that works with all three. - - - - - Controls where attachments looks for ADS alignment transform. - - - - - Look for aim alignment transform relative to sight model. - Defaults to Model_0/Aim. - - - - - Look for aim alignment transform relative to equipable prefab. - Requires setting AimAlignment_Path. - - - - - Factor e.g. 2 is a 2x multiplier. - Prior to 2022-04-11 this was the target field of view. (90/fov) - - - - - Zoom factor used in third-person view. - - - - - Whether main camera field of view should zoom without scope camera / scope overlay. - - - - - If true, scale scope overly by 1 texel to keep "middle" pixel centered. - - - - - Controls where to find AimAlignmentTransformPath. - - - - - If set, find this transform relative to AimAlignmentTransformOwner. - - - - - Position offset relative to Aim transform or transform specified by aimAlignmentTransformPath. - - - - - [0, 1] local distance from center to start of line. - - - - - [0, 1] local width of horizontal line. - - - - - Whether line/number are on left or right side of the center line. - - - - - If true, text label for distance is visible. - - - - - Optional component on Turret_# GameObject for modding UnityEvents. - - - - - Optional collider matching the player capsule to prevent short vehicles (e.g. bikes) from clipping into walls. - - - - - Displays a single random item. Placed under the other main menu buttons. - - - - - Hide existing icon until refresh. - Experimented with doing this for every refresh, but it looks bad in particular for hotbar. - - - - - Name of the asset bundle. - - core.content - - - - Path within the asset bundle. - - - - - Used to test whether player can fit in a space. - Includes terrain because tested capsule could be slightly underground, and clip to prevent exploits at sky limit. - - - - - Used for third-person camera in vehicle. - Does not include resource layer because attached barricades are put on that layer. - Barricades layer itself is included to prevent looking inside player bases. - - - - - Used to test whether player can enter a vehicle. - Does not include resource layer because attached barricades are put on that layer. - - - - - 2023-02-02: adding more layers since splatter can be attached to them now. - parent should only be set if that system also calls ClearAttachments, otherwise attachedEffects will leak memory. - - - - - Layer mask for CharacterController overlap test. - - - - - Layer mask for CharacterController overlap test while inside landscape hole volume. - - - - - Lightning strike raycasts from sky to ground using this layer mask. - - - - - Invoked when component is enabled and when the game object is activated. - - - - - Invoked when component is disabled and when the game object is deactivated. - Note that if the component or game object spawn deactivated this will not be immediately invoked. - - - - - Allows Unity events to print messages to the log file for debugging. - - - - - Text to use when PrintInfo is invoked. - - - - - Every time the inventory changes this number is incremented. - While a little messy, the idea is to prevent inventory checks from happening every frame. - - - - - Should be called every time something changes in the inventory. - - - - - Helper to prevent checking the inventory every frame for systems that don't use events. - - - - - Did owner call askInventory yet? - Prevents duplicate tell_X RPCs from being sent to owner prior to initial sync. - Ideally should be cleaned up with netcode refactor. (Client should not need to ask server for initial state.) - - - - - Intended as nearly a drop-in replacement for . - - - - - Intended as nearly a drop-in replacement for . - - - - - Intended as nearly a drop-in replacement for . - - - - - Intended as nearly a drop-in replacement for . - - - - - Intended as nearly a drop-in replacement for . - - - - - Intended as nearly a drop-in replacement for . - This variant wraps FindFirstItemByAsset and manages the results list for you. - Only use result if true is returned, otherwise it's invalid. - - - - - Intended as nearly a drop-in replacement for . - This variant wraps FindFirstItemByAsset and manages the results list for you. - - - - - Helper for tryAddItemAuto. - - - - - Given an item coordinate (page, x, y) could a new item take the place of an old (existing) item without - overlapping other item(s) space? Always true for equipment slots (page less than SLOTS). - For example if oldSize is (1, 2) rot 0, and newSize is (2, 1) rot 1, then they can swap. - - - - - Swap coordinates of two existing items. - Rotation is provided to handle differently shaped items e.g. a 1x2 item with a 2x1 item. - - - - - Swap coordinates of two existing items. - Rotation is provided to handle differently shaped items e.g. a 1x2 item with a 2x1 item. - - - - - Called from player movement to close storage that has moved away. - - - - - Serverside open a storage crate and notify client. - - - - - Serverside grant access to car trunk storage and notify client. - - - - - Serverside revoke trunk access and notify client. - - - - - Called on both client and server, as well as by storage itself when destroyed. - - - - - Please use SearchContents instead! To perform an equivalent search: - • Set IncludeEquipmentSlots to false. - • Set IncludeActiveStorageContainer to false. - • Set ItemType to type. - • Set IncludeEmpty to false. - • Set IncludeMaxQuality to true. - OR use the nearly drop-in replacement FindItemsByType. - - - - - Please use SearchContents instead! To perform an equivalent search: - • Set IncludeEquipmentSlots to false. - • Set IncludeActiveStorageContainer to false. - • Set ItemType to type. - • Set IncludeEmpty to false. - • Set IncludeMaxQuality to true. - • Set AnyCaliberIds to calibers. - • Set IncludeUnspecifiedCaliber to allowZeroCaliber. - OR use the nearly drop-in replacement FindAttachmentsByCaliber. - - - - - Please use SearchContents instead! To perform an equivalent search: - • Set IncludeEquipmentSlots to false. - • Set IncludeActiveStorageContainer to false. - • Set ItemType to type. - • Set IncludeEmpty to false. - • Set IncludeMaxQuality to true. - • Set CaliberId to caliber. - • Set IncludeUnspecifiedCaliber to allowZeroCaliber. - OR use the nearly drop-in replacement FindAttachmentsByCaliber. - - - - - Please use SearchContents instead! To perform an equivalent search: - • Set IncludeEquipmentSlots to false. - • Set IncludeActiveStorageContainer to false. - • Set AssetRef to id. - • Set IncludeEmpty to findEmpty. - • Set IncludeMaxQuality to findHealthy. - OR use the nearly drop-in replacement FindItemsByAsset. - - - - - Please use SearchContents instead! To perform an equivalent search: - • Set IncludeEquipmentSlots to true. - • Set IncludeActiveStorageContainer to true. - • Set MaxResultsCount to 1. - • Set AssetRef to id. - • Set IncludeEmpty to false. - • Set IncludeMaxQuality to true. - OR use the nearly drop-in replacements FindFirstItemByAsset or HasItemByAsset. - - - - - Filter for whether the Permanent Gold Upgrade DLC is required to join a server. - - - - - All servers pass the filter. - - - - - Only non-gold servers pass the filter. - - - - - Only gold servers pass the filter. - - - - - Can be added to any GameObject to listen for the Event NPC reward type. - - - - - *_ID configured in NPC rewards list. - - - - - If true the event will only be invoked in offline mode and on the server. - - - - - Invoked when NPC global event matching EventId is processed. - - - - - Invoked when timer expires. - - - - - Number of seconds to use when SetDefaultTimer is invoked. - - - - - Should timer loop when SetDefaultTimer is invoked? - - - - - Stop pending timer from triggering. - - - - - Handle to stop the coroutine. - - - - - Horizontal distance before road begins tapering off into the terrain. - - - - - Size along the "up" axis. - - - - - Distance along the terrain surface normal to move each road vertex. - - - - - Multiplier for how far along the road before texture repeats. - - - - - Defaults to None, in which case the backwards-compatible chart classification is used. - - - - - Physics material to assign to road colliders. - Replaces the "concrete" toggle in the older editor. - - - - - Can be added to Vehicle Turret_# GameObject to receive events. - - - - - Invoked when turret gun is fired. - - - - - Invoked when turret gun begins reload sequence. - - - - - Invoked when turret gun begins hammer sequence. - - - - - Invoked when turret gun begins aiming. - - - - - Invoked when turret gun ends aiming. - - - - - Invoked when turret gun controlled by a local player begins aiming. - - - - - Invoked when turret gun controlled by a local player ends aiming. - - - - - Invoked when turret gun controlled by a local player begins inspecting attachments. - - - - - Invoked when turret gun controlled by a local player ends inspecting attachments. - - - - - Invoked when any player enters the seat. - - - - - Invoked when any player exits the seat. - - - - - Invoked when a locally controlled player enters the seat. - - - - - Invoked when a locally controlled player exits the seat. - - - - - Nelson 2025-06-19: using server-provided connection details is useful because - it can find its public IP (e.g., joining by LAN and sharing WAN IP), and/or - its fake IP (again when joining by LAN). - - - - - Is client UTC time within this time range? - - - - - Is server UTC time within this time range? - - - - - Adds custom data to base physics material asset. - For example how a vanilla material should respond to custom laser guns. - - - - - Number of players inside the navmesh when the beacon was placed. - Clamped to 1 if ShouldScaleWithNumberOfParticipants is false. - - - - - Crossover from Dying Light. Only spawns during night. Explodes into fire at dawn. - - - - - Crossover from Dying Light. Only spawns during night. Explodes into fire at dawn. - - - - - Elver endgame boss with reduced bullet damage and wind zombie stomping attacks. - - - - - Kuwait final boss with increased rock throwing, damage players inside vehicle (turrets), and flashbangs. - - - - - Buak boss types have a red-eyed flashbang effect. - - - - - Is this one of the Dying Light volatile zombies? Only spawns during night. Explodes into fire at dawn. - - - - - Does this have the BOSS_* prefix? - - - - - Same as FindChildRecursive, but skip specific child. - - - - - Editor-only helper to read all text/dialogue. - - - - - Version before named version constants were introduced. (2023-11-07) - - - - - Delegate not reset when level reset. - - - - - Delegate not reset when level reset. - - - - - Delegate not reset when level reset. - - - - - Delegate not reset when level reset. - - - - - Number of in-game days this world has run. - Incremented each time night ends. - Saved between sessions. - - - - - Weather has not been decided yet. Level might not have any enabled. - - - - - Weather has been forecast. Timer counts down until activation. - - - - - Weather is now active. Timer counts down until deactivation. - - - - - Weather is active. Will not deactivate naturally. - Prevents loaded perpetual weather from deactivating. - - - - - Determines which weather can naturally be scheduled in this level. - Includes default rain and snow for older levels. - - - - - Seconds until weather activates. - - - - - Seconds until weather deactivates. - - - - - Forecast or active weather. - - - - - Set weather active and disable scheduling. - - - - True if given weather has config. - - - - Cancel scheduled weather and re-evaluate on next update. - - - - - Cancel active weather and prevent next weather from being scheduled. - - - - - Get weather override for the currently loaded level. - Warning: this is kept for backwards compatibility, whereas newer maps will set LevelAsset.perpetualWeather. - - - - - Assign schedulableWeathers array according to level asset or legacy lighting settings. - - - - True if perpetual weather was enabled, false otherwise. - - - - Used by dawn and dusk skins which pull per-level lighting colors. - - - - - Note: unfortunately it appears the stupid skin system always instantiated materials, but never destroys - them... will need to clean this up, but it will be tricky because the game does not hold a reference to them. - - - - - If true, sets the Magazine attachment hook inactive while this skin is applied. (guns only) - - Nelson 2025-03-10: Adding this to address mismatched Ace bullets with certain skins. (public issue #4923) - It should be fine for vanilla guns because there shouldn't be assumptions about Magazine enable/disable, - but modded guns may have different expectations (particularly with GunAttachmentEventHook). - - - - - Used by melee skins to override impact sound. - - - - - Restricts which items can be crafted. - - - - - Restrict blueprints that consume these items. - - - - - Restrict blueprints that generate these items. - - - - - If false, blueprints on vanilla/core/built-in items are not allowed. Defaults to true. - - - - - If null, use index instead. - - - - - Restrict specific blueprints. - - - - - Thanks to Glenn Fiedler for this RK4 implementation article: - https://gafferongames.com/post/integration_basics/ - - - - - Higher values return to the target position faster. - - - - - Higher values reduce bounciness and settle at the target position faster. - e.g. a value of zero will bounce back and forth for a long time (indefinitely?) - - - - - Absolute path to project directory, e.g. C:/U3 - - - - - Overrides breathability for example in a deep cave with no oxygen, or near a deep sea plant that provides oxygen. - - - - - Find highest alpha breathable volume overlapping position. - - - - - Find highest alpha non-breathable volume overlapping position. - - - - - Unlike format, this returns null if key doesn't exist. - - - - - This overload supports legacy Reward_# format. - - - - - This overload doesn't support legacy Reward_# format. - - - - - Payload for the DamageTool.explode function. - Moved into struct because the amount of arguments to that function were insane, but now is not the time to completely refactor damage. - - - - - Speed to launch players away from blast position. - - - - - Can be added to any GameObject to receive weather events: - - Day/Night - - Full Moon - - Rain - - Snow - - - - - Invoked when night changes to day. - - - - - Invoked when day changes to night. - - - - - Invoked when a zombie full-moon event starts. - - - - - Invoked when a zombie full-moon event finishes. - - - - - Invoked when rain starts to fall. - - - - - Invoked when rain finishes falling. - - - - - Invoked when snow starts to fall. - - - - - Invoked when snow finishes falling. - - - - - Registers renderers with DynamicWaterTransparentSort manager. - - - - - In vanilla this field is ONLY used for the per-character saves on servers. - If that changes check that it does not affect the savedata options. - - - - - 20-byte SHA1 salted hashes of client's hardware ID(s). - Providing multiple HWIDs makes it more difficult to bypass HWID bans because spoofing a single component - only changes one of the bans. For example spoofing the MAC address will not spoof the Windows GUID. - - Randomized if system did not support hwid, or perhaps player is cheating. - Should not be called on the client side, but just in case there is a default zeroed array. - - - - - Ignore requests to kick me in debug mode. :) - Steam ID may not have been authenticated yet here which may seem like a security risk, but fortunately that - would get caught when Steam auth ticket response is received. - - - - - Array of 20-byte SHA1 hashes. - - - - - Not using rate limit attribute because this is potentially called for hundreds of structures at once, - and only admins will actually be allowed to apply the transform. - - - - - See BarricadeRegion.FindBarricadeByRootFast comment. - - - - - For code which does not know whether transform exists and/or even is part of a house. - See BarricadeRegion.FindBarricadeByRootFast comment. - - - - - Steam APIs returned uint32 IPv4 addresses in the past, so Unturned code depends on them in some places. - Ideally these uses should be updated for IPv6 support going forward. - For the meantime this method converts from the new format to the old format for backwards compatibility. - - - - - Assets cannot be loaded from Resources during static initialization, so this reference defers the load until - the first time user tries to use it. - - - - - Material on Model_0, the low-speed actual blade. - - - - - Renderer on Model_1. - - - - - Material on Model_1, the high-speed blurred outline. - - - - - transform's localRotation when the vehicle was instantiated. - - - - - Rigidbody component on the root game object. - - - - - If true, set sharedMaterial. If false, set material. - - - - - Calculated speed of this track. Used by some wheels. - - - - - Temporary array for use with physics queries. - - - - - Temporary list for gathering materials. - - - - - Precursor to Net ID. Should eventually become obsolete. - - - - - Asset ID. Essentially obsolete at this point. - - - - - Used to restore vehicle materials when changing skin. - - - - - Only used by trains. Constrains the train to this path. - - - - - Unfortunately old netcode sends train position as a Vector3 using the X channel, but new code only supports - [-4096, 4096) so we pack the train position into all three channels. Eventually this should be cleaned up. - - - - - Nelson 2024-06-24: When first implementing batteries there was only the vanilla battery item, and it was - fine to delete it when the charge reached zero. This may not be desirable, however, so zero now represents - no battery item is present, and one represents the battery is completely drained but still there. - - - - - Is this vehicle inside a safezone? - - - - - Duration in seconds since this vehicle entered a safezone, - or -1 if it's not in a safezone. - - - - - Should askDamage requests currently be ignored because we are inside a safezone? - - - - - Nelson 2024-06-24: This property is confusing, especially with isEnginePowered, but essentially represents - starting the engine ignition when a player enters the driver's seat. If true, there's a driver, there was - sufficient battery to start (or battery not required), and the engine wasn't underwater. - - - - - Doesn't imply the vehicle *uses* batteries, only that it contains a battery item with some charge left. - - - - - Doesn't imply the vehicle *uses* batteries, only that it contains a (potentially uncharged) battery item. - - - - - Nelson 2024-11-13: Adding this primarily to indicate whether a vehicle was spawned by the level versus - placed by a player or bought from a vendor. This way if the number of "naturally"-spawned vehicles is below - a certain threshold the level can spawn more. (e.g., a server where players have hoarded a bunch of - vendor-purchased vehicles and no default vehicles are left for new players.) - - Only available on the server. - Defaults to true for old saves to prevent suddenly spawning a bunch more vehicles. - - - - - Whether the player can shoot their equipped turret. - - - - - Do any of the passenger seats have a player? - - - - - When the server saves it doesn't include any cleared vehicles. - - - - - If true, the vehicle will be destroyed at the end of the frame. Set before OnPreDestroyVehicle. - Used to reject requests to enter the vehicle on the same frame it's being destroyed. - - - - - Magnitude of rigidbody velocity, replicated by current simulation owner. - - - - - Rigidbody velocity along forward axis, replicated by current simulation owner. - - - - - Replicated by current simulation owner. Target velocity used, e.g., for helicopter engine speed. - - - - - [0, 1] If forward velocity is greater than zero, get normalized by target forward speed. If less than zero, - get normalized by target reverse speed. Result is always positive. - - - - - Animated toward ReplicatedForwardVelocity. - - - - - Animated toward ReplicatedVelocityInput. - - - - - [-1.0, 1.0] Available on both client and server. - - - - - Animated towards replicated steering angle. Used for steering wheel and front steering column. - Non-simulating wheels (e.g., car driven by remote client) use this as steering angle multiplied by their - per-wheel . - - - - - Front steering column of bicycles and motorcycles. - - - - - If true, server should replicate latest state to clients. - - - - - Used by several engine modes to represent an interpolated velocity target according to input. - - - - - Set from inputTargetVelocity then multiplied by any factors which shouldn't affect the player's "target" - speed ike boatTraction. - - - - - Vehicles with buoyancy interpolate this value according to whether it's in the water, and multiply - boat-related forces by it. - - - - - Rigidbody on the Vehicle prefab. - (not called "rigidbody" because as of 2024-02-28 the deprecated "rigidbody" property still exists) - - - - - Primarily for backwards compatibility with plugins. Previously, multiple "updates" could be queued per - vehicle and sent to clients. This list was public, unfortunately, so plugins may rely on submitting vehicle - updates. After making it obsolete each vehicle can only be flagged as needing a replication update, and - this is reset after each server replication update. - - - - - Is player currently allowed to repair this vehicle? - - - - - Give battery item to player and set battery charge to zero. - - - - - Nelson 2024-06-24: Previously, this wouldn't give an item to the player if the quality was zero. Now it - trusts the caller to validate we have a battery item to give, and respects . - - - - - Can a tire item be used with this vehicle? - - - - - Find the index of the wheel collider that contains this position. - - - - - Find the index of the wheel collider closest to this position, or -1 if not near any. - - - - - Called during simulate at fixed rate. - - - - - Is a given player allowed access to this vehicle? - - - - - If true, sentry ignores this vehicle early in target scanning. - Friendly if locked by owner/group of sentry, or driven by owner/group of sentry. - - - - - Average vehicle-space position of wheel bases. - - - - - Turn taillights on/off depending on state. - - - - - This check should really not be necessary, but somehow it is a recurring issue that servers get slowed down - by something going wrong and the vehicle exploding a billion times leaving items everywhere. - - - - - VehicleManager expects this to only find the seat, not add the player, - because it does a LoS check. - - - - - Call on the server to empty the vehicle of passengers. - - - - - Kicks them out even if there isn't a good spot. Used when killing the occupant. - - True if player is seated, false otherwise. - - - - Can a safe exit point currently be found? - - Called when considering to add a new passenger to prevent players from entering - a vehicle that they wouldn't be able to exit properly. - - - - - Could a player capsule fit in a given exit position? - - - - True if anything was hit. - - - - Raycast along a given direction, penetrating through barricades attached to THIS vehicle. - Returns point at the end of the ray if unblocked, or a safe (radius) distance away from hit. - - - - - Fallback if there are absolutely no good exit points. - Sets point and angle with a normal player spawnpoint. - - Once vehicle is completely surrounded there is no nice way to pick an exit point. Finding - a point upwards is abused to teleport upward into bases, finding an empty capsule nearby is - abused to teleport through walls, so if we're sure there isn't a nice exit point we can - fallback to teleporting them to a safe spawnpoint. - - - - True if we can safely exit. - - - - Initially use tryGetExit to find a safe exit, but if one isn't available then fallback to getExitSpawnPoint. - - - - - Dedicated server simulate driving input. - - - - - -1 is reverse. - 0 is neutral. - +1 is index 0 in gear ratios list. - - - - - Engine RPM replicated by current simulation owner. - - - - - Animated toward ReplicatedEngineRpm. - - - - - Called when engine RPM exceeds threshold and there are more gears available. - Purpose is to skip gear numbers that don't bring engine RPM within threshold (if possible). - - - - - Called when engine RPM is below threshold and there are more lower gears available. - Purpose is to skip gear numbers that don't bring engine RPM within threshold (if possible). - - - - - Client simulate driving input. - - - - - Nelson 2025-05-05: ran into a bug where our manual OnUpdate is called before Unity calls Start! - - - - - Nelson 2025-05-02: keeping the previous comment from 2020-11-26 here. At first I wondered if 24 vehicles - wasn't enough to properly test, but even with a higher vehicle count it can seemingly be *slower* to - call Update manually. That said, calling Update manually does give us the option to time-slice vehicle - updates. On the client and singleplayer we now update vehicles outside render distance at a lower - frequency which saves ~0.1 ms per frame on my PC. - - 2020-11-26 experimented with dispatching all vehicle updates from C# in VehicleManager because they make up - a significant portion of the MonoBehaviour Update, but the savings on my PC with 24 vehicles on PEI was - minor. Not worth the potential troubles. - - - - - Nelson 2025-04-22: it hopefully goes without saying the bicycle pedals are janky as heck, I'm just separating - out the Update method to make profiling it easier. - - - - - Nelson 2025-04-22: this should ideally be moved into FixedUpdate, incorrect to run in Update. - - - - - Nelson 2025-04-22: this should ideally be moved into FixedUpdate, incorrect to run in Update. - - - - - Update whether this vehicle is inside a safezone. - If a certain option is enabled, unlock after time threshold is passed. - - - - - Can be called without calling init. - - - - - Called after initializing vehicle. - - - - - Makes the collision detection system ignore all collisions between this vehicle and the given colliders. - Used to prevent vehicle from colliding with attached items. - - - - - Used to disable collision between skycrane and held vehicle. - - - - - Transform used for exit physics queries. - - - - - Find collider with the largest volume to use for exit physics queries. - - - - - Set material on DepthMask child renderer responsible for hiding water when interior of vehicle is submerged. - - - - - Skin material does not always need to be destroyed, so this is only valid if it should be destroyed. - - - - - Materials that should be destroyed when this vehicle is destroyed. - - - - - Handles to unregister from DynamicWaterTransparentSort. - - - - - Materials to set _PaintColor on. - - - - - Materials to move UVs in sync with wheels. - - - - - Time.time decayTimer was last updated. - - - - - Seconds since vehicle was interacted with. - - - - - Fractional damage counter. - - - - - transform.position used to test whether vehicle is moving. - - - - - Text from *.dat localization file. - - - - - Older *.content asset bundle reference. - - - - - Newer *.masterbundle reference. - - - - - Optional URL to open in web browser. - - - - - Whether audio source should loop. - - - - - Append suffix to name, or if name contains a '.' insert it before. - - - - - Vendor asset that owns this buy/sell record. - - - - - If not null, replaces item/vehicle description. - - - - - Allows Unity events to startle nearby animals and zombies. - - - - - Transform to spawn the alert at. - If unset, this game object's transform will be used instead. - - - - - If true, find the nearest player within ScanForPlayersRadius, and use the player's position as the alert - origin. - - - - - If UseScanForPlayers is enabled and this is true, an alert is broadcast even if no nearby player was found. - Otherwise, alert is ignored if no nearby player was found. - - - - - Used in a test scene to quickly test whether pooled components are cleaned up. - - - - - Invoked after any player's stance changes (not including loading). - - - - - Stance to fit available space when loading in. - - - - Distance zombies can detect this player within. - - - - Older, cached version of areEyesUnderwater. - - - - - Return false if there are any external restrictions (e.g. reloading, handcuffed) preventing climbing. - - - - - Test whether bottom of controller is currently inside a water volume. - - - - - Test whether viewpoint is currently inside a water volume. - - - - - Test whether body is currently inside a water volume. - Enters the swimming stance while true. - - - - - Draw debug capsule matching the player size. - - - - - Draw standing-height debug capsule matching the player size. - - - - - Is there enough height for our capsule at a position? - - - - - Could a standing player capsule fit at the given position? - - - - - Could a crouching player capsule fit at the given position? - - - - - Could a prone player capsule fit at the given position? - - - - - Could a standing player capsule teleport to the given position? - - - - - Is there any compatible stance that can fit at position? - - - - - Using our capsule's current height would there be enough space at a given position? - - - - - Does capsule have appropriate clearance for a pending height change? - - - - - Replicate stance to clients. - - - - - Regular interact ray still hits the ladder, but we only allow climbing within a smaller range to make its - teleport less powerful. - - - - - Ladder forward ray is 0.75m, so we move slightly less than that away from the ladder. - - - - - Export JSON report of Unturned's assets for economy usage. - - - - - If true, contains child transform named Effect for mythical attachment. - - - - - Attachment item IDs that get skinned specially. - - - - - Is there a fallback material for attachments that respects their main metallic areas? - - - - - Is there a fallback material without any special features? - - - - - Is there a replacement mesh? - - - - - Dawn and dusk skins pull per-lighting colors. - - - - - Pool lists to avoid loopback re-using an existing list. - Callers do not need to manually return lists because they are reset before each frame. - - - - - Exit button only needs to wait for timer in certain conditions. - - - - - Does the item being placed count as a "trap" for the purposes of vehicle placement restrictions? - - - - - Should placement ghost material change be done recursively? - e.g. Sentry has a deep hierarchy of meshes. - - - - - Given path to a workshop map, try to find its /Bundles folder. - - - - - Given path to a workshop map, try to find its /Content folder. - - - - - Maps on the workshop are a root folder named after the published file id, containing - the map folder itself with the level name. In order to load the map's bundles and content - properly we need to find the nested Bundles and Content folders. - - - - - 2023-02-28: note order is important because BarricadeManager saves as a byte! - - - - - Invoked after tellGesture is called with the new gesture. - - - - - Empty transform created at the world origin. - The first-person Viewmodel transform is re-parented to this. - - - - - Child of the first-person skull transform. - - - - - Camera near world origin masking the first-person arms and weapon. - - - - - Used by gun to hide viewmodel arms while aiming 2D scope, and by chainsaw to shake the viewmodel. - - - - - Used to hide viewmodel arms while using a vehicle turret gun. - - - - - Offsets main camera and aim rotation while aiming with a scoped gun. - - - - - Animated toward viewmodelSwayMultiplier. - - - - - Small number (0.1) while aiming, 1 while not aiming. - Reduces viewmodel animation while aiming to make 3D sights more usable. - - - - - Animated toward viewmodelOffsetPreferenceMultiplier. - - - - - 0 while aiming, 1 while not aiming. - Players can customize the 3D position of the viewmodel on screen, but this needs - to be blended out while aiming down sights otherwise it would not line up with - the center of the screen. - - - - - If true, use the scope aim fov instead of non-scope fov. - Useful for players with high (e.g. 160) fov to be able to use scopes. - - - - - Animated toward viewmodelCameraLocalPositionOffset, recoil, and bayonet offsets. - - - - - Abruptly offset when gun is fired, then animated back toward zero. - - - - - Abruptly offset when gun is fired, then animated back toward zero. - x = pitch, y = yaw, z = roll - - - - - Abruptly offset when bayonet is used, then animated back toward zero. - - - - - Animated while player is moving. - - - - - Blended from multiple viewmodel parameters and then applied to viewmodelCameraTransform. - - - - - Smoothing adds some initial blend-in which felt nicer for explosion rumble. - - - - - Meshes are disabled until clothing is received. - - - - - Target viewmodelCameraLocalPosition except while driving. - - - - - Animated while playing is moving. - x = pitch, y = roll - - - - - Offset when player lands. - - - - - Used to measure change in pitch between frames. - - - - - Used to measure change in yaw between frames. - - - - - Animated according to change in pitch/yaw input between frames so that gun rolls slightly while turning. - - - - - Animated according to change in item position between frames so that animations have more inertia. - - - - - Degrees per meter of item distance travelled. - Pitch is driven by vertical displacement, yaw and roll are driven by horizontal. - x = pitch, y = yaw, z = roll - - - - - In third-person this delays leaning in case player only wanted - to switch camera side without leaning. - - - - If true, include current animation speed modifier. - - - - At this point camera is already being shook, we just add some of the same shake to viewmodel for secondary motion. - - - - - Called by clothing to make mesh renderers visible. - - - - - Event for server plugins to monitor whether player is in-inventory. - - - - - Rate limit is relatively high because this RPC handles open/close inventory notification. - - - - - Nelson 2024-03-20: Adding this method because (at the time of writing) first and third-person renderers - and skeletons are activated/enabled in InitializePlayer, onPerspectiveUpdated, and onLifeUpdated, and I - want them to be consistent with the addition of the new NPC Cutscene Mode option. - - - - - 2023-01-18: Viewmodel camera position was originally set during Update (and still is for compatibility), - but for aiming alignment that uses the previous frame's animation position, so we also modify during - LateUpdate to use this frame's animation position. - - - - - Factor e.g. 2 is a 2x multiplier. - Prior to 2022-04-11 this was the target field of view. (90/fov) - - - - - [0, 1] percentage whether a shot decreases ammo count. Defaults to 100%. - For example, 0.25 means 25% of shots will use a bullet, while the remaining 75% will be free. - - - - - [0, 1] percentage whether a shot decreases quality. Defaults to 100%. - Combined with the gun's chance of decreasing quality. - - - - - Players/zombies within this range are treated as potential targets while scanning. - - - - - Will not lose current target within this range. Prevents target from popping in and out of range. - - - - - If true, this sentry can attack players. Defaults to true. - - - - - If true, this sentry can attack zombies. Defaults to true. - - - - - If true, this sentry can attack animals. Defaults to true. - - - - - If true, this sentry can attack vehicles. Defaults to true. - - - - - If the file already exists when writing we will move it to this path. (public issue #4636) - - - - - If false this barricade cannot take damage. - - - - - Modded barricades can disable pooling if they have custom incompatible logic. - - - - - Defaults to false, except for explosive charges which bypass claims. - Requested by Renaxon for collectible barricades that raiders can steal without destroying. - - - - - Defaults to false, except for explosive charges which bypass claims. - If true the item can be placed inside player clip volumes. (out of bounds) - - - - - Should door colliders remain active while animation is playing? - Enabled by modders trying to make stuff like elevators. - - - - - Optional alternative barricade prefab specifically for the client preview spawned. - - - - - By default, vehicles with "hooks" (such as the Skycrane) cannot pick up vehicles with barricades attached. - If all barricades on the vehicle set this to true then the vehicle *can* be picked up. Defaults to false. - - - - - Vehicle to place. - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. - - - - - Legacy ID of vehicle to place. - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. - - - - - Returned asset is not necessarily a vehicle asset yet: It can also be a VehicleRedirectorAsset which the - vehicle spawner requires to properly set paint color. - - - - - Can be added to any GameObject with a Trigger to receive events. - Ensure that Layer will detect player overlaps. Trap is a good candidate. - - - - - Invoked when a player enters the trigger. - Called before OnFirstPlayerEnter. - - - - - Invoked when a player exits the trigger. - Called before OnAllPlayersExit. - - - - - Invoked when first player enters the trigger, and not again until all players have left. - Called after OnPlayerEnter. - - - - - Invoked when last player exits the trigger. - Called after OnPlayerExit. - - - - - Nelson 2024-12-16: This menu and ESteamUGCType are far from ideal, but I'm just trying to hack in a new tag for - server browser curation assets before the update. :P - - - - - Nelson 2025-02-20: Hacking this in to address duplicate buttons when onPublishedAdded is called for a second - page of published files. (public issue #4882) - - - - - Allows Unity events to spawn items. - - - - - Called when the player clicks the cosmetic, visual or skin toggle buttons. - - - - - Invoked after any player's shirt values change (not including loading). - - - - - Invoked after any player's shirt values change (not including loading). - - - - - Invoked after any player's hat values change (not including loading). - - - - - Invoked after any player's backpack values change (not including loading). - - - - - Invoked after any player's backpack values change (not including loading). - - - - - Invoked after any player's backpack values change (not including loading). - - - - - Invoked after any player's glasses values change (not including loading). - - - - - Null if not bookmarked. - - - - - DNS entry to use if adding a bookmark for this server. - - - - - Adjusts width and spacing of buttons along the bottom of the screen. - Favorite and bookmark buttons can be hidden depending whether the necessary server details are set. - - - - - Sort items with lowest "amount" to front of list. - - - - - Sort items with highest "amount" to front of list. - - - - - Sort items with lowest quality% to front of list. - - - - - Sort items with highest quality% to front of list. - - - - - Sum up number of items found, ignoring amount. - Default except as described in TotalAmount comment. - - - - - Sum up "amount" of each item. Optionally counting zero as one (ShouldCountEmptyAsOne). - Default for legacy "ammo type" blueprints and FillTargetItem operation. - - - - - Note: if calling ItemRef.Get() please use FindItemAsset instead to avoid redundant asset lookups. - - - - - If true, items with an "amount" of zero are included in eligible supplies as amount 1. - In practice (as of 2025-03-03), items with zero amount are empty containers such as magazines. - - - - - Determines how totalAmount of each input is calculated. - - - - - If true, items with an "amount" of zero are included in eligible supplies. - Otherwise, they are ignored (default). - - - - - If true, items with an "amount" >= their MaxAmount are ignored. Otherwise, they are eligible (default). - - - - - If true, items with quality of 100% are eligible (default). Otherwise, they are ignored. - - - - - Controls which items are used first. For example, whether to use the lowest quality items first. - - - - - If true, delete input item. Defaults to true. - Replaces the "tool" blueprint option. - - - - - Does this blueprint input require the specified item? - - - - - Controls whether vehicle allows barricades to be attached to it. - - - - - Vehicle does not override placement. This means, by default, that barricades can be placed on the vehicle - unless the barricade sets Allow_Placement_On_Vehicle to false. (e.g., beds and sentry guns) Note that - gameplay config Bypass_Buildable_Mobility, if true, takes priority. - - - - - Vehicle allows any barricade to be placed on it, regardless of the barricade's Allow_Placement_On_Vehicle - setting. The legacy option for this was the Supports_Mobile_Buildables flag. Vanilla trains originally - used this option, but it was exploited to move beds into tunnel walls. - - - - - Vehicle prevents any barricade from being placed on it. Note that gameplay config Bypass_Buildable_Mobility, - if true, takes priority. - - - - - Scene hierarchy path relative to vehicle root. - - - - - Index in renderer's materials array. - - - - - If true, apply to every item in renderer's materials array. - - - - - Controls how vehicle's default paint color (if applicable) is chosen. - - - - - Not configured. - - - - - Pick from the DefaultPaintColors list. - - - - - Pick a random HSV using VehicleRandomPaintColorConfiguration. - - - - - Wheel does not affect steering. - - - - - Set steering angle according to and . - - - - - Increase or decrease motor torque to rotate vehicle in-place. (Tanks) - - - - - For , indicates how a positive motor torque (forward) rotates - the vehicle. - - - - - Wheels on the left side are Clockwise and wheels on the right side are Counter-Clockwise. - - - - - Positive motor torque on this wheel rotates the vehicle clockwise. - - - - - Positive motor torque on this wheel rotates the vehicle counter-clockwise. - - - - - Controls whether wheel creates particle kickup effects for the ground surface material underneath. - - - - - Turn off motion effects. Default for wheels not using collider pose. - - - - - Enable motion effects. Default for wheels using collider pose. - - - - - Enable motion effects, but turn them off while moving backward. - - - - - Enable motion effects, but turn them off while moving forward. - - - - - [0, 1] color will have zero saturation if random value is less than this. For example, 0.2 means 20% of - vehicles will be grayscale. - - - - - If true, this configuration was created by . - Otherwise, this configuration was loaded from the vehicle asset file. - - - - - Transform path relative to Vehicle prefab with WheelCollider component. - - - - - If true, WheelCollider's motorTorque is set according to accelerator input. - - - - - Transform path relative to Vehicle prefab. Animated to match WheelCollider state. - - - - - If true, model is animated according to steering input. - Only kept for backwards compatibility. Prior to wheel configurations, only certain WheelColliders actually - received steering input, while multiple models would appear to steer. For example, the APC's front 4 wheels - appeared to rotate but only the front 2 actually affected physics. - - - - - If true, model ignores isModelSteered and instead uses WheelCollider.GetWorldPose when simulating or the - replicated state from the server when not simulating. Defaults to false. - - - - - If greater than zero, visual-only wheels (without a collider) like the extra wheels of the Snowmobile use - this radius to calculate their rolling speed. - - - - - If set, visual-only wheels without a collider (like the back wheels of the snowmobile) can copy RPM from - a wheel that does have a collider. Requires modelRadius to also be set. - - - - - If set, wheel model uses this crawler track's speed (average RPM of wheels). Prevents wheel model from - spinning out of sync with overall track. - - - - - Target steering angle is multiplied by this value. For example, can be set to a negative number for - rear-wheel steering. Defaults to 1. - - - - - Vertical offset of model from simulated suspension position. - - - - - How quickly to interpolate model toward suspension position in meters per second. - If negative, position teleports immediately. - - - - - Nelson 2024-12-06: Initially implemented as a minimum and maximum percentage of normalized forward velocity, - but think this is more practical. I can't think of why we would use values other than -1, 0, +1 for that, - and if we did we'd probably want some tuning for the angle particles are emitted at. - - - - - If true, wheel should fly off when vehicle explodes. Defaults to true. - Used to simplify destroying vehicles with crawler tracks. - - - - - Default. - - - - - Set pitch and volume of a single clip according to engine RPM. - - - - - Offsets a crawler track's material UV offset in sync with wheels rolling. - - - - - Scene hierarchy path relative to vehicle root. - - - - - Index in renderer's materials array. - - - - - Indices of wheels to copy RPM from. - - - - - How far to travel to offset UV 1x. (1/x) - - You can calculate RepeatDistance by selecting an edge parallel to the crawler track and dividing the UV - distance by the physical 3D distance. For example, if the UV length is 2 and the 3D length is 1.5 m then - the texture repeats 1.33 UV/m. - - - - - UV mainTextureOffset per distance traveled. - - - - - Please refer to: - - - - - Please refer to: - - - - - Supports redirects by VehicleRedirectorAsset. - - "Shared Skins" were implemented when there were several asset variants of each vehicle. For example, - Off_Roader_Orange, Off_Roader_Purple, Off_Roader_Green, etc. Each vehicle had their "shared skin" set to - the same ID, and the skin asset had its target ID set to the shared ID. This isn't as necessary after - merging vanilla vehicle variants, but some mods may rely on it, and it needed GUID support now that the - target vehicle might not have a legacy ID. - - - - - Prevents calling getOrLoad redundantly if asset does not exist. - - - - - Clip.prefab - - - - - Vehicle.prefab - - - - - Nelson 2024-02-28: Prior to the VehicleWheelConfiguration class, most of the wheel configuration was - inferred during InteractableVehicle initialization from the children of the "Tires" and "Wheels" transforms. - Confusingly, "Tires" only contains WheelColliders and "Wheels" only contains the visual models. Rather than - keeping the old behavior in InteractableVehicle alongside the newer more configurable one, we match the old - behavior here to generate an equivalent configuration. - - Note that must be initialized before this is called (by loading model). - - - - - Maximum (negative) velocity to aim for while accelerating backward. - - - - - Maximum speed to aim for while accelerating backward. - - - - - Maximum velocity to aim for while accelerating forward. - - - - - Maximum speed to aim for while accelerating forward. - - - - - Steering angle range at zero speed. - - - - - Steering angle range at target maximum speed (for the current forward/backward direction). - - - - - Steering angle rotation change in degrees per second. - - - - - Added or subtracted from wheel motor torque in mode. - - - - - When a wheel is in mode and a steering input is applied the - stiffness is multiplied by this factor. This allows the vehicle - to rotate in-place with a lower steering torque, which helps prevent the vehicle from going out of control - while turning and accelerating. - - - - - Multiplier for and - while at target maximum speed (for the current forward/backward direction). - - - - - Torque on Z axis applied according to steering input for bikes and motorcycles. - - - - - If true, leaning force is multiplied by normalized speed to the power of steeringLeaningForceSpeedExponent. - Defaults to false. - - - - - Refer to steeringLeaningForceShouldScaleWithSpeed. - - - - - If true, explosion will damage nearby entities and kill passengers. - - - - - Only used if ShouldExplosionBurnMaterials. Optional. Allows specifying which renderers to burn. - - - - - When true the bicycle animation is used and extra speed is stamina powered. - Bad way to implement it. - - - - - Can this vehicle ever spawn with a charged battery? - Uses game mode battery stats when true, or overrides by preventing battery spawn when false. - - - - - Battery charge when first spawning in is multiplied by this [0, 1] number. - - - - - Battery decrease per second. - - - - - Battery increase per second. - - - - - Battery item given to the player when a specific battery hasn't been manually - installed yet. Defaults to the vanilla car battery (098b13be34a7411db7736b7f866ada69). - - - - - Fuel decrease per second. - - - - - Client sends physics simulation results to server. If upward (+Y) speed exceeds this, mark the move invalid. - - - - - Client sends physics simulation results to server. If downward (-Y) speed exceeds this, mark the move invalid. - - - - - If distance between client-submitted hit position and vehicle pivot point is too high the hit will be - marked invalid. This multiplies the distance threshold, useful for very fast vehicles. - - - - - Vertical first-person view translation. - - - - - Vertical first-person view translation. - - - - - Base damage to players when traveling at 1 m/s. Defaults to 10. - - - - - Base damage to zombies when traveling at 1 m/s. Defaults to 15. - - - - - Base damage to animals when traveling at 1 m/s. Defaults to 15. - - - - - Base damage to objects when traveling at 1 m/s. Defaults to 30. - - - - - Base damage to trees when traveling at 1 m/s. Defaults to 85. - - - - - If speed multiplied by is less than this, no damage is applied. - Defaults to 3. - - - - - Multiplier for damage from crashing into things. - Not applicable if is false. - Defaults to 1. - - - - - To non-explosions. - - - - - Mega zombie rocks, zombies, animals. - - - - - Crashing into stuff. - - - - - Can this vehicle be repaired by a seated player? - - - - - Can mobile barricades e.g. bed or sentry guns be placed on this vehicle? - - - - - Should capsule colliders be added to seat transforms? - Useful to prevent bikes from leaning into walls. - - - - - Can players lock the vehicle to their clan/group? - True by default, but mods want to be able to disable. - - - - - Can players steal the battery? - - - - - Spawn table to drop items from on death. - - - - - Minimum number of items to drop on death. - - - - - Maximum number of items to drop on death. - - - - - Item ID of compatible tire. - - - - - If greater than zero, torque is applied on the local Z axis multiplied by this factor. - Note that is critical for damping this force. - - - - - Exponent on the [0, 1] factor representing how aligned the vehicle is with the ground up vector. - - - - - If greater than zero, an acceleration is applied to angular velocity on Z axis toward zero. - - - - - Indices of wheels using replicated collider pose (if any). - Null if not configured or no wheels using this feature. - Allows client and server to replicate only the suspension value without other context. - - - - - Indices of wheels with motor torque applied (if any). - Used for engine RPM calculation. - - - - - If this and UsesEngineRpmAndGears are true, HUD will show RPM and gear number. - - - - - When engine RPM dips below this value shift to the next lower gear if available. - - - - - When engine RPM exceeds this value shift to the next higher gear if available. - - - - - How long after changing gears before throttle is engaged again. - - - - - How long between changing gears to allow another automatic gear change. - - - - - Minimum engine RPM. - - - - - Maximum engine RPM. - - - - - How quickly RPM can increase in RPM/s. - e.g., 1000 will take 2 seconds to go from 2000 to 4000 RPM. - - - - - How quickly RPM can decrease in RPM/s. - e.g., 1000 will take 2 seconds to go from 4000 to 2000 RPM. - - - - - Maximum torque (multiplied by output of torque curve). - - - - - Was a center of mass specified in the .dat? - - - - - If hasCenterOfMassOverride, use this value. - - - - - Multiplier for otherwise not-yet-configurable plane/heli/boat forces. - Nelson 2024-03-06: Required for increasing mass of vehicles without significantly messing with behavior. - - - - - If set, override the wheel collider mass with this value. - - - - - Null if vehicle doesn't support paint color. - - - - - List of transforms to register with DynamicWaterTransparentSort. - - - - - Null if vehicle doesn't support paint color. - - - - - Null if isn't . - - - - - Pick a random paint color according to . Null if unsupported or not configured. - - - - - If true, Vehicle Paint items can be used on this vehicle. - Always false if is false. - - Certain vehicles may support paint colors without also being paintable by players. For example, the creator - of a vehicle may want to use color variants without also allowing players to make it bright pink. - - - - - Returns reverseGearRatio for negative gears, actual value for valid gear number, otherwise zero. - Exposed for plugin use. - - - - - Get number of reverse gear ratios. - Exposed for plugin use. - - - - - Get number of forward gear ratios. - Exposed for plugin use. - - - - - Number of tire visuals to rotate with steering wheel. - - - - - If true then level should convert old terrain. - - - - - If true, splatmap conversion should use weights as-is. - - - - - Material guids converted by legacy asset bundle hash or texture names. - - - - - Hash of Trees.dat, or zeroed if any assets were missing locally. - Should only be used if level is configured to, as many mod maps are typically missing assets. - - - - - Nelson 2025-06-10: replacement for _trees. Enables trees outside the "insane" level bounds. - - - - - Append all trees in the level to results list. - - - - - Game does not currently have a way to resave level's Config.json file, so instead we save a text file - indicating that the terrain auto conversion was performed. If there was a bug with auto conversion then - all of the old files are still present and can be re-converted. - - - - - Stagger regional visibility across multiple frames. - - - - - Caches uint16 ID to ID redirects. - - - - - Manages lifetime and attachment of a mythical effect. Added by . - Was called `MythicLocker` with a paired `MythicLockee` prior to 2024-06-11. - - - - - https://steamcommunity.com/dev/managegameservers - - - - - IP address, DNS name, or a web address (to perform GET request) to advertise. - - Servers not using Fake IP can specify just a DNS entry. This way if server's IP changes clients can rejoin. - For example, if you own the "example.com" domain you could add an A record "myunturnedserver" pointing at - your game server IP and set that record here "myunturnedserver.example.com". - - Servers using Fake IP are assigned random ports at startup, but can implement a web API endpoint to return - the IP and port. Clients perform a GET request if this string starts with http:// or https://. The returned - text can be an IP address or DNS name with optional query port override. (e.g., "127.0.0.1:27015") - - - - - If true, the server lobby warns that in-game ping may be higher than shown. BUT it's shown in the default - UI color rather than the "bad" color when flagged by moderation. - - - - - If ready-to-connect messages are received more than twice from the same client in less than this many - seconds they will be kicked. - - - - - If bad packets (that *may* be legitimate) are received more than threshold times within this many seconds - of each other, reject the calling connection. - - - - - If more than this many bad packets (that *may* be legitimate) are received within window seconds of each - other, reject the calling connection. - - - - - If a rate-limited method is called this many times within cooldown window the client will be kicked. - For example a value of 1 means the client will be kicked the first time they call the method off-cooldown. (not recommended) - - - - - Only applicable when Fake IP is off. When a client is connecting, if their connection would push the number - of simultaneous connections from the same IP address past this number, they are prevented from joining. - - May be useful to prevent against fake join requests coming from a single source IP. (public issue #5001) - - Defaults to a high value because some regions will have many more clients with the same IPv4 address than - others. For example, due to Carrier-grade NAT (CGNAT). - - - - - Whether rejections for Max_Clients_With_Same_IP_Address should log to command output. Useful for checking - if the limit is appropriate. - - - - - Ordinarily the server should be receiving multiple input packets per second from a client. If more than this - amount of time passes between input packets we flag the client as potentially using a lag switch, and modify - their stats (e.g. reduce player damage) for a corresponding duration. - Minimum value is PlayerInput.MIN_FAKE_LAG_THRESHOLD_SECONDS. - - - - - Whether fake lag detection should log to command output. False positives are relatively likely when client - framerate hitches (e.g. loading dense region), so this is best used for tuning threshold rather than bans. - - - - - PvP damage multiplier while under fake lag penalty. - - - - - Should we kick players after detecting spammed calls to askInput? - - - - - Should we kick players if they do not submit inputs for a long time? - - - - - Should the server automatically shutdown at a configured time? - - - - - When the server should shutdown if Enable_Scheduled_Shutdown is true. - - - - - Broadcast "shutting down for scheduled maintenance" warnings at these intervals. - - - - - Should the server automatically shutdown when a new version is detected? - - - - - Unfortunately the server does not have a way to automatically determine the current beta branch. - - - - - Broadcast "shutting down for update" warnings at these intervals. - - - - - Should vanilla text chat messages always use rich text? - Servers with plugins may want to enable because IMGUI does not fade out rich text. - Kept because plugins might be setting this directly, but it no longer does anything. - - - - - Should the EconInfo.json hash be checked by the server? - - - - - If true, opt-in to SteamNetworkingSockets "FakeIP" system. - https://partner.steamgames.com/doc/api/ISteamNetworkingSockets#1 - - - - - If greater than zero, vehicles with XZ position outside this threshold are saved in the center of the map. - By default, vehicles outside ±40 km are teleported into the map. - Intended to help with physics issues caused by vehicles far out in space. (public issue #4465) - - - - - Limit max queue timeout duration so that if server encounters an error or doesn't - process the request the client can timeout locally. - - - - - Longer than server timeout so that ideally more context is logged on the server - rather than just "client disconnected." - - - - - Original option for disabling item quality. Defaults to true. If false, items spawn at 100% quality and - their quality doesn't decrease. For backwards compatibility, the newer per-item-type durability options - are ignored if this is off. - - - - - Food-specific replacement for . Defaults to false. If true, food spawns at 100% quality. - - - - - Water-specific replacement for . Defaults to false. If true, water spawns at 100% quality. - - - - - Clothing-specific replacement for . Defaults to false. If true, clothing spawns at 100% quality. - - - - - Weapon-specific replacement for . Defaults to false. If true, weapons spawns at 100% quality. - - - - - Fallback used when spawning an item that doesn't fit into one of the other quality/durability settings. - Defaults to false. If true, items spawn at 100% quality. - - - - - Clothing-specific replacement for . Defaults to true. If false, clothing quality - doesn't decrease when damaged. - - - - - Melee and gun replacement for . Defaults to true. If false, weapons quality - doesn't decrease when used. - - - - - Seconds vehicle can be neglected before it begins taking damage. - - - - - After vehicle has been neglected for more than Decay_Time seconds it will begin taking this much damage per second. - - - - - Vehicles are considered "natural" if they were spawned by the level as opposed to players or vendors. - If less than this many natural vehicles exist in the level, more will be spawned. The minimum of this or - Max_Instances is used. (i.e., if this value is higher than max instances the max instances value is used - instead.) - - - - - Minimum seconds between boss zombie spawns for players doing quests. - Players were abusing the spawns to farm boss tier loot. - - - - - Weapon damage multiplier against body, arms, legs. Useful for headshot-only mode. - - - - - Should players be allowed to build on their vehicles? - - - - - Should players be allowed to build traps (e.g. barbed wire) on their vehicles? - - - - - Furthest away from colliders a player can build an item onto their vehicle. - - - - - Furthest away from colliders a player can build a trap (e.g. barbed wire) onto their vehicle. - - - - - [0, 1] percentage of skill levels to retain after death. - - - - - [0, 1] percentage of skill levels to retain after death. - - - - - Number of skill levels to remove after death. - - - - - Number of skill levels to remove after death. - - - - - [0, 1] percentage of experience points to retain after death. - - - - - [0, 1] percentage of experience points to retain after death. - - - - - Should each character slot have separate savedata? - - - - - If true, players will be kicked if their skin color is too similar to one of the level's terrain colors. - - - - - Each per-level custom weather frequency is multiplied by this value. - - - - - Each per-level custom weather duration is multiplied by this value. - - - - - Should ServerTextChatMessenger be allowed to broadcast? - - - - - Should ServerTextChatMessenger be allowed to execute commands? - - - - - Should ClientTextChatMessenger be allowed to broadcast? - - - - - Should ClientTextChatMessenger be allowed to execute commands? - - - - - Should group connections be shown on player list? - - - - - If true, allow automatically creating an in-game group for members of your Steam lobby. - Requires Allow_Dynamic_Groups to be enabled as well. - - - - - Is friendly-fire allowed? - - - - - Are sentry guns and beds allowed on vehicles? - - - - - Should holiday (Halloween and Christmas) content like NPC outfits and decorations be loaded? - - - - - Can "freeform" barricades be placed in the world? - Defaults to true. - - - - - Can "freeform" barricades be placed on vehicles? - Defaults to true. - - - - - If true, aim flinches away from center when damaged. - Defaults to true. - - - - - If true, camera will shake near explosions. Can also be toned down client-side in Options menu. - Defaults to true. - - - - - If true, crafting blueprints can require nearby workstations. Defaults to true. - If false, only the backwards-compatibility "Heat Source" vanilla crafting tag can be required. This - functions identically to the cooking-skill-also-requires-heat behavior from before. - - - - - If true, client-side options like damage flinch, explosion camera shake, viewmodel bob are ignored. - Defaults to false. - - - - - If true, hide viewmodel while aiming a dual-render scope and show a 2D overlay instead. - - Nelson 2025-07-04: adding this option for backwards compatibility with modded scopes that have a small - enough dual-render surface to zoom-*out* when aiming in. - - Defaults to false. - - - - - Scales velocity added to players by explosion knock-back. - - - - - Scales midair input change in player direction. - - - - - Scales midair decrease in speed while faster than max walk speed. - - - - - Scales magnitude of recoil while using first-person perspective. - - - - - Scales magnitude of recoil while aiming in first-person perspective. - - - - - Scales magnitude of recoil inversely with zoom level while aiming in first-person perspective. - - - - - Scales magnitude of recoil while using third-person perspective. - - - - - Scales magnitude of bullet inaccuracy while using third-person perspective. - - - - - [0, 1] Scales how much the first-person move up and down while jumping/landing. - - - - - [0, 1] Scales how much the first-person arms move while ADS. - - - - - Center mythical effect hook horizontally, but maintain vertical placement. - Lots of hats/masks/glasses have off-center effects intentionally, but community - feedback suggests centering to make effects like circling atoms look better. - - - - - Set mesh of all character mesh renderers. - Tries to match renderer index to mesh LOD index. - - - - - Set material of all character mesh renderers. - - - - - Hack for previewing the "aura" cosmetic items. - - - - - If true, this character is for capturing clothing icons. - - - - - Planar reflection component updates its culling distance and culling mask when this is incremented. - - - - - Overrides in-game UI scale setting. - - - - - Distance to use terrain shaders before fallback to a baked texture. - - - - - Higher error reduces vertex density as distance increases. - - - - - Added for players who want to see if they can get better performance with a ridiculously low max draw distance. - - - - - Multiplier for far clip plane distance. - Clamped within [0, 1] range to prevent editing config files for an advantage. - - - - - Multiplier for draw distance. - Clamped within [0, 1] range to prevent editing config files for an advantage. - - - - - Multiplier for draw distance of optional super-low LOD models. - Clamped within [0, 1] range to prevent editing config files for an advantage. - - - - - Vehicles outside this distance are not rendered. - - - - - Called after loading graphics settings from disk so that their values can be adjusted. - - - - - If default resolution is zero, try falling back to a higher one. - Used when restoring defaults and validating loaded settings. - - - - - If true, make the game look as nice as possible. - Note: certain limits are imposed except in singleplayer to prevent this from being exploited. - - - - If true, include current animation speed modifier. - - - True if an animation was found and started playing. - - - - Velocity is directly set to input velocity. - - - - - Velocity is affected by acceleration and deceleration. - - - - - Properties common to asset and extensions. For example both can specify sounds. - - - - - Invokes an event a configured number of times. - - - - - If true the event will only be invoked in offline mode and on the server. - - - - - Invoked multiple times. - - - - - Sanity check all returned elements have a gameObject. - - - - - Create software cursor visual element. - - - - - Create green label in the upper-left. - - - - - Create tooltip visual element. - - - - - Update upper-left green text. - - - - - Update software cursor visual element. - - - - - Find hovered element and update tooltip visibility/text. - - - - - Container for SleekWindow element. - - - - - Container for top-level visual elements. - - - - - Element under the cursor on the previous frame. - - - - - Duration in seconds the cursor has been over the element. - - - - - EconInfo.json hash does not match. - - - - - Master bundle hashes do not match. - - - - - Workshop usage advertised on server list does not match during connect. - - - - - Used by client transport to show a custom localized message. - - - - - Server has not received an auth session response from Steam yet. - - - - - Server has not received an economy response from Steam yet. - - - - - Server has not received a groups response from Steam yet. - - - - - Player nickname exceeds limit. - - - - - Player nickname contains invalid characters. - - - - - Player nickname should not be a number. - - - - - Server did not respond to EServerMessage.Authenticate - - - - - Player resources folders don't match. - - - - - The network identity in the ticket does not match the server authenticating the ticket. - This can happen if server's Steam ID has changed from what the client thinks it is. - For example, joining a stale entry in the server list. (public issue #4101) - - - - - Level name advertised on server list does not match during connect. - - - - - VAC status advertised on server list does not match during connect. - - - - - BattlEye status advertised on server list does not match during connect. - - - - - Max players advertised on server list does not match during connect. - - - - - Camera mode advertised on server list does not match during connect. - - - - - Combat mode advertised on server list does not match during connect. - - - - - Player's skin color is too similar to one of . - - - - - Steam ID reported by net transport doesn't match client's reported Steam ID. - This was exploited to fill the server queue with fake players. - - - - - Received too many connection requests from player in a short window. - - - - - Received too many invalid messages from connection in a short window. - - - - - Same as CUSTOM, but shows the "verify game files" prompt. - - - - - Server limits how many clients are joining from the same IP address. - (public issue #5001) - - - - - Does this label fade out as the chat message gets older? - - - - - Chat message values to show. - - - - - Invoked after state is first loaded, synced from server when entering relevancy, or reset. - - - - - Invoked after interaction changes state. - - - - - Number of event hooks monitoring or controlling this. - Used to allow client to control remote objects on server. - - - - - Remove items that do not match search text. - - - - - Note SetListing also calls RefreshInCart. - - - - - Cannot be created until store data is available. - - - - - Toggle button to open/close advanced filters panel. - - - - - On/off checkbox for including already-owned items in filter. - - - - - Container for advanced options. - - - - - Displays the current page number. - - - - - Only visible when cart is not empty. - - - - - [0, pageCount) - - - - - If true, listings should be re-filtered when opening the menu. - - - - - Collections of multiple items. - - - - - Discounted items. - - - - - Items marked as new in the Status.json file. - - - - - Items marked as featured in the Status.json file. - - - - - Implemented by "root" component of each entity type that can provide crafting tags to nearby players. - This allows overlap with a barricade attached to a vehicle to find the barricade from barricade collider and - vehicle from vehicle collider rather than using transform root. Any mod hook extensions to crafting tags will - be sibling components or descendants of this component. - - - - - Asset providing tags. For example, a barricade item. - - - - - True if GetAvailableTags can ever add any tags. - Used to skip unnecessary line-of-sight tests against (for example) ordinary structures and the like. - - - - - All tags added by this crafting tag provider. - - - - - Rewards to grant when quest is removed without completing. - Not granted when player finishes quest. - - - - - Configuration for DedicatedUGC. - - - - - Published workshop file IDs to download. - - - - - Published workshop file IDs whose children (dependencies) should be skipped. - Useful if workshop author lists dependencies as a way of advertising. - - - - - Controls SetAllowCachedResponse. Disabled when set to zero. - Balance between item change frequency and allowing cached results when query fails. - - - - - Number of total times to try re-submitting failed workshop queries before aborting. - - - - - Should items already installed be loaded? - - - - - Should used items be monitored for updates? - - - - - Seconds to wait before shutting down after an update is detected. - - - - - Message broadcasted when shutdown timer begins. - - - - - Message sent to players when shutdown timer completes. - - - - - Get instance if loaded, but do not load. - - - - - Get instance, or load if not yet loaded. - - - - - Should only be used by . - For example: "Condition_##" where ## is an index. - - - - - Nelson 2025-03-11: not *super* happy about having this in here. Needed for UI_Requirements. - - - - - Nelson 2025-03-11: not *super* happy about having this in here. Needed for UI_Requirements. - - - - - If set, only show this condition in the UI when conditions with these indices are met. - For example don't show "arrest the criminal (name)" until "investigate crime" is completed. - - - - - Is this condition influenced by a given quest flag? - Used by level objects to determine if local player's flag change may affect visibility. - - - - - Replacement for isAssociatedWithFlag to fix quest conditions and somewhat improve perf. - - - - - Intended to replace filling data from constructor. - - - - - Intended to replace filling data from constructor. Legacy is for backwards compatibility with Condition_#_Key - format, whereas V2 uses the list and dictionary features. - - - - - Can be added to gun item game objects (including children) to receive events. - - - - - Which attachment type to monitor. - - - - - Optional. If set, only consider item matching this GUID. I.e., slot is considered empty if attached item - has a different asset GUID. - - - - - If true, AssetGuidFilter passes when item in slot *doesn't* match GUID. - - - - - Invoked both when: - 1. Gun is first equipped and an item is already present in the slot. - 2. An item is added to the slot. - - - - - Invoked both when: - 1. Gun is first equipped and the slot is empty. - 2. An item is removed from the slot. - - - - - Controls whether events are invoked when asset in slot changes. - - - - - Nelson 2025-02-04: Gun attachment slots are currently hard-coded, but if that changes this could be updated - with a "custom" option. - - - - - If emptiness of slot doesn't change (attachment replaced), do nothing. - - - - - In addition to regular Attached and Detached events, if the item asset in the slot changes invoke - Detached then Attached. - - - - - State doesn't affect AI collision. - - - - - AI collision is blocked when object state is ON. - - - - - AI collision is blocked when object state is OFF. - - - - - Controls how rubble affects Nav game object. - - - - - Default. Destruction of rubble sections does not affect whether Nav game object is active or not. - - - - - AI collision is blocked when any sections are alive. Once all sections are dead AI collision is unblocked. - - - - - The game uses Process.Start to open web links when the Steam overlay is unavailable, which could be exploited - to e.g. download and execute files. To prevent this we only allow valid http or https urls. - - If true, prefix with https:// if neither http:// or https:// is specified. - - - - This version just doesn't return the parsed URL. - - - - - Resolve spawn table asset if set, otherwise find asset by legacy in-editor ID configuration. - Returned asset is not necessarily a vehicle asset yet: It can also be a VehicleRedirectorAsset which the - vehicle spawner requires to properly set paint color. - - - - - Used when spawn table asset is not assigned. Pick a random legacy ID using in-editor list of spawns. - - - - - Multiplier for how quickly deadzones deplete a gasmask's filter quality. - e.g., 2 is faster (2x) and 0.5 is slower. - - - - - Hack for previewing the "aura" cosmetic items. - - - - - Was redirected to HolidayUtil but kept for plugin backwards compatibility. - Refer to HolidayUtil for explanation of this weird situation. - - - - - Was redirected to HolidayUtil but kept for plugin backwards compatibility. - Refer to HolidayUtil for explanation of this weird situation. - - - - - The base transform does not rotate, instead a child transform is created with the pivot in the center. - - - - - To work around a uGUI bug we always a sign a texture, even if desiredTexture is null. - - - - - Broadcasts after dedicated server name changes. - Command IO interface binds to this rather than having a title-specific method. - - - - - Should the default console I/O handler be created? - Plugins can disable on the command line when overriding handler. - - - - - Should the legacy blocking (game thread) console be created? - - - - - Log white information. - - - - - Log yellow warning. - - - - - Log red error. - - - - - Print white message to console. - - - - - Print yellow message to console. - - - - - Print red message to console. - - - - - Cannot use UnturnedLog here because it may recursively call CommandWindow if another exception is thrown. - - - - - Called during Unity Update loop. - - - - - Called during OnApplicationQuit. - - - - - Helper for plugins that want to replace the default without the shouldCreateDefaultConsole flag. - - - - - If true, the player can press Interact [F] when there are no responses - and the "next" dialogue will be opened. - - - - - Each dialogue message is separated into multiple pages. - - - - - Current page localized text with name_npc and name_char formatted in. - - - - - Seconds elapsed while viewing current page not including pause timer. - Used to gradually show the message text. - - - - - Seconds to wait before resuming pageAnimationTime counting. - - - - - Appends chars from pageFormattedText according to pageAnimationTime. - - - - - Rich text formatting tags to close those opened by visible text in animatedTextBuilder. - For example, if animatedTextBuilder includes an opening color=#, this includes the closing color markup. - Required depending on Glazier used. - - - - - Number of chars of pageFormattedText currently visible. - - - - - Added to animation visible chars to skip time on markup. - - - - - Seconds elapsed since responses started becoming visible. - Used to gradually enable responses rather than all at once. - - - - - Animated toward total number of responses to make them gradually visible. - - - - - If true, animation is finished and there is another page to show when Interact [F] is pressed. - - - - - If true, text on current page is in the process of gradually appearing. - - - - - Used by quest UI to return to current dialogue. - - - - - Update timers and UI for current page index. - - - - - Called when the player presses Interact [F] in dialogue screen. - - - - - Show complete text for the current page and make responses visible. - Called if dialogue animation is disabled, and when the player presses Interact [F] during animation. - - - - - Use "Interact" token from translation file. - - - - - If true, description should only be populated with contents from prior to the auto-layout UI changes. - - - - - BuildDescription implementations can use this to concatenate longer strings. - - - - - Which parent to use when attaching an equipped/useable item to the player. - - - - - Helper for plugins that want item prefabs server-side. - e.g. Allows item icons to be captured on dedicated server. - - - - - Item name wrapped in color rich text tags according to rarity. - - - - - Hack for Kuwait aura icons. - - - - - Useable subclass. - - - - - Can this useable be equipped by players? - True for most items, but allows modders to create sentry-only weapons. - - - - - Can this useable be equipped while underwater? - - - - - Vertical half size of icon camera. - Values less than zero are disabled. - - - - - Vertical half size of economy icon camera. - - - - - Should the newer automatic placement and orthographic size for axis-aligned icon cameras be used? - Enabled by default, but optionally disabled for manual adjustment. - - - - - Nelson 2025-04-10: adding this for semantics because amount isn't an obvious name. - - - - - If true, item should be removed when "amount" reaches zero. - Defaults to true except for magazines. - - - - - Which parent to use when attaching an equipped/useable item to the player. - - - - - If true, equipable prefab is a child of the left hand rather than the right. - Defaults to false. - - - - - Whether viewmodel should procedurally animate inertia of equipped item. - Useful for low-quality older animations, but modders may wish to disable for high-quality newer animations. - - - - - Defaults to true. If false, the equipped item model is flipped to counteract the flipped character. - - - - - If true, stats like damage, accuracy, health, etc. are automatically appended to the description. - Defaults to true. - - - - - Nelson 2024-12-11: This can now be null for cosmetic items (). For those items it wasn't - used outside of the main menu 3D item preview, in which case the clothing prefab is typically a better - visualization. - - - - - Optional alternative item prefab specifically for the PlayerEquipment prefab spawned. - - - - - Name to use when instantiating item prefab. - By default the asset legacy id is used, but it can be overridden because some - modders rely on the name for Unity's legacy animation component. For example - in Toothy Deerryte's case there were a lot of duplicate animations to work - around the id naming, simplified by overriding name. - - - - - Movement speed multiplier while the item is equipped in the hands. - - - - - Sound to play when inspecting the equipped item. - - - - - Sound to play when moving or rotating the item in the inventory. - - - - - When a player dies with this item, should an item drop be spawned? - - - - - Can player click the drop button on this item? - - - - - If this item is compatible with skins for another item, lookup that item's ID instead. - - - - - Defaults to true. If false, skin material and mesh are not applied when is - set. For example, a custom axe can transfer the kill counter and ragdoll effect from a vanilla item's skin - without also transferring the material and mesh. - - - - - Should friendly-mode sentry guns target a player who has this item equipped? - - - - - Kept in case any plugins refer to it. - Renamed to shouldFriendlySentryTargetUser. - - - - - Should players be allowed to start primary/secondary use of this item while inside given safezone? - If returns false the primary/secondary inputs are set to false. - - - - - Should this item be deleted when using and quality hits zero? - e.g. final melee hit shatters the weapon. - - - - - Should the game destroy all child colliders on the item when requested? - Physics items in the world and on character preview don't request destroy, - but items attached to the character do. Mods might be using colliders - in unexpected ways (e.g., riot shield) so they can disable this default. - - - - - Are there any official skins for this item type? - Skips checking for base textures if item cannot have skins. - - - - - Find useableType by useable name. - - - - - V2 is for newer dat list features. - - - - - Legacy is for backwards compatibility with Blueprint_# format. - - - - - V2 is for newer dat list features. - - - - - Legacy is for backwards compatibility with Action_# format. - - - - sortOrder values for description lines. - Difference in value greater than 100 creates an empty line. - - - - Properties common to Gun and Melee. - - - - - Properties common to Barricade and Structure. - - - - - Properties common to Gun, Consumable, and Throwable. - - - - - Properties common to Gun and Melee. - - - - - Properties common to Gun and Melee. - - - - - Properties common to Gun and Melee. - - - - - Properties common to Gun and Melee. - - - - - Remaps asset load requests into a large asset bundle rather than small individual asset bundles. - - - - - Config that contains the actual large AssetBundle. - - - - - Asset path relative to the master AssetBundle. - - - - - Icon visible when this listing is in the cart. - - - - - "SALE" or "NEW" text visible when applicable. - - - - - Tooltip text. - - - - - Holds tooltip text - - - - - Nelson 2025-01-28: This command reproduces a bug destroying the player gameObject if the vehicle is - destroyed on the same frame as the request to exit. - https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/4760#issuecomment-2613090165 - - - - - Speaker writes compressed audio to this buffer. - Listener copies network buffer here for decompression. - - - - - Listener writes decompressed PCM data to this buffer. - - - - - Seconds interval to wait between asking recording subsystem for voice data. - Rather than polling every frame we wait until data has accumulated to send. - - - - - Seconds to wait before playing back newly received data. - Allows a few samples to buffer up so that we don't stutter as more arrive. - - - - - Seconds to wait after playback before stopping audio source. - We zero this portion of the clip to prevent pops. - - - - - Max calls to askVoice server will allow per second before blocking their voice data. - Prevents spamming many tiny requests bogging down server output. - - - - - Max compressed bytes server will allow per second before blocking their voice data. - When logging compressed size they averaged 3000-5000 per second, so this affords some wiggle-room. - - - - - Internal value managed by isTalking. - - - - - Is this player broadcasting their voice? - Used in the menus to show an indicator who's talking. - Locally set when recording starts/stops, and remotely when voice data starts/stops being received. - - - - - Broadcasts after isTalking changes. - - - - - Can this player currently hear global (radio) voice chat? - - - - - Is the player wearing an earpiece? - Allows global (radio) voice chat to be heard without equipping the walkie-talkie item. - - - - - Is a UseableWalkieTalkie currently equipped? - Set by useable's equip and dequip events. - - - - - Was the most recent voice data we received sent using walkie talkie? - - - - - Has voice data recently been received, but we're waiting slightly to begin playback? - Important to give clip a chance to buffer up so that we don't stutter as more samples arrive. - - - - - AudioSource.isPlaying is not trustworthy. - - - - - Timer counting down to begin playback of recently received voice data. - We use a timer rather than availableSamples.Count because a very short phrase could be less than threshold. - - - - - Timer counting down to end playback. - - - - - Accumulated realtime since we last polled data from voice subsystem. - - - - - Last time askVoiceChat was invoked over network. - - - - - Number of times askVoiceChat has been called recently, to prevent calling it many times - with tiny durations getting server to relay many packets to clients. - - - - - Total of recent compressed voice payload lengths. - - - - - Realtime since this recent conversation began. - - - - - Only used by plugins. - Called on server to allow plugins to override the default area and walkie-talkie voice channels. - - - - - Default culling handler when speaking over walkie-talkie. - - - - - Default culling handler when speaking in proximity. - - - - - Called by owner to relay voice data to clients. - Not using rate limit attribute because it internally tracks bytes per second. - - - - - Called by server to relay voice data from clients. - - - - - Set to true during OnDestroy to make sure we don't start recording again. - - - - - If true, SteamUser.StartVoiceRecording has been called without a corresponding call to - SteamUser.StopVoiceRecording yet. - - - - - If true, voice toggle is in ON mode. - - - - - Internal value managed by inputWantsToRecord. - - - - - Set by updateInput based on whether voice is enabled, key is held, is alive, etc. - Reset to false during OnDestroy to stop recording. - - - - - Called during Update on owner client to start/stop recording. - - - - - Called during Update on owner client to record voice data. - - - - - Play walkie-talkie squawk at our position. - - - - - Start and stop playback of received audio stream. - - - - - Will this component ever need to record voice data? - - - - - Will this component ever need to play voice data? - In release builds this is only true for remote clients, but in debug we may want to locally listen. - - - - - Player's voice audio source cached during Start. - - - - - Looping voice audio clip. - - - - - Playback buffer. - - - - - Steam does less work on the main thread if we request samples at the native decompresser sample rate, - so the re-sampling can be done on the Unity audio thread instead. - - - - - 1 / frequency - - - - - Number of samples to zero after writing new audio data. - - - - - Are any players standing on the mannequin? - Used to prevent exploiting pose switches to push through objects. - - - - - Amount of experience to reward harvesting player. - - - - - If true, harvesting has a chance to provide a second item. - - - - - If true, rain will finish growing the plant. - - - - - NPC rewards to grant upon harvesting the crop. - - - - - Represents an item the vendor is selling to players. - - - - - Refer to NPCItemReward state. - - - - - Represents a vehicle the vendor is selling to players. - - - - - Returned asset is not necessarily a vehicle asset yet: It can also be a VehicleRedirectorAsset which the - vehicle spawner requires to properly set paint color. - - - - - If set, takes priority over VehicleRedirectorAsset's paint color and over VehicleAsset's default paint color. - - - - - Added during the UI refactor to catch unhandled mouse clicks during drag. - - - - - Contains inspect item box and invisible button. - - - - - Added during the UI refactor to catch mouse clicks outside the selection box. - - - - - Annoying frustrating workaround for IMGUI. Disable inventory headers, grids and slots while selection is open - to prevent them from interfering with selection menu. - - - - - Was ConsumeEvent called during this frame? - This is a hack to prevent firing when clicking in the UI on the same frame it closes. - Moved from SleekWindow and Event.current.Use() during UI refactor. - - - - - Move item drag visual to the cursor's position. - - - - - Backwards-Compatible Asset Reference with Caching - • Supports both GUID and legacy ID. - • Caches resolved asset and updates if asset has been reloaded. - • Parsing legacy ID without context requires "LegacyType:LegacyID" format. E.g., "Item:4" for the Eaglefire. - • See CachingAssetRef if legacy ID support is unnecessary. - - - - - If true, doesn't reference anything. - Could also be called "IsZero" or "IsNull". - - - - - Opposite of IsEmpty. - - - - - Assigned GUID, not the referenced asset's GUID. - - - - - Assigned legacy ID, not the referenced asset's legacy ID. - - - - - Assigned legacy type, not the referenced asset's legacy type. - - - - - Doesn't only check (Get() == asset) because a new asset may have loaded. - Rather, checks whether GUID or legacy ID (whichever is set) points at asset. - If asset is null, returns true if GUID and legacy ID are zero. - - - - - Supports both GUID and legacy ID formats. - - If input string contains ':' the first part is EAssetType and the second part is legacy ID. - - If defaultLegacyType is not None the input string can be parsed as a legacy ID. - - Otherwise, parsed as GUID. - - - - - Supports both GUID and legacy ID formats. - - If input string contains ':' the first part is EAssetType and the second part is legacy ID. - - Otherwise, parsed as GUID. - - - - - Returns Empty if TryParse returns false. - - - - - Returns Empty if TryParse returns false. - - - - - Enables assigning assetRef from an existing asset without manually calling constructor. - - - - - Enables assigning assetRef from an asset GUID without manually calling constructor. - - - - - Enables assigning assetRef from a non-backwards-compatible asset ref without manually calling constructor. - - - - - Render character with hair and skin otherwise it might be cyan. - (public issue #3615) - - - - - If set, audio clip associated with physics material will take priority. - - - - - Collision with speed lower than this value will not play a sound. - - - - - Currently triggers are only used for water. - - - - - Sorts higher rarity items into the front of the list. - - - - - Sorts name alphabetically to the front of the list. - - - - - Sorts type alphabetically to the front of the list. - - - - - [0, 1] blends towards one while active regardless of local volume. - - - - - [0, 1] blends towards one if current volume bitwise AND with asset is non-zero. - - - - - Lesser of global or volume blend alphas. - - - - - If blending was not ticket yet then local blend can use global value, e.g. loading into rain storm. - - - - - Is blendAlpha at 100%? - - - - - [0, 1] Rain puddle alpha cutoff. - - - - - [0, 1] Rain puddle ripples alpha. - - - - - Optional parameter for error logging. - - - - - Run hash algorithm for all data passing through a stream. - - - - - Repurposed from the Modules UI because it was unused. - - - - - Full argument string. Defaults to Environment.CommandLine. - - Nelson 2025-06-17: By default, Steam shows a warning nowadays when the game is launched with externally-provided - command-line arguments. For example, when joining a friend via rich presence. The solution is to use the arg - string provided by SteamApps.GetLaunchCommandLine, which also supports *changing* the arguments while the app is - running. If the environment-provided command-line doesn't contain it, the game will append Steam's launch options. - - Note: Steam override isn't applied until Steam is initialized. (after Dedicator and ModuleManager) Please refer to - Setup.cs for the full initialization order. - - - - - Nelson 2025-06-16: Steam doesn't handle "server code" connect URL, but we now support - it for rich presence joins via server code for easier inviting friends to private servers. - - When Steam parses a steam://connect/ip:port URL it requires the query port (e.g. 27015). - - - - - Handles these cases: - key value -> value - key=value -> value - key = value -> value - key = value -> value - key "value with spaces" -> value with spaces - key "value with \" quotation marks" -> value with " quotation marks - - Tested in CommandLineTests.cs - - - - - Is the application running as a headless server? - Replacement for isDedicated property. The property could not be changed to const in dedicated-server-only - builds without potentially breaking plugins. Only development builds can be run as both client or server. - - - - - Are we currently running the standalone dedicated server app? - - - - - Should dedicated server disable requests to internet? - While in LAN mode skips the Steam backend connection and workshop item queries. - Needs a non-Steam networking implementation before it will be truly offline only. - - - - - Hints/messages are the pop-up texts below the interaction prompt, e.g. "reload" or "full moon rises". - Got a complaint that the item placement obstructed hint was shown if placing multiple signs. - - - - - Adjust screen positioning and visibility of player name widgets to match their world-space counterparts. - - - - - Update hitmarker visibility, and their world-space positions if user enabled that. - - - - - Disable hints and messages if no longer applicable. - - - - - Disable vote popup if enough time has passed. - - - - - Pause the game if playing singleplayer and menu is open. - - - - - Many places checked that the cursor and chat were closed to see if a menu could be opened. Moved here to - also consider that useable might have a menu open. - - - - - Calculate damage multiplier for individual bullet. - - - - - Each shot has a percentage chance to hit the target. Higher values are more likely to hit. e.g., it - decreases from 1.0 at point blank to 0.0 at the weapon's maximum range. This chance is affected by the - gun's spread. - - - - - Contains presetsScrollView which contains customPresetsContainer and defaultPresetsContainer. - - - - - Contains column buttons and server list itself. - - - - - Synchronize widgets with their values. - - - - - Each level should have a 380x80 Icon.png file. - This class caches them so that the server list can show them quickly. - - - - - Time.time damage was last dealt so that damage is applied once per second. - - - - - Timer increased while taking damage, and reset to zero while inside zone. - - - - - Current position. - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - Is the active level an Arena mode map? - - - - - Find a new smaller circle within the old circle and clamp it to the playable level area. - - - - - Pick a random airdrop node appropriate for the game mode. - - - - - Nelson 2025-04-01: default position intBitCount of 13 has range of [-4096, 4096), but on "insane" size maps - the aircraft starts 2 km outside that range. This causes the care package to spawn at the wrong position. - Bumping intBitCount to 14 enables a range of [-8192, 8192). (public issue #4972) - - - - - Seconds between weather event starting and reaching full intensity. - - - - - Seconds between weather event ending and reaching zero intensity. - - - - - Sound clip to play. Volume matches the intensity. - - - - - Component to spawn for additional weather logic. - - - - - If per-volume mask AND is non zero the weather will blend in. - - - - - Expands upon Unity physics material properties for gameplay features. - - - - - Originally considered assets for each legacy material with fallback to main material, but the fallback - would mean a failed lookup for every property in the vast majority of cases. - - - - - If true, crops can be planted on this material. - - - - - If true, oil drills can be placed on this material. - - - - - For custom friction mode, multiplies character acceleration. - - - - - For custom friction mode, multiplies character deceleration. - - - - - For custom friction mode, multiplies character max speed. - - - - - • Does not support legacy ID. - • Caches resolved asset and updates if asset has been reloaded. - • See CachingBcAssetRef if legacy ID support is necessary. - - - - - If true, doesn't reference anything. - Could also be called "IsZero" or "IsNull". - - - - - Opposite of IsEmpty. - - - - - Assigned GUID, not the referenced asset's GUID. - - - - - Doesn't only check (Get() == asset) because a new asset may have loaded. - Rather, checks whether GUID points at asset. - If asset is null, returns true if GUID and legacy ID are zero. - - - - - Returns Empty if TryParse returns false. - - - - - Enables assigning assetRef from an existing asset without manually calling constructor. - - - - - Enables assigning assetRef from an asset GUID without manually calling constructor. - - - - - Internal so that CachingBcAssetRef can copy cachedAsset. - - - - - Auto-registering list of volume manager subclasses for level editor. - - - - - Should calling InstantiateVolume create a new volume? - False for deprecated (landscape hole volume) types. - - - - - These are methods moved from the Data class which rely on core types and so cannot go in the UnturnedDat assembly. - - - - - Intended as a drop-in replacement for existing assets with property uint16s. - - - - - Intended as a drop-in replacement for existing assets with legacy IDs. - - - - - Enables builder pattern for dat edits. - Inclusion of asset type is optional for cases where it's not obvious from context. - - - - - Enables builder pattern for dat edits. - Inclusion of asset type is optional for cases where it's not obvious from context. - - Legacy asset references are converted to GUID if the asset is available. If not available, type prefix - is only used if legacy type changed. - - - - - This overload assumes legacyType has not changed. This will usually be the case. Legacy type would only - change (for example) in cases like spawn tables where they can reference any asset type. - - - - - Kept because lots of modders have been using this script in Unity, - so removing legacy effect id would break their content. - - - - - Active while powered. - - - - - This value is confusing because in the level editor it is the normalized radius, but in-game it is the square radius. - - - - - Far clip plane multiplier in-game. - - - - - Far clip plane multiplier in level editor. - - - - - Essentially identical to ContentReference, but MasterBundle is more convenient. - Perhaps in the future all asset/content systems will be consolidated. - - - - - Are name or path null or empty? - - - - - Are both name and path non-null and non-empty? - - - - - Name of master bundle file. - - - - - Path to Unity asset within asset bundle. - - - - - Find client with given RPC channel ID. - - - - - Workshop item does not have any IP restrictions in place. - - - - - Workshop item has an IP whitelist, and server IP is not on it. - - - - - Workshop item has an IP blacklist, and server IP is on it. - - - - - Workshop item does have IP restrictions, and server IP is allowed. - - - - - Workshop item has been banned by an admin. - - - - - Workshop item is hidden from everyone. - - - - - Utilities for testing whether a particular server is allowed to download a workshop item. - Available from client and server side so that clients can help enforce restrictions. - - - - - Workshop item key-value tag storing IP whitelist and blacklist. - - - - - Get ip restrictions value if set, otherwise null. - Can be called from client or server. - - - - - Test whether IP is whitelisted or blacklisted in filter. - - - - - Split x,y-z format into whitelist [x, y] and blacklist [z]. - - - - - Split whitelist-blacklist format and parse string IPs into integer IPs. - - - - - Parse CIDR string IPs into integer IPs. - - - - - Added to player's food value. - - - - - Added to player's water value. - - - - - Added to player's virus value. - - - - - Added to player's hallucination value. - - - - - Get animal or player damage based on game mode config. - - - - - Get zombie or player damage based on game mode config. - - - - - Should player/animal/zombie surface be nulled on hit? - Requested by spyjack for a chainsaw-style shield that was overboard with the blood. - - - - - Should this weapon bypass the DamageTool.allowedToDamagePlayer test? - Used by weapons that heal players in PvE. - - - - - Please refer to ItemWeaponAsset.BuildDescription for an explanation of why this is necessary. - - - - - Please refer to ItemWeaponAsset.BuildDescription for an explanation of why this is necessary. - - - - - Utility for getting local hardware ID. - - One option for future improvement would be using Windows Management Infrastructure (WMI) API: - https://github.com/SmartlyDressedGames/Unturned-3.x/issues/1593 - - - - - Maximum number of HWIDs before server will reject connection request. - - - - - Get the local hardware ID(s). - - - - - Nelson 2025-05-28: keeping this a struct to simplify memory management (no pool needed). If making this more - generic in the future we probably do need to make it a class. - - - - - Only applicable to barricades. - - - - - Preliminary sort order is provided by server, but this takes priority if camera is available. - - - - - Not ideal, but there was a problem because onLevelLoaded was not resetting these after disconnecting. - - - - - Instantiate at least this many items per frame even if we exceed our time budget. - - - - - Called once key/values can be set. - - - - - Lod group will be culled when screen size is smaller than this value. - - - - - Clamp the culling screen percentage to be less than or equal to a maximum value. - - - - - Prevent the lowest LOD from being culled. - - - - - Multiplier to incoming damage. Defaults to 1.0. - - - - - Multiplier to explosive damage. Defaults to value if Armor_Explosion isn't specified. - - - - - Armor against falling damage. Defaults to 1.0, i.e., take the normal amount of damage. - - - - - If true on any worn clothing item, bones never break when falling. - Defaults to false. - - - - - Left-handed character skeleton is mirrored, so most item models are mirrored again to preserve appearance. - Unfortunately this does not work well for some items e.g. the particle system on Elver/Dango glasses. - - - - - Sound to play when equipped. - - - - - If set, find a child meshrenderer with this name and change its material to the character skin material. - - - - - The player can be wearing both a "real" in-game item and a cosmetic item in the same clothing slot. - If true, the real item is shown rather than the cosmetic item. For example, night vision goggles - are shown over any glasses cosmetic because of their gameplay-related green glow. - - - - - Overrides value of TakesPriorityOverCosmetic if is true. - - - - - If true, the value of is used rather than . - Defaults to false. True if is set. - - - - - For 3D clothes. Ideally, this wouldn't be type specific, but we have a separate prefab property for each - type of clothing at the moment. - - - - - The player can be wearing both a "real" in-game item and a cosmetic item in the same clothing slot. - This is called on the real item if has not been set. - If true, the real item is shown rather than the cosmetic item. If false, the cosmetic item can be seen. - - - - - Durstenfeld version of Fisher-Yates shuffle: - https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm - - - - - Same as above, but prevent the last clip from being shuffled to the front in order to prevent repeats. - - - - - Ensures we do not modify the asset in editor. - - - - - Optional case-sensitive identifier in list of blueprints. - Added as an alternative to referencing blueprints by index. - Defaults to null. - - - - - Index into Owner's blueprints list. - - - - - Operation replaces the special behavior for EBlueprintType.Ammo and EBlueprintType.Repair. - - - - - Note: if resolving ref please use GetCategoryTag instead for caching. - - - - - Category tag replaces the blueprint "Type" which acted as both category AND behaviour modifier. - - - - - Only applicable for operations with a target item. - - Nelson 2025-04-11: initially, this was implemented as the last item in supplies list. However, there are a - lot of checks for special handling of target item, so I think it makes sense to separate. - - - - - If not null, these tags must be provided by nearby objects to craft this blueprint. - Note: this is the list as-configured. It has not been filtered according to gameplay config. - - - - - If true, and transferState is enabled, delete attached items. - - - - - Must match conditions to craft. - - - - - Extra rewards given after crafting. Not displayed. - - - - - 2023-05-27: requested by Renaxon because some Arid blueprints are debug-only and - should not be visible when players search by name. (the 3.23.7.0 update made - non-craftable blueprints searchable for Buak) - - - - - Defaults to false. If true, blueprint can become visible in the crafting list even when NPC conditions - are not met. This should typically only be enabled if all conditions are configured to be visible in the - details panel. Otherwise, the default "conditions unmet" label isn't very informative for players. - - - - - Search output items (excluding target item) for specific item. - - - - - App version string packed into a 32-bit number for replication. - - - - - Path to directory containing "Editor", "Menu", "Player", "Curse_Words.txt", etc files. - - - - - Called clientside by BattlEye when it needs us to send a packet to the server. - - - - - Event for plugins when BattlEye wants to kick a player. - - - - - Called serverside by BattlEye when it needs us to send a packet to a player. - - - - - Call whenever something impacting rich presence changes for example loading a server or changing lobbies. - - - - - Only used on client. - Information about current game server retrieved through Steam's "A2S" query system. - Available when joining using the Steam server list API (in-game server browser) - or querying the Server's A2S port directly (connect by IP menu), but not when - joining by Steam ID. - - - - - On client, is current server protected by VAC? - Set after initial response is received. - - - - - On client, is current server protected by BattlEye? - Set after initial response is received. - - - - - Counts "bad" packets per-connection. Bad packets *may* be legitimate, for example a delayed burst of ping - requests. Beyond a certain point, however, it's likely a cheater is trying to waste server processing time. - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - After client submits EServerMessage.Authenticate we are waiting - for the EClientMessage.Accepted response. - - - - - Realtime that client sent EServerMessage.Authenticate request. - - - - - File IDs the client thinks the server advertised it was using, or null if UGC response was pending. - Prevents the server from advertising a smaller or fake list of items. - - - - - Needed before loading level. - - - - - Only safe to use serverside. - Get the list of workshop ids that a client needs to download when joining. - - - - - Only safe to use serverside. - Lets clients know that this workshop id is being used on the server, and that they need to download it when joining. - - - - - Channel id was 32-bits, but now that it is in the RPC header it can be 8-bits since there never that many - players online. The "manager" components are on channel 1, and each player has a channel. - - - - - Should the network transport layer accept incoming connections? - If both the queue and connected slots are full then incoming connections are ignored. - - - - - includeQueuedPlayers ensures player won't be kicked because someone on the same IP joined after them. - - - - - Find player in the queue associated with a client connection. - - - - - Find player associated with a client connection. - - - - - Find net transport layer connection associated with a client steam id. This could be a pending player in the - queue, or a fully connected player. - - - - - Find player steam id associated with connection, otherwise nil if not found. - - - - - If there's space on the server, asks player at front of queue for their verification to begin playing. - - - - - Called when determining spawnpoint during player login. - - - - - Is client waiting for response to ESteamPacket.CONNECT request? - - - - - Realtime that client sent ESteamPacket.CONNECT request. - - - - - Nelson 2023-08-09: adding because in some cases, namely workshop download and level loading, - we can't properly handle client transport failures because these loading systems don't - currently support cancelling partway through. (public issue #4036) - - - - - Manages client to server communication. - - - - - Manages server to client communication. - - - - - Connect to server entry point on client. - Requests workshop details for download prior to loading level. - Once workshop is ready launch() is called. - - - - - Callback once client transport is ready to send messages. - - - - - Callback when something goes wrong and client must disconnect. - - - - - Multiplayer load level entry point on client. - Called once workshop downloads are finished, or we know the server is not using workshop. - Once level is loaded the connect packet is sent to the server. - - - - - Event for plugins prior to kicking players during shutdown. - - - - - Set on the server when initializing Steam API. - Used to notify pending clients whether VAC is active. - Set on clients after initial response is received. - - - - - Set on the server when initializing BattlEye API. - Used to notify pending clients whether BE is active. - Set on clients after initial response is received. - - - - - Client should call RequestDisconnect instead to ensure all disconnects have a logged reason. - - - - - Internet server callback when backend is ready. - - - - - If missing map is a curated map then log information about how to install it. - - - - - Was not able to find documentation for this unfortunately, - but it seems the max length is 127 characters as of 2022-09-12. - - - - - Set key/value tags on Steam server advertisement so that client can display text in browser. - - - - - Set key/value tags on Steam server advertisement so that client can display server config in browser. - - - - - Primarily kept for backwards compatibility with plugins. Some RPCs that reply to sender also use this but - should be tidied up. - - - - - Hack to deal with the oversight of reordering the ESteamPacket enum during net messaging rewrite causing - older plugins to send wrong packet type. - - - - - Send to a connected client. - - - - - The server ignores workshop info requests if it's been less than 30 seconds, - so we cache that info for 1 minute in-case we try to connect again right away. - - - - - This information is needed before the level is loaded. - - - - - Advertised server name. e.g., "Nelson's Unturned Server" - - - - - Name of map to load. - - - - - Legacy difficulty mode that should be removed eventually. - - - - - Perspective settings. - - - - - Server's IP from when we originally received response. - Used to test download restrictions. - - - - - Last realtime this cache was updated. - - - - - Hacked-together initial implementation to refuse network messages from specific players. - On PC some cheats send garbage packets in which case those clients should be blocked. - - - - - Close connection, and refuse all future connection attempts from a remote player. - Used when garbage messages are received from hacked clients to avoid wasting time on them. - - - - - Record that a bad packet was received from connection and maybe kick them if rate limit is exceeded. - - - - - Private to prevent plugins from changing the value. - - - - - Should buffers used by plugin network events be read-only copies? - - - - - First four bytes of RPC messages are the channel id. - - - - - Should players be allowed to join this server regardless of whether their version number matches ours? - Useful to allow players to join debug mode servers. - - - - - Is version number supplied by client compatible with us? - - - - - Notify players waiting to join server if their position in the queue has changed. - - - - - Prevent any particular client from delaying the server connection queue process. - - - - - Allows hosting providers to limit the configurable max players value from the command-line. - - - - - Deprecated-ish IPv4 to bind listen socket to. Set by bind command. - - - - - Local address to bind listen socket to. Set by bind command. - - - - - Steam query port. - - - - - If hosting a server, get the game traffic port. - - - - - Called while running - - - - - Used to build packet about each existing player for new player, and then once to build a packet - for existing players about the new player. Note that in this second case forPlayer is null - because the packet is re-used. - - - - - Not exactly ideal, but this a few old "once per player" client->server RPCs. - - - - - Event for plugins when rejecting a player. - - - - - Notify client that they were kicked. - - - - - Notify client that they were banned. - - - - - Player left server by canceling their ticket, or we are disconnecting them without telling them. - Does not send any packets to the disconnecting player. - - - - - Number of transport connection failures on this frame. - - - - - Callback when a pending player or existing player unexpectedly loses connection at the transport level. - - - - - Check whether a server is one of our favorites or not. - - - - - Set whether a server is one of our favorites or not. - - - - - Open URL in the steam overlay, or if disabled use the default browser instead. - Warning: any third party url should be checked by WebUtils.ParseThirdPartyUrl. - - - - - Steam's favorites list requires that we know the server's IPv4 address and port, - so we can't favorite when joining by Steam ID. - - - - - Toggle whether we've favorited the server we're currently playing on. - - - - - Toggle whether we've bookmarked the server we're currently playing on. - - - - - Ping from client to server, measured in milliseconds. - - - - - Number of seconds since January 1st, 1970 GMT as reported by backend servers. - - - - - Current UTC as reported by backend servers. - Used by holiday events to keep timing somewhat synced between players. - - - - - Has the initial backend realtime been queried yet? - Not available immediately on servers because SteamGameServerUtils cannot be used until the actual Steam instance is available. - - - - - Invoked after backend realtime becomes available. - - - - - In here because we want to call this very early in startup after initializing provider, - but with plenty of time to hopefully install maps prior to reaching the main menu. - - - - - This file is of particular importance to the dedicated server because otherwise Steam networking sockets - will say the certificate is for the wrong app. When launching the game outside Steam this sets the app. - - - - - Hackily exposed as an easy way for editor code to check the verison number. - - - - - Has the onApplicationQuitting callback been invoked? - - - - - Moved from OnApplicationQuit when that was deprecated. - - - - - Useful to load files from Steam install of the game while running in the editor. - - - - - Moved from OnApplicationQuit when Application.CancelQuit was deprecated. - - - - - A couple of players have reported the PRO_DESYNC kick because their client thinks they own the gold upgrade, - but the Steam backend thinks otherwise. This option is a bit of a hack to work around the problem for them. - - - - - If specified, all Steam achievements and stats progress is lost. - - - - - If specified, all Steam achievements are unlocked during startup. - - - - - Host has not specified a value. - - - - - Not an actual tag. Used for filtering. - - - - - Host has specified that the server does not sell anything for real money. - - - - - Host has specified that the server does have a real money shop, but does not sell anything which affects gameplay. - - - - - Host has specified that the server does have a real money shop which sells benefits that affect gameplay. - - - - - Server list filter for plugin usage. - - - - - Allows Unity events to send text chat messages from the client, for example to execute commands. - - - - - Text to use when SendDefaultTextChatMessage is invoked. - - - - - All players on the server will see the message. - - - - - Only nearby players will see the message. - - - - - Chat mode to send request in. - - - - - Corresponds to not active and not blending with new weather system. - - - - - Corresponds to transitioning in with new weather system. - - - - - Corresponds to active with new weather system. - - - - - Corresponds to transitioning out with new weather system. - - - - - Corresponds to not active and not blending with new weather system. - - - - - Corresponds to transitioning in with new weather system. - - - - - Corresponds to active with new weather system. - - - - - Corresponds to transitioning out with new weather system. - - - - - Kept for backwards compatibility with mod hooks, plugins, and events. - - - - - Kept for backwards compatibility with mod hooks, plugins, and events. - - - - - [0, 1] used to avoid invoking BlendAlphaChanged every frame. - Compared against globalBlendAlpha not taking into account local volume. - - - - - Hash of lighting config. - Prevents using the level editor to make night time look like day. - - - - - Level designed target fog color. - - - - - Level designed target fog intensity. - - - - - Level designed target atmospheric fog intensity. - - - - - If global ocean plane is enabled then return the worldspace height, - otherwise return the optional default value. Default for volume based - water is -1024, but atmosphere measure uses a default of zero. - - - - - Ticked on dedicated server as well as client so that server can listen for weather events. - - On dedicated server this is always 0xFFFFFFFF. - - - - Reset any global shader properties that may affect the main menu. - - - - - Source effect to group multiple volumes. - - - - - Audio source added to AmbianceAudioGameObject. - - - - - Reset to false before updating volumes. - - - - - Reset to false before updating volumes. - - - - - Reset to zero before updating volumes. If any volume uses distance fadeout, this is the maximum alpha. - - - - - If any volume doesn't use distance fadeout, this is the alpha based on time spent inside.. - - - - - Highest priority of overlapping volumes. - - - - - If any volume doesn't use distance fadeout, this is the minimum of their audio fade-in time. - - - - - If any volume doesn't use distance fadeout, this is the minimum of their audio fade-out time. - Only reset when created so that value is available after leaving all volumes. - - - - - Visualizes reverb zone in-game. - - - - - Can horde beacons be placed in the associated bounds? - - - - - Overrides vehicle physics values in bulk without building asset bundles. - - - - - Only RPCs from the server will be allowed to invoke this method. - - - - - RPCs are only allowed to invoke this method if we're running as server. - - - - - Only RPCs from the owner of the object will be allowed to invoke this method. - - - - - Maximum number of calls per-second per-player. - - - - - Minimum seconds between calls per-player. - Initialized from ratelimitHz when gathering RPCs. - - - - - Index into per-connection rate limiting array. - - - - - Backwards compatibility for older invoke by name code e.g. plugins. - - - - - If changing header size remember to update PlayerManager and allocPlayerChannelId. - - - - - How far to shift compressed voice data. - - - - - If true, this object is owned by a locally-controlled player. - For example, some code is not run for "remote" players. - Always true in singleplayer. Always false on dedicated server. - - - - - Use on server when invoking client methods on the owning player. - - - - - Replacement for ESteamCall.NOT_OWNER. - - - - - Don't use this. Originally added so that Rocketmod didn't have to inject into the game's assembly. - - - - True if the call succeeded, or false if the sender should be refused. - - - - Don't use this. Originally added so that Rocketmod didn't have to inject into the game's assembly. - - - - - Calls array needs rebuilding the next time it is used. - Should be invoked when adding/removing components with RPCs. - - - - - Does array of RPCs need to be rebuilt? - - - - - Find methods with SteamCall attribute, and gather them into an array. - - - - - Encode byte array of voice data to send. - - - - - Decode voice parameters from byte array. - - - - - If true, light contributes to player spotlight. Defaults to true. - - Can be set to false for modders with a custom light setup. For example, this was added - for a modder who is using melee lights to toggle a lightsaber-style glow. - - - - - 32-bit mask granting server plugins additional control over custom UIs. - Only replicated to owner. - - - - - Enables cursor movement while not in a vanilla menu. - - - - - Disable background blur regardless of other UI state. - - - - - Enable background blur regardless of other UI state. - Takes precedence over NoBlur. - - - - - Enable title card while focusing a nearby player. - - - - - Enable explanation and respawn buttons while dead. - - - - - Enable health meter in the HUD. - - - - - Enable food meter in the HUD. - - - - - Enable water meter in the HUD. - - - - - Enable virus/radiation/infection meter in the HUD. - - - - - Enable stamina meter in the HUD. - - - - - Enable oxygen meter in the HUD. - - - - - Enable icons for bleeding, broken bones, temperature, starving, dehydrating, infected, drowning, full moon, - safezone, and arrested status. - - - - - Enable UseableGun ammo and firemode in the HUD. - - - - - Enable vehicle fuel, speed, health, battery charge, and locked status in the HUD. - - - - - Enable center dot when guns are not equipped. - - - - - Enable popup when in-game rep is increased/decreased. - - - - - Default flags set when player spawns. - - - - - 32-bit mask indicating to the server which admin powers are being used. - Does not control which admin powers are available. - - - - - Player is using spectator camera. - - - - - Player is using barricade/structure transform tools. - - - - - Player is using overlay showing player names and positions. - - - - - Per-player event invoked when admin usage flags change. - - - - - Event invoked when any player's admin usage flags change. - - - - - Used by plugins. - - - - - Invoked on client when a plugin changes the widget flags. - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - Not rate limited because server tracks number of expected screenshots. - - - - - Request client to open a given URL. - Allows plugins to open web browser, but also gives client the chance to ignore it. - - - - - Tell client to join a specific server. - Disconnects client and sends them to the join server screen. - Only used by plugins. - - - - - Is this player currently in a plugin's modal dialog? - Enables cursor movement while not in a vanilla menu. - - - - - Tell the client whether to be in plugin modal mode or not. - Kept from prior to introduction of pluginWidgetFlags. - - - - - Which admin powers are currently in use by the client. - Reported to the server by the client. - Does not control which admin powers are available. - Note: Hacks can prevent this notification from being sent. - - - - - Called on the client to notify the server of admin usage changes (if any). - - - - - Called on the client to notify the server of admin usage changes (if any). - - - - - Teleport to a random player spawn designated in the level. - - - - - Teleport to bed, if player has set one. - - - - - How many calls to will succeed per second. - - - - - How many rate limited actions have been performed recently. - Increased after performing each rate limited action, and decreased over time. - Cannot perform actions when greater than one. - - - - - Note: new official code should be using per-method rate limit attribute. - This is kept for backwards compatibility with plugins however. - - Call this method before any requests the client can spam to the server. - - Should your code proceed with the rate limited action? - - - - Call every frame to cool down rate limiting. - - - - - This code was in the Start message, and should happen before other initialization. - - - - - Hacky replacement for Start() that runs after net ids are assigned but before sending player state. - - - - - Nelson 2024-11-11: Added to help narrow down if player is destroyed outside of Provider.removePlayer. - (public issue #4760) - - - - - Flag in case levelObject is destroyed. - - - - - Poorly named. Specific to InteractableObjectQuest. - - - - - Directly uses input string for custom message popups. - - - - - Player cannot build on a vehicle with occupied seats. - - - - - Horde beacon cannot be built here. - - - - - Item type is not allowed on vehicles. - - - - - Item must be placed closer to vehicle hull. - - - - - Player cannot build while seated in a vehicle because some vehicles are abusable to stick the camera through a wall. - - - - - Interacting with ladder. - - - - - Popup when equipping housing planner "press T to show items" - - - - - Popup when structure is blocked by something named we can format into the message. - - - - - Notice that freeform buildables are blocked by Allow_Freeform_Buildables. - - - - - Popup when structure is blocked by terrain. - - - - - Vehicle doesn't support spray paints. - - - - - Explaining that some blueprints require workstations. - - - - - Nelson 2024-11-29: Curious to put all the gun stats in one place for easier comparison. Rather rudimentary at - the moment so not including in the update. - - - - - Controls how first-person arms are moved for turrets operated from the driver's seat. - - - - - Default. Pushes first-person arms off-screen while aiming. Originally implemented for the Fighter Jet where - it looks weird if your arms are still visible when the camera zooms in while "aiming." - - - - - Push first-person arms off-screen when equipped. - - - - - No particular use in mind, but included for completeness. - - - - - Default. Plays "Hammer" animation if ammo count was zero. - - - - - Regardless of ammo, does not play "Hammer" animation after reloading. - - - - - Regardless of ammo, will play "Hammer" animation after reloading. - - - - - Sound to play when input is pressed but weapon has a fire delay. - - - - - Maximum distance the gunshot can be heard. - - - - - Override Rangefinder attachment's maximum range. - Defaults to range value. - - - - - Can this weapon instantly kill players by headshots? - Only valid when game config also enables this. - - - - - Can this weapon be fired without consuming ammo? - Some mods use this for turrets. - - - - - Ammo quantity to consume per shot fired. - - - - - Simulation steps to wait after input before firing. - - - - - Can magazine be changed by player? - - - - - Can player ADS while sprinting and vice versa? - - - - - If true, the gun cannot shoot unless the player is aiming. - Note: String action overrides this. - Defaults to true for miniguns. - - - - - If true, the gun will stop aiming regardless of player input. - - - - - Seconds from pressing "aim" to fully aiming down sights. - - - - - If true, Aim_Start and Aim_Stop animations are scaled according to actual aim duration. - - - - - Selects a default magazine, following magazine replacements and spawn table resolution. - - - - - Selects a default magazine, following magazine replacements and spawn table resolution. - - - - - How long in seconds after firing to rechamber the gun by playing the Hammer animation. - Only applicable if RechamberAfterShotCount is >0. - Defaults to 0.25 seconds. - - - - - How long in seconds after hammering to eject a bullet casing. - Defaults to 0.45 seconds. - - - - - How long in seconds after reloading to eject bullet casings. - Only applicable if CasingEjectCountAfterReload is greater than zero. - Defaults to 0.5 seconds. - - - - - Defaults to false. If true, attachments must specify at least one non-zero caliber. - Requested by Great Hero J to block vanilla attachments in VGR. - - - - - Determines whether "Hammer" animation plays after attaching a magazine. - Note: this happens when a magazine replaces another OR fills previously empty slot. - - - - - Determines whether "Hammer" animation plays after detached a magazine. - Note: this happens when a magazine is removed from the gun without a replacement. - - - - - Spread multiplier while sprinting. - - - - - Spread multiplier while crouched. - - - - - Spread multiplier while prone. - - - - - Spread multiplier while swimming. - - - - - Spread multiplier while not grounded. - - - - - Recoil magnitude multiplier while the gun is aiming down sights. - - - - - Recoil magnitude while sprinting. - - - - - Recoil magnitude while crouched. - - - - - Recoil magnitude while prone. - - - - - Recoil magnitude while swimming. - - - - - Recoil magnitude while not grounded. - - - - - [0, 1] percentage of maximum range where damage begins decreasing toward falloff multiplier. - - - - - [0, 1] percentage of maximum range where damage finishes decreasing toward falloff multiplier. - - - - - [0, 1] percentage of damage to apply at damageFalloffMaxRange. - - - - - Seconds before physics projectile is destroyed. - - - - - Is this gun setup to have a change of jamming? - - - - - [0, 1] quality percentage that jamming will start happening. - - - - - [0, 1] percentage of the time that shots will jam the gun when at 0% quality. - Chance of jamming is blended between 0% at jamQualityThreshold and jamMaxChance% at 0% quality. - - - - - Name of the animation to play when unjamming chamber. - - - - - Movement speed multiplier while the gun is aiming down sights. - - - - - If >0, hammer animation plays after shooting this many shots after RechamberAfterShotDelay seconds pass. - Defaults to one for EAction.Pump and EAction.Bolt, zero otherwise. - - - - - If >0, emit particles after hammer after EjectAfterHammerDelay seconds pass. - Only applicable if RechamberAfterShotCount is >0. - Defaults to 1. - - - - - If >0, emit particles after reloading after EjectAfterReloadDelay seconds pass. - Defaults to ammoMax for EAction.Break. - - - - - Please refer to . - - - - - Please refer to . - - - - - The dialogue to go to when a message has no available responses. - If this is not specified the previous dialogue is used as a default. - If neither is available then a default "goodbye" response is added. - - For example, Chief_Police_Doughnuts_Accepted dialogue has a single message - "Let's just keep this between the two of us." shown with "prev" dialogue - set to the NPC's root dialogue asset. - - - - True if primary action was started and stopPrimary should be called in the future. - Useful to allow input to be held until action executes. - - - True if secondary action was started and stopSecondary should be called in the future. - Useful to allow input to be held until action executes. - - - - Does useable have a menu open? - If so pause menu, dashboard, and other menus cannot be opened. - - - - - Common base for barricades and structures. - 2023-01-16: not ideal to be adding this so late in development, but at least it is a step in the right direction. - - - - - If true, this item is eligible for zombies to detect and attack when stuck. - Defaults to true. - - - - - Item or spawn table recovered when picked up below 100% health. - - - - - Minimum number of items to recover when salvaged. - - - - - Maximum number of items to recover when salvaged. - - - - - Minimum number of items to drop when destroyed. - - - - - Maximum number of items to drop when destroyed. - - - - - Item or spawn table dropped when destroyed. - - - - - If non-null, this asset provides the listed crafting tags to nearby players. - - - - - Note: this assumes SalvageItemRef points to an ItemAsset. - - - - - By default a crafting ingredient is salvaged. - - - - - Thanks to Glenn Fiedler for this RK4 implementation article: - https://gafferongames.com/post/integration_basics/ - - - - - Higher values return to the target position faster. - - - - - Higher values reduce bounciness and settle at the target position faster. - e.g. a value of zero will bounce back and forth for a long time (indefinitely?) - - - - - Nelson 2025-04-09: this acted as both category AND behaviour modifier, so I'm separating it into a custom tag - for categorization and a property for overriding how the blueprint processes input items. - - Nelson 2025-04-10: repair and ammo "types" had a variety of quirks I wanted to sort out: - • Moving amount between items required ammo type blueprint, but some modders expressed interest in non-ammo use. - (I.e., ideally better supporting amount on non-ammo items going forward.) - • Both types ignored output items. Output was used to represent the target item. Similarly, the UI added a fake - extra input item representing target item. - • PlayerCrafting and PlayerDashboardCraftingUI re-implemented some crafting item searching logic for finding - the item to refill or repair that can be converted into input item parameters. - The plan at the moment is to make the last input item the "target" item for operations. Legacy ammo/repair - blueprints will then default to no output item and add an extra input item. (And add a variety of parameters - needed to replicate the specialized item search behaviour.) - - - - - Controls what blueprint does with input items. - Separated from EBlueprintType which acted as both category AND operation. - - - - - No special modification to input items. - - - - - Restore target input item to full quality. - - - - - Transfer amount from input items to target item. - - - - - Can be added to any GameObject with a Dropper, Note, or Quest interactable object in its parents. - - - - - Invoked on authority when interactable object is used successfully. - Only invoked on clients if ShouldReplicate is true. - - - - - If true, the server will replicate the OnUsed event to clients as well. - - - - - If ShouldReplicate is enabled, should the RPC be called in reliable mode? - Unreliable might not be received by clients. - - - - - Applied if greater than zero. Defaults to 128. - - - - True if it's a new claim flag. - - - - Player stealth radius cannot go below this value. - - - - - Deal damage and break legs if speed is greater than this value. - - - - - By default players in singleplayer and admins in multiplayer have a faster salvage time. - This option was requested for maps with entirely custom balanced salvage times. - - - - - Cached result of finding all craftingBlacklists. - - - - - Determines which weather can naturally occur in this level. - Null if empty. - - - - - If set, this weather will always be active and scheduled weather is disabled. - - - - - Audio clip to play in 2D when a player dies. - - - - - Defaults to false because some servers have rules and info on the loading screen. - - - - - Volume weather mask used while not inside an ambience volume. - - - - - Allows level to override skill max levels. - Null if empty, otherwise matches 1:1 with PlayerSkills._skills. - - - - - If false, clouds are removed from the skybox. - - - - - Players are kicked from multiplayer if their skin color is within threshold of any of these rules. - - - - - Optional Unturned extensions to the LOD Group component. - - - - - Could be extended, e.g. to clamp cull size separately from the per-LOD sizes. - - - - - Unturned will adjust per-LOD sizes to counteract LOD bias. - Elver has carefully tuned LOD sizes for the interior of the mall, so LOD bias affecting them is undesirable. - Note that due to a Unity bug only LOD0 can be greater than 100%. - - - - - Is player already waiting to exit their group? - - - - - Add player to exit queue if enabled, or immediately remove. - - - - - Remove player from queue if they're waiting to exit their group. - - - - - Invoked immediately before Destroy vehicle. - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - If true, a vehicle asset has been replaced. - - - - - Find vehicle with matching replicated instance ID. - - - - - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. - - - - - Supports redirects by VehicleRedirectorAsset. If paintColor is set that takes priority, otherwise if - redirector's SpawnPaintColor is set, that color is used, - - - - - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. - - - - - Supports redirects by VehicleRedirectorAsset. If paintColor is set that takes priority, otherwise if - redirector's SpawnPaintColor is set, that color is used, - - - - - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. - - - - - Supports redirects by VehicleRedirectorAsset. If paintColor is set that takes priority, otherwise if - redirector's SpawnPaintColor is set, that color is used, - - - - - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. - - - - - Supports redirects by VehicleRedirectorAsset. If paintColor is set that takes priority, otherwise if - redirector's SpawnPaintColor is set, that color is used, - - - - - Added so that garage plugins do not need to invoke RPC manually. - - zero spawns without a battery, ushort.MaxValue indicates the battery should be randomly spawned according to asset configuration, other values force a battery to spawn. - - - - For backwards compatibility. This older method spawns a vehicle with a random paint color. (set paintColor - to zero for a random paint color) - - zero spawns without a battery, ushort.MaxValue indicates the battery should be randomly spawned according to asset configuration, other values force a battery to spawn. - - - - Used by external spawn vehicle methods. - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used, - unless preferredColor.a is byte.MaxValue. - - Owner to lock vehicle for by default. Used to lock vehicles to the player who purchased them. - - - - Client-side request server to toggle headlights. - - - - - As client request server to use bonus feature like towing hook or police sirens. - - - - - Helper for servers with huge numbers of vehicles. - Called with fixed span of indexes e.g. [0, 10), then [10, 20). This function then clamps the final span to the vehicle count. - - - - - Does as few tests as possible while maintaining base game expectations. - - - - - Force remove player from vehicle they were in, if any. - Called when player disconnects to tidy up and run callbacks. - - True if player was in a vehicle, false otherwise. - - - - Remove player from vehicle and teleport them to an unchecked destination. - - - - - Is spawnpoint open for vehicle? - - - - - Try to find a random spawnpoint to spawn a vehicle while server is running. - - - - - Add a new vehicle at given spawnpoint. - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. - - - - - Add a new vehicle at given spawnpoint and replicate to clients. - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. - - - - - Called when deciding whether to respawn a new vehicle, after gameplay has begun. - - - - - Called during level load to determine how many vehicles to create. - - - - - Called on server each frame to slowly damage abandoned vehicle. - - - - - +0 = InteractableVehicle - +1 = root transform - +X = VehicleBarricadeRegion - Asset does not know number of train cars, so we always reserve slack. - - - - - Speed is unsigned, so 8 bits allows a range of [0, 256). - - - - - Velocity is signed, so 9 bits allows a range of [-256, 256). - - - - - Cast a ray from the sky to find highest point. - - - - - Cast a ray from slightly above point so indoor teleport nodes work. - - - - - If set, we are responsible for destroying texture. - - - - - This is a bit of a hack in order to simplify the foliage menu when most of the time editors are either - manually placing foliage or automatically baking it. - - - - - Get brush strength multiplier where strength decreases past falloff. Use this method so that different falloffs e.g. linear, curved can be added. - - Percentage of . - - - - Allows foreach loop to iterate Vector2Int within RegionBoundsInt. - - - - - Kept because lots of modders have been using this script in Unity, - so removing legacy effect id would break their content. - - - - - Hack for modders using grenade component as a way to deal radial damage. Not a good long term solution but - widely requested for the meantime until I get the chance to rewrite some of the health stuff. - - - - - Thanks to Glenn Fiedler for this RK4 implementation article: - https://gafferongames.com/post/integration_basics/ - - - - - Higher values return to the target position faster. - - - - - Higher values reduce bounciness and settle at the target position faster. - e.g. a value of zero will bounce back and forth for a long time (indefinitely?) - - - - - At low framerate deltaTime can be so high the spring explodes unless we use a fixed timestep. - - - - - Interactable storage barricade to spawn at the drop position. - - - - - Prefab to spawn falling from the aircraft. - - - - - Initially these were structs so that they would be adjacent in memory and therefore faster to iterate lots of them, - but making them classes lets them reference each other which significantly simplifies finding adjactent housing parts. - - - - - Item along positive direction. - Can be multiple on existing saves or if players found an exploit. - - - - - Item along negative direction. - Can be multiple on existing saves or if players found an exploit. - - - - - Item between floors. - Can be multiple on existing saves or if players found an exploit. - - - - - Is there a wall in this slot, and is it full height (not rampart)? - - - - - This check prevents placing roof onto the upper edge of a rampart because ramparts - create an edge at full wall height even though they are short. - - Ideally in the future wall height will become configurable and remove - the need for this check. - - See public issue #3590. - - - - - Position at the base of the pillar. - - - - - Yaw if placing pillar at this vertex. - - - - - Pillar or post currently occupying this slot. - Can be multiple on existing saves or if players found an exploit. - - - - - Can be zero if pillar is floating, or up to six in the center of a triangular circle. - - - - - Is there a pillar in this slot, and is it full height (not post)? - - - - - Floors must be placed touching the terrain, or a fake-terrain object like a grassy cliff model. - - - - - Pillars can be partly underground or inside a designated allowed underground area. Otherwise, - if the very top of the pillar is underground placement is blocked. (public issue #4250) - - - - - Side length of square and triangular floor/roof. - Walls can be slightly less, but we treat them as if they are the full length. - - - - - Vertical distance from edge center to wall pivot. - - - - - Vertical distance from edge center to rampart pivot. - - - - - If position is nearly equal within this threshold then edges/vertices will connect. - - - - - Maximum distance from player's viewpoint to allow placement. - - - - - How far to search for empty slot best match. - - - - - Cosine of the angle between ray direction and direction toward slot must be greater than this. - - - - - When validating item placement expand physics overlap this much. - Useful to ensure slightly-touching overlaps (e.g. pillar touching the pillar above) are handled properly. - - - - - Ensure players, vehicles, zombies, animals, etc are not within this distance of pending placement. - - - - - Distance from triangle pivot to apex of triangle. - - - - - Radius of circle within triangle edges. - - - - - Distance from triangle pivot to center of triangle. - - - - - Small threshold to allow placing even with existing barricades on the floor. - - - - - House overlap is approximately the same size as the housing item's collider(s), and is intended to check whether - any pre-existing barricades or structural items are in the way. For example whether a wall cannot be placed because - there is a storage crate in the way, or if a foundation is blocked by another slightly rotated foundation. - - - - - Character overlap is slightly larger than the house overlap, and checks whether any players, vehicles, animals, zombies, etc - are nearby. This is necessary because when house and characters were combined in a single physics query it was possible to - stand *just* close enough to step into the collider as it was spawned. - - - - - Called when a housing item is spawned or after moving an existing item. - - - - - Called before a housing item is destroyed or before moving a housing item. - - - - - Search grid for existing vertex at approximately equal position. - Considers adjacent grid cells if near cell boundary to avoid issues with floating point inaccuracy. - - - - - Search grid for existing edge at approximately equal position. - Considers adjacent grid cells if near cell boundary to avoid issues with floating point inaccuracy. - - - - - Find existing edge and add connection, or add new empty edge. - - - - - Find existing vertex and add connection, or add new empty vertex. - - - - - Find existing edge and set associated wall, or add an empty edge at wall's location. - - - - - Find slot occupied by wall and remove if no longer attached to anything. - - - - - Find existing vertex and set associated pillar, or add an empty vertex at pillar's location. - - - - - Find slot occupied by pillar and remove if no longer attached to anything. - - - - - Hack to prevent ignoring floor which might be overlapping pending floor placement. - For example when placing a square floor on the opposite edge of a spot which has a triangular floor - we do not want to ignore the triangular floor during the physics query. - - - - - Used by triangular floor and roof validation to test for collisions. - - - - - Ensure wall fits in an empty slot. - - - - - Ensure pillar fits in an empty slot. - - - - - Nelson 2024-06-26: With structure rotation replicated as a quaternion we need to be smarter about extracting - yaw from model transform. Quaternion.eulerAngles.y isn't necessarily the yaw anymore. - - - - - Working buffer for placement overlap tests. - - - - - Index of the context parameter, if not None. - - - - - Reflected attribute that was used to find this method. - Contains extra information about how to call it. - - - - - True once per frame, false otherwise. - - - - - Item ID of barricade to spawn after landing. - - - - - Barricade to spawn after landing. - - - - - Cargo spawn table legacy ID. - - - - - Kill any players inside the spawned interactable box. - Uses hardcoded size of 4 x 4 x 4. - - - - - Determines how to handle a server if it matches a rule. - - - - - Apply label and continue processing rules. - - - - - Show the server in the list. - - - - - Hide the server from the list. - - - - - Note: Port (if set) refers to the Steam query port. - - - - - If true, negate whether this rule matches. i.e., binary NOT. - - - - - Incremented during server list refresh for each server blocked by this rule. - - - - - Optional image bundled alongside the asset file. - - - - - If true the event will only be invoked in offline mode and on the server. - - - - - Hack to prevent hitting volume rate limit because (at least as of 2022-05-24) we do not have an event for finished dragging. - - - - - Whether this animal was updated in this network tick and needs to be resent. - - - - - Alert this animal that it was damaged from a given position. - Offensive animals investigate the position, whereas other animals run away. - - - - - Alerts this animal that it needs to run away. - - The position to run away from. - - - - Keep for plugin backwards compatibility. - - - - - Reduces frequency of UndergroundAllowlist checks because it can be expensive with lots of entities and volumes. - - - - Unturned_Data folder path - - - - Useful to check whether hashing is causing problems. - - - - - Useful to narrow down why a player is getting kicked for modified resource files when joining a server. - - - - - Only set in play mode for determing if we should cache brute force lengths. - - - - - If set, road properties are taken from this asset instead of the older road properties editor. - - - - - Checkered lines when occluded, solid lines when visible. - - - - - Solid lines regardless of depth. - - - - - In-game debug drawing utility similar to Unity's editor Gizmos. - - - - Local space relative to matrix. - - - - Wireframe grid on the XZ plane. - - - - - Center relative to matrix. - - - - - Center relative to matrix. - - - - - LateUpdate so that the most up-to-date gizmos and main camera position are used. - - - - - Callback to draw in the Unity editor scene view. - - - - - Can be null if nothing has been added at position. - - - - - Does not add new lists to empty cells. - - - - - Number of Lists to preallocate in batches. - (GRID_SIZE * GRID_SIZE) % LIST_POOL_SIZE should be zero leftover. - Reduces constructor performance cost. (public issue #4209) - - - - - Matches the console behavior prior to command IO refactor. - - - - - Add fuel to target. - - - - - Remove fuel from target. - - - - - Whether local client is currently penalized for potentially using a lag switch. Server has an equivalent check which reduces - damage dealt, whereas the clientside check stops shooting in order to prevent abuse of inbound-only lagswitches. For example, - if a cheater freezes enemy positions by dropping inbound traffic while still sending movement and shooting outbound traffic. - - - - - Labels for named locations. - - - - - Contains arena outer circle and inner target points. - - - - - Player avatars. - - - - - Arrow oriented with the local player. - - - - - Convert level-space 3D position into normalized 2D position. - - - - - Convert normalized 2D position into level-space 3D position. - - - - - Temporary to unbind events because this class is static for now. (sigh) - - - - - Manages render queue for transparent materials on non-stationary objects. - Updates one material per frame. - - - - - Callback when camera above/under water changes. - - - - - Material to use during the Christmas event instead. - - - - - Material to use during the Halloween event instead. - - - - - Material to use during the April Fools event instead. - - - - - Nelson 2024-08-19: This link has been checked with WebUtils.CanParseThirdPartyUrl, but is not the - potentially altered link to go through Steam's link filter. This way the UI shows the original link. - - - - - Unturned wrapper for Debug.Log, Debug.LogWarning, Debug.LogError, etc. - - - - - Log an exception with message providing context. - - - - - Recursively logs inner exception. - - Should only be called by itself and exception because notifications - to CommandWindow would otherwise get re-sent here as errors. - - - - - This is the ONLY place Unturned should be binding logMessageReceived. - - This gives us greater control over how logging is handled. In particular, Unity's - headless builds route logs (including stack traces) through stdout which is undesirable - for dedicated servers, so we only call Debug.Log* in the editor and development builds. - - - - - Log an exception with message providing context. - - - - - Get SteamID of vehicle's driver, or nil if not driven. - - - - - Crashed into something, if applicable take self damage from collision. - - - - - Remove all color rich formatting so that shadow text displays correctly. - - - - - Shadow text needs the color tags removed, otherwise the shadow uses those colors. - - - - - Wrap text with color tags. - - - - - Wrap text with color tags. - - - - - Wrap text with color tags. - - - - - Replace br tags with newlines. - - - - - Should player be allowed to write given text on a sign? - Keep in mind that newer signs use TMP, whereas older signs use uGUI. - - - - - Disable style, align, and space because they make server list unfair. - - - - - 2023-01-25: fixing killing self with explosive to track kill under - the assumption that this is only used for tracking stats. (public issue #2692) - - - - - "Single-Render" scope as opposed to "Dual-Render" (rendering the scene a second time with a zoomed-in camera). - Blits middle square of the player's view into the viewmodel scope material's render target. - - - - - Finds an existing "{{Cargo/name" (if any), otherwise adds a new one. - - - - - Adds a new "{{Cargo/name" even if one already exists. - - - - - Helper for wiki writers to dump game data into a useful format. - - - - - Non-item replacement for SleekJars. - Arranges children in an equally-spaced ring around the center. - - - - - Actual unfiltered text. - Kept because plugins might be referencing, and game should use directly once state byte array is refactored. - - - - - If profanity filter is enabled this filtered text is displayed on the 3D sign and in the note UI. - Null or empty on the dedicated server. - - - - - Legacy uGUI text on canvas. - - - - - Legacy uGUI text on canvas. - - - - - Splits string and compares substrings ignoring case. - Tokens containing a colon ':' are ignored so that they can represent special filters like MasterBundleSearchFilter. - - - - - Should the RPC be called in reliable mode? Unreliable effects might not be received. - - - - - Applied if greater than zero. Defaults to 128. - - - - - Extra text added to tooltip. - - - - - Internal struct menu uses to sort items in box. - - - - - Item definition id. - - - - - Rarity used to sort mythical > legendary > epic > rare. - - - - - [0, 1] calculated chance of this item being unboxed. - Shown to player in item tooltips. - - - - - Sorts box entries from highest to lowest rarity. - - - - - Format qualityRarities as ##.# - Does not use 'P' format because localized strings unfortunately already had % sign. - - - - - Items server told us we unboxed, but we wait for the animation to finish before showing. - Typically one, but some newer boxes have bonus items occassionally. - - - - - Is one of the unboxed items mythical rarity? - - - - - Items in the box. - - - - - Skip unboxing animation. - Initial call rotates to just before the item, next call skips entirely. - - - - - Does client know about all the granted items? - If not, either something is bad in the econ config (uh oh!) or client is out of date. - - - - - Relatively efficiently find mesh components, and log an error if their mesh is missing, among other checks. - - - - - Unity warns about renderers registered with more than one LOD group, so we do our own validation as part of - asset loading to make it easier to find these. - - - - - Replaced by ServerMethodHandle. - - - - - Replaced by ClientInstanceMethod.InvokeAndLoopback or ClientStaticMethod.InvokeAndLoopback. - - - - - Replaced by ClientMethodHandle invoked with Provider.EnumerateClients_Remote. - Unlike ESteamCall.CLIENTS this is not loopback invoked. - - - - - Replaced by ClientMethodHandle invoked with SteamChannel.GetOwnerTransportConnection. - - - - - Replaced by ClientMethodHandle invoked with SteamChannel.EnumerateClients_RemoteNotOwner. - - - - - Replaced by ClientMethodHandle invoked with Provider.EnumerateClients. - Unlike ESteamCall.OTHERS this will be loopback invoked in singleplayer or listen server. - - - - - May have been used by voice in early versions, but has been completely removed. - - - - - Parses -X=Y from command-line. - Ideally we could do "where T : TryParse" but for the meantime there are specialized subclasses. - - - - - Maps region coord to a list of sub-road renderers in that region. - Unlike older "region" features, coord can be outside of the old bounds. - Not used in the editor or the dedicated server. - - Nelson 2025-03-28: experimenting with this to see whether it reduces time spent culling far-away road - renderers on Rio de Janeiro Remastered. (Lots of roads on this map.) - - - - - Max draw distance outside editor. - - - - - Called by navmesh baking to complete pending object changes that may affect which nav objects are enabled. - - - - - Allows Unity events to broadcast Event NPC rewards. - - - - - Event ID to use when SendDefaultEventId is invoked. - - - - - The event messenger can only be triggered on the authority (server). - If true, the server will replicate the event to clients. - - - - - Interface between the dedicated server command I/O and per-platform console. - - - - - Called when this implementation is setup by command window. - - - - - Called when this implementation is deleted or application quits. - - - - - Called each Unity update. - - - - - Broadcasts when the enter key is pressed. - - - - - Print white message. - - - - - Print yellow message. - - - - - Print red message. - - - - - July 7th! - - - - - This is the only /required/ override of text writer. - - - - - Can be added to certain entities to modify which crafting tags they make available to players. - At the time of writing (2025-04-08) the compatible entities are: - • Barricade - • Structure - • Vehicle - • Resource - • Object - - - - - Each specified component modifies tags. - - - - - If true then level should convert old node types to volumes. - - - - - If true then level should convert old non-volumes types to devkit objects. - - - - - Hash of nodes file. - Prevents using the level editor to make noLight nodes visible. - - - - - Code common to and . - - - - - Nelson 2025-05-13: replacing the "workshop request log" which used transport connection hash code with this - more recent IP address and Steam ID rate limiter. - - - - - Manually placed from the asset browser or old editor. - - - - - Spawned by foliage baking system. - - - - - Brushed on with the foliage tool. - - - - - Utilities for calling workshop functions without worrying about client/server. - This could be nicely refactored into a client and server interface, but not enough time for that right now. - - - - - Client/server safe version of GetQueryUGCNumKeyValueTags. - - - - - Client/server safe version of GetQueryUGCKeyValueTag. - - - - - Search for the value associated with a given key. - - - - - Client/server safe version of GetQueryUGCResult. - - - - - Is file banned? - - - - - Originally this was only in the uGUI implementation, but plugins can create uGUI text fields - regardless of which glazier is used. - - - - - Stockpile item definition id with rev-share for the level creators. - Randomly selected from associated items list. - - - - - Other menus can modify DevkitSelectionToolOptions so we need to sync our menu when opened. - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - Remove structure instance on server and client. - - - - - Used by ownership change and damaged event to tell relevant clients the new health. - - - - - Legacy function for UseableStructure. - - - - - Spawn a new structure and replicate it. - - - - - Not an instance method because structure might not exist yet, in which case we cancel instantiation. - - - - - Not ideal, but there was a problem because onLevelLoaded was not resetting these after disconnecting. - - - - - Maps prefab unique id to inactive list. - - - - - Sending yaw only costs 1 bit (flag) plus yaw bits, so compared to the old 24-bit rotation we may as well - make it high-precision. Quaternion mode uses 1+27 bits! - - - - - +0 = StructureDrop - +1 = root transform - - - - - Invoked when askUseObjectQuest succeeds. - - - - - When a client method is called on a target object that does not exist yet this class is responsible for - deferring the invocation until the instance does exist. For example until finished async loading. - - - - - Called by generated methods when target object does not exist. If target object has been marked deferred - then the method will be invoked after it exists. - - - - - Add list of deferred invocations for key. Otherwise messages will be discarded assuming it was canceled. - - - - - Remove pending invocations. - - - - - Invoke all deferred calls. - - - - - Invocations are grouped by net id block to ensure order is preserved between related objects. - - - - - Not a member of ClientMethodInfo because it does not need to be looked up using reflection. - - - - - Called before loading level. - - - - - Update currency and owned items if inventory has changed and menu is open. - - - - - Update currency or experience depending what the vendor accepts. - - - - - Nelson 2025-06-10: new code should favor Vector2Int. We don't want to introduce further uint8 region usage. - - - - - Get net ID only if transform is directly registered, not if transform is the child of a registered transform. - - - - - Log every registered pairing. - - - - - Called before loading level. - - - - - Reverse pairing specifically for building net id + relative path name. - - - - - Write header common to both static and instance methods, and return writer. - - - - - Valid when opened in Begin or End mode. - - If the quest is ready to complete the UI is opened in End mode to allow - the player to see what rewards they will receive after clicking continue. - Otherwise, in Begin mode the UI is opened to allow the player to review - the conditions before accepting or declining the request. - - If the player cancels the pending response is NOT chosen. - - - - - Valid when opened in Begin or End mode. - The player clicked pendingResponse in this dialogue to open the quest UI. - - - - - It is useful to be able to reference transforms generically over the network, for example to attach a bullet - hole to a tree or vehicle without tagging it as a tree or vehicle, but most entities placed in the level do not - have unique IDs. To work around this we count downward from uint.MaxValue for level objects to avoid conflicts - with server-assigned net ids. - - - - - Nelson 2025-06-10: this is used by older level file formats, but with placement of trees outside legacy - bounds now supported we use only the index in that case with GetTreeNetIdV2. - - Each region can have ushort.MaxValue trees, and we reserve that entire block so that a region can be slightly - modified on the client or server without breaking all netids in the level. - - - - - Each region can have ushort.MaxValue objects, and we reserve that entire block so that a region can be slightly - modified on the client or server without breaking all netids in the level. - - - - - Devkit instance IDs should already be fairly stable. There is no way any level is using more than 30 bits - for the instance ID, so it should be safe to set those bits to prevent collisions with server net IDs. - - - - - Struct interface so that for transient asset bundles (older workshop mods) they can be preloaded - and retrieved as-needed, but for master bundles the asset loading can be deferred until needed. - - - - - Legacy implementation that preloads assets. - - - - - Save a reference to an object in the asset bundle, but defer loading it until requested by game code. - - - - - Has a new announcement been posted by the developer? - If so, it is given priority over the featured workshop item. - - - - - Called after newsResponse is updated from web request. - - - - - Read News.txt file from Cloud directory to preview on main menu. - - - - - Helper for handlePopularItemResults. - If player has not dismissed item at index then proceed with query and return true. - - - - - Nelson 2024-04-23: A concerned player raised the issue that mature content could potentially be returned in - popular item results. Steam excludes certain mature content by default, but just in case, we check for these - words and hide if contained in title. - - - - - Successfully queried popular workshop items. - Tries to decide on an item that player has not dismissed. - - - - - Response about the item we decided to display. - - - - - Submit query for recently trending popular workshop items. - - - - - Entry point to deciding which workshop item is featured above recent announcements. - - - - - Ensures workshop files are not refreshed more than once per main menu load. - - - - - Synchronize widgets with their values. - - - - - Represents an item the vendor is buying from players. - - - - - Zero is treated as unset. - - - - - Has the contained been animated into visibility on-screen? - Used to disable animating out if disabled. - - - - - Allow Unity events to forcefully remove any barricades inside a sphere. - - - - - Prevents static member from being initialized during MonoBehaviour construction. (Unity warning) - - - - - Mesh Replacement Details - .dat Flags: - Has_1P_Character_Mesh_Override True Bool - Character_Mesh_3P_Override_LODs # Int - Has_Character_Material_Override True Bool - Asset Bundle Objects: - Character_Mesh_1P_Override_# GameObject with MeshFilter (mesh set to a skinned mesh) - Character_Mesh_3P_Override_# GameObject with MeshFilter (mesh set to a skinned mesh) - Character_Material_Override Material - - - - - Replacements for the main 1st-person character mesh. - - - - - Replacements for the main 3rd-person character mesh. - - - - - Replacement for the main character material that typically has clothes and skin color. - - - - - Sort servers by name A to Z. - - - - - Sort servers by name Z to A. - - - - - Sort servers by map name A to Z. - - - - - Sort servers by map name Z to A. - - - - - Sort servers by player count high to low. - - - - - Sort servers by player count low to high. - - - - - Sort servers by max player count high to low. - - - - - Sort servers by max player count low to high. - - - - - Sort servers by normalized player count high to low. - - - - - Sort servers by normalized player count low to high. - - - - - Sort servers by ping low to high. - - - - - Sort servers by ping high to low. - - - - - Information about a game server retrieved through Steam's "A2S" query system. - Available when joining using the Steam server list API (in-game server browser) - or querying the Server's A2S port directly (connect by IP menu), but not when - joining by Steam ID. - - - - - Join server by IP. - - - - - Server is not using an anycast proxy. - - - - - Server host indicated an anycast proxy is in use. - - - - - Moderator flagged server as using an anycast proxy. (EHostBanFlags.QueryPingWarning) - - - - - Ping time measured in milliseconds. - - - - - ID of network transport implementation to use. - - - - - Known plugin systems. - - - - - Probably just checks whether IP is link-local, but may as well use Steam's utility function. - - - - - Active player count divided by max player count. - - - - - Nelson 2024-08-20: This score is intended to prioritize low ping without making it the be-all end-all. The - old default of sorting by ping could put near-empty servers at the top of the list, and encouraged using - anycast caching to make the server appear as low-ping as possible. - - - - - Nelson 2024-08-20: This score is intended to prioritize servers around 75% capacity. My thought process is - that near-empty and near-full servers are already easy to find, but typically if you want to play online you - want a server with space for you and your friends. Unfortunately, servers with plenty of players but an even - higher max players make a 50% score plenty good. - - - - - Nelson 2024-08-20: This score is intended to balance out the downside of the fullness score decreasing for - servers with very high max player counts, and over-scoring servers with low max players. - - - - - Called before inserting to server list. - - - - - Parses value between two keys thing would parse thing - - - - - If set, this server was denied by a server curation list. - - - - - Disables Unity native systems unused by Unturned. - - - - - Enabled for effects held by guns and sentries. - - - - - Listen for OnDestroy callback because mods may be destroying themselves in unexpected ways (e.g., Grenade - component) and still need to be cleaned up. - - - - - Seconds after placement before damage can be dealt. - - - - - Seconds interval between damage dealt. - i.e., will not cause damage if less than this amount of time passed since the last damage. - - - - - UITK implementation consists of a container element which respects the regular position and size - properties, and a child content element which fits itself in the container. - - - - Start Vertex - Start Vertex + Start Tangent - End Vertex + End Tangent - End Vertex - - - Start Vertex - Start Vertex + Start Tangent - End Vertex + End Tangent - End Vertex - - - Start Vertex - Start Vertex + Start Tangent - End Vertex + End Tangent - End Vertex - - - Start Vertex - Start Vertex + Start Tangent - End Vertex + End Tangent - End Vertex - World units length along curve. - Spacing between points. - Max estimate distance from uniform interval before we have to retry. - How many times to retry if the estimate is too far off. - If length is already known pass it in, otherwise it's recalculated. - Time along curve. [0-1] - - - Start Vertex - Start Vertex + Start Tangent - End Vertex + End Tangent - End Vertex - Spacing between points. - Max estimate distance from uniform interval before we have to retry. - How many times to retry if the estimate is too far off. - - - - Single percentage randomness with two outcomes. - - - - - If true the event will only be invoked in offline mode and on the server. - - - - - Percentage chance of event occurring. - - - - - Invoked when random event occurs. - - - - - Invoked when random event does NOT occur. - - - - - Whether the pointer is currently in a spot that can be painted. - - - - - Get brush strength multiplier where strength decreases past falloff. Use this method so that different falloffs e.g. linear, curved can be added. - - Percentage of . - - - - Allows pooling elements. - If set, this is called rather than removing element from scroll view. - - - - - Kind of hacky... Used by player list for group connections. - - - - - Read commands from standard input, and write logs to standard output. - - - - - Broadcast the inputCommited event. - - - - - Synchronize console's title bar text. - Virtual because at one point Win32 SetTitleText was required. - - - - - Intercept the Ctrl-C or Ctrl-Break termination. - - - - - Handle Ctrl-C or Ctrl-Break on the game thread. - - - - - Has Ctrl-C or Ctrl-Break signal been received? - - - - - Is the Ctrl-C or Ctrl-Break signal being handled? - - - - - Names of achievements that can be granted by NPC rewards. - - - - - Name of promo level to additively load. - - - - - UTC when to begin load promo level. - - - - - UTC when to stop loading promo level. - - - - - Folder name of the map when it was in the game. - - - - - Published steam id for the file after it was moved to the workshop. - - - - - Dependencies to subscribe to when subscribing through the in-game menu. - e.g. Hawaii's assets are stored separately on the workshop. - - - - - Only applies if player is not subscribed to the workshop file. - Should an advertisement be shown in the Menu > Singleplayer > Curated list? - - - - - Published steam id to subscribe to. - - - - - If logging in after this point, subscribe. - - - - - If logging in before this point, subscribe. - - - - - Maps not installed by default, but recommended from maps list. - - - - - Maps to install to automatically. - Used early in startup to hopefully install before reaching main menu. - - - - - When moving between physics materials we need to continue any previous tire kickup particles until they expire. - This class manages the individual effect per-physics-material. Each wheel can have multiple at once. When the - particles have despawned and the effect is no longer needed, the effect game object is returned to the effect - pool and this class is returned to . - - - - - Name from . - - - - - Instantiated effect. Null after returning to pool. - - - - - Effect's transform. Null after returning to pool. - - - - - Component on gameObject. Null after returning to pool. - - - - - Whether this effect should be emitting particles. False stops the particle system immediately, whereas true - only starts playing on the next frame to avoid filling a gap between positions, e.g., after a jump. - - - - - Prevents repeated lookups if asset is null, while allowing asset to be looked up each time this effect - becomes active so that it can be iterated on without restarting the game. - - - - - Does this wheel affect brake torque? - - - - - Turn on/off physics as needed. Overridden by isAlive. - - - - - [0.0, 1.0] normalized position of wheel along suspension. - - - - - [0.0, 1.0] normalized position animated toward replicatedSuspensionState. - - - - - Model position interpolated toward animatedSuspensionState according to modelSuspensionSpeed. - - - - - [0, 360] angle of rotation around wheel axle. Measured in degrees because Quaternion.AngleAxis takes degrees. - - We track rather than using GetWorldPose so that we can alternate between using replicated and simulated - results without snapping transforms. - - - - - List is created if this wheel has a collider and uses collider pose. Null when vehicle is destroyed to - prevent creation of more effects. - - - - - Instance corresponding to current ground material. Doesn't necessarily mean the particle system is active. - - - - - Called after construction and on all clients and server when a player stops driving. - - - - - Called when vehicles explodes. - - - - - Called during FixedUpdate if vehicle is driven by the local player. - - - - - Calculate suspension state from GetWorldPose result. - - Nelson 2024-03-25: Originally we used the result of GetWorldPose for the model transform and calculated - the suspension state from it because I thought Unity was internally using the spring position that isn't - (currently) exposed to the API. Whether or not it is, it seems fine to calculate the spring position using - the ground hit point instead. We switched entirely away from GetWorldPose so that the wheel can retain - its roll angle when transitioning between locally simulated and replicated. - - - - - Called during Update on dedicated server only if replicated suspension state is enabled. - - - - - Set replicated suspension state AND animated suspension state when vehicle is first received. - - - - - - Supported when locally simulated and on remote clients. - - - - - Called during Update on client. - - - - - Called during Update if vehicle is driven by the local player. - - - - - Called during Update on the server while vehicle is driven by player. - - - - - Seamlessly teleports player to an equivalent position at the destination upon contact. - - - - - Target position and rotation. - - - - - Only used in the Unity editor for visualization. - - - - - If true, PopulateAsset can modify data. For example, to replace deprecated properties. - Only true if asset re-saving and asset metadata parsing are enabled, and asset origin allows re-saving. - Modifications are not saved if asset has any errors in order to avoid losing data. - - - - - If true, an asset with the same ID or GUID has been added to the current asset mapping, replacing this one. - - - - - If true, errors related to this asset were reported during loading. - - - - - Null or empty if created at runtime, otherwise set by when loading. - - - - - Contents of file this asset was loaded from. Only kept if data re-saving is enabled. (So that this memory - is collected after populating the asset.) - - - - - Master bundle this asset loaded from. - - - - - Were this asset's shaders set to Standard and/or consolidated? - Needed for vehicle rotors special case. - - - - - Should texture non-power-of-two warnings be ignored? - Unfortunately some third party assets have odd setups. - - - - - Should read/write texture warnings be ignored? - - - - - Hash of the original input file. - - - - - Maybe temporary? Used when something in-game changes the asset so that it shouldn't be useable on the server anymore. - - - - - Most asset classes end in "Asset", so in debug strings if asset is clear from context we can remove the unnecessary suffix. - - - - - Remove "Asset" suffix and convert to title case. - - - - - e.g. Canned Beans (Consumeable Item) - - - - - Perform any initialization required when PopulateAsset won't be called. - - - - - Planning ahead to potentially convert the game to use Unity's newer Addressables feature. - - - - - 2023-04-17: suggestion is to have a hardcoded list of hate speech that gets filtered - regardless of whether profanity filter is enabled. (https://forum.smartlydressedgames.com/t/22477) - - - - - Special asset type that isn't (shouldn't be) returned by asset Find methods. Instead, if found when resolving - an asset legacy ID or GUID, Find is called again with the target specified by this asset. - - - - - Enumerate elements that are not in the pool. - - - - - Sanity check all returned elements have a gameObject. - - - - - Map creator can specify a constant weather mode. - - - - - Associates a train vehicle ID with the index of a road path to spawn it on. - The level only spawns the train if this vehicle ID isn't present in the map yet, so every train on the map has to be different. - - - - - Should underwater bubble particles be activated? - - - - - Should positions underground be clamped above ground? - Underground volumes are used to whitelist valid positions. - - - - - If true, certain objects redirect to load others in-game. - - - - - If true, electric objects are always powered, and generators have no effect. - - - - - Display version in the format "a.b.c.d". - - - - - Version string packed into integer. - - - - - Number of custom tips defined in per-level localization file. - Tip keys are read as Tip_# - - - - - LevelBatching is currently only enabled if map creator has verified it works properly. - - - - - If true, map creator has verified the clutter option works as-expected. - - - - - Absolute path to the map folder. - - - - - Whether unity analytics should track this map's name. Don't want to burn all the analysis points! - - - - - Maps included with the game only, separate from category because arena maps are misc. - Category is set as part of the config file. This is only mainly used to enable unity analytics tracking for map name. - - - - - Only used for play menu categories at the moment. - - - - - SHA1 hash of the Level.dat file. - - - - - Test whether this map's workshop file ID is in the curated maps list. - - - - - Web URL to map feedback discussions. - - - - - If true, this info is out-of-date and may have been renamed or deleted. - - - - - Preview.png should be 320x180 - - - - - Get a random file path in the /Screenshots folder, or fallback to Level.png if it exists. - - - - - Get a random file path in the /Screenshots folder - - - - - When adding or removing entries remember to update NetMessages size and regenerate NetCode! - - - - - Client requesting workshop files to download. - - - - - Client has loaded the level. - - - - - Client providing Steam login token. - - - - - Client sending BattlEye payload to server. - - - - - Client sent a ping. - - - - - Client responded to our ping. - - - - - Client calling an RPC. - - - - - Client providing asset GUIDs with their file hashes to check integrity. - - - - - Client intends to disconnect. It is fine if server does not receive this message - because players are also removed for transport failure (e.g. timeout) and for expiry - of Steam authentication ticket. This message is useful to know the client instigated - the disconnection rather than an error. - - - - - Error code that the server exited with. - 0 is succesful, anything else is an error. - - - - - Empty if successful, - otherwise an explanation of the first error encountered. - - - - - Register all built-in asset and useable types. - - - - - Can be added to any GameObject to receive weather events for a specific custom weather asset. - - - - - GUID of custom weather asset to listen for. - - - - - Invoked when custom weather is activated, or immediately if weather is fading in when registered. - - - - - Invoked when custom weather finishes fading in, or immediately if weather is already fully active when registered. - - - - - Invoked when custom weather is deactivated and begins fading out. - - - - - Invoked when custom weather finishes fading out and is destroyed. - - - - - GUID parsed from WeatherAssetGuid parameter. - - - - - Default. Create a material instance for child renderer of Toggle game object. - Downside of this is exclusion from level batching texture atlas. - - - - - Object does not have any toggleable emissive materials. - - - - - Prevents calling getOrLoad redundantly if asset does not exist. - - - - - If set, overrides model prefab in the level editor. - - - - - Clip.prefab - - - - - Object.prefab - - - - - If true, object will be hidden when rendering GPS/satellite view. - Defaults to true if is set. - - - - - If true, Nav game object will be instantiated in singleplayer and on dedicated server. Useful for objects - which need to affect navmesh baking without colliding with zombies during gameplay. - Defaults to true for "medium" and "large" objects. - - - - - If true, Nav game object will be instantiated in the level editor. Useful for objects which need collision - with zombies during gameplay without affecting navmesh baking. - Defaults to true for "medium" and "large" objects. - - - - - Should landing on this object inflict fall damage? - - - - - If true, object is not loaded when clutter is turned off in graphics menu. - - - - - Property is not exposed at the moment because interactability properties should really be moved into some - sort of sub-asset. - - - - - Same as interactabilityDialogueRef, not public because it really needs to be cleaned up. :( - - - - - Effect played when single segment is destroyed. - - - - - Effect played when all segments are destroyed. - - - - - Weapon must have matching blade ID to damage object. - Both weapons and objects default to zero so they can be damaged by default. - - - - - [0, 1] probability of dropping any rewards. - - - - - If true, zombies can attack this object if it's blocking them. Defaults to false. - - - - - Multiplier for damage from zombies if RubbleCanZombiesDamage is true. - - - - - Controls how rubble affects Nav game object. - - - - - If set (>0), alerts nearby entities when an individual section is destroyed. - - - - - If set (>0), alerts nearby entities when all sections are destroyed. - - - - - Should colliders in the Triggers GameObject with "Kill" name kill players? - If Triggers GameObject is not set, searches Object instead. - - - - - Should this object only be visible if gore is enabled? - Allows pre-placed blood splatters to be hidden for younger players. - - - - - Only activated during this holiday. - - - - - Object to use during the Christmas event instead. - - - - - Object to use during the Halloween event instead. - - - - - Get asset ref to replace this one for holiday, or null if it should not be redirected. - - - - - If any conditions use flags they will be added to a set, - otherwise null is returned. - - - - - Recursively change all children including root from oldTag to newTag. - Aborts if a child doesn't match the old tag because it might be something we shouldn't change the tag of. - True if tags were all successfully changed. - - - - - Recursively change all children including root from oldLayer to newLayer. - Aborts if a child doesn't match the old layer because it might be something we shouldn't change the layer of. - True if layers were all successfully changed. - - - - - Called if we have a valid Nav GameObject. - Recast requires any meshes used on the Nav objects to be CPU readable, so we log errors here if they're not marked as such. - - - - - Should zombie(s) of the required type be spawned when player enters the area? - - - - - How many to spawn if spawning is enabled. - - - - - If greater than zero, find this zombie type configured in the level editor. For example, if the level editor - lists "0 Fire (4)", then 4 is the unique ID, and if assigned to this condition a zombie from the "Fire" - table will spawn. - - - - - Navmesh index player must be within. If set to byte.MaxValue then anywhere on the map is eligible. - - - - - Only kills within this radius around the player are tracked. - - - - - Only kills outside this radius around the player are tracked. - NSTM requested this for a sniping zombies quest. - - - - - If spawning is enabled, whether to use the timer between spawns. - - - - - Shows inspect buttons for each item mentioned in purchasable box or bundle's description text. - - - - - Manages global post-process volumes. - - - - - Callback when in-game graphic settings change. - - - - - Callback when player changes perspective. - - - - - Unfortunately EditorPrefs cannot be used in constructor. - - - - - Represents whether a player can craft a provided blueprint. If yes, which items to use, if no, why not. - Previously, some of this data was (confusingly) stored in the blueprint definition. - For performance, caller should re-use a list of BlueprintStatus and *not* discard unused results. - - - - - Total number of missing required nearby crafting tags. - - - - - Total required input item count minus available input item count. - - - - - Currently only used by housing planner. - Doesn't work with NPC conditions / rewards. - - - - - Currently only used by housing planner. - Doesn't work with NPC conditions / rewards. - - - - - Used to sort blueprints from "most craftable" (1) to "least craftable" (0). - - - - - Reset values set by PlayerCrafting.UpdateBlueprintDynamicStatus. - - - - - If not zero, use this amount instead of . - Used by as amount of ammo needed. - - - - - If true, cancel updating status as soon as anything goes wrong. - False for client UI where all info about blueprint is needed for display. - True on server where extra processing is a waste. - - - - - If set, log errors here. - - - - - Is current UTC time within this time span, and player has not dismissed? - - - - - Has the current time span been dismissed? - For example, player may have dismissed a previous event but not this current one. - - - - - Is current UTC time within this time span? - - - - - Allows file name to be included in kick message that client would otherwise not know. - - - - - Actual max value is plus one because message never contains zero items. - - - - - Has player dismissed the given workshop item? - - - - - Track that the player has dismissed the given workshop item. - - - - - Has player already auto-subscribed to the given workshop item? - - - - - Track that the player has auto-subscribed to the given workshop item. - - - - - Find colliders in gameObject and encapsulate their bounding boxes together. - - True if bounds were determined, false otherwise. - - - - Find colliders in gameObject and the point closest to position, otherwise use gameObject position. - - Collider is only included if its layer is enabled in layer mask. - - - - Does sphere overlap anything? - - - - - Allows foreach loop to iterate renderers defined in lod group. - - - - - Counts hits per-IPv4 address (if available) and per-SteamID (if available). - Connection is blocked if more than "threshold" hits occur within category (IPv4/SteamID). - Hit count resets when "window" seconds have passed since last hit. - - - - - If hit is within this many seconds of previous hit, it counts. Otherwise, counter is reset. - - - - - If more than this many hits occur the limit is reached. - - - - - Hack, we put this string on a newline for box probabilities. - - - - - Called on the client after a new message is inserted to the front of the list. - - - - - Called on the server when preparing a message to be sent to a player. - Allows controlling how %SPEAKER% is formatted for the receiving player. - - - - - Called on the server when formatting a player's message before sending to anyone. - Allows structuring the message and where the player's name is, for example: '[CustomPluginRoleThing] %SPEAKER% - OriginalMessageText' - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - Add a newly received chat message to the front of the list, - and remove an old message if necessary. - - - - - Previous messages sent to server from this client. - Newest at the front, oldest at the back. Used to repeat chat commands. - - - - - Send a request to chat from the client to the server. - - - - - Allows Unity events to send text chat messages from the client, for example to execute commands. - Messenger context is logged to help track down abusive assets. - - - - - Allows Unity events to broadcast text chat messages from the server. - Messenger context is logged to help track down abusive assets. - - - - - Server send message to specific player. - Used in vanilla for the welcome message. - Should not be removed because plugins may depend on it. - - - - - Server send message to specific player. - Used in vanilla by help command to tell player about command options. - Should not be removed because plugins may depend on it. - - - - - Server send message to all players. - Used in vanilla by some alerts and broadcast command. - Should not be removed because plugins may depend on it. - - - - - Serverside send a chat message to all players, or a specific player. - - Contents to display. - Default text color unless rich formatting overrides it. - Player who sent the message (used for avatar), or null if send by a plugin. - Send message to only this player, or all players if null. - Mostly deprecated, but global/local/group may be displayed. - URL to a 32x32 .png to show rather than a player avatar, or null/empty. - Enable rich tags e.g., bold, italics in the message contents. - - - - Nelson 2024-10-14: We might want to elaborate on this with "client-side chat commands" in the future, but - for the meantime I've hacked in this one command. - - - - - If set, find a child meshrenderer with this name and change its material to the character hair material. - - - - - If non-zero, legacy ID of final Asset to return. - - - - - If non-zero, legacy ID of SpawnAsset to resolve. - - - - - If both legacy IDs are zero this GUID will be used. If the target asset is - a SpawnAsset it will be further resolved, otherwise the found asset is returned. - - - - - Can be enabled by spawn tables that insert themselves into other spawn tables using the roots list. - If true, zeros the weight of child tables in the parent spawn table. - - - - - Has this spawn been added as a root of its child spawn table? - Used for debugging spawn hierarchy in editor. - - - - - Helper method for plugins because IDs are internal. - - - - - Parent spawn assets this would like to be inserted into. - - - - - Zero weights of child spawn tables. - Called when inserting a root marked isOverride. - - - - - Do tables need to be sorted and normalized? - - - - - Sort children by weight ascending, and calculate their normalized chance as a percentage of total weight. - - - - - Remove from roots, and if reference is valid remove us from their children. - - - - - Remove from tables, and if referencing a child table remove us from their roots. - - - - - Spawns an animal into the world. - - The ID of the animal. - Position to spawn the animal. - Angle to spawn the animal. - Whether the animal is dead or not. - - - - Gets the animal at a specific index. - - The index of the animal. - - - - - Find replacement spawnpoint for an animal and teleport it there. - - - - - Used in arena mode to reset all animals to dead. - - - - - Stripped-down version of structure prefab for previewing where the structure will be spawned. - - - - - Whether preview object is currently highlighted positively. - - - - - Time when "Use" animation clip started playing in seconds. - - - - - Length of "Use" animation clip in seconds. - - - - - True when animation starts playing, false after placement sound is played. - - - - - Whether the "Use" animation clip started playing. - - - - - If running as server, whether ReceiveBuildStructure has been called yet. - - - - - Whether basic range and claim checks passed. - - - - - Position the item should be spawned at. - - - - - Rotation the item should be spawned at. - - - - - Interpolated toward customRotationOffset. - - - - - Allows players to flip walls. - - - - - Vertical offset using scroll wheel. - - - - - Whether enough time has passed for "Use" animation to finish. - - - - - Whether animation has reached the time when placement sound should play. - - - - - Used to aid backwards compatibility as much as possible when transitioning Unity versions breaks asset bundles. - - - - - Unity 5.5 and earlier per-asset .unity3d file. - - - - - When "master bundles" were first introduced in order to convert older Unity 5.5 asset bundles in bulk. - - - - - Unity 2018 needed a new version number in order to convert materials from 2017 LTS asset bundles. 2019 did not need a - new version number, but in retrospect it seems unfortunate that we cannot distinguish them, so 2020 does have its own. - - - - - 2021 LTS+ - - - - - The first time asset loading finishes it will load the main menu. - - - - - If true, either loading during initial startup or full refresh. - - - - - If true, currently searching locations added after initial startup loading. - - - - - Has initial client UGC loading step run yet? - Used to defer asset loading for workshop installs that occured during startup. - - - - - Has initial map loading step run yet? - Used to defer map loading for workshop installs that occured during startup. - - - - - Calling this "legacy" is a bit of a stretch because even most of the vanilla assets are - built around the 16-bit IDs. Ideally no new code should be relying on 16-bit IDs however. - - - - - Incremented when assets are added or removed. - Used by boombox UI to only refresh songs list if assets have changed. - - - - - In singleplayer and the level editor this is the same as defaultAssetMapping, - but when playing on a server a subset of assets based on the server's workshop files is used. - - - - - Should folders be scanned for and load .dat and asset bundle files? - Plugin developers find it useful to quickly launch the server. - - - - - Do we want to enable shouldDeferLoadingAssets? - - - - - Should extra validation be performed on assets as they load? - Useful for developing, but it does slow down loading. - - - - - Should asset file metadata such as line numbers and comments be parsed? - Useful for development (e.g., error messages), but may slow down loading and increases RAM usage. - - - - - Should asset files be re-saved after all loading is finished? - Requires asset metadata. Useful for automatically upgrading .dat/.asset files. - - - - - Should some specific asset types which opt-in be allowed to defer loading from asset bundles until used? - Disabled by asset validation because all assets need to be loaded. - - - - - Should workshop asset names and IDs be logged while loading? - Useful when debugging unknown workshop content. - - - - - Should a JSON report of all the game's assets be exported? - - - - - Should GC and clear unused assets be called after every loading frame? - Potentially useful for players running out of RAM, refer to: - https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/1352#issuecomment-751138105 - - - - - Should modded spawn tables being inserted into parents be logged? - Useful for debugging workshop spawn table problems. - - - - - Loaded master bundles. - - - - - Loading master bundles. - - - - - Master bundle from root /Bundles directory containing vanilla assets. - - - - - While an asset is being loaded, this is the master bundle for that asset. - Used by master bundle pointer as a default. - - - - - This method supports . - - - - - Find an asset by GUID reference. - This method supports . - - Asset with matching GUID if it exists, null otherwise. - - - - Find an asset by GUID reference. - This method supports . - Maybe considered a hack? Ignores the current per-server asset mapping. - - Asset with matching GUID if it exists, null otherwise. - - - - Find an asset by GUID reference. - This method supports . - Maybe considered a hack? Ignores the current per-server asset mapping. - - Asset with matching GUID if it exists, null otherwise. - - - - Load content from an assetbundle. - - - - - Find an asset by GUID reference. - This method supports . - - Asset with matching GUID if it exists, null otherwise. - - - - Find an asset by GUID reference. - This method supports . - - Asset with matching GUID if it exists, null otherwise. - - - - This method supports . - - - - - This method supports . - - - - - This method supports . - Note: this method doesn't handle redirects by VehicleRedirectorAsset. - - - - - This method supports . - Note: this method doesn't handle redirects by VehicleRedirectorAsset. - - - - - This method supports . - - - - - This method supports . - - - - - Useful if GUID can reference a different asset type than legacy ID. For example, gun magazine GUID can - reference a SpawnAsset while its legacy ID cannot. - This method supports . - - - - - Append assets that extend from result type. - - - - - Maybe considered a hack? Ignores the current per-server asset mapping. - Append assets that extend from result type. - - - - - While playing on server the client will use the same dictionary/list of assets the server uses in order - to reduce issues with ID conflicts. - - 2023-05-27: server now ALSO uses the same logic to ensure IDs are applied in consistent order regardless - of multi-threaded loading order. - - - - - Search all loaded master bundles for one in path's hierarchy. - - - - - Find loaded master bundle by name. - - - - - Unload all asset bundles from memory, and empty known list. - Called when reloading assets. - - - - - Catches exceptions thrown by LoadFile to avoid breaking loading. - - - - - Called when a new workshop item is installed either on client or server. - - - - - Reload assets in given folder. - - - - - Do we have any new spawn assets that have not been linked yet? - Used to skip linking spawns if not required when downloading assets. - - - - - Can now be safely called multiple times on client in order to handle spawns for downloaded maps. - Spawn tables have "roots" which allow mods to insert custom spawns into the vanilla spawn tables. - This method is used after workshop assets are loaded on client, or after the dedicated server is done downloading workshop content. - - - - - Look through all item blueprints and log errors if there are duplicates. - - - - - Look through all dialogue and check that their referenced - dialogueID or vendorID is an actual loaded asset. - - - - - Manually run asset unload and garbage collection in the hope - that it will minimize RAM allocated during loading. - - - - - Helper for Assets.init. - Load all non-map assets from: - /Bundles/Workshop/Content - /Servers/ServerID/Workshop/Content - /Servers/ServerID/Bundles - - - - - Helper for Assets.init. - Load all non-map assets from subscribed UGC. - - - - - Helper for modders creating workshop content. - Loads folders in the "Sandbox" directory the same way workshop files are loaded. - - - - - Helper for Assets.init. - Load all assets in each map's Bundles folder, and content in map's Content folder. - - - - - Not the tidiest place for this, but it allows startup to pause and show error message. - Occasionally there have been reports of the steamclient redist files being out of date on the dedicated - server causing problems. For example: https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/2866#issuecomment-965945985 - - - - - Note: inventory service does not support exchanging multiple items simultaneously. - - - - - Optional parameter for error logging and responding to the invoker. - - - - - Wraps audio source to prevent caller from meddling with it, and to allow the implementation - to change in the future if necessary. - - - - - 2D audio. - - - - - Optional parent transform to attach the audio source to. - - - - - 0 = 2D, 1 = 3D - - - - - Associates an ID with the instance of the sound being played. This ensures that if Stop() is called - on an old handle it will not stop playing the audio if the component has already been recycled. - - - - - True while inactive, false while playing. - - - - - Timer needs playId as well in case source has been recycled by the time duration expires. - - - - - Not extendable until transport API is better finalized. - - - - - How many seconds message should popup. - - - - - Which item ID we thought was there. If the item ID currently at the coordinates doesn't match we clear this hotkey. - - - - - Start/Stop input is encoded as 2 bits, 1 bit for Start flag and 1 bit for Stop flag. - - Prior to 2023-03-16 it was a single bit. The server would Start if true and the previous frame was false, - and vice versa call Stop if false and the previous frame was true. The problem with that approach was when - the client FPS is higher than the simulation FPS a series of repeated attack presses would be treated as a - continuous held attack input. Semi-auto guns were difficult to shoot at their max rate of fire. Sending both - allows the server to theoretically call Start every simulation frame as opposed to only half. - - First approach was to OR Start if held, otherwise OR Stop. This doesn't work because for example when Aim is - pressed the Stop flag will already be enabled, so the gun Starts aiming, Stops aiming, Starts aiming, and then - stays aiming rather than just Start and stay aiming. Instead we only want Stop to be sent once. - - - - - Wants to "start" primary or secondary input. (e.g., Useable.startPrimary) - - - - - Wants to "stop" primary or secondary input. (e.g., Useable.stopPrimary) - - - - - Invoked from tellEquip after change. - - - - - Skin applied to the currently equipped useable. - - - - - Does equipped useable have a menu open? - If so pause menu, dashboard, and other menus cannot be opened. - - - - - For aiming toggle input. - - - - - Get ragdoll effect to use when the current weapon deals damage. - - - - - It should be safe to call this immediately because hotkeys are loaded in InitializePlayer. - - - - - Prevent multiple hotkeys from referencing the same item. - - - - - Left-handed characters need the stat tracker to be flipped on the X axis so that the text reads properly. - ItemTool doesn't know about left/right handedness, so for the moment that's handled here because only players need this fixed up. - - - - - Match stat tracker gameobject's isActive to whether skins are visible. - - - - - Match all stat tracker visibilities to whether skins are visible. - - - - - Called clientside to ask server to equip an item in the inventory. - - - - - Hacked-in to bypass regular clientside checks when client would predict the item at given coords. - - - - - Remove the item from inventory so that if we die before the item isn't dropped - - - - - Finish dequipping from - - - - - Invoked before dealing damage regardless of whether the punch impacted anything. - - - - - (Temporarily?) separated out from simulate to try and get a better exception call stack. - - - - - (Temporarily?) separated out from simulate to try and get a better exception call stack. - - - - - (Temporarily?) separated out from simulate to try and get a better exception call stack. - - - - - Allow UI to process input [0, 9] key press when cursor is visible. - - - - - Process input [0, 9] key press. - - - - - If equipped item is bound to a hotkey, return the button [0, 9] associated. - Otherwise, return -1. - - - - - Called by input when preparing for simulation frame. - - - - - Called once by Setup. - - - - - Extension method for Thread class. - Plugins use this. - I might have accidentally removed it due to zero refs and Pustalorc was mad: - https://github.com/SmartlyDressedGames/Unturned-3.x-Community/discussions/4131 - - - - - Throw an exception if current thread is not the game thread. - - - - - Only on dedicated server: throw an exception if current thread is not the game thread. - - - - - Search loaded assets for blueprints that output a single structure item and are - available on the current map. - - - - - Update status of all relevant blueprints. - - - - - Currently saved craftableBlueprint for asset may have become uncraftable, - in which case we try finding a craftable replacement. - - - - - Get a blank status from the pool or construct a new one. - - - - - Search inventory for housing items, count the quantity of each, and remove - duplicate entries from the list because it is used for the UI. - - - - - Stripped-down version of structure prefab for previewing where the structure will be spawned. - - - - - Whether preview object is currently highlighted positively. - - - - - Position the item should be spawned at. - - - - - Rotation the item should be spawned at. - - - - - Interpolated toward customRotationOffset. - - - - - Allows players to flip walls. - - - - - Vertical offset using scroll wheel. - - - - - Box in the HUD with selected item name and quantity. - - - - - Blueprints which create a structure item. - - - - - One craftable blueprint per potential structure item. - - - - - Recycled blueprint statuses. - - - - - Steam currency codes seem to be ISO 4217, however the documentation (as of 2021-01-29) does not say so. - - - - - If overlay is disabled there is no point showing the in-game item store because the player will not be able - to checkout. We request listings regardless in order to show the "sale" label automatically. - - - - - Windows-specific extensions of Windows console input. - Uses the Win32 API to force a console to be created and destroyed. - - - - - Directory the game files are installed in. For the editor this is the /Builds/Shared directory. - Windows and Linux: contains the executable and the Unturned_Data directory. - MacOS: contains the Unturned.app bundle. - - - - - Handles VehicleRedirectorAsset (if any) and returns actual vehicle asset (if any). - - - - - Handles VehicleRedirectorAsset returning load paint color override (if any) and returns actual vehicle asset (if any). - - - - - Handles VehicleRedirectorAsset returning spawn paint color override (if any) and returns actual vehicle asset (if any). - - - - - Handles VehicleRedirectorAsset (if any) and returns actual vehicle asset (if any). - - - - - Handles VehicleRedirectorAsset returning load paint color override (if any) and returns actual vehicle asset (if any). - - - - - Handles VehicleRedirectorAsset returning spawn paint color override (if any) and returns actual vehicle asset (if any). - - - - - Handles VehicleRedirectorAsset (if any) and returns actual vehicle asset (if any). - - - - - Handles VehicleRedirectorAsset returning load paint color override (if any) and returns actual vehicle asset (if any). - - - - - Handles VehicleRedirectorAsset returning spawn paint color override (if any) and returns actual vehicle asset (if any). - - - - - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. - - - - - Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. - - true if matching vehicle asset was found. (Not necessarily whether vehicle was spawned.) - - - - Tools like carjacks and tires can be used in safezone by admins for maintenance. - - - - - Create glazier implementation. Invoked early during startup. - - - - - Multiplier for the maximum distance the gunshot can be heard. - - - - true if key existed and was removed. - - - true if key existed and was removed. - - - - Unturned equivalent of unity's PlayerPrefs. - Convenient for saving one-off key-value pairs. - - - - - String table specifically for Unity physics material names. - Implemented so that tires can more efficiently replicate which ground material they are touching. - - - - - Get an ID that can be used to reference a physics material name over the network. If given material name - isn't supported (e.g., not registered in a PhysicsMaterialAsset or over max material limit) returns - instead. - - - - - Get name of a physics material from network ID. Returns null if ID is null, e.g., if the sent name wasn't - registered or was over the max material limit. - - - - - Called when resetting network state. - - - - - Called on server and singleplayer before loading level. - - - - - Number of bits needed to replicate PhysicsMaterialNetId. - - - - - Implemented by components to support taking damage from explosions. - Not intended for external use (yet?) and may need to change. - - - - - Used to exclude dead entities from further evaluation. - - - - - Used to sort damage from nearest to furthest. - - - - - Intended for internal use only. - - - - - Data that we pool to reduce allocations, but needs to be separate per-invocation of explosion in case it's - invoked recursively. (for example, by blowing up a vehicle) - - - - - Replacement for playerDamaged. - - - - - Replacement for zombieDamaged. - - - - - Replacement for animalDamaged. - - - - - Refer to ExplosionPoolData for pooling explanation. - - - - - Was necessary when structures were children of level transform. - - - - - Was necessary when trees were children of ground transform. - - - - - Somewhat hacked-together to find owner of a vehicle, barricade, or structure descendant. - - - - - Get average explosionArmor of player's equipped clothing. - - - - - Refer to getPlayerExplosionArmor for explanation of total/average. - - - - - Do damage to a zombie. - - - - - Legacy function replaced by damageZombie. - - - - - Legacy function replaced by damageZombie. - - - - - Do damage to an animal. - - - - - Legacy function replaced by damageAnimal. - - - - - Legacy function replaced by damageAnimal. - - - - - This unwieldy mess is the original explode function, but should be maintained for backwards compatibility with plugins. - - - - - Used if explosion won't damage anything. - - - - - Do radial damage. - - - - - Server spawn impact effect for all players within range. - - - - - Server spawn impact effect for all players within range. Optional "spectator" receives effect regardless of distance. - - - - - Server spawn effect by ID for all players within range. Optional "spectator" receives effect regardless of distance. - - - - - Server spawn effect for all players within range and instigator receives effect regardless of distance. - - - - - parent should only be set if that system also calls ClearAttachments, otherwise attachedEffects will leak memory. - - - - - Nelson 2025-03-10: This aims to avoid messing with Magazine transform IsActive unless skin already did. - - - - - Nelson 2024-11-15: By default, attachments use their corresponding "hook" transform. For example, magazines - use the "Magazine" transform as their parent. If a child of the hook transform matches a caliber in the - attachment's caliber list that is used instead. - - - - - Should the buying and selling lists be alphabetically sorted? - - - - - This prevents identical tag provider setups from listing in the UI. - For example, two workbenches providing the same tags shouldn't show two UI listings. - - - - - Player does not want to see this blueprint. - - - - - Player wants to save this blueprint in a special category. - - - - - Find nearby crafting tag providers and query their tags. - - - - - Tests whether nearby tags include specified tag. - Doesn't update nearby tags, so call UpdateAvailableCraftingTags if out-of-date. - - - - - Requested for plugin use. - Notifies owner they should refresh the crafting menu. - - - - - Update anything that will not change as blueprint is invoked repeatedly on server. - - - - - Update anything that can change as blueprint is invoked repeatedly on server. - - - - - Returns true if should exit early. - If updating behavior here please remember to update . - - - - - Find all item assets available to the player for crafting. - Used to more quickly identify blueprints that might be craftable, rather than testing all blueprints. - If updating behavior here please remember to update . - - - - - Allows housing planner to craft without playing effect, without also allowing - cheaters to craft without playing effect. (if it were an RPC param) - - - - - Get local player's per-blueprint preferences. - - - - - Set local player's per-blueprint preferences. - This is helpful both to prevent accidentally crafting certain blueprints (like blindfolds) when click to - craft is enabled, and to save frequently used blueprints. - - - - - Why isn't tags list public visibility? Because if adding features to (for example) consume a resource when - crafting tag provider is used that will require an API change. - - - - - Extensions to the built-in Screen class. - We have run into multiple problems with the Screen.resolutions property over the years, so this class aims to - protect against bad data. - - - - - Work-in-progress plan to allow modders to create custom physics effects. - - - - - Can crops be planted on a given material? - - - - - Can oil drills be placed on a given material? - - - - - Original width field is misleadingly named. It represents half the width of the flat section of the road. - - - - - Original depth field is misleadingly named. It represents half the "up" size of the road. - - - - - Distance along the terrain surface normal to move each road vertex. - - - - - New code should not use this. Only intended for backwards compatibility. - - - - - Ideally the interactable components should have a reference to their barricade, but that will maybe happen - after the NetId rewrites. For the meantime this is to avoid calling FindBarricadeByRootTransform. If we go - the component route then FindBarricadeByRootTransform will do the same as this method. - - - - -1 if table was not found. - - - - By default, clickable only responds to LeftMouse without the Control modifier. - Unturned (currently) filters left/right mouse and modifiers outside Glazier, - so add activators for left/right and control modifier to all clickables. - - - - - USS best practices mentions inline styles have a higher memory overhead, so we - only apply an inline value if it doesn't match the default :root font style. - - - - - USS best practices mentions inline styles have a higher memory overhead, so we - only apply an inline value if it doesn't match the default :root text alignment. - - - - - Ehh kind of a stretch to mark this obsolete or for backwards compatibility. Introducing it for road assets - which specify the PhysicMaterial to assign to the colliders. Specifying an asset path is available, but - for the common case we will use the built-in vanilla resources. - - - - - Get legacy enum corresponding to Unity physics material object name. - Moved from obsolete checkMaterial method. - - - - - If collider and its physics material are not null, get the physics material's name. Null otherwise. - - Nelson 2025-04-22: this method may seem silly on first glance. However, I tracked down some every-frame - memory allocation to getting the PhysicMaterial.name property. This method caches the instance ID to - name lookup in a dictionary to avoid that. Note: we don't worry about clearing the dictionary because - there aren't very many physics materials. - - - - - Base class for uGUI implementations of primitive building block widgets. - - - - - Called after constructor when not populating from component pool. - - - - - Called after constructor when re-using components from pool. - - - - - Synchronize uGUI component colors with background/text/image etc. colors. - Called when custom UI colors are changed, and after constructor. - - - - - Synchronize uGUI component sprites with theme sprites. - Called when custom UI theme is changed, and after constructor. - - - - False if element couldn't be released into pool and should be destroyed. - - - - Unity recommends enabling components after parenting into the destination hierarchy. - - - - - RectTransform children should be attached to. Overridden by ScrollView content panel. - - - - - This helper property's purpose is to: - - Ensure other properties don't accidentally remove LayoutElement if others need it. - - Ensure LayoutElement is destroyed before returning to pool. - - - - - Parameters for connecting to a game server. - - Admittedly there are other parameters to the Connect method, - but those are for detecting advertisement discrepencies and can be null. - - - - - Server's public IP address of a Steam "Fake IP" address. - - - - - Port for Steam's "A2S" query system. This the port we refer to when - sharing a server's address (e.g., 127.0.0.1:queryport). - - - - - Port for game traffic. i.e., Steam manages the query port socket while - we manage the connection port socket. The game assumes it's the query - port plus one. NOTE HOWEVER after the introduction of "Fake IP" support - (2023-12-07) the connection port is the same as the query port for fake - IPs. In keeping with the spirit of fake values to simplify existing code, - we act as if the connection port is plus one except in the appropriate - ClientTransport code when the fake IP is detected. - - - - - Referred to as "Server Code" in menus. - Used if address is zero. - - - - - If -1, this region is finished activating/deactivating. - Otherwise, incremented once per frame until per-region count is reached. - - Per-region data is removed when isInsideMask is false and progressIndex is -1. - - - - - If true, this region is within MaxDistance of current CameraCoord. - - - - - Tracks activation and deactivation of Regions as camera moves around the level. - - - - - Mark all cells as finished loading and remove cells outside the camera view. - Used after teleporting or loading. - - - - - Caller passes an empty dictionary to be filled with update info. - Increments progressIndex for each returned region. - If region is finished updating, call NotifyRegionFinishedUpdating. - - - - - Called when progressIndex has reached end of given region. - - - - - Fill output set with mask offsets applied to current camera coordinate. - - - - - Find changes between old and current coordinate sets to mark regions in/out of mask. - - - - - Reset region's progress counter and change inside/outside status. - - - - - Allows Unity events to spawn effects. - - - - - GUID of effect asset to spawn when SpawnDefaultEffect is invoked. - - - - - If true the server will spawn the effect and replicate it to clients, - otherwise clients will predict their own local copy. - - - - - Should the RPC be called in reliable mode? Unreliable effects might not be received. - - - - - Transform to spawn the effect at. - If unset this game object's transform will be used instead. - - - - - Applied if greater than zero. Defaults to 128. - - - - - Marker for counting number of tips. - - - - - Camera used while transitioning between scenes to prevent the "no cameras rendering" warning. - - - - - Shown when game connection ping is significantly higher than server browser ping. At the time of writing - (2025-01-17) this is likely because the server is using an "anycast proxy" in front of Steam A2S cache. - - - - - Set to Time.frameCount + 1 while loading. - In the past used realtime, but that was unreliable if an individual frame took too long. - - - - - Select a loading image while on the startup screen or a level without any images. - - - - - Convert world-space point into region coordinates that may be out of bounds. - - - - - Convert world-space position into a region coordinate that may be out-of-bounds. - - - - - Returns true if coord is within legacy range. - - - - - Clamp position into the maximum bounds expected by the game, not necessarily the level bounds. - - True if position was modified. - - - - Kick players maybe trying to impersonate me. I guess nobody else named Nelson is allowed in the game! - 2023-09-19: relaxed this a bit by trimming names and using Equals/Starts/Ends rather than Contains - because there was a player with Nelson in their username. - - - - - GUID of the asset this is referring to. - - - - - Whether the type has been asigned. Note that this doesn't mean an asset with exists. - - - - - True if resovling this type reference would get that type. - - - - - Maximum count of naturally spawned boss zombies. Unlimited if negative. - Game will not spawn/respawn boss zombie types passing this limit, but quest spawns can bypass it. - - - - - Base class for UIToolkit implementations of primitive building block widgets. - - - - - Set by child. - - - - - Synchronize control colors with background/text/image etc. colors. - Called when custom UI colors are changed, and after constructor. - - - - - If set, takes priority over VehicleRedirectorAsset's paint color and over VehicleAsset's default paint color. - - - - - Returned asset is not necessarily a vehicle asset yet: It can also be a VehicleRedirectorAsset which the - vehicle spawner requires to properly set paint color. - - - - - Plugin-only event when throwable is spawned on server. - - - - - Allows NPCs to trigger plugin or script events. - - - - - instigatingPlayer can be null. For example, if instigated by NpcGlobalEventMessenger. - - - - - Circular mask for 2D distances in meters on a 2D cell grid. - Includes a cell if the meters distance between the center cell - and the closest point on test cell is within radius. - - - - - World space distance in meters. - - - - - Region cell size in meters. - - - - - Data in common between list downloaded from a GET request and a ServerListCurationAsset. - - - - - Optional web image path if icon isn't included. - - - - - Incremented during server list refresh for each server blocked by this rule. - - - - - Starting position when the bullet was fired. - - - - - Only available on the server. For use by plugins developers who want to analyze deviation between approximate - start direction and final hit position using and - per public issue #4450. Note that origin and direction on server are not necessarily exactly the same as on - the client for a variety of reasons, including that bullets on the client can be spawned between simulation - frames when the aim direction was different. (Aim direction is updated every drawn frame on the client as - opposed to every simulation frame on the server.) Rather than kicking for one particularly large deviation - we would recommend tracking stats for each shot's actual deviation vs max theoretical deviation. Remember - to account for bullet drop and that aim spread is relative to this direction. (For example, a shotgun may - fire ~8 pellets in a cone around this direction.) Note also that in third-person the bullet can turn up to - 90 degrees from the aim direction if the camera is up against a wall. - - - - - Combination of gun and attachments' bullet gravity multipliers. - - - - Whether plugin allowed attachment. - - - - Plugin-only event when bullet is fired on server. - - - - - Plugin-only event when bullet hit is received from client. - - - - - Plugin-only event when projectile is spawned on server. - - - - - reticuleHook.localPosition after instantiation, or zero if null. - - - - - True if startPrimary was called this simulation frame. - Allows gun to shoot even if stopPrimary is called immediately afterwards. - - - - - Remaining calls to tock before firing. - - - - - Shot counter used by needsRechamber and RechamberAfterShotCount. - - - - - Is the tactical attachment toggle on? - e.g. True when the laser is enabled. - - - - - Should stat modifiers from the current tactical attachment be used? - - - - - Factor e.g. 2 is a 2x multiplier. - Prior to 2022-04-11 this was the target field of view. (90/fov) - - - - - Zoom multiplier in third-person. - - - - - Whether main camera field of view should zoom without scope camera / scope overlay. - - - - - Original barrel and magazine assets are supplied because they may have already been deleted. Barrel is only - valid if quality was greater than zero. - - - - - Called on server and owning client. - - - - - Calculate damage multiplier for individual bullet. - - - - - Requested for plugin use. - - - - - Request from the server to play a gun jammed animation. - Since client can't predict chamber jams we fixup the predicted ammo count. - - - - - Note: This is the m/s² acceleration, not the multiplier. - - - - - This is a bit of a hack... aimAccuracy is [0, maxAimingAccuracy] and changed during each FixedUpdate call, - but was used in some gameplay display features like holo sight, laser, ADS, etc. (yes, should - be de-coupled from FixedUpdate but that is its own issue) To smooth this out we interpolate - slightly behind the aimAccuracy value depending on the time since FixedUpdate. - - - - - Holographic sights follow the true aiming direction regardless of viewmodel animation. - - - - - Note: This is the multiplier, not the m/s² acceleration. - - - - - Code common for regular gun and sentry gun. - - - - - Consolidates parameters for older, separate inventory search methods. - - The "player" part of the name refers to the PlayerInventory-specific parameters. It can still be used to search - the Items class, in which case those parameters do not apply. - - - - - List to populate with matching items. - - - - - If true, search player's primary and secondary weapon slots. - Only applicable when used with PlayerInventory class. (I.e., not Items class.) - - - - - If true, search storage container player is currently interacting with (if any). - Only applicable when used with PlayerInventory class. (I.e., not Items class.) - - - - - If greater than zero, search exits early once Results count meets MaxResultCount. - - - - - If set, item must be this type to match. - - - - - If set, AssetRef must be a reference to item's asset to match. - Replaces older "id" parameter which matched if item's legacy asset ID was the same. - - - - - If true, items with amount of zero can match. Otherwise, they are ignored. - Replaces older "findEmpty" parameter which matched if (findEmpty || amount > 0). - - - - - If true, items with an "amount" >= their MaxAmount are ignored. Otherwise, they can match (default). - - - - - - If set, item must be of type ItemCaliberAsset. Asset's caliber list must either: - • Contain this caliber ID. - • Or, if empty, IncludeUnspecifiedCaliber must be true. - Otherwise, item is ignored. - - - - - If set, item must be of type ItemCaliberAsset. Asset's caliber list must either: - • Contain one of these caliber IDs. - • Or, if empty, IncludeUnspecifiedCaliber must be true. - Otherwise, item is ignored. - - - - - Only applicable if CaliberId or AnyCaliberIds is set. - If true, assets with an empty calibers list can match. Otherwise, they are ignore.d - - - - - If set, do not include this specific item instance in search results. - Kind of hacked-in for ignoring "target item" as a potential input item. - - - - - Nearly identical to InventorySearch aside from: - • Struct instead of class to improve garbage collection performance in pooled lists. - • More understandable name. - • Provides reference to Items holding "Jar." Longer-term this should be preferred over the "Page" property. - - - - - Serverside delete an amount of this item. - - False for crafting where original item can be kept, true when selling to vendors. - Total amount deleted. - - - - -1 if no eligible item is found. - If includeMaxQuality is true an item with quality of 100 can be "lowest quality", otherwise item has to - be less than 100 quality. - - - - - Please use PlayerInventorySearchResultV2 for better performance! - - - - - Serverside delete an amount of this item. - - Total amount deleted. - - - - Used by the server to validate client Unity player files (assemblies and resources). - - - - - Should players be allowed to join this server regardless of whether their DLL hash matches ours? - Useful to allow players to join debug mode servers. - - - - - Should players be allowed to join this server regardless of whether their resources hash matches ours? - Useful to allow players to join debug mode servers. - - - - - Experience to add or subtract when used. Defaults to zero. - - - - - Canned beans have skins from April Fools. - - - - - Note: if calling ItemRef.Get() please use FindItemAsset instead to avoid redundant asset lookups. - - - - - Does this blueprint output create the specified item? - - - - - Reset dragging handle and register transformation. - - - - - If true, vest and backpack spawn System_Area instead of System_Hook. - - - - - Sets the point to lerp from, should be called after resetting position or things like that. - - - - - Logs enabled when WITH_NSB_LOGGING is defined. - Tracking down an issue where snapshot buffer stops working for groups of networked objects. - - - - - When adding or removing entries remember to update NetMessages size and regenerate NetCode! - - - - - Server sent a ping. - - - - - Server replying to our ping. - - - - - Server is shutting down shortly. - - - - - Create game object for player. - - - - - Destroy game object for player. - - - - - Download these files before loading the level. - - - - - Server wants additional info before accepting us. - - - - - Server has accepted us and will create a player game object. - - - - - Server rejected us, we will go back to the menu. - - - - - Banned either during connect or gameplay. - - - - - Kicked during gameplay. - - - - - Should be converted to an RPC. Leftover from prior to net messaging code. - - - - - Should be converted to an RPC. Leftover from prior to net messaging code. - - - - - Server sending BattlEye payload to client. - - - - - Infrequent notification of queue position. - - - - - Server calling an RPC. - - - - - Allow Unity events to apply damage in a sphere. (doesn't have any visual effects) - Intended to replace unsupported/unintentional use of "Grenade.cs" and "Rocket.cs" scripts. - - - - - Zombie explosion types have slight variations e.g. lighting zombies on fire. - - - - - If greater than -0.5, overrides default radius zombies and animals will be alerted within. - - - - - If true, per-surface effects like blood splatter are created. - - - - - If true, explosion damage passes through Barricades and Structures. - - - - - Speed to launch players away from blast position. - - - - - Overrides how fall damage is calculated when landing on this game object or its descendants. - - - - - Could be extended in the future to increase, decrease, or set fall damage. - - - - - Potentially useful for an event to toggle the override. - - - - - Character will not take any fall damage. - - - - - Payload for the DamageTool.damageZombie function. - - - - - Should game mode config damage multiplier be factored in? - - - - - Equivalent to the "armor" parameter of the legacy damage function. - - - - - Defaults to 1. - - - - - If not null and damage is applied, is called with this position (startle: true). - - - - - If non-zero, NPC name is shown as ??? until bool flag is true. - - - - - This value is confusing because in the level editor it is the normalized radius, but in-game it is the square radius. - - - - - Returning an Asset rather than the older IDs allows GUIDs to be used. - legacyTargetAssetType is required for compatibility with spawn tables using legacy 16-bit IDs. If set to - None and the spawn asset uses legacy IDs a warning is logged explaining GUIDs are necessary. - - - - - - Doesn't support spawn assets with legacy 16-bit IDs. - - - - - For backwards compatibility with features that still need a legacy ID rather than asset. - - - - - For backwards compatibility with features that still need a legacy ID rather than asset. - - - - - For backwards compatibility with features that still need a legacy ID rather than asset. - - - - - If using a map or mods from the workshop, this class monitors them for changes so the server can be restarted. - - - - - Request status of workshop items. - - - - - Called the next tick after update(s) detected. - - - - - Called when a queried item's update timestamp is newer than our initially loaded version. - - - - - Called when results from a call to submitQueryRequest are available. - - - - - Called once timer reaches interval. - - - - - Were update(s) detected that should be handled on next tick? - - - - - Are we done monitoring? - Default finished once an update is detected. - - - - - Interval between query submissions. - - - - - Accumulated time before submitting query after passing interval. - - - - - Callback from Steam when results from a call to submitQueryRequest are available. - - - - - Slightly interpolated copy of actual spread angle to smooth out sharp changes like crouch/prone. - - - - - Allows interpolatedSpread to snap to target value when crosshair becomes visible. - - - - - Deserialize JSON onto an existing object instance. - - - - - Potentially useful for players with corrupted cloud storage. - https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/2756 - - - - - Introduced much later (2020) than most of the other methods in this class (2014) in order to properly handle - BOM/preamble of text files. Matches somewhat undesirable legacy behavior like creating directories. - - - - - NOTE: From and to are both relative to PATH. - - - - - Read GUI texture from a .jpg or .png file. - - - - - Read GUI texture from a .jpg or .png file. - - - - - Windows-specific extensions of console input. - Uses the Win32 API to force a console to be created and destroyed. - - - - - Called by navmesh baking to complete pending object changes that may affect which nav objects are enabled. - - - - - Hide culling volume by default because new mappers might wonder what these purple boxes - are and why their number goes away after moving objects. - - - - - Check a fixed number of volumes for visibility updates per frame. - - - - - Any volumes in the process of enabling/disabling get updated once per frame. - - - - - True for the next update after the player is teleported. - - - - - Associates items of the same currency, e.g. dollars or bullets. - - - - - Should this item/value be shown in the list of vendor currency items? - Useful to hide modded item stacks e.g. a stack of 100x $20 bills. - - - - - String to format value {0} into. - - - - - String to format value {0} of total {1} into if not otherwise specified in NPC condition. - - - - - Sum up value of each currency item in player's inventory. - - - - - Does player have access to items covering certain value? - - - - - Add items to player's inventory to reward value. - - - - - Remove items from player's inventory to pay required value. - - - - - Sort currency entries by value. - - - - - Temporary replacement for static block member because plugins might depend on it. - - - - - Parses fv:X from input string and loads X.txt from game folder. - - - - - Called after lod bias may have changed. - - - - - Can be added to any GameObject with an interactable binary state in its parents. - - If players should not be allowed to interact with the object in the ordinary manner, - add the Interactability_Remote flag to its asset to indicate only mod hooks should control it. - - - - - When a state change is requested in singleplayer it should be treated as if running as a client on a server. - This is the default to match behavior from before this option was added. - - - - - When a state change is requested in singleplayer it should be treated as if running as a dedicated server. - - - - - Invoked when interactable object enters the Used / On / Enabled state. - - - - - Invoked when interactable object enters the Unused / Off / Disabled state. - - - - - Should the OnStateEnabled and OnStateDisabled events be invoked when the object is loaded, becomes relevant - in multiplayer, and is reset? True is useful when visuals need to be kept in sync with the state, whereas - false is useful for transient interactions. - - - - - Controls how state change requests are performed when running as both client and server ("listen server"). - On the dedicated server, requesting a state change overrides the current state without processing NPC - conditions, whereas when a client requests a state change NPC conditions apply. This option fixes the - inconsistency in singleplayer of whether to treat as server or client. (public issue #4298) - At the time of writing (2024-01-29) listen server only applies to singleplayer. - - - - - Set state to Enabled if currently Disabled. - - On dedicated server this directly changes the state, - but as client this will apply the usual conditions and rewards. - - - - - Set state to Disabled if currently Enabled. - - On dedicated server this directly changes the state, - but as client this will apply the usual conditions and rewards. - - - - - Toggle between the Enabled and Disabled states. - - On dedicated server this directly changes the state, - but as client this will apply the usual conditions and rewards. - - - - - Tests whether current or recent history contains point. - - - - - Half second history at 50 tickrate. - - - - - Not originally supported by networking. Added temporarily during netpak rewrite because the quaternion - compression is so much better for vehicles than three byte Euler rotation. - - - - - Gets barricades both attached to vehicles and not attached to vehicles. - - - - - Nelson 2025-04-08: thank goodness that this didn't use the temperature system! (For some reason?) Makes it - relatively straightforward to convert campfires and ovens to Crafting Tags, and means vanilla has a test - case for the mod hook, too. (This method tests for CraftingHeatTag in radius.) - - - - - Index into Blueprints list. -1 means blueprint name is used instead. - - - - - Name to look for in Blueprints list. - - - - - Other menus can modify DevkitSelectionToolOptions so we need to sync our menu when opened. - - - - - Thanks to Glenn Fiedler for this RK4 implementation article: - https://gafferongames.com/post/integration_basics/ - - - - - Higher values return to the target position faster. - - - - - Higher values reduce bounciness and settle at the target position faster. - e.g. a value of zero will bounce back and forth for a long time (indefinitely?) - - - - - Should objects that failed to load due to missing assets be saved? - If true, a placeholder transform is created and used to save. - If false, objects without assets are zeroed during save. (old default) - - - - - Hash of Objects.dat - - - - - Called by navmesh baking to complete pending object changes that may affect which nav objects are enabled. - - - - - Stagger regional visibility across multiple frames. - - - - - Caches uint16 ID to ID redirects. - - - - Matches handle returned by request, or -1 if cached. - - - - Revive all trees in a specific region. - - - - - Revive trees worldwide. Used between arena rounds. - - - - - Material instantiated when dual-render scopes are enabled. - Overrides the material of the gun sight attachment. - - - - - Unintuitively (to say the least), a pitch of 0 is up, 90 is forward, and 180 is down. - - - - - Nelson 2025-06-27: previously, stopping aim cancelled the sway offset immediately. When - experimenting with removing the dual-render scope blur this felt jarring. - - - - - Reset to actual fov when first used. - - - - - If true, freecam controls take input priority. - Previously named isOrbiting. - - - - - Should player stats be visible in spectator mode? - - - - - Smoothing adds some initial blend-in which felt nicer for explosion rumble. - - - - - Slightly clamped third-person version of "eyes" value to prevent sweep from hitting floor. - - - - - Get point-of-view in world-space. - - - - - Get point of view in worldspace without the left/right leaning modifier. - - - - - This is only used after capturing dual-render scope, not when exiting scope overlay. - Otherwise the lighting vision may have changed between entering and exiting the scope. - - - - - Clamp _pitch within the [0, 180] range. - - - - - Clamp yaw while seated, and keep within the [-360, 360] range. - - - - - Can spectating be used without admin powers? - Plugins can enable spectator mode. - - - - - Can workzone be used without admin powers? - Plugins can enable workzone permissions. - - - - - Can spectator overlays be used without admin powers? - Plugins can enable specstats permissions. - - - - - Called from the server to allow spectating without admin powers. - Only used by plugins. - - - - - Allow use of spectator mode without admin powers. - Only used by plugins. - - - - - Called from the server to allow workzone without admin powers. - Only used by plugins. - - - - - Allow use of workzone mode without admin powers. - Only used by plugins. - - - - - Called from the server to allow spectator overlays without admin powers. - Only used by plugins. - - - - - Allow use of spectator overlay mode without admin powers. - Only used by plugins. - - - - - Multiple hits are necessary because the first returned hit is not always the closest. - - - - - Sweep a sphere to find collisions blocking the third-person camera. - - Valid world-space camera position. - - - - Replacement for enum origin. - - - - - Hardcoded built-in name, or name of workshop file if known. - - - - - Steam file ID if loaded from the workshop, zero otherwise. - - - - - If true, when added to asset mapping the new assets will override existing ones. - This ensures workshop files installed by servers take priority and disables warnings about overlapping IDs. - - - - - If true, we can re-save .dat/.asset files from this origin. - Defaults to false. Only true for assets in the game install folder. - - - - - Can be added to any GameObject to receive text chat events. - - - - - Message can be in any chat channel. - - - - - Message must be in Global channel. - - - - - Message must be in Local channel. - - - - - Filter to apply to message type. - - - - - Sphere radius (squared) around this transform to detect player messages. - e.g. 16 is 4 meters - - - - - Substring to search for in message. - - - - - Message must start with phrase text. - - - - - Message must contain phrase text. - - - - - Message must end with phrase text. - - - - - Filter to apply to message text. - - - - - Invoked when a player message passes the filters. - - - - - Calculate angle in radians the player would need to offset their aim upward - to hit a target a certain distance away. - - - - - Separate from isEnabled to hide markers when they are outside the scope. - - - - - Used to sync hasLabel visibility. - - - - - True while fading in or fully transitioned in. - - - - - True while fading in, but not at full intensity. - - - - - True while finished fading in. - - - - - True while fading out, but not at zero intensity. - - - - - True while finished fading out. - - - - - True while fading in or out. - - - - Matches handle returned by request, or -1 if cached. - - - - Read commands from standard input, and write logs to standard output. - - - - - Each Update we consume a key press from the console buffer if available. - Unfortunately ReadLine is not an option without blocking output, so we maintain our own pending input. - - - - - Entry in the MenuPlayServerBookmarksUI list. - - - - - Null token. - - - - - Text between tags. - - - - - [b] - - - - - [/b] - - - - - [i] - - - - - [/i] - - - - - [list] - - - - - [/list] - - - - - [olist] - - - - - [/olist] - - - - - [*] value - Nelson 2025-07-02: manually written lists typically don't have a ListItemClose token. - - - - - [/*] - Nelson 2025-07-02: Steam's new visual editor adds closing tokens to list items, but - manually-written list items typically don't have them. - - - - - [h1] - - - - - [/h1] - - - - - [h2] - - - - - [/h2] - - - - - [h3] - - - - - [/h3] - - - - - [url=value] - - - - - [/url] - - - - - [img] - - - - - [/img] - - - - - [previewyoutube=value] - - - - - [/previewyoutube] - - - - - '\n' or "\r\n" - - - - - [quote=value] (value is author) - - - - - [/quote] - - - - - [p] - - - - - [/p] - - - - - [u] - - - - - [/u] - - - - - Steam's new visual editor quotes value in [url=x] tag. If value is not quoted, this method returns as-is. - If it IS quoted, this methods returns without quotation marks. - - - - - Breaks down Steam's version of BBcode into tokens like, "[b]", "[i]", "actual text", etc. - - - - - If true, parse newlines in the input as LineBreak tokens. (default true) - If false, exclude LineBreak tokens from output. - Steam's new visual editor doesn't emit newlines, instead inferring line breaks from paragraph blocks. To - make life easier we will do the same for the main menu announcement feed. - - - - - Reset to -1 when not chatting. If player presses up/down we get index 0 (most recent). - - - - - Fill chat field with previous sent message. - Useful for repeating commands with minor changes. - - - - - Use the latest hotbar items in the UI. - - - - - Icon uploaded to CDN. - - - - - Icon used in game menus. - - - - - Project-relative asset importer version of - - - - - Icon saved for community members in Extras folder. - - - - - Has the small icon been captured yet? - - - - - Has the large icon been captured yet? - - - - - Moved icon code from MenuTitleUI to here. - - - - - These directories are excluded from source control and Steam depots so they might not exist yet. - - - - - If updating this method please remember to update the support article: - https://support.smartlydressedgames.com/hc/en-us/articles/13452208765716 - - - - - Does name contain rich text tags? - Some players were abusing rich text enabled servers by inserting admin colors into their steam name. - - - - - Used when damaging zombies to override in which situations they are stunned. - - - - - Default stun behaviour determined by damage dealt. - - - - - Don't stun even if damage is over threshold. - - - - - Stun regardless of damage. - - - - - Overrides hat item from zombie table with a specific item ID. - - - - - Overrides gear item from zombie table with a specific item ID. - - - - - If zombie is stuck this was a nearby barricade potentially blocking our path. - - - - - If zombie is stuck this was a nearby structure potentially blocking our path. - - - - - If zombie is stuck this was a nearby vehicle potentially blocking our path. - - - - - If target player is passenger in a vehicle this is their vehicle. - - - - - If zombie is stuck this was a nearby object potentially blocking our path. - - - - - Incremented while stuck. Prevents doing overlap test too frequently. - - - - - Add or remove from ticking list if needed. - Separated from updateTicking in order to move once after first spawn. - - - - - Boss zombies are considered mega as well. - - - - - Yeah it seems kinda ugly to pollute all zombies with this code... zombie rewrite eventually please. - - - - - If damage exceeds this value, stun the zombie. - - - - - Used to kill night-only zombies at dawn. - - - - - Cache difficulty asset (if any) for this zombie's current type and bound. - Allows difficulty assets to override certain zombie behaviors. - Called after bound/type is initialized, and after type changes during respawn. - - - - - Called when zombie does not have a target, but has been stuck for a period. - - - - - Reduces frequency of UndergroundAllowlist checks because it can be expensive with lots of entities and volumes. - - - - - Helper to prevent mistakes or plugins from breaking alive zombie count. - - - - - Helper to prevent mistakes or plugins from breaking alive boss zombie count. - - - - - 2023-01-31: set height to 2 rather than adjusting per-zombie-type. Tall zombies (megas) couldn't - get through doorways, and short zombies (crawlers) could get underneath objects they shouldn't - like gas tanks. Zombies were also stacking on top of eachother a bit too much. - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - Ideally in a future rewrite asset overload will become the default rather than the overload taking legacy ID. - - - - - If true, item has 100% quality. If false, item has a random quality. - - - - - Get animal or player damage based on game mode config. - - - - - Get zombie or player damage based on game mode config. - - - - - Allows Unity events to spawn barricades. - - - - - Distance along tree's local up axis to offset debris spawn position. Defaults to 1.0. - - - - - Before had randomization properties (which trees don't currently use - as of 2024-12-11 because rotation/scale aren't saved) each tree has some random rotation and scale variation - based on its position. This property controls the rotation away from upright. - - - - - Amount of experience to reward foraging player. - - - - - Forageable resource message. - - - - - Weapon must have matching blade ID to damage tree. - Both weapons and trees default to zero so they can be damaged by default. - - - - - If true, prevent collisions between falling tree and the stump. (i.e., debris can fall through stump) - Defaults to true. - - - - - Only activated during this holiday. - - - - - Tree to use during the Christmas event instead. - - - - - Tree to use during the Halloween event instead. - - - - - Get asset ref to replace this one for holiday, or null if it should not be redirected. - - - - - Essentially deprecated for now. - - - - - Server response to a non-rejected CONNECT request. Notifies client they are in the queue. - - - - - Rather than creating all SleekItems as once we create a few per frame. - - - - - Reset all items hotkey label. - - - - - Kept because lots of modders have been using this script in Unity, - so removing legacy effect id would break their content. - - - - - Find an item to apply stat tracker tool to. - - - - - Find an item with a stat tracker to remove. - - - - - Find an item with a ragdoll effect to remove. - - - - - Find an item to apply ragdoll effect tool to. - - - - - Toggle button to open/close advanced filters panel. - - - - - On/off checkbox for including description text in filter. - - - - - Switch between sort modes. - - - - - On/off checkbox to reverse sort results. - - - - - On/off checkbox to show only equipped items. - - - - - Container for advanced options. - - - - - Whether to include description text in filter. - - - - - How to sort filtered items. - - - - - Should sorted list be reversed? - - - - - Should only equipped items be shown? - - - - - Remove items that do not match search text. - - - - - Removed items that are not equipped. - - - - - All main menu MTX shop code should be routed through here so that it could theoretically be ported to other - platforms or stores. Obviously this is all very Steam specific at the moment, but at least the UI does not - depend on Steam API here as much as older parts of the game. - - - - - Was this item marked as new in the config? - If new, and not marked as seen, then a "NEW" label is shown on the listing. - - - - - Do we have pricing details for a given item? - Price results may not have been returned yet, or item might not be public. - - - - - Messy, but we only show a menu alert if there was a problem. - - - - - Already filtered to only return locally known items which pass country restrictions. - - - - - Empty if outside new time window. - - - - - Subset of listings. - - - - - Subset of listings. - - - - - Subset of listings. - - - - - Subset of listings. - - - - - Subset of listings. - - - - - May be out of date by one frame. - - - - - Currently used by vehicles to deactivate some rendering features when outside rendering distance. - Uses "frozen" position if applicable, otherwise the camera position from the most recent Update. This means - it could be out-of-date, but for LOD purposes it should be "good enough." - - - - - Reset prior to joining a new server. - - - - - By default if the client submits an asset guid which the server cannot find an asset for the client will - be kicked. This is necessary to prevent cheaters from spamming huge numbers of random guids. In certain cases - like a terrain material missing the server knows the client will be missing it as well, and can register - it here to prevent the client from being kicked unnecessarily. - - - - - Send asset hash (or lack thereof) to server. - - IMPORTANT: should only be called in cases where the server has verified the asset exists by loading it, - otherwise only if the asset exists on the client. This is because the server kicks if the asset does not - exist in order to prevent hacked clients from spamming requests. Context parameter is intended to help - narrow down cases where this rule is being broken. - - - - - Send asset hash to server. - Used in cases where server does not verify asset exists. (see other method's comment) - - - - - Called each Update on the client. - - - - - Called from the server to override salvage duration. - Only used by plugins. - - - - - Override salvage duration without admin. - Only used by plugins. - - - - - Outlined object is not necessarily the focused object, so we track it to disable later if focus is destroyed. - - - - - Search up hierarchy for most specific Target transform. - - - - - Was focus non-null during last update? Used to detect when focus was destroyed. - - - - - Currently used by plugins to identify what damaged a buildable. - - - - - Explosion instigated by . - - - - - Should only be used by . - For example: "Condition_##" where ## is an index. - - - - - If >0 the game will start a coroutine to grant the reward after waiting. - - - - - If true and player has this reward pending when they die or disconnect it will be granted. - - - - - Intended to replace filling data from constructor. - - - - - Intended to replace filling data from constructor. Legacy is for backwards compatibility with Reward_#_Key - format, whereas V2 uses the list and dictionary features. - - - - - Used in a test scene to quickly test UI Toolkit implementation. - - - - - Assigned when a named preset is created. - 0 is the default and should be replaced by a preset when loaded. - -1 indicates the preset was modified. - -2 and below are the default presets. - - - - - Nelson 2024-09-20: Changing default to any (from has players) because the default server list sort will now - push empty servers to the bottom. - - - - - If true, only servers with available player slots are shown. - Nelson 2024-09-20: Changing default to false because the default server list sort will now push them down - from the top a little bit. - - - - - If >0, servers with ping higher than this will not be shown. - - - - True if level was added to the list of maps. - - - - Version before named version constants were introduced. (2023-11-13) - - - - - % Full - - - - - Note: this can be different from status.blueprint after status refreshes because status is pooled. - - - - - Update the title box describing the "most important" item: item to repair, salvage, craft, etc. - - - - - The dialogue to go to when a message has no available responses. - If this is not specified the previous dialogue is used as a default. - - - - - For level objects with QuestCondition called when quests are added or removed. - - - - - Event specifically for plugins to listen to global quest progress. - - - - - Event for plugins when group or rank changes. - - - - - Overrides label text next to marker on map. - Used by plugins. Not saved to disk. - - - - - Kept serverside. Used to check whether the player is currently in their Steam group or just a normal in-game group. - - - - - Check before allowing changes to this player's - - - - - Can rename the group. - - - - - Can promote and demote members. - - - - - If set, default spawn logic will check for a location node or spawnpoint node matching name. - Saved and loaded between sessions. - - - - - If true, hide viewmodel and prevent using equipped item. For example, to prevent shooting gun on top of a - first-person scene. This could be expanded in the future with other flags and options. - - - - - Called serverside to set marker on clients. - - - - - Ask server to set marker. - - - - - Call serverside to replicate new rank to clients - - - - - Set player's group to their Steam group (if any) without testing restrictions. - - - - Ignores group changing rules when true. - - - - Serverside send packet telling player about this invite - - - - - Called on server to finalize and remove quest. - - - - - Called by quest details UI to request server to abandon quest. - - - - - Called when there are no responses to choose, but server has indicated a next dialogue is available. - - - - - Called in singleplayer and on the server after client requests NPC dialogue. - - - - - Prevent re-creating it during destroy (e.g. plugin granting rewards) from leaking gameobject. - - - - - White 1x1 texture for solid colored images. - uGUI empty image draws like this, but we need the texture for IMGUI backwards compatibility. - - - - - Is the server this widget represents currently favorited? - Can be false on the favorites list. - - - - - Payload for the DamageTool.damagePlayer function. - - - - - Should armor worn on matching limb be factored in? - - - - - Should game mode config damage multiplier be factored in? - - - - - If player dies should it count towards quests? - - - - - Effect to apply to ragdoll if dead. - - - - - Read 8-bit per channel color excluding alpha. - - - - - Intended as a drop-in replacement for existing assets with property uint16s. - - - - - Is a point safely within the level bounds? - Also checks player clip volumes if legacy borders are disabled. - - - - - Is given Y (vertical) coordinate within level's height range? - Maps using landscapes have a larger range than older maps. - - - - - Notify menus that levels list has changed. - Used when creating/deleting levels, as well as following workshop changes. - - - - - Get level's cached asset, if any. - - - - - Should loading code proceed with redirects? - Disabled by level and when in the editor. - - - - - Placeholder created between unloading the main menu and loading into game or editor. - - - - - Loading screen music. - - - - - Clip to play to fade out loop. - - - - - Useful to narrow down why a player is getting kicked for modified level files when joining a server. - - - - - Display version string of the currently loaded level. - - - - - Version string of the currently loaded level packed into an integer. - - - - - Refreshes known levels and attempts to redirect level reference if it no longer exists. - - - - - Find level matching both name AND workshop file ID (can be zero). - - - - - Load level details from Level.dat in directory path. - - - - - Server list allows player to enter a map name when searching, so we try to find a local - copy of the level for version number comparison. (Server map version might differ.) - - - - - New map filter uses lowercase map name and doesn't need startswith. - - - - - Search all map folders to add any previously unregistered maps. - - - - - Temporary to unbind events because this class is static for now. (sigh) - - - - - Defines how instance methods handle invocation when the target instance does not exist yet, for example - if the target instance is async loading or has time sliced instantiation. - - - - - Invocation should be ignored if the target instance does not exist. - This is the only applicable defer mode for static methods and server methods. - - - - - Invocation will be queued up if the target instance does not exist. - Originally an "Overwrite" mode was considered for cases like SetHealth where only the newest value is - displayed, but this was potentially error-prone if multiple queued methods depended on values from each other. - - - - - Allows Unity events to execute commands from the server. - Messenger context is logged to help track down abusive assets. - - - - - Responsible for loading asset definitions on a separate thread. - - - - - Parser error messages, if any. - - - - - Warning: on worker thread this only acts as handle. Do not access. - - - - - Used on main thread to determine when all queued tasks have finished. - - - - - Loop searching directories recursively for asset bundle and asset definition files. - - - - - Warning: on worker thread this only acts as handle. Do not access. - - - - - Absolute path to *.log file. - - - - - Responsible for the per-process .log file in the Logs directory. - Kept multiple log files in the past, but now consolidates all information - into a single file named Client.log or Server_{Identifier}.log. - - - - - Should setup of the default *.log file be disabled? - - - - - If true, information like IP addresses and login tokens should be censored in vanilla logs. - Nelson 2024-11-11: Special thanks to Jdance and asineth0 in public issue #4740! - - - - - Text to replace with if is enabled. - - - - - *ATTEMPTS* to replace IPv4 address(es) with . - Should only be called if is enabled. - Case-by-case redaction should be preferred for performance reasons over using this function. This function - is intended for third-party messages (e.g., BattlEye) that we don't have control over. - - True if message was modified. - - - - Get logging to path. - - - - - Set path to log to. - - - - - Close current log file. - - - - - Invoked when door is opened/closed, but not when loaded. - - - - - Switches between "legacy" (per-level road textures bundle) and "assets" (using RoadAsset). - - - - - If modifying usage please update support article: - https://support.smartlydressedgames.com/hc/en-us/articles/13452208765716 - - - - - If modifying usage please update support article: - https://support.smartlydressedgames.com/hc/en-us/articles/13452208765716 - - - - - Client has a critical module the server doesn't. - - - - - Server has a critical module the client doesn't. - - - - - Level config's version number does not match. - - - - - EconInfo.json hash does not match. - - - - - Master bundle hashes do not match. - - - - - Server has not received an auth session response from Steam yet. - - - - - Server has not received an economy response from Steam yet. - - - - - Server has not received a groups response from Steam yet. - - - - - Player nickname exceeds limit. - - - - - Player nickname contains invalid characters. - - If modifying usage please update support article: - https://support.smartlydressedgames.com/hc/en-us/articles/13452208765716 - - - - - Player nickname should not be a number. - - - - - Player resources folders don't match. - - - - - The network identity in the ticket does not match the server authenticating the ticket. - This can happen if server's Steam ID has changed from what the client thinks it is. - For example, joining a stale entry in the server list. (public issue #4101) - - - - - Player's skin color is too similar to one of . - - - - - Steam ID reported by net transport doesn't match client's reported Steam ID. - This was exploited to fill the server queue with fake players. - - - - - Received too many connection requests from player in a short window. - - - - - Received too many invalid messages from connection in a short window. - - - - - Server limits how many clients are joining from the same IP address. - (public issue #5001) - - - - - Zero is treated as unset. - - - - - Returned asset is not necessarily a vehicle asset yet: It can also be a VehicleRedirectorAsset which the - vehicle spawner requires to properly set paint color. - - - - - Kept because lots of modders have been using this script in Unity, - so removing legacy effect id would break their content. - - - - - Matches level with same file name AND workshop file ID. - - - - - Version before named version constants were introduced. (2023-11-08) - - - - - Moved into ServerListFilters. - - - - - Exposed for plugins. Can be null. Please do not modify. - - - - - This overload supports legacy Condition_# format. - - - - - This overload doesn't support legacy Condition_# format. - - - - - If true, button tooltip will be overridden with tooltip from states array. - - - - - If true oxygen is restored while in this volume, otherwise if false oxygen is depleted. - - - - - Merges textures used in the level into an atlas to assist runtime draw call batching. - - - - - Skip renderer children of these transforms, if any. - For example we skip lights with material instances and rubble debris. - - - - - Most objects in Unturned use the standard shader without transparency/emissive/detail/etc. - - - - - Meshes we logged an explanation for as to why they can't be atlased. - - - - - Textures we logged an explanation for as to why they can't be atlased. - - - - - Materials we logged an explanation for as to why they can't be atlased. - - - - - Objects instantiated for the lifetime of the level that should be destroyed when exiting the level. - - - - - If true, don't assign texture atlas to material so batched materials are obvious. - - - - - If true, assign a red material to excluded meshes so they are obvious. - - - - - If true, replace each unique material with a colored one before static batching. - - - - - If true, log why texture/material can't be included in atlas. - - - - - If true, log if mesh has UVs outside [0, 1] range. - - - - - We generate a 1x1 texture for materials without one. - - - - - Tracks which mesh filters and skinned mesh renderers were referencing a given mesh. - - - - - Tracks which meshes and materials were referencing a given texture. - - - - - If true, UVs should be centered and overridden because original mesh was not textured. - - - - - Maps original mesh to any mesh filters using it. - When mesh's UVs are modified the mesh filters need to be pointed at the copied mesh. - - - - - Renderers with a material using the texture. - After combining texture the renderers need to be pointed at the combined material. - - - - - Tracks which textures were referencing a given shader. - - - - - StaticBatchingUtility.Combine requires input renderers are enabled and active in hierarchy, - so we temporarily activate/enable them to keep this logic out of LevelObject/ResourceSpawnpoint. - - - - - Payload for the DamageTool.damageAnimal function. - - - - - Should game mode config damage multiplier be factored in? - - - - - If not null and damage is applied, is called with this position. - - - - - Can be added to EquipablePrefab item GameObject to receive events. - - - - - Invoked when item begins inspect animation. - - - - - Entry in the MenuPlayServerCurationUI list. - - - - - In-game rich text does not support embedded YouTube videos, but they look great in the web browser, - so we simply remove them from the in-game text. - - - - - Unfortunately in-game rich text does not have code formatting yet, so remove the tags while preserving text. - - - - - Nelson 2025-01-28: This command reproduces a bug destroying the player gameObject if the vehicle is - destroyed on the same frame as the request to enter. - https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/4760#issuecomment-2613090165 - - - - - Not using rate limit attribute because this is potentially called for hundreds of barricades at once, - and only admins will actually be allowed to apply the transform. - - - - - Only used by plugins. - - - - - See BarricadeRegion.FindBarricadeByRootFast comment. - - - - - For code which does not know whether transform exists and/or even is a barricade. - See BarricadeRegion.FindBarricadeByRootFast comment. - - - - - Does this label fade out as the chat message gets older? - - - - - Chat message values to show. - - - - - Tree activation is time-sliced, so this does not necessarily match whether the region is active. - - - - - Can this tree be damaged? - Allows holiday restrictions to be taken into account. (Otherwise holiday trees could be destroyed out of season.) - - - - - Some new code common to SteamPending and SteamPlayer. - - - - - Realtime the first ping request was received. - - - - - Number of ping requests the server has received from this client. - - - - - Called when a ping request is received from this client. - - - - - Realtime passed since the first ping request was received from this client. - - - - - Average number of ping requests received from this client per second. - Begins tracking 10 seconds after the first ping request was received, or -1 if average is unknown yet. - - - - - Only set on server. Associates player with their connection. - - - - - Used when kicking player in queue to log what backend system might be failing. - - - - - Number of alive zombies. - - - - - Last time a quest boss was spawned. - - - - - Allow another quest to spawn a boss zombie immediately. - - - - - Kills the boss zombie if nobody is around, if the boss was killed it calls UpdateBoss. - - - - - Checks for players in the area with quests and spawns boss zombies accordingly. - - - - - HUD with projected labels for teammates. - - - - - Allows map makers to create custom weather events. - - - - - Does this weather affect fog color and density? - - - - - Does this weather affect sky fog color? - - - - - Does this weather affect cloud colors? - - - - - Directional light shadow strength multiplier. - - - - - Exponent applied to effect blend alpha. - - - - - Exponent applied to effect blend alpha. - - - - - SpeedTree wind strength for blizzard. Should be removed? - - - - - If specified level editor color can be used rather than a per-asset color. - - - - - Remove any existing item alert widgets. - - - - - Open fullscreen alert showcasing newly granted items. - Uses first item for title color, so items should be sorted by priority. - - - - - Open fullscreen alert showcasing newly granted items. - - - - - Handle esc/back key press. - Still really messy, but this used to be inside a huge nested if/elseif in Update. - - - - - Despite being newer code, this is obviously not ideal. Previously the news request was using the Steam HTTP - API which might have been the cause of some crashes, so it was quickly converted to Unity web request instead. - - - - - Invoked when web item is first loaded or reloaded. - - - - - If false this structure cannot take damage. - - - - - Modded structures can disable pooling if they have custom incompatible logic. - - - - - Length of raycast downward from pivot to check floor is above terrain. - Vanilla floors can be placed a maximum of 10 meters above terrain. - - - - - Optional alternative structure prefab specifically for the client preview spawned. - - - - - Called on the dedicated server to optimize client prefab for server usage. - - - - - Compares weather intensity to value. - - - - - Called during startup and when returning to the main menu. - - - - - Result is never null, but may be empty or out-of-date. - - - - - Can be added to Vehicle GameObject to receive events. - - - - - Invoked when any player enters the driver seat. - - - - - Invoked when any player exits the driver seat. - - - - - Invoked when a locally controlled player enters the driver seat. - - - - - Invoked when a locally controlled player exits the driver seat. - - - - - Invoked when a locally controlled player enters the vehicle. - - - - - Invoked when a locally controlled player exits the vehicle. - - - - - Invoked when lock is engaged. - - - - - Invoked when lock is disengaged. - - - - - Invoked when horn is played. - - - - - Invoked after explosion plays. - - - - - Root transform. - - - - - Hit collider's transform. Can be null. - - - - - Tag display name without rich text formatting. To use, for example, in logging, sorting, or with rich color override. - - - - - If true, tag requests name to be displayed in UI with NameColor label color override. - - - - - Color to use in UI when displaying name. - - - - - If HasNameColor is enabled, this is PlainTextName wrapped with NameColor rich text color tags. - If unset, falls back to PlainTextName. - - Nelson 2025-05-02: initially, we allowed enabling any rich text tags in names. But, considering that we - are also using PlainTextName for other color overrides (e.g. "bad" when missing), this will be disappointing - if tags are displayed inconsistently. - - - - - If true, icon should be tinted according to player's foreground color preference. - - - - - Wrap PlainTextName with color rich text tag. - - - - - Wrap PlainTextName with player's font color preference. - - - - - If HasNameColor, get RichTextName. Otherwise, get PlainTextNameWithPreferredFontColor. - - - - - Get sleek color for UI. If HasNameColor, get NameColor. Otherwise, preferred font color. - - - - - Allows Unity events to modify which crafting tags are provided by owning object. - Must be connected to a Crafting Tag Provider. - - - - - GUIDs of Unturned tag assets to modify. - - - - - Add listed tags to provided tags. - - - - - Remove listed tags from provided tags. - - - - - Apply only if this component is active and enabled. - - - - - Apply only if this component is inactive and/or disabled. - - - - - Always apply. - - - - - Get wrapper method rather than Awake because component might be inactive but should still apply modifiers. - - - - - Used for item placement in displays / holsters, and whether useable can be placed in primary/secondary slot. - - - - - Cannot be placed in primary nor secondary slots, but can be equipped from bag. - - - - - Can be placed in primary slot, but cannot be equipped in secondary or bag. - - - - - Can be placed in primary or secondary slot, but cannot be equipped from bag. - - - - - Only used by NPCs. - - - - - Can be placed in primary, secondary, or equipped while in bag. - - - - - Project current field of view onto screen compared to desired field of view. - - - - - Multiply sensitivity according to scope/optic zoom. For example an 8x zoom has 1/8th sensitivity. - - - - - Preserve how sensitivity felt prior to 3.22.8.0 update. - - - - - Do not adjust sensitivity while aiming. - - - - - When held the cursor is released. - - - - - If held while clicking a blueprint action in the item context menu, the crafting menu is bypassed. - - - - - Replace instances of with their bound key text. - Allows server effects to display plugin hotkeys. - - - - - Item 0 is "1" and item 9 is "0" - - - - - Multiplier for Input.GetAxis("mouse_x") and Input.GetAxis("mouse_y") - - - - - When held the cursor is released. - - - - - If held while clicking a blueprint action in the item context menu, the crafting menu is bypassed. - - - - - Broadcasts once all workshop assets are finished installing. - - - - - Called once the server is done registering items it wants to install. - - True when running in offline-only mode. - - - - Request for details about the pending items. - - - - - File IDs of all the items we have enqueued for query. - - - - - Built from user-specified workshop item IDs, and then expanded as the query results - arrive with details about any dependent or child items. - - - - - File IDs requested by the latest query submitted. - - - - - Number of times we've tried re-submitted failed queries. - - - - - Built as the valid list of items arrive. - - - - - ID of the latest item we requested for download so that we can test if the callback is for us. - - - - - Enqueue an item if we have not queried it yet. This guards against querying an item - that is in two separate collections leading to duplicates. - - - - True if item was installed from cache. - - - - Used in offline-only mode. - - - - - Prepare a query that will request metadata for all the workshop items we want to install. - This allows us to check if the items are allowed to be auto-downloaded to this server, and to - detect any child or dependent items. - - Waits for onQueryCompleted. - - - - - Re-submit previous query after a query failure. - - - - - If level is using underground whitelist then conditionally clamp world-space position. - - - - - If level is using underground allowlist then conditionally clamp world-space position. - - - - - Used by animals and zombies to teleport to a spawnpoint if outside the map. - - - - - Used by housing validation to check item isn't placed underground. - - - - - Almost every menu has a container element for its contents which spans the entire screen. This element is then - animated into and out of view. In the IMGUI implementation this was fine because containers off-screen were not - processed, but with uGUI they were still considered active. To solve the uGUI performance overhead this class - was introduced to disable visibility after animating out of view. - - - - - Payload for the EffectManager.triggerEffect method. - - - - - Required effect to spawn. - - - - - World-space position to spawn at. - - - - - Local-space scale. Defaults to one. - - - - - If running as server should this effect be replicated to clients? - Defaults to true. Set to false for code that is called on client AND server. - - - - - Should the RPC be called in reliable mode? Unreliable effects might not be received. - - - - - Was a player directly responsible for triggering this effect? - For example grenade explosions are instigated by players, whereas zombie acid explosions are not. - Used to prevent mod damage on the effect prefab from hurting players on PvE servers. - - - - - Players within this radius will be sent the effect unless the effect overrides it. - Defaults to 128. - - - - - Get world-space rotation for the effect. - - - - - Set world-space rotation for the effect. - - - - - World-space rotation for the effect. - - - - - If true, rotation was specified by setter methods. - Required for backwards compatibility because `direction` field is public. - - - - - Only send the effect to the given player, if set. - - - - - Only send the effect to the given players, if set. - Otherwise relevantDistance is used. - - - - - Only send the effect to the given player, if set. - - - - - World-space direction to orient the Z axis along. Defaults to up. - - - - - Nelson 2025-04-08: newer code should probably use CachingAssetRef instead. (Or CachingLegacyAssetRef if legacy - ID support is necessary.) - - - - - Whether the asset has been assigned. Note that this doesn't mean an asset with exists. - - - - - Is this asset not assigned? - - - - - True if resolving this asset reference would get that asset. - - - - - Resolve reference with asset manager. - - - - - GUID of the asset this is referring to. - - - - - Each quality tier has different rarities. - Legendary: 5% Epic: 20% Rare: 75% - - - - - Each item has an equal chance regardless of quality. - - - - - Kept because lots of modders have been these scripts in Unity, - so removing legacy effect id would break their content. - Note: unsure about this one because it is private and not serialized. - - - - - Sorts higher rarity items into the front of the list. - - - - - Set handles pivot point according to selection transform. - Doesn't apply if handle is currently being dragged. - - - - - If Unturned is loading this asset bundle from a Steam workshop file but the file ID does not match then - loading will be canceled. Prevents the asset bundle from being easily copied/stolen. - - - - - Same as ownerWorkshopFileId for cases where the asset bundle is allowed in multiple uploads. - - Uploading the same asset bundle multiple times is not ideal because the game doesn't handle - multiple of them with the same name well, and Unity logs an error if an asset bundle with the - same files is already loaded. That being said, the game doesn't handle dependencies between - workshop files well either (as of 2023-01-12), so this is perhaps the lesser of two evils. - - My understanding is that some mod creators license their work to multiple servers that upload - the files and this property will make it easier so it doesn't need to be re-exported multiple times. - - - - - Helpers on the dedicated server to optimize client prefabs for server usage. - - - - - Optimize client prefab for server usage. - - - - - If true, object is within a culling volume. - Name is old and not very specific, but not changing because it's public. - - - - - Transform created to preserve objects whose assets failed to load. - Separate from default transform to avoid messing with old behavior when transform is null. - - - - - If true, can be instantiated. Defaults to true. - Enables mappers to remove culling volumes embedded in objects if they're causing issues. - - - - - Can this object's rubble be damaged? - Allows holiday restrictions to be taken into account. (Otherwise holiday presents could be destroyed out of season.) - - - - - Object activation is time-sliced, so this does not necessarily match whether the region is active. - - - - - Defaults to true because most objects are not inside a culling volume. - - - - - Used by InteractableObjectBinaryState to indicate whether it wants navGameObject to be active. It's only - active if both IOBS and Rubble want it active. - - - - - Used by InteractableObjectRubble to indicate whether it wants navGameObject to be active. It's only - active if both IOBS and Rubble want it active. - - - - - Used if the object asset has weather blend alpha conditions. - - - - - Used if the object asset has weather status conditions. - - - - - Callback when an individual quest flag changes for the local player. - Refreshes visibility conditions if the flag was relevant to this object. - - - - - Separate from UpdateActiveAndRenderersEnabled so graphics settings can call it. - - - - - Assume renderers default to enabled. - - - - - Combine two existing 20-byte hashes. - - - - - Utility to hash a stream of bytes over several frames. - - - - - [0, 1] percentage progress through the stream. - - - - - Advance 1MB further into the stream. - - True if there is more data, false if complete. - - - - Get the computed hash after processing stream. - - - - - If true, visible in chart and satellite UIs. - - - - - Multiplier for explosive projectile damage. - - - - - Multiplier for explosive projectile's blast radius. - - - - - Multiplier for explosive projectile's initial force. - - - - - Should amount be filled to capacity when detached? - - - - - Nelson 2024-10-18: Moved to a constant because clients need this value for footsteps and they don't have the - character controller component. - - - - - Jump speed = sqrt(2 * jump height * gravity) - Jump height = (jump speed ^ 2) / (2 * gravity) - With 7 speed and 9.81 * 3 gravity = apex height of 1.66496772 - - - - - Note: Only UpdateCharacterControllerEnabled should modify whether controller is enabled. - (turning off and back on is fine though) - - - - - Valid while isRadiated. - - - - - Set according to volume or level global asset fallback. - - - - - Was set to true during teleport, and restored to false during the next movement tick. - - Server pauses movement when this is set until next client update that matches, - in order to prevent rubberbanding following a teleport. - - - - - Used instead of actual position to avoid revealing admins in "vanish" mode. - - - - - Flag for plugins to allow maintenance access underneath the map. - - - - - Get seat (if any), otherwise null. - - - - - Serverside force player to exit vehicle regardless of safe exit points. - - True if player was seated in vehicle. - - - - Dedicated server simulate while input queue is empty. - - - - - Dedicated server simulate driving input. - - - - - Client and dedicated server simulate walking input. - - - - - In the future this can probably replace checkGround for locally simulated character? - (Unturned only started using OnControllerColliderHit on 2023-01-31) - - 2023-02-28: be careful with .gameObject property because it returns .collider.gameObject - which can cause a null reference exception. (public issue #3726) - - - - - Examine a store listing with description text. - - - - - Only visible when cart is not empty. - - - - - Convert 32-bit version into 8-char string. - String is advertised on server list for clients to filter their local map version. - - - - - Parse 32-bit version from 8-char string. - String is advertised on server list for clients to filter their local map version. - - - - - These server relay variables redirect the client to another server when the menu opens - similar to how Steam sets the +connect string on game startup. Allows plugin to redirect - player to another server on the same network. - - - - If true the server is immediately joined, otherwise show server details beforehand. - - - - If player gets too far away from this storage while using it, should we close out? - False by default for trunk storage because player is inside vehicle. - Plugins needed to be able to set this to false for "virtual storage" plugins, - so we default to false and set to true if asset enables it. - - - - - Keep all the uGUI Canvas sort orders in the same place. - - - - - Manually created canvas in the Menu scene. - - - - - Devkit canvas in the Setup scene. - - - - - Dropdowns, drag-drop content, tab destinations, etc. - - - - - Devkit tooltips should be visible over all other devkit content. - - - - - uGUI glazier contains tooltips and cursor regardless of mode (e.g. devkit), so takes absolute priority. - - - - - Plugins were spawning canvases with high sort orders that showed over the loading screen, so as a hacky - workaround we put the uGUI loading screen on a higher sort order than normal glazier. - - - - - uGUI cursor needs to show above plugin canvas. - Unity exposes sort order as an int32, but it is actually an int16, so this value is slightly below the 32767 max. - - - - - Worst case scenario, maybe shotgun hit or fast spray SMG. - - - - - Tags how client expects server to use a raycast input. - For example, client may think they fired a gun while server thinks they dequipped the gun, - so tagging the input prevents the server from handling it as a punch instead. - - - - - Resulting transform.position immediately after movement.simulate was called. - - - - - Calls to UseableGun.tock per second. - - - - - Called for every input packet received allowing plugins to listen for a few special - keys they can display in chat/effect UIs. - - - - - Whether client is currently penalized for potentially using a lag switch. False positives are relatively - likely when client framerate hitches (e.g. loading dense region), so we only modify their stats (e.g. reduce - player damage) for a corresponding duration. - - - - - Server tracks history of this player's bounding box to assist with validating hits. - Some padding is added to reduce false positives sliding against walls (substep) and - player movement inside vehicles. - - - - - Get the hit result of a raycast on the server. Until a generic way to address net objects is implemented - this is how legacy features specify which player/animal/zombie/vehicle/etc they want to interact with. - - - - - Ideally simulation frame number would be signed, but there is a lot of code expecting unsigned. - - - - - Can be enabled in the unity inspector to test that discarding inputs recovers properly. - - - - - askInput is always called the same number of times per second because it's run from FixedUpdate, - but the spacing between calls can vary depending on network and whether client FPS is low. - - - - - If average askInput calls per second exceeds this, we either ignore their request or flat-out kick them. - - - - - If average askInput calls per second exceeds this we silently kick them. - - - - - Number of times askInput has been called by client. - Even with huge packet loss, we know that - - - - - Realtime that the first call to askInput was made by the client. - - - - - Realtime that the previous askInput kick test was performed. - - - - - Set rollingWindowIndex to newIndex, zeroing all input counts along the way. - Important to zero the intermediary indexes in-case server stalled for more than one second. - - - - - Notify client there has been a prediction error, so movement needs to be re-simulated. - - - - - Notify client old inputs can be discarded because they were predicted correctly. - - - - - Not using rate limit attribute because it internally keeps a rolling window limit. - - - - - Only bound on dedicated server. - When dieing in a vehicle this prevents delay handling packets. - - - - - Counter of simulation frames before fake lag penalty is disabled. - - - - - Player damage multiplier while under penalty for fake lag. (10%) - - - - - If set, this item is prioritized over equipped cosmetics. Used by item inspect menu. - Admittedly, this is very hacked-together. Hopefully rewriting this file someday? - - - - - Is cosmetic or skin equipped? - - - - - Merging the devkit, legacy, and housing transform handles into one place. - - - - - Position and plane handles for each axis. - - - - - Disc handles for each axis. - - - - - Scale handles for each axis. - - - - - Position handles on each side of box. - - - - - Scale handles on each side of box which both move and resize the box. - - - - - Invoked when handle is clicked so that tool can save selection transform relative to pivot. - This avoids floating point precision loss of applying delta for each Transformed event. - - - - - Invoked when handle is dragged and value actually changes. - - - - - Invoked when handle is dragged and value actually changes. - - - - - Preferred mode only takes effect while not dragging. - Bounds modes fall back to non-bounds modes if bounds are not set. - - - - - Pivot only takes effect while not dragging. This is to help ensure - the caller does not depend on the internal pivot values. - - - - - Somewhat hacky, useful to make the "copy-paste transform" feature easier to implement. - Invoke tranformed callback as if pivot were manually dragged to the new position and rotation. - - - - - Called before raycasting into the regular physics scene to give transform tool priority. - - - - - Update properties that depend on the transform of the camera relative to our handles. - - - - - Center of handle. - - - - - Rotation of handle. - - - - - True if pivotBounds is non-zero. - - - - - Mouse currently over this handle. - - - - - Mouse currently dragging this handle. - - - - - Direction from camera toward pivot. - - - - - Multiplier according to distance between camera and pivot to keep handles a constant on-screen size. - - - - - Multiplier to flip axis handles according to which side the camera is on. - - - - - Pivot rotation when rotation drag started. - - - - - Rotating around this axis. - - - - - Direction from circle center to edge point. - - - - - Point on the edge of the circle. - - - - - Drag along this tangent to the circle. - - - - - Does having this item show the compass? - - - - - Does having this item show the chart? - - - - - Does having this item show the satellite? - - - - - Ideally component Awake/Start order should not matter, but Unturned's menu is a mess. - For most players the default order was fine, but it seems it was not deterministic so it would break for some players. - - - - - Index into per-connection rate limiting array. - - - - - Number of server methods with rate limits. - - - - - Log all known net methods. - - - - - Useful debug check to ensure every built-in handle is claimed exactly once. - - - - - This class gets used from type initializers, so Unity's built-in log is not an option unfortunately. - - - - - Not *really* supported but *might* probably work. Adding for public discussion #4176. - - - - - Kept for backwards compatibility with plugins. - - - - - Can be added to EquipablePrefab item GameObject to receive events. - - - - - Invoked when gun is fired. - - - - - Invoked when gun begins reload sequence. - - - - - Invoked when gun begins hammer sequence. - - - - - Invoked when gun begins aiming. - - - - - Invoked when gun ends aiming. - - - - - Invoked when Magazine game object is activated. - - - - - Invoked when Magazine game object is activated. - - - - - TextMesh Pro uGUI text components. - - - - - TextMesh Pro uGUI input field components. - - - - - Exposed for Rocket transition to modules backwards compatibility. - - - - - This effect makes a nice clicky sound and lots of older code used it, - so I moved it into a little helper method here. - - - - If true, client will download the image once and re-use it for subsequent calls. - If true, client will destroy any cached copy of the image and re-acquire it. - - - - Notify server that a button was clicked in a clientside effect. - - - - - Notify server that an input field text was committed. - - - - - If an effect with a given key exists, destroy it. - - - - - parent should only be set if that system also calls ClearAttachments, otherwise attachedEffects will leak memory. - - - - - Helper for sending and spawning effects. - Newer and refactored code should use this method. - - - - - Objects registered so that they can be destroyed all at once if needed. - May be null if they were destroyed with a timer. - - - - - Plugin UIs spawned by the server. - - - - - Called prior to destroying effect (if attached) to free up attachments list. - - - - - Called after attaching effect so that it can be returned to pool when/if parent is destroyed. - - - - - Maps root transform to any attached effects. - This allows us to detach effects when returning a barricade/structure to their pool. - - - - - Recycled lists for attachedEffects dictionary. - - - - - Find materials in finished ragdoll and replace them with the appropriate effect. - - - - - Context for the Assets.ReportError methods. - Nelson 2024-11-20: Converted from directly using asset to this interface so that asset-related features can - more easily log warnings to the in-game menu. - - - - - Format text to prefix any errors reported in this context. (e.g., this asset's name and ID) - - - - - Alerts any agents in the area to the player if needed. - - The player causing this alert. - The position of the alert. - The detection radius. - Whether or not to hide. - - - - Alerts any agents in the area. - - The position of the alert. - The detection radius. - - - - Report success or failure from game systems, conditionally compiled into the Windows 64-bit build. - - - - - Call when the server is done all loading without running into errors. - Ignored if not running in CI mode, otherwise exits the server successfully with error code 0. - - - - - Call when the server encounters any error. - Ignored if not running in CI mode, otherwise exits the server with error code 1. - - - - - Entry in the MenuPlayServerCurationRulesUI list. - - - - - Seconds to wait between burning one unit of fuel. - - - - - Number of seconds to finish growing. - - - - - Item legacy ID to grant the player. - - - - - Uses unscaled time (realtime) because "planted" time is a timestamp. - - - - - Created when a chat entry is received from the server for display in the UI. - - - - - Player who sent the message, or null if it was a plugin broadcast. - Used to retrieve player avatar. - - - - - Web address of a 32x32 .png to use rather than a platform avatar. - Only used if not null/empty. - - - - - How the message was sent through global, local or group. - Mostly deprecated because that status isn't formatted into texts anymore. - - - - - Default font color to use unless overridden by rich text formatting. - - - - - Whether this entry should enable rich text formatting. - False by default because players abuse font size and ugly colors. - - - - - Text to display for this message. - - - - - When the entry was locally received from the server. - - - - - How many seconds ago this message was locally received from the server. - - - - - Event for plugins to be notified when a server update is detected. - - Pandahut requested this because they run the game as a Windows service and need to shutdown - through their central management system rather than per-process. - - - - - Manages scheduled restart for dedicated server. - - - - - Sorted from low to high. - - - - - Sorted from low to high. - - - - - Non-NPC object the player can talk with. - - - - - Broadcasts for plugins before applying consumeable stats to another player. - - - - - Broadcasts for plugins after applying consumeable stats to another player. - - - - - Broadcasts for plugins before applying consumeable stats to self. - - - - - Broadcasts for plugins after applying consumeable stats to self. - - - - - Called serverside when using consumeable on another player. - - - - - Called by owner and server when using consumeable on self. - - - - - If false, a deny rule matched the input. - - - - - If true, at least one rule matched the input. - - - - - If set, this was the final match. - - - - - Optional. If set, filled with any rules that matched. - - - - - If >0, this link was added by live config. - - - - - Determines how a server that doesn't match any rules is handled. - - - - - Include in the list. Default. - - - - - Exclude from list. (same as EServerListCurationDenyMode.Hide) - - - - - Move to the bottom of the list. Similar to EServerListCurationDenyMode.MoveToBottom, but the server is - still clickable. I.e., low priority. - - - - - Called earlier during startup to try and have web lists ready by the time server browser is opened. - - - - - Used to detect asset refresh. - - - - - If true, list needs to be sorted. - - - - - If true, MergeRules should be called before doing any filtering. - - - - - If false, LoadWebUrls still needs to be called. - - - - - For non-repeat weapons the "Use" audio clip is played once time reaches this point. - - - - - Catch exceptions to prevent a broken powerable from breaking all the other powerable items in the area. - - - - - Unsorted list of world space generators turned-on and fueled. - - - - - Allows Unity events to broadcast text chat messages from the server. - - - - - Text to use when SendDefaultTextChatMessage is invoked. - - - - - URL of a png or jpg image file to show next to the message. - - - - - Text color when rich text does not override with color tags. - - - - - Should rich text tags be parsed? - e.g. bold, italic, color - - - - - Allows Unity events to spawn vehicles. - - - - - Recoil magnitude multiplier while the gun is aiming down sights. - - - - - Multiplier for gun's Aim_In_Duration. - - - - - For backwards compatibility this is *subtracted* from the gun's firerate, so a positive number decreases - the time between shots and a negative number increases the time between shots. - - - - - Multiplier for normal bullet damage. - - - - - Multiplier for bullet acceleration due to gravity. - - - - - Movement speed multiplier while the gun is aiming down sights. - - - - - If true, gun can damage entities with Invulnerable tag. Defaults to false. - - - - - Name to use when instantiating attachment prefab. - By default the asset guid is used, but it can be overridden because some - modders rely on the name for Unity's legacy animation component. For example - in Toothy Deerryte's case there were a lot of duplicate animations to work - around the guid naming, simplified by overriding name. - - - - - Returns true if calibers list contains provided caliber ID. - - - - - Returns true if calibers list contains any of the provided caliber IDs. - - - - - Note: If barricade is attached to a vehicle this is the local rotation. - - - - - Extensions to the built-in Physics class. - - Shares similar functionality to the SDG.Framework.Utilities.PhysicsUtility class, but that should be moved here - because the "framework" is unused and and the long name is annoying. - - - - - Wrapper that respects landscape hole volumes. - - - - - Wrapper that respects landscape hole volumes. - - - - - Wrapper that respects landscape hole volumes. - - - - - Wrapper that respects landscape hole volumes. - - - - - Button in a list of levels. - - - - - Button in the list of levels for server browser filters. - - - - - Button in the list of levels for the map editor. - - - - - Base class for IMGUI implementations of primitive building block widgets. - - - - - Position passed into the GUI draw methods. - - - - - Hashes for Windows, Linux, and Mac asset bundles. - Only loaded on the dedicated server. Null otherwise. - - - - - Does given hash match any of the platform hashes? - - - - - Compares client asset bundle hash with server known hashes. - - - - - Called by asset startup to cache which bundles are eligible for hashing. - - - - - Used in a test scene to quickly test all Glazier features. - - - - - Reference type for testing SleekList. - - - - - Uses the Win32 API to force a console to be created and destroyed. - - - - - Should we manually create and destroy a Win32 console? - Useful for IO on Windows desktop, but not as much for dedicated machines. - - - - - Allocate Windows console if enabled. - - - - - Free Windows console if enabled. - - - - - A CTRL+C signal was received, either from keyboard input or from a signal generated by the GenerateConsoleCtrlEvent function. - - - - - A CTRL+BREAK signal was received, either from keyboard input or from a signal generated by GenerateConsoleCtrlEvent. - - - - - A signal that the system sends to all processes attached to a console when the user closes the console - (either by clicking Close on the console window's window menu, or by clicking the End Task button command from Task Manager). - - - - - Tracks whether we should show the "NEW" label on listings and item store button. - - - - - Track that player has seen the new crafting blueprints. - - - - - Track that player has seen the page with all new listings. - - - - - Has player seen the given listing? - - - - - Track that the player has seen the given listing. - - - - - Absolute path to directory containing bundle and .dat file. - - - - - Name of the actual asset bundle file, e.g. Hawaii.unity3d - Asset bundle should be next to this config file. - - - - - assetBundleName without final .* extension. - - - - - Prefixed to all asset paths loaded from asset bundle. - Final path is built from assetPrefix + pathRelativeToBundlesFolder + assetName, - e.g. Assets/Hawaii/Bundles + /Objects/Large/House/ + Object.prefab - - - - - Custom asset bundle version used by Unturned to detect whether imports need - fixing up because they were exported from an older version of Unity. - - - - - Get absolute path to asset bundle file. - - - - - Get absolute path to file with per-platform hashes. - - - - - Insert path prefix if set. - - - - - When to use this instead of formatAssetPath? MasterBundleReference and AudioReference repeatedly invoke - this string formatting (e.g., footstep sounds) and benefit from not generating that garbage. - - - - - Loaded asset bundle. - - - - - Hash of loaded asset bundle file. - This is per-platform, so the server loads a hash file with all platform hashes. - - - - - True if the server .hash file exists. - Hash file is not used by client, but client uses whether it exists to decide whether to include asset bundle hash in asset hash. - - - - - Hashes for Windows, Linux, and Mac asset bundles. - Only loaded on the dedicated server. Null otherwise. - - - - - On the surface level this is rather silly. - The primary reason for it is reducing garbage created by repeated calls to formatAssetPath. - Theoretically we could use this for caching redirected paths if/when that feature is added. - - - - - Load the underlying asset bundle. - - - - - If true, the associated asset bundle couldn't be loaded and was instead copied from another config. - - - - - If the type name has been redirected this method will be called recursively until the most recent name is found and returned. - - - - - After the key "limit" is loaded we stop reading. - - - - - Path to the folder which contains the Unity player executable. - - - - - Called by loading after landscapes (and legacy conversion) have been loaded. - - - - - True is solid and false is empty. - - - - - Marked true when level editor or legacy hole volumes modify hole data. - Defaults to false in which case holes do not need to be saved. - - Initially this was not going to be marked by hole volumes because they can re-generate the holes, but saving - hole volume cuts is helpful when upgrading to remove hole volumes from a map. - - - - - If true, SetHeightsDelayLOD was called without calling SyncHeightmap yet. - - - - - If true, SetHolesDelayLOD was called without calling SyncTexture yet. - - - - - Heightmap-only data used in level editor. Refer to Landscape.DisableHoleColliders for explanation. - - - - - Call this when done changing material references to grab their textures and pass them to the terrain renderer. - - - - - If a heightmap coordinate is out of bounds the tile/heightamp coordinate will be adjusted so that it is in bounds again. - - - - - If a splatmap coordinate is out of bounds the tile/splatmap coordinate will be adjusted so that it is in bounds again. - - - - - Hacky workaround for height and material brushes in editor. As far as I can tell in Unity 2019 LTS there is no method to ignore - holes when raycasting against terrain (e.g. when painting holes), so we use a duplicate TerrainData without holes in the editor. - - - - - Is point (on XZ plane) inside a masked-out pixel? - - - - If the highest weight layer is ignoreLayer then the next highest will be returned. - - - If the highest weight layer is ignoreLayer then the next highest will be returned. - - - - Appends heightmap vertices to points list. - - - - - Appends heightmap vertices to points list. - - - - - Call this after you're done adding new tiles. - - - - - Call this to sync a new tile up with nearby tiles. - - - - - Capturing ortho view of map, so we raise the terrain to max quality. - - - - - Finished capturing ortho view of map, so we restore the terrain to preferred quality. - - - - - Nelson 2025-03-10: I want to experiment whether this fixes a strange terrain hole painting bug (public issue - #4851) without potentially introducing crashes for other players. (Per an earlier, undated comment we'd - run into a SetHolesDelayLOD-related crash in 2019 LTS.) - - - - - Directly blend current value toward target value. - - - - - Only blend current value toward target value if current is greater than target. - - - - - Only blend current value toward target value if current is less than target. - - - - - If true, write to LevelHierarchy file. - False for externally managed objects like legacy lighting WaterVolume. - - - - - If true, editor tools can select and transform. - False for items like the object-owned culling volumes. - - - - - Hold onto collider and gameobject separately because collider isn't necessarily attached to gameobject. - - - - - Kept because lots of modders have been using this script in Unity, - so removing legacy effect id would break their content. - - - - - If per-weather mask AND is non zero the weather will blend in. - - - - - Distinguishes from zero falloff which may be useful deep in a cave. - - - - - Higher priority volumes override lower priority volumes. - - - - - When falloff is OFF, how long to fade in audio by time. - - - - - When falloff is OFF, how long to fade out audio by time. - - - - - When falloff is OFF, how long to fade in audio by time. - - - - - When falloff is OFF, how long to fade out audio by time. - - - - - When falloff is OFF, how long to fade in lighting by time. - - - - - When falloff is OFF, how long to fade out lighting by time. - - - - - Used by lighting to get the currently active effect. - - - - - Open a new transaction group which stores multiple undo/redoable actions, for example this would be called before moving an object. - - - - - Close the pending transaction and finalize any change checks. - - - - - Clear the undo/redo queues. - - - - - If false this transaction is ignored. If there were no changes at all in the group it's discarded. - - - - - Called when history buffer is too long so this transaction is discarded. - - - - - Save the state of all the fields and properties on this object to the current transaction group so that they can be checked for changes once the transaction has ended. - - - - - Kept because lots of modders have been using this script in Unity, - so removing legacy effect id would break their content. - - - - - Called when we position, rotate or scale this transform. - - - - Identical to this object. - - - - Devkit objects are now converted to regular objects and excluded from the file when re-saving. - - - - - Hacked to check horizontal distance. - - - - - Nelson 2024-06-10: Changed this from guid to string because Unity serialization doesn't support guids - and neither does the inspector. (e.g., couldn't duplicate reward volume without re-assigning guid) - - - - - If true, vehicles overlapping volume will check conditions and (if met) grant rewards to passengers. - - - - - ModuleHook looks for module entry/exit points, then calls when enabled and when disabled. - - - - - Register components of this module. - - - - - Cleanup after this module. - - - - - Holds module configuration. - - - - - Whether to load assemblies. - - - - - Directory containing Module file, set when loading. - - - - - Path to the Module file, set when loading. - - - - - Used for module dependencies. - - - - - Nicely formatted version, converted into . - - - - - Used for module dependencies. - - - - - Modules that must be loaded before this module. - - - - - Relative file paths of .dlls to load. - - - - - Wraps module assembly and handles initialization. - - - - - True when config is enabled and dependencies are enabled. - - - - - Metadata. - - - - - Assembly files loaded. - - - - - Types in the assemblies of this module. Refer to this for types rather than the assemblies to avoid exception and garbage. - - - - - How far along the initialization to shutdown lifecycle this module is. - - - - - Runs before everything else to find and load modules. - - - - - Temporarily contains Unturned's code untils it's moved into modules. - - - - - Temporarily contains types. - - - - - Should module assemblies be loaded? - - - - - Called once after all startup enabled modules are loaded. Not called when modules are initialized due to enabling/disabling. - - - - - Called once after all modules are shutdown. Not called when modules are shutdown due to enabling/disabling. - - - - - Find modules containing an assembly with the Both_Required role. - - Modules to append to. - - - - Find module using dependency name. - - - - - - These are *.dll files discovered in the modules folder. - - - - - Should missing DLLs be logged? - Opt-in because RocketMod has its own handler. - - - - - Should vanilla search for *.dll files? - Can be turned off in case it conflicts with third-party search mechanism. - - - - - If set, search for .dll and .module files in this directory instead of in Unturned/Modules. - - - - - Event for plugin frameworks (e.g., Rocket) to override AssemblyResolve handling. - - - - - Depending on the platform, assemblies are found in different directories. - - Root folder for modules. - - - - Search Modules directory for .dll files and save their AssemblyName to discoveredNameToPath. - - - - - Search Modules directory for .module files and load them. - - - - - Orders configs by dependency and removes those that are missing files. - - - - - Sorts modules by dependencies. - - - - - Nicely formatted version, converted into . - - - - - Used for module dependencies. - - - - - Requested by Trojaner. LoadFile locks the file while in use which prevents OpenMod from updating itself. - - - - - Equivalent to MonoBehaviour.Update - - - - - Equivalent to MonoBehaviour.FixedUpdate - - - - - Useful when caller is not a MonoBehaviour, or coroutine should not be owned by a component which might get - deactivated. For example attached effects destroy timer should happen regardless of parent deactivation. - - - - - Stop a coroutine started by InvokeAfterDelay. - - - - - For use with PoolablePool when no special construction is required. - - - - - Called when this instance is getting claimed. - - - - - Called when this instance is returned to the pool. - - - - - Number of items in underlying queue. - - - - - Pool of objects that implement the IPoolable interface. - - Useful for types that do not need special construction, - and want notification when claimed and released. - - - - - Not necessarily cheap to calculate - probably best to cache. - - - - - Internal cubic meter volume. - - - - - Surface square meters area. - - - - - Nelson 2024-11-11: Collider may have been destroyed by an unexpected mod script configuration (or perhaps - simply missing in the first place). Should fix/prevent public issue #4749. - - - - - Replacement foliage storage with all tiles in a single file. - - In the level editor all tiles are loaded into memory, whereas during gameplay the relevant tiles - are loaded as-needed by a worker thread. - - - - - Entry point for worker thread loop. - - - - - Order is important because TileBecameRelevant is called from the closest tile outward. - - - - - Offsets into blob for per-tile data. - - - - - Tiles save an index into this list rather than guid. - - - - - Offset from header data. - - - - - Data-only FoliageInstanceList shared between threads. - - - - - Data-only FoliageTile shared between threads. - - - - - Ready to be released to the worker thread during the next lock. - - - - - Mutex lock. Only used in the main thread Update loop and worker thread loop. - - - - - SHARED BY BOTH THREADS! - Coordinates requested by main thread for worker thread to read. - This is a list because while main thread is busy the worker thread can continue reading. - - - - - SHARED BY BOTH THREADS! - Tiles read by worker thread ready to be copied into actual foliage tiles on main thread. - - - - - SHARED BY BOTH THREADS! - Main thread has finished using this tile data and it can be released back to the pool on the worker thread. - This is a list because main thread could have populated multiple foliage tiles while the worker thread was busy reading. - - - - - Lifecycle: - 1. Worker thread claims or allocates data. - 2. Worker thread passes data to main thread. - 3. Main thread copies data over to actual foliage tile. - 4. Main thread passes data back to worker thread. - 5. Worker thread releases data back to pool. - - - - - Does this tile contain any placed foliage? - - - - - If true, mesh is not loaded when clutter is turned off in graphics menu. - Defaults to false. - - - - - Foliage to use during the Christmas event instead. - - - - - Foliage to use during the Halloween event instead. - - - - - Get asset ref to replace this one for holiday, invalid to disable, or null if it should not be redirected. - - - - - Responsible for reading and writing persistent foliage data. - - - - - Called after creating instance for level, prior to any loading. - Not called when creating the auto-upgrade instance for editorSaveAllTiles. - - - - - Called prior to destroying instance. - - - - - Called when tile wants to be drawn. - - - - - Called when tile no longer wants to be drawn. - - - - - Called during Unity's Update loop. - - - - - Load known tiles during level load. - - - - - Save tiles during level save. - - - - Should angle limits and subtractive volumes be respected? Disabled when manually placing individually. - If true, trees do a sphere overlap to prevent placement inside objects. - - - - Pick a point inside the bounds to test for foliage placement. The base implementation is completely random, but a blue noise implementation could be very nice. - - - - - Legacy implementation of foliage storage, with one file per tile. - - - - True if other IFoliageSurface methods can be called. - - - - Settings configured when starting the bake. - - - - - Implementation of tile data storage. - - - - - Nelson 2025-04-22: instanced foliage rendering is a decent chunk of CPU time. In retrospect this seems like - an obvious optimization: Graphics.DrawMeshInstanced accepts up to 1023 instances per call. Each tile - groups instances in lists of up to 1023, but often isn't that high. Now, we collect instances until we - hit the 1023 limit. This is particularly useful for sparse variants like colored flowers. - With a consistent camera transform ("/copycameratransform") on an upcoming map remaster I went from between - 0.72-0.8 ms on my PC to 0.55-0.6 ms! - - - - - 2022-04-26: drawTiles previously looped over a square [-N, +N] from the upper-left to the bottom-right, - and each tile checked radial distance. We can improve over this by pre-computing the radial offsets and - starting from the center to improve responsiveness. N is [1, 5] - - - - - Must be within [0, MAX_MATRICES_PER_BATCH] range. - - - - Version number associated with this particular system instance. - - - - - Automatically placing foliage onto tiles in editor. - - - - - 2022-04-26: this used to be environment layer, but "scope focus foliage" can draw outside that render distance - so we now use the sky layer which is visible up to the far clip plane. - - - - - Whether add can be called from the inspector. - - - - - Whether remove can be called from the inspector. - - - - - Called when the inspector adds an element. - - - - - Called when the inspector removes an element. - - - - - Called when the inspector sets an element to a different value. - - - - - Whether add can be called from the inspector. - - - - - Whether remove can be called from the inspector. - - - - - All water tiles and the planar reflection component reference this material. - - - - - If true rain will be occluded below the surface on the Y axis. - - - - - Flag for legacy sea level. - - - - - Water volume marked as being sea level. - - - - Null if under old water level, otherwise the volume. - - - - Find the water elevation underneath point, or above point if underwater. - - - - - Reads data into the data array. - - The file path to read from. - The array to read into. - Whether the read succesfully executed. - - - - Writes data out of data array. - - The file path to write to. - The array to write from. - The length of the array with data. - Whether the write succesfully executed. - - - - Checks the size of a file. - - The file path to check. - The size of the file. - Whether the check succesfully executed. - - - - Checks whether the path already exists. - - The file path to check. - Whether the file exists. - Whether the check succesfully executed. - - - - Deletes the path. - - The file path to delete. - Whether the deletion succesfully executed. - - - - For once the provider interface actually came in useful! - Fakes loading the Steam remote storage files from a separate folder. - - - - - Triggered when the user's statistics are available. - - - - - Checks the current user's statistics with this name. - - The name of the statistic. - The value of the statistic. - Whether the check succesfully executed. - - - - Assigns the current user's statistics with this name. - - The name of the statistic. - The value of the statistic. - Whether the check succesfully executed. - - - - Checks the current user's statistics with this name. - - The name of the statistic. - The value of the statistic. - Whether the check succesfully executed. - - - - Assigns the current user's statistics with this name. - - The name of the statistic. - The value of the statistic. - Whether the check succesfully executed. - - - - Requests the user's statistics. - - Whether the refresh succesfully executed. - - - - Triggered when the global statistics are available. - - - - - Checks the global total of the statistic with this name. - - The name of the statistic. - The value of the statistic. - Whether the check succesfully executed. - - - - Checks the global total of the statistic with this name. - - The name of the statistic. - The value of the statistic. - Whether the check succesfully executed. - - - - Requests the global statistics. - - Whether the refresh succesfully executed. - - - - Current user statistics implementation. - - - - - Current global statistics implementation. - - - - - Current client multiplayer implementation. - - - - - Current server multiplayer implementation. - - - - - Information about currently connected server. - - - - - Whether a server is currently connected to. - - - - - Whether connection attempts are being made. - - - - - Network buffer memory stream. - - - - - Network buffer memory stream reader. - - - - - Network buffer memory stream writer. - - - - - Connect to a server. - - Server to join. - - - - Disconnect from current server. - - - - - Receive a packet from an entity across the network. - - Sender of data. - - - Whether any data was read. - - - - Send a packet to an entity across the network. - - Recipient of data. - Packet to send. - Size of data in array. - - - - Send a packet to an entity across the network. - - Recipient of data. - Packet to send. - Size of data in array. - Type of send to use. - - - - Information about currently hosted server. - - - - - Whether a server is open. - - - - - Network buffer memory stream. - - - - - Network buffer memory stream reader. - - - - - Network buffer memory stream writer. - - - - - Open a new server. - - - - - Close an existing server. - - - - - Receive a packet from an entity across the network. - - Sender of data. - - - Whether any data was read. - - - - Send a packet to an entity across the network. - - Recipient of data. - Packet to send. - Size of data in array. - - - - Send a packet to an entity across the network. - - Recipient of data. - Packet to send. - Size of data in array. - Type of send to use. - - - - Whether the user has their overlay enabled. - - - - - Requests the user's inventory. - - Called when the request is completed. - Handle for checking the owner of the callback. - - - - Requests a check for promotional items. - - Called when the request is completed. - Handle for checking the owner of the callback. - - - - Converts the input items into the output items. - - Items to be converted from. - Item amounts to be consumed. - Items to be converted to. - Item amounts to be generated. - Called when the exchange is completed. - - - - Whether the user has their overlay enabled. - - - - - View a package on the store. - - Package to view. - - - - Checks whether the current user has an achievement with this name. - - The name of the achievement. - Whether the user has this achievement. - Whether the check succesfully executed. - - - - Assigns the current user an achievement with this name. - - The name of the achievement. - Whether the assignment succesfully executed. - - - - Whether the user has their overlay enabled. - - - - - Initialize this service's external API. Should be called before using. - - - - - Update this service's external API. Should be called every frame. - - - - - Shutdown this service's external API. Should be called before closing the program. - - - - - Used to show a warning when a lot of servers are blocked by curation list. - - - - - Reset after starting connection attempt, so set to true afterwards to auto join the server. - - - - - EItemType - - - - - Nelson 2024-12-06: This was added 2023-06-19, so unfortunately it will be inaccurate for older items. - - - - - This enum exists for sorting items based on rarity, and is derived from quality. - Quality order cannot be changed due to loading from older files, but this one is ordered - from lowest rarity to highest rarity and should match entries in quality. - - - - - Response data from IInventoryService GetInventory web API. - - One player's inventory became so large that the Steam client's built-in GetInventory fails, - so as temporary fix we can send them a json file with their inventory. - - - - - Json string representation of the contained items. - - - - - Parse response from json file. - - - - - Details of a workshop item that the game may want to refer to later. - Cached during client startup after getting installed items, and while - downloading UGC for the dedicated server. - - - - - Banned workshop files are shown in red. - - - - - Used on dedicated server to test whether map has been updated, and whether local copy of file is out-of-date. - - - - - Some workshop thieves use an empty title, in which case we show the file ID as title text. - - - - - Used when transitioning Unity versions breaks asset bundles. Replaced by AssetBundleVersion const values. - - - - - Workshop item key-value tag storing the version number. - - - - - Maps published file id to name, version, etc. - - - - - Get compatibility version from workshop query, or zero if unset. - - - - - Save the details from a workshop query for lookup later. - Allows game to inspect the installed files before deciding if they are - compatible, since maps and localization are not affected by unity upgrades. - Previously the compatibility test occurred before downloading the content. - - - - - Get cached workshop item details. - - - - - Should caller skip loading a given workshop file? - - Used to skip workshop version of map if the map is locally installed, - e.g. Canyon Arena moved to workshop and auto-subscribed. - - - - - Helper for downloadServerItems. - Called for each workshop item we want to download for the server. - - - - - Called once we know which items the server is allowed to use (queryServerItems), - or the query has failed in which case we proceed with all items it told us. - - - - - Is currently connected server allowed to auto-download the workshop item? - Requested by mod authors so that they can whitelist/blacklist access. - - - - - Successfully queried details of the items current server is using. - Ensure server has permission to use these items, then proceed with downloading. - Also caches item titles for use on the loading screen. - - - - - IO or bad result occurred when querying items the current server is using. - We do not know the file details, but we proceed with downloading them all. - - - - - File IDs the client knows the server is using. Fallback in-case the query fails. - - - - - IP of the currently connected server, or zero if unable to retrieve from network system. - Used for testing download restrictions. - - - - - Number of items currently connected server was not authorized to download. - - - - - Called prior to downloading, and after a connection failure. - - - - - Client now knows the published file IDs the server is using, but - queries the workshop for additional information before installing. - - - - - Callback when player subscribes to an item and it finishes downloading. - Different than the game-managed DownloadItem calls. - - - - - Get path to an already-installed workshop item. - - True if the path was found. - - - - Used during startup to register subscribed workshop items. - Given a workshop item file id, if its files exist on disk then register it. - - - - - Workshop file ids we were locally subscribed to during startup. - These items are queried for compatibility before registering. - - - - - Called when subscribed items callback was successful to register all compatible files. - - - - - Called when subscribed items callback did not execute as expected, - maybe because steam's servers are offline. In this case we can't check - compatibility so we register all the locally subscribed items as compatible. - - - - - Register any localization-type workshop content before waiting for the steam callbacks. - Important so that localizations are available for loading screens and whatnot during startup. - Any items we register now will be skipped later. - - - - - If specified, player's workshop file subscriptions are not registered at startup. - - - - - Map of subscriptions added/removed by the player through the in-game client API, as opposed to the web browser. - - - - - Called by us when we subscribe to an item from in-game. - If item already exists on-disk steam doesn't always call onItemInstalled, so we do our own check and potentially load. - - - - - Current achievements implementation. - - - - - Current browser implementation. - - - - - Current cloud implementation. - - - - - Current community implementation. - - - - - Current economy implementation. - - - - - Current matchmaking implementation. - - - - - Current multiplayer implementation. - - - - - Current statistics implementation. - - - - - Current store implementation. - - - - - Current translation implementation. - - - - - Current workshop implementation. - - - - - Initialize this provider's external API. Should be called before using provider features. - - Thrown if initializing fails. - - - - Update this provider's external API. Should be called every frame if using provider features. - - - - - Shutdown this provider's external API. Should be called before closing the program if using provider features. - - - - - Parse dynamic tag mythic effect. - - ID of mythical asset, or zero if not in tags. - - - - For purchasable box and bundle itemdefs this maps their itemdefid to the list of itemdefids in their desc. - - - - - Invoked after a successful exchange with the newly granted items. - - - - - Invoke after a succesful purchase from the item store. - - - - - Purchase result does not have a handle, so we guess based on when it arrives. - - - - - Find the first instanceId of a given itemDefId. - - - - - Count quantity of a given itemDefId. - - - - - Find certain quantity of given itemDefId. - - - - - Does itemdefid exist in the EconInfo.json file? - - - - - Get item with an exchange recipe for the appropriate number of scraps. - - - - - Get list of itemdefids mentioned in purchasable box or bundle item description. - - - - - One player's inventory became so large that the Steam client's built-in GetInventory fails, - so as temporary fix we can send them a json file with their inventory. - - - - - Add an item locally that we know exists in the online inventory, but is just a matter of waiting for it. - - - - - Remove an item locally that we know no longer exists in the online inventory. - - - - - Update our local version of an item that we know has changed, but we are waiting for a full refresh. - - - - - Callback when client knows which items were crafted or exchanged. - - - - - Callback when client thinks result was from purchase. - - - - - 2022-01-01 it does not seem to be documented by Steam, but we get SteamInventoryResultReady callbacks - for external events like AddItem calls, so we may as well handle them. - - - - - Do we know the player's region? - If not, default to not allowing random items. - - - - - Does the player's region allow crates and keys to be used? - Similar to TF2 and other Valve games we disable unboxing in certain regions. - - - - - If player's region does not allow crates and keys to be used, return the country code. - - - - - Similar to TF2 and other Valve games we disable unboxing in certain regions, so hide those items. - - - - - Similar to TF2 and other Valve games we disable unboxing in certain regions. - - - - - Not called on dedicated server. - - - - - Implementing as a struct wrapping the connection handle would remove the cost of looking up the connection, - but implementing as a class makes it cheap to cache information like the remote identity. - - - - - Find game connection associated with Steam connection. - - - - - Must close the handle to free up resources. - - - - - Must close the handle to free up resources. - - - - - Defaults to true. If false, skip Steam Networking Sockets creation of regular IP socket. - - - - - Defaults to true. If false, skip Steam Networking Sockets creation of non-FakeIP P2P socket. - (this is the socket used by "server codes") - - - - - Must close the handle to free up resources. - - - - - Must close the handle to free up resources. - - - - - Recycled array for every read call. - - - - - Log verbose information that should not be included in release builds. - - - - - Log helpful information that should be included in release builds. - - - - - Should certificate authentication be disabled for UDP connections? - - - - - This callback may be called from a service thread. It must be threadsafe and fast! Do not make any other - Steamworks calls from within the handler. - - - - - Thanks DiFFoZ! Ensures GC does not release the delegate. - - - - - Does host want extra debug output? - - - - - Overrides k_ESteamNetworkingConfig_SendBufferSize. - - - - - Overrides k_ESteamNetworkingConfig_EnableDiagnosticsUI. - - - - - Implementation using .NET Berkeley sockets. - - - - - Implements message boundaries on top of a TCP stream socket. - - - - - Implementation using .NET Berkeley sockets. - - - - - SteamNetworking is deprecated. - - - - - SteamNetworking is deprecated. - - - - - Dummy connection used in singleplayer. - - - - - Does initialOverlaps array contain hit collider? - - - - - Does initialOverlaps array contain every hit collider? - - - - - Perform a move, then do a capsule cast to determine if Unity PhysX went through a wall. - - Required when disabling overlap recovery because there are issues when walking toward slopes that bend inward. - To test if Unity works properly in the future; walk toward the inside of a barracks building in the PEI base. - - - - - Set detectCollisions to false and cancel deferred requests to enable. - - - - - Set detectCollisions to true on the next frame. - Useful when CharacterController is teleported to prevent adding huge forces to overlapping rigidbodies. - - - - - If true EnableDetectCollisionsNextFrame, if false DisableDetectCollisions. - - - - - Intentionally Update, not FixedUpdate. Physics transforms are applied between frames, whereas at low frame - rates there may be multiple FixedUpdates per frame. - - - - - Used to capture promotional images. - - Unity does not allow components in the editor assembly, so this component is in the game assembly but only compiled in the editor. - - - - - Test to compare differrent Unity instancing meshes. - - Unity does not allow components in the editor assembly, so this component is in the game assembly but only compiled in the editor. - - - - - Hacky workaround to fix item skin material leak. Unfortunately none of the original item skin code destroyed - instantiated materials, and did not keep a reference to the instantiated materials, so until that code gets a - rewrite this will take care of cleanup. - - - - - Debug component in the editor to see if GetRandomForwardVectorInCone seems correct. :) - Not much of a mathematician. :( - - - - + + + + Assembly-CSharp + + + + + Helper for drawing label outline/shadow so that we can easily change it. + + + + + Helper for drawing label outline/shadow so that we can easily change it. + + + + + If true, SizeOffset_X and SizeOffset_Y are used when image is available. + Defaults to false. + + + + + If useImageDimensions is on and image width exceeds this value, scale down + respecting aspect ratio. + + + + + If useImageDimensions is on and image height exceeds this value, scale down + respecting aspect ratio. + + + + + If true, NVGs work in third-person, not just first-person. + Defaults to false. + + + + + Type the annotated class was generated for. + + + + + Method the annotated method was generated for. + + + + + Exposes the same API as the older Block class used by existing netcode, but implemented using new bit reader/writer. + + + + + Last realtime a request was sent. + Used to rate-limit clientside. + + + + + Perform rate limiting and update timestamp. + + True if we can proceed with request. + + + + Do we think the local player is eligible to send request? + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + Find difficulty asset (if valid) for navigation bound index. + + + + + Could potentially be reused generically. + + + + + When zombie falls outside the map it needs a replacement spawnpoint within the same navmesh area. + + + + + Find replacement spawnpoint for a zombie and teleport it there. + + + + + Kills night-only zombies at dawn. + + + + + Allows Unity events to call in airdrops. + + + + + Used by weather assets. + + + + + Distance inward from edge before intensity reaches 100%. + + + + + Alpha is 0.0 outside volume and 1.0 inside inner volume. + + + + + World space size of the box. + + + + + Half the world space size of the box. + + + + + World space size of inner falloff box when falloffDistance is non-zero. + For example a 24x12x6 box with a falloff of 4 has an inner box sized 16x4x0. + + + + + World space extents of inner falloff box when falloffDistance is non-zero. + + + + + Local space size of inner falloff box when falloffDistance is non-zero. + + + + + Local space extents of inner falloff box when falloffDistance is non-zero. + + + + + World space radius of the sphere. + + + + + Local space radius of the sphere. + + + + + World space radius of inner falloff sphere when falloffDistance is non-zero. + + + + + Local space radius of inner falloff sphere when falloffDistance is non-zero. + + + + + Useful for code which previously depended on creating the Unity collider to calculate bounding box. + + + + + Called in the level editor during registraion and when visibility is changed. + + + + + Editor-only solid/opaque child mesh renderer object. + + + + + If true during Awake the collider component will be added. + Otherwise only in the level editor. Some volume types like water use the collider in gameplay, + whereas most only need the collider for general-purpose selection in the level editor. + + + + + Camera does not rotate when the car rotates. + + + + + Camera rotates when the car rotates. + + + + + If hit from the left view rolls right, if hit from the right view rolls left. This may reduce motion + sickness for some players. + + + + + Rotate on all axes according to damage direction. This may induce motion sickness. + + + + + Unfortunately the version which added hitmarker style saved but didn't actually load (sigh). + + + + + Nelson 2023-12-28: this option was causing players to crash in the 3.23.14.0 update. Hopefully + it's resolved for the patch, but to be safe it will default to false. + + + + + Prior to 3.22.8.0 all scopes/optics had a base fov of 90 degrees. + + + + + If false, call Start and Stop recording before and after push-to-talk key is pressed. This was the + original default behavior, but causes a hitch for some players. As a workaround we can always keep + the microphone rolling and only send data when the push-to-talk key is held. (public issue #4248) + + + + + If true, group member name labels fade out when near the center of the screen. + Defaults to true. + + + + + If true, hide identifiable details of other multiplayer clients like avatars, player names, number of + players online, server name, etc. Live streamers may find this useful to help prevent stream sniping. + + Separated from the older "streamer mode" option. + + + + + If true, don't share details like "editing map X" or "join" with Steam. Useful for anyone who might be + targeted / followed into servers, or who has a project to keep secret. + + Separated from the older "streamer mode" option. + + + + + Controls whether hitmarkers are animated outward (newer) or just a static image ("classic"). + + + + + Determines how camera follows vehicle in third-person view. + + + + + Determines how camera follows aircraft vehicle in third-person view. + + + + + [0, 1] Blend factor between black and flashbang's desired color. + + + + + [0, 1] Multiplier for shake from . + + + + + Controls whether camera is constrained to roll-only or all axes. + + + + + Multiplier for flinch away from damage source in . + + + + + [0, 1] Intensity of FOV boost while sprinting. + + + + + [0, 1] Intensity of first-person motion caused by walking. + + + + + Invoked when custom UI colors are set. + + + + + Invoked when dark/light theme is set. + + + + + Number of times the player has clicked "Proceed" in the online safety menu. + + + + + If true, "don't show again" is checked in the online safety menu. + + + + + Prevents menu from being shown twice without a restart. + + + + + Nelson 2025-02-24: Warning that this is invoked *before* the item is actually removed from the items list. + (public issue #4894) + + + + checks whether a space contains any filled slots + + + checks whether an item can be dragged and takes into account if the item overlaps its old self + + + + checks whether the spot currently used by the old item is big enough to fit the new item + + + + + Please use SearchContents instead! To perform an equivalent search: + • Set ItemType to type. + • Set IncludeEmpty to false. + • Set IncludeMaxQuality to true. + + + + + Please use SearchContents instead! To perform an equivalent search: + • Set ItemType to type. + • Set IncludeEmpty to false. + • Set IncludeMaxQuality to true. + • Set CaliberId to caliber. + • Set IncludeUnspecifiedCaliber to allowZeroCaliber. + + + + + Please use SearchContents instead! To perform an equivalent search: + • Set AssetRef to id. + • Set IncludeEmpty to findEmpty. + • Set IncludeMaxQuality to findHealthy. + + + + + Please use SearchContents instead! To perform an equivalent search: + • Set MaxResultsCount to 1. + • Set AssetRef to id. + • Set IncludeEmpty to false. + • Set IncludeMaxQuality to true. + + + + + Invoked after any player's experience value changes (not including loading). + + + + + Invoked after any player's reputation value changes (not including loading). + + + + + Ugly hack for the awful skills enums. Eventually skills should be replaced. + + + + + Set every level to max and replicate. + + + + + Serverside only. + Called when skills weren't loaded (no save, or in arena mode), as well as when reseting skills after death. + + + + + Set this item as the dragging preview. + + + + + Standard shader mode changes are based on built-in StandardShaderGUI.cs + + + + + Does shader name match any of the standard shaders? + Standard, StandardSpecular and the Unturned "Decalable" variants all share nearly identical parameters. + + + + + Based on fixup routine in StandardShaderGUI SetMaterialKeywords. + + + + + Conditionally fixup older standard materials. + + True if material was edited. + + + + Parses mb:X from input string and filters assets using X master bundle. + + + + + List of all loaded blueprints potentially craftable by player. Updated when assets are refreshed. This + allows us to skip blueprints that will never be craftable (such as level-specific blueprints). + + + + + Recycled list of assets with blueprints. + + + + + Subset of loadedBlueprints. + + + + + Center column. + + + + + Used by inventory item context menu to override which blueprints are shown. + + + + + Left-hand column. + + + + + Right-hand column. + + + + + Returns true if all filtered blueprints are craftable. (hacked-in for item action menu) + + + + + If asset mapping has changed, find all assets with blueprints and gather the ones that can ever be crafted + on this level. (I.e., excluding ones that we shouldn't waste time considering.) + + + + + Accessible for UseableHousingPlanner. + + + + + Get a blank status from the pool or construct a new one. + + + + + Barricade asset's EBuild included in saves to fix state length problems. (public issue #3725) + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + Writable list of vehicle regions. Public add/remove methods should not be necessary. + + + + + Remove barricade instance on server and client. + + + + + Used by ownership change and damaged event to tell relevant clients the new health. + + + + + Legacy function for UseableBarricade. + + + + + Common code between dropping barricade onto vehicle or into world. + + + + + Spawn a new barricade attached to a vehicle and replicate it. + + + + + Spawn a new barricade and replicate it. + + + + + Not an instance method because structure might not exist yet, in which case we cancel instantiation. + + + + + Destroy barricades whose pivots are within sphere. + + + + + Clean up before loading vehicles. + + + + + Register a new vehicle as a valid parent for barricades. + Each train car is registered after the root of the train. + Note: Nobody knows why these are called plants. + + + + + Called before destroying a vehicle GameObject because storage needed to be ManualDestroyed. + + + + + Send all vehicle-mounted barricades to client. + Called after sending vehicles so all plant indexes will be valid. + + + + + Original server-only version that does not replicate changes to clients. + + + + + Only used by plugins. Replicates state change to clients. + + + + + Not ideal, but there was a problem because onLevelLoaded was not resetting these after disconnecting. + + + + + Maps prefab unique id to inactive list. + + + + + Sending yaw only costs 1 bit (flag) plus yaw bits, so compared to the old 24-bit rotation we may as well + make it high-precision. Quaternion mode uses 1+27 bits! + + + + + +0 = BarricadeDrop + +1 = root transform + +2 = Interactable (if exists) + + + + + ID unique to this zombie table in the level. If this table is deleted the ID will not be recycled. Used to + refer to zombie table from external files, e.g., NPC zombie kills condition. + + + + + Not an actual Steam ID or BattlEye ID, instead this is used to map player references to and from BE. + + + + + True for offline or listen server host. + + + + + Next time method is allowed to be called. + + + + + Number of times client has tried to invoke this method while rate-limited. + + + + + Get Steam item definition ID equipped for given vehicle. + + True if a skin was available. + + + + Build econ details struct from tags and dynamic_props. + Note that details cannot be modified because it's a struct and has copies of the data. + + + + + Add a recent ping sample to the average ping window. + Updates ping based on the average of several recent ping samples. + + Most recent ping value. + + + True if both players exist, are both members of groups, and are both members of the same group. + + + True if both players exist, are both members of groups, and are both members of the same group. + + + + Get real IPv4 address of remote player NOT the relay server. + + True if address was available, and not flagged as a relay server. + + + + See above, returns zero if failed. + + + + + Get real address of remote player NOT a relay server. + + Null if address was unavailable. + + + + Get string representation of remote end point. + + Null if address was unavailable. + + + + Players can set a "nickname" which is only shown to the members in their group. + + + + + Can be used by plugins to verify player is on a particular server. + + OnSteamAuthTicketForWebApiReceived will be invoked when the response is received. + Note that the client doesn't send anything if the request to Steam fails, so plugins may wish to kick + players if a certain amount of time passes. (e.g., if a cheat is canceling the request) + + + + + Component for the tactical laser attachment's red dot. + Resizes itself per-camera to maintain a constant on-screen size. + + + + + Used to tune the scale by distance so that far away laser is not quite as comically large. + + + + + This value is confusing because in the level editor it is the normalized radius, but in-game it is the square radius. + + + + + Load {Language}.dat and/or English.dat from folder path. + + + + + Note: as of 2025-04-23 this *can* be null. (E.g., audio-only effects.) + + + + + If set, use OneShotAudioParameters to play this audio. + + + + + If true the music option is respected when this effect is used by ambiance volume. + + + + + In multiplayer the effect will be spawned for players within this radius. + + + + + When loaded or spawned as a vehicle, creates a different vehicle instead. + For example, Off_Roader_Orange has ID 4. When that ID is loaded/spawned the new combined Off_Roader vehicle is + used instead. Can also optionally apply a paint color, allowing saves to be converted without losing colors. + + + + + Redirectors are in the Vehicle category so that legacy vehicle IDs point at the redirector. + + + + + Vehicle to use when attempting to load or spawn this asset. + + + + + If set, overrides the default random paint color when loading a vehicle from a save file. + Used to preserve colors of vehicles in existing saves. + + + + + If set, overrides the default random paint color when spawning a new vehicle. + Optionally used to preserve colors of vehicles in spawn tables. + + + + + Invoked prior to built-in death logic. + + + + + Event for plugins when player dies. + + + + + Invoked after player finishes respawning. + + + + + Tracks this player as an aggressor if they were recently an aggressor or if they haven't been attacked recently. + + Ignores rules and just make aggressive. + Whether to call markAggressive on group members. + + + Should damage be dealt even while inside safezone? + + + + Set bleeding state and replicate to owner if changed. + + + + + Set legs broken state and replicate to owner if changed. + + + + + Add to or subtract from stamina level. + Does not replicate the change. + + + + + Add to or subtract from stamina level. + Does not replicate the change. + + + + + Called from the server to modify stamina. + + + + + Add to or subtract from stamina level on the client and server. + + + + + Called from the server to induce a hallucination. + + + + + Add to or subtract from hallucination level on the client. + + + + + Add to or subtract from warmth level. + Does not replicate the change. + + + + + Called from the server to modify warmth. + + + + + Add to or subtract from warmth level on the client and server. + + + + + Add to or subtract from oxygen level. + Does not replicate the change. + + + + + Add to or subtract from health level. + Replicates change to owner. + + + + + Add to or subtract from food level. + Replicates change to owner. + + + + + Add to or subtract from water level. + Replicates change to owner. + + + + + Add to or subtract from virus level. + Replicates change to owner. + + + + + Used by plugins to respawn the player bypassing timers. Issue #2701 + + + + + Used to refill all client stats like stamina + + + + + Used by UI. True when underwater or inside non-breathable oxygen volume. + + + + + This value is confusing because in the level editor it is the normalized radius, but in-game it is the radius. + + + + + No longer used in vanilla. Kept in case plugins are using it. + + + + + No longer used in vanilla. Kept in case plugins are using it. + + + + + No longer used in vanilla. Kept in case plugins are using it. + + + + + Actual internal implementation. + + + + + World to local bounds only works well for axis-aligned icons. + + + + + Unity's Camera.orthographicSize is half the height of the viewing volume. Width is calculated from aspect ratio. + + + + + Fading in. + + + + + Finished fading in. + + + + + Fading out. + + + + + Finished fading out. + + + + + Extensions to the built-in Input class. + + + + + Wrapper for Input.GetKey, but returns false while typing in a uGUI text field. + + + + + Wrapper for Input.GetKeyDown, but returns false while typing in a uGUI text field. + + + + + Wrapper for Input.GetKeyUp, but returns false while typing in a uGUI text field. + + + + + Should be used anywhere that Input.GetKeyDown opens a UI. + + Each frame one input event can be consumed. This is a hack to prevent multiple UI-related key presses from + interfering during the same frame. Only the first input event proceeds, while the others are ignored. + + True if caller should proceed, false otherwise. + + + + Get mouse position in viewport coordinates where zero is the bottom left and one is the top right. + + + + + Original type on the Russia map which requires a mask with filters. + + + + + Requires a mask with filters and full body suit. + + + + + Damage dealt to players while inside the volume if they *don't* have clothing matching the deadzone type. + Could help prevent players from running in and out to grab a few items without dieing. + + + + + Damage dealt to players while inside the volume if they *do* have clothing matching the deadzone type. + For example, an area could be so dangerous that even with protection they take a constant 0.1 DPS. + + + + + Virus damage to players while inside the volume if they *don't* have clothing matching the deadzone type. + Defaults to 6.25 to preserve behavior from before adding this property. + + + + + Rate of depletion from gasmask filter's quality/durability. + Defaults to 0.4 to preserve behavior from before adding this property. + + + + + This value is confusing because in the level editor it is the normalized radius, but in-game it is the square radius. + + + + + Nelson 2024-06-10: Added this property after nodes were converted to volumes. i.e., only old levels from + before this property were added still have nodes, so it's expected that they won't deal damage over time. + + + + + Same description as . + + + + + Same description as . + + + + + Same description as . + + + + + Get real IPv4 address of remote player NOT the relay server. + + True if address was available, and not flagged as a relay server. + + + + See above, returns zero if failed. + + + + + When placing structures that snap to grid multiple requests can come + in to the server at the same time, and checking overlaps against structures + can be problematic, so as a backup we track pending build requests + and cancel ones which conflict. + + + + + Register a location as having something built there soon. + + Unique handle to later finish the request. + + + + Is a location available to build at (i.e. no pending builds)? + + False if there are any outstanding build requests for given location. + + + + Notify that a previously registered build has been completed. + + Unique handle. + + + + Nelson 2023-08-11: this probably should be rewritten a bit if used in the future + because the error context currently assumes this is an item reward for consumables. + + + + + Resolve table as items and grant random number to player. + + + + + Resolve table as items and grant random number to player. + + + + + Enumerate random number of valid assetIDs. + + + + + Converts Steam BBcode tokens into widgets displayable using Glazier UI. + + + + + If false, expect LineBreak tokens in input. (default false) + If true, insert line breaks where appropriate. + Steam's new visual editor doesn't emit newlines, instead inferring line breaks from paragraph blocks. To + make life easier we will do the same for the main menu announcement feed. + + + + + Vanilla maximum level. + + + + + If set, maximum skill level attainable through gameplay. + + + + + Multiplier for XP upgrade cost. + + + + + Get maximum level, or maxUnlockableLevel if set. + + + + + + + Implemented by components the player can talk with using DialogeAssets. (e.g., InteractableObjectNPC) + + + + + Used to test whether player is within range. + Ideally, this should be removed in the future in favor of the server resetting speaker when out of range. + + + + + Get a net ID that can be used with GetDialogueTargetFromNetId to resolve IDialogueTarget in multiplayer. + + + + + Called on server to test whether object conditions are met. + + + + + Called on server to find the start of conversation dialogue asset. + + + + + Used in error messages. + + + + + Called on client to format in UI. + + + + + Helper wrapping Unturned's usage of AudioListener.volume, which is the master volume level. + This makes it easier to track what controls the master volume and avoid bugs. + + + + + Is audio muted because this is a dedicated server? + + While dedicated server should not even be processing audio code, + older versions of Unity in particular have issues with headless audio. + + + + + Is audio muted because loading screen is visible? + + + + + Player's volume multiplier from the options menu. + + + + + Player's unfocused volume multiplier from the options menu. + + + + + Mute or un-mute audio depending whether camera is valid. + + + + + Synchronize AudioListener.volume with Unturned's parameters. + + + + + Note: new official code should be using per-method rate limit attribute. + This is kept for backwards compatibility with plugins however. + + Timestamp for server-side rate limiting. + + + + + Realtime this action was performed. + + + + + Realtime since performedRealtime. + + + + + if(myRateLimit.throttle(1.0)) + return; // less than 1s passed + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + List of all interactable items. Originally only used to clamp their distance from the drop point to ensure + clients can always pick them up, but now used to find items within a radius for nearby menu as well. + + + + + Kept for plugin backwards compatibility. + This one is problematic because on the client physics can move items between regions. + + + + + Find physically simulated items within radius. + + + + + Despawn any old items in the current despawn region. + + True if the region had items to search through. + + + + Attempt to respawn an item in the current respawn region. + + True if an item was succesfully respawned. + + + + Not ideal, but there was a problem because onLevelLoaded was not resetting these after disconnecting. + + + + + Instantiate at least this many items per frame even if we exceed our time budget. + + + + + Sort servers by name A to Z. + + + + + Sort servers by name Z to A. + + + + + Persistent identifier for server. Relies on server assigning a Game Server Login Token (GSLT). + i.e., servers without GSLT cannot be bookmarked. + + + + + IP address or DNS name to use as-is, or a web address to perform GET request. + Servers not using Fake IP can specify just a DNS entry and a static query port. + Servers using Fake IP are assigned random ports at startup, but can implement a web API endpoint to return + the IP and port. + + Nelson 2025-01-20: Making this optional now. The downside is we can't perform a Steam A2S query without + IP/port, but the upside is players can more easily join their non-port-forwarded servers. + + + + + Steam query port. Zero for servers using Fake IP. + + + + + Name updated from SteamServerAdvertisement. + + + + + Short description updated from SteamServerAdvertisement. + + + + + Small icon updated from SteamServerAdvertisement. + + + + + Used by UI to track whether it's been added/removed. + + + + + Allows player to save server advertisement to join again later. Semi-replacement for Steam's built-in favorites + and history lists because as of 2024-04-26 they don't seem to work properly with Fake IP. + + + + details if advertisement is bookmarked. + + + + Restore a removed bookmark. + + + + + Static functions for creating monitor instance on server. + + + + + Entry point called by dedicated server after loading level. + + + + + Create vanilla update monitor that watches for changes to workshop level file and any other mods. + + + + + Helper to get updated timestamp from workshop items loaded by DedicatedUGC. + + + + + Helper to create monitored item for use with default DedicatedWorkshopUpdateMonitor implementation. + + + + + For use with default DedicatedWorkshopUpdateMonitor implementation. + + + + + Get index within bounds assuming list is not empty. + + + + + Add a new item using its default constructor. + + + + + Apply shader name redirects until a final name is found, + and then load shader for compatible version of Unity. + + + + + Apply shader name redirects until a final name is found. + Used to fix renamed shaders loaded from old asset bundles. + + + + + Names of older shaders mapped to their renamed counterparts. + Used to fix shaders loaded from old asset bundles. + + + + + Delete all savedata folders for player's characters. + + + + + Number of Attack_# animations. + + + + + Number of Eat_# animations. + + + + + Number of Glance_# animations. + + + + + Number of Startle_# animations. + + + + + Maximum distance on the XZ plane. + + + + + Maximum distance on the XZ plane when attacking vehicles. + + + + + Maximum distance on the Y axis. + + + + + Minimum seconds between attacks. + + + + + Temporary until something better makes sense? For Spyjack. + + + + + If true, animal won't start moving until startle animation finishes. + + + + + Allows mappers to bulk replace assets by listing pairs in a text file. + https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/2275 + + + + + If a redirector for oldGuid exists, returns target asset. Otherwise null. + + + + + Component in the root Menu scene. + Additively loads decoration levels without modifying main scene. + + + + + Prevents static member from being initialized during MonoBehaviour construction. (Unity warning) + + + + + Nelson 2024-02-06: when looking into resolving public issue #3703 I figured since there is a common behavior + between InteractableObjectQuest, InteractableObjectNote, and InteractableObjectDropper (in that they all + request the server to do X we may as well support a "mod hook" that works with all three. + + + + + Controls where attachments looks for ADS alignment transform. + + + + + Look for aim alignment transform relative to sight model. + Defaults to Model_0/Aim. + + + + + Look for aim alignment transform relative to equipable prefab. + Requires setting AimAlignment_Path. + + + + + Factor e.g. 2 is a 2x multiplier. + Prior to 2022-04-11 this was the target field of view. (90/fov) + + + + + Zoom factor used in third-person view. + + + + + Whether main camera field of view should zoom without scope camera / scope overlay. + + + + + If true, scale scope overly by 1 texel to keep "middle" pixel centered. + + + + + Controls where to find AimAlignmentTransformPath. + + + + + If set, find this transform relative to AimAlignmentTransformOwner. + + + + + Position offset relative to Aim transform or transform specified by aimAlignmentTransformPath. + + + + + [0, 1] local distance from center to start of line. + + + + + [0, 1] local width of horizontal line. + + + + + Whether line/number are on left or right side of the center line. + + + + + If true, text label for distance is visible. + + + + + Optional component on Turret_# GameObject for modding UnityEvents. + + + + + Optional collider matching the player capsule to prevent short vehicles (e.g. bikes) from clipping into walls. + + + + + Displays a single random item. Placed under the other main menu buttons. + + + + + Hide existing icon until refresh. + Experimented with doing this for every refresh, but it looks bad in particular for hotbar. + + + + + Name of the asset bundle. + + core.content + + + + Path within the asset bundle. + + + + + Used to test whether player can fit in a space. + Includes terrain because tested capsule could be slightly underground, and clip to prevent exploits at sky limit. + + + + + Used for third-person camera in vehicle. + Does not include resource layer because attached barricades are put on that layer. + Barricades layer itself is included to prevent looking inside player bases. + + + + + Used to test whether player can enter a vehicle. + Does not include resource layer because attached barricades are put on that layer. + + + + + 2023-02-02: adding more layers since splatter can be attached to them now. + parent should only be set if that system also calls ClearAttachments, otherwise attachedEffects will leak memory. + + + + + Layer mask for CharacterController overlap test. + + + + + Layer mask for CharacterController overlap test while inside landscape hole volume. + + + + + Lightning strike raycasts from sky to ground using this layer mask. + + + + + Invoked when component is enabled and when the game object is activated. + + + + + Invoked when component is disabled and when the game object is deactivated. + Note that if the component or game object spawn deactivated this will not be immediately invoked. + + + + + Allows Unity events to print messages to the log file for debugging. + + + + + Text to use when PrintInfo is invoked. + + + + + Every time the inventory changes this number is incremented. + While a little messy, the idea is to prevent inventory checks from happening every frame. + + + + + Should be called every time something changes in the inventory. + + + + + Helper to prevent checking the inventory every frame for systems that don't use events. + + + + + Did owner call askInventory yet? + Prevents duplicate tell_X RPCs from being sent to owner prior to initial sync. + Ideally should be cleaned up with netcode refactor. (Client should not need to ask server for initial state.) + + + + + Intended as nearly a drop-in replacement for . + + + + + Intended as nearly a drop-in replacement for . + + + + + Intended as nearly a drop-in replacement for . + + + + + Intended as nearly a drop-in replacement for . + + + + + Intended as nearly a drop-in replacement for . + + + + + Intended as nearly a drop-in replacement for . + This variant wraps FindFirstItemByAsset and manages the results list for you. + Only use result if true is returned, otherwise it's invalid. + + + + + Intended as nearly a drop-in replacement for . + This variant wraps FindFirstItemByAsset and manages the results list for you. + + + + + Helper for tryAddItemAuto. + + + + + Given an item coordinate (page, x, y) could a new item take the place of an old (existing) item without + overlapping other item(s) space? Always true for equipment slots (page less than SLOTS). + For example if oldSize is (1, 2) rot 0, and newSize is (2, 1) rot 1, then they can swap. + + + + + Swap coordinates of two existing items. + Rotation is provided to handle differently shaped items e.g. a 1x2 item with a 2x1 item. + + + + + Swap coordinates of two existing items. + Rotation is provided to handle differently shaped items e.g. a 1x2 item with a 2x1 item. + + + + + Called from player movement to close storage that has moved away. + + + + + Serverside open a storage crate and notify client. + + + + + Serverside grant access to car trunk storage and notify client. + + + + + Serverside revoke trunk access and notify client. + + + + + Called on both client and server, as well as by storage itself when destroyed. + + + + + Please use SearchContents instead! To perform an equivalent search: + • Set IncludeEquipmentSlots to false. + • Set IncludeActiveStorageContainer to false. + • Set ItemType to type. + • Set IncludeEmpty to false. + • Set IncludeMaxQuality to true. + OR use the nearly drop-in replacement FindItemsByType. + + + + + Please use SearchContents instead! To perform an equivalent search: + • Set IncludeEquipmentSlots to false. + • Set IncludeActiveStorageContainer to false. + • Set ItemType to type. + • Set IncludeEmpty to false. + • Set IncludeMaxQuality to true. + • Set AnyCaliberIds to calibers. + • Set IncludeUnspecifiedCaliber to allowZeroCaliber. + OR use the nearly drop-in replacement FindAttachmentsByCaliber. + + + + + Please use SearchContents instead! To perform an equivalent search: + • Set IncludeEquipmentSlots to false. + • Set IncludeActiveStorageContainer to false. + • Set ItemType to type. + • Set IncludeEmpty to false. + • Set IncludeMaxQuality to true. + • Set CaliberId to caliber. + • Set IncludeUnspecifiedCaliber to allowZeroCaliber. + OR use the nearly drop-in replacement FindAttachmentsByCaliber. + + + + + Please use SearchContents instead! To perform an equivalent search: + • Set IncludeEquipmentSlots to false. + • Set IncludeActiveStorageContainer to false. + • Set AssetRef to id. + • Set IncludeEmpty to findEmpty. + • Set IncludeMaxQuality to findHealthy. + OR use the nearly drop-in replacement FindItemsByAsset. + + + + + Please use SearchContents instead! To perform an equivalent search: + • Set IncludeEquipmentSlots to true. + • Set IncludeActiveStorageContainer to true. + • Set MaxResultsCount to 1. + • Set AssetRef to id. + • Set IncludeEmpty to false. + • Set IncludeMaxQuality to true. + OR use the nearly drop-in replacements FindFirstItemByAsset or HasItemByAsset. + + + + + Filter for whether the Permanent Gold Upgrade DLC is required to join a server. + + + + + All servers pass the filter. + + + + + Only non-gold servers pass the filter. + + + + + Only gold servers pass the filter. + + + + + Can be added to any GameObject to listen for the Event NPC reward type. + + + + + *_ID configured in NPC rewards list. + + + + + If true the event will only be invoked in offline mode and on the server. + + + + + Invoked when NPC global event matching EventId is processed. + + + + + Invoked when timer expires. + + + + + Number of seconds to use when SetDefaultTimer is invoked. + + + + + Should timer loop when SetDefaultTimer is invoked? + + + + + Stop pending timer from triggering. + + + + + Handle to stop the coroutine. + + + + + Horizontal distance before road begins tapering off into the terrain. + + + + + Size along the "up" axis. + + + + + Distance along the terrain surface normal to move each road vertex. + + + + + Multiplier for how far along the road before texture repeats. + + + + + Defaults to None, in which case the backwards-compatible chart classification is used. + + + + + Physics material to assign to road colliders. + Replaces the "concrete" toggle in the older editor. + + + + + Can be added to Vehicle Turret_# GameObject to receive events. + + + + + Invoked when turret gun is fired. + + + + + Invoked when turret gun begins reload sequence. + + + + + Invoked when turret gun begins hammer sequence. + + + + + Invoked when turret gun begins aiming. + + + + + Invoked when turret gun ends aiming. + + + + + Invoked when turret gun controlled by a local player begins aiming. + + + + + Invoked when turret gun controlled by a local player ends aiming. + + + + + Invoked when turret gun controlled by a local player begins inspecting attachments. + + + + + Invoked when turret gun controlled by a local player ends inspecting attachments. + + + + + Invoked when any player enters the seat. + + + + + Invoked when any player exits the seat. + + + + + Invoked when a locally controlled player enters the seat. + + + + + Invoked when a locally controlled player exits the seat. + + + + + Nelson 2025-06-19: using server-provided connection details is useful because + it can find its public IP (e.g., joining by LAN and sharing WAN IP), and/or + its fake IP (again when joining by LAN). + + + + + Is client UTC time within this time range? + + + + + Is server UTC time within this time range? + + + + + Adds custom data to base physics material asset. + For example how a vanilla material should respond to custom laser guns. + + + + + Number of players inside the navmesh when the beacon was placed. + Clamped to 1 if ShouldScaleWithNumberOfParticipants is false. + + + + + Crossover from Dying Light. Only spawns during night. Explodes into fire at dawn. + + + + + Crossover from Dying Light. Only spawns during night. Explodes into fire at dawn. + + + + + Elver endgame boss with reduced bullet damage and wind zombie stomping attacks. + + + + + Kuwait final boss with increased rock throwing, damage players inside vehicle (turrets), and flashbangs. + + + + + Buak boss types have a red-eyed flashbang effect. + + + + + Is this one of the Dying Light volatile zombies? Only spawns during night. Explodes into fire at dawn. + + + + + Does this have the BOSS_* prefix? + + + + + Same as FindChildRecursive, but skip specific child. + + + + + Editor-only helper to read all text/dialogue. + + + + + Version before named version constants were introduced. (2023-11-07) + + + + + Delegate not reset when level reset. + + + + + Delegate not reset when level reset. + + + + + Delegate not reset when level reset. + + + + + Delegate not reset when level reset. + + + + + Number of in-game days this world has run. + Incremented each time night ends. + Saved between sessions. + + + + + Weather has not been decided yet. Level might not have any enabled. + + + + + Weather has been forecast. Timer counts down until activation. + + + + + Weather is now active. Timer counts down until deactivation. + + + + + Weather is active. Will not deactivate naturally. + Prevents loaded perpetual weather from deactivating. + + + + + Determines which weather can naturally be scheduled in this level. + Includes default rain and snow for older levels. + + + + + Seconds until weather activates. + + + + + Seconds until weather deactivates. + + + + + Forecast or active weather. + + + + + Set weather active and disable scheduling. + + + + True if given weather has config. + + + + Cancel scheduled weather and re-evaluate on next update. + + + + + Cancel active weather and prevent next weather from being scheduled. + + + + + Get weather override for the currently loaded level. + Warning: this is kept for backwards compatibility, whereas newer maps will set LevelAsset.perpetualWeather. + + + + + Assign schedulableWeathers array according to level asset or legacy lighting settings. + + + + True if perpetual weather was enabled, false otherwise. + + + + Used by dawn and dusk skins which pull per-level lighting colors. + + + + + Note: unfortunately it appears the stupid skin system always instantiated materials, but never destroys + them... will need to clean this up, but it will be tricky because the game does not hold a reference to them. + + + + + If true, sets the Magazine attachment hook inactive while this skin is applied. (guns only) + + Nelson 2025-03-10: Adding this to address mismatched Ace bullets with certain skins. (public issue #4923) + It should be fine for vanilla guns because there shouldn't be assumptions about Magazine enable/disable, + but modded guns may have different expectations (particularly with GunAttachmentEventHook). + + + + + Used by melee skins to override impact sound. + + + + + Restricts which items can be crafted. + + + + + Restrict blueprints that consume these items. + + + + + Restrict blueprints that generate these items. + + + + + If false, blueprints on vanilla/core/built-in items are not allowed. Defaults to true. + + + + + If null, use index instead. + + + + + Restrict specific blueprints. + + + + + Thanks to Glenn Fiedler for this RK4 implementation article: + https://gafferongames.com/post/integration_basics/ + + + + + Higher values return to the target position faster. + + + + + Higher values reduce bounciness and settle at the target position faster. + e.g. a value of zero will bounce back and forth for a long time (indefinitely?) + + + + + Absolute path to project directory, e.g. C:/U3 + + + + + Overrides breathability for example in a deep cave with no oxygen, or near a deep sea plant that provides oxygen. + + + + + Find highest alpha breathable volume overlapping position. + + + + + Find highest alpha non-breathable volume overlapping position. + + + + + Unlike format, this returns null if key doesn't exist. + + + + + This overload supports legacy Reward_# format. + + + + + This overload doesn't support legacy Reward_# format. + + + + + Payload for the DamageTool.explode function. + Moved into struct because the amount of arguments to that function were insane, but now is not the time to completely refactor damage. + + + + + Speed to launch players away from blast position. + + + + + Can be added to any GameObject to receive weather events: + - Day/Night + - Full Moon + - Rain + - Snow + + + + + Invoked when night changes to day. + + + + + Invoked when day changes to night. + + + + + Invoked when a zombie full-moon event starts. + + + + + Invoked when a zombie full-moon event finishes. + + + + + Invoked when rain starts to fall. + + + + + Invoked when rain finishes falling. + + + + + Invoked when snow starts to fall. + + + + + Invoked when snow finishes falling. + + + + + Registers renderers with DynamicWaterTransparentSort manager. + + + + + In vanilla this field is ONLY used for the per-character saves on servers. + If that changes check that it does not affect the savedata options. + + + + + 20-byte SHA1 salted hashes of client's hardware ID(s). + Providing multiple HWIDs makes it more difficult to bypass HWID bans because spoofing a single component + only changes one of the bans. For example spoofing the MAC address will not spoof the Windows GUID. + + Randomized if system did not support hwid, or perhaps player is cheating. + Should not be called on the client side, but just in case there is a default zeroed array. + + + + + Ignore requests to kick me in debug mode. :) + Steam ID may not have been authenticated yet here which may seem like a security risk, but fortunately that + would get caught when Steam auth ticket response is received. + + + + + Array of 20-byte SHA1 hashes. + + + + + Not using rate limit attribute because this is potentially called for hundreds of structures at once, + and only admins will actually be allowed to apply the transform. + + + + + See BarricadeRegion.FindBarricadeByRootFast comment. + + + + + For code which does not know whether transform exists and/or even is part of a house. + See BarricadeRegion.FindBarricadeByRootFast comment. + + + + + Steam APIs returned uint32 IPv4 addresses in the past, so Unturned code depends on them in some places. + Ideally these uses should be updated for IPv6 support going forward. + For the meantime this method converts from the new format to the old format for backwards compatibility. + + + + + Assets cannot be loaded from Resources during static initialization, so this reference defers the load until + the first time user tries to use it. + + + + + Material on Model_0, the low-speed actual blade. + + + + + Renderer on Model_1. + + + + + Material on Model_1, the high-speed blurred outline. + + + + + transform's localRotation when the vehicle was instantiated. + + + + + Rigidbody component on the root game object. + + + + + If true, set sharedMaterial. If false, set material. + + + + + Calculated speed of this track. Used by some wheels. + + + + + Temporary array for use with physics queries. + + + + + Temporary list for gathering materials. + + + + + Precursor to Net ID. Should eventually become obsolete. + + + + + Asset ID. Essentially obsolete at this point. + + + + + Used to restore vehicle materials when changing skin. + + + + + Only used by trains. Constrains the train to this path. + + + + + Unfortunately old netcode sends train position as a Vector3 using the X channel, but new code only supports + [-4096, 4096) so we pack the train position into all three channels. Eventually this should be cleaned up. + + + + + Nelson 2024-06-24: When first implementing batteries there was only the vanilla battery item, and it was + fine to delete it when the charge reached zero. This may not be desirable, however, so zero now represents + no battery item is present, and one represents the battery is completely drained but still there. + + + + + Is this vehicle inside a safezone? + + + + + Duration in seconds since this vehicle entered a safezone, + or -1 if it's not in a safezone. + + + + + Should askDamage requests currently be ignored because we are inside a safezone? + + + + + Nelson 2024-06-24: This property is confusing, especially with isEnginePowered, but essentially represents + starting the engine ignition when a player enters the driver's seat. If true, there's a driver, there was + sufficient battery to start (or battery not required), and the engine wasn't underwater. + + + + + Doesn't imply the vehicle *uses* batteries, only that it contains a battery item with some charge left. + + + + + Doesn't imply the vehicle *uses* batteries, only that it contains a (potentially uncharged) battery item. + + + + + Nelson 2024-11-13: Adding this primarily to indicate whether a vehicle was spawned by the level versus + placed by a player or bought from a vendor. This way if the number of "naturally"-spawned vehicles is below + a certain threshold the level can spawn more. (e.g., a server where players have hoarded a bunch of + vendor-purchased vehicles and no default vehicles are left for new players.) + + Only available on the server. + Defaults to true for old saves to prevent suddenly spawning a bunch more vehicles. + + + + + Whether the player can shoot their equipped turret. + + + + + Do any of the passenger seats have a player? + + + + + When the server saves it doesn't include any cleared vehicles. + + + + + If true, the vehicle will be destroyed at the end of the frame. Set before OnPreDestroyVehicle. + Used to reject requests to enter the vehicle on the same frame it's being destroyed. + + + + + Magnitude of rigidbody velocity, replicated by current simulation owner. + + + + + Rigidbody velocity along forward axis, replicated by current simulation owner. + + + + + Replicated by current simulation owner. Target velocity used, e.g., for helicopter engine speed. + + + + + [0, 1] If forward velocity is greater than zero, get normalized by target forward speed. If less than zero, + get normalized by target reverse speed. Result is always positive. + + + + + Animated toward ReplicatedForwardVelocity. + + + + + Animated toward ReplicatedVelocityInput. + + + + + [-1.0, 1.0] Available on both client and server. + + + + + Animated towards replicated steering angle. Used for steering wheel and front steering column. + Non-simulating wheels (e.g., car driven by remote client) use this as steering angle multiplied by their + per-wheel . + + + + + Front steering column of bicycles and motorcycles. + + + + + If true, server should replicate latest state to clients. + + + + + Used by several engine modes to represent an interpolated velocity target according to input. + + + + + Set from inputTargetVelocity then multiplied by any factors which shouldn't affect the player's "target" + speed ike boatTraction. + + + + + Vehicles with buoyancy interpolate this value according to whether it's in the water, and multiply + boat-related forces by it. + + + + + Rigidbody on the Vehicle prefab. + (not called "rigidbody" because as of 2024-02-28 the deprecated "rigidbody" property still exists) + + + + + Primarily for backwards compatibility with plugins. Previously, multiple "updates" could be queued per + vehicle and sent to clients. This list was public, unfortunately, so plugins may rely on submitting vehicle + updates. After making it obsolete each vehicle can only be flagged as needing a replication update, and + this is reset after each server replication update. + + + + + Is player currently allowed to repair this vehicle? + + + + + Give battery item to player and set battery charge to zero. + + + + + Nelson 2024-06-24: Previously, this wouldn't give an item to the player if the quality was zero. Now it + trusts the caller to validate we have a battery item to give, and respects . + + + + + Can a tire item be used with this vehicle? + + + + + Find the index of the wheel collider that contains this position. + + + + + Find the index of the wheel collider closest to this position, or -1 if not near any. + + + + + Called during simulate at fixed rate. + + + + + Is a given player allowed access to this vehicle? + + + + + If true, sentry ignores this vehicle early in target scanning. + Friendly if locked by owner/group of sentry, or driven by owner/group of sentry. + + + + + Average vehicle-space position of wheel bases. + + + + + Turn taillights on/off depending on state. + + + + + This check should really not be necessary, but somehow it is a recurring issue that servers get slowed down + by something going wrong and the vehicle exploding a billion times leaving items everywhere. + + + + + VehicleManager expects this to only find the seat, not add the player, + because it does a LoS check. + + + + + Call on the server to empty the vehicle of passengers. + + + + + Kicks them out even if there isn't a good spot. Used when killing the occupant. + + True if player is seated, false otherwise. + + + + Can a safe exit point currently be found? + + Called when considering to add a new passenger to prevent players from entering + a vehicle that they wouldn't be able to exit properly. + + + + + Could a player capsule fit in a given exit position? + + + + True if anything was hit. + + + + Raycast along a given direction, penetrating through barricades attached to THIS vehicle. + Returns point at the end of the ray if unblocked, or a safe (radius) distance away from hit. + + + + + Fallback if there are absolutely no good exit points. + Sets point and angle with a normal player spawnpoint. + + Once vehicle is completely surrounded there is no nice way to pick an exit point. Finding + a point upwards is abused to teleport upward into bases, finding an empty capsule nearby is + abused to teleport through walls, so if we're sure there isn't a nice exit point we can + fallback to teleporting them to a safe spawnpoint. + + + + True if we can safely exit. + + + + Initially use tryGetExit to find a safe exit, but if one isn't available then fallback to getExitSpawnPoint. + + + + + Dedicated server simulate driving input. + + + + + -1 is reverse. + 0 is neutral. + +1 is index 0 in gear ratios list. + + + + + Engine RPM replicated by current simulation owner. + + + + + Animated toward ReplicatedEngineRpm. + + + + + Called when engine RPM exceeds threshold and there are more gears available. + Purpose is to skip gear numbers that don't bring engine RPM within threshold (if possible). + + + + + Called when engine RPM is below threshold and there are more lower gears available. + Purpose is to skip gear numbers that don't bring engine RPM within threshold (if possible). + + + + + Client simulate driving input. + + + + + Nelson 2025-05-05: ran into a bug where our manual OnUpdate is called before Unity calls Start! + + + + + Nelson 2025-05-02: keeping the previous comment from 2020-11-26 here. At first I wondered if 24 vehicles + wasn't enough to properly test, but even with a higher vehicle count it can seemingly be *slower* to + call Update manually. That said, calling Update manually does give us the option to time-slice vehicle + updates. On the client and singleplayer we now update vehicles outside render distance at a lower + frequency which saves ~0.1 ms per frame on my PC. + + 2020-11-26 experimented with dispatching all vehicle updates from C# in VehicleManager because they make up + a significant portion of the MonoBehaviour Update, but the savings on my PC with 24 vehicles on PEI was + minor. Not worth the potential troubles. + + + + + Nelson 2025-04-22: it hopefully goes without saying the bicycle pedals are janky as heck, I'm just separating + out the Update method to make profiling it easier. + + + + + Nelson 2025-04-22: this should ideally be moved into FixedUpdate, incorrect to run in Update. + + + + + Nelson 2025-04-22: this should ideally be moved into FixedUpdate, incorrect to run in Update. + + + + + Update whether this vehicle is inside a safezone. + If a certain option is enabled, unlock after time threshold is passed. + + + + + Can be called without calling init. + + + + + Called after initializing vehicle. + + + + + Makes the collision detection system ignore all collisions between this vehicle and the given colliders. + Used to prevent vehicle from colliding with attached items. + + + + + Used to disable collision between skycrane and held vehicle. + + + + + Transform used for exit physics queries. + + + + + Find collider with the largest volume to use for exit physics queries. + + + + + Set material on DepthMask child renderer responsible for hiding water when interior of vehicle is submerged. + + + + + Skin material does not always need to be destroyed, so this is only valid if it should be destroyed. + + + + + Materials that should be destroyed when this vehicle is destroyed. + + + + + Handles to unregister from DynamicWaterTransparentSort. + + + + + Materials to set _PaintColor on. + + + + + Materials to move UVs in sync with wheels. + + + + + Time.time decayTimer was last updated. + + + + + Seconds since vehicle was interacted with. + + + + + Fractional damage counter. + + + + + transform.position used to test whether vehicle is moving. + + + + + Text from *.dat localization file. + + + + + Older *.content asset bundle reference. + + + + + Newer *.masterbundle reference. + + + + + Optional URL to open in web browser. + + + + + Whether audio source should loop. + + + + + Append suffix to name, or if name contains a '.' insert it before. + + + + + Vendor asset that owns this buy/sell record. + + + + + If not null, replaces item/vehicle description. + + + + + Allows Unity events to startle nearby animals and zombies. + + + + + Transform to spawn the alert at. + If unset, this game object's transform will be used instead. + + + + + If true, find the nearest player within ScanForPlayersRadius, and use the player's position as the alert + origin. + + + + + If UseScanForPlayers is enabled and this is true, an alert is broadcast even if no nearby player was found. + Otherwise, alert is ignored if no nearby player was found. + + + + + Used in a test scene to quickly test whether pooled components are cleaned up. + + + + + Invoked after any player's stance changes (not including loading). + + + + + Stance to fit available space when loading in. + + + + Distance zombies can detect this player within. + + + + Older, cached version of areEyesUnderwater. + + + + + Return false if there are any external restrictions (e.g. reloading, handcuffed) preventing climbing. + + + + + Test whether bottom of controller is currently inside a water volume. + + + + + Test whether viewpoint is currently inside a water volume. + + + + + Test whether body is currently inside a water volume. + Enters the swimming stance while true. + + + + + Draw debug capsule matching the player size. + + + + + Draw standing-height debug capsule matching the player size. + + + + + Is there enough height for our capsule at a position? + + + + + Could a standing player capsule fit at the given position? + + + + + Could a crouching player capsule fit at the given position? + + + + + Could a prone player capsule fit at the given position? + + + + + Could a standing player capsule teleport to the given position? + + + + + Is there any compatible stance that can fit at position? + + + + + Using our capsule's current height would there be enough space at a given position? + + + + + Does capsule have appropriate clearance for a pending height change? + + + + + Replicate stance to clients. + + + + + Regular interact ray still hits the ladder, but we only allow climbing within a smaller range to make its + teleport less powerful. + + + + + Ladder forward ray is 0.75m, so we move slightly less than that away from the ladder. + + + + + Export JSON report of Unturned's assets for economy usage. + + + + + If true, contains child transform named Effect for mythical attachment. + + + + + Attachment item IDs that get skinned specially. + + + + + Is there a fallback material for attachments that respects their main metallic areas? + + + + + Is there a fallback material without any special features? + + + + + Is there a replacement mesh? + + + + + Dawn and dusk skins pull per-lighting colors. + + + + + Pool lists to avoid loopback re-using an existing list. + Callers do not need to manually return lists because they are reset before each frame. + + + + + Exit button only needs to wait for timer in certain conditions. + + + + + Does the item being placed count as a "trap" for the purposes of vehicle placement restrictions? + + + + + Should placement ghost material change be done recursively? + e.g. Sentry has a deep hierarchy of meshes. + + + + + Given path to a workshop map, try to find its /Bundles folder. + + + + + Given path to a workshop map, try to find its /Content folder. + + + + + Maps on the workshop are a root folder named after the published file id, containing + the map folder itself with the level name. In order to load the map's bundles and content + properly we need to find the nested Bundles and Content folders. + + + + + 2023-02-28: note order is important because BarricadeManager saves as a byte! + + + + + Invoked after tellGesture is called with the new gesture. + + + + + Empty transform created at the world origin. + The first-person Viewmodel transform is re-parented to this. + + + + + Child of the first-person skull transform. + + + + + Camera near world origin masking the first-person arms and weapon. + + + + + Used by gun to hide viewmodel arms while aiming 2D scope, and by chainsaw to shake the viewmodel. + + + + + Used to hide viewmodel arms while using a vehicle turret gun. + + + + + Offsets main camera and aim rotation while aiming with a scoped gun. + + + + + Animated toward viewmodelSwayMultiplier. + + + + + Small number (0.1) while aiming, 1 while not aiming. + Reduces viewmodel animation while aiming to make 3D sights more usable. + + + + + Animated toward viewmodelOffsetPreferenceMultiplier. + + + + + 0 while aiming, 1 while not aiming. + Players can customize the 3D position of the viewmodel on screen, but this needs + to be blended out while aiming down sights otherwise it would not line up with + the center of the screen. + + + + + If true, use the scope aim fov instead of non-scope fov. + Useful for players with high (e.g. 160) fov to be able to use scopes. + + + + + Animated toward viewmodelCameraLocalPositionOffset, recoil, and bayonet offsets. + + + + + Abruptly offset when gun is fired, then animated back toward zero. + + + + + Abruptly offset when gun is fired, then animated back toward zero. + x = pitch, y = yaw, z = roll + + + + + Abruptly offset when bayonet is used, then animated back toward zero. + + + + + Animated while player is moving. + + + + + Blended from multiple viewmodel parameters and then applied to viewmodelCameraTransform. + + + + + Smoothing adds some initial blend-in which felt nicer for explosion rumble. + + + + + Meshes are disabled until clothing is received. + + + + + Target viewmodelCameraLocalPosition except while driving. + + + + + Animated while playing is moving. + x = pitch, y = roll + + + + + Offset when player lands. + + + + + Used to measure change in pitch between frames. + + + + + Used to measure change in yaw between frames. + + + + + Animated according to change in pitch/yaw input between frames so that gun rolls slightly while turning. + + + + + Animated according to change in item position between frames so that animations have more inertia. + + + + + Degrees per meter of item distance travelled. + Pitch is driven by vertical displacement, yaw and roll are driven by horizontal. + x = pitch, y = yaw, z = roll + + + + + In third-person this delays leaning in case player only wanted + to switch camera side without leaning. + + + + If true, include current animation speed modifier. + + + + At this point camera is already being shook, we just add some of the same shake to viewmodel for secondary motion. + + + + + Called by clothing to make mesh renderers visible. + + + + + Event for server plugins to monitor whether player is in-inventory. + + + + + Rate limit is relatively high because this RPC handles open/close inventory notification. + + + + + Nelson 2024-03-20: Adding this method because (at the time of writing) first and third-person renderers + and skeletons are activated/enabled in InitializePlayer, onPerspectiveUpdated, and onLifeUpdated, and I + want them to be consistent with the addition of the new NPC Cutscene Mode option. + + + + + 2023-01-18: Viewmodel camera position was originally set during Update (and still is for compatibility), + but for aiming alignment that uses the previous frame's animation position, so we also modify during + LateUpdate to use this frame's animation position. + + + + + Factor e.g. 2 is a 2x multiplier. + Prior to 2022-04-11 this was the target field of view. (90/fov) + + + + + [0, 1] percentage whether a shot decreases ammo count. Defaults to 100%. + For example, 0.25 means 25% of shots will use a bullet, while the remaining 75% will be free. + + + + + [0, 1] percentage whether a shot decreases quality. Defaults to 100%. + Combined with the gun's chance of decreasing quality. + + + + + Players/zombies within this range are treated as potential targets while scanning. + + + + + Will not lose current target within this range. Prevents target from popping in and out of range. + + + + + If true, this sentry can attack players. Defaults to true. + + + + + If true, this sentry can attack zombies. Defaults to true. + + + + + If true, this sentry can attack animals. Defaults to true. + + + + + If true, this sentry can attack vehicles. Defaults to true. + + + + + If the file already exists when writing we will move it to this path. (public issue #4636) + + + + + If false this barricade cannot take damage. + + + + + Modded barricades can disable pooling if they have custom incompatible logic. + + + + + Defaults to false, except for explosive charges which bypass claims. + Requested by Renaxon for collectible barricades that raiders can steal without destroying. + + + + + Defaults to false, except for explosive charges which bypass claims. + If true the item can be placed inside player clip volumes. (out of bounds) + + + + + Should door colliders remain active while animation is playing? + Enabled by modders trying to make stuff like elevators. + + + + + Optional alternative barricade prefab specifically for the client preview spawned. + + + + + By default, vehicles with "hooks" (such as the Skycrane) cannot pick up vehicles with barricades attached. + If all barricades on the vehicle set this to true then the vehicle *can* be picked up. Defaults to false. + + + + + Vehicle to place. + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. + + + + + Legacy ID of vehicle to place. + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. + + + + + Returned asset is not necessarily a vehicle asset yet: It can also be a VehicleRedirectorAsset which the + vehicle spawner requires to properly set paint color. + + + + + Can be added to any GameObject with a Trigger to receive events. + Ensure that Layer will detect player overlaps. Trap is a good candidate. + + + + + Invoked when a player enters the trigger. + Called before OnFirstPlayerEnter. + + + + + Invoked when a player exits the trigger. + Called before OnAllPlayersExit. + + + + + Invoked when first player enters the trigger, and not again until all players have left. + Called after OnPlayerEnter. + + + + + Invoked when last player exits the trigger. + Called after OnPlayerExit. + + + + + Nelson 2024-12-16: This menu and ESteamUGCType are far from ideal, but I'm just trying to hack in a new tag for + server browser curation assets before the update. :P + + + + + Nelson 2025-02-20: Hacking this in to address duplicate buttons when onPublishedAdded is called for a second + page of published files. (public issue #4882) + + + + + Allows Unity events to spawn items. + + + + + Called when the player clicks the cosmetic, visual or skin toggle buttons. + + + + + Invoked after any player's shirt values change (not including loading). + + + + + Invoked after any player's shirt values change (not including loading). + + + + + Invoked after any player's hat values change (not including loading). + + + + + Invoked after any player's backpack values change (not including loading). + + + + + Invoked after any player's backpack values change (not including loading). + + + + + Invoked after any player's backpack values change (not including loading). + + + + + Invoked after any player's glasses values change (not including loading). + + + + + Null if not bookmarked. + + + + + DNS entry to use if adding a bookmark for this server. + + + + + Adjusts width and spacing of buttons along the bottom of the screen. + Favorite and bookmark buttons can be hidden depending whether the necessary server details are set. + + + + + Sort items with lowest "amount" to front of list. + + + + + Sort items with highest "amount" to front of list. + + + + + Sort items with lowest quality% to front of list. + + + + + Sort items with highest quality% to front of list. + + + + + Sum up number of items found, ignoring amount. + Default except as described in TotalAmount comment. + + + + + Sum up "amount" of each item. Optionally counting zero as one (ShouldCountEmptyAsOne). + Default for legacy "ammo type" blueprints and FillTargetItem operation. + + + + + Note: if calling ItemRef.Get() please use FindItemAsset instead to avoid redundant asset lookups. + + + + + If true, items with an "amount" of zero are included in eligible supplies as amount 1. + In practice (as of 2025-03-03), items with zero amount are empty containers such as magazines. + + + + + Determines how totalAmount of each input is calculated. + + + + + If true, items with an "amount" of zero are included in eligible supplies. + Otherwise, they are ignored (default). + + + + + If true, items with an "amount" >= their MaxAmount are ignored. Otherwise, they are eligible (default). + + + + + If true, items with quality of 100% are eligible (default). Otherwise, they are ignored. + + + + + Controls which items are used first. For example, whether to use the lowest quality items first. + + + + + If true, delete input item. Defaults to true. + Replaces the "tool" blueprint option. + + + + + Does this blueprint input require the specified item? + + + + + Controls whether vehicle allows barricades to be attached to it. + + + + + Vehicle does not override placement. This means, by default, that barricades can be placed on the vehicle + unless the barricade sets Allow_Placement_On_Vehicle to false. (e.g., beds and sentry guns) Note that + gameplay config Bypass_Buildable_Mobility, if true, takes priority. + + + + + Vehicle allows any barricade to be placed on it, regardless of the barricade's Allow_Placement_On_Vehicle + setting. The legacy option for this was the Supports_Mobile_Buildables flag. Vanilla trains originally + used this option, but it was exploited to move beds into tunnel walls. + + + + + Vehicle prevents any barricade from being placed on it. Note that gameplay config Bypass_Buildable_Mobility, + if true, takes priority. + + + + + Scene hierarchy path relative to vehicle root. + + + + + Index in renderer's materials array. + + + + + If true, apply to every item in renderer's materials array. + + + + + Controls how vehicle's default paint color (if applicable) is chosen. + + + + + Not configured. + + + + + Pick from the DefaultPaintColors list. + + + + + Pick a random HSV using VehicleRandomPaintColorConfiguration. + + + + + Wheel does not affect steering. + + + + + Set steering angle according to and . + + + + + Increase or decrease motor torque to rotate vehicle in-place. (Tanks) + + + + + For , indicates how a positive motor torque (forward) rotates + the vehicle. + + + + + Wheels on the left side are Clockwise and wheels on the right side are Counter-Clockwise. + + + + + Positive motor torque on this wheel rotates the vehicle clockwise. + + + + + Positive motor torque on this wheel rotates the vehicle counter-clockwise. + + + + + Controls whether wheel creates particle kickup effects for the ground surface material underneath. + + + + + Turn off motion effects. Default for wheels not using collider pose. + + + + + Enable motion effects. Default for wheels using collider pose. + + + + + Enable motion effects, but turn them off while moving backward. + + + + + Enable motion effects, but turn them off while moving forward. + + + + + [0, 1] color will have zero saturation if random value is less than this. For example, 0.2 means 20% of + vehicles will be grayscale. + + + + + If true, this configuration was created by . + Otherwise, this configuration was loaded from the vehicle asset file. + + + + + Transform path relative to Vehicle prefab with WheelCollider component. + + + + + If true, WheelCollider's motorTorque is set according to accelerator input. + + + + + Transform path relative to Vehicle prefab. Animated to match WheelCollider state. + + + + + If true, model is animated according to steering input. + Only kept for backwards compatibility. Prior to wheel configurations, only certain WheelColliders actually + received steering input, while multiple models would appear to steer. For example, the APC's front 4 wheels + appeared to rotate but only the front 2 actually affected physics. + + + + + If true, model ignores isModelSteered and instead uses WheelCollider.GetWorldPose when simulating or the + replicated state from the server when not simulating. Defaults to false. + + + + + If greater than zero, visual-only wheels (without a collider) like the extra wheels of the Snowmobile use + this radius to calculate their rolling speed. + + + + + If set, visual-only wheels without a collider (like the back wheels of the snowmobile) can copy RPM from + a wheel that does have a collider. Requires modelRadius to also be set. + + + + + If set, wheel model uses this crawler track's speed (average RPM of wheels). Prevents wheel model from + spinning out of sync with overall track. + + + + + Target steering angle is multiplied by this value. For example, can be set to a negative number for + rear-wheel steering. Defaults to 1. + + + + + Vertical offset of model from simulated suspension position. + + + + + How quickly to interpolate model toward suspension position in meters per second. + If negative, position teleports immediately. + + + + + Nelson 2024-12-06: Initially implemented as a minimum and maximum percentage of normalized forward velocity, + but think this is more practical. I can't think of why we would use values other than -1, 0, +1 for that, + and if we did we'd probably want some tuning for the angle particles are emitted at. + + + + + If true, wheel should fly off when vehicle explodes. Defaults to true. + Used to simplify destroying vehicles with crawler tracks. + + + + + Default. + + + + + Set pitch and volume of a single clip according to engine RPM. + + + + + Offsets a crawler track's material UV offset in sync with wheels rolling. + + + + + Scene hierarchy path relative to vehicle root. + + + + + Index in renderer's materials array. + + + + + Indices of wheels to copy RPM from. + + + + + How far to travel to offset UV 1x. (1/x) + + You can calculate RepeatDistance by selecting an edge parallel to the crawler track and dividing the UV + distance by the physical 3D distance. For example, if the UV length is 2 and the 3D length is 1.5 m then + the texture repeats 1.33 UV/m. + + + + + UV mainTextureOffset per distance traveled. + + + + + Please refer to: + + + + + Please refer to: + + + + + Supports redirects by VehicleRedirectorAsset. + + "Shared Skins" were implemented when there were several asset variants of each vehicle. For example, + Off_Roader_Orange, Off_Roader_Purple, Off_Roader_Green, etc. Each vehicle had their "shared skin" set to + the same ID, and the skin asset had its target ID set to the shared ID. This isn't as necessary after + merging vanilla vehicle variants, but some mods may rely on it, and it needed GUID support now that the + target vehicle might not have a legacy ID. + + + + + Prevents calling getOrLoad redundantly if asset does not exist. + + + + + Clip.prefab + + + + + Vehicle.prefab + + + + + Nelson 2024-02-28: Prior to the VehicleWheelConfiguration class, most of the wheel configuration was + inferred during InteractableVehicle initialization from the children of the "Tires" and "Wheels" transforms. + Confusingly, "Tires" only contains WheelColliders and "Wheels" only contains the visual models. Rather than + keeping the old behavior in InteractableVehicle alongside the newer more configurable one, we match the old + behavior here to generate an equivalent configuration. + + Note that must be initialized before this is called (by loading model). + + + + + Maximum (negative) velocity to aim for while accelerating backward. + + + + + Maximum speed to aim for while accelerating backward. + + + + + Maximum velocity to aim for while accelerating forward. + + + + + Maximum speed to aim for while accelerating forward. + + + + + Steering angle range at zero speed. + + + + + Steering angle range at target maximum speed (for the current forward/backward direction). + + + + + Steering angle rotation change in degrees per second. + + + + + Added or subtracted from wheel motor torque in mode. + + + + + When a wheel is in mode and a steering input is applied the + stiffness is multiplied by this factor. This allows the vehicle + to rotate in-place with a lower steering torque, which helps prevent the vehicle from going out of control + while turning and accelerating. + + + + + Multiplier for and + while at target maximum speed (for the current forward/backward direction). + + + + + Torque on Z axis applied according to steering input for bikes and motorcycles. + + + + + If true, leaning force is multiplied by normalized speed to the power of steeringLeaningForceSpeedExponent. + Defaults to false. + + + + + Refer to steeringLeaningForceShouldScaleWithSpeed. + + + + + If true, explosion will damage nearby entities and kill passengers. + + + + + Only used if ShouldExplosionBurnMaterials. Optional. Allows specifying which renderers to burn. + + + + + When true the bicycle animation is used and extra speed is stamina powered. + Bad way to implement it. + + + + + Can this vehicle ever spawn with a charged battery? + Uses game mode battery stats when true, or overrides by preventing battery spawn when false. + + + + + Battery charge when first spawning in is multiplied by this [0, 1] number. + + + + + Battery decrease per second. + + + + + Battery increase per second. + + + + + Battery item given to the player when a specific battery hasn't been manually + installed yet. Defaults to the vanilla car battery (098b13be34a7411db7736b7f866ada69). + + + + + Fuel decrease per second. + + + + + Client sends physics simulation results to server. If upward (+Y) speed exceeds this, mark the move invalid. + + + + + Client sends physics simulation results to server. If downward (-Y) speed exceeds this, mark the move invalid. + + + + + If distance between client-submitted hit position and vehicle pivot point is too high the hit will be + marked invalid. This multiplies the distance threshold, useful for very fast vehicles. + + + + + Vertical first-person view translation. + + + + + Vertical first-person view translation. + + + + + Base damage to players when traveling at 1 m/s. Defaults to 10. + + + + + Base damage to zombies when traveling at 1 m/s. Defaults to 15. + + + + + Base damage to animals when traveling at 1 m/s. Defaults to 15. + + + + + Base damage to objects when traveling at 1 m/s. Defaults to 30. + + + + + Base damage to trees when traveling at 1 m/s. Defaults to 85. + + + + + If speed multiplied by is less than this, no damage is applied. + Defaults to 3. + + + + + Multiplier for damage from crashing into things. + Not applicable if is false. + Defaults to 1. + + + + + To non-explosions. + + + + + Mega zombie rocks, zombies, animals. + + + + + Crashing into stuff. + + + + + Can this vehicle be repaired by a seated player? + + + + + Can mobile barricades e.g. bed or sentry guns be placed on this vehicle? + + + + + Should capsule colliders be added to seat transforms? + Useful to prevent bikes from leaning into walls. + + + + + Can players lock the vehicle to their clan/group? + True by default, but mods want to be able to disable. + + + + + Can players steal the battery? + + + + + Spawn table to drop items from on death. + + + + + Minimum number of items to drop on death. + + + + + Maximum number of items to drop on death. + + + + + Item ID of compatible tire. + + + + + If greater than zero, torque is applied on the local Z axis multiplied by this factor. + Note that is critical for damping this force. + + + + + Exponent on the [0, 1] factor representing how aligned the vehicle is with the ground up vector. + + + + + If greater than zero, an acceleration is applied to angular velocity on Z axis toward zero. + + + + + Indices of wheels using replicated collider pose (if any). + Null if not configured or no wheels using this feature. + Allows client and server to replicate only the suspension value without other context. + + + + + Indices of wheels with motor torque applied (if any). + Used for engine RPM calculation. + + + + + If this and UsesEngineRpmAndGears are true, HUD will show RPM and gear number. + + + + + When engine RPM dips below this value shift to the next lower gear if available. + + + + + When engine RPM exceeds this value shift to the next higher gear if available. + + + + + How long after changing gears before throttle is engaged again. + + + + + How long between changing gears to allow another automatic gear change. + + + + + Minimum engine RPM. + + + + + Maximum engine RPM. + + + + + How quickly RPM can increase in RPM/s. + e.g., 1000 will take 2 seconds to go from 2000 to 4000 RPM. + + + + + How quickly RPM can decrease in RPM/s. + e.g., 1000 will take 2 seconds to go from 4000 to 2000 RPM. + + + + + Maximum torque (multiplied by output of torque curve). + + + + + Was a center of mass specified in the .dat? + + + + + If hasCenterOfMassOverride, use this value. + + + + + Multiplier for otherwise not-yet-configurable plane/heli/boat forces. + Nelson 2024-03-06: Required for increasing mass of vehicles without significantly messing with behavior. + + + + + If set, override the wheel collider mass with this value. + + + + + Null if vehicle doesn't support paint color. + + + + + List of transforms to register with DynamicWaterTransparentSort. + + + + + Null if vehicle doesn't support paint color. + + + + + Null if isn't . + + + + + Pick a random paint color according to . Null if unsupported or not configured. + + + + + If true, Vehicle Paint items can be used on this vehicle. + Always false if is false. + + Certain vehicles may support paint colors without also being paintable by players. For example, the creator + of a vehicle may want to use color variants without also allowing players to make it bright pink. + + + + + Returns reverseGearRatio for negative gears, actual value for valid gear number, otherwise zero. + Exposed for plugin use. + + + + + Get number of reverse gear ratios. + Exposed for plugin use. + + + + + Get number of forward gear ratios. + Exposed for plugin use. + + + + + Number of tire visuals to rotate with steering wheel. + + + + + If true then level should convert old terrain. + + + + + If true, splatmap conversion should use weights as-is. + + + + + Material guids converted by legacy asset bundle hash or texture names. + + + + + Hash of Trees.dat, or zeroed if any assets were missing locally. + Should only be used if level is configured to, as many mod maps are typically missing assets. + + + + + Nelson 2025-06-10: replacement for _trees. Enables trees outside the "insane" level bounds. + + + + + Append all trees in the level to results list. + + + + + Game does not currently have a way to resave level's Config.json file, so instead we save a text file + indicating that the terrain auto conversion was performed. If there was a bug with auto conversion then + all of the old files are still present and can be re-converted. + + + + + Stagger regional visibility across multiple frames. + + + + + Caches uint16 ID to ID redirects. + + + + + Manages lifetime and attachment of a mythical effect. Added by . + Was called `MythicLocker` with a paired `MythicLockee` prior to 2024-06-11. + + + + + https://steamcommunity.com/dev/managegameservers + + + + + IP address, DNS name, or a web address (to perform GET request) to advertise. + + Servers not using Fake IP can specify just a DNS entry. This way if server's IP changes clients can rejoin. + For example, if you own the "example.com" domain you could add an A record "myunturnedserver" pointing at + your game server IP and set that record here "myunturnedserver.example.com". + + Servers using Fake IP are assigned random ports at startup, but can implement a web API endpoint to return + the IP and port. Clients perform a GET request if this string starts with http:// or https://. The returned + text can be an IP address or DNS name with optional query port override. (e.g., "127.0.0.1:27015") + + + + + If true, the server lobby warns that in-game ping may be higher than shown. BUT it's shown in the default + UI color rather than the "bad" color when flagged by moderation. + + + + + If ready-to-connect messages are received more than twice from the same client in less than this many + seconds they will be kicked. + + + + + If bad packets (that *may* be legitimate) are received more than threshold times within this many seconds + of each other, reject the calling connection. + + + + + If more than this many bad packets (that *may* be legitimate) are received within window seconds of each + other, reject the calling connection. + + + + + If a rate-limited method is called this many times within cooldown window the client will be kicked. + For example a value of 1 means the client will be kicked the first time they call the method off-cooldown. (not recommended) + + + + + Only applicable when Fake IP is off. When a client is connecting, if their connection would push the number + of simultaneous connections from the same IP address past this number, they are prevented from joining. + + May be useful to prevent against fake join requests coming from a single source IP. (public issue #5001) + + Defaults to a high value because some regions will have many more clients with the same IPv4 address than + others. For example, due to Carrier-grade NAT (CGNAT). + + + + + Whether rejections for Max_Clients_With_Same_IP_Address should log to command output. Useful for checking + if the limit is appropriate. + + + + + Ordinarily the server should be receiving multiple input packets per second from a client. If more than this + amount of time passes between input packets we flag the client as potentially using a lag switch, and modify + their stats (e.g. reduce player damage) for a corresponding duration. + Minimum value is PlayerInput.MIN_FAKE_LAG_THRESHOLD_SECONDS. + + + + + Whether fake lag detection should log to command output. False positives are relatively likely when client + framerate hitches (e.g. loading dense region), so this is best used for tuning threshold rather than bans. + + + + + PvP damage multiplier while under fake lag penalty. + + + + + Should we kick players after detecting spammed calls to askInput? + + + + + Should we kick players if they do not submit inputs for a long time? + + + + + Should the server automatically shutdown at a configured time? + + + + + When the server should shutdown if Enable_Scheduled_Shutdown is true. + + + + + Broadcast "shutting down for scheduled maintenance" warnings at these intervals. + + + + + Should the server automatically shutdown when a new version is detected? + + + + + Unfortunately the server does not have a way to automatically determine the current beta branch. + + + + + Broadcast "shutting down for update" warnings at these intervals. + + + + + Should vanilla text chat messages always use rich text? + Servers with plugins may want to enable because IMGUI does not fade out rich text. + Kept because plugins might be setting this directly, but it no longer does anything. + + + + + Should the EconInfo.json hash be checked by the server? + + + + + If true, opt-in to SteamNetworkingSockets "FakeIP" system. + https://partner.steamgames.com/doc/api/ISteamNetworkingSockets#1 + + + + + If greater than zero, vehicles with XZ position outside this threshold are saved in the center of the map. + By default, vehicles outside ±40 km are teleported into the map. + Intended to help with physics issues caused by vehicles far out in space. (public issue #4465) + + + + + Limit max queue timeout duration so that if server encounters an error or doesn't + process the request the client can timeout locally. + + + + + Longer than server timeout so that ideally more context is logged on the server + rather than just "client disconnected." + + + + + Original option for disabling item quality. Defaults to true. If false, items spawn at 100% quality and + their quality doesn't decrease. For backwards compatibility, the newer per-item-type durability options + are ignored if this is off. + + + + + Food-specific replacement for . Defaults to false. If true, food spawns at 100% quality. + + + + + Water-specific replacement for . Defaults to false. If true, water spawns at 100% quality. + + + + + Clothing-specific replacement for . Defaults to false. If true, clothing spawns at 100% quality. + + + + + Weapon-specific replacement for . Defaults to false. If true, weapons spawns at 100% quality. + + + + + Fallback used when spawning an item that doesn't fit into one of the other quality/durability settings. + Defaults to false. If true, items spawn at 100% quality. + + + + + Clothing-specific replacement for . Defaults to true. If false, clothing quality + doesn't decrease when damaged. + + + + + Melee and gun replacement for . Defaults to true. If false, weapons quality + doesn't decrease when used. + + + + + Seconds vehicle can be neglected before it begins taking damage. + + + + + After vehicle has been neglected for more than Decay_Time seconds it will begin taking this much damage per second. + + + + + Vehicles are considered "natural" if they were spawned by the level as opposed to players or vendors. + If less than this many natural vehicles exist in the level, more will be spawned. The minimum of this or + Max_Instances is used. (i.e., if this value is higher than max instances the max instances value is used + instead.) + + + + + Minimum seconds between boss zombie spawns for players doing quests. + Players were abusing the spawns to farm boss tier loot. + + + + + Weapon damage multiplier against body, arms, legs. Useful for headshot-only mode. + + + + + Should players be allowed to build on their vehicles? + + + + + Should players be allowed to build traps (e.g. barbed wire) on their vehicles? + + + + + Furthest away from colliders a player can build an item onto their vehicle. + + + + + Furthest away from colliders a player can build a trap (e.g. barbed wire) onto their vehicle. + + + + + [0, 1] percentage of skill levels to retain after death. + + + + + [0, 1] percentage of skill levels to retain after death. + + + + + Number of skill levels to remove after death. + + + + + Number of skill levels to remove after death. + + + + + [0, 1] percentage of experience points to retain after death. + + + + + [0, 1] percentage of experience points to retain after death. + + + + + Should each character slot have separate savedata? + + + + + If true, players will be kicked if their skin color is too similar to one of the level's terrain colors. + + + + + Each per-level custom weather frequency is multiplied by this value. + + + + + Each per-level custom weather duration is multiplied by this value. + + + + + Should ServerTextChatMessenger be allowed to broadcast? + + + + + Should ServerTextChatMessenger be allowed to execute commands? + + + + + Should ClientTextChatMessenger be allowed to broadcast? + + + + + Should ClientTextChatMessenger be allowed to execute commands? + + + + + Should group connections be shown on player list? + + + + + If true, allow automatically creating an in-game group for members of your Steam lobby. + Requires Allow_Dynamic_Groups to be enabled as well. + + + + + Is friendly-fire allowed? + + + + + Are sentry guns and beds allowed on vehicles? + + + + + Should holiday (Halloween and Christmas) content like NPC outfits and decorations be loaded? + + + + + Can "freeform" barricades be placed in the world? + Defaults to true. + + + + + Can "freeform" barricades be placed on vehicles? + Defaults to true. + + + + + If true, aim flinches away from center when damaged. + Defaults to true. + + + + + If true, camera will shake near explosions. Can also be toned down client-side in Options menu. + Defaults to true. + + + + + If true, crafting blueprints can require nearby workstations. Defaults to true. + If false, only the backwards-compatibility "Heat Source" vanilla crafting tag can be required. This + functions identically to the cooking-skill-also-requires-heat behavior from before. + + + + + If true, client-side options like damage flinch, explosion camera shake, viewmodel bob are ignored. + Defaults to false. + + + + + If true, hide viewmodel while aiming a dual-render scope and show a 2D overlay instead. + + Nelson 2025-07-04: adding this option for backwards compatibility with modded scopes that have a small + enough dual-render surface to zoom-*out* when aiming in. + + Defaults to false. + + + + + Scales velocity added to players by explosion knock-back. + + + + + Scales midair input change in player direction. + + + + + Scales midair decrease in speed while faster than max walk speed. + + + + + Scales magnitude of recoil while using first-person perspective. + + + + + Scales magnitude of recoil while aiming in first-person perspective. + + + + + Scales magnitude of recoil inversely with zoom level while aiming in first-person perspective. + + + + + Scales magnitude of recoil while using third-person perspective. + + + + + Scales magnitude of bullet inaccuracy while using third-person perspective. + + + + + [0, 1] Scales how much the first-person move up and down while jumping/landing. + + + + + [0, 1] Scales how much the first-person arms move while ADS. + + + + + Center mythical effect hook horizontally, but maintain vertical placement. + Lots of hats/masks/glasses have off-center effects intentionally, but community + feedback suggests centering to make effects like circling atoms look better. + + + + + Set mesh of all character mesh renderers. + Tries to match renderer index to mesh LOD index. + + + + + Set material of all character mesh renderers. + + + + + Hack for previewing the "aura" cosmetic items. + + + + + If true, this character is for capturing clothing icons. + + + + + Planar reflection component updates its culling distance and culling mask when this is incremented. + + + + + Overrides in-game UI scale setting. + + + + + Distance to use terrain shaders before fallback to a baked texture. + + + + + Higher error reduces vertex density as distance increases. + + + + + Added for players who want to see if they can get better performance with a ridiculously low max draw distance. + + + + + Multiplier for far clip plane distance. + Clamped within [0, 1] range to prevent editing config files for an advantage. + + + + + Multiplier for draw distance. + Clamped within [0, 1] range to prevent editing config files for an advantage. + + + + + Multiplier for draw distance of optional super-low LOD models. + Clamped within [0, 1] range to prevent editing config files for an advantage. + + + + + Vehicles outside this distance are not rendered. + + + + + Called after loading graphics settings from disk so that their values can be adjusted. + + + + + If default resolution is zero, try falling back to a higher one. + Used when restoring defaults and validating loaded settings. + + + + + If true, make the game look as nice as possible. + Note: certain limits are imposed except in singleplayer to prevent this from being exploited. + + + + If true, include current animation speed modifier. + + + True if an animation was found and started playing. + + + + Velocity is directly set to input velocity. + + + + + Velocity is affected by acceleration and deceleration. + + + + + Properties common to asset and extensions. For example both can specify sounds. + + + + + Invokes an event a configured number of times. + + + + + If true the event will only be invoked in offline mode and on the server. + + + + + Invoked multiple times. + + + + + Sanity check all returned elements have a gameObject. + + + + + Create software cursor visual element. + + + + + Create green label in the upper-left. + + + + + Create tooltip visual element. + + + + + Update upper-left green text. + + + + + Update software cursor visual element. + + + + + Find hovered element and update tooltip visibility/text. + + + + + Container for SleekWindow element. + + + + + Container for top-level visual elements. + + + + + Element under the cursor on the previous frame. + + + + + Duration in seconds the cursor has been over the element. + + + + + EconInfo.json hash does not match. + + + + + Master bundle hashes do not match. + + + + + Workshop usage advertised on server list does not match during connect. + + + + + Used by client transport to show a custom localized message. + + + + + Server has not received an auth session response from Steam yet. + + + + + Server has not received an economy response from Steam yet. + + + + + Server has not received a groups response from Steam yet. + + + + + Player nickname exceeds limit. + + + + + Player nickname contains invalid characters. + + + + + Player nickname should not be a number. + + + + + Server did not respond to EServerMessage.Authenticate + + + + + Player resources folders don't match. + + + + + The network identity in the ticket does not match the server authenticating the ticket. + This can happen if server's Steam ID has changed from what the client thinks it is. + For example, joining a stale entry in the server list. (public issue #4101) + + + + + Level name advertised on server list does not match during connect. + + + + + VAC status advertised on server list does not match during connect. + + + + + BattlEye status advertised on server list does not match during connect. + + + + + Max players advertised on server list does not match during connect. + + + + + Camera mode advertised on server list does not match during connect. + + + + + Combat mode advertised on server list does not match during connect. + + + + + Player's skin color is too similar to one of . + + + + + Steam ID reported by net transport doesn't match client's reported Steam ID. + This was exploited to fill the server queue with fake players. + + + + + Received too many connection requests from player in a short window. + + + + + Received too many invalid messages from connection in a short window. + + + + + Same as CUSTOM, but shows the "verify game files" prompt. + + + + + Server limits how many clients are joining from the same IP address. + (public issue #5001) + + + + + Does this label fade out as the chat message gets older? + + + + + Chat message values to show. + + + + + Invoked after state is first loaded, synced from server when entering relevancy, or reset. + + + + + Invoked after interaction changes state. + + + + + Number of event hooks monitoring or controlling this. + Used to allow client to control remote objects on server. + + + + + Remove items that do not match search text. + + + + + Note SetListing also calls RefreshInCart. + + + + + Cannot be created until store data is available. + + + + + Toggle button to open/close advanced filters panel. + + + + + On/off checkbox for including already-owned items in filter. + + + + + Container for advanced options. + + + + + Displays the current page number. + + + + + Only visible when cart is not empty. + + + + + [0, pageCount) + + + + + If true, listings should be re-filtered when opening the menu. + + + + + Collections of multiple items. + + + + + Discounted items. + + + + + Items marked as new in the Status.json file. + + + + + Items marked as featured in the Status.json file. + + + + + Implemented by "root" component of each entity type that can provide crafting tags to nearby players. + This allows overlap with a barricade attached to a vehicle to find the barricade from barricade collider and + vehicle from vehicle collider rather than using transform root. Any mod hook extensions to crafting tags will + be sibling components or descendants of this component. + + + + + Asset providing tags. For example, a barricade item. + + + + + True if GetAvailableTags can ever add any tags. + Used to skip unnecessary line-of-sight tests against (for example) ordinary structures and the like. + + + + + All tags added by this crafting tag provider. + + + + + Rewards to grant when quest is removed without completing. + Not granted when player finishes quest. + + + + + Configuration for DedicatedUGC. + + + + + Published workshop file IDs to download. + + + + + Published workshop file IDs whose children (dependencies) should be skipped. + Useful if workshop author lists dependencies as a way of advertising. + + + + + Controls SetAllowCachedResponse. Disabled when set to zero. + Balance between item change frequency and allowing cached results when query fails. + + + + + Number of total times to try re-submitting failed workshop queries before aborting. + + + + + Should items already installed be loaded? + + + + + Should used items be monitored for updates? + + + + + Seconds to wait before shutting down after an update is detected. + + + + + Message broadcasted when shutdown timer begins. + + + + + Message sent to players when shutdown timer completes. + + + + + Get instance if loaded, but do not load. + + + + + Get instance, or load if not yet loaded. + + + + + Should only be used by . + For example: "Condition_##" where ## is an index. + + + + + Nelson 2025-03-11: not *super* happy about having this in here. Needed for UI_Requirements. + + + + + Nelson 2025-03-11: not *super* happy about having this in here. Needed for UI_Requirements. + + + + + If set, only show this condition in the UI when conditions with these indices are met. + For example don't show "arrest the criminal (name)" until "investigate crime" is completed. + + + + + Is this condition influenced by a given quest flag? + Used by level objects to determine if local player's flag change may affect visibility. + + + + + Replacement for isAssociatedWithFlag to fix quest conditions and somewhat improve perf. + + + + + Intended to replace filling data from constructor. + + + + + Intended to replace filling data from constructor. Legacy is for backwards compatibility with Condition_#_Key + format, whereas V2 uses the list and dictionary features. + + + + + Can be added to gun item game objects (including children) to receive events. + + + + + Which attachment type to monitor. + + + + + Optional. If set, only consider item matching this GUID. I.e., slot is considered empty if attached item + has a different asset GUID. + + + + + If true, AssetGuidFilter passes when item in slot *doesn't* match GUID. + + + + + Invoked both when: + 1. Gun is first equipped and an item is already present in the slot. + 2. An item is added to the slot. + + + + + Invoked both when: + 1. Gun is first equipped and the slot is empty. + 2. An item is removed from the slot. + + + + + Controls whether events are invoked when asset in slot changes. + + + + + Nelson 2025-02-04: Gun attachment slots are currently hard-coded, but if that changes this could be updated + with a "custom" option. + + + + + If emptiness of slot doesn't change (attachment replaced), do nothing. + + + + + In addition to regular Attached and Detached events, if the item asset in the slot changes invoke + Detached then Attached. + + + + + State doesn't affect AI collision. + + + + + AI collision is blocked when object state is ON. + + + + + AI collision is blocked when object state is OFF. + + + + + Controls how rubble affects Nav game object. + + + + + Default. Destruction of rubble sections does not affect whether Nav game object is active or not. + + + + + AI collision is blocked when any sections are alive. Once all sections are dead AI collision is unblocked. + + + + + The game uses Process.Start to open web links when the Steam overlay is unavailable, which could be exploited + to e.g. download and execute files. To prevent this we only allow valid http or https urls. + + If true, prefix with https:// if neither http:// or https:// is specified. + + + + This version just doesn't return the parsed URL. + + + + + Resolve spawn table asset if set, otherwise find asset by legacy in-editor ID configuration. + Returned asset is not necessarily a vehicle asset yet: It can also be a VehicleRedirectorAsset which the + vehicle spawner requires to properly set paint color. + + + + + Used when spawn table asset is not assigned. Pick a random legacy ID using in-editor list of spawns. + + + + + Multiplier for how quickly deadzones deplete a gasmask's filter quality. + e.g., 2 is faster (2x) and 0.5 is slower. + + + + + Hack for previewing the "aura" cosmetic items. + + + + + Was redirected to HolidayUtil but kept for plugin backwards compatibility. + Refer to HolidayUtil for explanation of this weird situation. + + + + + Was redirected to HolidayUtil but kept for plugin backwards compatibility. + Refer to HolidayUtil for explanation of this weird situation. + + + + + The base transform does not rotate, instead a child transform is created with the pivot in the center. + + + + + To work around a uGUI bug we always a sign a texture, even if desiredTexture is null. + + + + + Broadcasts after dedicated server name changes. + Command IO interface binds to this rather than having a title-specific method. + + + + + Should the default console I/O handler be created? + Plugins can disable on the command line when overriding handler. + + + + + Should the legacy blocking (game thread) console be created? + + + + + Log white information. + + + + + Log yellow warning. + + + + + Log red error. + + + + + Print white message to console. + + + + + Print yellow message to console. + + + + + Print red message to console. + + + + + Cannot use UnturnedLog here because it may recursively call CommandWindow if another exception is thrown. + + + + + Called during Unity Update loop. + + + + + Called during OnApplicationQuit. + + + + + Helper for plugins that want to replace the default without the shouldCreateDefaultConsole flag. + + + + + If true, the player can press Interact [F] when there are no responses + and the "next" dialogue will be opened. + + + + + Each dialogue message is separated into multiple pages. + + + + + Current page localized text with name_npc and name_char formatted in. + + + + + Seconds elapsed while viewing current page not including pause timer. + Used to gradually show the message text. + + + + + Seconds to wait before resuming pageAnimationTime counting. + + + + + Appends chars from pageFormattedText according to pageAnimationTime. + + + + + Rich text formatting tags to close those opened by visible text in animatedTextBuilder. + For example, if animatedTextBuilder includes an opening color=#, this includes the closing color markup. + Required depending on Glazier used. + + + + + Number of chars of pageFormattedText currently visible. + + + + + Added to animation visible chars to skip time on markup. + + + + + Seconds elapsed since responses started becoming visible. + Used to gradually enable responses rather than all at once. + + + + + Animated toward total number of responses to make them gradually visible. + + + + + If true, animation is finished and there is another page to show when Interact [F] is pressed. + + + + + If true, text on current page is in the process of gradually appearing. + + + + + Used by quest UI to return to current dialogue. + + + + + Update timers and UI for current page index. + + + + + Called when the player presses Interact [F] in dialogue screen. + + + + + Show complete text for the current page and make responses visible. + Called if dialogue animation is disabled, and when the player presses Interact [F] during animation. + + + + + Use "Interact" token from translation file. + + + + + If true, description should only be populated with contents from prior to the auto-layout UI changes. + + + + + BuildDescription implementations can use this to concatenate longer strings. + + + + + Which parent to use when attaching an equipped/useable item to the player. + + + + + Helper for plugins that want item prefabs server-side. + e.g. Allows item icons to be captured on dedicated server. + + + + + Item name wrapped in color rich text tags according to rarity. + + + + + Hack for Kuwait aura icons. + + + + + Useable subclass. + + + + + Can this useable be equipped by players? + True for most items, but allows modders to create sentry-only weapons. + + + + + Can this useable be equipped while underwater? + + + + + Vertical half size of icon camera. + Values less than zero are disabled. + + + + + Vertical half size of economy icon camera. + + + + + Should the newer automatic placement and orthographic size for axis-aligned icon cameras be used? + Enabled by default, but optionally disabled for manual adjustment. + + + + + Nelson 2025-04-10: adding this for semantics because amount isn't an obvious name. + + + + + If true, item should be removed when "amount" reaches zero. + Defaults to true except for magazines. + + + + + Which parent to use when attaching an equipped/useable item to the player. + + + + + If true, equipable prefab is a child of the left hand rather than the right. + Defaults to false. + + + + + Whether viewmodel should procedurally animate inertia of equipped item. + Useful for low-quality older animations, but modders may wish to disable for high-quality newer animations. + + + + + Defaults to true. If false, the equipped item model is flipped to counteract the flipped character. + + + + + If true, stats like damage, accuracy, health, etc. are automatically appended to the description. + Defaults to true. + + + + + Nelson 2024-12-11: This can now be null for cosmetic items (). For those items it wasn't + used outside of the main menu 3D item preview, in which case the clothing prefab is typically a better + visualization. + + + + + Optional alternative item prefab specifically for the PlayerEquipment prefab spawned. + + + + + Name to use when instantiating item prefab. + By default the asset legacy id is used, but it can be overridden because some + modders rely on the name for Unity's legacy animation component. For example + in Toothy Deerryte's case there were a lot of duplicate animations to work + around the id naming, simplified by overriding name. + + + + + Movement speed multiplier while the item is equipped in the hands. + + + + + Sound to play when inspecting the equipped item. + + + + + Sound to play when moving or rotating the item in the inventory. + + + + + When a player dies with this item, should an item drop be spawned? + + + + + Can player click the drop button on this item? + + + + + If this item is compatible with skins for another item, lookup that item's ID instead. + + + + + Defaults to true. If false, skin material and mesh are not applied when is + set. For example, a custom axe can transfer the kill counter and ragdoll effect from a vanilla item's skin + without also transferring the material and mesh. + + + + + Should friendly-mode sentry guns target a player who has this item equipped? + + + + + Kept in case any plugins refer to it. + Renamed to shouldFriendlySentryTargetUser. + + + + + Should players be allowed to start primary/secondary use of this item while inside given safezone? + If returns false the primary/secondary inputs are set to false. + + + + + Should this item be deleted when using and quality hits zero? + e.g. final melee hit shatters the weapon. + + + + + Should the game destroy all child colliders on the item when requested? + Physics items in the world and on character preview don't request destroy, + but items attached to the character do. Mods might be using colliders + in unexpected ways (e.g., riot shield) so they can disable this default. + + + + + Are there any official skins for this item type? + Skips checking for base textures if item cannot have skins. + + + + + Find useableType by useable name. + + + + + V2 is for newer dat list features. + + + + + Legacy is for backwards compatibility with Blueprint_# format. + + + + + V2 is for newer dat list features. + + + + + Legacy is for backwards compatibility with Action_# format. + + + + sortOrder values for description lines. + Difference in value greater than 100 creates an empty line. + + + + Properties common to Gun and Melee. + + + + + Properties common to Barricade and Structure. + + + + + Properties common to Gun, Consumable, and Throwable. + + + + + Properties common to Gun and Melee. + + + + + Properties common to Gun and Melee. + + + + + Properties common to Gun and Melee. + + + + + Properties common to Gun and Melee. + + + + + Remaps asset load requests into a large asset bundle rather than small individual asset bundles. + + + + + Config that contains the actual large AssetBundle. + + + + + Asset path relative to the master AssetBundle. + + + + + Icon visible when this listing is in the cart. + + + + + "SALE" or "NEW" text visible when applicable. + + + + + Tooltip text. + + + + + Holds tooltip text + + + + + Nelson 2025-01-28: This command reproduces a bug destroying the player gameObject if the vehicle is + destroyed on the same frame as the request to exit. + https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/4760#issuecomment-2613090165 + + + + + Speaker writes compressed audio to this buffer. + Listener copies network buffer here for decompression. + + + + + Listener writes decompressed PCM data to this buffer. + + + + + Seconds interval to wait between asking recording subsystem for voice data. + Rather than polling every frame we wait until data has accumulated to send. + + + + + Seconds to wait before playing back newly received data. + Allows a few samples to buffer up so that we don't stutter as more arrive. + + + + + Seconds to wait after playback before stopping audio source. + We zero this portion of the clip to prevent pops. + + + + + Max calls to askVoice server will allow per second before blocking their voice data. + Prevents spamming many tiny requests bogging down server output. + + + + + Max compressed bytes server will allow per second before blocking their voice data. + When logging compressed size they averaged 3000-5000 per second, so this affords some wiggle-room. + + + + + Internal value managed by isTalking. + + + + + Is this player broadcasting their voice? + Used in the menus to show an indicator who's talking. + Locally set when recording starts/stops, and remotely when voice data starts/stops being received. + + + + + Broadcasts after isTalking changes. + + + + + Can this player currently hear global (radio) voice chat? + + + + + Is the player wearing an earpiece? + Allows global (radio) voice chat to be heard without equipping the walkie-talkie item. + + + + + Is a UseableWalkieTalkie currently equipped? + Set by useable's equip and dequip events. + + + + + Was the most recent voice data we received sent using walkie talkie? + + + + + Has voice data recently been received, but we're waiting slightly to begin playback? + Important to give clip a chance to buffer up so that we don't stutter as more samples arrive. + + + + + AudioSource.isPlaying is not trustworthy. + + + + + Timer counting down to begin playback of recently received voice data. + We use a timer rather than availableSamples.Count because a very short phrase could be less than threshold. + + + + + Timer counting down to end playback. + + + + + Accumulated realtime since we last polled data from voice subsystem. + + + + + Last time askVoiceChat was invoked over network. + + + + + Number of times askVoiceChat has been called recently, to prevent calling it many times + with tiny durations getting server to relay many packets to clients. + + + + + Total of recent compressed voice payload lengths. + + + + + Realtime since this recent conversation began. + + + + + Only used by plugins. + Called on server to allow plugins to override the default area and walkie-talkie voice channels. + + + + + Default culling handler when speaking over walkie-talkie. + + + + + Default culling handler when speaking in proximity. + + + + + Called by owner to relay voice data to clients. + Not using rate limit attribute because it internally tracks bytes per second. + + + + + Called by server to relay voice data from clients. + + + + + Set to true during OnDestroy to make sure we don't start recording again. + + + + + If true, SteamUser.StartVoiceRecording has been called without a corresponding call to + SteamUser.StopVoiceRecording yet. + + + + + If true, voice toggle is in ON mode. + + + + + Internal value managed by inputWantsToRecord. + + + + + Set by updateInput based on whether voice is enabled, key is held, is alive, etc. + Reset to false during OnDestroy to stop recording. + + + + + Called during Update on owner client to start/stop recording. + + + + + Called during Update on owner client to record voice data. + + + + + Play walkie-talkie squawk at our position. + + + + + Start and stop playback of received audio stream. + + + + + Will this component ever need to record voice data? + + + + + Will this component ever need to play voice data? + In release builds this is only true for remote clients, but in debug we may want to locally listen. + + + + + Player's voice audio source cached during Start. + + + + + Looping voice audio clip. + + + + + Playback buffer. + + + + + Steam does less work on the main thread if we request samples at the native decompresser sample rate, + so the re-sampling can be done on the Unity audio thread instead. + + + + + 1 / frequency + + + + + Number of samples to zero after writing new audio data. + + + + + Are any players standing on the mannequin? + Used to prevent exploiting pose switches to push through objects. + + + + + Amount of experience to reward harvesting player. + + + + + If true, harvesting has a chance to provide a second item. + + + + + If true, rain will finish growing the plant. + + + + + NPC rewards to grant upon harvesting the crop. + + + + + Represents an item the vendor is selling to players. + + + + + Refer to NPCItemReward state. + + + + + Represents a vehicle the vendor is selling to players. + + + + + Returned asset is not necessarily a vehicle asset yet: It can also be a VehicleRedirectorAsset which the + vehicle spawner requires to properly set paint color. + + + + + If set, takes priority over VehicleRedirectorAsset's paint color and over VehicleAsset's default paint color. + + + + + Added during the UI refactor to catch unhandled mouse clicks during drag. + + + + + Contains inspect item box and invisible button. + + + + + Added during the UI refactor to catch mouse clicks outside the selection box. + + + + + Annoying frustrating workaround for IMGUI. Disable inventory headers, grids and slots while selection is open + to prevent them from interfering with selection menu. + + + + + Was ConsumeEvent called during this frame? + This is a hack to prevent firing when clicking in the UI on the same frame it closes. + Moved from SleekWindow and Event.current.Use() during UI refactor. + + + + + Move item drag visual to the cursor's position. + + + + + Backwards-Compatible Asset Reference with Caching + • Supports both GUID and legacy ID. + • Caches resolved asset and updates if asset has been reloaded. + • Parsing legacy ID without context requires "LegacyType:LegacyID" format. E.g., "Item:4" for the Eaglefire. + • See CachingAssetRef if legacy ID support is unnecessary. + + + + + If true, doesn't reference anything. + Could also be called "IsZero" or "IsNull". + + + + + Opposite of IsEmpty. + + + + + Assigned GUID, not the referenced asset's GUID. + + + + + Assigned legacy ID, not the referenced asset's legacy ID. + + + + + Assigned legacy type, not the referenced asset's legacy type. + + + + + Doesn't only check (Get() == asset) because a new asset may have loaded. + Rather, checks whether GUID or legacy ID (whichever is set) points at asset. + If asset is null, returns true if GUID and legacy ID are zero. + + + + + Supports both GUID and legacy ID formats. + - If input string contains ':' the first part is EAssetType and the second part is legacy ID. + - If defaultLegacyType is not None the input string can be parsed as a legacy ID. + - Otherwise, parsed as GUID. + + + + + Supports both GUID and legacy ID formats. + - If input string contains ':' the first part is EAssetType and the second part is legacy ID. + - Otherwise, parsed as GUID. + + + + + Returns Empty if TryParse returns false. + + + + + Returns Empty if TryParse returns false. + + + + + Enables assigning assetRef from an existing asset without manually calling constructor. + + + + + Enables assigning assetRef from an asset GUID without manually calling constructor. + + + + + Enables assigning assetRef from a non-backwards-compatible asset ref without manually calling constructor. + + + + + Render character with hair and skin otherwise it might be cyan. + (public issue #3615) + + + + + If set, audio clip associated with physics material will take priority. + + + + + Collision with speed lower than this value will not play a sound. + + + + + Currently triggers are only used for water. + + + + + Sorts higher rarity items into the front of the list. + + + + + Sorts name alphabetically to the front of the list. + + + + + Sorts type alphabetically to the front of the list. + + + + + [0, 1] blends towards one while active regardless of local volume. + + + + + [0, 1] blends towards one if current volume bitwise AND with asset is non-zero. + + + + + Lesser of global or volume blend alphas. + + + + + If blending was not ticket yet then local blend can use global value, e.g. loading into rain storm. + + + + + Is blendAlpha at 100%? + + + + + [0, 1] Rain puddle alpha cutoff. + + + + + [0, 1] Rain puddle ripples alpha. + + + + + Optional parameter for error logging. + + + + + Run hash algorithm for all data passing through a stream. + + + + + Repurposed from the Modules UI because it was unused. + + + + + Full argument string. Defaults to Environment.CommandLine. + + Nelson 2025-06-17: By default, Steam shows a warning nowadays when the game is launched with externally-provided + command-line arguments. For example, when joining a friend via rich presence. The solution is to use the arg + string provided by SteamApps.GetLaunchCommandLine, which also supports *changing* the arguments while the app is + running. If the environment-provided command-line doesn't contain it, the game will append Steam's launch options. + + Note: Steam override isn't applied until Steam is initialized. (after Dedicator and ModuleManager) Please refer to + Setup.cs for the full initialization order. + + + + + Nelson 2025-06-16: Steam doesn't handle "server code" connect URL, but we now support + it for rich presence joins via server code for easier inviting friends to private servers. + + When Steam parses a steam://connect/ip:port URL it requires the query port (e.g. 27015). + + + + + Handles these cases: + key value -> value + key=value -> value + key = value -> value + key = value -> value + key "value with spaces" -> value with spaces + key "value with \" quotation marks" -> value with " quotation marks + + Tested in CommandLineTests.cs + + + + + Is the application running as a headless server? + Replacement for isDedicated property. The property could not be changed to const in dedicated-server-only + builds without potentially breaking plugins. Only development builds can be run as both client or server. + + + + + Are we currently running the standalone dedicated server app? + + + + + Should dedicated server disable requests to internet? + While in LAN mode skips the Steam backend connection and workshop item queries. + Needs a non-Steam networking implementation before it will be truly offline only. + + + + + Hints/messages are the pop-up texts below the interaction prompt, e.g. "reload" or "full moon rises". + Got a complaint that the item placement obstructed hint was shown if placing multiple signs. + + + + + Adjust screen positioning and visibility of player name widgets to match their world-space counterparts. + + + + + Update hitmarker visibility, and their world-space positions if user enabled that. + + + + + Disable hints and messages if no longer applicable. + + + + + Disable vote popup if enough time has passed. + + + + + Pause the game if playing singleplayer and menu is open. + + + + + Many places checked that the cursor and chat were closed to see if a menu could be opened. Moved here to + also consider that useable might have a menu open. + + + + + Calculate damage multiplier for individual bullet. + + + + + Each shot has a percentage chance to hit the target. Higher values are more likely to hit. e.g., it + decreases from 1.0 at point blank to 0.0 at the weapon's maximum range. This chance is affected by the + gun's spread. + + + + + Contains presetsScrollView which contains customPresetsContainer and defaultPresetsContainer. + + + + + Contains column buttons and server list itself. + + + + + Synchronize widgets with their values. + + + + + Each level should have a 380x80 Icon.png file. + This class caches them so that the server list can show them quickly. + + + + + Time.time damage was last dealt so that damage is applied once per second. + + + + + Timer increased while taking damage, and reset to zero while inside zone. + + + + + Current position. + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + Is the active level an Arena mode map? + + + + + Find a new smaller circle within the old circle and clamp it to the playable level area. + + + + + Pick a random airdrop node appropriate for the game mode. + + + + + Nelson 2025-04-01: default position intBitCount of 13 has range of [-4096, 4096), but on "insane" size maps + the aircraft starts 2 km outside that range. This causes the care package to spawn at the wrong position. + Bumping intBitCount to 14 enables a range of [-8192, 8192). (public issue #4972) + + + + + Seconds between weather event starting and reaching full intensity. + + + + + Seconds between weather event ending and reaching zero intensity. + + + + + Sound clip to play. Volume matches the intensity. + + + + + Component to spawn for additional weather logic. + + + + + If per-volume mask AND is non zero the weather will blend in. + + + + + Expands upon Unity physics material properties for gameplay features. + + + + + Originally considered assets for each legacy material with fallback to main material, but the fallback + would mean a failed lookup for every property in the vast majority of cases. + + + + + If true, crops can be planted on this material. + + + + + If true, oil drills can be placed on this material. + + + + + For custom friction mode, multiplies character acceleration. + + + + + For custom friction mode, multiplies character deceleration. + + + + + For custom friction mode, multiplies character max speed. + + + + + • Does not support legacy ID. + • Caches resolved asset and updates if asset has been reloaded. + • See CachingBcAssetRef if legacy ID support is necessary. + + + + + If true, doesn't reference anything. + Could also be called "IsZero" or "IsNull". + + + + + Opposite of IsEmpty. + + + + + Assigned GUID, not the referenced asset's GUID. + + + + + Doesn't only check (Get() == asset) because a new asset may have loaded. + Rather, checks whether GUID points at asset. + If asset is null, returns true if GUID and legacy ID are zero. + + + + + Returns Empty if TryParse returns false. + + + + + Enables assigning assetRef from an existing asset without manually calling constructor. + + + + + Enables assigning assetRef from an asset GUID without manually calling constructor. + + + + + Internal so that CachingBcAssetRef can copy cachedAsset. + + + + + Auto-registering list of volume manager subclasses for level editor. + + + + + Should calling InstantiateVolume create a new volume? + False for deprecated (landscape hole volume) types. + + + + + These are methods moved from the Data class which rely on core types and so cannot go in the UnturnedDat assembly. + + + + + Intended as a drop-in replacement for existing assets with property uint16s. + + + + + Intended as a drop-in replacement for existing assets with legacy IDs. + + + + + Enables builder pattern for dat edits. + Inclusion of asset type is optional for cases where it's not obvious from context. + + + + + Enables builder pattern for dat edits. + Inclusion of asset type is optional for cases where it's not obvious from context. + + Legacy asset references are converted to GUID if the asset is available. If not available, type prefix + is only used if legacy type changed. + + + + + This overload assumes legacyType has not changed. This will usually be the case. Legacy type would only + change (for example) in cases like spawn tables where they can reference any asset type. + + + + + Kept because lots of modders have been using this script in Unity, + so removing legacy effect id would break their content. + + + + + Active while powered. + + + + + This value is confusing because in the level editor it is the normalized radius, but in-game it is the square radius. + + + + + Far clip plane multiplier in-game. + + + + + Far clip plane multiplier in level editor. + + + + + Essentially identical to ContentReference, but MasterBundle is more convenient. + Perhaps in the future all asset/content systems will be consolidated. + + + + + Are name or path null or empty? + + + + + Are both name and path non-null and non-empty? + + + + + Name of master bundle file. + + + + + Path to Unity asset within asset bundle. + + + + + Find client with given RPC channel ID. + + + + + Workshop item does not have any IP restrictions in place. + + + + + Workshop item has an IP whitelist, and server IP is not on it. + + + + + Workshop item has an IP blacklist, and server IP is on it. + + + + + Workshop item does have IP restrictions, and server IP is allowed. + + + + + Workshop item has been banned by an admin. + + + + + Workshop item is hidden from everyone. + + + + + Utilities for testing whether a particular server is allowed to download a workshop item. + Available from client and server side so that clients can help enforce restrictions. + + + + + Workshop item key-value tag storing IP whitelist and blacklist. + + + + + Get ip restrictions value if set, otherwise null. + Can be called from client or server. + + + + + Test whether IP is whitelisted or blacklisted in filter. + + + + + Split x,y-z format into whitelist [x, y] and blacklist [z]. + + + + + Split whitelist-blacklist format and parse string IPs into integer IPs. + + + + + Parse CIDR string IPs into integer IPs. + + + + + Added to player's food value. + + + + + Added to player's water value. + + + + + Added to player's virus value. + + + + + Added to player's hallucination value. + + + + + Get animal or player damage based on game mode config. + + + + + Get zombie or player damage based on game mode config. + + + + + Should player/animal/zombie surface be nulled on hit? + Requested by spyjack for a chainsaw-style shield that was overboard with the blood. + + + + + Should this weapon bypass the DamageTool.allowedToDamagePlayer test? + Used by weapons that heal players in PvE. + + + + + Please refer to ItemWeaponAsset.BuildDescription for an explanation of why this is necessary. + + + + + Please refer to ItemWeaponAsset.BuildDescription for an explanation of why this is necessary. + + + + + Utility for getting local hardware ID. + + One option for future improvement would be using Windows Management Infrastructure (WMI) API: + https://github.com/SmartlyDressedGames/Unturned-3.x/issues/1593 + + + + + Maximum number of HWIDs before server will reject connection request. + + + + + Get the local hardware ID(s). + + + + + Nelson 2025-05-28: keeping this a struct to simplify memory management (no pool needed). If making this more + generic in the future we probably do need to make it a class. + + + + + Only applicable to barricades. + + + + + Preliminary sort order is provided by server, but this takes priority if camera is available. + + + + + Not ideal, but there was a problem because onLevelLoaded was not resetting these after disconnecting. + + + + + Instantiate at least this many items per frame even if we exceed our time budget. + + + + + Called once key/values can be set. + + + + + Lod group will be culled when screen size is smaller than this value. + + + + + Clamp the culling screen percentage to be less than or equal to a maximum value. + + + + + Prevent the lowest LOD from being culled. + + + + + Multiplier to incoming damage. Defaults to 1.0. + + + + + Multiplier to explosive damage. Defaults to value if Armor_Explosion isn't specified. + + + + + Armor against falling damage. Defaults to 1.0, i.e., take the normal amount of damage. + + + + + If true on any worn clothing item, bones never break when falling. + Defaults to false. + + + + + Left-handed character skeleton is mirrored, so most item models are mirrored again to preserve appearance. + Unfortunately this does not work well for some items e.g. the particle system on Elver/Dango glasses. + + + + + Sound to play when equipped. + + + + + If set, find a child meshrenderer with this name and change its material to the character skin material. + + + + + The player can be wearing both a "real" in-game item and a cosmetic item in the same clothing slot. + If true, the real item is shown rather than the cosmetic item. For example, night vision goggles + are shown over any glasses cosmetic because of their gameplay-related green glow. + + + + + Overrides value of TakesPriorityOverCosmetic if is true. + + + + + If true, the value of is used rather than . + Defaults to false. True if is set. + + + + + For 3D clothes. Ideally, this wouldn't be type specific, but we have a separate prefab property for each + type of clothing at the moment. + + + + + The player can be wearing both a "real" in-game item and a cosmetic item in the same clothing slot. + This is called on the real item if has not been set. + If true, the real item is shown rather than the cosmetic item. If false, the cosmetic item can be seen. + + + + + Durstenfeld version of Fisher-Yates shuffle: + https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm + + + + + Same as above, but prevent the last clip from being shuffled to the front in order to prevent repeats. + + + + + Ensures we do not modify the asset in editor. + + + + + Optional case-sensitive identifier in list of blueprints. + Added as an alternative to referencing blueprints by index. + Defaults to null. + + + + + Index into Owner's blueprints list. + + + + + Operation replaces the special behavior for EBlueprintType.Ammo and EBlueprintType.Repair. + + + + + Note: if resolving ref please use GetCategoryTag instead for caching. + + + + + Category tag replaces the blueprint "Type" which acted as both category AND behaviour modifier. + + + + + Only applicable for operations with a target item. + + Nelson 2025-04-11: initially, this was implemented as the last item in supplies list. However, there are a + lot of checks for special handling of target item, so I think it makes sense to separate. + + + + + If not null, these tags must be provided by nearby objects to craft this blueprint. + Note: this is the list as-configured. It has not been filtered according to gameplay config. + + + + + If true, and transferState is enabled, delete attached items. + + + + + Must match conditions to craft. + + + + + Extra rewards given after crafting. Not displayed. + + + + + 2023-05-27: requested by Renaxon because some Arid blueprints are debug-only and + should not be visible when players search by name. (the 3.23.7.0 update made + non-craftable blueprints searchable for Buak) + + + + + Defaults to false. If true, blueprint can become visible in the crafting list even when NPC conditions + are not met. This should typically only be enabled if all conditions are configured to be visible in the + details panel. Otherwise, the default "conditions unmet" label isn't very informative for players. + + + + + Search output items (excluding target item) for specific item. + + + + + App version string packed into a 32-bit number for replication. + + + + + Path to directory containing "Editor", "Menu", "Player", "Curse_Words.txt", etc files. + + + + + Called clientside by BattlEye when it needs us to send a packet to the server. + + + + + Event for plugins when BattlEye wants to kick a player. + + + + + Called serverside by BattlEye when it needs us to send a packet to a player. + + + + + Call whenever something impacting rich presence changes for example loading a server or changing lobbies. + + + + + Only used on client. + Information about current game server retrieved through Steam's "A2S" query system. + Available when joining using the Steam server list API (in-game server browser) + or querying the Server's A2S port directly (connect by IP menu), but not when + joining by Steam ID. + + + + + On client, is current server protected by VAC? + Set after initial response is received. + + + + + On client, is current server protected by BattlEye? + Set after initial response is received. + + + + + Counts "bad" packets per-connection. Bad packets *may* be legitimate, for example a delayed burst of ping + requests. Beyond a certain point, however, it's likely a cheater is trying to waste server processing time. + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + After client submits EServerMessage.Authenticate we are waiting + for the EClientMessage.Accepted response. + + + + + Realtime that client sent EServerMessage.Authenticate request. + + + + + File IDs the client thinks the server advertised it was using, or null if UGC response was pending. + Prevents the server from advertising a smaller or fake list of items. + + + + + Needed before loading level. + + + + + Only safe to use serverside. + Get the list of workshop ids that a client needs to download when joining. + + + + + Only safe to use serverside. + Lets clients know that this workshop id is being used on the server, and that they need to download it when joining. + + + + + Channel id was 32-bits, but now that it is in the RPC header it can be 8-bits since there never that many + players online. The "manager" components are on channel 1, and each player has a channel. + + + + + Should the network transport layer accept incoming connections? + If both the queue and connected slots are full then incoming connections are ignored. + + + + + includeQueuedPlayers ensures player won't be kicked because someone on the same IP joined after them. + + + + + Find player in the queue associated with a client connection. + + + + + Find player associated with a client connection. + + + + + Find net transport layer connection associated with a client steam id. This could be a pending player in the + queue, or a fully connected player. + + + + + Find player steam id associated with connection, otherwise nil if not found. + + + + + If there's space on the server, asks player at front of queue for their verification to begin playing. + + + + + Called when determining spawnpoint during player login. + + + + + Is client waiting for response to ESteamPacket.CONNECT request? + + + + + Realtime that client sent ESteamPacket.CONNECT request. + + + + + Nelson 2023-08-09: adding because in some cases, namely workshop download and level loading, + we can't properly handle client transport failures because these loading systems don't + currently support cancelling partway through. (public issue #4036) + + + + + Manages client to server communication. + + + + + Manages server to client communication. + + + + + Connect to server entry point on client. + Requests workshop details for download prior to loading level. + Once workshop is ready launch() is called. + + + + + Callback once client transport is ready to send messages. + + + + + Callback when something goes wrong and client must disconnect. + + + + + Multiplayer load level entry point on client. + Called once workshop downloads are finished, or we know the server is not using workshop. + Once level is loaded the connect packet is sent to the server. + + + + + Event for plugins prior to kicking players during shutdown. + + + + + Set on the server when initializing Steam API. + Used to notify pending clients whether VAC is active. + Set on clients after initial response is received. + + + + + Set on the server when initializing BattlEye API. + Used to notify pending clients whether BE is active. + Set on clients after initial response is received. + + + + + Client should call RequestDisconnect instead to ensure all disconnects have a logged reason. + + + + + Internet server callback when backend is ready. + + + + + If missing map is a curated map then log information about how to install it. + + + + + Was not able to find documentation for this unfortunately, + but it seems the max length is 127 characters as of 2022-09-12. + + + + + Set key/value tags on Steam server advertisement so that client can display text in browser. + + + + + Set key/value tags on Steam server advertisement so that client can display server config in browser. + + + + + Primarily kept for backwards compatibility with plugins. Some RPCs that reply to sender also use this but + should be tidied up. + + + + + Hack to deal with the oversight of reordering the ESteamPacket enum during net messaging rewrite causing + older plugins to send wrong packet type. + + + + + Send to a connected client. + + + + + The server ignores workshop info requests if it's been less than 30 seconds, + so we cache that info for 1 minute in-case we try to connect again right away. + + + + + This information is needed before the level is loaded. + + + + + Advertised server name. e.g., "Nelson's Unturned Server" + + + + + Name of map to load. + + + + + Legacy difficulty mode that should be removed eventually. + + + + + Perspective settings. + + + + + Server's IP from when we originally received response. + Used to test download restrictions. + + + + + Last realtime this cache was updated. + + + + + Hacked-together initial implementation to refuse network messages from specific players. + On PC some cheats send garbage packets in which case those clients should be blocked. + + + + + Close connection, and refuse all future connection attempts from a remote player. + Used when garbage messages are received from hacked clients to avoid wasting time on them. + + + + + Record that a bad packet was received from connection and maybe kick them if rate limit is exceeded. + + + + + Private to prevent plugins from changing the value. + + + + + Should buffers used by plugin network events be read-only copies? + + + + + First four bytes of RPC messages are the channel id. + + + + + Should players be allowed to join this server regardless of whether their version number matches ours? + Useful to allow players to join debug mode servers. + + + + + Is version number supplied by client compatible with us? + + + + + Notify players waiting to join server if their position in the queue has changed. + + + + + Prevent any particular client from delaying the server connection queue process. + + + + + Allows hosting providers to limit the configurable max players value from the command-line. + + + + + Deprecated-ish IPv4 to bind listen socket to. Set by bind command. + + + + + Local address to bind listen socket to. Set by bind command. + + + + + Steam query port. + + + + + If hosting a server, get the game traffic port. + + + + + Called while running + + + + + Used to build packet about each existing player for new player, and then once to build a packet + for existing players about the new player. Note that in this second case forPlayer is null + because the packet is re-used. + + + + + Not exactly ideal, but this a few old "once per player" client->server RPCs. + + + + + Event for plugins when rejecting a player. + + + + + Notify client that they were kicked. + + + + + Notify client that they were banned. + + + + + Player left server by canceling their ticket, or we are disconnecting them without telling them. + Does not send any packets to the disconnecting player. + + + + + Number of transport connection failures on this frame. + + + + + Callback when a pending player or existing player unexpectedly loses connection at the transport level. + + + + + Check whether a server is one of our favorites or not. + + + + + Set whether a server is one of our favorites or not. + + + + + Open URL in the steam overlay, or if disabled use the default browser instead. + Warning: any third party url should be checked by WebUtils.ParseThirdPartyUrl. + + + + + Steam's favorites list requires that we know the server's IPv4 address and port, + so we can't favorite when joining by Steam ID. + + + + + Toggle whether we've favorited the server we're currently playing on. + + + + + Toggle whether we've bookmarked the server we're currently playing on. + + + + + Ping from client to server, measured in milliseconds. + + + + + Number of seconds since January 1st, 1970 GMT as reported by backend servers. + + + + + Current UTC as reported by backend servers. + Used by holiday events to keep timing somewhat synced between players. + + + + + Has the initial backend realtime been queried yet? + Not available immediately on servers because SteamGameServerUtils cannot be used until the actual Steam instance is available. + + + + + Invoked after backend realtime becomes available. + + + + + In here because we want to call this very early in startup after initializing provider, + but with plenty of time to hopefully install maps prior to reaching the main menu. + + + + + This file is of particular importance to the dedicated server because otherwise Steam networking sockets + will say the certificate is for the wrong app. When launching the game outside Steam this sets the app. + + + + + Hackily exposed as an easy way for editor code to check the verison number. + + + + + Has the onApplicationQuitting callback been invoked? + + + + + Moved from OnApplicationQuit when that was deprecated. + + + + + Useful to load files from Steam install of the game while running in the editor. + + + + + Moved from OnApplicationQuit when Application.CancelQuit was deprecated. + + + + + A couple of players have reported the PRO_DESYNC kick because their client thinks they own the gold upgrade, + but the Steam backend thinks otherwise. This option is a bit of a hack to work around the problem for them. + + + + + If specified, all Steam achievements and stats progress is lost. + + + + + If specified, all Steam achievements are unlocked during startup. + + + + + Host has not specified a value. + + + + + Not an actual tag. Used for filtering. + + + + + Host has specified that the server does not sell anything for real money. + + + + + Host has specified that the server does have a real money shop, but does not sell anything which affects gameplay. + + + + + Host has specified that the server does have a real money shop which sells benefits that affect gameplay. + + + + + Server list filter for plugin usage. + + + + + Allows Unity events to send text chat messages from the client, for example to execute commands. + + + + + Text to use when SendDefaultTextChatMessage is invoked. + + + + + All players on the server will see the message. + + + + + Only nearby players will see the message. + + + + + Chat mode to send request in. + + + + + Corresponds to not active and not blending with new weather system. + + + + + Corresponds to transitioning in with new weather system. + + + + + Corresponds to active with new weather system. + + + + + Corresponds to transitioning out with new weather system. + + + + + Corresponds to not active and not blending with new weather system. + + + + + Corresponds to transitioning in with new weather system. + + + + + Corresponds to active with new weather system. + + + + + Corresponds to transitioning out with new weather system. + + + + + Kept for backwards compatibility with mod hooks, plugins, and events. + + + + + Kept for backwards compatibility with mod hooks, plugins, and events. + + + + + [0, 1] used to avoid invoking BlendAlphaChanged every frame. + Compared against globalBlendAlpha not taking into account local volume. + + + + + Hash of lighting config. + Prevents using the level editor to make night time look like day. + + + + + Level designed target fog color. + + + + + Level designed target fog intensity. + + + + + Level designed target atmospheric fog intensity. + + + + + If global ocean plane is enabled then return the worldspace height, + otherwise return the optional default value. Default for volume based + water is -1024, but atmosphere measure uses a default of zero. + + + + + Ticked on dedicated server as well as client so that server can listen for weather events. + + On dedicated server this is always 0xFFFFFFFF. + + + + Reset any global shader properties that may affect the main menu. + + + + + Source effect to group multiple volumes. + + + + + Audio source added to AmbianceAudioGameObject. + + + + + Reset to false before updating volumes. + + + + + Reset to false before updating volumes. + + + + + Reset to zero before updating volumes. If any volume uses distance fadeout, this is the maximum alpha. + + + + + If any volume doesn't use distance fadeout, this is the alpha based on time spent inside.. + + + + + Highest priority of overlapping volumes. + + + + + If any volume doesn't use distance fadeout, this is the minimum of their audio fade-in time. + + + + + If any volume doesn't use distance fadeout, this is the minimum of their audio fade-out time. + Only reset when created so that value is available after leaving all volumes. + + + + + Visualizes reverb zone in-game. + + + + + Can horde beacons be placed in the associated bounds? + + + + + Overrides vehicle physics values in bulk without building asset bundles. + + + + + Only RPCs from the server will be allowed to invoke this method. + + + + + RPCs are only allowed to invoke this method if we're running as server. + + + + + Only RPCs from the owner of the object will be allowed to invoke this method. + + + + + Maximum number of calls per-second per-player. + + + + + Minimum seconds between calls per-player. + Initialized from ratelimitHz when gathering RPCs. + + + + + Index into per-connection rate limiting array. + + + + + Backwards compatibility for older invoke by name code e.g. plugins. + + + + + If changing header size remember to update PlayerManager and allocPlayerChannelId. + + + + + How far to shift compressed voice data. + + + + + If true, this object is owned by a locally-controlled player. + For example, some code is not run for "remote" players. + Always true in singleplayer. Always false on dedicated server. + + + + + Use on server when invoking client methods on the owning player. + + + + + Replacement for ESteamCall.NOT_OWNER. + + + + + Don't use this. Originally added so that Rocketmod didn't have to inject into the game's assembly. + + + + True if the call succeeded, or false if the sender should be refused. + + + + Don't use this. Originally added so that Rocketmod didn't have to inject into the game's assembly. + + + + + Calls array needs rebuilding the next time it is used. + Should be invoked when adding/removing components with RPCs. + + + + + Does array of RPCs need to be rebuilt? + + + + + Find methods with SteamCall attribute, and gather them into an array. + + + + + Encode byte array of voice data to send. + + + + + Decode voice parameters from byte array. + + + + + If true, light contributes to player spotlight. Defaults to true. + + Can be set to false for modders with a custom light setup. For example, this was added + for a modder who is using melee lights to toggle a lightsaber-style glow. + + + + + 32-bit mask granting server plugins additional control over custom UIs. + Only replicated to owner. + + + + + Enables cursor movement while not in a vanilla menu. + + + + + Disable background blur regardless of other UI state. + + + + + Enable background blur regardless of other UI state. + Takes precedence over NoBlur. + + + + + Enable title card while focusing a nearby player. + + + + + Enable explanation and respawn buttons while dead. + + + + + Enable health meter in the HUD. + + + + + Enable food meter in the HUD. + + + + + Enable water meter in the HUD. + + + + + Enable virus/radiation/infection meter in the HUD. + + + + + Enable stamina meter in the HUD. + + + + + Enable oxygen meter in the HUD. + + + + + Enable icons for bleeding, broken bones, temperature, starving, dehydrating, infected, drowning, full moon, + safezone, and arrested status. + + + + + Enable UseableGun ammo and firemode in the HUD. + + + + + Enable vehicle fuel, speed, health, battery charge, and locked status in the HUD. + + + + + Enable center dot when guns are not equipped. + + + + + Enable popup when in-game rep is increased/decreased. + + + + + Default flags set when player spawns. + + + + + 32-bit mask indicating to the server which admin powers are being used. + Does not control which admin powers are available. + + + + + Player is using spectator camera. + + + + + Player is using barricade/structure transform tools. + + + + + Player is using overlay showing player names and positions. + + + + + Per-player event invoked when admin usage flags change. + + + + + Event invoked when any player's admin usage flags change. + + + + + Used by plugins. + + + + + Invoked on client when a plugin changes the widget flags. + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + Not rate limited because server tracks number of expected screenshots. + + + + + Request client to open a given URL. + Allows plugins to open web browser, but also gives client the chance to ignore it. + + + + + Tell client to join a specific server. + Disconnects client and sends them to the join server screen. + Only used by plugins. + + + + + Is this player currently in a plugin's modal dialog? + Enables cursor movement while not in a vanilla menu. + + + + + Tell the client whether to be in plugin modal mode or not. + Kept from prior to introduction of pluginWidgetFlags. + + + + + Which admin powers are currently in use by the client. + Reported to the server by the client. + Does not control which admin powers are available. + Note: Hacks can prevent this notification from being sent. + + + + + Called on the client to notify the server of admin usage changes (if any). + + + + + Called on the client to notify the server of admin usage changes (if any). + + + + + Teleport to a random player spawn designated in the level. + + + + + Teleport to bed, if player has set one. + + + + + How many calls to will succeed per second. + + + + + How many rate limited actions have been performed recently. + Increased after performing each rate limited action, and decreased over time. + Cannot perform actions when greater than one. + + + + + Note: new official code should be using per-method rate limit attribute. + This is kept for backwards compatibility with plugins however. + + Call this method before any requests the client can spam to the server. + + Should your code proceed with the rate limited action? + + + + Call every frame to cool down rate limiting. + + + + + This code was in the Start message, and should happen before other initialization. + + + + + Hacky replacement for Start() that runs after net ids are assigned but before sending player state. + + + + + Nelson 2024-11-11: Added to help narrow down if player is destroyed outside of Provider.removePlayer. + (public issue #4760) + + + + + Flag in case levelObject is destroyed. + + + + + Poorly named. Specific to InteractableObjectQuest. + + + + + Directly uses input string for custom message popups. + + + + + Player cannot build on a vehicle with occupied seats. + + + + + Horde beacon cannot be built here. + + + + + Item type is not allowed on vehicles. + + + + + Item must be placed closer to vehicle hull. + + + + + Player cannot build while seated in a vehicle because some vehicles are abusable to stick the camera through a wall. + + + + + Interacting with ladder. + + + + + Popup when equipping housing planner "press T to show items" + + + + + Popup when structure is blocked by something named we can format into the message. + + + + + Notice that freeform buildables are blocked by Allow_Freeform_Buildables. + + + + + Popup when structure is blocked by terrain. + + + + + Vehicle doesn't support spray paints. + + + + + Explaining that some blueprints require workstations. + + + + + Nelson 2024-11-29: Curious to put all the gun stats in one place for easier comparison. Rather rudimentary at + the moment so not including in the update. + + + + + Controls how first-person arms are moved for turrets operated from the driver's seat. + + + + + Default. Pushes first-person arms off-screen while aiming. Originally implemented for the Fighter Jet where + it looks weird if your arms are still visible when the camera zooms in while "aiming." + + + + + Push first-person arms off-screen when equipped. + + + + + No particular use in mind, but included for completeness. + + + + + Default. Plays "Hammer" animation if ammo count was zero. + + + + + Regardless of ammo, does not play "Hammer" animation after reloading. + + + + + Regardless of ammo, will play "Hammer" animation after reloading. + + + + + Sound to play when input is pressed but weapon has a fire delay. + + + + + Maximum distance the gunshot can be heard. + + + + + Override Rangefinder attachment's maximum range. + Defaults to range value. + + + + + Can this weapon instantly kill players by headshots? + Only valid when game config also enables this. + + + + + Can this weapon be fired without consuming ammo? + Some mods use this for turrets. + + + + + Ammo quantity to consume per shot fired. + + + + + Simulation steps to wait after input before firing. + + + + + Can magazine be changed by player? + + + + + Can player ADS while sprinting and vice versa? + + + + + If true, the gun cannot shoot unless the player is aiming. + Note: String action overrides this. + Defaults to true for miniguns. + + + + + If true, the gun will stop aiming regardless of player input. + + + + + Seconds from pressing "aim" to fully aiming down sights. + + + + + If true, Aim_Start and Aim_Stop animations are scaled according to actual aim duration. + + + + + Selects a default magazine, following magazine replacements and spawn table resolution. + + + + + Selects a default magazine, following magazine replacements and spawn table resolution. + + + + + How long in seconds after firing to rechamber the gun by playing the Hammer animation. + Only applicable if RechamberAfterShotCount is >0. + Defaults to 0.25 seconds. + + + + + How long in seconds after hammering to eject a bullet casing. + Defaults to 0.45 seconds. + + + + + How long in seconds after reloading to eject bullet casings. + Only applicable if CasingEjectCountAfterReload is greater than zero. + Defaults to 0.5 seconds. + + + + + Defaults to false. If true, attachments must specify at least one non-zero caliber. + Requested by Great Hero J to block vanilla attachments in VGR. + + + + + Determines whether "Hammer" animation plays after attaching a magazine. + Note: this happens when a magazine replaces another OR fills previously empty slot. + + + + + Determines whether "Hammer" animation plays after detached a magazine. + Note: this happens when a magazine is removed from the gun without a replacement. + + + + + Spread multiplier while sprinting. + + + + + Spread multiplier while crouched. + + + + + Spread multiplier while prone. + + + + + Spread multiplier while swimming. + + + + + Spread multiplier while not grounded. + + + + + Recoil magnitude multiplier while the gun is aiming down sights. + + + + + Recoil magnitude while sprinting. + + + + + Recoil magnitude while crouched. + + + + + Recoil magnitude while prone. + + + + + Recoil magnitude while swimming. + + + + + Recoil magnitude while not grounded. + + + + + [0, 1] percentage of maximum range where damage begins decreasing toward falloff multiplier. + + + + + [0, 1] percentage of maximum range where damage finishes decreasing toward falloff multiplier. + + + + + [0, 1] percentage of damage to apply at damageFalloffMaxRange. + + + + + Seconds before physics projectile is destroyed. + + + + + Is this gun setup to have a change of jamming? + + + + + [0, 1] quality percentage that jamming will start happening. + + + + + [0, 1] percentage of the time that shots will jam the gun when at 0% quality. + Chance of jamming is blended between 0% at jamQualityThreshold and jamMaxChance% at 0% quality. + + + + + Name of the animation to play when unjamming chamber. + + + + + Movement speed multiplier while the gun is aiming down sights. + + + + + If >0, hammer animation plays after shooting this many shots after RechamberAfterShotDelay seconds pass. + Defaults to one for EAction.Pump and EAction.Bolt, zero otherwise. + + + + + If >0, emit particles after hammer after EjectAfterHammerDelay seconds pass. + Only applicable if RechamberAfterShotCount is >0. + Defaults to 1. + + + + + If >0, emit particles after reloading after EjectAfterReloadDelay seconds pass. + Defaults to ammoMax for EAction.Break. + + + + + Please refer to . + + + + + Please refer to . + + + + + The dialogue to go to when a message has no available responses. + If this is not specified the previous dialogue is used as a default. + If neither is available then a default "goodbye" response is added. + + For example, Chief_Police_Doughnuts_Accepted dialogue has a single message + "Let's just keep this between the two of us." shown with "prev" dialogue + set to the NPC's root dialogue asset. + + + + True if primary action was started and stopPrimary should be called in the future. + Useful to allow input to be held until action executes. + + + True if secondary action was started and stopSecondary should be called in the future. + Useful to allow input to be held until action executes. + + + + Does useable have a menu open? + If so pause menu, dashboard, and other menus cannot be opened. + + + + + Common base for barricades and structures. + 2023-01-16: not ideal to be adding this so late in development, but at least it is a step in the right direction. + + + + + If true, this item is eligible for zombies to detect and attack when stuck. + Defaults to true. + + + + + Item or spawn table recovered when picked up below 100% health. + + + + + Minimum number of items to recover when salvaged. + + + + + Maximum number of items to recover when salvaged. + + + + + Minimum number of items to drop when destroyed. + + + + + Maximum number of items to drop when destroyed. + + + + + Item or spawn table dropped when destroyed. + + + + + If non-null, this asset provides the listed crafting tags to nearby players. + + + + + Note: this assumes SalvageItemRef points to an ItemAsset. + + + + + By default a crafting ingredient is salvaged. + + + + + Thanks to Glenn Fiedler for this RK4 implementation article: + https://gafferongames.com/post/integration_basics/ + + + + + Higher values return to the target position faster. + + + + + Higher values reduce bounciness and settle at the target position faster. + e.g. a value of zero will bounce back and forth for a long time (indefinitely?) + + + + + Nelson 2025-04-09: this acted as both category AND behaviour modifier, so I'm separating it into a custom tag + for categorization and a property for overriding how the blueprint processes input items. + + Nelson 2025-04-10: repair and ammo "types" had a variety of quirks I wanted to sort out: + • Moving amount between items required ammo type blueprint, but some modders expressed interest in non-ammo use. + (I.e., ideally better supporting amount on non-ammo items going forward.) + • Both types ignored output items. Output was used to represent the target item. Similarly, the UI added a fake + extra input item representing target item. + • PlayerCrafting and PlayerDashboardCraftingUI re-implemented some crafting item searching logic for finding + the item to refill or repair that can be converted into input item parameters. + The plan at the moment is to make the last input item the "target" item for operations. Legacy ammo/repair + blueprints will then default to no output item and add an extra input item. (And add a variety of parameters + needed to replicate the specialized item search behaviour.) + + + + + Controls what blueprint does with input items. + Separated from EBlueprintType which acted as both category AND operation. + + + + + No special modification to input items. + + + + + Restore target input item to full quality. + + + + + Transfer amount from input items to target item. + + + + + Can be added to any GameObject with a Dropper, Note, or Quest interactable object in its parents. + + + + + Invoked on authority when interactable object is used successfully. + Only invoked on clients if ShouldReplicate is true. + + + + + If true, the server will replicate the OnUsed event to clients as well. + + + + + If ShouldReplicate is enabled, should the RPC be called in reliable mode? + Unreliable might not be received by clients. + + + + + Applied if greater than zero. Defaults to 128. + + + + True if it's a new claim flag. + + + + Player stealth radius cannot go below this value. + + + + + Deal damage and break legs if speed is greater than this value. + + + + + By default players in singleplayer and admins in multiplayer have a faster salvage time. + This option was requested for maps with entirely custom balanced salvage times. + + + + + Cached result of finding all craftingBlacklists. + + + + + Determines which weather can naturally occur in this level. + Null if empty. + + + + + If set, this weather will always be active and scheduled weather is disabled. + + + + + Audio clip to play in 2D when a player dies. + + + + + Defaults to false because some servers have rules and info on the loading screen. + + + + + Volume weather mask used while not inside an ambience volume. + + + + + Allows level to override skill max levels. + Null if empty, otherwise matches 1:1 with PlayerSkills._skills. + + + + + If false, clouds are removed from the skybox. + + + + + Players are kicked from multiplayer if their skin color is within threshold of any of these rules. + + + + + Optional Unturned extensions to the LOD Group component. + + + + + Could be extended, e.g. to clamp cull size separately from the per-LOD sizes. + + + + + Unturned will adjust per-LOD sizes to counteract LOD bias. + Elver has carefully tuned LOD sizes for the interior of the mall, so LOD bias affecting them is undesirable. + Note that due to a Unity bug only LOD0 can be greater than 100%. + + + + + Is player already waiting to exit their group? + + + + + Add player to exit queue if enabled, or immediately remove. + + + + + Remove player from queue if they're waiting to exit their group. + + + + + Invoked immediately before Destroy vehicle. + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + If true, a vehicle asset has been replaced. + + + + + Find vehicle with matching replicated instance ID. + + + + + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. + + + + + Supports redirects by VehicleRedirectorAsset. If paintColor is set that takes priority, otherwise if + redirector's SpawnPaintColor is set, that color is used, + + + + + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. + + + + + Supports redirects by VehicleRedirectorAsset. If paintColor is set that takes priority, otherwise if + redirector's SpawnPaintColor is set, that color is used, + + + + + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. + + + + + Supports redirects by VehicleRedirectorAsset. If paintColor is set that takes priority, otherwise if + redirector's SpawnPaintColor is set, that color is used, + + + + + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. + + + + + Supports redirects by VehicleRedirectorAsset. If paintColor is set that takes priority, otherwise if + redirector's SpawnPaintColor is set, that color is used, + + + + + Added so that garage plugins do not need to invoke RPC manually. + + zero spawns without a battery, ushort.MaxValue indicates the battery should be randomly spawned according to asset configuration, other values force a battery to spawn. + + + + For backwards compatibility. This older method spawns a vehicle with a random paint color. (set paintColor + to zero for a random paint color) + + zero spawns without a battery, ushort.MaxValue indicates the battery should be randomly spawned according to asset configuration, other values force a battery to spawn. + + + + Used by external spawn vehicle methods. + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used, + unless preferredColor.a is byte.MaxValue. + + Owner to lock vehicle for by default. Used to lock vehicles to the player who purchased them. + + + + Client-side request server to toggle headlights. + + + + + As client request server to use bonus feature like towing hook or police sirens. + + + + + Helper for servers with huge numbers of vehicles. + Called with fixed span of indexes e.g. [0, 10), then [10, 20). This function then clamps the final span to the vehicle count. + + + + + Does as few tests as possible while maintaining base game expectations. + + + + + Force remove player from vehicle they were in, if any. + Called when player disconnects to tidy up and run callbacks. + + True if player was in a vehicle, false otherwise. + + + + Remove player from vehicle and teleport them to an unchecked destination. + + + + + Is spawnpoint open for vehicle? + + + + + Try to find a random spawnpoint to spawn a vehicle while server is running. + + + + + Add a new vehicle at given spawnpoint. + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. + + + + + Add a new vehicle at given spawnpoint and replicate to clients. + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. + + + + + Called when deciding whether to respawn a new vehicle, after gameplay has begun. + + + + + Called during level load to determine how many vehicles to create. + + + + + Called on server each frame to slowly damage abandoned vehicle. + + + + + +0 = InteractableVehicle + +1 = root transform + +X = VehicleBarricadeRegion + Asset does not know number of train cars, so we always reserve slack. + + + + + Speed is unsigned, so 8 bits allows a range of [0, 256). + + + + + Velocity is signed, so 9 bits allows a range of [-256, 256). + + + + + Cast a ray from the sky to find highest point. + + + + + Cast a ray from slightly above point so indoor teleport nodes work. + + + + + If set, we are responsible for destroying texture. + + + + + This is a bit of a hack in order to simplify the foliage menu when most of the time editors are either + manually placing foliage or automatically baking it. + + + + + Get brush strength multiplier where strength decreases past falloff. Use this method so that different falloffs e.g. linear, curved can be added. + + Percentage of . + + + + Allows foreach loop to iterate Vector2Int within RegionBoundsInt. + + + + + Kept because lots of modders have been using this script in Unity, + so removing legacy effect id would break their content. + + + + + Hack for modders using grenade component as a way to deal radial damage. Not a good long term solution but + widely requested for the meantime until I get the chance to rewrite some of the health stuff. + + + + + Thanks to Glenn Fiedler for this RK4 implementation article: + https://gafferongames.com/post/integration_basics/ + + + + + Higher values return to the target position faster. + + + + + Higher values reduce bounciness and settle at the target position faster. + e.g. a value of zero will bounce back and forth for a long time (indefinitely?) + + + + + At low framerate deltaTime can be so high the spring explodes unless we use a fixed timestep. + + + + + Initially these were structs so that they would be adjacent in memory and therefore faster to iterate lots of them, + but making them classes lets them reference each other which significantly simplifies finding adjactent housing parts. + + + + + Item along positive direction. + Can be multiple on existing saves or if players found an exploit. + + + + + Item along negative direction. + Can be multiple on existing saves or if players found an exploit. + + + + + Item between floors. + Can be multiple on existing saves or if players found an exploit. + + + + + Is there a wall in this slot, and is it full height (not rampart)? + + + + + This check prevents placing roof onto the upper edge of a rampart because ramparts + create an edge at full wall height even though they are short. + + Ideally in the future wall height will become configurable and remove + the need for this check. + + See public issue #3590. + + + + + Position at the base of the pillar. + + + + + Yaw if placing pillar at this vertex. + + + + + Pillar or post currently occupying this slot. + Can be multiple on existing saves or if players found an exploit. + + + + + Can be zero if pillar is floating, or up to six in the center of a triangular circle. + + + + + Is there a pillar in this slot, and is it full height (not post)? + + + + + Floors must be placed touching the terrain, or a fake-terrain object like a grassy cliff model. + + + + + Pillars can be partly underground or inside a designated allowed underground area. Otherwise, + if the very top of the pillar is underground placement is blocked. (public issue #4250) + + + + + Side length of square and triangular floor/roof. + Walls can be slightly less, but we treat them as if they are the full length. + + + + + Vertical distance from edge center to wall pivot. + + + + + Vertical distance from edge center to rampart pivot. + + + + + If position is nearly equal within this threshold then edges/vertices will connect. + + + + + Maximum distance from player's viewpoint to allow placement. + + + + + How far to search for empty slot best match. + + + + + Cosine of the angle between ray direction and direction toward slot must be greater than this. + + + + + When validating item placement expand physics overlap this much. + Useful to ensure slightly-touching overlaps (e.g. pillar touching the pillar above) are handled properly. + + + + + Ensure players, vehicles, zombies, animals, etc are not within this distance of pending placement. + + + + + Distance from triangle pivot to apex of triangle. + + + + + Radius of circle within triangle edges. + + + + + Distance from triangle pivot to center of triangle. + + + + + Small threshold to allow placing even with existing barricades on the floor. + + + + + House overlap is approximately the same size as the housing item's collider(s), and is intended to check whether + any pre-existing barricades or structural items are in the way. For example whether a wall cannot be placed because + there is a storage crate in the way, or if a foundation is blocked by another slightly rotated foundation. + + + + + Character overlap is slightly larger than the house overlap, and checks whether any players, vehicles, animals, zombies, etc + are nearby. This is necessary because when house and characters were combined in a single physics query it was possible to + stand *just* close enough to step into the collider as it was spawned. + + + + + Called when a housing item is spawned or after moving an existing item. + + + + + Called before a housing item is destroyed or before moving a housing item. + + + + + Search grid for existing vertex at approximately equal position. + Considers adjacent grid cells if near cell boundary to avoid issues with floating point inaccuracy. + + + + + Search grid for existing edge at approximately equal position. + Considers adjacent grid cells if near cell boundary to avoid issues with floating point inaccuracy. + + + + + Find existing edge and add connection, or add new empty edge. + + + + + Find existing vertex and add connection, or add new empty vertex. + + + + + Find existing edge and set associated wall, or add an empty edge at wall's location. + + + + + Find slot occupied by wall and remove if no longer attached to anything. + + + + + Find existing vertex and set associated pillar, or add an empty vertex at pillar's location. + + + + + Find slot occupied by pillar and remove if no longer attached to anything. + + + + + Hack to prevent ignoring floor which might be overlapping pending floor placement. + For example when placing a square floor on the opposite edge of a spot which has a triangular floor + we do not want to ignore the triangular floor during the physics query. + + + + + Used by triangular floor and roof validation to test for collisions. + + + + + Ensure wall fits in an empty slot. + + + + + Ensure pillar fits in an empty slot. + + + + + Nelson 2024-06-26: With structure rotation replicated as a quaternion we need to be smarter about extracting + yaw from model transform. Quaternion.eulerAngles.y isn't necessarily the yaw anymore. + + + + + Working buffer for placement overlap tests. + + + + + Index of the context parameter, if not None. + + + + + Reflected attribute that was used to find this method. + Contains extra information about how to call it. + + + + + Interactable storage barricade to spawn at the drop position. + + + + + Prefab to spawn falling from the aircraft. + + + + + True once per frame, false otherwise. + + + + + Item ID of barricade to spawn after landing. + + + + + Barricade to spawn after landing. + + + + + Cargo spawn table legacy ID. + + + + + Kill any players inside the spawned interactable box. + Uses hardcoded size of 4 x 4 x 4. + + + + + Determines how to handle a server if it matches a rule. + + + + + Apply label and continue processing rules. + + + + + Show the server in the list. + + + + + Hide the server from the list. + + + + + Note: Port (if set) refers to the Steam query port. + + + + + If true, negate whether this rule matches. i.e., binary NOT. + + + + + Incremented during server list refresh for each server blocked by this rule. + + + + + Optional image bundled alongside the asset file. + + + + + If true the event will only be invoked in offline mode and on the server. + + + + + Hack to prevent hitting volume rate limit because (at least as of 2022-05-24) we do not have an event for finished dragging. + + + + + Whether this animal was updated in this network tick and needs to be resent. + + + + + Alert this animal that it was damaged from a given position. + Offensive animals investigate the position, whereas other animals run away. + + + + + Alerts this animal that it needs to run away. + + The position to run away from. + + + + Keep for plugin backwards compatibility. + + + + + Reduces frequency of UndergroundAllowlist checks because it can be expensive with lots of entities and volumes. + + + + Unturned_Data folder path + + + + Useful to check whether hashing is causing problems. + + + + + Useful to narrow down why a player is getting kicked for modified resource files when joining a server. + + + + + Only set in play mode for determing if we should cache brute force lengths. + + + + + If set, road properties are taken from this asset instead of the older road properties editor. + + + + + Checkered lines when occluded, solid lines when visible. + + + + + Solid lines regardless of depth. + + + + + In-game debug drawing utility similar to Unity's editor Gizmos. + + + + Local space relative to matrix. + + + + Wireframe grid on the XZ plane. + + + + + Center relative to matrix. + + + + + Center relative to matrix. + + + + + LateUpdate so that the most up-to-date gizmos and main camera position are used. + + + + + Callback to draw in the Unity editor scene view. + + + + + Can be null if nothing has been added at position. + + + + + Does not add new lists to empty cells. + + + + + Number of Lists to preallocate in batches. + (GRID_SIZE * GRID_SIZE) % LIST_POOL_SIZE should be zero leftover. + Reduces constructor performance cost. (public issue #4209) + + + + + Matches the console behavior prior to command IO refactor. + + + + + Add fuel to target. + + + + + Remove fuel from target. + + + + + Whether local client is currently penalized for potentially using a lag switch. Server has an equivalent check which reduces + damage dealt, whereas the clientside check stops shooting in order to prevent abuse of inbound-only lagswitches. For example, + if a cheater freezes enemy positions by dropping inbound traffic while still sending movement and shooting outbound traffic. + + + + + Labels for named locations. + + + + + Contains arena outer circle and inner target points. + + + + + Player avatars. + + + + + Arrow oriented with the local player. + + + + + Convert level-space 3D position into normalized 2D position. + + + + + Convert normalized 2D position into level-space 3D position. + + + + + Temporary to unbind events because this class is static for now. (sigh) + + + + + Manages render queue for transparent materials on non-stationary objects. + Updates one material per frame. + + + + + Callback when camera above/under water changes. + + + + + Material to use during the Christmas event instead. + + + + + Material to use during the Halloween event instead. + + + + + Material to use during the April Fools event instead. + + + + + Nelson 2024-08-19: This link has been checked with WebUtils.CanParseThirdPartyUrl, but is not the + potentially altered link to go through Steam's link filter. This way the UI shows the original link. + + + + + Unturned wrapper for Debug.Log, Debug.LogWarning, Debug.LogError, etc. + + + + + Log an exception with message providing context. + + + + + Recursively logs inner exception. + + Should only be called by itself and exception because notifications + to CommandWindow would otherwise get re-sent here as errors. + + + + + This is the ONLY place Unturned should be binding logMessageReceived. + + This gives us greater control over how logging is handled. In particular, Unity's + headless builds route logs (including stack traces) through stdout which is undesirable + for dedicated servers, so we only call Debug.Log* in the editor and development builds. + + + + + Log an exception with message providing context. + + + + + Get SteamID of vehicle's driver, or nil if not driven. + + + + + Crashed into something, if applicable take self damage from collision. + + + + + Remove all color rich formatting so that shadow text displays correctly. + + + + + Shadow text needs the color tags removed, otherwise the shadow uses those colors. + + + + + Wrap text with color tags. + + + + + Wrap text with color tags. + + + + + Wrap text with color tags. + + + + + Replace br tags with newlines. + + + + + Should player be allowed to write given text on a sign? + Keep in mind that newer signs use TMP, whereas older signs use uGUI. + + + + + Disable style, align, and space because they make server list unfair. + + + + + 2023-01-25: fixing killing self with explosive to track kill under + the assumption that this is only used for tracking stats. (public issue #2692) + + + + + "Single-Render" scope as opposed to "Dual-Render" (rendering the scene a second time with a zoomed-in camera). + Blits middle square of the player's view into the viewmodel scope material's render target. + + + + + Finds an existing "{{Cargo/name" (if any), otherwise adds a new one. + + + + + Adds a new "{{Cargo/name" even if one already exists. + + + + + Helper for wiki writers to dump game data into a useful format. + + + + + Non-item replacement for SleekJars. + Arranges children in an equally-spaced ring around the center. + + + + + Actual unfiltered text. + Kept because plugins might be referencing, and game should use directly once state byte array is refactored. + + + + + If profanity filter is enabled this filtered text is displayed on the 3D sign and in the note UI. + Null or empty on the dedicated server. + + + + + Legacy uGUI text on canvas. + + + + + Legacy uGUI text on canvas. + + + + + Splits string and compares substrings ignoring case. + Tokens containing a colon ':' are ignored so that they can represent special filters like MasterBundleSearchFilter. + + + + + Should the RPC be called in reliable mode? Unreliable effects might not be received. + + + + + Applied if greater than zero. Defaults to 128. + + + + + Extra text added to tooltip. + + + + + Internal struct menu uses to sort items in box. + + + + + Item definition id. + + + + + Rarity used to sort mythical > legendary > epic > rare. + + + + + [0, 1] calculated chance of this item being unboxed. + Shown to player in item tooltips. + + + + + Sorts box entries from highest to lowest rarity. + + + + + Format qualityRarities as ##.# + Does not use 'P' format because localized strings unfortunately already had % sign. + + + + + Items server told us we unboxed, but we wait for the animation to finish before showing. + Typically one, but some newer boxes have bonus items occassionally. + + + + + Is one of the unboxed items mythical rarity? + + + + + Items in the box. + + + + + Skip unboxing animation. + Initial call rotates to just before the item, next call skips entirely. + + + + + Does client know about all the granted items? + If not, either something is bad in the econ config (uh oh!) or client is out of date. + + + + + Relatively efficiently find mesh components, and log an error if their mesh is missing, among other checks. + + + + + Unity warns about renderers registered with more than one LOD group, so we do our own validation as part of + asset loading to make it easier to find these. + + + + + Replaced by ServerMethodHandle. + + + + + Replaced by ClientInstanceMethod.InvokeAndLoopback or ClientStaticMethod.InvokeAndLoopback. + + + + + Replaced by ClientMethodHandle invoked with Provider.EnumerateClients_Remote. + Unlike ESteamCall.CLIENTS this is not loopback invoked. + + + + + Replaced by ClientMethodHandle invoked with SteamChannel.GetOwnerTransportConnection. + + + + + Replaced by ClientMethodHandle invoked with SteamChannel.EnumerateClients_RemoteNotOwner. + + + + + Replaced by ClientMethodHandle invoked with Provider.EnumerateClients. + Unlike ESteamCall.OTHERS this will be loopback invoked in singleplayer or listen server. + + + + + May have been used by voice in early versions, but has been completely removed. + + + + + Parses -X=Y from command-line. + Ideally we could do "where T : TryParse" but for the meantime there are specialized subclasses. + + + + + Maps region coord to a list of sub-road renderers in that region. + Unlike older "region" features, coord can be outside of the old bounds. + Not used in the editor or the dedicated server. + + Nelson 2025-03-28: experimenting with this to see whether it reduces time spent culling far-away road + renderers on Rio de Janeiro Remastered. (Lots of roads on this map.) + + + + + Max draw distance outside editor. + + + + + Called by navmesh baking to complete pending object changes that may affect which nav objects are enabled. + + + + + Allows Unity events to broadcast Event NPC rewards. + + + + + Event ID to use when SendDefaultEventId is invoked. + + + + + The event messenger can only be triggered on the authority (server). + If true, the server will replicate the event to clients. + + + + + Interface between the dedicated server command I/O and per-platform console. + + + + + Called when this implementation is setup by command window. + + + + + Called when this implementation is deleted or application quits. + + + + + Called each Unity update. + + + + + Broadcasts when the enter key is pressed. + + + + + Print white message. + + + + + Print yellow message. + + + + + Print red message. + + + + + July 7th! + + + + + This is the only /required/ override of text writer. + + + + + Can be added to certain entities to modify which crafting tags they make available to players. + At the time of writing (2025-04-08) the compatible entities are: + • Barricade + • Structure + • Vehicle + • Resource + • Object + + + + + Each specified component modifies tags. + + + + + If true then level should convert old node types to volumes. + + + + + If true then level should convert old non-volumes types to devkit objects. + + + + + Hash of nodes file. + Prevents using the level editor to make noLight nodes visible. + + + + + Code common to and . + + + + + Nelson 2025-05-13: replacing the "workshop request log" which used transport connection hash code with this + more recent IP address and Steam ID rate limiter. + + + + + Manually placed from the asset browser or old editor. + + + + + Spawned by foliage baking system. + + + + + Brushed on with the foliage tool. + + + + + Utilities for calling workshop functions without worrying about client/server. + This could be nicely refactored into a client and server interface, but not enough time for that right now. + + + + + Client/server safe version of GetQueryUGCNumKeyValueTags. + + + + + Client/server safe version of GetQueryUGCKeyValueTag. + + + + + Search for the value associated with a given key. + + + + + Client/server safe version of GetQueryUGCResult. + + + + + Is file banned? + + + + + Originally this was only in the uGUI implementation, but plugins can create uGUI text fields + regardless of which glazier is used. + + + + + Stockpile item definition id with rev-share for the level creators. + Randomly selected from associated items list. + + + + + Other menus can modify DevkitSelectionToolOptions so we need to sync our menu when opened. + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + Remove structure instance on server and client. + + + + + Used by ownership change and damaged event to tell relevant clients the new health. + + + + + Legacy function for UseableStructure. + + + + + Spawn a new structure and replicate it. + + + + + Not an instance method because structure might not exist yet, in which case we cancel instantiation. + + + + + Not ideal, but there was a problem because onLevelLoaded was not resetting these after disconnecting. + + + + + Maps prefab unique id to inactive list. + + + + + Sending yaw only costs 1 bit (flag) plus yaw bits, so compared to the old 24-bit rotation we may as well + make it high-precision. Quaternion mode uses 1+27 bits! + + + + + +0 = StructureDrop + +1 = root transform + + + + + Invoked when askUseObjectQuest succeeds. + + + + + When a client method is called on a target object that does not exist yet this class is responsible for + deferring the invocation until the instance does exist. For example until finished async loading. + + + + + Called by generated methods when target object does not exist. If target object has been marked deferred + then the method will be invoked after it exists. + + + + + Add list of deferred invocations for key. Otherwise messages will be discarded assuming it was canceled. + + + + + Remove pending invocations. + + + + + Invoke all deferred calls. + + + + + Invocations are grouped by net id block to ensure order is preserved between related objects. + + + + + Not a member of ClientMethodInfo because it does not need to be looked up using reflection. + + + + + Called before loading level. + + + + + Update currency and owned items if inventory has changed and menu is open. + + + + + Update currency or experience depending what the vendor accepts. + + + + + Nelson 2025-06-10: new code should favor Vector2Int. We don't want to introduce further uint8 region usage. + + + + + Get net ID only if transform is directly registered, not if transform is the child of a registered transform. + + + + + Log every registered pairing. + + + + + Called before loading level. + + + + + Reverse pairing specifically for building net id + relative path name. + + + + + Write header common to both static and instance methods, and return writer. + + + + + Valid when opened in Begin or End mode. + + If the quest is ready to complete the UI is opened in End mode to allow + the player to see what rewards they will receive after clicking continue. + Otherwise, in Begin mode the UI is opened to allow the player to review + the conditions before accepting or declining the request. + + If the player cancels the pending response is NOT chosen. + + + + + Valid when opened in Begin or End mode. + The player clicked pendingResponse in this dialogue to open the quest UI. + + + + + It is useful to be able to reference transforms generically over the network, for example to attach a bullet + hole to a tree or vehicle without tagging it as a tree or vehicle, but most entities placed in the level do not + have unique IDs. To work around this we count downward from uint.MaxValue for level objects to avoid conflicts + with server-assigned net ids. + + + + + Nelson 2025-06-10: this is used by older level file formats, but with placement of trees outside legacy + bounds now supported we use only the index in that case with GetTreeNetIdV2. + + Each region can have ushort.MaxValue trees, and we reserve that entire block so that a region can be slightly + modified on the client or server without breaking all netids in the level. + + + + + Each region can have ushort.MaxValue objects, and we reserve that entire block so that a region can be slightly + modified on the client or server without breaking all netids in the level. + + + + + Devkit instance IDs should already be fairly stable. There is no way any level is using more than 30 bits + for the instance ID, so it should be safe to set those bits to prevent collisions with server net IDs. + + + + + Struct interface so that for transient asset bundles (older workshop mods) they can be preloaded + and retrieved as-needed, but for master bundles the asset loading can be deferred until needed. + + + + + Legacy implementation that preloads assets. + + + + + Save a reference to an object in the asset bundle, but defer loading it until requested by game code. + + + + + Has a new announcement been posted by the developer? + If so, it is given priority over the featured workshop item. + + + + + Called after newsResponse is updated from web request. + + + + + Read News.txt file from Cloud directory to preview on main menu. + + + + + Helper for handlePopularItemResults. + If player has not dismissed item at index then proceed with query and return true. + + + + + Nelson 2024-04-23: A concerned player raised the issue that mature content could potentially be returned in + popular item results. Steam excludes certain mature content by default, but just in case, we check for these + words and hide if contained in title. + + + + + Successfully queried popular workshop items. + Tries to decide on an item that player has not dismissed. + + + + + Response about the item we decided to display. + + + + + Submit query for recently trending popular workshop items. + + + + + Entry point to deciding which workshop item is featured above recent announcements. + + + + + Ensures workshop files are not refreshed more than once per main menu load. + + + + + Synchronize widgets with their values. + + + + + Represents an item the vendor is buying from players. + + + + + Zero is treated as unset. + + + + + Has the contained been animated into visibility on-screen? + Used to disable animating out if disabled. + + + + + Allow Unity events to forcefully remove any barricades inside a sphere. + + + + + Prevents static member from being initialized during MonoBehaviour construction. (Unity warning) + + + + + Mesh Replacement Details + .dat Flags: + Has_1P_Character_Mesh_Override True Bool + Character_Mesh_3P_Override_LODs # Int + Has_Character_Material_Override True Bool + Asset Bundle Objects: + Character_Mesh_1P_Override_# GameObject with MeshFilter (mesh set to a skinned mesh) + Character_Mesh_3P_Override_# GameObject with MeshFilter (mesh set to a skinned mesh) + Character_Material_Override Material + + + + + Replacements for the main 1st-person character mesh. + + + + + Replacements for the main 3rd-person character mesh. + + + + + Replacement for the main character material that typically has clothes and skin color. + + + + + Sort servers by name A to Z. + + + + + Sort servers by name Z to A. + + + + + Sort servers by map name A to Z. + + + + + Sort servers by map name Z to A. + + + + + Sort servers by player count high to low. + + + + + Sort servers by player count low to high. + + + + + Sort servers by max player count high to low. + + + + + Sort servers by max player count low to high. + + + + + Sort servers by normalized player count high to low. + + + + + Sort servers by normalized player count low to high. + + + + + Sort servers by ping low to high. + + + + + Sort servers by ping high to low. + + + + + Information about a game server retrieved through Steam's "A2S" query system. + Available when joining using the Steam server list API (in-game server browser) + or querying the Server's A2S port directly (connect by IP menu), but not when + joining by Steam ID. + + + + + Join server by IP. + + + + + Server is not using an anycast proxy. + + + + + Server host indicated an anycast proxy is in use. + + + + + Moderator flagged server as using an anycast proxy. (EHostBanFlags.QueryPingWarning) + + + + + Ping time measured in milliseconds. + + + + + ID of network transport implementation to use. + + + + + Known plugin systems. + + + + + Probably just checks whether IP is link-local, but may as well use Steam's utility function. + + + + + Active player count divided by max player count. + + + + + Nelson 2024-08-20: This score is intended to prioritize low ping without making it the be-all end-all. The + old default of sorting by ping could put near-empty servers at the top of the list, and encouraged using + anycast caching to make the server appear as low-ping as possible. + + + + + Nelson 2024-08-20: This score is intended to prioritize servers around 75% capacity. My thought process is + that near-empty and near-full servers are already easy to find, but typically if you want to play online you + want a server with space for you and your friends. Unfortunately, servers with plenty of players but an even + higher max players make a 50% score plenty good. + + + + + Nelson 2024-08-20: This score is intended to balance out the downside of the fullness score decreasing for + servers with very high max player counts, and over-scoring servers with low max players. + + + + + Called before inserting to server list. + + + + + Parses value between two keys thing would parse thing + + + + + If set, this server was denied by a server curation list. + + + + + Disables Unity native systems unused by Unturned. + + + + + Enabled for effects held by guns and sentries. + + + + + Listen for OnDestroy callback because mods may be destroying themselves in unexpected ways (e.g., Grenade + component) and still need to be cleaned up. + + + + + Seconds after placement before damage can be dealt. + + + + + Seconds interval between damage dealt. + i.e., will not cause damage if less than this amount of time passed since the last damage. + + + + + UITK implementation consists of a container element which respects the regular position and size + properties, and a child content element which fits itself in the container. + + + + Start Vertex + Start Vertex + Start Tangent + End Vertex + End Tangent + End Vertex + + + Start Vertex + Start Vertex + Start Tangent + End Vertex + End Tangent + End Vertex + + + Start Vertex + Start Vertex + Start Tangent + End Vertex + End Tangent + End Vertex + + + Start Vertex + Start Vertex + Start Tangent + End Vertex + End Tangent + End Vertex + World units length along curve. + Spacing between points. + Max estimate distance from uniform interval before we have to retry. + How many times to retry if the estimate is too far off. + If length is already known pass it in, otherwise it's recalculated. + Time along curve. [0-1] + + + Start Vertex + Start Vertex + Start Tangent + End Vertex + End Tangent + End Vertex + Spacing between points. + Max estimate distance from uniform interval before we have to retry. + How many times to retry if the estimate is too far off. + + + + Single percentage randomness with two outcomes. + + + + + If true the event will only be invoked in offline mode and on the server. + + + + + Percentage chance of event occurring. + + + + + Invoked when random event occurs. + + + + + Invoked when random event does NOT occur. + + + + + Whether the pointer is currently in a spot that can be painted. + + + + + Get brush strength multiplier where strength decreases past falloff. Use this method so that different falloffs e.g. linear, curved can be added. + + Percentage of . + + + + Allows pooling elements. + If set, this is called rather than removing element from scroll view. + + + + + Kind of hacky... Used by player list for group connections. + + + + + Read commands from standard input, and write logs to standard output. + + + + + Broadcast the inputCommited event. + + + + + Synchronize console's title bar text. + Virtual because at one point Win32 SetTitleText was required. + + + + + Intercept the Ctrl-C or Ctrl-Break termination. + + + + + Handle Ctrl-C or Ctrl-Break on the game thread. + + + + + Has Ctrl-C or Ctrl-Break signal been received? + + + + + Is the Ctrl-C or Ctrl-Break signal being handled? + + + + + Names of achievements that can be granted by NPC rewards. + + + + + Name of promo level to additively load. + + + + + UTC when to begin load promo level. + + + + + UTC when to stop loading promo level. + + + + + Folder name of the map when it was in the game. + + + + + Published steam id for the file after it was moved to the workshop. + + + + + Dependencies to subscribe to when subscribing through the in-game menu. + e.g. Hawaii's assets are stored separately on the workshop. + + + + + Only applies if player is not subscribed to the workshop file. + Should an advertisement be shown in the Menu > Singleplayer > Curated list? + + + + + Published steam id to subscribe to. + + + + + If logging in after this point, subscribe. + + + + + If logging in before this point, subscribe. + + + + + Maps not installed by default, but recommended from maps list. + + + + + Maps to install to automatically. + Used early in startup to hopefully install before reaching main menu. + + + + + When moving between physics materials we need to continue any previous tire kickup particles until they expire. + This class manages the individual effect per-physics-material. Each wheel can have multiple at once. When the + particles have despawned and the effect is no longer needed, the effect game object is returned to the effect + pool and this class is returned to . + + + + + Name from . + + + + + Instantiated effect. Null after returning to pool. + + + + + Effect's transform. Null after returning to pool. + + + + + Component on gameObject. Null after returning to pool. + + + + + Whether this effect should be emitting particles. False stops the particle system immediately, whereas true + only starts playing on the next frame to avoid filling a gap between positions, e.g., after a jump. + + + + + Prevents repeated lookups if asset is null, while allowing asset to be looked up each time this effect + becomes active so that it can be iterated on without restarting the game. + + + + + Does this wheel affect brake torque? + + + + + Turn on/off physics as needed. Overridden by isAlive. + + + + + [0.0, 1.0] normalized position of wheel along suspension. + + + + + [0.0, 1.0] normalized position animated toward replicatedSuspensionState. + + + + + Model position interpolated toward animatedSuspensionState according to modelSuspensionSpeed. + + + + + [0, 360] angle of rotation around wheel axle. Measured in degrees because Quaternion.AngleAxis takes degrees. + + We track rather than using GetWorldPose so that we can alternate between using replicated and simulated + results without snapping transforms. + + + + + List is created if this wheel has a collider and uses collider pose. Null when vehicle is destroyed to + prevent creation of more effects. + + + + + Instance corresponding to current ground material. Doesn't necessarily mean the particle system is active. + + + + + Called after construction and on all clients and server when a player stops driving. + + + + + Called when vehicles explodes. + + + + + Called during FixedUpdate if vehicle is driven by the local player. + + + + + Calculate suspension state from GetWorldPose result. + + Nelson 2024-03-25: Originally we used the result of GetWorldPose for the model transform and calculated + the suspension state from it because I thought Unity was internally using the spring position that isn't + (currently) exposed to the API. Whether or not it is, it seems fine to calculate the spring position using + the ground hit point instead. We switched entirely away from GetWorldPose so that the wheel can retain + its roll angle when transitioning between locally simulated and replicated. + + + + + Called during Update on dedicated server only if replicated suspension state is enabled. + + + + + Set replicated suspension state AND animated suspension state when vehicle is first received. + + + + + + Supported when locally simulated and on remote clients. + + + + + Called during Update on client. + + + + + Called during Update if vehicle is driven by the local player. + + + + + Called during Update on the server while vehicle is driven by player. + + + + + Seamlessly teleports player to an equivalent position at the destination upon contact. + + + + + Target position and rotation. + + + + + Only used in the Unity editor for visualization. + + + + + If true, PopulateAsset can modify data. For example, to replace deprecated properties. + Only true if asset re-saving and asset metadata parsing are enabled, and asset origin allows re-saving. + Modifications are not saved if asset has any errors in order to avoid losing data. + + + + + If true, an asset with the same ID or GUID has been added to the current asset mapping, replacing this one. + + + + + If true, errors related to this asset were reported during loading. + + + + + Null or empty if created at runtime, otherwise set by when loading. + + + + + Contents of file this asset was loaded from. Only kept if data re-saving is enabled. (So that this memory + is collected after populating the asset.) + + + + + Master bundle this asset loaded from. + + + + + Were this asset's shaders set to Standard and/or consolidated? + Needed for vehicle rotors special case. + + + + + Should texture non-power-of-two warnings be ignored? + Unfortunately some third party assets have odd setups. + + + + + Should read/write texture warnings be ignored? + + + + + Hash of the original input file. + + + + + Maybe temporary? Used when something in-game changes the asset so that it shouldn't be useable on the server anymore. + + + + + Most asset classes end in "Asset", so in debug strings if asset is clear from context we can remove the unnecessary suffix. + + + + + Remove "Asset" suffix and convert to title case. + + + + + e.g. Canned Beans (Consumeable Item) + + + + + Perform any initialization required when PopulateAsset won't be called. + + + + + Planning ahead to potentially convert the game to use Unity's newer Addressables feature. + + + + + 2023-04-17: suggestion is to have a hardcoded list of hate speech that gets filtered + regardless of whether profanity filter is enabled. (https://forum.smartlydressedgames.com/t/22477) + + + + + Special asset type that isn't (shouldn't be) returned by asset Find methods. Instead, if found when resolving + an asset legacy ID or GUID, Find is called again with the target specified by this asset. + + + + + Enumerate elements that are not in the pool. + + + + + Sanity check all returned elements have a gameObject. + + + + + Map creator can specify a constant weather mode. + + + + + Associates a train vehicle ID with the index of a road path to spawn it on. + The level only spawns the train if this vehicle ID isn't present in the map yet, so every train on the map has to be different. + + + + + Should underwater bubble particles be activated? + + + + + Should positions underground be clamped above ground? + Underground volumes are used to whitelist valid positions. + + + + + If true, certain objects redirect to load others in-game. + + + + + If true, electric objects are always powered, and generators have no effect. + + + + + Display version in the format "a.b.c.d". + + + + + Version string packed into integer. + + + + + Number of custom tips defined in per-level localization file. + Tip keys are read as Tip_# + + + + + LevelBatching is currently only enabled if map creator has verified it works properly. + + + + + If true, map creator has verified the clutter option works as-expected. + + + + + Absolute path to the map folder. + + + + + Whether unity analytics should track this map's name. Don't want to burn all the analysis points! + + + + + Maps included with the game only, separate from category because arena maps are misc. + Category is set as part of the config file. This is only mainly used to enable unity analytics tracking for map name. + + + + + Only used for play menu categories at the moment. + + + + + SHA1 hash of the Level.dat file. + + + + + Test whether this map's workshop file ID is in the curated maps list. + + + + + Web URL to map feedback discussions. + + + + + If true, this info is out-of-date and may have been renamed or deleted. + + + + + Preview.png should be 320x180 + + + + + Get a random file path in the /Screenshots folder, or fallback to Level.png if it exists. + + + + + Get a random file path in the /Screenshots folder + + + + + When adding or removing entries remember to update NetMessages size and regenerate NetCode! + + + + + Client requesting workshop files to download. + + + + + Client has loaded the level. + + + + + Client providing Steam login token. + + + + + Client sending BattlEye payload to server. + + + + + Client sent a ping. + + + + + Client responded to our ping. + + + + + Client calling an RPC. + + + + + Client providing asset GUIDs with their file hashes to check integrity. + + + + + Client intends to disconnect. It is fine if server does not receive this message + because players are also removed for transport failure (e.g. timeout) and for expiry + of Steam authentication ticket. This message is useful to know the client instigated + the disconnection rather than an error. + + + + + Error code that the server exited with. + 0 is succesful, anything else is an error. + + + + + Empty if successful, + otherwise an explanation of the first error encountered. + + + + + Register all built-in asset and useable types. + + + + + Can be added to any GameObject to receive weather events for a specific custom weather asset. + + + + + GUID of custom weather asset to listen for. + + + + + Invoked when custom weather is activated, or immediately if weather is fading in when registered. + + + + + Invoked when custom weather finishes fading in, or immediately if weather is already fully active when registered. + + + + + Invoked when custom weather is deactivated and begins fading out. + + + + + Invoked when custom weather finishes fading out and is destroyed. + + + + + GUID parsed from WeatherAssetGuid parameter. + + + + + Default. Create a material instance for child renderer of Toggle game object. + Downside of this is exclusion from level batching texture atlas. + + + + + Object does not have any toggleable emissive materials. + + + + + Prevents calling getOrLoad redundantly if asset does not exist. + + + + + If set, overrides model prefab in the level editor. + + + + + Clip.prefab + + + + + Object.prefab + + + + + If true, object will be hidden when rendering GPS/satellite view. + Defaults to true if is set. + + + + + If true, Nav game object will be instantiated in singleplayer and on dedicated server. Useful for objects + which need to affect navmesh baking without colliding with zombies during gameplay. + Defaults to true for "medium" and "large" objects. + + + + + If true, Nav game object will be instantiated in the level editor. Useful for objects which need collision + with zombies during gameplay without affecting navmesh baking. + Defaults to true for "medium" and "large" objects. + + + + + Should landing on this object inflict fall damage? + + + + + If true, object is not loaded when clutter is turned off in graphics menu. + + + + + Property is not exposed at the moment because interactability properties should really be moved into some + sort of sub-asset. + + + + + Same as interactabilityDialogueRef, not public because it really needs to be cleaned up. :( + + + + + Effect played when single segment is destroyed. + + + + + Effect played when all segments are destroyed. + + + + + Weapon must have matching blade ID to damage object. + Both weapons and objects default to zero so they can be damaged by default. + + + + + [0, 1] probability of dropping any rewards. + + + + + If true, zombies can attack this object if it's blocking them. Defaults to false. + + + + + Multiplier for damage from zombies if RubbleCanZombiesDamage is true. + + + + + Controls how rubble affects Nav game object. + + + + + If set (>0), alerts nearby entities when an individual section is destroyed. + + + + + If set (>0), alerts nearby entities when all sections are destroyed. + + + + + Should colliders in the Triggers GameObject with "Kill" name kill players? + If Triggers GameObject is not set, searches Object instead. + + + + + Should this object only be visible if gore is enabled? + Allows pre-placed blood splatters to be hidden for younger players. + + + + + Only activated during this holiday. + + + + + Object to use during the Christmas event instead. + + + + + Object to use during the Halloween event instead. + + + + + Get asset ref to replace this one for holiday, or null if it should not be redirected. + + + + + If any conditions use flags they will be added to a set, + otherwise null is returned. + + + + + Recursively change all children including root from oldTag to newTag. + Aborts if a child doesn't match the old tag because it might be something we shouldn't change the tag of. + True if tags were all successfully changed. + + + + + Recursively change all children including root from oldLayer to newLayer. + Aborts if a child doesn't match the old layer because it might be something we shouldn't change the layer of. + True if layers were all successfully changed. + + + + + Called if we have a valid Nav GameObject. + Recast requires any meshes used on the Nav objects to be CPU readable, so we log errors here if they're not marked as such. + + + + + Should zombie(s) of the required type be spawned when player enters the area? + + + + + How many to spawn if spawning is enabled. + + + + + If greater than zero, find this zombie type configured in the level editor. For example, if the level editor + lists "0 Fire (4)", then 4 is the unique ID, and if assigned to this condition a zombie from the "Fire" + table will spawn. + + + + + Navmesh index player must be within. If set to byte.MaxValue then anywhere on the map is eligible. + + + + + Only kills within this radius around the player are tracked. + + + + + Only kills outside this radius around the player are tracked. + NSTM requested this for a sniping zombies quest. + + + + + If spawning is enabled, whether to use the timer between spawns. + + + + + Shows inspect buttons for each item mentioned in purchasable box or bundle's description text. + + + + + Manages global post-process volumes. + + + + + Callback when in-game graphic settings change. + + + + + Callback when player changes perspective. + + + + + Unfortunately EditorPrefs cannot be used in constructor. + + + + + Represents whether a player can craft a provided blueprint. If yes, which items to use, if no, why not. + Previously, some of this data was (confusingly) stored in the blueprint definition. + For performance, caller should re-use a list of BlueprintStatus and *not* discard unused results. + + + + + Total number of missing required nearby crafting tags. + + + + + Total required input item count minus available input item count. + + + + + Currently only used by housing planner. + Doesn't work with NPC conditions / rewards. + + + + + Currently only used by housing planner. + Doesn't work with NPC conditions / rewards. + + + + + Used to sort blueprints from "most craftable" (1) to "least craftable" (0). + + + + + Reset values set by PlayerCrafting.UpdateBlueprintDynamicStatus. + + + + + If not zero, use this amount instead of . + Used by as amount of ammo needed. + + + + + If true, cancel updating status as soon as anything goes wrong. + False for client UI where all info about blueprint is needed for display. + True on server where extra processing is a waste. + + + + + If set, log errors here. + + + + + Is current UTC time within this time span, and player has not dismissed? + + + + + Has the current time span been dismissed? + For example, player may have dismissed a previous event but not this current one. + + + + + Is current UTC time within this time span? + + + + + Allows file name to be included in kick message that client would otherwise not know. + + + + + Actual max value is plus one because message never contains zero items. + + + + + Has player dismissed the given workshop item? + + + + + Track that the player has dismissed the given workshop item. + + + + + Has player already auto-subscribed to the given workshop item? + + + + + Track that the player has auto-subscribed to the given workshop item. + + + + + Find colliders in gameObject and encapsulate their bounding boxes together. + + True if bounds were determined, false otherwise. + + + + Find colliders in gameObject and the point closest to position, otherwise use gameObject position. + + Collider is only included if its layer is enabled in layer mask. + + + + Does sphere overlap anything? + + + + + Allows foreach loop to iterate renderers defined in lod group. + + + + + Counts hits per-IPv4 address (if available) and per-SteamID (if available). + Connection is blocked if more than "threshold" hits occur within category (IPv4/SteamID). + Hit count resets when "window" seconds have passed since last hit. + + + + + If hit is within this many seconds of previous hit, it counts. Otherwise, counter is reset. + + + + + If more than this many hits occur the limit is reached. + + + + + Hack, we put this string on a newline for box probabilities. + + + + + Called on the client after a new message is inserted to the front of the list. + + + + + Called on the server when preparing a message to be sent to a player. + Allows controlling how %SPEAKER% is formatted for the receiving player. + + + + + Called on the server when formatting a player's message before sending to anyone. + Allows structuring the message and where the player's name is, for example: '[CustomPluginRoleThing] %SPEAKER% - OriginalMessageText' + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + Add a newly received chat message to the front of the list, + and remove an old message if necessary. + + + + + Previous messages sent to server from this client. + Newest at the front, oldest at the back. Used to repeat chat commands. + + + + + Send a request to chat from the client to the server. + + + + + Allows Unity events to send text chat messages from the client, for example to execute commands. + Messenger context is logged to help track down abusive assets. + + + + + Allows Unity events to broadcast text chat messages from the server. + Messenger context is logged to help track down abusive assets. + + + + + Server send message to specific player. + Used in vanilla for the welcome message. + Should not be removed because plugins may depend on it. + + + + + Server send message to specific player. + Used in vanilla by help command to tell player about command options. + Should not be removed because plugins may depend on it. + + + + + Server send message to all players. + Used in vanilla by some alerts and broadcast command. + Should not be removed because plugins may depend on it. + + + + + Serverside send a chat message to all players, or a specific player. + + Contents to display. + Default text color unless rich formatting overrides it. + Player who sent the message (used for avatar), or null if send by a plugin. + Send message to only this player, or all players if null. + Mostly deprecated, but global/local/group may be displayed. + URL to a 32x32 .png to show rather than a player avatar, or null/empty. + Enable rich tags e.g., bold, italics in the message contents. + + + + Nelson 2024-10-14: We might want to elaborate on this with "client-side chat commands" in the future, but + for the meantime I've hacked in this one command. + + + + + If set, find a child meshrenderer with this name and change its material to the character hair material. + + + + + If non-zero, legacy ID of final Asset to return. + + + + + If non-zero, legacy ID of SpawnAsset to resolve. + + + + + If both legacy IDs are zero this GUID will be used. If the target asset is + a SpawnAsset it will be further resolved, otherwise the found asset is returned. + + + + + Can be enabled by spawn tables that insert themselves into other spawn tables using the roots list. + If true, zeros the weight of child tables in the parent spawn table. + + + + + Has this spawn been added as a root of its child spawn table? + Used for debugging spawn hierarchy in editor. + + + + + Helper method for plugins because IDs are internal. + + + + + Parent spawn assets this would like to be inserted into. + + + + + Zero weights of child spawn tables. + Called when inserting a root marked isOverride. + + + + + Do tables need to be sorted and normalized? + + + + + Sort children by weight ascending, and calculate their normalized chance as a percentage of total weight. + + + + + Remove from roots, and if reference is valid remove us from their children. + + + + + Remove from tables, and if referencing a child table remove us from their roots. + + + + + Spawns an animal into the world. + + The ID of the animal. + Position to spawn the animal. + Angle to spawn the animal. + Whether the animal is dead or not. + + + + Gets the animal at a specific index. + + The index of the animal. + + + + + Find replacement spawnpoint for an animal and teleport it there. + + + + + Used in arena mode to reset all animals to dead. + + + + + Stripped-down version of structure prefab for previewing where the structure will be spawned. + + + + + Whether preview object is currently highlighted positively. + + + + + Time when "Use" animation clip started playing in seconds. + + + + + Length of "Use" animation clip in seconds. + + + + + True when animation starts playing, false after placement sound is played. + + + + + Whether the "Use" animation clip started playing. + + + + + If running as server, whether ReceiveBuildStructure has been called yet. + + + + + Whether basic range and claim checks passed. + + + + + Position the item should be spawned at. + + + + + Rotation the item should be spawned at. + + + + + Interpolated toward customRotationOffset. + + + + + Allows players to flip walls. + + + + + Vertical offset using scroll wheel. + + + + + Whether enough time has passed for "Use" animation to finish. + + + + + Whether animation has reached the time when placement sound should play. + + + + + Used to aid backwards compatibility as much as possible when transitioning Unity versions breaks asset bundles. + + + + + Unity 5.5 and earlier per-asset .unity3d file. + + + + + When "master bundles" were first introduced in order to convert older Unity 5.5 asset bundles in bulk. + + + + + Unity 2018 needed a new version number in order to convert materials from 2017 LTS asset bundles. 2019 did not need a + new version number, but in retrospect it seems unfortunate that we cannot distinguish them, so 2020 does have its own. + + + + + 2021 LTS+ + + + + + The first time asset loading finishes it will load the main menu. + + + + + If true, either loading during initial startup or full refresh. + + + + + If true, currently searching locations added after initial startup loading. + + + + + Has initial client UGC loading step run yet? + Used to defer asset loading for workshop installs that occured during startup. + + + + + Has initial map loading step run yet? + Used to defer map loading for workshop installs that occured during startup. + + + + + Calling this "legacy" is a bit of a stretch because even most of the vanilla assets are + built around the 16-bit IDs. Ideally no new code should be relying on 16-bit IDs however. + + + + + Incremented when assets are added or removed. + Used by boombox UI to only refresh songs list if assets have changed. + + + + + In singleplayer and the level editor this is the same as defaultAssetMapping, + but when playing on a server a subset of assets based on the server's workshop files is used. + + + + + Should folders be scanned for and load .dat and asset bundle files? + Plugin developers find it useful to quickly launch the server. + + + + + Do we want to enable shouldDeferLoadingAssets? + + + + + Should extra validation be performed on assets as they load? + Useful for developing, but it does slow down loading. + + + + + Should asset file metadata such as line numbers and comments be parsed? + Useful for development (e.g., error messages), but may slow down loading and increases RAM usage. + + + + + Should asset files be re-saved after all loading is finished? + Requires asset metadata. Useful for automatically upgrading .dat/.asset files. + + + + + Should some specific asset types which opt-in be allowed to defer loading from asset bundles until used? + Disabled by asset validation because all assets need to be loaded. + + + + + Should workshop asset names and IDs be logged while loading? + Useful when debugging unknown workshop content. + + + + + Should a JSON report of all the game's assets be exported? + + + + + Should GC and clear unused assets be called after every loading frame? + Potentially useful for players running out of RAM, refer to: + https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/1352#issuecomment-751138105 + + + + + Should modded spawn tables being inserted into parents be logged? + Useful for debugging workshop spawn table problems. + + + + + Loaded master bundles. + + + + + Loading master bundles. + + + + + Master bundle from root /Bundles directory containing vanilla assets. + + + + + While an asset is being loaded, this is the master bundle for that asset. + Used by master bundle pointer as a default. + + + + + This method supports . + + + + + Find an asset by GUID reference. + This method supports . + + Asset with matching GUID if it exists, null otherwise. + + + + Find an asset by GUID reference. + This method supports . + Maybe considered a hack? Ignores the current per-server asset mapping. + + Asset with matching GUID if it exists, null otherwise. + + + + Find an asset by GUID reference. + This method supports . + Maybe considered a hack? Ignores the current per-server asset mapping. + + Asset with matching GUID if it exists, null otherwise. + + + + Load content from an assetbundle. + + + + + Find an asset by GUID reference. + This method supports . + + Asset with matching GUID if it exists, null otherwise. + + + + Find an asset by GUID reference. + This method supports . + + Asset with matching GUID if it exists, null otherwise. + + + + This method supports . + + + + + This method supports . + + + + + This method supports . + Note: this method doesn't handle redirects by VehicleRedirectorAsset. + + + + + This method supports . + Note: this method doesn't handle redirects by VehicleRedirectorAsset. + + + + + This method supports . + + + + + This method supports . + + + + + Useful if GUID can reference a different asset type than legacy ID. For example, gun magazine GUID can + reference a SpawnAsset while its legacy ID cannot. + This method supports . + + + + + Append assets that extend from result type. + + + + + Maybe considered a hack? Ignores the current per-server asset mapping. + Append assets that extend from result type. + + + + + While playing on server the client will use the same dictionary/list of assets the server uses in order + to reduce issues with ID conflicts. + + 2023-05-27: server now ALSO uses the same logic to ensure IDs are applied in consistent order regardless + of multi-threaded loading order. + + + + + Search all loaded master bundles for one in path's hierarchy. + + + + + Find loaded master bundle by name. + + + + + Unload all asset bundles from memory, and empty known list. + Called when reloading assets. + + + + + Catches exceptions thrown by LoadFile to avoid breaking loading. + + + + + Called when a new workshop item is installed either on client or server. + + + + + Reload assets in given folder. + + + + + Do we have any new spawn assets that have not been linked yet? + Used to skip linking spawns if not required when downloading assets. + + + + + Can now be safely called multiple times on client in order to handle spawns for downloaded maps. + Spawn tables have "roots" which allow mods to insert custom spawns into the vanilla spawn tables. + This method is used after workshop assets are loaded on client, or after the dedicated server is done downloading workshop content. + + + + + Look through all item blueprints and log errors if there are duplicates. + + + + + Look through all dialogue and check that their referenced + dialogueID or vendorID is an actual loaded asset. + + + + + Manually run asset unload and garbage collection in the hope + that it will minimize RAM allocated during loading. + + + + + Helper for Assets.init. + Load all non-map assets from: + /Bundles/Workshop/Content + /Servers/ServerID/Workshop/Content + /Servers/ServerID/Bundles + + + + + Helper for Assets.init. + Load all non-map assets from subscribed UGC. + + + + + Helper for modders creating workshop content. + Loads folders in the "Sandbox" directory the same way workshop files are loaded. + + + + + Helper for Assets.init. + Load all assets in each map's Bundles folder, and content in map's Content folder. + + + + + Not the tidiest place for this, but it allows startup to pause and show error message. + Occasionally there have been reports of the steamclient redist files being out of date on the dedicated + server causing problems. For example: https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/2866#issuecomment-965945985 + + + + + Note: inventory service does not support exchanging multiple items simultaneously. + + + + + Optional parameter for error logging and responding to the invoker. + + + + + Wraps audio source to prevent caller from meddling with it, and to allow the implementation + to change in the future if necessary. + + + + + 2D audio. + + + + + Optional parent transform to attach the audio source to. + + + + + 0 = 2D, 1 = 3D + + + + + Associates an ID with the instance of the sound being played. This ensures that if Stop() is called + on an old handle it will not stop playing the audio if the component has already been recycled. + + + + + True while inactive, false while playing. + + + + + Timer needs playId as well in case source has been recycled by the time duration expires. + + + + + Not extendable until transport API is better finalized. + + + + + How many seconds message should popup. + + + + + Which item ID we thought was there. If the item ID currently at the coordinates doesn't match we clear this hotkey. + + + + + Start/Stop input is encoded as 2 bits, 1 bit for Start flag and 1 bit for Stop flag. + + Prior to 2023-03-16 it was a single bit. The server would Start if true and the previous frame was false, + and vice versa call Stop if false and the previous frame was true. The problem with that approach was when + the client FPS is higher than the simulation FPS a series of repeated attack presses would be treated as a + continuous held attack input. Semi-auto guns were difficult to shoot at their max rate of fire. Sending both + allows the server to theoretically call Start every simulation frame as opposed to only half. + + First approach was to OR Start if held, otherwise OR Stop. This doesn't work because for example when Aim is + pressed the Stop flag will already be enabled, so the gun Starts aiming, Stops aiming, Starts aiming, and then + stays aiming rather than just Start and stay aiming. Instead we only want Stop to be sent once. + + + + + Wants to "start" primary or secondary input. (e.g., Useable.startPrimary) + + + + + Wants to "stop" primary or secondary input. (e.g., Useable.stopPrimary) + + + + + Invoked from tellEquip after change. + + + + + Skin applied to the currently equipped useable. + + + + + Does equipped useable have a menu open? + If so pause menu, dashboard, and other menus cannot be opened. + + + + + For aiming toggle input. + + + + + Get ragdoll effect to use when the current weapon deals damage. + + + + + It should be safe to call this immediately because hotkeys are loaded in InitializePlayer. + + + + + Prevent multiple hotkeys from referencing the same item. + + + + + Left-handed characters need the stat tracker to be flipped on the X axis so that the text reads properly. + ItemTool doesn't know about left/right handedness, so for the moment that's handled here because only players need this fixed up. + + + + + Match stat tracker gameobject's isActive to whether skins are visible. + + + + + Match all stat tracker visibilities to whether skins are visible. + + + + + Called clientside to ask server to equip an item in the inventory. + + + + + Hacked-in to bypass regular clientside checks when client would predict the item at given coords. + + + + + Remove the item from inventory so that if we die before the item isn't dropped + + + + + Finish dequipping from + + + + + Invoked before dealing damage regardless of whether the punch impacted anything. + + + + + (Temporarily?) separated out from simulate to try and get a better exception call stack. + + + + + (Temporarily?) separated out from simulate to try and get a better exception call stack. + + + + + (Temporarily?) separated out from simulate to try and get a better exception call stack. + + + + + Allow UI to process input [0, 9] key press when cursor is visible. + + + + + Process input [0, 9] key press. + + + + + If equipped item is bound to a hotkey, return the button [0, 9] associated. + Otherwise, return -1. + + + + + Called by input when preparing for simulation frame. + + + + + Called once by Setup. + + + + + Extension method for Thread class. + Plugins use this. + I might have accidentally removed it due to zero refs and Pustalorc was mad: + https://github.com/SmartlyDressedGames/Unturned-3.x-Community/discussions/4131 + + + + + Throw an exception if current thread is not the game thread. + + + + + Only on dedicated server: throw an exception if current thread is not the game thread. + + + + + Search loaded assets for blueprints that output a single structure item and are + available on the current map. + + + + + Update status of all relevant blueprints. + + + + + Currently saved craftableBlueprint for asset may have become uncraftable, + in which case we try finding a craftable replacement. + + + + + Get a blank status from the pool or construct a new one. + + + + + Search inventory for housing items, count the quantity of each, and remove + duplicate entries from the list because it is used for the UI. + + + + + Stripped-down version of structure prefab for previewing where the structure will be spawned. + + + + + Whether preview object is currently highlighted positively. + + + + + Position the item should be spawned at. + + + + + Rotation the item should be spawned at. + + + + + Interpolated toward customRotationOffset. + + + + + Allows players to flip walls. + + + + + Vertical offset using scroll wheel. + + + + + Box in the HUD with selected item name and quantity. + + + + + Blueprints which create a structure item. + + + + + One craftable blueprint per potential structure item. + + + + + Recycled blueprint statuses. + + + + + Steam currency codes seem to be ISO 4217, however the documentation (as of 2021-01-29) does not say so. + + + + + If overlay is disabled there is no point showing the in-game item store because the player will not be able + to checkout. We request listings regardless in order to show the "sale" label automatically. + + + + + Windows-specific extensions of Windows console input. + Uses the Win32 API to force a console to be created and destroyed. + + + + + Directory the game files are installed in. For the editor this is the /Builds/Shared directory. + Windows and Linux: contains the executable and the Unturned_Data directory. + MacOS: contains the Unturned.app bundle. + + + + + Handles VehicleRedirectorAsset (if any) and returns actual vehicle asset (if any). + + + + + Handles VehicleRedirectorAsset returning load paint color override (if any) and returns actual vehicle asset (if any). + + + + + Handles VehicleRedirectorAsset returning spawn paint color override (if any) and returns actual vehicle asset (if any). + + + + + Handles VehicleRedirectorAsset (if any) and returns actual vehicle asset (if any). + + + + + Handles VehicleRedirectorAsset returning load paint color override (if any) and returns actual vehicle asset (if any). + + + + + Handles VehicleRedirectorAsset returning spawn paint color override (if any) and returns actual vehicle asset (if any). + + + + + Handles VehicleRedirectorAsset (if any) and returns actual vehicle asset (if any). + + + + + Handles VehicleRedirectorAsset returning load paint color override (if any) and returns actual vehicle asset (if any). + + + + + Handles VehicleRedirectorAsset returning spawn paint color override (if any) and returns actual vehicle asset (if any). + + + + + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. + + + + + Supports redirects by VehicleRedirectorAsset. If redirector's SpawnPaintColor is set, that color is used. + + true if matching vehicle asset was found. (Not necessarily whether vehicle was spawned.) + + + + Tools like carjacks and tires can be used in safezone by admins for maintenance. + + + + + Create glazier implementation. Invoked early during startup. + + + + + Multiplier for the maximum distance the gunshot can be heard. + + + + true if key existed and was removed. + + + true if key existed and was removed. + + + + Unturned equivalent of unity's PlayerPrefs. + Convenient for saving one-off key-value pairs. + + + + + String table specifically for Unity physics material names. + Implemented so that tires can more efficiently replicate which ground material they are touching. + + + + + Get an ID that can be used to reference a physics material name over the network. If given material name + isn't supported (e.g., not registered in a PhysicsMaterialAsset or over max material limit) returns + instead. + + + + + Get name of a physics material from network ID. Returns null if ID is null, e.g., if the sent name wasn't + registered or was over the max material limit. + + + + + Called when resetting network state. + + + + + Called on server and singleplayer before loading level. + + + + + Number of bits needed to replicate PhysicsMaterialNetId. + + + + + Implemented by components to support taking damage from explosions. + Not intended for external use (yet?) and may need to change. + + + + + Used to exclude dead entities from further evaluation. + + + + + Used to sort damage from nearest to furthest. + + + + + Intended for internal use only. + + + + + Data that we pool to reduce allocations, but needs to be separate per-invocation of explosion in case it's + invoked recursively. (for example, by blowing up a vehicle) + + + + + Replacement for playerDamaged. + + + + + Replacement for zombieDamaged. + + + + + Replacement for animalDamaged. + + + + + Refer to ExplosionPoolData for pooling explanation. + + + + + Was necessary when structures were children of level transform. + + + + + Was necessary when trees were children of ground transform. + + + + + Somewhat hacked-together to find owner of a vehicle, barricade, or structure descendant. + + + + + Get average explosionArmor of player's equipped clothing. + + + + + Refer to getPlayerExplosionArmor for explanation of total/average. + + + + + Do damage to a zombie. + + + + + Legacy function replaced by damageZombie. + + + + + Legacy function replaced by damageZombie. + + + + + Do damage to an animal. + + + + + Legacy function replaced by damageAnimal. + + + + + Legacy function replaced by damageAnimal. + + + + + This unwieldy mess is the original explode function, but should be maintained for backwards compatibility with plugins. + + + + + Used if explosion won't damage anything. + + + + + Do radial damage. + + + + + Server spawn impact effect for all players within range. + + + + + Server spawn impact effect for all players within range. Optional "spectator" receives effect regardless of distance. + + + + + Server spawn effect by ID for all players within range. Optional "spectator" receives effect regardless of distance. + + + + + Server spawn effect for all players within range and instigator receives effect regardless of distance. + + + + + parent should only be set if that system also calls ClearAttachments, otherwise attachedEffects will leak memory. + + + + + Nelson 2025-03-10: This aims to avoid messing with Magazine transform IsActive unless skin already did. + + + + + Nelson 2024-11-15: By default, attachments use their corresponding "hook" transform. For example, magazines + use the "Magazine" transform as their parent. If a child of the hook transform matches a caliber in the + attachment's caliber list that is used instead. + + + + + Should the buying and selling lists be alphabetically sorted? + + + + + This prevents identical tag provider setups from listing in the UI. + For example, two workbenches providing the same tags shouldn't show two UI listings. + + + + + Player does not want to see this blueprint. + + + + + Player wants to save this blueprint in a special category. + + + + + Find nearby crafting tag providers and query their tags. + + + + + Tests whether nearby tags include specified tag. + Doesn't update nearby tags, so call UpdateAvailableCraftingTags if out-of-date. + + + + + Requested for plugin use. + Notifies owner they should refresh the crafting menu. + + + + + Update anything that will not change as blueprint is invoked repeatedly on server. + + + + + Update anything that can change as blueprint is invoked repeatedly on server. + + + + + Returns true if should exit early. + If updating behavior here please remember to update . + + + + + Find all item assets available to the player for crafting. + Used to more quickly identify blueprints that might be craftable, rather than testing all blueprints. + If updating behavior here please remember to update . + + + + + Allows housing planner to craft without playing effect, without also allowing + cheaters to craft without playing effect. (if it were an RPC param) + + + + + Get local player's per-blueprint preferences. + + + + + Set local player's per-blueprint preferences. + This is helpful both to prevent accidentally crafting certain blueprints (like blindfolds) when click to + craft is enabled, and to save frequently used blueprints. + + + + + Why isn't tags list public visibility? Because if adding features to (for example) consume a resource when + crafting tag provider is used that will require an API change. + + + + + Extensions to the built-in Screen class. + We have run into multiple problems with the Screen.resolutions property over the years, so this class aims to + protect against bad data. + + + + + Work-in-progress plan to allow modders to create custom physics effects. + + + + + Can crops be planted on a given material? + + + + + Can oil drills be placed on a given material? + + + + + Original width field is misleadingly named. It represents half the width of the flat section of the road. + + + + + Original depth field is misleadingly named. It represents half the "up" size of the road. + + + + + Distance along the terrain surface normal to move each road vertex. + + + + + New code should not use this. Only intended for backwards compatibility. + + + + + Ideally the interactable components should have a reference to their barricade, but that will maybe happen + after the NetId rewrites. For the meantime this is to avoid calling FindBarricadeByRootTransform. If we go + the component route then FindBarricadeByRootTransform will do the same as this method. + + + + -1 if table was not found. + + + + By default, clickable only responds to LeftMouse without the Control modifier. + Unturned (currently) filters left/right mouse and modifiers outside Glazier, + so add activators for left/right and control modifier to all clickables. + + + + + USS best practices mentions inline styles have a higher memory overhead, so we + only apply an inline value if it doesn't match the default :root font style. + + + + + USS best practices mentions inline styles have a higher memory overhead, so we + only apply an inline value if it doesn't match the default :root text alignment. + + + + + Ehh kind of a stretch to mark this obsolete or for backwards compatibility. Introducing it for road assets + which specify the PhysicMaterial to assign to the colliders. Specifying an asset path is available, but + for the common case we will use the built-in vanilla resources. + + + + + Get legacy enum corresponding to Unity physics material object name. + Moved from obsolete checkMaterial method. + + + + + If collider and its physics material are not null, get the physics material's name. Null otherwise. + + Nelson 2025-04-22: this method may seem silly on first glance. However, I tracked down some every-frame + memory allocation to getting the PhysicMaterial.name property. This method caches the instance ID to + name lookup in a dictionary to avoid that. Note: we don't worry about clearing the dictionary because + there aren't very many physics materials. + + + + + Base class for uGUI implementations of primitive building block widgets. + + + + + Called after constructor when not populating from component pool. + + + + + Called after constructor when re-using components from pool. + + + + + Synchronize uGUI component colors with background/text/image etc. colors. + Called when custom UI colors are changed, and after constructor. + + + + + Synchronize uGUI component sprites with theme sprites. + Called when custom UI theme is changed, and after constructor. + + + + False if element couldn't be released into pool and should be destroyed. + + + + Unity recommends enabling components after parenting into the destination hierarchy. + + + + + RectTransform children should be attached to. Overridden by ScrollView content panel. + + + + + This helper property's purpose is to: + - Ensure other properties don't accidentally remove LayoutElement if others need it. + - Ensure LayoutElement is destroyed before returning to pool. + + + + + Parameters for connecting to a game server. + + Admittedly there are other parameters to the Connect method, + but those are for detecting advertisement discrepencies and can be null. + + + + + Server's public IP address of a Steam "Fake IP" address. + + + + + Port for Steam's "A2S" query system. This the port we refer to when + sharing a server's address (e.g., 127.0.0.1:queryport). + + + + + Port for game traffic. i.e., Steam manages the query port socket while + we manage the connection port socket. The game assumes it's the query + port plus one. NOTE HOWEVER after the introduction of "Fake IP" support + (2023-12-07) the connection port is the same as the query port for fake + IPs. In keeping with the spirit of fake values to simplify existing code, + we act as if the connection port is plus one except in the appropriate + ClientTransport code when the fake IP is detected. + + + + + Referred to as "Server Code" in menus. + Used if address is zero. + + + + + If -1, this region is finished activating/deactivating. + Otherwise, incremented once per frame until per-region count is reached. + + Per-region data is removed when isInsideMask is false and progressIndex is -1. + + + + + If true, this region is within MaxDistance of current CameraCoord. + + + + + Tracks activation and deactivation of Regions as camera moves around the level. + + + + + Mark all cells as finished loading and remove cells outside the camera view. + Used after teleporting or loading. + + + + + Caller passes an empty dictionary to be filled with update info. + Increments progressIndex for each returned region. + If region is finished updating, call NotifyRegionFinishedUpdating. + + + + + Called when progressIndex has reached end of given region. + + + + + Fill output set with mask offsets applied to current camera coordinate. + + + + + Find changes between old and current coordinate sets to mark regions in/out of mask. + + + + + Reset region's progress counter and change inside/outside status. + + + + + Allows Unity events to spawn effects. + + + + + GUID of effect asset to spawn when SpawnDefaultEffect is invoked. + + + + + If true the server will spawn the effect and replicate it to clients, + otherwise clients will predict their own local copy. + + + + + Should the RPC be called in reliable mode? Unreliable effects might not be received. + + + + + Transform to spawn the effect at. + If unset this game object's transform will be used instead. + + + + + Applied if greater than zero. Defaults to 128. + + + + + Marker for counting number of tips. + + + + + Camera used while transitioning between scenes to prevent the "no cameras rendering" warning. + + + + + Shown when game connection ping is significantly higher than server browser ping. At the time of writing + (2025-01-17) this is likely because the server is using an "anycast proxy" in front of Steam A2S cache. + + + + + Set to Time.frameCount + 1 while loading. + In the past used realtime, but that was unreliable if an individual frame took too long. + + + + + Select a loading image while on the startup screen or a level without any images. + + + + + Convert world-space point into region coordinates that may be out of bounds. + + + + + Convert world-space position into a region coordinate that may be out-of-bounds. + + + + + Returns true if coord is within legacy range. + + + + + Clamp position into the maximum bounds expected by the game, not necessarily the level bounds. + + True if position was modified. + + + + Kick players maybe trying to impersonate me. I guess nobody else named Nelson is allowed in the game! + 2023-09-19: relaxed this a bit by trimming names and using Equals/Starts/Ends rather than Contains + because there was a player with Nelson in their username. + + + + + GUID of the asset this is referring to. + + + + + Whether the type has been asigned. Note that this doesn't mean an asset with exists. + + + + + True if resovling this type reference would get that type. + + + + + Maximum count of naturally spawned boss zombies. Unlimited if negative. + Game will not spawn/respawn boss zombie types passing this limit, but quest spawns can bypass it. + + + + + Base class for UIToolkit implementations of primitive building block widgets. + + + + + Set by child. + + + + + Synchronize control colors with background/text/image etc. colors. + Called when custom UI colors are changed, and after constructor. + + + + + If set, takes priority over VehicleRedirectorAsset's paint color and over VehicleAsset's default paint color. + + + + + Returned asset is not necessarily a vehicle asset yet: It can also be a VehicleRedirectorAsset which the + vehicle spawner requires to properly set paint color. + + + + + Plugin-only event when throwable is spawned on server. + + + + + Allows NPCs to trigger plugin or script events. + + + + + instigatingPlayer can be null. For example, if instigated by NpcGlobalEventMessenger. + + + + + Circular mask for 2D distances in meters on a 2D cell grid. + Includes a cell if the meters distance between the center cell + and the closest point on test cell is within radius. + + + + + World space distance in meters. + + + + + Region cell size in meters. + + + + + Data in common between list downloaded from a GET request and a ServerListCurationAsset. + + + + + Optional web image path if icon isn't included. + + + + + Incremented during server list refresh for each server blocked by this rule. + + + + + Starting position when the bullet was fired. + + + + + Only available on the server. For use by plugins developers who want to analyze deviation between approximate + start direction and final hit position using and + per public issue #4450. Note that origin and direction on server are not necessarily exactly the same as on + the client for a variety of reasons, including that bullets on the client can be spawned between simulation + frames when the aim direction was different. (Aim direction is updated every drawn frame on the client as + opposed to every simulation frame on the server.) Rather than kicking for one particularly large deviation + we would recommend tracking stats for each shot's actual deviation vs max theoretical deviation. Remember + to account for bullet drop and that aim spread is relative to this direction. (For example, a shotgun may + fire ~8 pellets in a cone around this direction.) Note also that in third-person the bullet can turn up to + 90 degrees from the aim direction if the camera is up against a wall. + + + + + Combination of gun and attachments' bullet gravity multipliers. + + + + Whether plugin allowed attachment. + + + + Plugin-only event when bullet is fired on server. + + + + + Plugin-only event when bullet hit is received from client. + + + + + Plugin-only event when projectile is spawned on server. + + + + + reticuleHook.localPosition after instantiation, or zero if null. + + + + + True if startPrimary was called this simulation frame. + Allows gun to shoot even if stopPrimary is called immediately afterwards. + + + + + Remaining calls to tock before firing. + + + + + Shot counter used by needsRechamber and RechamberAfterShotCount. + + + + + Is the tactical attachment toggle on? + e.g. True when the laser is enabled. + + + + + Should stat modifiers from the current tactical attachment be used? + + + + + Factor e.g. 2 is a 2x multiplier. + Prior to 2022-04-11 this was the target field of view. (90/fov) + + + + + Zoom multiplier in third-person. + + + + + Whether main camera field of view should zoom without scope camera / scope overlay. + + + + + Original barrel and magazine assets are supplied because they may have already been deleted. Barrel is only + valid if quality was greater than zero. + + + + + Called on server and owning client. + + + + + Calculate damage multiplier for individual bullet. + + + + + Requested for plugin use. + + + + + Request from the server to play a gun jammed animation. + Since client can't predict chamber jams we fixup the predicted ammo count. + + + + + Note: This is the m/s² acceleration, not the multiplier. + + + + + This is a bit of a hack... aimAccuracy is [0, maxAimingAccuracy] and changed during each FixedUpdate call, + but was used in some gameplay display features like holo sight, laser, ADS, etc. (yes, should + be de-coupled from FixedUpdate but that is its own issue) To smooth this out we interpolate + slightly behind the aimAccuracy value depending on the time since FixedUpdate. + + + + + Holographic sights follow the true aiming direction regardless of viewmodel animation. + + + + + Note: This is the multiplier, not the m/s² acceleration. + + + + + Code common for regular gun and sentry gun. + + + + + Consolidates parameters for older, separate inventory search methods. + + The "player" part of the name refers to the PlayerInventory-specific parameters. It can still be used to search + the Items class, in which case those parameters do not apply. + + + + + List to populate with matching items. + + + + + If true, search player's primary and secondary weapon slots. + Only applicable when used with PlayerInventory class. (I.e., not Items class.) + + + + + If true, search storage container player is currently interacting with (if any). + Only applicable when used with PlayerInventory class. (I.e., not Items class.) + + + + + If greater than zero, search exits early once Results count meets MaxResultCount. + + + + + If set, item must be this type to match. + + + + + If set, AssetRef must be a reference to item's asset to match. + Replaces older "id" parameter which matched if item's legacy asset ID was the same. + + + + + If true, items with amount of zero can match. Otherwise, they are ignored. + Replaces older "findEmpty" parameter which matched if (findEmpty || amount > 0). + + + + + If true, items with an "amount" >= their MaxAmount are ignored. Otherwise, they can match (default). + + + + + + If set, item must be of type ItemCaliberAsset. Asset's caliber list must either: + • Contain this caliber ID. + • Or, if empty, IncludeUnspecifiedCaliber must be true. + Otherwise, item is ignored. + + + + + If set, item must be of type ItemCaliberAsset. Asset's caliber list must either: + • Contain one of these caliber IDs. + • Or, if empty, IncludeUnspecifiedCaliber must be true. + Otherwise, item is ignored. + + + + + Only applicable if CaliberId or AnyCaliberIds is set. + If true, assets with an empty calibers list can match. Otherwise, they are ignore.d + + + + + If set, do not include this specific item instance in search results. + Kind of hacked-in for ignoring "target item" as a potential input item. + + + + + Nearly identical to InventorySearch aside from: + • Struct instead of class to improve garbage collection performance in pooled lists. + • More understandable name. + • Provides reference to Items holding "Jar." Longer-term this should be preferred over the "Page" property. + + + + + Serverside delete an amount of this item. + + False for crafting where original item can be kept, true when selling to vendors. + Total amount deleted. + + + + -1 if no eligible item is found. + If includeMaxQuality is true an item with quality of 100 can be "lowest quality", otherwise item has to + be less than 100 quality. + + + + + Please use PlayerInventorySearchResultV2 for better performance! + + + + + Serverside delete an amount of this item. + + Total amount deleted. + + + + Used by the server to validate client Unity player files (assemblies and resources). + + + + + Should players be allowed to join this server regardless of whether their DLL hash matches ours? + Useful to allow players to join debug mode servers. + + + + + Should players be allowed to join this server regardless of whether their resources hash matches ours? + Useful to allow players to join debug mode servers. + + + + + Experience to add or subtract when used. Defaults to zero. + + + + + Canned beans have skins from April Fools. + + + + + Note: if calling ItemRef.Get() please use FindItemAsset instead to avoid redundant asset lookups. + + + + + Does this blueprint output create the specified item? + + + + + Reset dragging handle and register transformation. + + + + + If true, vest and backpack spawn System_Area instead of System_Hook. + + + + + Sets the point to lerp from, should be called after resetting position or things like that. + + + + + Logs enabled when WITH_NSB_LOGGING is defined. + Tracking down an issue where snapshot buffer stops working for groups of networked objects. + + + + + When adding or removing entries remember to update NetMessages size and regenerate NetCode! + + + + + Server sent a ping. + + + + + Server replying to our ping. + + + + + Server is shutting down shortly. + + + + + Create game object for player. + + + + + Destroy game object for player. + + + + + Download these files before loading the level. + + + + + Server wants additional info before accepting us. + + + + + Server has accepted us and will create a player game object. + + + + + Server rejected us, we will go back to the menu. + + + + + Banned either during connect or gameplay. + + + + + Kicked during gameplay. + + + + + Should be converted to an RPC. Leftover from prior to net messaging code. + + + + + Should be converted to an RPC. Leftover from prior to net messaging code. + + + + + Server sending BattlEye payload to client. + + + + + Infrequent notification of queue position. + + + + + Server calling an RPC. + + + + + Allow Unity events to apply damage in a sphere. (doesn't have any visual effects) + Intended to replace unsupported/unintentional use of "Grenade.cs" and "Rocket.cs" scripts. + + + + + Zombie explosion types have slight variations e.g. lighting zombies on fire. + + + + + If greater than -0.5, overrides default radius zombies and animals will be alerted within. + + + + + If true, per-surface effects like blood splatter are created. + + + + + If true, explosion damage passes through Barricades and Structures. + + + + + Speed to launch players away from blast position. + + + + + Overrides how fall damage is calculated when landing on this game object or its descendants. + + + + + Could be extended in the future to increase, decrease, or set fall damage. + + + + + Potentially useful for an event to toggle the override. + + + + + Character will not take any fall damage. + + + + + Payload for the DamageTool.damageZombie function. + + + + + Should game mode config damage multiplier be factored in? + + + + + Equivalent to the "armor" parameter of the legacy damage function. + + + + + Defaults to 1. + + + + + If not null and damage is applied, is called with this position (startle: true). + + + + + If non-zero, NPC name is shown as ??? until bool flag is true. + + + + + This value is confusing because in the level editor it is the normalized radius, but in-game it is the square radius. + + + + + Returning an Asset rather than the older IDs allows GUIDs to be used. + legacyTargetAssetType is required for compatibility with spawn tables using legacy 16-bit IDs. If set to + None and the spawn asset uses legacy IDs a warning is logged explaining GUIDs are necessary. + + + + + + Doesn't support spawn assets with legacy 16-bit IDs. + + + + + For backwards compatibility with features that still need a legacy ID rather than asset. + + + + + For backwards compatibility with features that still need a legacy ID rather than asset. + + + + + For backwards compatibility with features that still need a legacy ID rather than asset. + + + + + If using a map or mods from the workshop, this class monitors them for changes so the server can be restarted. + + + + + Request status of workshop items. + + + + + Called the next tick after update(s) detected. + + + + + Called when a queried item's update timestamp is newer than our initially loaded version. + + + + + Called when results from a call to submitQueryRequest are available. + + + + + Called once timer reaches interval. + + + + + Were update(s) detected that should be handled on next tick? + + + + + Are we done monitoring? + Default finished once an update is detected. + + + + + Interval between query submissions. + + + + + Accumulated time before submitting query after passing interval. + + + + + Callback from Steam when results from a call to submitQueryRequest are available. + + + + + Slightly interpolated copy of actual spread angle to smooth out sharp changes like crouch/prone. + + + + + Allows interpolatedSpread to snap to target value when crosshair becomes visible. + + + + + Deserialize JSON onto an existing object instance. + + + + + Potentially useful for players with corrupted cloud storage. + https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/2756 + + + + + Introduced much later (2020) than most of the other methods in this class (2014) in order to properly handle + BOM/preamble of text files. Matches somewhat undesirable legacy behavior like creating directories. + + + + + NOTE: From and to are both relative to PATH. + + + + + Read GUI texture from a .jpg or .png file. + + + + + Read GUI texture from a .jpg or .png file. + + + + + Windows-specific extensions of console input. + Uses the Win32 API to force a console to be created and destroyed. + + + + + Called by navmesh baking to complete pending object changes that may affect which nav objects are enabled. + + + + + Hide culling volume by default because new mappers might wonder what these purple boxes + are and why their number goes away after moving objects. + + + + + Check a fixed number of volumes for visibility updates per frame. + + + + + Any volumes in the process of enabling/disabling get updated once per frame. + + + + + True for the next update after the player is teleported. + + + + + Associates items of the same currency, e.g. dollars or bullets. + + + + + Should this item/value be shown in the list of vendor currency items? + Useful to hide modded item stacks e.g. a stack of 100x $20 bills. + + + + + String to format value {0} into. + + + + + String to format value {0} of total {1} into if not otherwise specified in NPC condition. + + + + + Sum up value of each currency item in player's inventory. + + + + + Does player have access to items covering certain value? + + + + + Add items to player's inventory to reward value. + + + + + Remove items from player's inventory to pay required value. + + + + + Sort currency entries by value. + + + + + Temporary replacement for static block member because plugins might depend on it. + + + + + Parses fv:X from input string and loads X.txt from game folder. + + + + + Called after lod bias may have changed. + + + + + Can be added to any GameObject with an interactable binary state in its parents. + + If players should not be allowed to interact with the object in the ordinary manner, + add the Interactability_Remote flag to its asset to indicate only mod hooks should control it. + + + + + When a state change is requested in singleplayer it should be treated as if running as a client on a server. + This is the default to match behavior from before this option was added. + + + + + When a state change is requested in singleplayer it should be treated as if running as a dedicated server. + + + + + Invoked when interactable object enters the Used / On / Enabled state. + + + + + Invoked when interactable object enters the Unused / Off / Disabled state. + + + + + Should the OnStateEnabled and OnStateDisabled events be invoked when the object is loaded, becomes relevant + in multiplayer, and is reset? True is useful when visuals need to be kept in sync with the state, whereas + false is useful for transient interactions. + + + + + Controls how state change requests are performed when running as both client and server ("listen server"). + On the dedicated server, requesting a state change overrides the current state without processing NPC + conditions, whereas when a client requests a state change NPC conditions apply. This option fixes the + inconsistency in singleplayer of whether to treat as server or client. (public issue #4298) + At the time of writing (2024-01-29) listen server only applies to singleplayer. + + + + + Set state to Enabled if currently Disabled. + + On dedicated server this directly changes the state, + but as client this will apply the usual conditions and rewards. + + + + + Set state to Disabled if currently Enabled. + + On dedicated server this directly changes the state, + but as client this will apply the usual conditions and rewards. + + + + + Toggle between the Enabled and Disabled states. + + On dedicated server this directly changes the state, + but as client this will apply the usual conditions and rewards. + + + + + Tests whether current or recent history contains point. + + + + + Half second history at 50 tickrate. + + + + + Not originally supported by networking. Added temporarily during netpak rewrite because the quaternion + compression is so much better for vehicles than three byte Euler rotation. + + + + + Gets barricades both attached to vehicles and not attached to vehicles. + + + + + Nelson 2025-04-08: thank goodness that this didn't use the temperature system! (For some reason?) Makes it + relatively straightforward to convert campfires and ovens to Crafting Tags, and means vanilla has a test + case for the mod hook, too. (This method tests for CraftingHeatTag in radius.) + + + + + Index into Blueprints list. -1 means blueprint name is used instead. + + + + + Name to look for in Blueprints list. + + + + + Other menus can modify DevkitSelectionToolOptions so we need to sync our menu when opened. + + + + + Thanks to Glenn Fiedler for this RK4 implementation article: + https://gafferongames.com/post/integration_basics/ + + + + + Higher values return to the target position faster. + + + + + Higher values reduce bounciness and settle at the target position faster. + e.g. a value of zero will bounce back and forth for a long time (indefinitely?) + + + + + Should objects that failed to load due to missing assets be saved? + If true, a placeholder transform is created and used to save. + If false, objects without assets are zeroed during save. (old default) + + + + + Hash of Objects.dat + + + + + Called by navmesh baking to complete pending object changes that may affect which nav objects are enabled. + + + + + Stagger regional visibility across multiple frames. + + + + + Caches uint16 ID to ID redirects. + + + + Matches handle returned by request, or -1 if cached. + + + + Revive all trees in a specific region. + + + + + Revive trees worldwide. Used between arena rounds. + + + + + Material instantiated when dual-render scopes are enabled. + Overrides the material of the gun sight attachment. + + + + + Unintuitively (to say the least), a pitch of 0 is up, 90 is forward, and 180 is down. + + + + + Nelson 2025-06-27: previously, stopping aim cancelled the sway offset immediately. When + experimenting with removing the dual-render scope blur this felt jarring. + + + + + Reset to actual fov when first used. + + + + + If true, freecam controls take input priority. + Previously named isOrbiting. + + + + + Should player stats be visible in spectator mode? + + + + + Smoothing adds some initial blend-in which felt nicer for explosion rumble. + + + + + Slightly clamped third-person version of "eyes" value to prevent sweep from hitting floor. + + + + + Get point-of-view in world-space. + + + + + Get point of view in worldspace without the left/right leaning modifier. + + + + + This is only used after capturing dual-render scope, not when exiting scope overlay. + Otherwise the lighting vision may have changed between entering and exiting the scope. + + + + + Clamp _pitch within the [0, 180] range. + + + + + Clamp yaw while seated, and keep within the [-360, 360] range. + + + + + Can spectating be used without admin powers? + Plugins can enable spectator mode. + + + + + Can workzone be used without admin powers? + Plugins can enable workzone permissions. + + + + + Can spectator overlays be used without admin powers? + Plugins can enable specstats permissions. + + + + + Called from the server to allow spectating without admin powers. + Only used by plugins. + + + + + Allow use of spectator mode without admin powers. + Only used by plugins. + + + + + Called from the server to allow workzone without admin powers. + Only used by plugins. + + + + + Allow use of workzone mode without admin powers. + Only used by plugins. + + + + + Called from the server to allow spectator overlays without admin powers. + Only used by plugins. + + + + + Allow use of spectator overlay mode without admin powers. + Only used by plugins. + + + + + Multiple hits are necessary because the first returned hit is not always the closest. + + + + + Sweep a sphere to find collisions blocking the third-person camera. + + Valid world-space camera position. + + + + Replacement for enum origin. + + + + + Hardcoded built-in name, or name of workshop file if known. + + + + + Steam file ID if loaded from the workshop, zero otherwise. + + + + + If true, when added to asset mapping the new assets will override existing ones. + This ensures workshop files installed by servers take priority and disables warnings about overlapping IDs. + + + + + If true, we can re-save .dat/.asset files from this origin. + Defaults to false. Only true for assets in the game install folder. + + + + + Can be added to any GameObject to receive text chat events. + + + + + Message can be in any chat channel. + + + + + Message must be in Global channel. + + + + + Message must be in Local channel. + + + + + Filter to apply to message type. + + + + + Sphere radius (squared) around this transform to detect player messages. + e.g. 16 is 4 meters + + + + + Substring to search for in message. + + + + + Message must start with phrase text. + + + + + Message must contain phrase text. + + + + + Message must end with phrase text. + + + + + Filter to apply to message text. + + + + + Invoked when a player message passes the filters. + + + + + Calculate angle in radians the player would need to offset their aim upward + to hit a target a certain distance away. + + + + + Separate from isEnabled to hide markers when they are outside the scope. + + + + + Used to sync hasLabel visibility. + + + + + True while fading in or fully transitioned in. + + + + + True while fading in, but not at full intensity. + + + + + True while finished fading in. + + + + + True while fading out, but not at zero intensity. + + + + + True while finished fading out. + + + + + True while fading in or out. + + + + Matches handle returned by request, or -1 if cached. + + + + Read commands from standard input, and write logs to standard output. + + + + + Each Update we consume a key press from the console buffer if available. + Unfortunately ReadLine is not an option without blocking output, so we maintain our own pending input. + + + + + Entry in the MenuPlayServerBookmarksUI list. + + + + + Null token. + + + + + Text between tags. + + + + + [b] + + + + + [/b] + + + + + [i] + + + + + [/i] + + + + + [list] + + + + + [/list] + + + + + [olist] + + + + + [/olist] + + + + + [*] value + Nelson 2025-07-02: manually written lists typically don't have a ListItemClose token. + + + + + [/*] + Nelson 2025-07-02: Steam's new visual editor adds closing tokens to list items, but + manually-written list items typically don't have them. + + + + + [h1] + + + + + [/h1] + + + + + [h2] + + + + + [/h2] + + + + + [h3] + + + + + [/h3] + + + + + [url=value] + + + + + [/url] + + + + + [img] + + + + + [/img] + + + + + [previewyoutube=value] + + + + + [/previewyoutube] + + + + + '\n' or "\r\n" + + + + + [quote=value] (value is author) + + + + + [/quote] + + + + + [p] + + + + + [/p] + + + + + [u] + + + + + [/u] + + + + + Steam's new visual editor quotes value in [url=x] tag. If value is not quoted, this method returns as-is. + If it IS quoted, this methods returns without quotation marks. + + + + + Breaks down Steam's version of BBcode into tokens like, "[b]", "[i]", "actual text", etc. + + + + + If true, parse newlines in the input as LineBreak tokens. (default true) + If false, exclude LineBreak tokens from output. + Steam's new visual editor doesn't emit newlines, instead inferring line breaks from paragraph blocks. To + make life easier we will do the same for the main menu announcement feed. + + + + + Reset to -1 when not chatting. If player presses up/down we get index 0 (most recent). + + + + + Fill chat field with previous sent message. + Useful for repeating commands with minor changes. + + + + + Use the latest hotbar items in the UI. + + + + + Icon uploaded to CDN. + + + + + Icon used in game menus. + + + + + Project-relative asset importer version of + + + + + Icon saved for community members in Extras folder. + + + + + Has the small icon been captured yet? + + + + + Has the large icon been captured yet? + + + + + Moved icon code from MenuTitleUI to here. + + + + + These directories are excluded from source control and Steam depots so they might not exist yet. + + + + + If updating this method please remember to update the support article: + https://support.smartlydressedgames.com/hc/en-us/articles/13452208765716 + + + + + Does name contain rich text tags? + Some players were abusing rich text enabled servers by inserting admin colors into their steam name. + + + + + Used when damaging zombies to override in which situations they are stunned. + + + + + Default stun behaviour determined by damage dealt. + + + + + Don't stun even if damage is over threshold. + + + + + Stun regardless of damage. + + + + + Overrides hat item from zombie table with a specific item ID. + + + + + Overrides gear item from zombie table with a specific item ID. + + + + + If zombie is stuck this was a nearby barricade potentially blocking our path. + + + + + If zombie is stuck this was a nearby structure potentially blocking our path. + + + + + If zombie is stuck this was a nearby vehicle potentially blocking our path. + + + + + If target player is passenger in a vehicle this is their vehicle. + + + + + If zombie is stuck this was a nearby object potentially blocking our path. + + + + + Incremented while stuck. Prevents doing overlap test too frequently. + + + + + Add or remove from ticking list if needed. + Separated from updateTicking in order to move once after first spawn. + + + + + Boss zombies are considered mega as well. + + + + + Yeah it seems kinda ugly to pollute all zombies with this code... zombie rewrite eventually please. + + + + + If damage exceeds this value, stun the zombie. + + + + + Used to kill night-only zombies at dawn. + + + + + Cache difficulty asset (if any) for this zombie's current type and bound. + Allows difficulty assets to override certain zombie behaviors. + Called after bound/type is initialized, and after type changes during respawn. + + + + + Called when zombie does not have a target, but has been stuck for a period. + + + + + Reduces frequency of UndergroundAllowlist checks because it can be expensive with lots of entities and volumes. + + + + + Helper to prevent mistakes or plugins from breaking alive zombie count. + + + + + Helper to prevent mistakes or plugins from breaking alive boss zombie count. + + + + + 2023-01-31: set height to 2 rather than adjusting per-zombie-type. Tall zombies (megas) couldn't + get through doorways, and short zombies (crawlers) could get underneath objects they shouldn't + like gas tanks. Zombies were also stacking on top of eachother a bit too much. + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + Ideally in a future rewrite asset overload will become the default rather than the overload taking legacy ID. + + + + + If true, item has 100% quality. If false, item has a random quality. + + + + + Get animal or player damage based on game mode config. + + + + + Get zombie or player damage based on game mode config. + + + + + Allows Unity events to spawn barricades. + + + + + Distance along tree's local up axis to offset debris spawn position. Defaults to 1.0. + + + + + Before had randomization properties (which trees don't currently use + as of 2024-12-11 because rotation/scale aren't saved) each tree has some random rotation and scale variation + based on its position. This property controls the rotation away from upright. + + + + + Amount of experience to reward foraging player. + + + + + Forageable resource message. + + + + + Weapon must have matching blade ID to damage tree. + Both weapons and trees default to zero so they can be damaged by default. + + + + + If true, prevent collisions between falling tree and the stump. (i.e., debris can fall through stump) + Defaults to true. + + + + + Only activated during this holiday. + + + + + Tree to use during the Christmas event instead. + + + + + Tree to use during the Halloween event instead. + + + + + Get asset ref to replace this one for holiday, or null if it should not be redirected. + + + + + Essentially deprecated for now. + + + + + Server response to a non-rejected CONNECT request. Notifies client they are in the queue. + + + + + Rather than creating all SleekItems as once we create a few per frame. + + + + + Reset all items hotkey label. + + + + + Kept because lots of modders have been using this script in Unity, + so removing legacy effect id would break their content. + + + + + Find an item to apply stat tracker tool to. + + + + + Find an item with a stat tracker to remove. + + + + + Find an item with a ragdoll effect to remove. + + + + + Find an item to apply ragdoll effect tool to. + + + + + Toggle button to open/close advanced filters panel. + + + + + On/off checkbox for including description text in filter. + + + + + Switch between sort modes. + + + + + On/off checkbox to reverse sort results. + + + + + On/off checkbox to show only equipped items. + + + + + Container for advanced options. + + + + + Whether to include description text in filter. + + + + + How to sort filtered items. + + + + + Should sorted list be reversed? + + + + + Should only equipped items be shown? + + + + + Remove items that do not match search text. + + + + + Removed items that are not equipped. + + + + + All main menu MTX shop code should be routed through here so that it could theoretically be ported to other + platforms or stores. Obviously this is all very Steam specific at the moment, but at least the UI does not + depend on Steam API here as much as older parts of the game. + + + + + Was this item marked as new in the config? + If new, and not marked as seen, then a "NEW" label is shown on the listing. + + + + + Do we have pricing details for a given item? + Price results may not have been returned yet, or item might not be public. + + + + + Messy, but we only show a menu alert if there was a problem. + + + + + Already filtered to only return locally known items which pass country restrictions. + + + + + Empty if outside new time window. + + + + + Subset of listings. + + + + + Subset of listings. + + + + + Subset of listings. + + + + + Subset of listings. + + + + + Subset of listings. + + + + + May be out of date by one frame. + + + + + Currently used by vehicles to deactivate some rendering features when outside rendering distance. + Uses "frozen" position if applicable, otherwise the camera position from the most recent Update. This means + it could be out-of-date, but for LOD purposes it should be "good enough." + + + + + Reset prior to joining a new server. + + + + + By default if the client submits an asset guid which the server cannot find an asset for the client will + be kicked. This is necessary to prevent cheaters from spamming huge numbers of random guids. In certain cases + like a terrain material missing the server knows the client will be missing it as well, and can register + it here to prevent the client from being kicked unnecessarily. + + + + + Send asset hash (or lack thereof) to server. + + IMPORTANT: should only be called in cases where the server has verified the asset exists by loading it, + otherwise only if the asset exists on the client. This is because the server kicks if the asset does not + exist in order to prevent hacked clients from spamming requests. Context parameter is intended to help + narrow down cases where this rule is being broken. + + + + + Send asset hash to server. + Used in cases where server does not verify asset exists. (see other method's comment) + + + + + Called each Update on the client. + + + + + Called from the server to override salvage duration. + Only used by plugins. + + + + + Override salvage duration without admin. + Only used by plugins. + + + + + Outlined object is not necessarily the focused object, so we track it to disable later if focus is destroyed. + + + + + Search up hierarchy for most specific Target transform. + + + + + Was focus non-null during last update? Used to detect when focus was destroyed. + + + + + Currently used by plugins to identify what damaged a buildable. + + + + + Explosion instigated by . + + + + + Should only be used by . + For example: "Condition_##" where ## is an index. + + + + + If >0 the game will start a coroutine to grant the reward after waiting. + + + + + If true and player has this reward pending when they die or disconnect it will be granted. + + + + + Intended to replace filling data from constructor. + + + + + Intended to replace filling data from constructor. Legacy is for backwards compatibility with Reward_#_Key + format, whereas V2 uses the list and dictionary features. + + + + + Used in a test scene to quickly test UI Toolkit implementation. + + + + + Assigned when a named preset is created. + 0 is the default and should be replaced by a preset when loaded. + -1 indicates the preset was modified. + -2 and below are the default presets. + + + + + Nelson 2024-09-20: Changing default to any (from has players) because the default server list sort will now + push empty servers to the bottom. + + + + + If true, only servers with available player slots are shown. + Nelson 2024-09-20: Changing default to false because the default server list sort will now push them down + from the top a little bit. + + + + + If >0, servers with ping higher than this will not be shown. + + + + True if level was added to the list of maps. + + + + Version before named version constants were introduced. (2023-11-13) + + + + + % Full + + + + + Note: this can be different from status.blueprint after status refreshes because status is pooled. + + + + + Update the title box describing the "most important" item: item to repair, salvage, craft, etc. + + + + + The dialogue to go to when a message has no available responses. + If this is not specified the previous dialogue is used as a default. + + + + + For level objects with QuestCondition called when quests are added or removed. + + + + + Event specifically for plugins to listen to global quest progress. + + + + + Event for plugins when group or rank changes. + + + + + Overrides label text next to marker on map. + Used by plugins. Not saved to disk. + + + + + Kept serverside. Used to check whether the player is currently in their Steam group or just a normal in-game group. + + + + + Check before allowing changes to this player's + + + + + Can rename the group. + + + + + Can promote and demote members. + + + + + If set, default spawn logic will check for a location node or spawnpoint node matching name. + Saved and loaded between sessions. + + + + + If true, hide viewmodel and prevent using equipped item. For example, to prevent shooting gun on top of a + first-person scene. This could be expanded in the future with other flags and options. + + + + + Called serverside to set marker on clients. + + + + + Ask server to set marker. + + + + + Call serverside to replicate new rank to clients + + + + + Set player's group to their Steam group (if any) without testing restrictions. + + + + Ignores group changing rules when true. + + + + Serverside send packet telling player about this invite + + + + + Called on server to finalize and remove quest. + + + + + Called by quest details UI to request server to abandon quest. + + + + + Called when there are no responses to choose, but server has indicated a next dialogue is available. + + + + + Called in singleplayer and on the server after client requests NPC dialogue. + + + + + Prevent re-creating it during destroy (e.g. plugin granting rewards) from leaking gameobject. + + + + + White 1x1 texture for solid colored images. + uGUI empty image draws like this, but we need the texture for IMGUI backwards compatibility. + + + + + Is the server this widget represents currently favorited? + Can be false on the favorites list. + + + + + Payload for the DamageTool.damagePlayer function. + + + + + Should armor worn on matching limb be factored in? + + + + + Should game mode config damage multiplier be factored in? + + + + + If player dies should it count towards quests? + + + + + Effect to apply to ragdoll if dead. + + + + + Read 8-bit per channel color excluding alpha. + + + + + Intended as a drop-in replacement for existing assets with property uint16s. + + + + + Is a point safely within the level bounds? + Also checks player clip volumes if legacy borders are disabled. + + + + + Is given Y (vertical) coordinate within level's height range? + Maps using landscapes have a larger range than older maps. + + + + + Notify menus that levels list has changed. + Used when creating/deleting levels, as well as following workshop changes. + + + + + Get level's cached asset, if any. + + + + + Should loading code proceed with redirects? + Disabled by level and when in the editor. + + + + + Placeholder created between unloading the main menu and loading into game or editor. + + + + + Loading screen music. + + + + + Clip to play to fade out loop. + + + + + Useful to narrow down why a player is getting kicked for modified level files when joining a server. + + + + + Display version string of the currently loaded level. + + + + + Version string of the currently loaded level packed into an integer. + + + + + Refreshes known levels and attempts to redirect level reference if it no longer exists. + + + + + Find level matching both name AND workshop file ID (can be zero). + + + + + Load level details from Level.dat in directory path. + + + + + Server list allows player to enter a map name when searching, so we try to find a local + copy of the level for version number comparison. (Server map version might differ.) + + + + + New map filter uses lowercase map name and doesn't need startswith. + + + + + Search all map folders to add any previously unregistered maps. + + + + + Temporary to unbind events because this class is static for now. (sigh) + + + + + Defines how instance methods handle invocation when the target instance does not exist yet, for example + if the target instance is async loading or has time sliced instantiation. + + + + + Invocation should be ignored if the target instance does not exist. + This is the only applicable defer mode for static methods and server methods. + + + + + Invocation will be queued up if the target instance does not exist. + Originally an "Overwrite" mode was considered for cases like SetHealth where only the newest value is + displayed, but this was potentially error-prone if multiple queued methods depended on values from each other. + + + + + Allows Unity events to execute commands from the server. + Messenger context is logged to help track down abusive assets. + + + + + Responsible for loading asset definitions on a separate thread. + + + + + Parser error messages, if any. + + + + + Warning: on worker thread this only acts as handle. Do not access. + + + + + Used on main thread to determine when all queued tasks have finished. + + + + + Loop searching directories recursively for asset bundle and asset definition files. + + + + + Warning: on worker thread this only acts as handle. Do not access. + + + + + Absolute path to *.log file. + + + + + Responsible for the per-process .log file in the Logs directory. + Kept multiple log files in the past, but now consolidates all information + into a single file named Client.log or Server_{Identifier}.log. + + + + + Should setup of the default *.log file be disabled? + + + + + If true, information like IP addresses and login tokens should be censored in vanilla logs. + Nelson 2024-11-11: Special thanks to Jdance and asineth0 in public issue #4740! + + + + + Text to replace with if is enabled. + + + + + *ATTEMPTS* to replace IPv4 address(es) with . + Should only be called if is enabled. + Case-by-case redaction should be preferred for performance reasons over using this function. This function + is intended for third-party messages (e.g., BattlEye) that we don't have control over. + + True if message was modified. + + + + Get logging to path. + + + + + Set path to log to. + + + + + Close current log file. + + + + + Invoked when door is opened/closed, but not when loaded. + + + + + Switches between "legacy" (per-level road textures bundle) and "assets" (using RoadAsset). + + + + + If modifying usage please update support article: + https://support.smartlydressedgames.com/hc/en-us/articles/13452208765716 + + + + + If modifying usage please update support article: + https://support.smartlydressedgames.com/hc/en-us/articles/13452208765716 + + + + + Client has a critical module the server doesn't. + + + + + Server has a critical module the client doesn't. + + + + + Level config's version number does not match. + + + + + EconInfo.json hash does not match. + + + + + Master bundle hashes do not match. + + + + + Server has not received an auth session response from Steam yet. + + + + + Server has not received an economy response from Steam yet. + + + + + Server has not received a groups response from Steam yet. + + + + + Player nickname exceeds limit. + + + + + Player nickname contains invalid characters. + + If modifying usage please update support article: + https://support.smartlydressedgames.com/hc/en-us/articles/13452208765716 + + + + + Player nickname should not be a number. + + + + + Player resources folders don't match. + + + + + The network identity in the ticket does not match the server authenticating the ticket. + This can happen if server's Steam ID has changed from what the client thinks it is. + For example, joining a stale entry in the server list. (public issue #4101) + + + + + Player's skin color is too similar to one of . + + + + + Steam ID reported by net transport doesn't match client's reported Steam ID. + This was exploited to fill the server queue with fake players. + + + + + Received too many connection requests from player in a short window. + + + + + Received too many invalid messages from connection in a short window. + + + + + Server limits how many clients are joining from the same IP address. + (public issue #5001) + + + + + Zero is treated as unset. + + + + + Returned asset is not necessarily a vehicle asset yet: It can also be a VehicleRedirectorAsset which the + vehicle spawner requires to properly set paint color. + + + + + Kept because lots of modders have been using this script in Unity, + so removing legacy effect id would break their content. + + + + + Matches level with same file name AND workshop file ID. + + + + + Version before named version constants were introduced. (2023-11-08) + + + + + Moved into ServerListFilters. + + + + + Exposed for plugins. Can be null. Please do not modify. + + + + + This overload supports legacy Condition_# format. + + + + + This overload doesn't support legacy Condition_# format. + + + + + If true, button tooltip will be overridden with tooltip from states array. + + + + + If true oxygen is restored while in this volume, otherwise if false oxygen is depleted. + + + + + Merges textures used in the level into an atlas to assist runtime draw call batching. + + + + + Skip renderer children of these transforms, if any. + For example we skip lights with material instances and rubble debris. + + + + + Most objects in Unturned use the standard shader without transparency/emissive/detail/etc. + + + + + Meshes we logged an explanation for as to why they can't be atlased. + + + + + Textures we logged an explanation for as to why they can't be atlased. + + + + + Materials we logged an explanation for as to why they can't be atlased. + + + + + Objects instantiated for the lifetime of the level that should be destroyed when exiting the level. + + + + + If true, don't assign texture atlas to material so batched materials are obvious. + + + + + If true, assign a red material to excluded meshes so they are obvious. + + + + + If true, replace each unique material with a colored one before static batching. + + + + + If true, log why texture/material can't be included in atlas. + + + + + If true, log if mesh has UVs outside [0, 1] range. + + + + + We generate a 1x1 texture for materials without one. + + + + + Tracks which mesh filters and skinned mesh renderers were referencing a given mesh. + + + + + Tracks which meshes and materials were referencing a given texture. + + + + + If true, UVs should be centered and overridden because original mesh was not textured. + + + + + Maps original mesh to any mesh filters using it. + When mesh's UVs are modified the mesh filters need to be pointed at the copied mesh. + + + + + Renderers with a material using the texture. + After combining texture the renderers need to be pointed at the combined material. + + + + + Tracks which textures were referencing a given shader. + + + + + StaticBatchingUtility.Combine requires input renderers are enabled and active in hierarchy, + so we temporarily activate/enable them to keep this logic out of LevelObject/ResourceSpawnpoint. + + + + + Payload for the DamageTool.damageAnimal function. + + + + + Should game mode config damage multiplier be factored in? + + + + + If not null and damage is applied, is called with this position. + + + + + Can be added to EquipablePrefab item GameObject to receive events. + + + + + Invoked when item begins inspect animation. + + + + + Entry in the MenuPlayServerCurationUI list. + + + + + In-game rich text does not support embedded YouTube videos, but they look great in the web browser, + so we simply remove them from the in-game text. + + + + + Unfortunately in-game rich text does not have code formatting yet, so remove the tags while preserving text. + + + + + Nelson 2025-01-28: This command reproduces a bug destroying the player gameObject if the vehicle is + destroyed on the same frame as the request to enter. + https://github.com/SmartlyDressedGames/Unturned-3.x-Community/issues/4760#issuecomment-2613090165 + + + + + Not using rate limit attribute because this is potentially called for hundreds of barricades at once, + and only admins will actually be allowed to apply the transform. + + + + + Only used by plugins. + + + + + See BarricadeRegion.FindBarricadeByRootFast comment. + + + + + For code which does not know whether transform exists and/or even is a barricade. + See BarricadeRegion.FindBarricadeByRootFast comment. + + + + + Does this label fade out as the chat message gets older? + + + + + Chat message values to show. + + + + + Tree activation is time-sliced, so this does not necessarily match whether the region is active. + + + + + Can this tree be damaged? + Allows holiday restrictions to be taken into account. (Otherwise holiday trees could be destroyed out of season.) + + + + + Some new code common to SteamPending and SteamPlayer. + + + + + Realtime the first ping request was received. + + + + + Number of ping requests the server has received from this client. + + + + + Called when a ping request is received from this client. + + + + + Realtime passed since the first ping request was received from this client. + + + + + Average number of ping requests received from this client per second. + Begins tracking 10 seconds after the first ping request was received, or -1 if average is unknown yet. + + + + + Only set on server. Associates player with their connection. + + + + + Used when kicking player in queue to log what backend system might be failing. + + + + + Number of alive zombies. + + + + + Last time a quest boss was spawned. + + + + + Allow another quest to spawn a boss zombie immediately. + + + + + Kills the boss zombie if nobody is around, if the boss was killed it calls UpdateBoss. + + + + + Checks for players in the area with quests and spawns boss zombies accordingly. + + + + + HUD with projected labels for teammates. + + + + + Allows map makers to create custom weather events. + + + + + Does this weather affect fog color and density? + + + + + Does this weather affect sky fog color? + + + + + Does this weather affect cloud colors? + + + + + Directional light shadow strength multiplier. + + + + + Exponent applied to effect blend alpha. + + + + + Exponent applied to effect blend alpha. + + + + + SpeedTree wind strength for blizzard. Should be removed? + + + + + If specified level editor color can be used rather than a per-asset color. + + + + + Remove any existing item alert widgets. + + + + + Open fullscreen alert showcasing newly granted items. + Uses first item for title color, so items should be sorted by priority. + + + + + Open fullscreen alert showcasing newly granted items. + + + + + Handle esc/back key press. + Still really messy, but this used to be inside a huge nested if/elseif in Update. + + + + + Despite being newer code, this is obviously not ideal. Previously the news request was using the Steam HTTP + API which might have been the cause of some crashes, so it was quickly converted to Unity web request instead. + + + + + Invoked when web item is first loaded or reloaded. + + + + + If false this structure cannot take damage. + + + + + Modded structures can disable pooling if they have custom incompatible logic. + + + + + Length of raycast downward from pivot to check floor is above terrain. + Vanilla floors can be placed a maximum of 10 meters above terrain. + + + + + Optional alternative structure prefab specifically for the client preview spawned. + + + + + Called on the dedicated server to optimize client prefab for server usage. + + + + + Compares weather intensity to value. + + + + + Called during startup and when returning to the main menu. + + + + + Result is never null, but may be empty or out-of-date. + + + + + Can be added to Vehicle GameObject to receive events. + + + + + Invoked when any player enters the driver seat. + + + + + Invoked when any player exits the driver seat. + + + + + Invoked when a locally controlled player enters the driver seat. + + + + + Invoked when a locally controlled player exits the driver seat. + + + + + Invoked when a locally controlled player enters the vehicle. + + + + + Invoked when a locally controlled player exits the vehicle. + + + + + Invoked when lock is engaged. + + + + + Invoked when lock is disengaged. + + + + + Invoked when horn is played. + + + + + Invoked after explosion plays. + + + + + Root transform. + + + + + Hit collider's transform. Can be null. + + + + + Tag display name without rich text formatting. To use, for example, in logging, sorting, or with rich color override. + + + + + If true, tag requests name to be displayed in UI with NameColor label color override. + + + + + Color to use in UI when displaying name. + + + + + If HasNameColor is enabled, this is PlainTextName wrapped with NameColor rich text color tags. + If unset, falls back to PlainTextName. + + Nelson 2025-05-02: initially, we allowed enabling any rich text tags in names. But, considering that we + are also using PlainTextName for other color overrides (e.g. "bad" when missing), this will be disappointing + if tags are displayed inconsistently. + + + + + If true, icon should be tinted according to player's foreground color preference. + + + + + Wrap PlainTextName with color rich text tag. + + + + + Wrap PlainTextName with player's font color preference. + + + + + If HasNameColor, get RichTextName. Otherwise, get PlainTextNameWithPreferredFontColor. + + + + + Get sleek color for UI. If HasNameColor, get NameColor. Otherwise, preferred font color. + + + + + Allows Unity events to modify which crafting tags are provided by owning object. + Must be connected to a Crafting Tag Provider. + + + + + GUIDs of Unturned tag assets to modify. + + + + + Add listed tags to provided tags. + + + + + Remove listed tags from provided tags. + + + + + Apply only if this component is active and enabled. + + + + + Apply only if this component is inactive and/or disabled. + + + + + Always apply. + + + + + Get wrapper method rather than Awake because component might be inactive but should still apply modifiers. + + + + + Used for item placement in displays / holsters, and whether useable can be placed in primary/secondary slot. + + + + + Cannot be placed in primary nor secondary slots, but can be equipped from bag. + + + + + Can be placed in primary slot, but cannot be equipped in secondary or bag. + + + + + Can be placed in primary or secondary slot, but cannot be equipped from bag. + + + + + Only used by NPCs. + + + + + Can be placed in primary, secondary, or equipped while in bag. + + + + + Project current field of view onto screen compared to desired field of view. + + + + + Multiply sensitivity according to scope/optic zoom. For example an 8x zoom has 1/8th sensitivity. + + + + + Preserve how sensitivity felt prior to 3.22.8.0 update. + + + + + Do not adjust sensitivity while aiming. + + + + + When held the cursor is released. + + + + + If held while clicking a blueprint action in the item context menu, the crafting menu is bypassed. + + + + + Replace instances of with their bound key text. + Allows server effects to display plugin hotkeys. + + + + + Item 0 is "1" and item 9 is "0" + + + + + Multiplier for Input.GetAxis("mouse_x") and Input.GetAxis("mouse_y") + + + + + When held the cursor is released. + + + + + If held while clicking a blueprint action in the item context menu, the crafting menu is bypassed. + + + + + Broadcasts once all workshop assets are finished installing. + + + + + Called once the server is done registering items it wants to install. + + True when running in offline-only mode. + + + + Request for details about the pending items. + + + + + File IDs of all the items we have enqueued for query. + + + + + Built from user-specified workshop item IDs, and then expanded as the query results + arrive with details about any dependent or child items. + + + + + File IDs requested by the latest query submitted. + + + + + Number of times we've tried re-submitted failed queries. + + + + + Built as the valid list of items arrive. + + + + + ID of the latest item we requested for download so that we can test if the callback is for us. + + + + + Enqueue an item if we have not queried it yet. This guards against querying an item + that is in two separate collections leading to duplicates. + + + + True if item was installed from cache. + + + + Used in offline-only mode. + + + + + Prepare a query that will request metadata for all the workshop items we want to install. + This allows us to check if the items are allowed to be auto-downloaded to this server, and to + detect any child or dependent items. + + Waits for onQueryCompleted. + + + + + Re-submit previous query after a query failure. + + + + + If level is using underground whitelist then conditionally clamp world-space position. + + + + + If level is using underground allowlist then conditionally clamp world-space position. + + + + + Used by animals and zombies to teleport to a spawnpoint if outside the map. + + + + + Used by housing validation to check item isn't placed underground. + + + + + Almost every menu has a container element for its contents which spans the entire screen. This element is then + animated into and out of view. In the IMGUI implementation this was fine because containers off-screen were not + processed, but with uGUI they were still considered active. To solve the uGUI performance overhead this class + was introduced to disable visibility after animating out of view. + + + + + Payload for the EffectManager.triggerEffect method. + + + + + Required effect to spawn. + + + + + World-space position to spawn at. + + + + + Local-space scale. Defaults to one. + + + + + If running as server should this effect be replicated to clients? + Defaults to true. Set to false for code that is called on client AND server. + + + + + Should the RPC be called in reliable mode? Unreliable effects might not be received. + + + + + Was a player directly responsible for triggering this effect? + For example grenade explosions are instigated by players, whereas zombie acid explosions are not. + Used to prevent mod damage on the effect prefab from hurting players on PvE servers. + + + + + Players within this radius will be sent the effect unless the effect overrides it. + Defaults to 128. + + + + + Get world-space rotation for the effect. + + + + + Set world-space rotation for the effect. + + + + + World-space rotation for the effect. + + + + + If true, rotation was specified by setter methods. + Required for backwards compatibility because `direction` field is public. + + + + + Only send the effect to the given player, if set. + + + + + Only send the effect to the given players, if set. + Otherwise relevantDistance is used. + + + + + Only send the effect to the given player, if set. + + + + + World-space direction to orient the Z axis along. Defaults to up. + + + + + Nelson 2025-04-08: newer code should probably use CachingAssetRef instead. (Or CachingLegacyAssetRef if legacy + ID support is necessary.) + + + + + Whether the asset has been assigned. Note that this doesn't mean an asset with exists. + + + + + Is this asset not assigned? + + + + + True if resolving this asset reference would get that asset. + + + + + Resolve reference with asset manager. + + + + + GUID of the asset this is referring to. + + + + + Each quality tier has different rarities. + Legendary: 5% Epic: 20% Rare: 75% + + + + + Each item has an equal chance regardless of quality. + + + + + Kept because lots of modders have been these scripts in Unity, + so removing legacy effect id would break their content. + Note: unsure about this one because it is private and not serialized. + + + + + Sorts higher rarity items into the front of the list. + + + + + Set handles pivot point according to selection transform. + Doesn't apply if handle is currently being dragged. + + + + + If Unturned is loading this asset bundle from a Steam workshop file but the file ID does not match then + loading will be canceled. Prevents the asset bundle from being easily copied/stolen. + + + + + Same as ownerWorkshopFileId for cases where the asset bundle is allowed in multiple uploads. + + Uploading the same asset bundle multiple times is not ideal because the game doesn't handle + multiple of them with the same name well, and Unity logs an error if an asset bundle with the + same files is already loaded. That being said, the game doesn't handle dependencies between + workshop files well either (as of 2023-01-12), so this is perhaps the lesser of two evils. + + My understanding is that some mod creators license their work to multiple servers that upload + the files and this property will make it easier so it doesn't need to be re-exported multiple times. + + + + + Helpers on the dedicated server to optimize client prefabs for server usage. + + + + + Optimize client prefab for server usage. + + + + + If true, object is within a culling volume. + Name is old and not very specific, but not changing because it's public. + + + + + Transform created to preserve objects whose assets failed to load. + Separate from default transform to avoid messing with old behavior when transform is null. + + + + + If true, can be instantiated. Defaults to true. + Enables mappers to remove culling volumes embedded in objects if they're causing issues. + + + + + Can this object's rubble be damaged? + Allows holiday restrictions to be taken into account. (Otherwise holiday presents could be destroyed out of season.) + + + + + Object activation is time-sliced, so this does not necessarily match whether the region is active. + + + + + Defaults to true because most objects are not inside a culling volume. + + + + + Used by InteractableObjectBinaryState to indicate whether it wants navGameObject to be active. It's only + active if both IOBS and Rubble want it active. + + + + + Used by InteractableObjectRubble to indicate whether it wants navGameObject to be active. It's only + active if both IOBS and Rubble want it active. + + + + + Used if the object asset has weather blend alpha conditions. + + + + + Used if the object asset has weather status conditions. + + + + + Callback when an individual quest flag changes for the local player. + Refreshes visibility conditions if the flag was relevant to this object. + + + + + Separate from UpdateActiveAndRenderersEnabled so graphics settings can call it. + + + + + Assume renderers default to enabled. + + + + + Combine two existing 20-byte hashes. + + + + + Utility to hash a stream of bytes over several frames. + + + + + [0, 1] percentage progress through the stream. + + + + + Advance 1MB further into the stream. + + True if there is more data, false if complete. + + + + Get the computed hash after processing stream. + + + + + If true, visible in chart and satellite UIs. + + + + + Multiplier for explosive projectile damage. + + + + + Multiplier for explosive projectile's blast radius. + + + + + Multiplier for explosive projectile's initial force. + + + + + Should amount be filled to capacity when detached? + + + + + Nelson 2024-10-18: Moved to a constant because clients need this value for footsteps and they don't have the + character controller component. + + + + + Jump speed = sqrt(2 * jump height * gravity) + Jump height = (jump speed ^ 2) / (2 * gravity) + With 7 speed and 9.81 * 3 gravity = apex height of 1.66496772 + + + + + Note: Only UpdateCharacterControllerEnabled should modify whether controller is enabled. + (turning off and back on is fine though) + + + + + Valid while isRadiated. + + + + + Set according to volume or level global asset fallback. + + + + + Was set to true during teleport, and restored to false during the next movement tick. + + Server pauses movement when this is set until next client update that matches, + in order to prevent rubberbanding following a teleport. + + + + + Used instead of actual position to avoid revealing admins in "vanish" mode. + + + + + Flag for plugins to allow maintenance access underneath the map. + + + + + Get seat (if any), otherwise null. + + + + + Serverside force player to exit vehicle regardless of safe exit points. + + True if player was seated in vehicle. + + + + Dedicated server simulate while input queue is empty. + + + + + Dedicated server simulate driving input. + + + + + Client and dedicated server simulate walking input. + + + + + In the future this can probably replace checkGround for locally simulated character? + (Unturned only started using OnControllerColliderHit on 2023-01-31) + + 2023-02-28: be careful with .gameObject property because it returns .collider.gameObject + which can cause a null reference exception. (public issue #3726) + + + + + Examine a store listing with description text. + + + + + Only visible when cart is not empty. + + + + + Convert 32-bit version into 8-char string. + String is advertised on server list for clients to filter their local map version. + + + + + Parse 32-bit version from 8-char string. + String is advertised on server list for clients to filter their local map version. + + + + + These server relay variables redirect the client to another server when the menu opens + similar to how Steam sets the +connect string on game startup. Allows plugin to redirect + player to another server on the same network. + + + + If true the server is immediately joined, otherwise show server details beforehand. + + + + If player gets too far away from this storage while using it, should we close out? + False by default for trunk storage because player is inside vehicle. + Plugins needed to be able to set this to false for "virtual storage" plugins, + so we default to false and set to true if asset enables it. + + + + + Keep all the uGUI Canvas sort orders in the same place. + + + + + Manually created canvas in the Menu scene. + + + + + Devkit canvas in the Setup scene. + + + + + Dropdowns, drag-drop content, tab destinations, etc. + + + + + Devkit tooltips should be visible over all other devkit content. + + + + + uGUI glazier contains tooltips and cursor regardless of mode (e.g. devkit), so takes absolute priority. + + + + + Plugins were spawning canvases with high sort orders that showed over the loading screen, so as a hacky + workaround we put the uGUI loading screen on a higher sort order than normal glazier. + + + + + uGUI cursor needs to show above plugin canvas. + Unity exposes sort order as an int32, but it is actually an int16, so this value is slightly below the 32767 max. + + + + + Worst case scenario, maybe shotgun hit or fast spray SMG. + + + + + Tags how client expects server to use a raycast input. + For example, client may think they fired a gun while server thinks they dequipped the gun, + so tagging the input prevents the server from handling it as a punch instead. + + + + + Resulting transform.position immediately after movement.simulate was called. + + + + + Calls to UseableGun.tock per second. + + + + + Called for every input packet received allowing plugins to listen for a few special + keys they can display in chat/effect UIs. + + + + + Whether client is currently penalized for potentially using a lag switch. False positives are relatively + likely when client framerate hitches (e.g. loading dense region), so we only modify their stats (e.g. reduce + player damage) for a corresponding duration. + + + + + Server tracks history of this player's bounding box to assist with validating hits. + Some padding is added to reduce false positives sliding against walls (substep) and + player movement inside vehicles. + + + + + Get the hit result of a raycast on the server. Until a generic way to address net objects is implemented + this is how legacy features specify which player/animal/zombie/vehicle/etc they want to interact with. + + + + + Ideally simulation frame number would be signed, but there is a lot of code expecting unsigned. + + + + + Can be enabled in the unity inspector to test that discarding inputs recovers properly. + + + + + askInput is always called the same number of times per second because it's run from FixedUpdate, + but the spacing between calls can vary depending on network and whether client FPS is low. + + + + + If average askInput calls per second exceeds this, we either ignore their request or flat-out kick them. + + + + + If average askInput calls per second exceeds this we silently kick them. + + + + + Number of times askInput has been called by client. + Even with huge packet loss, we know that + + + + + Realtime that the first call to askInput was made by the client. + + + + + Realtime that the previous askInput kick test was performed. + + + + + Set rollingWindowIndex to newIndex, zeroing all input counts along the way. + Important to zero the intermediary indexes in-case server stalled for more than one second. + + + + + Notify client there has been a prediction error, so movement needs to be re-simulated. + + + + + Notify client old inputs can be discarded because they were predicted correctly. + + + + + Not using rate limit attribute because it internally keeps a rolling window limit. + + + + + Only bound on dedicated server. + When dieing in a vehicle this prevents delay handling packets. + + + + + Counter of simulation frames before fake lag penalty is disabled. + + + + + Player damage multiplier while under penalty for fake lag. (10%) + + + + + If set, this item is prioritized over equipped cosmetics. Used by item inspect menu. + Admittedly, this is very hacked-together. Hopefully rewriting this file someday? + + + + + Is cosmetic or skin equipped? + + + + + Merging the devkit, legacy, and housing transform handles into one place. + + + + + Position and plane handles for each axis. + + + + + Disc handles for each axis. + + + + + Scale handles for each axis. + + + + + Position handles on each side of box. + + + + + Scale handles on each side of box which both move and resize the box. + + + + + Invoked when handle is clicked so that tool can save selection transform relative to pivot. + This avoids floating point precision loss of applying delta for each Transformed event. + + + + + Invoked when handle is dragged and value actually changes. + + + + + Invoked when handle is dragged and value actually changes. + + + + + Preferred mode only takes effect while not dragging. + Bounds modes fall back to non-bounds modes if bounds are not set. + + + + + Pivot only takes effect while not dragging. This is to help ensure + the caller does not depend on the internal pivot values. + + + + + Somewhat hacky, useful to make the "copy-paste transform" feature easier to implement. + Invoke tranformed callback as if pivot were manually dragged to the new position and rotation. + + + + + Called before raycasting into the regular physics scene to give transform tool priority. + + + + + Update properties that depend on the transform of the camera relative to our handles. + + + + + Center of handle. + + + + + Rotation of handle. + + + + + True if pivotBounds is non-zero. + + + + + Mouse currently over this handle. + + + + + Mouse currently dragging this handle. + + + + + Direction from camera toward pivot. + + + + + Multiplier according to distance between camera and pivot to keep handles a constant on-screen size. + + + + + Multiplier to flip axis handles according to which side the camera is on. + + + + + Pivot rotation when rotation drag started. + + + + + Rotating around this axis. + + + + + Direction from circle center to edge point. + + + + + Point on the edge of the circle. + + + + + Drag along this tangent to the circle. + + + + + Does having this item show the compass? + + + + + Does having this item show the chart? + + + + + Does having this item show the satellite? + + + + + Ideally component Awake/Start order should not matter, but Unturned's menu is a mess. + For most players the default order was fine, but it seems it was not deterministic so it would break for some players. + + + + + Index into per-connection rate limiting array. + + + + + Number of server methods with rate limits. + + + + + Log all known net methods. + + + + + Useful debug check to ensure every built-in handle is claimed exactly once. + + + + + This class gets used from type initializers, so Unity's built-in log is not an option unfortunately. + + + + + Not *really* supported but *might* probably work. Adding for public discussion #4176. + + + + + Kept for backwards compatibility with plugins. + + + + + Can be added to EquipablePrefab item GameObject to receive events. + + + + + Invoked when gun is fired. + + + + + Invoked when gun begins reload sequence. + + + + + Invoked when gun begins hammer sequence. + + + + + Invoked when gun begins aiming. + + + + + Invoked when gun ends aiming. + + + + + Invoked when Magazine game object is activated. + + + + + Invoked when Magazine game object is activated. + + + + + TextMesh Pro uGUI text components. + + + + + TextMesh Pro uGUI input field components. + + + + + Exposed for Rocket transition to modules backwards compatibility. + + + + + This effect makes a nice clicky sound and lots of older code used it, + so I moved it into a little helper method here. + + + + If true, client will download the image once and re-use it for subsequent calls. + If true, client will destroy any cached copy of the image and re-acquire it. + + + + Notify server that a button was clicked in a clientside effect. + + + + + Notify server that an input field text was committed. + + + + + If an effect with a given key exists, destroy it. + + + + + parent should only be set if that system also calls ClearAttachments, otherwise attachedEffects will leak memory. + + + + + Helper for sending and spawning effects. + Newer and refactored code should use this method. + + + + + Objects registered so that they can be destroyed all at once if needed. + May be null if they were destroyed with a timer. + + + + + Plugin UIs spawned by the server. + + + + + Called prior to destroying effect (if attached) to free up attachments list. + + + + + Called after attaching effect so that it can be returned to pool when/if parent is destroyed. + + + + + Maps root transform to any attached effects. + This allows us to detach effects when returning a barricade/structure to their pool. + + + + + Recycled lists for attachedEffects dictionary. + + + + + Find materials in finished ragdoll and replace them with the appropriate effect. + + + + + Context for the Assets.ReportError methods. + Nelson 2024-11-20: Converted from directly using asset to this interface so that asset-related features can + more easily log warnings to the in-game menu. + + + + + Format text to prefix any errors reported in this context. (e.g., this asset's name and ID) + + + + + Alerts any agents in the area to the player if needed. + + The player causing this alert. + The position of the alert. + The detection radius. + Whether or not to hide. + + + + Alerts any agents in the area. + + The position of the alert. + The detection radius. + + + + Report success or failure from game systems, conditionally compiled into the Windows 64-bit build. + + + + + Call when the server is done all loading without running into errors. + Ignored if not running in CI mode, otherwise exits the server successfully with error code 0. + + + + + Call when the server encounters any error. + Ignored if not running in CI mode, otherwise exits the server with error code 1. + + + + + Entry in the MenuPlayServerCurationRulesUI list. + + + + + Seconds to wait between burning one unit of fuel. + + + + + Number of seconds to finish growing. + + + + + Item legacy ID to grant the player. + + + + + Uses unscaled time (realtime) because "planted" time is a timestamp. + + + + + Created when a chat entry is received from the server for display in the UI. + + + + + Player who sent the message, or null if it was a plugin broadcast. + Used to retrieve player avatar. + + + + + Web address of a 32x32 .png to use rather than a platform avatar. + Only used if not null/empty. + + + + + How the message was sent through global, local or group. + Mostly deprecated because that status isn't formatted into texts anymore. + + + + + Default font color to use unless overridden by rich text formatting. + + + + + Whether this entry should enable rich text formatting. + False by default because players abuse font size and ugly colors. + + + + + Text to display for this message. + + + + + When the entry was locally received from the server. + + + + + How many seconds ago this message was locally received from the server. + + + + + Event for plugins to be notified when a server update is detected. + + Pandahut requested this because they run the game as a Windows service and need to shutdown + through their central management system rather than per-process. + + + + + Manages scheduled restart for dedicated server. + + + + + Sorted from low to high. + + + + + Sorted from low to high. + + + + + Non-NPC object the player can talk with. + + + + + Broadcasts for plugins before applying consumeable stats to another player. + + + + + Broadcasts for plugins after applying consumeable stats to another player. + + + + + Broadcasts for plugins before applying consumeable stats to self. + + + + + Broadcasts for plugins after applying consumeable stats to self. + + + + + Called serverside when using consumeable on another player. + + + + + Called by owner and server when using consumeable on self. + + + + + If false, a deny rule matched the input. + + + + + If true, at least one rule matched the input. + + + + + If set, this was the final match. + + + + + Optional. If set, filled with any rules that matched. + + + + + If >0, this link was added by live config. + + + + + Determines how a server that doesn't match any rules is handled. + + + + + Include in the list. Default. + + + + + Exclude from list. (same as EServerListCurationDenyMode.Hide) + + + + + Move to the bottom of the list. Similar to EServerListCurationDenyMode.MoveToBottom, but the server is + still clickable. I.e., low priority. + + + + + Called earlier during startup to try and have web lists ready by the time server browser is opened. + + + + + Used to detect asset refresh. + + + + + If true, list needs to be sorted. + + + + + If true, MergeRules should be called before doing any filtering. + + + + + If false, LoadWebUrls still needs to be called. + + + + + For non-repeat weapons the "Use" audio clip is played once time reaches this point. + + + + + Catch exceptions to prevent a broken powerable from breaking all the other powerable items in the area. + + + + + Unsorted list of world space generators turned-on and fueled. + + + + + Allows Unity events to broadcast text chat messages from the server. + + + + + Text to use when SendDefaultTextChatMessage is invoked. + + + + + URL of a png or jpg image file to show next to the message. + + + + + Text color when rich text does not override with color tags. + + + + + Should rich text tags be parsed? + e.g. bold, italic, color + + + + + Allows Unity events to spawn vehicles. + + + + + Recoil magnitude multiplier while the gun is aiming down sights. + + + + + Multiplier for gun's Aim_In_Duration. + + + + + For backwards compatibility this is *subtracted* from the gun's firerate, so a positive number decreases + the time between shots and a negative number increases the time between shots. + + + + + Multiplier for normal bullet damage. + + + + + Multiplier for bullet acceleration due to gravity. + + + + + Movement speed multiplier while the gun is aiming down sights. + + + + + If true, gun can damage entities with Invulnerable tag. Defaults to false. + + + + + Name to use when instantiating attachment prefab. + By default the asset guid is used, but it can be overridden because some + modders rely on the name for Unity's legacy animation component. For example + in Toothy Deerryte's case there were a lot of duplicate animations to work + around the guid naming, simplified by overriding name. + + + + + Returns true if calibers list contains provided caliber ID. + + + + + Returns true if calibers list contains any of the provided caliber IDs. + + + + + Note: If barricade is attached to a vehicle this is the local rotation. + + + + + Extensions to the built-in Physics class. + + Shares similar functionality to the SDG.Framework.Utilities.PhysicsUtility class, but that should be moved here + because the "framework" is unused and and the long name is annoying. + + + + + Wrapper that respects landscape hole volumes. + + + + + Wrapper that respects landscape hole volumes. + + + + + Wrapper that respects landscape hole volumes. + + + + + Wrapper that respects landscape hole volumes. + + + + + Button in a list of levels. + + + + + Button in the list of levels for server browser filters. + + + + + Button in the list of levels for the map editor. + + + + + Base class for IMGUI implementations of primitive building block widgets. + + + + + Position passed into the GUI draw methods. + + + + + Hashes for Windows, Linux, and Mac asset bundles. + Only loaded on the dedicated server. Null otherwise. + + + + + Does given hash match any of the platform hashes? + + + + + Compares client asset bundle hash with server known hashes. + + + + + Called by asset startup to cache which bundles are eligible for hashing. + + + + + Used in a test scene to quickly test all Glazier features. + + + + + Reference type for testing SleekList. + + + + + Uses the Win32 API to force a console to be created and destroyed. + + + + + Should we manually create and destroy a Win32 console? + Useful for IO on Windows desktop, but not as much for dedicated machines. + + + + + Allocate Windows console if enabled. + + + + + Free Windows console if enabled. + + + + + A CTRL+C signal was received, either from keyboard input or from a signal generated by the GenerateConsoleCtrlEvent function. + + + + + A CTRL+BREAK signal was received, either from keyboard input or from a signal generated by GenerateConsoleCtrlEvent. + + + + + A signal that the system sends to all processes attached to a console when the user closes the console + (either by clicking Close on the console window's window menu, or by clicking the End Task button command from Task Manager). + + + + + Tracks whether we should show the "NEW" label on listings and item store button. + + + + + Track that player has seen the new crafting blueprints. + + + + + Track that player has seen the page with all new listings. + + + + + Has player seen the given listing? + + + + + Track that the player has seen the given listing. + + + + + Absolute path to directory containing bundle and .dat file. + + + + + Name of the actual asset bundle file, e.g. Hawaii.unity3d + Asset bundle should be next to this config file. + + + + + assetBundleName without final .* extension. + + + + + Prefixed to all asset paths loaded from asset bundle. + Final path is built from assetPrefix + pathRelativeToBundlesFolder + assetName, + e.g. Assets/Hawaii/Bundles + /Objects/Large/House/ + Object.prefab + + + + + Custom asset bundle version used by Unturned to detect whether imports need + fixing up because they were exported from an older version of Unity. + + + + + Get absolute path to asset bundle file. + + + + + Get absolute path to file with per-platform hashes. + + + + + Insert path prefix if set. + + + + + When to use this instead of formatAssetPath? MasterBundleReference and AudioReference repeatedly invoke + this string formatting (e.g., footstep sounds) and benefit from not generating that garbage. + + + + + Loaded asset bundle. + + + + + Hash of loaded asset bundle file. + This is per-platform, so the server loads a hash file with all platform hashes. + + + + + True if the server .hash file exists. + Hash file is not used by client, but client uses whether it exists to decide whether to include asset bundle hash in asset hash. + + + + + Hashes for Windows, Linux, and Mac asset bundles. + Only loaded on the dedicated server. Null otherwise. + + + + + On the surface level this is rather silly. + The primary reason for it is reducing garbage created by repeated calls to formatAssetPath. + Theoretically we could use this for caching redirected paths if/when that feature is added. + + + + + Load the underlying asset bundle. + + + + + If true, the associated asset bundle couldn't be loaded and was instead copied from another config. + + + + + If the type name has been redirected this method will be called recursively until the most recent name is found and returned. + + + + + After the key "limit" is loaded we stop reading. + + + + + Path to the folder which contains the Unity player executable. + + + + + Called by loading after landscapes (and legacy conversion) have been loaded. + + + + + True is solid and false is empty. + + + + + Marked true when level editor or legacy hole volumes modify hole data. + Defaults to false in which case holes do not need to be saved. + + Initially this was not going to be marked by hole volumes because they can re-generate the holes, but saving + hole volume cuts is helpful when upgrading to remove hole volumes from a map. + + + + + If true, SetHeightsDelayLOD was called without calling SyncHeightmap yet. + + + + + If true, SetHolesDelayLOD was called without calling SyncTexture yet. + + + + + Heightmap-only data used in level editor. Refer to Landscape.DisableHoleColliders for explanation. + + + + + Call this when done changing material references to grab their textures and pass them to the terrain renderer. + + + + + If a heightmap coordinate is out of bounds the tile/heightamp coordinate will be adjusted so that it is in bounds again. + + + + + If a splatmap coordinate is out of bounds the tile/splatmap coordinate will be adjusted so that it is in bounds again. + + + + + Hacky workaround for height and material brushes in editor. As far as I can tell in Unity 2019 LTS there is no method to ignore + holes when raycasting against terrain (e.g. when painting holes), so we use a duplicate TerrainData without holes in the editor. + + + + + Is point (on XZ plane) inside a masked-out pixel? + + + + If the highest weight layer is ignoreLayer then the next highest will be returned. + + + If the highest weight layer is ignoreLayer then the next highest will be returned. + + + + Appends heightmap vertices to points list. + + + + + Appends heightmap vertices to points list. + + + + + Call this after you're done adding new tiles. + + + + + Call this to sync a new tile up with nearby tiles. + + + + + Capturing ortho view of map, so we raise the terrain to max quality. + + + + + Finished capturing ortho view of map, so we restore the terrain to preferred quality. + + + + + Nelson 2025-03-10: I want to experiment whether this fixes a strange terrain hole painting bug (public issue + #4851) without potentially introducing crashes for other players. (Per an earlier, undated comment we'd + run into a SetHolesDelayLOD-related crash in 2019 LTS.) + + + + + Directly blend current value toward target value. + + + + + Only blend current value toward target value if current is greater than target. + + + + + Only blend current value toward target value if current is less than target. + + + + + If true, write to LevelHierarchy file. + False for externally managed objects like legacy lighting WaterVolume. + + + + + If true, editor tools can select and transform. + False for items like the object-owned culling volumes. + + + + + Hold onto collider and gameobject separately because collider isn't necessarily attached to gameobject. + + + + + Kept because lots of modders have been using this script in Unity, + so removing legacy effect id would break their content. + + + + + If per-weather mask AND is non zero the weather will blend in. + + + + + Distinguishes from zero falloff which may be useful deep in a cave. + + + + + Higher priority volumes override lower priority volumes. + + + + + When falloff is OFF, how long to fade in audio by time. + + + + + When falloff is OFF, how long to fade out audio by time. + + + + + When falloff is OFF, how long to fade in audio by time. + + + + + When falloff is OFF, how long to fade out audio by time. + + + + + When falloff is OFF, how long to fade in lighting by time. + + + + + When falloff is OFF, how long to fade out lighting by time. + + + + + Used by lighting to get the currently active effect. + + + + + Open a new transaction group which stores multiple undo/redoable actions, for example this would be called before moving an object. + + + + + Close the pending transaction and finalize any change checks. + + + + + Clear the undo/redo queues. + + + + + If false this transaction is ignored. If there were no changes at all in the group it's discarded. + + + + + Called when history buffer is too long so this transaction is discarded. + + + + + Save the state of all the fields and properties on this object to the current transaction group so that they can be checked for changes once the transaction has ended. + + + + + Kept because lots of modders have been using this script in Unity, + so removing legacy effect id would break their content. + + + + + Called when we position, rotate or scale this transform. + + + + Identical to this object. + + + + Devkit objects are now converted to regular objects and excluded from the file when re-saving. + + + + + Hacked to check horizontal distance. + + + + + Nelson 2024-06-10: Changed this from guid to string because Unity serialization doesn't support guids + and neither does the inspector. (e.g., couldn't duplicate reward volume without re-assigning guid) + + + + + If true, vehicles overlapping volume will check conditions and (if met) grant rewards to passengers. + + + + + ModuleHook looks for module entry/exit points, then calls when enabled and when disabled. + + + + + Register components of this module. + + + + + Cleanup after this module. + + + + + Holds module configuration. + + + + + Whether to load assemblies. + + + + + Directory containing Module file, set when loading. + + + + + Path to the Module file, set when loading. + + + + + Used for module dependencies. + + + + + Nicely formatted version, converted into . + + + + + Used for module dependencies. + + + + + Modules that must be loaded before this module. + + + + + Relative file paths of .dlls to load. + + + + + Wraps module assembly and handles initialization. + + + + + True when config is enabled and dependencies are enabled. + + + + + Metadata. + + + + + Assembly files loaded. + + + + + Types in the assemblies of this module. Refer to this for types rather than the assemblies to avoid exception and garbage. + + + + + How far along the initialization to shutdown lifecycle this module is. + + + + + Runs before everything else to find and load modules. + + + + + Temporarily contains Unturned's code untils it's moved into modules. + + + + + Temporarily contains types. + + + + + Should module assemblies be loaded? + + + + + Called once after all startup enabled modules are loaded. Not called when modules are initialized due to enabling/disabling. + + + + + Called once after all modules are shutdown. Not called when modules are shutdown due to enabling/disabling. + + + + + Find modules containing an assembly with the Both_Required role. + + Modules to append to. + + + + Find module using dependency name. + + + + + + These are *.dll files discovered in the modules folder. + + + + + Should missing DLLs be logged? + Opt-in because RocketMod has its own handler. + + + + + Should vanilla search for *.dll files? + Can be turned off in case it conflicts with third-party search mechanism. + + + + + If set, search for .dll and .module files in this directory instead of in Unturned/Modules. + + + + + Event for plugin frameworks (e.g., Rocket) to override AssemblyResolve handling. + + + + + Depending on the platform, assemblies are found in different directories. + + Root folder for modules. + + + + Search Modules directory for .dll files and save their AssemblyName to discoveredNameToPath. + + + + + Search Modules directory for .module files and load them. + + + + + Orders configs by dependency and removes those that are missing files. + + + + + Sorts modules by dependencies. + + + + + Nicely formatted version, converted into . + + + + + Used for module dependencies. + + + + + Requested by Trojaner. LoadFile locks the file while in use which prevents OpenMod from updating itself. + + + + + Equivalent to MonoBehaviour.Update + + + + + Equivalent to MonoBehaviour.FixedUpdate + + + + + Useful when caller is not a MonoBehaviour, or coroutine should not be owned by a component which might get + deactivated. For example attached effects destroy timer should happen regardless of parent deactivation. + + + + + Stop a coroutine started by InvokeAfterDelay. + + + + + For use with PoolablePool when no special construction is required. + + + + + Called when this instance is getting claimed. + + + + + Called when this instance is returned to the pool. + + + + + Number of items in underlying queue. + + + + + Pool of objects that implement the IPoolable interface. + + Useful for types that do not need special construction, + and want notification when claimed and released. + + + + + Not necessarily cheap to calculate - probably best to cache. + + + + + Internal cubic meter volume. + + + + + Surface square meters area. + + + + + Nelson 2024-11-11: Collider may have been destroyed by an unexpected mod script configuration (or perhaps + simply missing in the first place). Should fix/prevent public issue #4749. + + + + + Replacement foliage storage with all tiles in a single file. + + In the level editor all tiles are loaded into memory, whereas during gameplay the relevant tiles + are loaded as-needed by a worker thread. + + + + + Entry point for worker thread loop. + + + + + Order is important because TileBecameRelevant is called from the closest tile outward. + + + + + Offsets into blob for per-tile data. + + + + + Tiles save an index into this list rather than guid. + + + + + Offset from header data. + + + + + Data-only FoliageInstanceList shared between threads. + + + + + Data-only FoliageTile shared between threads. + + + + + Ready to be released to the worker thread during the next lock. + + + + + Mutex lock. Only used in the main thread Update loop and worker thread loop. + + + + + SHARED BY BOTH THREADS! + Coordinates requested by main thread for worker thread to read. + This is a list because while main thread is busy the worker thread can continue reading. + + + + + SHARED BY BOTH THREADS! + Tiles read by worker thread ready to be copied into actual foliage tiles on main thread. + + + + + SHARED BY BOTH THREADS! + Main thread has finished using this tile data and it can be released back to the pool on the worker thread. + This is a list because main thread could have populated multiple foliage tiles while the worker thread was busy reading. + + + + + Lifecycle: + 1. Worker thread claims or allocates data. + 2. Worker thread passes data to main thread. + 3. Main thread copies data over to actual foliage tile. + 4. Main thread passes data back to worker thread. + 5. Worker thread releases data back to pool. + + + + + Does this tile contain any placed foliage? + + + + + If true, mesh is not loaded when clutter is turned off in graphics menu. + Defaults to false. + + + + + Foliage to use during the Christmas event instead. + + + + + Foliage to use during the Halloween event instead. + + + + + Get asset ref to replace this one for holiday, invalid to disable, or null if it should not be redirected. + + + + + Responsible for reading and writing persistent foliage data. + + + + + Called after creating instance for level, prior to any loading. + Not called when creating the auto-upgrade instance for editorSaveAllTiles. + + + + + Called prior to destroying instance. + + + + + Called when tile wants to be drawn. + + + + + Called when tile no longer wants to be drawn. + + + + + Called during Unity's Update loop. + + + + + Load known tiles during level load. + + + + + Save tiles during level save. + + + + Should angle limits and subtractive volumes be respected? Disabled when manually placing individually. + If true, trees do a sphere overlap to prevent placement inside objects. + + + + Pick a point inside the bounds to test for foliage placement. The base implementation is completely random, but a blue noise implementation could be very nice. + + + + + Legacy implementation of foliage storage, with one file per tile. + + + + True if other IFoliageSurface methods can be called. + + + + Settings configured when starting the bake. + + + + + Implementation of tile data storage. + + + + + Nelson 2025-04-22: instanced foliage rendering is a decent chunk of CPU time. In retrospect this seems like + an obvious optimization: Graphics.DrawMeshInstanced accepts up to 1023 instances per call. Each tile + groups instances in lists of up to 1023, but often isn't that high. Now, we collect instances until we + hit the 1023 limit. This is particularly useful for sparse variants like colored flowers. + With a consistent camera transform ("/copycameratransform") on an upcoming map remaster I went from between + 0.72-0.8 ms on my PC to 0.55-0.6 ms! + + + + + 2022-04-26: drawTiles previously looped over a square [-N, +N] from the upper-left to the bottom-right, + and each tile checked radial distance. We can improve over this by pre-computing the radial offsets and + starting from the center to improve responsiveness. N is [1, 5] + + + + + Must be within [0, MAX_MATRICES_PER_BATCH] range. + + + + Version number associated with this particular system instance. + + + + + Automatically placing foliage onto tiles in editor. + + + + + 2022-04-26: this used to be environment layer, but "scope focus foliage" can draw outside that render distance + so we now use the sky layer which is visible up to the far clip plane. + + + + + Whether add can be called from the inspector. + + + + + Whether remove can be called from the inspector. + + + + + Called when the inspector adds an element. + + + + + Called when the inspector removes an element. + + + + + Called when the inspector sets an element to a different value. + + + + + Whether add can be called from the inspector. + + + + + Whether remove can be called from the inspector. + + + + + All water tiles and the planar reflection component reference this material. + + + + + If true rain will be occluded below the surface on the Y axis. + + + + + Flag for legacy sea level. + + + + + Water volume marked as being sea level. + + + + Null if under old water level, otherwise the volume. + + + + Find the water elevation underneath point, or above point if underwater. + + + + + Reads data into the data array. + + The file path to read from. + The array to read into. + Whether the read succesfully executed. + + + + Writes data out of data array. + + The file path to write to. + The array to write from. + The length of the array with data. + Whether the write succesfully executed. + + + + Checks the size of a file. + + The file path to check. + The size of the file. + Whether the check succesfully executed. + + + + Checks whether the path already exists. + + The file path to check. + Whether the file exists. + Whether the check succesfully executed. + + + + Deletes the path. + + The file path to delete. + Whether the deletion succesfully executed. + + + + For once the provider interface actually came in useful! + Fakes loading the Steam remote storage files from a separate folder. + + + + + Triggered when the user's statistics are available. + + + + + Checks the current user's statistics with this name. + + The name of the statistic. + The value of the statistic. + Whether the check succesfully executed. + + + + Assigns the current user's statistics with this name. + + The name of the statistic. + The value of the statistic. + Whether the check succesfully executed. + + + + Checks the current user's statistics with this name. + + The name of the statistic. + The value of the statistic. + Whether the check succesfully executed. + + + + Assigns the current user's statistics with this name. + + The name of the statistic. + The value of the statistic. + Whether the check succesfully executed. + + + + Requests the user's statistics. + + Whether the refresh succesfully executed. + + + + Triggered when the global statistics are available. + + + + + Checks the global total of the statistic with this name. + + The name of the statistic. + The value of the statistic. + Whether the check succesfully executed. + + + + Checks the global total of the statistic with this name. + + The name of the statistic. + The value of the statistic. + Whether the check succesfully executed. + + + + Requests the global statistics. + + Whether the refresh succesfully executed. + + + + Current user statistics implementation. + + + + + Current global statistics implementation. + + + + + Current client multiplayer implementation. + + + + + Current server multiplayer implementation. + + + + + Information about currently connected server. + + + + + Whether a server is currently connected to. + + + + + Whether connection attempts are being made. + + + + + Network buffer memory stream. + + + + + Network buffer memory stream reader. + + + + + Network buffer memory stream writer. + + + + + Connect to a server. + + Server to join. + + + + Disconnect from current server. + + + + + Receive a packet from an entity across the network. + + Sender of data. + + + Whether any data was read. + + + + Send a packet to an entity across the network. + + Recipient of data. + Packet to send. + Size of data in array. + + + + Send a packet to an entity across the network. + + Recipient of data. + Packet to send. + Size of data in array. + Type of send to use. + + + + Information about currently hosted server. + + + + + Whether a server is open. + + + + + Network buffer memory stream. + + + + + Network buffer memory stream reader. + + + + + Network buffer memory stream writer. + + + + + Open a new server. + + + + + Close an existing server. + + + + + Receive a packet from an entity across the network. + + Sender of data. + + + Whether any data was read. + + + + Send a packet to an entity across the network. + + Recipient of data. + Packet to send. + Size of data in array. + + + + Send a packet to an entity across the network. + + Recipient of data. + Packet to send. + Size of data in array. + Type of send to use. + + + + Whether the user has their overlay enabled. + + + + + Requests the user's inventory. + + Called when the request is completed. + Handle for checking the owner of the callback. + + + + Requests a check for promotional items. + + Called when the request is completed. + Handle for checking the owner of the callback. + + + + Converts the input items into the output items. + + Items to be converted from. + Item amounts to be consumed. + Items to be converted to. + Item amounts to be generated. + Called when the exchange is completed. + + + + Whether the user has their overlay enabled. + + + + + View a package on the store. + + Package to view. + + + + Checks whether the current user has an achievement with this name. + + The name of the achievement. + Whether the user has this achievement. + Whether the check succesfully executed. + + + + Assigns the current user an achievement with this name. + + The name of the achievement. + Whether the assignment succesfully executed. + + + + Whether the user has their overlay enabled. + + + + + Initialize this service's external API. Should be called before using. + + + + + Update this service's external API. Should be called every frame. + + + + + Shutdown this service's external API. Should be called before closing the program. + + + + + Used to show a warning when a lot of servers are blocked by curation list. + + + + + Reset after starting connection attempt, so set to true afterwards to auto join the server. + + + + + EItemType + + + + + Nelson 2024-12-06: This was added 2023-06-19, so unfortunately it will be inaccurate for older items. + + + + + This enum exists for sorting items based on rarity, and is derived from quality. + Quality order cannot be changed due to loading from older files, but this one is ordered + from lowest rarity to highest rarity and should match entries in quality. + + + + + Response data from IInventoryService GetInventory web API. + + One player's inventory became so large that the Steam client's built-in GetInventory fails, + so as temporary fix we can send them a json file with their inventory. + + + + + Json string representation of the contained items. + + + + + Parse response from json file. + + + + + Details of a workshop item that the game may want to refer to later. + Cached during client startup after getting installed items, and while + downloading UGC for the dedicated server. + + + + + Banned workshop files are shown in red. + + + + + Used on dedicated server to test whether map has been updated, and whether local copy of file is out-of-date. + + + + + Some workshop thieves use an empty title, in which case we show the file ID as title text. + + + + + Used when transitioning Unity versions breaks asset bundles. Replaced by AssetBundleVersion const values. + + + + + Workshop item key-value tag storing the version number. + + + + + Maps published file id to name, version, etc. + + + + + Get compatibility version from workshop query, or zero if unset. + + + + + Save the details from a workshop query for lookup later. + Allows game to inspect the installed files before deciding if they are + compatible, since maps and localization are not affected by unity upgrades. + Previously the compatibility test occurred before downloading the content. + + + + + Get cached workshop item details. + + + + + Should caller skip loading a given workshop file? + + Used to skip workshop version of map if the map is locally installed, + e.g. Canyon Arena moved to workshop and auto-subscribed. + + + + + Helper for downloadServerItems. + Called for each workshop item we want to download for the server. + + + + + Called once we know which items the server is allowed to use (queryServerItems), + or the query has failed in which case we proceed with all items it told us. + + + + + Is currently connected server allowed to auto-download the workshop item? + Requested by mod authors so that they can whitelist/blacklist access. + + + + + Successfully queried details of the items current server is using. + Ensure server has permission to use these items, then proceed with downloading. + Also caches item titles for use on the loading screen. + + + + + IO or bad result occurred when querying items the current server is using. + We do not know the file details, but we proceed with downloading them all. + + + + + File IDs the client knows the server is using. Fallback in-case the query fails. + + + + + IP of the currently connected server, or zero if unable to retrieve from network system. + Used for testing download restrictions. + + + + + Number of items currently connected server was not authorized to download. + + + + + Called prior to downloading, and after a connection failure. + + + + + Client now knows the published file IDs the server is using, but + queries the workshop for additional information before installing. + + + + + Callback when player subscribes to an item and it finishes downloading. + Different than the game-managed DownloadItem calls. + + + + + Get path to an already-installed workshop item. + + True if the path was found. + + + + Used during startup to register subscribed workshop items. + Given a workshop item file id, if its files exist on disk then register it. + + + + + Workshop file ids we were locally subscribed to during startup. + These items are queried for compatibility before registering. + + + + + Called when subscribed items callback was successful to register all compatible files. + + + + + Called when subscribed items callback did not execute as expected, + maybe because steam's servers are offline. In this case we can't check + compatibility so we register all the locally subscribed items as compatible. + + + + + Register any localization-type workshop content before waiting for the steam callbacks. + Important so that localizations are available for loading screens and whatnot during startup. + Any items we register now will be skipped later. + + + + + If specified, player's workshop file subscriptions are not registered at startup. + + + + + Map of subscriptions added/removed by the player through the in-game client API, as opposed to the web browser. + + + + + Called by us when we subscribe to an item from in-game. + If item already exists on-disk steam doesn't always call onItemInstalled, so we do our own check and potentially load. + + + + + Current achievements implementation. + + + + + Current browser implementation. + + + + + Current cloud implementation. + + + + + Current community implementation. + + + + + Current economy implementation. + + + + + Current matchmaking implementation. + + + + + Current multiplayer implementation. + + + + + Current statistics implementation. + + + + + Current store implementation. + + + + + Current translation implementation. + + + + + Current workshop implementation. + + + + + Initialize this provider's external API. Should be called before using provider features. + + Thrown if initializing fails. + + + + Update this provider's external API. Should be called every frame if using provider features. + + + + + Shutdown this provider's external API. Should be called before closing the program if using provider features. + + + + + Parse dynamic tag mythic effect. + + ID of mythical asset, or zero if not in tags. + + + + For purchasable box and bundle itemdefs this maps their itemdefid to the list of itemdefids in their desc. + + + + + Invoked after a successful exchange with the newly granted items. + + + + + Invoke after a succesful purchase from the item store. + + + + + Purchase result does not have a handle, so we guess based on when it arrives. + + + + + Find the first instanceId of a given itemDefId. + + + + + Count quantity of a given itemDefId. + + + + + Find certain quantity of given itemDefId. + + + + + Does itemdefid exist in the EconInfo.json file? + + + + + Get item with an exchange recipe for the appropriate number of scraps. + + + + + Get list of itemdefids mentioned in purchasable box or bundle item description. + + + + + One player's inventory became so large that the Steam client's built-in GetInventory fails, + so as temporary fix we can send them a json file with their inventory. + + + + + Add an item locally that we know exists in the online inventory, but is just a matter of waiting for it. + + + + + Remove an item locally that we know no longer exists in the online inventory. + + + + + Update our local version of an item that we know has changed, but we are waiting for a full refresh. + + + + + Callback when client knows which items were crafted or exchanged. + + + + + Callback when client thinks result was from purchase. + + + + + 2022-01-01 it does not seem to be documented by Steam, but we get SteamInventoryResultReady callbacks + for external events like AddItem calls, so we may as well handle them. + + + + + Do we know the player's region? + If not, default to not allowing random items. + + + + + Does the player's region allow crates and keys to be used? + Similar to TF2 and other Valve games we disable unboxing in certain regions. + + + + + If player's region does not allow crates and keys to be used, return the country code. + + + + + Similar to TF2 and other Valve games we disable unboxing in certain regions, so hide those items. + + + + + Similar to TF2 and other Valve games we disable unboxing in certain regions. + + + + + Not called on dedicated server. + + + + + Implementing as a struct wrapping the connection handle would remove the cost of looking up the connection, + but implementing as a class makes it cheap to cache information like the remote identity. + + + + + Find game connection associated with Steam connection. + + + + + Must close the handle to free up resources. + + + + + Must close the handle to free up resources. + + + + + Defaults to true. If false, skip Steam Networking Sockets creation of regular IP socket. + + + + + Defaults to true. If false, skip Steam Networking Sockets creation of non-FakeIP P2P socket. + (this is the socket used by "server codes") + + + + + Must close the handle to free up resources. + + + + + Must close the handle to free up resources. + + + + + Recycled array for every read call. + + + + + Log verbose information that should not be included in release builds. + + + + + Log helpful information that should be included in release builds. + + + + + Should certificate authentication be disabled for UDP connections? + + + + + This callback may be called from a service thread. It must be threadsafe and fast! Do not make any other + Steamworks calls from within the handler. + + + + + Thanks DiFFoZ! Ensures GC does not release the delegate. + + + + + Does host want extra debug output? + + + + + Overrides k_ESteamNetworkingConfig_SendBufferSize. + + + + + Overrides k_ESteamNetworkingConfig_EnableDiagnosticsUI. + + + + + Implementation using .NET Berkeley sockets. + + + + + Implements message boundaries on top of a TCP stream socket. + + + + + Implementation using .NET Berkeley sockets. + + + + + SteamNetworking is deprecated. + + + + + SteamNetworking is deprecated. + + + + + Dummy connection used in singleplayer. + + + + + Does initialOverlaps array contain hit collider? + + + + + Does initialOverlaps array contain every hit collider? + + + + + Perform a move, then do a capsule cast to determine if Unity PhysX went through a wall. + + Required when disabling overlap recovery because there are issues when walking toward slopes that bend inward. + To test if Unity works properly in the future; walk toward the inside of a barracks building in the PEI base. + + + + + Set detectCollisions to false and cancel deferred requests to enable. + + + + + Set detectCollisions to true on the next frame. + Useful when CharacterController is teleported to prevent adding huge forces to overlapping rigidbodies. + + + + + If true EnableDetectCollisionsNextFrame, if false DisableDetectCollisions. + + + + + Intentionally Update, not FixedUpdate. Physics transforms are applied between frames, whereas at low frame + rates there may be multiple FixedUpdates per frame. + + + + + Used to capture promotional images. + + Unity does not allow components in the editor assembly, so this component is in the game assembly but only compiled in the editor. + + + + + Test to compare differrent Unity instancing meshes. + + Unity does not allow components in the editor assembly, so this component is in the game assembly but only compiled in the editor. + + + + + Hacky workaround to fix item skin material leak. Unfortunately none of the original item skin code destroyed + instantiated materials, and did not keep a reference to the instantiated materials, so until that code gets a + rewrite this will take care of cleanup. + + + + + Debug component in the editor to see if GetRandomForwardVectorInCone seems correct. :) + Not much of a mathematician. :( + + + + diff --git a/redist/redist-server-preview/RocketModFix.Unturned.Redist.Server.nuspec b/redist/redist-server-preview/RocketModFix.Unturned.Redist.Server.nuspec index 93388198..41f94f86 100644 --- a/redist/redist-server-preview/RocketModFix.Unturned.Redist.Server.nuspec +++ b/redist/redist-server-preview/RocketModFix.Unturned.Redist.Server.nuspec @@ -2,7 +2,7 @@ RocketModFix.Unturned.Redist.Server - 3.25.7.2 + 3.25.7.2-preview19137126 Unturned 3 Server-side redistributables. Standalone and always up-to-date. diff --git a/redist/redist-server-preview/SDG.NetPak.Runtime.xml b/redist/redist-server-preview/SDG.NetPak.Runtime.xml old mode 100644 new mode 100755 index 375e4e6d..f4215536 --- a/redist/redist-server-preview/SDG.NetPak.Runtime.xml +++ b/redist/redist-server-preview/SDG.NetPak.Runtime.xml @@ -1,292 +1,292 @@ - - - - SDG.NetPak.Runtime - - - - - Indicates net reader/writer implementation should be generated. - - - - - Uses "smallest three" optimization described by Glenn Fiedler: https://gafferongames.com/post/snapshot_compression/ - Quoting here in case the link moves: "Since we know the quaternion represents a rotation its length must - be 1, so x^2+y^2+z^2+w^2 = 1. We can use this identity to drop one component and reconstruct it on the - other side. For example, if you send x,y,z you can reconstruct w = sqrt(1 - x^2 - y^2 - z^2). You might - think you need to send a sign bit for w in case it is negative, but you don’t, because you can make w always - positive by negating the entire quaternion if w is negative (in quaternion space (x,y,z,w) and (-x,-y,-z,-w) - represent the same rotation.) Don’t always drop the same component due to numerical precision issues. - Instead, find the component with the largest absolute value and encode its index using two bits [0, 3] - (0=x, 1=y, 2=z, 3=w), then send the index of the largest component and the smallest three components over - the network (hence the name). On the other side use the index of the largest bit to know which component - you have to reconstruct from the other three." - - - - - Similar to the quaternion optimization, but needs a sign bit for the largest value. - - - - - Default intBitCount of 13 allows a range of [-4096, +4096). - - - - - Write 8-bit per channel color excluding alpha. - - - - - Write 8-bit per channel color including alpha. - - - - - Note: "Special" here refers to the -90 rotation on the X axis. :) - If quaternion is only a rotation around the Y axis (yaw) which is common for barricades and structures, - write only yaw. Otherwise, write full quaternion. - - - - - Packs bits into a 32-bit buffer value, and from there into a byte array. GafferOnGames recommends this approach - rather than "farting across a buffer at byte level like it's 1985". - - - - - Lightweight error when exceptions are disabled. Bitwise OR to prevent different errors from clobbering each other. - - - - - Uses "smallest three" optimization described by Glenn Fiedler: https://gafferongames.com/post/snapshot_compression/ - Quoting here in case the link moves: "Since we know the quaternion represents a rotation its length must - be 1, so x^2+y^2+z^2+w^2 = 1. We can use this identity to drop one component and reconstruct it on the - other side. For example, if you send x,y,z you can reconstruct w = sqrt(1 - x^2 - y^2 - z^2). You might - think you need to send a sign bit for w in case it is negative, but you don’t, because you can make w always - positive by negating the entire quaternion if w is negative (in quaternion space (x,y,z,w) and (-x,-y,-z,-w) - represent the same rotation.) Don’t always drop the same component due to numerical precision issues. - Instead, find the component with the largest absolute value and encode its index using two bits [0, 3] - (0=x, 1=y, 2=z, 3=w), then send the index of the largest component and the smallest three components over - the network (hence the name). On the other side use the index of the largest bit to know which component - you have to reconstruct from the other three." - - - - - Similar to the quaternion optimization, but needs a sign bit for the largest value. - - - - - Default intBitCount of 13 allows a range of [-4096, +4096). - - - - - Read 8-bit per channel color excluding alpha. - - - - - Read 8-bit per channel color excluding alpha. - - - - - Read 8-bit per channel color including alpha. - - - - - Read 8-bit per channel color including alpha. - - - - - Note: "Special" here refers to the -90 rotation on the X axis. :) - Read only yaw if quaternion was flat, full quaternion otherwise. - - - - - For example bitCount of 7 allows range [-64, +64). - - - - - Values outside the range are clamped into range. - For example intBitCount of 7 allows range [0, 128). - - - - - Values outside the range are clamped into range. - For example intBitCount of 7 allows range [-64, +64). - - - - - Encode a float in the range [0.0, 1.0]. Endpoints are encoded exactly, but not the midpoint (0.5). - - - - - Encode a float in the range [-1.0, +1.0]. Endpoints and midpoint (0.0) are encoded exactly. - - - - - Encode radians wrapped into the range [0, TWO_PI). - - - - - Encode degrees wrapped into the range [0, 360). - - - - - Placeholder allowing user assembly to compile before specialized implementation is generated. - - - - - Ideally should not be used by new code. - - - - - For example bitCount of 7 allows range [-64, +64). - - - - - Values outside the range are clamped into range. - For example intBitCount of 7 allows range [0, 128). - - - - - Values outside the range are clamped into range. - For example intBitCount of 7 allows range [-64, +64). - - - - - Decode a float in the range [0.0, 1.0]. Endpoints are encoded exactly, but not the midpoint (0.5). - - - - - Decode a float in the range [-1.0, +1.0]. Endpoints and midpoint (0.0) are encoded exactly. - - - - - Placeholder allowing user assembly to compile before specialized implementation is generated. - - - - - Ideally should not be used by new code. - - - - - Unpacks bits from a byte array into a 32-bit buffer value. GafferOnGames recommends this approach rather than - "farting across a buffer at byte level like it's 1985". - - - - - Lightweight error when exceptions are disabled. Bitwise OR to prevent different errors from clobbering each other. - - - - - Call to ReadBits or ReadBytes would have overflowed our buffer. - - - - - Buffer passed into ReadBytes would have overflowed. - - - - - AlignToByte bits should be zero. - - - - - Buffer passed into SaveState would have overflowed. - - - - - Imprecise because sent byte length is rounded up from bit length, but should help find particularly - egregious reading errors. - - - - - Number of bytes until end of segment is reached. - - - - - Save remaining data to resume reading later. Used by net invokables to defer invocation. - - - - - Used by invocation messages to show more error context rather than the default. - - - - - Used by NetInvokable loopback to copy buffer from writer to reader. - - - - - Assumes length is greater than zero! - Moves reader forward according to length. - - - - - Uses "smallest three" optimization described by Glenn Fiedler: https://gafferongames.com/post/snapshot_compression/ - Quoting here in case the link moves: "If v is the absolute value of the largest quaternion component, - the next largest possible component value occurs when two components have the same absolute value and the - other two components are zero. The length of that quaternion (v,v,0,0) is 1, therefore v^2 + v^2 = 1, - 2v^2 = 1, v = 1/sqrt(2). This means you can encode the smallest three components in [-0.707107,+0.707107] - instead of [-1,+1] giving you more precision with the same number of bits." - - - - - Maximum number of bits to read/write for string byte count without overflowing the string buffer. - - - - - Maximum number of UTF8 bytes for string. - Before the "null or empty" flag was added the length had to be able to represent 0, but now the receiver - can infer that the byte count is at least 1. - - - - - encoderShouldEmitUTF8Identifier enables byte order mark (BOM) which is unnecessary for UTF8. - throwOnInvalidBytes allows reader to discard bad string packets. - - - - + + + + SDG.NetPak.Runtime + + + + + Indicates net reader/writer implementation should be generated. + + + + + Uses "smallest three" optimization described by Glenn Fiedler: https://gafferongames.com/post/snapshot_compression/ + Quoting here in case the link moves: "Since we know the quaternion represents a rotation its length must + be 1, so x^2+y^2+z^2+w^2 = 1. We can use this identity to drop one component and reconstruct it on the + other side. For example, if you send x,y,z you can reconstruct w = sqrt(1 - x^2 - y^2 - z^2). You might + think you need to send a sign bit for w in case it is negative, but you don’t, because you can make w always + positive by negating the entire quaternion if w is negative (in quaternion space (x,y,z,w) and (-x,-y,-z,-w) + represent the same rotation.) Don’t always drop the same component due to numerical precision issues. + Instead, find the component with the largest absolute value and encode its index using two bits [0, 3] + (0=x, 1=y, 2=z, 3=w), then send the index of the largest component and the smallest three components over + the network (hence the name). On the other side use the index of the largest bit to know which component + you have to reconstruct from the other three." + + + + + Similar to the quaternion optimization, but needs a sign bit for the largest value. + + + + + Default intBitCount of 13 allows a range of [-4096, +4096). + + + + + Write 8-bit per channel color excluding alpha. + + + + + Write 8-bit per channel color including alpha. + + + + + Note: "Special" here refers to the -90 rotation on the X axis. :) + If quaternion is only a rotation around the Y axis (yaw) which is common for barricades and structures, + write only yaw. Otherwise, write full quaternion. + + + + + Packs bits into a 32-bit buffer value, and from there into a byte array. GafferOnGames recommends this approach + rather than "farting across a buffer at byte level like it's 1985". + + + + + Lightweight error when exceptions are disabled. Bitwise OR to prevent different errors from clobbering each other. + + + + + Uses "smallest three" optimization described by Glenn Fiedler: https://gafferongames.com/post/snapshot_compression/ + Quoting here in case the link moves: "Since we know the quaternion represents a rotation its length must + be 1, so x^2+y^2+z^2+w^2 = 1. We can use this identity to drop one component and reconstruct it on the + other side. For example, if you send x,y,z you can reconstruct w = sqrt(1 - x^2 - y^2 - z^2). You might + think you need to send a sign bit for w in case it is negative, but you don’t, because you can make w always + positive by negating the entire quaternion if w is negative (in quaternion space (x,y,z,w) and (-x,-y,-z,-w) + represent the same rotation.) Don’t always drop the same component due to numerical precision issues. + Instead, find the component with the largest absolute value and encode its index using two bits [0, 3] + (0=x, 1=y, 2=z, 3=w), then send the index of the largest component and the smallest three components over + the network (hence the name). On the other side use the index of the largest bit to know which component + you have to reconstruct from the other three." + + + + + Similar to the quaternion optimization, but needs a sign bit for the largest value. + + + + + Default intBitCount of 13 allows a range of [-4096, +4096). + + + + + Read 8-bit per channel color excluding alpha. + + + + + Read 8-bit per channel color excluding alpha. + + + + + Read 8-bit per channel color including alpha. + + + + + Read 8-bit per channel color including alpha. + + + + + Note: "Special" here refers to the -90 rotation on the X axis. :) + Read only yaw if quaternion was flat, full quaternion otherwise. + + + + + For example bitCount of 7 allows range [-64, +64). + + + + + Values outside the range are clamped into range. + For example intBitCount of 7 allows range [0, 128). + + + + + Values outside the range are clamped into range. + For example intBitCount of 7 allows range [-64, +64). + + + + + Encode a float in the range [0.0, 1.0]. Endpoints are encoded exactly, but not the midpoint (0.5). + + + + + Encode a float in the range [-1.0, +1.0]. Endpoints and midpoint (0.0) are encoded exactly. + + + + + Encode radians wrapped into the range [0, TWO_PI). + + + + + Encode degrees wrapped into the range [0, 360). + + + + + Placeholder allowing user assembly to compile before specialized implementation is generated. + + + + + Ideally should not be used by new code. + + + + + For example bitCount of 7 allows range [-64, +64). + + + + + Values outside the range are clamped into range. + For example intBitCount of 7 allows range [0, 128). + + + + + Values outside the range are clamped into range. + For example intBitCount of 7 allows range [-64, +64). + + + + + Decode a float in the range [0.0, 1.0]. Endpoints are encoded exactly, but not the midpoint (0.5). + + + + + Decode a float in the range [-1.0, +1.0]. Endpoints and midpoint (0.0) are encoded exactly. + + + + + Placeholder allowing user assembly to compile before specialized implementation is generated. + + + + + Ideally should not be used by new code. + + + + + Unpacks bits from a byte array into a 32-bit buffer value. GafferOnGames recommends this approach rather than + "farting across a buffer at byte level like it's 1985". + + + + + Lightweight error when exceptions are disabled. Bitwise OR to prevent different errors from clobbering each other. + + + + + Call to ReadBits or ReadBytes would have overflowed our buffer. + + + + + Buffer passed into ReadBytes would have overflowed. + + + + + AlignToByte bits should be zero. + + + + + Buffer passed into SaveState would have overflowed. + + + + + Imprecise because sent byte length is rounded up from bit length, but should help find particularly + egregious reading errors. + + + + + Number of bytes until end of segment is reached. + + + + + Save remaining data to resume reading later. Used by net invokables to defer invocation. + + + + + Used by invocation messages to show more error context rather than the default. + + + + + Used by NetInvokable loopback to copy buffer from writer to reader. + + + + + Assumes length is greater than zero! + Moves reader forward according to length. + + + + + Uses "smallest three" optimization described by Glenn Fiedler: https://gafferongames.com/post/snapshot_compression/ + Quoting here in case the link moves: "If v is the absolute value of the largest quaternion component, + the next largest possible component value occurs when two components have the same absolute value and the + other two components are zero. The length of that quaternion (v,v,0,0) is 1, therefore v^2 + v^2 = 1, + 2v^2 = 1, v = 1/sqrt(2). This means you can encode the smallest three components in [-0.707107,+0.707107] + instead of [-1,+1] giving you more precision with the same number of bits." + + + + + Maximum number of bits to read/write for string byte count without overflowing the string buffer. + + + + + Maximum number of UTF8 bytes for string. + Before the "null or empty" flag was added the length had to be able to represent 0, but now the receiver + can infer that the byte count is at least 1. + + + + + encoderShouldEmitUTF8Identifier enables byte order mark (BOM) which is unnecessary for UTF8. + throwOnInvalidBytes allows reader to discard bad string packets. + + + + diff --git a/redist/redist-server-preview/manifest.sha256.json b/redist/redist-server-preview/manifest.sha256.json index c251458c..065bdf76 100644 --- a/redist/redist-server-preview/manifest.sha256.json +++ b/redist/redist-server-preview/manifest.sha256.json @@ -68,13 +68,13 @@ "UnityEngine.TextCoreFontEngineModule.dll": "5aa0db3b3ce7e68a5b3b757e002c20607c4169ba096a5c71d3fdeb29ca62e955", "System.Runtime.Serialization.dll": "7f9fc41d5a21e368ed56cf00bbb41e44d2cd2f18a2596c8500590c3c9e294831", "Pathfinding.ClipperLib.dll": "4651eba68167202db81c212f445e23a2742560d70b605c0b367ad26a4d8dc1b3", - "Assembly-CSharp.dll": "6381c380028caf3ff70348ec8a56528e90d64455208e75cbf0d3f558faa9aa80", + "Assembly-CSharp.dll": "d0141a46e8bbb9206aa0cdd1ac6b6a7149cf37509214367cf929d208336a6a7f", "Mono.Security.dll": "22f18aee38c7a8b1eedeb37da10a4cd93f8185b2f85d1eb95657cc6f5f473eb3", "StandardAssets.dll": "74b3876b13495990cc8fcb5cae5d25e95f664fe423eac09acfc1fa9f199c1818", "UnityEngine.dll": "4e8aabd8a38b80efb06f440b665c85e8ba7647dcc98a33155405c857abc8db9d", "UnityEx.dll": "cae79a8d28d883e483063b1c821dc984e6ca2d3fdde62eba088e58fca17d7833", "UnityEngine.VFXModule.dll": "e26df07ddfce940a4cb753fd2aa03be76c7c8ee9daac6feade652a06ae13b86e", - "Assembly-CSharp.xml": "3a1a68d82803002d3cd31441d1f487b07632176ae8ee7ca41c61cff480760818", + "Assembly-CSharp.xml": "1b33fe59fac4bb54319799b7a69bde8ee3d2d72f5f69ed47432ca3bb115c193d", "SDG.NetPak.Runtime.xml": "032c8d2d0a3e1f15ef1139b98f5370eb1fb94d65bf01c4462a0c0e6578bb705a", "UnityEngine.WindModule.dll": "eb4670be37cec7824d64711526008538567c86eb0dad8c773b0d7a56fd4ef158", "System.Security.dll": "07282d060237039adb6d11adc5f6e60e72a0049a5482545b5133f3dbb6ba840b", diff --git a/redist/redist-server-preview/version.preview.json b/redist/redist-server-preview/version.preview.json index c258d99b..5a7955fa 100644 --- a/redist/redist-server-preview/version.preview.json +++ b/redist/redist-server-preview/version.preview.json @@ -1,7 +1,7 @@ { "GameVersion": "3.25.7.2", - "BuildId": "19120008", - "NuGetVersion": "3.25.7.2", - "FilesHash": "7C4B57FC21CF2453A239F1F49F092E4AE0F78D6C5E1F870988D6D141C1347CF1", - "LastUpdated": "2025-07-06T17:38:02.8449326Z" + "BuildId": "19137126", + "NuGetVersion": "3.25.7.2-preview19137126", + "FilesHash": "5FBC26122D79F58F34B7456C0F32467D63E69F256C7E6D30AA51764F7F8F295A", + "LastUpdated": "2025-07-08T16:51:31.9203751Z" } \ No newline at end of file