From 59d4310a94cfd74fe0eff705cb60d1a3a22f839c Mon Sep 17 00:00:00 2001 From: Jackz Date: Sat, 13 Jul 2024 21:37:28 -0500 Subject: [PATCH] Cleanup --- plugins/l4d2_spawn_props.smx | Bin 55724 -> 0 bytes scripting/include/actions.inc | 962 -------------------------- scripting/include/json.inc | 813 ---------------------- scripting/include/l4d_info_editor.inc | 54 -- 4 files changed, 1829 deletions(-) delete mode 100644 plugins/l4d2_spawn_props.smx delete mode 100644 scripting/include/actions.inc delete mode 100644 scripting/include/json.inc delete mode 100644 scripting/include/l4d_info_editor.inc diff --git a/plugins/l4d2_spawn_props.smx b/plugins/l4d2_spawn_props.smx deleted file mode 100644 index 89de08d32b67410e6119f2acbb15337e0938e46a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55724 zcmeFYd0bLk+c)01I~`AhHdtAjdUqPEOg-k5;c(Kj!PIQfoKtc{Btt|+9sZHjr znK>d3i4zE%%As<=5fDUDQ&I#{!~q1}t=;$Uc|O1Y-v3`euD!o|t!rJwcU^0(EiCQq zE?@oEFTYd_ty^c?uwmWK-+x)RZVV`^KWlfxf35p%6`%Omx*zy|t=j_NKJKsU{$9Us z-7WxM;r+U99e}k~vEbKr4}rcq0A>n*U3Woy-8y{$AK1EKojM?M62O)_HmuvCv~Jy5 z0AJX;Aff})*S@y5TMincpq?&21+l0V}biapg3r4SXTku zUjk(rzT*CYZ%VSc`${}qRUS8)_`hV)AmHqvTQhvSgOvR3ZzY_GXOtTI} zYI?&XT}BI()shAs8)ln|!&K>ks@&Q~n;9+1LoE)hmM%t%9`HNVf@8K!K*y3y!%?Q; zd8%`b-q|Pf9flt|48L{o95}2WrkY;;$m883kGe-4LoK^P$09?=Jj0@gk7hUilHKT= z-3V9@&TibB-5BrS`Q@-aRJ9>QHNEx`3;#%$*}`YGG*v!pkA{v(pkuM7;U7)I51597 z*W3pB0=r}8{F(#^DRM)D^IZsCeOr#@-VUdIK;1S`*4{^FqA^U3eKa&URTVMzl$;RAq z<3uBE1xHSGEtMW3tkR1t$)xJTTVaYi}L)$ z0l#@pDOKGyXTOPc^l@|YcxDW=p}sBasj#w|q|Y(a2jn>Nwc-A6 zpaY@Qi^hGLLB}^P2PE(jkL-%qCqwu9Pz{Xho#glG+Ab=oTkYpK`=TzrsbSu2d-4=^ zh2eO?n0Bh?)5hhn%`DK4xqBuDg{h?kVrm6FC@m~8m8P%2tdOsmvKifIywX2?f zP<>g&ILU^*%a>&mjH~IrYo~bIlm0vF^rN-_CH1Q|p?v?cFpPi&hprioU39y zOksR#aAF7)XCcXK72|t0gU4)es=> z&1g(6xvkZ!%9&mE!rnT^8pKMaNxh z4hx=a`uAs%s-JYQ6Mp?Uwd$%N^2%{v)#d%YozPB!Y{DL76i=hOJIUHHEi{I#3elBl>d z3@rkiFyl2Do9lZ{j@sHiF}NtJh|*J=YbppPI}US={Its(sUQ7(-ZWB668O=dt;B>A zDgG110@qZe#IC&sc_f1#7@+1(Q1==<8_30H6Iz)M@D;zWv5Z zjWrmvh1d!4MRQ7i_Yb$m)@zc!-XVQjp+u_;J%m&e2VM}05H6aOjL64a#~&SDQ2qtu zp%;x?78p~}`ChDrp%x)WcgHjfG;qYHA^5&xFFP5<%zdR8a+ts@jCNq``{Qzp4d?B( zd}k!r3M_rfbFJH!_h@btIEeRM0_UV6t?Ru4eOs)C>6u?E_wL zebDt0{OmzgmpM4h`T=E7YGy`InNN#^1_k~#QtWf9jaMH$6dh;ty+5Y&-5%)8F=>J{ z%M^VBdDYu0JC38Ur^)1Z@tlG4s9r0a7ezniEE!j3U{y^u(~w4B1@M|0>c-DjN?)97 z49?Z^mGH-sc~7ILRpx>+8|foUy2Q#uWL466LIXP19xtmjgI+Y`l1VIld z6{Xi5=-jZJ<(~S&%V?2qJUomu7F2POUJs%l(lNcJ4SPAkd0LMxET3DjmQRi~K@i6m z+hNEXiyG8zlH|!o@}$X`F^gBN(LK!yqXffCqNSemfhOJ9{PmGwJuEt#H@qa%7iF0E z*xIKKO6C(l18x7Zi@`=JNY5dqjZ|^5Bf0`%^J8l{_q;3Lg1437Bcur~6Gt{+F2|8P zD7LbghVTbWaTrfU%wvyehR}&$G?RJkvTCN)Sk3fi>|(Y+O-^mJf=ULfoOV&FcUun2 zC3u+)Z+u_x$?h^WtuFBeyx#7}N~dGdDB zZszvq@~fb{kF<94vhbY1#MDXVVP<_q2^IOcjLI zF^~R`^Eyh~v-uo(QT2mSabSfI`5*!8vb{22xVx|Apy_-z^)bHxp}nzSci-`SR}LKQ zUHZFma_p(P?vCWe&B5;;41BUT9?`871r_!RywNhPo(o2)GVXJ4&&LXUra;NFZt4;`Gf5K9PN)a{ZXD_^4PNwa)^`76_^?1HbSHCiDEOUD2ow`wYUVU9%? zL}_L8%PyciobsRyCTbxl#s9002ao7c?fgUy!CQQP4s*qO(&;hv(I%)!bkCAnzX$mk zOtl)_vn3Y_T|{OtG-kJDbhY2P@hNaVlxOl+Q}opuPb zL>?tq*C zHt&Nj&xEJCS&h5Dh%4(jk^lEor&0$iAv6g>-mRR~UKxk>P|<9T+uOcnakNh!wSQpG zfk)$Gmp{dLb(R&+qS<8aKgY98T2B!^4-0q0m8lo@%ZQ!xZS~HMRO-NV?NXonP`gbC zpJBu#Yo?w}2?S~N2esc#A8JVZ;^fxQdbB{VZ5MO?dj}4hORqNJw9y8yxw0Z*f%aEE zzKYR0fn#$7eO5|J=lIn3$>|>X_caWJEBkhuT<<=804>{RT%Rmq|31hZ8|Z)_yrY^% zmdGbVtjSKBp-_`M#^X}5DvPO8R#ACGZ_;rjxIkx zuJw;7i}tT1-f^9Hbp7!eGRwk>tHteGrt@Pih3}Ja)yFSWv*QD|at7k|G5yJ# zKZeMHg^c%-m&uya4PB#VQ^}g^Vbigl>N_Gzj1eWQ@5Kq@wFk|uK3bPV#=g0iyE!ZJ zuu6FBm3xA$;xL!-rQ`M~)E4Yuij#MB?b~4P!u}L$-fPrcPF@(*ylx!65AB~;Gugvq zrkbFrn$(&Ap}BH?aC6rZ-;+-;mbyc5zbNBuG;r@l3+{2sxUYH(?q#O#K;0z`+*M~3 z?rEZn5W=sUWCkTeg1YK^%g=bUcc@m?Y8w!}11-HHNtL46cco<~yiNP)?Hz6P;Z`b? z;z+AQ-X6RI7FGQkpoL3}RLzoZ6Up@Vroz3T6i46@AkvWiEndEFJU{pe-|vIrjg$1{ zePEkUfo>u~x)ps{Y^wV`EM$7ON&)e}cLJ3+71Iq8jUuw;e-+|lsGEiV0&$`}#G99Y zHRkC@kwvCP$G$rTO*?AYm>vJ#W{e0VZ(x<5Jly3_r~RTk*E$c}*Cd)ASD|XSr`Da6 zms+b5q-mAY2-u=BEo-B4m)m2DQ-cn{-;<&vbiXr`+n?}|qNvcoFL4(2fBIW$d1Oq- zS{x23f71SBUObyo_BoOlXW%ha@6feECCNtZ=1w>G*pVAHCafBIK3+QGL5I@#s#M>Gju^$;TME6;@`f94w~KENfkT`c-RP( z!7ql}4e1!tXHNyfQ5GY8U`qFJQ|RUipAnfHrBK?+xbExaR-k}f{}Sl}#XwuhVche4 z2Q9bREu8&#kJ-+6a=|&@P|~itxZRy0Xj?l!F5yis>s~G~D^d{5X!@hZXl1tvNcUcD z9&vugB08Ori`@ZoY8{xFA34-~)vLez7iAFrU}WV{=9JpZmLTTdfodb&8u&CWBr;`F zq+<}%yv&zNXz6}IsR#(XQEgNl%zcuWYyK!#Hz~4vW2Al%Gqb1K$iM?B)(wd~yaAMM z%=e^K!)^UaPiz_Y#Gn(wXW>>9O>B!yvb~ns%)4`L+!yDqj?n*kkiJNac#eR}^jnTKpBHn-xhIc@tK0&aXtl4vCBz`D55N>TzCfiSdlZ z(HgjYZ@2gR?l=dKlJU&UGsa#_YF4h*`|iJsb5ARSoG#4lYxd~sHhkZG!2tyHn7=qP zd<}2(2g4j29O(J6+xt*N=xKn>1#?wawW*raZ)&!jX7$&rmv_33L&C+qFweepQuV>X(!k?e2@Cj0RD2A6l( zaU+40ML^fU_=xJyO75&)8bV13b|VQZ+0t{oMLi|Ib`g2vuS?_0B`Br^U7XC65&LA% z198Uq6Hxq^BCN`!qF@jO%U%pxc|f8)Or&{g;6@a9x_W;P6H-`5f>fE56__;Ltg4&C z@asOPyDyu%*P<5O4V7^PKDG2sGHVphO&M2Y>OS(0M9WEZp(^p~E-Ii^b*~Fd`t5Y# z@4X?;wh&@6t@A7j_cD>jc)+X}Z@g7iS5c4#Eku-KJ6v=N3rsSq>Bk~j5L`%*UVZOH zBERmPy1PI+Q|Cu#LMBY`e?al~v`{z)WgO1b-O>q9KNcL69Lw;A@M2InFJ)Ysse6YR z1JX27UOBk99fkY;f?pS7jGtr$ZOHShni%Xk*3f%u`5FpmrHm^B9Qkk*wYqO5o4VUO z)za1bder5mB$pOQ)vkda_pm~fmD~k)u)2GRpn*O&&xAMxuWnt;l`s_UVWLY}vdi>d z9F=!VyV^(1T>Q6~@TpAcl#klckn)Ph#(i}9S#?$->_$e_a^!>*LJnK{#RPLwc9|=` z-Ehx(ABs0S{{XDc51j#r$bXF7r@4nK<7V0iR(vyQ&55+HRoLZ^Cvaz#ajibCq6hx& z_5cy7YjsZ&UA~Qn$g3|w9Bd)HHKbcoVDkLRs+fklyY5jF%#GsfJ$n_h#4PLM{l})C zDB^6pv|j~7dH+TH)w-*zb!mt;45e&xYX{zwQeh~U>aBL3=h5_?Yh3}_ z=C7{$u3KDiedXn9*R1}YO?qpA#V69H-vL#c+95$=>(W)9T#WI%wbpb1*+o(k%SMwQ z%*aN++tTE>=L@=JzRp)$wSiX#nJ<|2L%Bh_bU8BbK?qsUX$z3bR0AzOa5}Q|vB}3O zPk!66FxR1IaK(2~?GSuK-CZMiHH5k%BRT5Ef638uS#=k6YMgRzbs%2xT#ef>simty zzfgAvts%XtMA}l|YO_mzB2BV}Xn!ZZGALYiI9A>L^OM!EfMlABby-!s!5IH0|N5%p z1M2Rr)bdqr&dRtR?%G&40zv;oZxdY*KIqb8&<{A278h)r&rBS7~>-;uU9*4Qg>IS;8xK^b@wI? z5Npx6t+Jk?eAUz)YAK}11)wL>B{k8-a;qk$ap^1yb5ed50$f`E|5SHu9gGDD)gWZS zirV1HXlx}M!@zyriV93Av7Q+W3hd=Liyk;l99(6(brt)&-&c1pFj@7@eej;G< z^#K_L3>UDp^deSWpNPpO(3pf(!sdd4lvfH?(R6Rm#h+*{B&bP#ewB6Qpr8cB8d^5N zZ^FEt+-l$cK;8Yl^_nlhnv(ew0cj<+h*%kA=a8&(KDkLhKJw(st4qtqwrWiA$)!oF7MQfX3g}Oo0I{D-4zSRe{+vO4^>GSiZ3gR@;7?%IRtCr5 zAhA4cjXHWymQ;6*SzxF6iFWn$WUWBf5~aK#P4N>|7MS4wyQ;i0T^l?+u*;Vhut5vW0xtUL(@U7BaPlXuzLRRO_`>`m#CU#UA_a3um%o*5Dexh1nJHf2w;%0UCXFm}jhx>_uxpF|Uw#b|S_LHB; z#RM<8xJELt+5DWUz*L!d4h-Y!g6$x~t|bF7j7zSo_9wCi8@J9Q(3nOp2UxPxsyw70 zb$x`x+Ph7zulOE7v$aj@l{vRxUl#H0$lf9Zom{yDWx?=@dR*W_lmxGpTz`TD<+vP9 z4B?-k=o@nA{LH#4SSq{^c}Rq3Fxhmy&muuWHM zq_Ff?c~RAQ*E!IUl{gtEQd2-I84ZkdBR}SVbYr=<>Se^Gs#nN<*Y?fU15i|G6}%3U zD(k9jTg+skAGp-%6RR$Jsr-(Z0tFy4mq)R+`c9q&g!#>gy(a?@O{ZcJv?A%ILI2C8 z9lc-D~M!8!tz#T0*Dn`=DDo-MfI0vt#ej9$9G5SxcJV48cy61%Gn+9uvEbyHi&$;}v|cFCPfv04 z5|EdsD>`_9XZo8FndSiqHx=((MD*OI!HJ~H=@3Avm%*wdi9i>(0)048VQGy(&?a6~ zUiO+yAPidsAcl3! zcHB(|%q&9z5ij9RGFRR`em$Ms1N3qt*&w2?ly-~&9N1c;0L5j1X|#=(3ZQsP^91zqAmJK<4n0%a!2krNT)hBSGyzuv;|V#|0f@bOi9p1lssX~k3iMw95reIffFDSJ z$4eX6NHUjB1M#4$21r2#`t(#cuWr&L;FyqXgUD2!z9Rzs_|RySVtHEuL^1~0X!X#d z5SpE%w64WQ;^(@UwS`4UcWY40zxijA@w<}oYBT-bur@bKR0zYsiWRa?m2&%dSm>8_ zQKeu#^+QthFx2XC@V;@iy|R|YNWPE`79bn;(hq&x8~UYxNpHR~tYbxy9?ZJh8MBi$ za2NRt+Q$|(V29#L?1WWq$jMep8BJ&t5&c-|CoouYLqut~e6U|5IIaiZe#B|n z24~R~{i+K(>$%qiO1dRioPf&$(}!r(heER{*q{|`(t}DduaZUkip;8R4~GSxLN21W z*L269h$H@J9!}k}V2QQoEqRDj+oC}bT1{tO;~UG*Dl=1pfAY?rMg5kKgHa!;%zQq= ztfk$x6aeTbQZD(>sfLuE`KVH5s*q zLDa9Jd46<=(n8~S(s;hgjQQYQOH$H8e5_<47NxYXw2MD9{ZC#A;*RVJUS}m1jmjHY zQ@rXgs9NVu5OrnqJbyXGamC;)Dh5Vt;DUhaq97;2dK4ME9_6x&zjuMh>IXv3PFnZ| z1VIE<2fFs=JyM%yi7azH4MuP$<$za#3`YOl2>6kvi}0pKoO8N=9Dj!37^^?_h~KZy zdQlu;_a^#g_lzId5$k#-PkYDY{?^7<&Bv0_l_vbq%Jw+taX)En9;|yWzM>1$P(3MT zKQ|vVU49sR29?FJHv4xb(rhe_5vn?fysu)CviSG1oGb~4ja11UiPO?w*>lTbv&3Ie zItEnBC)PDh4|?bFbVnH~6rv2hahCnWO(Z{!(8E5Zwh)OP0;S;~xeuDtSVfG<_f<&r zdo?fjC~qc&JFuHk z7gWCnRhEIme`g1uHUj|icXs^i?A`${^Y}2A9(Lb=o|X;rTn~bS8_E+}ok5X3qRzc7 zu2gIz{Bj!Uc@;UfjnIED3;=>{gpH@oaAn!%@q(<^9z6r>Q}KfO*Sx&`P%8XE5EX8N zq78_(ZOs1tzdofiL2y+HvbRMTWf62A^mJ_^Y;a)XY`=$XCI}Wo>bZ+rZ!9UUdtgD+ z5|skb@$V^+X~%swNcWy($aJ@+joJS10mcZ|oe@>#;;Xjl7}+%@A{zZg(DD6hKmwtQ z)Bw*vVeqZCXvi+g2Ze7q;9C=OfsA4UKw^@66uG}ox4LQ)dAAiB7FGdXvS$Y|4drkv_KC3GSI+9ZB+*PYP|>(8{CVclSZ<`_So69iJG@NKv0jD4@Fktc_|hgbq$yRfz8LLfT|{UGQ%_rdd_~MJ zj}#h3zK`=s1COdzdF@7wgaTi!@g6Z?uQ~%$W32y;u{%G*y{Lv`$rm@ZJ6hzoqASf1 zSyhkT8_>y%G?stdIexc3pN#YP&Z_s;6|(HCUXL^+qyNIevRD3&;p~?F?anck{xWL0 zqTmN(da~1!@ae66=LWQMwn^@j=pEAg_v|p2ugq+XG?A>QT879@ zQ!SI_H^1h=_%$hu+`;x!ck^L*O@$>V2ArFTQsFdc7Q@U#IVTr>r14yFlGY{5R42+F z3O7h{wxP%1x8iRyzez1|TsU8=F3u2{8bi5pZAPsjA+8ruW#oA33;EkOlB3TZbLsP| zi&j?X&t<68VuL2T@Ah`E^uwQ$I)>d&~C=63%~v+~rAO|VdW!#s%-GyaYQ9!b|ai@6bct7Q!+Kf~Ui~Q#^^Km!_E_GE$_s(ra=+*)9&V9$(KDG|gc= zfL0gngvl9iZ1ECwqOfO+i~_W3{By2gO0NOvP;R-Ys}Hk^t^ues0cd39pDQqj*Id84 zVmIL&l;RmOxRX*8wKJ=PKyWv1g~>G&0&0jrt0~(#sF;ld{!kc5u`!B-0v2#pfQ6V< zm#zR(RMl1UI+_WSH1VofT#5~RIdRoF<8uXj(RY9jT`z$S7Da%z`gZ4_yx0(+PC2Qt z=XlPl)wJ6?v+SK9gF87>n4MYMVL+o`xv*!Syc&^xoTIqdSIWVqyr z@l|S25V>Q1JQ;c*j@Ml|ZPE5UvvOL_TQOPrQBdnOXf83vB%7y^&%27zc^l>GqCI(L zi0kOiy>fM7^6&&q?3M=ix(?dBViL>hS+1N${ZhMPGSbdXjl9kcNMD9DV=5Obfojg~ zB}fGrL21IeC+@){Bfrl4pl7_uinVvG%gJ6bnT)pc^BP3Has*qDk}OOQ@8 z6s8G#ief?a0Sg!j+MzE&5?vD?=8;%tj*|+daMoM3Dmq8|qjeRvUEFL7v!ebW(nm)8 zg}V9J;Kk;TR_w3QbrDBfBTC+cOik|Wzg~GSLU)EetQ_UZfb=U z0*w(u>rC0w1@~+fGKp6F5mr?<)xsjWGZUf&gB&EdbKJ7^3AO~2o;kuWHMTFTYxV-V zqJ$vAOB!}-5wpsbs<$syJl#bNVCI@_)`p>dT!_(K65^Y0Gn}wb=Hv3Qa%!>8 z+VKHjNpy-Ul@6x#Pki6HSv^v(nIa266-v3$S6u=llPn+bwUG$PFB?!QEGL(UZpGG! z3++Ye*!=m}%i}9BFm+-^$0?X$f_7Rn@y_X^7M&E*K6PjQ#eG28FiU?ZB!7>7}`#&1|N-HLTx?)3NW78vyw5K@-fdxq#jv;o|$7ypREn( zJTG0C_qa0;pJUbx~ zLY)5}{*<`Zw0A!Ch6*w*_8JYeXNt$ud;%TMI5gtyA$%%}f|Bm*_)|ts$5MS{(nP7u zuAl5j4C&_mQ+sDp^002}Q43vHAN$$;%d&ZrJ&kiEB-+vSdF3)%M`u?amSoj4$mYDP z3VJ*ZuN!(ma38~5>WP7gL=ox01Q`YUYfUp1xFIEU!9lB@ot!y~v?;Z)xbw5o$7Z7q zPjlO|^UN%MbeR`aZO=D^2q0UmWB3gOcXY9>fP(xab2>b*P-UenxtuOGf~QyHXA+Cp zL}lXz(2pGUp=Eevu0S`XQ02vgnI?NIcSWMQ04cvkm3qMh5EJD7dX~;+ZbhR)*@iHQ z?3BjGu74EP!E;D`TE(F3>b#SDkV*ZxGydI^L&x*#NVhDNu5w&0Xk)Oj&C0|%$4wK- zjF)t<^GLJXNQOk+t3kI$7OwG6G+z@}C{{%Pusl>DG$ z4?2rY-WTg>WLIv_-?)3ewdvyvQ&EAKT(NR9eWJOL-LMZhA-Z%NF3M?OqY_z`576(r z)Ehod`Yu{T9buDKT%^kKdvQJ^o-lz9Z;yzJM1O5^iqm>%WlKdTBabzok23W( zrG4?AX?JgW5_^0Q!|6>fk_fMAcSLE0X?84aZNmI`Ds>tzv3m6-AgAV93HWFl&v~Bw z(JOUqaU=bcG({fsvhyUpup=D3Ep^^^tk+`+4owQv_kdajg{QSM#kTrr*VTBjnOSx;Bduy_`Tm4z$8*U&cej@4 zuaooEL&hc1B=bG>)8jsU#@eg{EwXD@t?Xil=6C7KMvCmKwzUbz;to8oGxZ}(qeWXi ze2{U3DaOl$rdy!gq+8uh-fi!T&DUdj8DAPdg;X~Fv1IT*G@T!PtHn%eu&W<4C9BR- zT-h$9ACVZ4v;|>9K9knp$c$<0En0UJqqYL;;zmmN6Ib%v5!VFkVg59|0)wp~oFr#$ zpYxPgXXUTptf=FjSaIcGIwY*(jiH%~dAzW8si<%k9s9xj#w-Vt2<=n65m{es( za)0s(<>pF5g>+{@PK`lBia)k}HhYq&IW0V)I1j#L%rZVaU7x|NOi3doAdP4aLbHH_CtjONQe`47mBu0bzX-7PiAH-c+Vg}E81t-Sjo-;ymVWlfR}6E{Jt@@OiEmFN{_>uNQ77f+9!D`~Vut?}Y|A1XK{S&FjB5}}U78AtAMDNy+$R5+$ zWfKly7#0q`*&CBPau;5B1!U%!!BWZtNx{DIkQ%hiRoHu^*aLqwJwspTf*JE=wNl!n?V_^qK<6O(vZrtU^bN-0T*hISoqa=Hib*X< zry`N;XQ_a^eb%K=i7SFwCl6YDdHs}oH_k3f*w|Qg((KOTTewl?Iikm$;esp@&WVZs zfMFi$I#BhrJ@xkm?I=06FKE4oHq;Aw@Ks5)vf~AY>%NXJDdD2p`+W$n4~Q6PAq{f> z3^9w2*rf&W6eZ6+f*+~E-_Y>nltlBN)>JJy9vZZ;*c~0UQ}k(befmx))q~;Phqr|J zqAq+~m}c51h+Juj9ZB5x%zUJq1Rcpm*f81=6jHL8S@8TYhkWTBp&{hzh5{4^jovTZ-`d;?ht9{$Q%tOyr^ zd8VPJMRm1ifyKF(%9oW!--@Gs89Jh^)8T`0Zlznp$*tYiH?A{E2yOj`y+kCxam%6? zm;&$MdWK|jAJLm^qvA+$7SxO zxT7j@bAySR(Pu%XR>dxXcKHFFBuDv+9}auZCVRC;$bDSx&E96{zs(4{V(8^*=ylPM z{oIf6#*YA8^HQ-zprVX!Y(}N4VXl***JVSmYliH5euQ{GLXO`l$|#U3t~ zT(4Yez-0)&!H(2lZHLby`S1ePMJZt!@ecK^WODPu|7=~m>;+e5mW>k~L z@0m`u$j6>Ec~R)wmUSMZl+{87CZ0VM`k&HAcG|B1wJ2px_U-7 z>+iGhre|>H2xl{~qEkuBcn^Bo%B_Y8vXX#had@~Pdgd!ygN`vy@t=MXvIsWa*`K@e zl8MglDH#y3I%6-6lanv!i%mVyI?R5ehj1ce(R0$e=(a)oCF0W21eEzC`el*R(czAx z4NgRiLCH}ZpR~^iYWIA>E?asElK*^|ev}0ivjyr#@%89Sd~)~ai3RC3sa|%3(u!Sc z#Qubc$T;u%;U6NJyn{(K>ig7o|FdEmNRtWfAqAF{uOq;Yag+72$uKT*B5vf{yR3ZI z2F2g`I!{D@bl~FhZscj#?LCkbmp8LVR~r2x3K1~Gq^j~mW<_7_)A=2uf z7k$|sHv-Oz%e#qk?p?@9;GcD1!FSiInS@rQ6m@*KLGaYDr;B{lByY`I<^IkE)=zU) zFSLq6Zc~{sJWpr%gOxorw7Ka5_-w(YclEah?aUI!31Kf5O`y}va^;Em=7yc3-BdQo zzYdc6eLX?@8bo76X|VDr3EKAv{dq5(C|IAO;GWj5KIK|o%0peo<+X}FRNYv3{YLq~ zrm3uP_Z4P)=n8W)Ee`tqykbq zY9DWO?A^I%)0vT(F^%hAae5FuBb4+D_c3ZdA^iVlGR|l=w24 zSP3LrY|y^8xR}=Gjd#M1KVEEf@AraD;%e=FFjZoM!Cm%W4Sk<1Kh3f>UAm0Igeo$> zsVZ^0_QjMsR|5ZxG*i$fdI}C0k?j^abwT_vl}*~)#=Q9<=qhhSieNuaOsv{IxhIy* z){~w+C`~pSLfs@6^ku*@C_N`>h6!NwW8PO{MOMCHc|-d2(_7mSJ7G}aWm8HL9_RMs2r~i3;PqpQRGe9K8H`f5qo~RD;j@; zknUi$c)LQfKh+1Twl!b4a>FPaRccslzquZEajvOoim4~a-?6~CGE6yWZs$K6z59Z9 z71aIl@yT7=QYOlu(kpGe&9X!rPH}(Sg^7M|za_pmjEwM_ewUMfa(T**BQh4P7)|S) z_HNq~;_}Xi(iPXWKuECKe{^5|s8fRkyRl%)$YILmijtlZqTXV3O#cnYO#g=)cH!EC zNRt89C?b6{S6SSAi}O(UO;g1$&xP|4W|ivqd|b3;bji3~yb(GeK&QKZD?rZ(!P9@^Ol3(hm(s z<5rKDCLRo~f~ngJewSTKzx)aYIYn(n*TOg$&$qR{f-=LqmhZC03K#C%HXRLQF!l;KYX>U>w!y%xxKwz;Lg@EmuLa?kGHcNw%69Q?lauU zYded|#0A?nt3cp?donTkN8hI7JgT$I$}#IZr}u5+Y+#Ooiv}rFQ_MT!MBMT}ff_tD z$BoM|T48uK#m70}PI`OM@(cE>|+pWr{2EK7s#YN&(RlKN@0Zs3q}ApHsSfZ{HX zh;6TVh)bO8{u~x8tqD0$xV3{Wjo8S$-U90%ozg|t|C z+cujMb!9wCePN5~;9V->hcqUzlTUydQVpSGjPKIdF?pBJMdM|&2UK){O%u96PRUib zVyS8!eJ(=b7LycF%g0r98E-Nu^+xjtepGDgn9}C%e zWCx>gxlusfh_s)K??NPgKDTo+Ua#*WH$Js^ro?b&hxT>u-Yd4mhbz z#wUowbyLrG6Jf_XH)8q;U61&0>2GpxvG6aZb8eqKp>v#(_u?BEq;q_RQqV|=aJ=ye z`|r>8(X02;r>-42KhBcOM{~~+Jn*>5cqcTfVPZIJV*BUeup(2PoToF$X`?w=C^tS~ z+-Pa;g3Lq-ePbbM>)=}(e&s{|8RZrAt}D|h0Cc7om~RyLn*8Kg^P-z zlY6j{llwF33l$5JA@@zkxAr}SUdF0ANDA7TG}}) z_`I;uu{l# z)?T;ZfdhTfJNq4u6=%C#N_V}awo>6vFmH|6oHVr~X=-6-f7-78>pT0Stx8@A-ue-) z0xxh$Q!%^x#Yc;Iu9vu1FL7Nj0dJaNHw?Z0GW0rc$S(CG7`8@?Crup&wCWab2Hqr( z056koc}r+!7JZ7r{YIa1Gvd#fdGs$_=p!)S;znS*Dobij>9cO5S-Yjf<8aM<9>lZ# zYCc4qj9tv6R1x_WHVg1`pw!DG$BpV#cwL-ph|8Gms{{+3<9XQ2V)F(HeQf9e+`(@Y zzQC!gOi{BcF-`Rih56vgsVk!0i-s+*T;cEh$(UL4{MluA@F8E^<9SxZ!WU`_<^?@;|E@c~x_skN-hDtFh&(RA zP9off>~YlF(BK(v&5_hlYqr?j?K4wt5Ed~s5nj|CSd$V#+c`+({yn+8PkU$E4_(*E z*gX2l{1@t6xCHZQxjFI)HE;-V3>%&ME`%Ka|83Iitj_;6o zlvk;(jE{-pd9Tls)rhD1GmJa@7NL_bsJt+#1995Wh~@lG=((b_HqZE~DetN%GKcxi z$7E4cN+w;-zYBcoSfx6icWXN5PnI)jh6AZoB6f7bdsaLQUidDC77+h_>sN(i&ownR_Pn;+=P z4dlcUCIabB&9f%lu+%*HquRiaQWh*ZuM$RylF;B{zNlF)M46^LWg<=mP)RhRix%O>BYLASB%x#wIwTj&=Tdke02q7W~K=Q zQzmB3o%E3@(n?^t<-1GB(4FnWmAiqmtEApbFR5v*=q6>7y|;)IGQSK3J;`@EV?muI zoivl1b*U|Yd^#R5&yG|t#eSdHC`_JX50n;7a>`plOCGokC5#b7_z$ekPkRODvT~o2 zX%h1%g*kfiM|Sjim6ZUR;IwqQ-F68Vp5Y!>MURA#xn1C>{gehuNUiFsiJT_ZAv_d9kb*-VZIo zMyAN$%u1c|9|>Ueq|2;IlTv16A(}47%ntn+f=@Q?8>n0!`B)hb9GSBr|S(4(Y~ywlb9G1 zTDgAFgfT+DiSj9A+GnYU3L({`su~J3WFV$@{n=PCZj|UqPi>{)wn^ot7zk&JI}WJgQ)9!O|J_b-FM zZ6}i>_8UQ;P~cDR4f3AguLe?cFeA|_@Pi*pi>DM^b~NN|IcG)MREs>DoD?j#+(G8m zv#8B-VWVeK*J>#sT|-~T`Of6c?_wDMzX_Qd~T?>(cM z{DODUp9PSvROzD9J4o*!pdv--T|}CphayCXbdjbay#}O1=pZE^pdh^y2qg3nN{DnR zfs_9_XRUj`T(Zvh`-QcWck@nWo|$K6Pu}cp8Aes1P9p=krD#ZcJmT9Nl*df^llI!J zPPymmH=SP5(0vYjRMDm2_LIr2oAZY)VoibE7DL8G)qN|j^I-%xskixuhr-? zo01RfYu~s|U)_$ncdJ1B+QjWhi?nDh^Z&ON{A0QT8``UeR^k4wn;Fqf4I1 zp~9<>|9EC1Dc*%7>}hgQb=|&c&%pbNHD8=^zxtN$=TPZCoxBY8Wc`aF(nK_%CZYjL z@%boOxcE)=yOHE+QT&5lO2S=qZ(dRRRFiAXgi8MKgq)93-dK$OFX9z@(Y@c@Hrmr#R~4QwMuzh3T5YhSCWgg!?q zG34EBHM}-bNyLf7UWQ;Iul?2hPeYu>=yoVeTKLWH_o&OOY1pbs=Bmk{vW7%75a_23 z7Qdx=JK{y!2iK2X!h_xSh1E%??~!F1MsV-z05@3gR6gFo3H-Xn1}kMx`QATkrB?3GQ- zN$(IrK#vF!u@gZ+p5TMDr1rPM#3|^-sb8c;2AW6k{Q1ec`ilNj^$kZa9f7NZz=jyn z4H5BCtE;2TEN(BH`LvU)Tl~6%IJx~tb#|tE`%rU}$jB2UYEL z#dY0$uF2qJ&&gy@E?G?~KNE3(Ta9HNM}(>g|9>@;$`gqK7?CIlCW7%go`{z!U2UP$ z|A=7R9DTJDwWnUq6C%Wz+KxyvQ+;x^6RA8V;zV>rEJQHzl@(DpF$f+I5pbUf1pLGx z$h{hZkPlZwz(Xt>_Y#<_^B$G@ZEgGOMcfp1;funo8lGFNuWN0+DQ)N<;vmV!FCu;Ui>|t4w6@;_8Bhz~xt_?#EG5~VLDpE^{Xl_9by)8CgMa?L=+GvqQD6|5epGncvwP+IB71Cvb{s?Y9b2B zB$Dte2u1Bx$;R&c)nRr?Ou#wK)h2>zU#&qqF)9rqko{E^#f9?KB}+1~qS1~}Hea=L z0u!k4s;U%!jffXn5CQq}GZ6uIhzK}wxH{u2>RgS%MFbHqIv2PaWW4j$`Ao=wNWQ$t zA_6ky)gT`-65+Z!bs|+Ap#yML3*l6Vh=6@Kk&MhsM1UYMklC&V`3!J12IXqRFrXy@ za?{lUws6Ggnu&;jVJ@?S7dHJHA%3UxvG+jd(d; zD-B(YPJ1f{7-q{RoXtDK8pcds6gI>%0rYTfYryrVPo{XUOhgLLYcBBy@|% zb-CV+CbaS>#c4@YAs4qlyetW`bos#R5`L3C>Y5xW-{QlpusSc!qE}3!8YqKORR(o( zV-4y_%?AN!mTcqk7~5+p#@&-QT7b_ z-ExGUt@VdM{$|lgE%;+K@K>cG%qmbyY&!l+cvS3I&Rj z6WW&O)JZN1$lZPj>*l>%XZNlvd)-Xv^1d7OLXLWc&>Z%&$Atm+bP4~|qy2bzNUA&nU zVdTX$+|4l9rS)f^PkI1y>scP%+dNKI?wb;r@DM^Pp3sMuyRrU?j?m73?g6zRB@*@3 z5vQ8}J%doZgqC+k#c)?(TA0O;TY-T@bg|aPLvDY9u$Mt-!m4TS zkKWK(Ys!$onbpAvG{_?8&5BKO5f>b&mkK?&h@rGGsm z>crJ?#H?lZ0?Z#qR}#Tm60Lnpo$54?i_kPAG`@#_%BMxJq}>2Y6Ai~71n0OKk^v&& z7)VM~$U9zQ=E~8+U+G%@szgQyTv>p!Bv{|F`KT|z{>tN9C2@?tO|k{dl4i3GeXA&!WY5}8CH(I5he z2vJs9j3f$4G7(5#5)BhCHe#{ZPw<_qlDvf;Q4S_N^mlb;G*c&HEmoq6R1?aoE12tV zHtzkp;=;*rK>PmxKm5P8!x`85^jd}^v668MI7C6D`qhM5&|Fyrm6fRe`@cu&V!@ks z(rnta!gl}FEBHlfv=#mC&m8lC2iZ%a!Eh#QoPUG1=8`nvhAhb^D>{*EY-Q-OImiqY z_Ms&O3PnY^+=t8@Ekc}ENo^BB<$NpRt}oo3OmNNCdHdRp%nX{F&<(>N3BAXZjVV%Y(GFXAf1^+!5* z^gq5=|E>Y{r*Chl%%E64`fCT>*xfM~MrbK-c9YSC_N$4okO=Z)GbHItsVZIlpTXI; zKJ_fK=autt`uF>J{t!ZOVvSwt-IqQLjf;3XwV}L`kJK9@=hbGuv9E?HpqzWH z+b6%XzoFW8sGAy^w7YiI0J`_zizB80qRBEWp`>+B$NTH!YwOvm#NO=x3S_Syo7ifo zY%Q--9z!x7F`=7Qlb+Y|=f1N7t#|%Q5*^X_dLY^G>-D$#I_b*D9J#87A75-kAJmpRH9=&HqrC^N8O=7{rWXFWf)bf72<&bccLg;@YuWuE@;pF zPC&kM{cq?EGK5vPfkI*leef9T1S1V!j&Dbg`$62v^H~~ytyV=%!jDKrA3hxckU6Im zS8My-Ru;jhxbQh{d+1@>{;ux39zN6^z(K{=r&9hT9KG90s+?2L{2u;r!*34JZPBER zNY0t{6tSAobCNn(ZG!E)uE9}(G3Rf)&sq_==V?^(V^Td6x-E*d%8|8gS(uIWl_T?i z0)x1;{NhU3m?21R=fD!QWn>P{enaM7`}+hN_`UGK(VMdcG^5$qxc#u9^0QZzHfRpC zfuJhSmJ8g=E^9r-OGj>OeCq7`*)V!`lXn2qjm;*Taf#40aD6`ea04&^LE*=8_&R#z z$NVZzF`a5>*Zd3o1K!FOd!Jy74u1a<7)ddE7*yT-JN;MsilkFhW{gW-VJ7(g3;#3< zPj^>$N;^r_-zLWGa}!M1gqcS*DUYp`s#V!BLo#Ocn$djmH zU>#&!?*8!wnbi!ySH*R#DbhZOi4D!GqG*5na1SqFq)Bv~P`` za4Nh9rY7aQ@8TGXu5+?yT2}C8;9*>lcY74{WPRez!Qj95*`KN`i=fZPSLBPY*LBBC z1@Q<)?}bLU8s;hC7xL<1xY8I+0sVw=$?4373>kia=bx_M1z&= z0x*@@d1+fEZM*ededY}xo@B=g49J=E2M8Y&Z&?g?K%)L)Xepo!!s1k zSRb*-@BU*u5l{!N82_4nb}Ai<^wyw(?PQpg{LHX#fPAc;&o_yt6=6AUhq>QFViu|( zEdv?%7lB=sSh62)#0t1Dk-yzHX@GTtIT`JivRNLx!#s0oQ{~G6tSilK`0NJcrL=o8 zdvmIb@Q8c3Zc{Sb#^tg5+VuWQ_hf&iPfW{$g;hypfnihkr*e)wVvdK?TAh5piSt!x z<#t1k9!n-1*BNcPI8z!pR z6)P}!VwwKeMw}5$zy8ZuyPVGT&{zMHM_bUbQf5jA9~79c*E3}y!XhD+qraGG{vK3- zyf&=7^ffYUJ|Fh2zcE$cpm3|<_=&%^a-g3!^XV^qh(UnRI_h8O&Xe!(O7}nVE5)At z%cVdHGDN& z1@x1~G8^}&KI`Gsx{6MXe(R`74xm*|v~tLCPcwZ^n@~>6ot+-l#a)nxhuHh|Q`x{B zr7cBVHfD0jS#|`^*|8o~>n@hK(5${)MBbc>%xu>;-%Id-fy|~iG>_|mMl$k6^CLU) zrdIyPb)c0=a$OW7as@T(JKmBT&>SGhn9>H=K$ZBe%#P%+B_7FfUebW%F%bbja+|&* z*XkA;oFW1}{>d+ZaOgnKMV^V`g>0!FkdY`0A3h;-xc6u{ePViNJykBC%WY-=IWjyX zE-Q=<(QoZc-d?G1HS3cb))N{zK1wj|(c@n~8>~Lae1>umo|i!6w5%jmtb~CRL43U% zLdQTK+DVpbSr?Ch^?i@yi%==v`4Po=fOj!&egxJ0ElU-3vYgF@I$7knMD6CVuk?9m zvk&y`X0q4yd1tU^_U)#zhodA?*`3oJ`W2%jdv(z>PZFY6?>;#KIdQ4J$aOkOZu0z! zUur5|$O!?RVmJP0a7mAl3fwWs!A%^EtB+jByNn+Xb;iLYFY58$;tmGvgEM4XD$jgy zYzNzcCs~LsQf1J5p0j5;Uf0KLVyg%&ZY<-8N4+3#fN-8MdU6<_x|&I73UgpPI_np2uN6TiP&n$2*Js z-V?oLsGefuGn_ZLE|!$$&+Va;$hC0+EUjfsa4QO;d&3)blb${)CBw`ToqbOO{ zb#R$nmu8{9{;31Kfw_-daW61ly{-2ztN**MZ2O(vVroBw9|1o=-4jtTJ|%YyXin5M zYmppS6xy4cMd2F!O@fCB>|Cs!@^_NK;vCs!{8X$}(Xq`v4Jg-0O^?hX3v%@9?`))gK)6cs{jNo%L(z>hl5WZb956n3s|0$IsCgIXp%NIcv(L zO3b|n=+cjUN^oWGoGqq3>*I((sMVjky_o$9>-Ex!9zN(qkB=w5yg#?3@?Q&|?ip?f zaRIYHfISrSqhZh_FPq3Qp9ahhy)ZXG|EID>CAj=ma3lYW#m@ z9T8>$&Qv#>&FFpI#dc!GejWQZ@-gi!`1T4iwF@=b1+^z_=xv@g#J1bD{tb3N_%dv~ zLwN$!-mZ9(Xp|H8jj4E^&Dnig4v^&Szg5xVRsAMQl*H_NufRx2RlLzoe4Pv+tHFc4 zcPH2zcK>GarsImRU>*Jc`KQt#_gH`B{Do_R<8vn;sG(09`~+=J@_l$#Qk;8iKz%;| zM&8mtU?hKkA#oulHF7)o3Wdx6=aTisMBlo zl@+_IyXU6?{~C(&x?hlhQf>>#-9bi!ju9wWeL%-Hk`{E_io#a}bZjD%f{wFL!G!?} z7$jTJaR>^Q9e_h4GXsz9Q268k+BM{Zz+-h(a6$mr3bOcI^sKnxWXY=>@cZ*T?%lBr zDmX5nV;PzH?wAV|92KCtgp_@EOoj^naQr?u&~`*Az&R&ZYNRuLeYO}VI+Rsl;H%%V zYVF}4C(QvehC>0-iZG)Nm|dCb{6Ffa1M}Ov>AS;4aMU~Cgxk2}qH>RJb4wL~HlV?` zq4CfOA!PAjbu?`4uSUx&wi`nYYT$=u>c49P|ET=wl_fK&dNU7Fn6p&Syd#NVce>T6 z)7pA5H@Ckr?I1RhAIXw0pY#Zkq6Je7eR(w3_s;^3Qac@!SAWFi(sVp+i`YR?##@E2 zTq+;x%gVM!aI_VR)y?%a1w?fz_mTVtDDMah$_ndW-qigZFo+GN(|sYiQwA$nFpYd; z1r%>bG$|TuLqZJde}9r9GQSlua_T0Q zGTJl=@LqZipzJm3%FNfB@-gSZ4s`?wu@dvnVh{0hEr6z`ve2e3+#CMvS45p{c_P=w zTZ0HACaqzlZPRl^rrZ#ZgLnF;rtRWxMZ}6XNmNVgLqul%!7|D%Dt&I~fCqbPzJd>*!a}i%H;z4!u=O0}!q9h* zMssdOr3M6`dyD@(!eR+G5DL*pcjy9c9^5`@WVp9ZA8~=vAnbX7tIaNpJ|8 zjg5(uzF+;dj%SXPFTdT0GXS$&^VqCj*2`0Ob;+wtAgy&bV;KqB$I2CCg9MvT(7SIo?-{eG@74894wgj8iK6ph3h+H8B|8c zIUrrLo8`T9WtTFXldhC=jQsYi+MX?G07{-Ma zUTY(MYo0X0apSJFlQ;=ymFgKT7gZPdmRB+7yeDN7=QHX86yN54{e`21y9XeK4`hD0 z5!cw;oda~y0r8oMEkTi454-#9^Z%yg9C*oI{$Ak@{-)qQo$WPFM>tlax7k@L-MST) zBrpaWec87Q(oxg=X(62B2HXB|7{~7Xy~_F#TFe4HnWdNMX%UqlEH39RtQ_+%Hpm|W z_5U}E$S5{lsQ;2#u?ub(wkX!ruFTcQ(2aAo3ebxz9vjJFIart&u_#)lKicP6v8&C! z#LeJ}8V)aOl&eAd3;EFsrWdl-LI~vJy8X|$GVP&OnL=M1H3N5|QsZ5J)?79#-;UG1 zp?IJmME!jI??z!8w_$BTVRW!nYskc^U^8-PFcWvV2&-?Bf62CanRK=>Rel-Ewi&0C zGguTF)fd zdqEn5-AHb<)I-i2hoG)Mn{dl=Wh}b>);^I8~Qt1SU_h*%uV$+}7u{J%5+)6k)a^r!?RsCNA%h{o1jWQ_CADwIk zeASKToyCo&8v&xo{ou(rN+azt;Uv$3o`H0^{5(92dN2=`KBIf-l~=OXPq>#hREqz# zzB`%)iGsr9*MB|1n{UN^{TT{%iO#mjvXkYZTS_qR$~nx6mS*;NtLV+?3h;CvNDJTT zdTrOR`)aY{Yj09|_aMr~wNCbgm2(7`+n1gtJYn>7-xv)>XIfR5bY7jsZUnF96Lx_>-$61a|XC=s^dfj)a zVs`jQ?4(woZ{p}5meN~}T)UtqxwNt~``UV=acl5ULdZj-U>2z$oNku~D6NdrlZN8) zqxV^Jx@X-xl11=VBz07Pw?otF4nqP<^#UxV+7XR5lFE<0Wm&D0!Acp^4eI_$Oi zq>p)M#=)iAqEo^W?pNWO(BRAQ7HXc}j%+sCDp@Zyt{h(JKl(S8<{|+-@k4x<0R*5J3AqwaH%* zE)v_J+m7eAYFTCbJl+8sR5}U#ycQU7wEBJYKLgXw^u!wUs<@t&*w?M(mM5{=DN05g z2&}6>;p}kIaAx&a=f2zF#_OT=`-Gz^U9)&5j(ZK(v(hWuj>BULS94epaf1mc6c?7OXxgSz6kO&ttg#+ zKiUQVn|FXX_QVyOWyGD3w^YogF`BW`zj@w%t5WgJ;5FYk$`8F`FQ-p|nAbgW)^RB-IS;apoq}c2!j|v8?B!2%JVLhs;^a?+92yIPJBmVFke+dYY%TZsdgBU= zn&r{Vm?yRg7R^~OyO4z0$Z4ig6lPDzXAm^jCj=an9a}2*83g8bD#3Vrw;uy?zBt&1 zi-MT&QTi2m_%ZsCJ_&UCWRrNW+vD=wTnB}*uzdD?nuBvnpTQ1@CVV}uJm+`dNff(L zq>Ra0n#aLvBfHc?aHT}9dO6z+EmWL$RC@vPg)DA1EM>uc(4#&=0jIM*;4^fq#VuAM zSNjwv z1NHmVMjgOx#Ctl99dUH-w*<-#X(erP&2Q+EIPXBfHyf ze|qLi0=@}xx=4YekB)vV6a{GHALr?n=-2;7;5vW31ksdoL9AUi2I2yfrUQG{Znwlq z9CEH5t2n59%xO`DXPGJ`T=J~N>O-_JBcp5lniCB9R6KRpZNhVSZA28JNrApYUjQ`u z&bxf0^cZ_zPP~IJQ?Q~!XvlxcF}3w+65n`!$K@}miRG)R-&k#WT;-sX8^e@WJ_>w4 zLihUF-;P_b50|38tjKs8$Ph-d9jC^(dz|k)3eR63Ys&lm{!-tU;&LIc8^brs;>*sV zeo4Zi(-EBmlY*aLC;Si}uH-MC5NF@1_@To_luz}p<`DXEeLL0&0rhdJGHL6mhJEv#=wC{ z18}NQHmzsyBO0SmqL@b0zzLk?{n9uczPJ3cK{Yb)_eM(~;EBIj+MD!VE`e$mSc>U$%~6sg6<^-y&bJb1{*!IV{jcm_fq&QEleE)zL|Nr{4qDDo=>7G< zM8dm3ix2)j{U`XIEri0%df=3%sf+XnttEt>Gh8)Hw%e{VdWq^i`2~s7V((v}A8jA~ zC_KUyA=fw~_}eH*mpJ}j`^Rwp;5}ssO-EE1^WA;xAJu_56qQVbGnJ%UoVD>&0kbk~#F5cV7&Z4yke@5b@qdSuF1oR`R{4D!;5-y7) z-$AwSi=LgJDy_m={WG0lq%F-RJ@!WqO1}Je;zYU+~Q?p6j=dV1Qg~_`GyV9m0 z?%|{=JU*VSR%`)t@AwDj6n{|W9^UVo#swEmMSagXe;&k~+!<&(72?Z<^HUysBap@S z7OQi-WWD8WcbRe^Kk@@H(&rppIdV2x!?vs>wH?wp0%_qqQ}gOideUIKcjwiXuCk#! ztj{@_R;EcTjwSx*Hwn>&@3isT3oQ;0&r(Y}ePXJl-!cU!v#X@rJbX?Mvjq6>rBrC9 zwwF^HN^nC|W(UB4R7)IT!KRZ-&oD=N$8Wh)oJg(Aq<>-AeEw-rEx=!x!hc83IVy;E zB){rWEYq6D`b55=^J@_rKi;YQ#T`6qlb6rR=~2M6YZei)rtf)p;KIR$oQm_&^5BE@ea>lwX7_O zo;@XpSCu}Wj>!i_9mMQdIAWMNX%KDe>83KE=9`Zbd$=;0l50mrKp zuSm81LYTLs3j3cb4YJjGyRJ)#1SAU zI1R0NnpI@^v2{_zs?I;SFtbW(lX>}Jup@vUmYJyN#QZw&M*noh!VgsCCv8*9-L`9v z02$+;2MXb0%9|RWvl{?U>b#vv*SpU28A>!w~!;sd0F0<|T>`ltbvyfKkPNvAOZyd^2vc#CV1a;rdBKCYTLSjQW zX6QZQ{iEiUvq8(RRh@GF4oLF8HkqwNo6^UZS{-nlzc6V``fUw( zNHwL``sr5!=2mK+=vE!Oxz^%C zb(5j{$ndW>kUErNE?Gh zDh1!H_Q;~1&7bt&+>UJhLd>k(f$9#D_{ZgzCBB=>UBVRnbA~n3Qi@Vl?n68s_m-mK zS;&o;8~^8qY||AMspK{l|>K26A8gPck>)MJ}NG^LO0jF(pXtRQH*ZU`-#2V$pTNv|2&WFJIwFyb~Qy z1Kb!JU+I! zoP%&Wg>`l{S*@anmaT(~^dt^lv5DH9L-a8(t?KnYmdg=ef!P_de*4xV_M;ZO(Lu+6c-eztEcj!#6$IPA7*^X9 zFlrC|lKUO?H>F-oV{$39>cM9*L+fEWW^XxjFD%2~AN_WD?^9KimADiE;?N2KAU{ur zu9{59JEBgjId%LmqQ*=`xjCw430tl`ciYK7uT*fEC-?J5xyyv{CGYDb&VN|7)3rR0 z1XM4cyk2T|GXr9aoLa`-X@Bj}5`xPN|FLi=yssS3@zGWNg{+@tUVvFTHq*HEU5D;Y z_4xHENNHFR38Gxtvl<$BphGo&19rCIw(v$IR&wMtQi^N*dKSwUrsY|*)5(26V|}a9 zfK7I3bEDOWjY9VFiDtxG&UJEbYWA~|&l7d63fPGH_QyVjn76LfxM|Z;sTc5^nF5ye zyO#c##MU1pH$>+5J)M5-P@!4}BxYS>yf)x|E__-}FMk<@KHomNk@dCprO~L zCXj2M_wORdwGZ8v`ek$q?yPHTr0<-5{B- zW^ye)U#j#%FlWa_-d^7>=z${S(erBMJ2gh)$-}$i>~ukjaP-dO`v?mrT0W&E7WN>~_qgNn)}6ZdCHZS4 z`N)^KSswXgou*#*KS%n=H!tHr%S%xAFDc=fbMAf<=lz{B7@2kd%^a%B#uQEaO#50S z&aXEic@jBMdv;*`X~KH$K61Cwcwi<~dt)9uxTi4WJKZ^%mAKjaB!GN|Zh8lGf{;%q zEvWDwgGO%P8bdaD9cH_*J(1N|jts%MmV6FfIC{NP!iA7CkSQcokkZ}p$=v>R_gs^a-JYw~=OJZQ1?{uo~5j`OVl znePZzPt3ku8DY%kj-BRejg!TCUkrYqjw*Vm1JnX)Y3-lJ1B5aWidGMh5U-?RNym3_ z%2w%yawxA5c2XGX&z%hDUrl7tx4A%BKj(S9*I+u2j~Moq zd2X|y?A0z_i27eE3fDwbV70)+k7i*`DPF!5&)2%IPZ-Sz$FZFmR@@Ic+?zKK2^mJu zpR->FIxw28iv^aP`wmYLp6ts!5mODAtvx@VLAMR1x)1Zc3_+m>WSLk0a;t*5#RK*k zPfm1SXI4G5(YIA0fBKDn&bs;`pDH*ofyQwUm?BW;=(Io1^Gwsc6U}oDxLn`Las*_> z?J}?YeZD&ZZFe$wGOMb4Et8ZmbcLnTnN|Hu9~p-Fk~KsF`O(I_e0=SJ zeRNhc@A*PAgA-PUit~1sUd!z6oxf)-e&1I+&%VAO?Q+3dta4Jb$Fu8rAG|N!AioN0 zzL#3l?XH7Qk3WrUHn zk+jAl?eb;|t7|i~&%T!b%;KTw8xhNU^9;4dZVyUiumoEdU`W7YWMm6kn;G-MOGqmi+)WPXn4HjaZO}{pP&#Iqm`H#!( z$_i;+4xJ0_H?B!aNA11`1PRtnu%9>CdFUBBh6n;mf}sLsgN8A0IRo@wIwq9;ak5`kUsNp_p4@Tp?99UH)84{LMo+)6=|wj*recs~?XnsmC?sWZBKCu~ zP7`{Gc08&ZbXo(a12pDvr(`xph(P$I1^l}yx_-~jKN&9!w1l~1Bh4)6tR!2e048^7jPM<{_Sa3TKG*fbkiPqPWpE;3-mnFY;HudH@V~DE#VV1?_K5q z@`d)TPYAO&`=6U#2*BT%pqR+=3STDLOxUMW4{*IJlIBi1 zsXjk$F8U?;z<(2$!7z|zejx>Qtr`5Zc3B8`ExiBw#4{*GS~?}Y=DgK9$swH$&~{z} z2okPy2)^Wo-?VUQ)ep2WdNahbKH^a#k06x3G zL;Gq6y&P2(mor2G32!e#5YqP35&0zb@(GobkAM~ zQu<5E?5>J~-gigA;I6}wAG{M3Np`#wWpfnp%lGgIOY}sL-Y!iRh*0(3dy z^4BYOG!?mg0sm#`G`5%cqi8x~We+?q-8`M~@KUw82u_i784V?G9IRMNC2yRjNw*)c zTg`a0m9}TrTr?|LoI=p^v6X`cLC@00o``dD_!}!UVy^=wjWlIhBi#N+19|}5FTFOM zHhS{5UwR`&zNu&6*m}a_F!USVeC{>B|ZJ>$CY7U&EmY-hr2PH_iA~PNIJh=vI&`l6_Kv?H%7K-xRY&ZSxXS(p-gYZsWjc0 zk#G80S-a$k3Fy!Eai=xlv{e3L|YPo?}{A)m^p)$OSke}xD) zsy-5yq@CVNY<2&Gi6#2x>G$TlcB^k;<&r!h z0Z?f^Q>Ao<#8u0>2hN-di@`Y*OHYNOvB1YW_JcR19OlTZWKl1F@!0{jW+Y;DC ztEXU=<-*MAA2@AE^<>-k(tYIVvFcXf#zh9zrS!hnP?c`Tso~}XVQbP0l|xtV-@n%S4D4WpwKwHLi0UC$LusvT zG%M9Q_uP0f=%Z((+sN>7!N9%H@vJQ~2A?lf_x^T5uRbE-fL!6jO=o*{6sFdBHUh3J(UJ$Uzm=ad>7JLkr(7*i4RB%2;N48K zOFNGdNCO7k0AP7h0tot9NV_y8vj9O#3 z*n#S)n=k7WePl+SHEG)YgFqL?e#Z~w`S5%RdB0B{}A1}RYmLpU`ZmXV)Q3JP76 zgV+#JDG;5}Da>ulgd9t!kxu#&PP+*QL%`VD;QF(A2Ak;VjZ;Qy8^>eO=&|^>dvcDz@GDq*}D?Im>2QZ>=? zfyO1v#+_>+Q~h#AUcyThuJo8px@t^y;(c2WRG@dX$t4E@hOX4yQ-%h9As z6l3gM=JP!#ltPMvg}tbPTld!A|4U^(#wga)Ua2t^=1CyT(Gf-^bwHk7%A#l}aPb<;%0`sEdYaiG%NG>C=!(V33>cJ}3Uebm#h9 zL+$0sk@s&4?6n3DYXBTM2Ef`jRsVr@1Z(-@vjuCnJh7D9r-U=qp6?$hv|jAA4nsQ% z;LTe*hyFn4(6Vbc4g%O#ER& zkHMwhHT_VaN%^({vxOtPc}B2xn8TJZ=rr*UW+M!mzL@yiWZF2w8z{@STTI_2*^HEV z)NWa<^0wyuCJbhmGPi?d2ygdBdDd>h|LFN6SzG&{Rx7fzhnw?y{v#@ZNj6oY^Kam# z&6(S$3_oU}2ES$J4oi2PT2(k;gjXwsSFV9EHo2$Iwp)B#enEAe34=#gui+1Xu{P0r z9yMDAyCVL0f#%;()x)Nl!{QC5)}4ce*YNBy!sfkFez7(Irfs7(0k$si>~>~^pYz?y zm%)S=T)=W0@ZPB6q=!qx^r012#e*xTc$gN$o6Lr+@F}n|-m${An3(rBP*_^Mg;#MN zh&BjW7W=hKLY<|XSoZ0Dw+=x8?k+F{B@*ICi!9wYNtbA?PkhW)4=n&0s~9JeM30^s zbJf4-6{v&XTOU0GZr2U9Fb!(j6&-12PI0=#ju)Iwg}9WTx;DU^sJ^k$PX|&d=k4Ds z>rE^klUcLsJdE88ZMVjL;(Xbfcc℞(g?vg+rD6+-TaKI@e28h|OE@BWMs*de~to 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 - } - - /** - * @brief Stores pending event result - * @note This is almost same as changing result via event handler but this one violates semantics - * - * @param type Result type (See ActionResultType) - * @param action Action - * @param priority Priority - * @param reason Reason - * - * @error Invalid action passed - * @noreturn - */ - public native void StorePendingEventResult( ActionResultType type = CONTINUE, BehaviorAction action = INVALID_ACTION, EventResultPriorityType priority = RESULT_TRY, const char[] reason = NULL_STRING ); - - /** - * @brief Gets action name - * - * @param destination Buffer to store name - * @param maxlength Buffer length - * - * @error Invalid action passed - * @return Number of bytes written? - */ - public native int GetName( char[] destination, int maxlength = ACTION_NAME_LENGTH ); - - /** - * @brief Simple wrapper to get action data - * - * @param int Offset to data - * @param type How many bytes read (See NumberType) - * - * @return Stored data - */ - public any Get( int offset, NumberType type = NumberType_Int32 ) - { - return view_as(LoadFromAddress(view_as
(this) + view_as
(offset), type)); - } - - /** - * @brief Simple wrapper to set action data - * - * @param int Offset to data - * @param data Data to set - * @param type How many bytes set (See NumberType) - * - * @noreturn - */ - #if SOURCEMOD_V_MINOR < 11 - public void Set( int offset, any data, NumberType type = NumberType_Int32 ) - { - StoreToAddress(view_as
(this) + view_as
(offset), data, type); - } - #else - public void Set( int offset, any data, NumberType type = NumberType_Int32, bool updateMemAccess = true ) - { - StoreToAddress(view_as
(this) + view_as
(offset), data, type, updateMemAccess); - } - #endif - // ==================================================================================================== - // ACTION PROPERTIES - // ==================================================================================================== - - /** - * @brief Property to get/set parent action - * - * @return Parent action - */ - property BehaviorAction Parent - { - public native get(); - } - - /** - * @brief Property to get/set child action - * - * @return Child action - */ - property BehaviorAction Child - { - public native get(); - } - - /** - * @brief Property to get/set "under" action - * @note if we are suspender then this will return a suspended action - * - * @return Under action - */ - property BehaviorAction Under - { - public native get(); - } - - /** - * @brief Property to get/set "above" action - * @note if we are suspended action then this will return a suspender - * - * @return Above action - */ - property BehaviorAction Above - { - public native get(); - } - - /** - * @brief Property to get actor of action - * @note returns 0 if action hasn't been started yet - * - * @return Action actor - */ - property int Actor - { - public native get(); - } - - /** - * @brief Property to get/set suspended state of action - * - * @return true if suspended, false otherwise - */ - property bool IsSuspended - { - public native get(); - public native set(bool suspended); - } - - /** - * @brief Property to get/set started state of action - * @note if this returns true then OnStart handled has already been called - * - * @return true if started, false otherwise - */ - property bool IsStarted - { - public native get(); - public native set(bool started); - } - - // ==================================================================================================== - // ACTION PRE EVENT HANDLERS - // ==================================================================================================== - - property ActionHandler OnStart - { - public native set(ActionHandler func); - } - - property ActionHandler OnUpdate - { - public native set(ActionHandler func); - } - - property ActionHandler OnEnd - { - public native set(ActionHandler func); - } - - property ActionHandler OnSuspend - { - public native set(ActionHandler func); - } - - property ActionHandler OnResume - { - public native set(ActionHandler func); - } - - property ActionHandler OnInitialContainedAction - { - public native set(ActionHandler func); - } - - property ActionHandler OnLeaveGround - { - public native set(ActionHandler func); - } - - property ActionHandler OnLandOnGround - { - public native set(ActionHandler func); - } - - property ActionHandler OnContact - { - public native set(ActionHandler func); - } - - property ActionHandler OnMoveToSuccess - { - public native set(ActionHandler func); - } - - property ActionHandler OnMoveToFailure - { - public native set(ActionHandler func); - } - - property ActionHandler OnStuck - { - public native set(ActionHandler func); - } - - property ActionHandler OnUnStuck - { - public native set(ActionHandler func); - } - - property ActionHandler OnPostureChanged - { - public native set(ActionHandler func); - } - - property ActionHandler OnAnimationActivityComplete - { - public native set(ActionHandler func); - } - - property ActionHandler OnAnimationActivityInterrupted - { - public native set(ActionHandler func); - } - - property ActionHandler OnAnimationEvent - { - public native set(ActionHandler func); - } - - property ActionHandler OnIgnite - { - public native set(ActionHandler func); - } - - property ActionHandler OnInjured - { - public native set(ActionHandler func); - } - - property ActionHandler OnKilled - { - public native set(ActionHandler func); - } - - property ActionHandler OnOtherKilled - { - public native set(ActionHandler func); - } - - property ActionHandler OnSight - { - public native set(ActionHandler func); - } - - property ActionHandler OnLostSight - { - public native set(ActionHandler func); - } - - property ActionHandler OnThreatChanged - { - public native set(ActionHandler func); - } - - property ActionHandler OnSound - { - public native set(ActionHandler func); - } - - property ActionHandler OnSpokeConcept - { - public native set(ActionHandler func); - } - - property ActionHandler OnNavAreaChanged - { - public native set(ActionHandler func); - } - - property ActionHandler OnModelChanged - { - public native set(ActionHandler func); - } - - property ActionHandler OnPickUp - { - public native set(ActionHandler func); - } - - property ActionHandler OnShoved - { - public native set(ActionHandler func); - } - - property ActionHandler OnBlinded - { - public native set(ActionHandler func); - } - - property ActionHandler OnEnteredSpit - { - public native set(ActionHandler func); - } - - property ActionHandler OnHitByVomitJar - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandAttack - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandAssault - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandApproachV - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandApproachE - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandRetreat - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandPause - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandResume - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandString - { - public native set(ActionHandler func); - } - - property ActionHandler IsAbleToBlockMovementOf - { - public native set(ActionHandler func); - } - - // ==================================================================================================== - // ACTION POST EVENT HANDLERS - // ==================================================================================================== - - property ActionHandler OnStartPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnUpdatePost - { - public native set(ActionHandler func); - } - - property ActionHandler OnEndPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnSuspendPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnResumePost - { - public native set(ActionHandler func); - } - - property ActionHandler OnInitialContainedActionPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnLeaveGroundPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnLandOnGroundPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnContactPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnMoveToSuccessPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnMoveToFailurePost - { - public native set(ActionHandler func); - } - - property ActionHandler OnStuckPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnUnStuckPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnPostureChangedPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnAnimationActivityCompletePost - { - public native set(ActionHandler func); - } - - property ActionHandler OnAnimationActivityInterruptedPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnAnimationEventPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnIgnitePost - { - public native set(ActionHandler func); - } - - property ActionHandler OnInjuredPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnKilledPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnOtherKilledPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnSightPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnLostSightPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnThreatChangedPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnSoundPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnSpokeConceptPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnNavAreaChangedPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnModelChangedPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnPickUpPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnShovedPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnBlindedPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnEnteredSpitPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnHitByVomitJarPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandAttackPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandAssaultPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandApproachVPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandApproachEPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandRetreatPost - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandPausePost - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandResumePost - { - public native set(ActionHandler func); - } - - property ActionHandler OnCommandStringPost - { - public native set(ActionHandler func); - } - - property ActionHandler IsAbleToBlockMovementOfPost - { - public native set(ActionHandler func); - } -}; - -// ==================================================================================================== -// PL NTV -// ==================================================================================================== - -public Extension __ext_actions = -{ - name = "Actions", - file = "actions.ext", - autoload = 1, -#if defined REQUIRE_EXTENSIONS - required = 1, -#else - required = 0, -#endif -}; - -#if !defined REQUIRE_EXTENSIONS -public void __ext_actions_SetNTVOptional() -{ - MarkNativeAsOptional("ActionResult.GetReason"); - MarkNativeAsOptional("ActionResult.SetReason"); - MarkNativeAsOptional("ActionResult.type.get"); - MarkNativeAsOptional("ActionResult.type.set"); - MarkNativeAsOptional("ActionResult.action.get"); - MarkNativeAsOptional("ActionResult.action.set"); - MarkNativeAsOptional("ActionDesiredResult.priority.get"); - MarkNativeAsOptional("ActionDesiredResult.priority.set"); - MarkNativeAsOptional("ActionsManager.Create"); - MarkNativeAsOptional("ActionsManager.Allocate"); - MarkNativeAsOptional("ActionsManager.Deallocate"); - MarkNativeAsOptional("ActionsManager.Iterator"); - MarkNativeAsOptional("ActionsManager.GetAction"); - MarkNativeAsOptional("BehaviorAction.StorePendingEventResult"); - MarkNativeAsOptional("BehaviorAction.GetName"); - MarkNativeAsOptional("BehaviorAction.Parent.get"); - MarkNativeAsOptional("BehaviorAction.Child.get"); - MarkNativeAsOptional("BehaviorAction.Under.get"); - MarkNativeAsOptional("BehaviorAction.Above.get"); - MarkNativeAsOptional("BehaviorAction.Actor.get"); - MarkNativeAsOptional("BehaviorAction.IsSuspended.get"); - MarkNativeAsOptional("BehaviorAction.IsSuspended.set"); - MarkNativeAsOptional("BehaviorAction.IsStarted.get"); - MarkNativeAsOptional("BehaviorAction.IsStarted.set"); - MarkNativeAsOptional("BehaviorAction.OnStart.set"); - MarkNativeAsOptional("BehaviorAction.OnUpdate.set"); - MarkNativeAsOptional("BehaviorAction.OnEnd.set"); - MarkNativeAsOptional("BehaviorAction.OnSuspend.set"); - MarkNativeAsOptional("BehaviorAction.OnResume.set"); - MarkNativeAsOptional("BehaviorAction.OnInitialContainedAction.set"); - MarkNativeAsOptional("BehaviorAction.OnLeaveGround.set"); - MarkNativeAsOptional("BehaviorAction.OnLandOnGround.set"); - MarkNativeAsOptional("BehaviorAction.OnContact.set"); - MarkNativeAsOptional("BehaviorAction.OnMoveToSuccess.set"); - MarkNativeAsOptional("BehaviorAction.OnMoveToFailure.set"); - MarkNativeAsOptional("BehaviorAction.OnStuck.set"); - MarkNativeAsOptional("BehaviorAction.OnUnStuck.set"); - MarkNativeAsOptional("BehaviorAction.OnPostureChanged.set"); - MarkNativeAsOptional("BehaviorAction.OnAnimationActivityComplete.set"); - MarkNativeAsOptional("BehaviorAction.OnAnimationActivityInterrupted.set"); - MarkNativeAsOptional("BehaviorAction.OnAnimationEvent.set"); - MarkNativeAsOptional("BehaviorAction.OnIgnite.set"); - MarkNativeAsOptional("BehaviorAction.OnInjured.set"); - MarkNativeAsOptional("BehaviorAction.OnKilled.set"); - MarkNativeAsOptional("BehaviorAction.OnOtherKilled.set"); - MarkNativeAsOptional("BehaviorAction.OnSight.set"); - MarkNativeAsOptional("BehaviorAction.OnLostSight.set"); - MarkNativeAsOptional("BehaviorAction.OnThreatChanged.set"); - MarkNativeAsOptional("BehaviorAction.OnSound.set"); - MarkNativeAsOptional("BehaviorAction.OnSpokeConcept.set"); - MarkNativeAsOptional("BehaviorAction.OnNavAreaChanged.set"); - MarkNativeAsOptional("BehaviorAction.OnModelChanged.set"); - MarkNativeAsOptional("BehaviorAction.OnPickUp.set"); - MarkNativeAsOptional("BehaviorAction.OnShoved.set"); - MarkNativeAsOptional("BehaviorAction.OnBlinded.set"); - MarkNativeAsOptional("BehaviorAction.OnEnteredSpit.set"); - MarkNativeAsOptional("BehaviorAction.OnHitByVomitJar.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandAttack.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandAssault.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandApproachV.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandApproachE.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandRetreat.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandPause.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandResume.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandString.set"); - MarkNativeAsOptional("BehaviorAction.IsAbleToBlockMovementOf.set"); - MarkNativeAsOptional("BehaviorAction.OnStartPost.set"); - MarkNativeAsOptional("BehaviorAction.OnUpdatePost.set"); - MarkNativeAsOptional("BehaviorAction.OnEndPost.set"); - MarkNativeAsOptional("BehaviorAction.OnSuspendPost.set"); - MarkNativeAsOptional("BehaviorAction.OnResumePost.set"); - MarkNativeAsOptional("BehaviorAction.OnInitialContainedActionPost.set"); - MarkNativeAsOptional("BehaviorAction.OnLeaveGroundPost.set"); - MarkNativeAsOptional("BehaviorAction.OnLandOnGroundPost.set"); - MarkNativeAsOptional("BehaviorAction.OnContactPost.set"); - MarkNativeAsOptional("BehaviorAction.OnMoveToSuccessPost.set"); - MarkNativeAsOptional("BehaviorAction.OnMoveToFailurePost.set"); - MarkNativeAsOptional("BehaviorAction.OnStuckPost.set"); - MarkNativeAsOptional("BehaviorAction.OnUnStuckPost.set"); - MarkNativeAsOptional("BehaviorAction.OnPostureChangedPost.set"); - MarkNativeAsOptional("BehaviorAction.OnAnimationActivityCompletePost.set"); - MarkNativeAsOptional("BehaviorAction.OnAnimationActivityInterruptedPost.set"); - MarkNativeAsOptional("BehaviorAction.OnAnimationEventPost.set"); - MarkNativeAsOptional("BehaviorAction.OnIgnitePost.set"); - MarkNativeAsOptional("BehaviorAction.OnInjuredPost.set"); - MarkNativeAsOptional("BehaviorAction.OnKilledPost.set"); - MarkNativeAsOptional("BehaviorAction.OnOtherKilledPost.set"); - MarkNativeAsOptional("BehaviorAction.OnSightPost.set"); - MarkNativeAsOptional("BehaviorAction.OnLostSightPost.set"); - MarkNativeAsOptional("BehaviorAction.OnThreatChangedPost.set"); - MarkNativeAsOptional("BehaviorAction.OnSoundPost.set"); - MarkNativeAsOptional("BehaviorAction.OnSpokeConceptPost.set"); - MarkNativeAsOptional("BehaviorAction.OnNavAreaChangedPost.set"); - MarkNativeAsOptional("BehaviorAction.OnModelChangedPost.set"); - MarkNativeAsOptional("BehaviorAction.OnPickUpPost.set"); - MarkNativeAsOptional("BehaviorAction.OnShovedPost.set"); - MarkNativeAsOptional("BehaviorAction.OnBlindedPost.set"); - MarkNativeAsOptional("BehaviorAction.OnEnteredSpitPost.set"); - MarkNativeAsOptional("BehaviorAction.OnHitByVomitJarPost.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandAttackPost.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandAssaultPost.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandApproachVPost.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandApproachEPost.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandRetreatPost.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandPausePost.set"); - MarkNativeAsOptional("BehaviorAction.OnCommandResumePost.set"); - MarkNativeAsOptional("BehaviorAction.IsAbleToBlockMovementOfPost.set"); -} -#endif \ No newline at end of file diff --git a/scripting/include/json.inc b/scripting/include/json.inc deleted file mode 100644 index a3ace6e..0000000 --- a/scripting/include/json.inc +++ /dev/null @@ -1,813 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * sm-json - * A pure SourcePawn JSON encoder/decoder. - * https://github.com/clugg/sm-json - * - * sm-json (C)2022 James Dickens. (clug) - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, as published by the - * Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program. If not, see . - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or . - */ - -#if defined _json_included - #endinput -#endif -#define _json_included - -#include -#include -#include -#include -#include -#include -#include - -/** - * Calculates the buffer size required to store an encoded JSON instance. - * - * @param obj Object to encode. - * @param options Bitwise combination of `JSON_ENCODE_*` options. - * @param depth The current depth of the encoder. - * @return The required buffer size. - */ -stock int json_encode_size(JSON_Object obj, int options = JSON_NONE, int depth = 0) -{ - bool pretty_print = (options & JSON_ENCODE_PRETTY) != 0; - - bool is_array = obj.IsArray; - - int size = 1; // for opening bracket - - // used in key iterator - int json_size = obj.Length; - JSON_Object child = null; - bool is_empty = true; - int str_length = 0; - - int key_length = 0; - for (int i = 0; i < json_size; i += 1) { - key_length = is_array ? JSON_INT_BUFFER_SIZE : obj.GetKeySize(i); - char[] key = new char[key_length]; - - if (is_array) { - IntToString(i, key, key_length); - } else { - obj.GetKey(i, key, key_length); - } - - // skip keys that are marked as hidden - if (obj.GetHidden(key)) { - continue; - } - - JSONCellType type = obj.GetType(key); - // skip keys of unknown type - if (type == JSON_Type_Invalid) { - continue; - } - - if (pretty_print) { - size += strlen(JSON_PP_NEWLINE); - size += (depth + 1) * strlen(JSON_PP_INDENT); - } - - if (! is_array) { - // add the size of the key and + 1 for : - size += json_cell_string_size(key) + 1; - - if (pretty_print) { - size += strlen(JSON_PP_AFTER_COLON); - } - } - - switch (type) { - case JSON_Type_String: { - str_length = obj.GetSize(key); - char[] value = new char[str_length]; - obj.GetString(key, value, str_length); - - size += json_cell_string_size(value); - } - case JSON_Type_Int: { - size += JSON_INT_BUFFER_SIZE; - } - #if SM_INT64_SUPPORTED - case JSON_Type_Int64: { - size += JSON_INT64_BUFFER_SIZE; - } - #endif - case JSON_Type_Float: { - size += JSON_FLOAT_BUFFER_SIZE; - } - case JSON_Type_Bool: { - size += JSON_BOOL_BUFFER_SIZE; - } - case JSON_Type_Object: { - child = obj.GetObject(key); - size += child != null ? json_encode_size(child, options, depth + 1) : JSON_NULL_BUFFER_SIZE; - } - } - - // increment for comma - size += 1; - - is_empty = false; - } - - if (! is_empty) { - // remove the final comma - size -= 1; - - if (pretty_print) { - size += strlen(JSON_PP_NEWLINE); - size += depth * strlen(JSON_PP_INDENT); - } - } - - size += 2; // closing bracket + NULL - - return size; -} - -/** - * Encodes a JSON instance into its string representation. - * - * @param obj Object to encode. - * @param output String buffer to store output. - * @param max_size Maximum size of string buffer. - * @param options Bitwise combination of `JSON_ENCODE_*` options. - * @param depth The current depth of the encoder. - */ -stock void json_encode( - JSON_Object obj, - char[] output, - int max_size, - int options = JSON_NONE, - int depth = 0 -) -{ - bool pretty_print = (options & JSON_ENCODE_PRETTY) != 0; - - bool is_array = obj.IsArray; - strcopy(output, max_size, is_array ? "[" : "{"); - - // used in key iterator - int json_size = obj.Length; - int builder_size = 0; - int str_length = 1; - JSON_Object child = null; - int cell_length = 0; - bool is_empty = true; - - int key_length = 0; - for (int i = 0; i < json_size; i += 1) { - key_length = is_array ? JSON_INT_BUFFER_SIZE : obj.GetKeySize(i); - char[] key = new char[key_length]; - - if (is_array) { - IntToString(i, key, key_length); - } else { - obj.GetKey(i, key, key_length); - } - - // skip keys that are marked as hidden - if (obj.GetHidden(key)) { - continue; - } - - JSONCellType type = obj.GetType(key); - // skip keys of unknown type - if (type == JSON_Type_Invalid) { - continue; - } - - // determine the length of the char[] needed to represent our cell data - cell_length = 0; - switch (type) { - case JSON_Type_String: { - str_length = obj.GetSize(key); - char[] value = new char[str_length]; - obj.GetString(key, value, str_length); - - cell_length = json_cell_string_size(value); - } - case JSON_Type_Int: { - cell_length = JSON_INT_BUFFER_SIZE; - } - #if SM_INT64_SUPPORTED - case JSON_Type_Int64: { - cell_length = JSON_INT64_BUFFER_SIZE; - } - #endif - case JSON_Type_Float: { - cell_length = JSON_FLOAT_BUFFER_SIZE; - } - case JSON_Type_Bool: { - cell_length = JSON_BOOL_BUFFER_SIZE; - } - case JSON_Type_Object: { - child = obj.GetObject(key); - cell_length = child != null ? max_size : JSON_NULL_BUFFER_SIZE; - } - } - - // fit the contents into the cell - char[] cell = new char[cell_length]; - switch (type) { - case JSON_Type_String: { - char[] value = new char[str_length]; - obj.GetString(key, value, str_length); - json_cell_string(value, cell, cell_length); - } - case JSON_Type_Int: { - int value = obj.GetInt(key); - IntToString(value, cell, cell_length); - } - #if SM_INT64_SUPPORTED - case JSON_Type_Int64: { - int value[2]; - obj.GetInt64(key, value); - Int64ToString(value, cell, cell_length); - } - #endif - case JSON_Type_Float: { - float value = obj.GetFloat(key); - FloatToString(value, cell, cell_length); - - // trim trailing 0s from float output up until decimal point - int last_char = strlen(cell) - 1; - while (cell[last_char] == '0' && cell[last_char - 1] != '.') { - cell[last_char--] = '\0'; - } - } - case JSON_Type_Bool: { - bool value = obj.GetBool(key); - strcopy(cell, cell_length, value ? "true" : "false"); - } - case JSON_Type_Object: { - if (child != null) { - json_encode(child, cell, cell_length, options, depth + 1); - } else { - strcopy(cell, cell_length, "null"); - } - } - } - - // make the builder fit our key:value - // use previously determined cell length and + 1 for , - builder_size = cell_length + 1; - if (! is_array) { - // get the length of the key and + 1 for : - builder_size += json_cell_string_size(key) + 1; - - if (pretty_print) { - builder_size += strlen(JSON_PP_AFTER_COLON); - } - } - - char[] builder = new char[builder_size]; - strcopy(builder, builder_size, ""); - - // add the key if we're working with an object - if (! is_array) { - json_cell_string(key, builder, builder_size); - StrCat(builder, builder_size, ":"); - - if (pretty_print) { - StrCat(builder, builder_size, JSON_PP_AFTER_COLON); - } - } - - // add the value and a trailing comma - StrCat(builder, builder_size, cell); - StrCat(builder, builder_size, ","); - - // prepare pretty printing then send builder to output afterwards - if (pretty_print) { - StrCat(output, max_size, JSON_PP_NEWLINE); - - for (int j = 0; j < depth + 1; j += 1) { - StrCat(output, max_size, JSON_PP_INDENT); - } - } - - StrCat(output, max_size, builder); - - is_empty = false; - } - - if (! is_empty) { - // remove the final comma - output[strlen(output) - 1] = '\0'; - - if (pretty_print) { - StrCat(output, max_size, JSON_PP_NEWLINE); - - for (int j = 0; j < depth; j += 1) { - StrCat(output, max_size, JSON_PP_INDENT); - } - } - } - - // append closing bracket - StrCat(output, max_size, is_array ? "]" : "}"); -} - -/** - * Decodes a JSON string into a JSON instance. - * - * @param buffer Buffer to decode. - * @param options Bitwise combination of `JSON_DECODE_*` options. - * @param pos Current position of the decoder as bytes - * offset into the buffer. - * @param depth Current nested depth of the decoder. - * @return JSON instance or null if decoding failed becase - * the buffer didn't contain valid JSON. - * @error If the buffer does not contain valid JSON, - * an error will be thrown. - */ -stock JSON_Object json_decode( - const char[] buffer, - int options = JSON_NONE, - int &pos = 0, - int depth = 0 -) -{ - int length = strlen(buffer); - // skip preceding whitespace - if (! json_skip_whitespace(buffer, length, pos)) { - json_set_last_error("buffer ended early at position %d", pos); - - return null; - } - - bool is_array = false; - JSON_Array arr = null; - JSON_Object obj = null; - if (buffer[pos] == '{') { - is_array = false; - obj = new JSON_Object(); - } else if (buffer[pos] == '[') { - is_array = true; - arr = new JSON_Array(); - } else { - json_set_last_error("no object or array found at position %d", pos); - - return null; - } - - bool allow_single_quotes = (options & JSON_DECODE_SINGLE_QUOTES) > 0; - - bool empty_checked = false; - - // while we haven't reached the end of our structure - while ( - (! is_array && buffer[pos] != '}') - || (is_array && buffer[pos] != ']') - ) { - // pos is either an opening structure or comma, so increment past it - pos += 1; - - // skip any whitespace preceding the element - if (! json_skip_whitespace(buffer, length, pos)) { - json_set_last_error("buffer ended early at position %d", pos); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - - // if we haven't checked for empty yet and we are at the end - // of an object or array, we can stop here (empty structure) - if (! empty_checked) { - if ( - (! is_array && buffer[pos] == '}') - || (is_array && buffer[pos] == ']') - ) { - break; - } - - empty_checked = true; - } - - int key_length = 1; - if (! is_array) { - // if dealing with an object, look for the key and determine length - if (! json_is_string(buffer[pos], allow_single_quotes)) { - json_set_last_error("expected key string at position %d", pos); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - - key_length = json_extract_string_size( - buffer, - length, - pos, - is_array - ); - } - - char[] key = new char[key_length]; - - if (! is_array) { - // extract the key from the buffer - json_extract_string(buffer, length, pos, key, key_length, is_array); - - // skip any whitespace following the key - if (! json_skip_whitespace(buffer, length, pos)) { - json_set_last_error("buffer ended early at position %d", pos); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - - // ensure that we find a colon - if (buffer[pos++] != ':') { - json_set_last_error( - "expected colon after key at position %d", - pos - ); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - - // skip any whitespace following the colon - if (! json_skip_whitespace(buffer, length, pos)) { - json_set_last_error("buffer ended early at position %d", pos); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - } - - int cell_length = 1; - JSONCellType cell_type = JSON_Type_Invalid; - if (buffer[pos] == '{' || buffer[pos] == '[') { - cell_type = JSON_Type_Object; - } else if (json_is_string(buffer[pos], allow_single_quotes)) { - cell_type = JSON_Type_String; - cell_length = json_extract_string_size( - buffer, - length, - pos, - is_array - ); - } else { - // in this particular instance, we use JSON_Type_Invalid to - // represent any type that isn't an object or string - cell_length = json_extract_until_end_size( - buffer, - length, - pos, - is_array - ); - } - - if (! is_array && obj.HasKey(key)) { - obj.Remove(key); - } - - char[] cell = new char[cell_length]; - switch (cell_type) { - case JSON_Type_Object: { - // if we are dealing with an object or array, decode recursively - JSON_Object value = json_decode( - buffer, - options, - pos, - depth + 1 - ); - - // decoding failed, error will be logged in json_decode - if (value == null) { - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - - if (is_array) { - arr.PushObject(value); - } else { - obj.SetObject(key, value); - } - } - case JSON_Type_String: { - // if we are dealing with a string, attempt to extract it - if (! json_extract_string( - buffer, - length, - pos, - cell, - cell_length, - is_array - )) { - json_set_last_error( - "couldn't extract string at position %d", - pos - ); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - - if (is_array) { - arr.PushString(cell); - } else { - obj.SetString(key, cell); - } - } - case JSON_Type_Invalid: { - if (! json_extract_until_end( - buffer, - length, - pos, - cell, - cell_length, - is_array - )) { - json_set_last_error( - "couldn't extract until end at position %d", - pos - ); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - - if (strlen(cell) == 0) { - json_set_last_error( - "empty cell encountered at position %d", - pos - ); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - - if (json_is_int(cell)) { - int value = StringToInt(cell); - #if SM_INT64_SUPPORTED - if (json_is_int64(cell, value)) { - int values[2]; - StringToInt64(cell, values); - - if (is_array) { - arr.PushInt64(values); - } else { - obj.SetInt64(key, values); - } - } else { - if (is_array) { - arr.PushInt(value); - } else { - obj.SetInt(key, value); - } - } - #else - if (is_array) { - arr.PushInt(value); - } else { - obj.SetInt(key, value); - } - #endif - } else if (json_is_float(cell)) { - float value = StringToFloat(cell); - if (is_array) { - arr.PushFloat(value); - } else { - obj.SetFloat(key, value); - } - } else if (StrEqual(cell, "true") || StrEqual(cell, "false")) { - bool value = StrEqual(cell, "true"); - if (is_array) { - arr.PushBool(value); - } else { - obj.SetBool(key, value); - } - } else if (StrEqual(cell, "null")) { - if (is_array) { - arr.PushObject(null); - } else { - obj.SetObject(key, null); - } - } else { - json_set_last_error( - "unknown type encountered at position %d: %s", - pos, - cell - ); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - } - } - - if (! json_skip_whitespace(buffer, length, pos)) { - json_set_last_error("buffer ended early at position %d", pos); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - } - - // skip remaining whitespace and ensure we're at the end of the buffer - pos += 1; - if (json_skip_whitespace(buffer, length, pos) && depth == 0) { - json_set_last_error( - "unexpected data after structure end at position %d", - pos - ); - json_cleanup_and_delete(obj); - json_cleanup_and_delete(arr); - - return null; - } - - return is_array ? view_as(arr) : obj; -} - -/** - * Encodes the object with the options provided and writes - * the output to the file at the path specified. - * - * @param obj Object to encode/write to file. - * @param path Path of file to write to. - * @param options Options to pass to `json_encode`. - * @return True on success, false otherwise. - */ -stock bool json_write_to_file( - JSON_Object obj, - const char[] path, - int options = JSON_NONE -) -{ - File f = OpenFile(path, "wb"); - if (f == null) { - return false; - } - - int size = json_encode_size(obj, options); - char[] buffer = new char[size]; - json_encode(obj, buffer, size, options); - - bool success = f.WriteString(buffer, false); - delete f; - - return success; -} - -/** - * Reads and decodes the contents of a JSON file. - * - * @param path Path of file to read from. - * @param options Options to pass to `json_decode`. - * @return The decoded object on success, null otherwise. - */ -stock JSON_Object json_read_from_file(const char[] path, int options = JSON_NONE) -{ - File f = OpenFile(path, "rb"); - if (f == null) { - return null; - } - - f.Seek(0, SEEK_END); - int size = f.Position + 1; - char[] buffer = new char[size]; - - f.Seek(0, SEEK_SET); - f.ReadString(buffer, size); - delete f; - - return json_decode(buffer, options); -} - -/** - * Creates a shallow copy of the specified object. - * - * @param obj Object to copy. - * @return A shallow copy of the specified object. - */ -stock JSON_Object json_copy_shallow(JSON_Object obj) -{ - bool isArray = obj.IsArray; - JSON_Object result = isArray - ? view_as(new JSON_Array()) - : new JSON_Object(); - - if (isArray) { - view_as(result).Concat(view_as(obj)); - } else { - result.Merge(obj); - } - - return result; -} - -/** - * Creates a deep copy of the specified object. - * - * @param obj Object to copy. - * @return A deep copy of the specified object. - */ -stock JSON_Object json_copy_deep(JSON_Object obj) -{ - JSON_Object result = json_copy_shallow(obj); - - int length = obj.Length; - int key_length = 0; - for (int i = 0; i < length; i += 1) { - key_length = obj.GetKeySize(i); - char[] key = new char[key_length]; - obj.GetKey(i, key, key_length); - - // only deep copy objects - JSONCellType type = obj.GetType(key); - if (type != JSON_Type_Object) { - continue; - } - - JSON_Object value = obj.GetObject(key); - result.SetObject(key, value != null ? json_copy_deep(value) : null); - } - - return result; -} - -/** - * Recursively cleans up the instance and any instances stored within. - * - * @param obj Object to clean up. - */ -stock void json_cleanup(JSON_Object obj) -{ - if (obj == null) { - return; - } - - int length = obj.Length; - int key_length = 0; - for (int i = 0; i < length; i += 1) { - key_length = obj.GetKeySize(i); - char[] key = new char[key_length]; - obj.GetKey(i, key, key_length); - - // only clean up objects - JSONCellType type = obj.GetType(key); - if (type != JSON_Type_Object) { - continue; - } - - JSON_Object value = obj.GetObject(key); - if (value != null) { - json_cleanup(value); - } - } - - obj.Super.Cleanup(); -} - -/** - * Cleans up an object and sets the passed variable to null. - * - * @param obj Object to clean up. - */ -stock void json_cleanup_and_delete(JSON_Object &obj) -{ - json_cleanup(obj); - obj = null; -} diff --git a/scripting/include/l4d_info_editor.inc b/scripting/include/l4d_info_editor.inc deleted file mode 100644 index 0bce55b..0000000 --- a/scripting/include/l4d_info_editor.inc +++ /dev/null @@ -1,54 +0,0 @@ -#if defined _info_editor_included - #endinput -#endif -#define _info_editor_included - - - -/** - * Retrieves the value of a specified key from the games mission info keyvalue system. "N/A" is returned when not found. - * - * @param pThis Enter the pThis value from OnGetMissionInfo/OnGetWeaponsInfo. Can specify 0 when reading Mission data. - * @param keyname Key name to check. - * @param dest Destination string buffer to copy to. - * @param destLen Destination buffer length (includes null terminator). - * - * @noreturn - */ -native void InfoEditor_GetString(int pThis, const char[] keyname, char[] dest, int destLen); - -/** - * Sets the value of a specified key from the games mission info keyvalue system. - * - * @param pThis Enter the pThis value from OnGetMissionInfo/OnGetWeaponsInfo. Can specify 0 when writing Mission data. - * @param keyname Key name to set. - * @param value Value to set. - * @param create Optionally create the keyvalue if it doesn't exist. - * - * @noreturn - */ -native void InfoEditor_SetString(int pThis, const char[] keyname, const char[] value, bool create = false); - -/** - * Reloads the mission and weapons data configs and forces the game to reload them. - * - * @noreturn - */ -native void InfoEditor_ReloadData(); - - - -/** - * @brief Fired multiple times when the mission info data is parsed. - * - * @param pThis This pointer used for InfoEditor_GetString/InfoEditor_SetString. - */ -forward void OnGetMissionInfo(int pThis); - -/** - * Fired multiple times when the weapon info data is parsed for a specific weapon classname. - * - * @param pThis This pointer used for InfoEditor_GetString/InfoEditor_SetString. - * @param classname Classname of the weapon being parsed. - */ -forward void OnGetWeaponsInfo(int pThis, const char[] classname); \ No newline at end of file