From 24dbfa8bfa87f67f21bcb9e6d602088ad6db8271 Mon Sep 17 00:00:00 2001 From: Jackz Date: Tue, 11 May 2021 00:33:06 -0500 Subject: [PATCH] l4d2_epi: Add ammo pack fix for multiple models --- plugins/l4d2_extraplayeritems.smx | Bin 10443 -> 12974 bytes scripting/l4d2_extraplayeritems.sp | 158 +++++++++++++++++++++++++---- 2 files changed, 137 insertions(+), 21 deletions(-) diff --git a/plugins/l4d2_extraplayeritems.smx b/plugins/l4d2_extraplayeritems.smx index 3fead0d684d62ecb5c0123a8d970107bf9619334..ba86711843f0276c4e75e8e9aa6d336ee3ff833f 100644 GIT binary patch literal 12974 zcmY+I1yozz67SQNBBgk7D{e(faSK*libE+-+&u)BqQ#-O7ccH^O`$jh4<6jzCBVz~ z-Fw%2FDtYDzdd{Qp4oHGIuRL}Pa4mkJ*(sf0K^gjfH&yR0Dv{5{qy=qZzKT#R3y(! z0|4&`0f5&?M*R!`$RX#DLx74tl95VRb^p)aIY=HuvMx3NP>N*cP-G6I)+0>-$x6uDAV>}lL&hNUjv{$68~`wRg{;%m z(aapcVP*_625>mJnb=vIy8a7bV;3Yi7=x_A=Kq2{Qd~eF>;J_5OZMg@k1n>+hp!nRYCgz!kzJ9`H#r_b`!>ArUte zm-&+)1IjD=SMdcQhI$D!u0NF0hLtQCaakRliP>q}Y9ly49}y;XM8XU=U5VM-TGE6#9S&3o*9TL{)#(BAN{cs_k0Eiy|qzV9%1^_7ofW!e^BmrIc0bO_j zoH#E}*Z|a6zx$q_ls!MmdUo>&KpX)O5CEbEfG7bVS^$Vb0OAsW*r}bkA$@kE3-B`l zbP5BE(0?Ce{ic5Pn;P?X&a2-!Sig;4|2D$OlOXV}NM z43FGjv)ndf8Z&C8C$LDj-R0J;PVi~iT(s<~uJy3Q&Vp~51 zZ^Oqg`K-w&Vw1%@!a{ZY_N*LROoPGo51)dq*_*8S6wfP^?l?;tZj0(kcefQtHFirM zM4ixr`T2}kgZbs$v*xLdxgFdTGcFo`Vtwdsv;S`0E?jYXRDa@-bi}4ey_&`0ZCZ%< zI7at*?(#=pNrOr&G)c5yWXzOwjG+N!FU}p3SDl!L{-L_y=Ao7G(naJs7#eDW6*b$H7wBc_myc& zRB`AoalK{wPSIOZnXI@j@`R2XVV?Ho<&1=-(+~Ly=OKOE5AN2r4Muy|@^GaT@2GQ8 z(~c|e@+lqD`#|;O*Va|QLrM0-61)kH@ri75nnNGutxHJ+pQr}gGAgAD1fJFw`i+!Be??T9OZFQ;@!PBMX(L+yj1B$}q6N+lS@Mkdl6i#H^R6zP z<@_k~&!o-Q+a)O?YRb#Xq$zUxdIkqMmFatT#r)Ea&-Na7cWjV%2aTyN?4xC|7d#}) z({jJ9AWB#`S}Yr??ABMOcDT3pGTlz+Zr(L#tBFt9%?&0T%)d0nzt8AI35_&t?CWU@ z31ixMIKo)`W?Jae)|q&5_#l}Bgj=)2DcIoycxMLFXVW&f91m2t7S^|ww`X$?xCIHE z)}1E|ry==wJ{msbiY9c2k7eU`RfcuBgrD!WLl_r~JoP3oIc>qD_J;&rcY{3FzUl}7 z`BUP_^*oP`;aj>x_ZBe5?HKRjye>r4DU0w3v2AY6i6Y;Wgk$BB*r7-s%P4{`IN>Z!tvckt_Dia!jI2ljN4*^wgi8= zUDvMNPUT?2XBm6EGTQ=pM zR_wolPNLv7{R|}?)E(6tKz1Bnbg~3T;qzC9re@63oQ&= z;X=oXb3yy=-jh6X=^xKjnh5!i!1jN4y_WxS%=l>c=-$^J^~wl+-g&^ zZ$*v<-Ti8MGEr-K!dHW-e*f`PdxF<1uc_08g;=adgRV!8H7wruDRXKjLnq(x;js9) zwCVv?f2FgueW)+`)S^Xq4**kj9AEI^FcpU#oe#2PUxKMRq4t)>MYhG4EmS+P!=Ry> z{WQ+aM8!L;A1Y9w{MO~~{Y&l9*OfZdRri~n7J2)^3to5NzDcKtvg`ep!lq&kotHbB zSxkj%LavHEZZc;bWww#N-UjgOQs=&hnTRzHRH2v0_|J|}SG;wcjA*frsFON*%ndEh z+ti#IpX{!isMcGAlHr_*XKvXkux62_g$J<_O9;F*{Plh?)zVY-t{odq(1(wzd6cn( zK2pbh>%4~456K8Om5Z4M@pI}J^v7f>;N@=rB~^!A`MXW>#nE=F<{O5c1$Lnar;5n^ zH(hgAYzVNMqrEk0lP_*!c%z%xr%a;(ZTr)E#tI*DBL!IqY~kHayosMZjz^!roYnkS zkKJ=9A?Rr`TQ+~GkBVe2mJVy_V0)Up@O6fxD{mJ`%}hmJ5Rr{5n}4fRqJ?TW=&`0? zsA35x#iHd^2I{wZQK%JVPB_VvRG%_(J=b@5Zp4>w)Lw)_|*awXE`)R z%d3mSgUVbX3d(U#qYM`}%KF7t5vy#kG$T*i-=#aR$r|GTtLZrc8of5yEfcDW+BN6o z4KywJZTXStdUQ*uOrau{u@s#_A>v%G=vlCeECKD z-1}+l)W=xGNib`~&@U>fMz`|xW79egCVQjuu7BK+pTuBq1B71(`0!JhPu@n~p~+6v zNbcO0>T>StVJ(PUeUw|?ap5OU`_ls(!j1iUT1&J~7~8Hzk7A{dVJoVfPU3zn)5OT8 zS$8N$zLhn1A0f@pSHrNjhqBSOdk#VD%XiOlM1>4`=`4eB>WEHd;$^#3W=vlWF}B!` zyOrm3u5JbT-DbZP`-Dq*C`L(c@8Rp*IyW!$%U{{HOEfHFBYJ;s*M^oBsLt;*_V~&# z_TB)*J4A*(k(DXz)4H2(n7*eEjI^<}q1$Y78=f-W3QXPKd5_%@<5kh6aM`uQiN@5j zKm6$TEsE0GX_Bfdx*q)QKsSirVotE?V!qYkg?6IuzHgJ`66B)7bQ)#0G^w+BnruWT zZCBrN%D4B-c&44s1yWPL-ekGma%`6|S=KSRuUA+_FzkB2hY)czGRW5Pq7JLPzw~r3 z;dSxNo+?kuihd8Q;Sg4TO=#_=uk*d7@kmC)sSV*{KfdMa*9D33EK5}__vo1GBBI!v$z=rBlVf9RMe#^i);kr&RF?bl+88ECVL`MOP< zobH}az}*-wR$toNB~65RJ>?!dsJNUbO+<#s!2G08!Thb<-x@QgZ#)eno!cc4MK19v zuF*#VLS=;u8*H+%El?s6C#{5_^&JUc+HC(Fy->~1*GKVvP*LG zr%@Io!Q=B0EW6K8jEY0LvAq;HVY*0ZM{PpTW`ok%?KTQ8!@)Jhcs_B40`wB+{>os- z)z@G2u6?DIQ#(I)VJ4tv`a`* zsy@#2`3=ltxo8{=s)adb?B^fjuu#`}c-F%Fv-Tqgc3TfkFn}Y?(Y%mzZm5T6{C;;% zN=tc##?LRtKww?ZW!PvWVjq0D@x#Q|N$mo1i+3Smkd*Q0c}j`^ubxRc-06yYEfwwV z62mRLmbMH%`x{#L>1+O3H@k8H2OUGh7qV9h3;!TCVF_<41Z`QkRMu+S9JSNd43TfH0kQrOhN+WOup zZ|}+kBJsY`CEw!-JMcB#Azc0)x!==hO<2(N@eN!H=e$zW2i+RvDfC#~nB6)|uE^X# zjUs6WQ?oI6eSGNIy<@)YDWxiSfg2j41d9ICEx2kA)?oYxV4%(XtQpVgm zMym*hWVT?*o89NOr)OXNZsAF57!x}pdX0;l^7k%|i*h3dDV}{rBUNvW=)PYOr^G7V zw-9zuF4xnhf}h&d>*=CZ?$-!84lT7&szO#D#tDy7QJ08IzjR%MLVMr+xbQOQt8Z12 zH`wE+Ww@hghBrYEy-Kx{W4`S__<#!CM`qzrDYlN|KlABtmv=#jhPxAP9_H5mYSGZ7 zzusQMuo_NwD^-w*)=9QiJ6l6e#V~WnXskeCmTGZ>e^PI^mZATy&GgCp292_a>m*sl zo8$3?D4a&#wmaM2H+kPG&sZS$L~(pfn>R!Hl}VPz3}h-*FQZR`Mk)^si09gl5;}a@ zIjE~r$ky4H-B*p5lPK0Zd8RuN*{ATeGgs9}_wwnR`DSf>&iR!{&N(40^CSDK!4|O? zM3-&bYB%)s)-v|S&;Plfba-D`wgnZ`F_qf(JMX*CB(^*znA;<Y#J*Cm-2YBBFEiQEd>M#6jc zhJTBTWLYV0VQSA0(u{~(glPryefHwt{_(PmAwgd7y6si6Z&xcYyY5){?n6u9>egK5 z0K>sOR?rJ_1)PteB6U);t@TND>D zzZvW=+g8>V$?dN>mWWwobJ@rqSoQuGvB;*rku4v8!AE*_5Jv-53Z0@m{M#|MfNUmt4Nwf}PT% zgawpGm-t$0k5+g*Va~0?-b0|xP6%FBsF-3yoiF*x{^ZN;Z21*$BIZu_&5Rr!OZBwO zMc2vO>~!`1jYSY*aW=y82V7Y@`64b!H=|x%v-c~Ro15-Shv#rb&QkAqYd22iPuE{W z;fl}_?-Ii{+35?V&(M;fqb#AF<$onHIq`p(>0J`k@GGo`X}v^Z=qR$U!bfb`Qqb45 zc%E<5weV$qWrP>qq110az;#@^^`MTh0th`Uf*2(zCasJg!3XXUnkGd z()AxN_y@VOm4k1E>%sImqsi)&O!S^kS6?Tc8#jp7-^gI$Fo-{2 ziI_i#_=%=7Wl<%!hrqyB=EMmytJ2jJb+fU`Pku8huH)jynhh;pfAMN={7#oCzVbj< ztfnL29@SQE;9S`yStiyvXKlxzmZ|$d`cFX&^7osxfUuizza?*R}-5P9gVM$}ASsA&65jJRMmk%byI;awz zU6zj7an#YJRl}Lobc4TT)}Njpn4a9On9h6BAf0AH3ho_g zUlM0URBMD1R1Tj5Q=JWN?R=PuUR}95a;I?4&Qg@rNT(!)I#YeOZ2O+O>r)#yJk}=m zrSjU(m9M8$j%ioP`|02D5?eQT$=#ieKMt#~pyZK` zTw9`QVDJ**W3U#{5@of~wmOF;Envt-w6a+q%2}YEe=fS)@uAQAmQ(CN*TNZJ^ou=c z4#hg|o7rcX(2mAw2p01v9dt_pbDmE7ui9esb#&R0>XjVc;+JL<;%XI{e-HDL2-T)< zu*eI)saEVVA0?o8ss`<97Fl}h%nV-YR?F6eh7pnd!I8*oJ7mRtIF;nF$J6+wy~i?f zFr}qtv&R={)*rF8-l5HrK>9t;Nlu&5_8XHGuDLw@`KkS<6?PfkD7iH6PM)PGWfLo_`WrB2< z3Ke@lM{#CMcBXLnMyYB3(KbU3ccwpTrrxQo9jI*A`jlrC#{y;JUVnl6=0uzPc|?bB z!W8#fg_ZRtcwsXDod01`7F8GT)2F67@n<&@8uml-LxioKhg-Q=UWF6*YXK`oR6lxbh6 zn-8XD0`s9j;=5O7|_$7aiUx6HDtYKno z9|M2+lt=GkGp~*ge^mu$4~*>X(|xRDIxnW#vYZasrQHrim28duv5>X451-zjDfcV) zUBAQ18dtVW-!0*tKhvxSzi>NDXV1z=&yTG*K8Wiys4)pSl#a8hahXcEVlKinXLDPN zHqohJ7Ndg77?1~%X@>U2k(~>gF~kHCRp+IdD{9#v)UVAcwU+&AL#y)@T(j2k`TACB zoh4&%gV0jMV~s|y#Z06r(kg|YUH<0pAcqWE!Z~XB#oNLKJXHn)Ea7$G*VC%Y^%8Ek zlk)oVcaw725jaI9Pp*7oDF@1W1}`E_zR2ETjAmLv8PI-(k7x=FmDo3ZoE{$9@VaZe zO9-jV7EwO0Gw@V8Dy&&3X-WcS3}6?%fx6)+r){I?3C0%I^nDUuc;(`o-_X&}@Wf(1 zE7n_=_RU^?Cn;M1ix*spmMF9;ugTIm?|BKjd+>Ta@a+57Kyru}t~^dziMpw6^Qq9- zG*GUwlupq#MqorJ`{(=CPF~%uP&Uji+1-Q(Vb1>S6#qoHf6RMNO6QsZZ`n!4V``w; znOGcWI>I}jI-R2Xse;8@OtPJ+nzP57QS8my&0QIdSdfK0X%%&QN7VI%f6z+uK&YCU z14&9TIVxX1&dA#bNiLxgu4Q>AxIySCJ|xmD^wcykW#?f+ZKDpRAr#1o??Vk4ZNpmE zK#7I&MCIVMi-bYRMEp5N*wJSa)P2%dlJr7PiBa}#u-4a6a6UccFg3eTb42M`ID(!2x2}9USA8hAr#}iNi4SZ$(-(K)&&nIy-ks!|O$>B22Bx zV-4Ar#XIvVFjo*|!T!ruF$Gxh?j61XJa?bB)lUkxqp&d}Fy#YF+S}%o zN916wTIwtJOjh!Ke#gyq}%-eUV=r6pXV78(W{vlo+;w`!hB^r&D+DJj-DaW4@c z-|yx5J4zckvm|{q;>t|>Whjg4!^)NVSys|ffOzrBg# z_Vp-(x0O)YXa@6Z@c&RSfH`J_QT8)F-vOl9Xyj zV0X}G%fB@ks29nyW-uZq0y>_&W89S=Qm=Kcj-z}B+U;}+6R48OlqK>C>iu!%Id7gF zO8V0PmoafFIf`{aSL#tIcOUOWB1C?wF8-&WwPK7{T<@oEX{IH_nVDZ!RQLzECD*RZ zpjVK0>vP1;a%FW)tU0p4MxI)@qNs}XC`iP>hj80KY@#TwK1Ib8}_E=7fb~d7mjM%tf*H^ z>YvG``B?*K_Vr z@e0dXH)5+js9;(3>gbPT*GQOQL)_0~0xD{0Pum4PK6kKaZBZF!Z=vN|#m^DDpL4X| z<$F=dn>YT|u;~F!#5KO^O|YH&>7g7`ldL;Q#@Qn;GSdwYP*&T25z!Y@G7GR*SSp`L z2vK~SHTYZpgqe*r*hBK*+mBFe_=h(i*l37yu;J(PH(=ugdoyOVYgR>U+M6+DGfbfm zG2eC$pyuF8wa+tZ4+@G4SyFF`^}fz*w={3PDX*s$C-!+K@He3ZyAUr6GPQ!uR<2s^ zj3z*})YgaRw3(~GD@F<>r5X$1ecN!AM`S#nb!JF1X}l>{GC%Z|PjfNuewy9p)OZ9p zIdHOLK+H5@8kR{SSEPeO{|O6l_x0_#(tOU`L>eS-nvpGI{^gc1rJ_Umn$yIfZMih{ zY?G2=u`rdL!Y^?~dPjNH-?&wlVe$7qrd8?qc|!(`Cf0?KxSzTd4uq`6dR+&i=F3br zF%>AisI(ITXJzh+f7x8*u1ujj*NljYYHJs``;vjf%8=IyEv00AouxD@t%Ou4c3J~r zEFHPU(IPos)XrErCLtCmQ^@V9=mWSO*-QMG*%;|uJp#q)cX_=E9`z^ikG9Cx`EmYI!y%aFLY%oM6c=N#8F@sp|?xi-4CE@9&} zp#6N^hxz&RUA0aFKijZ~)<3ikBRHUu<8e<)vKy1Set~&#|y@vXajEzQJO$IN_Ywszqn?t1MqsvGSHmkdnstcg2<~T%m zCD`7*qN$2=bw@Fe9-|6!oy+vms}zp;idL>}rPvyx9Lzz}QFukSpZmozu~0tZ%xiGT zm4fTX#DUd1ho~55O)Lfs#L8r6dOiM8)yC--v%{g$a?JP`VZ%-Z!dtRu+~QejzM&iTTs! zG(?G)aFUDrn7enHZ4)a^OY;GrC4qI=zO1$`;Od`Ky$gFvg0B zOO$EcQaZavf1^M;7w=my_PT$v6%XyWM<;y4Te_ge^co94OU8_h$*4;!Z|eIeQ-VI{ zaBU-pRRTm8hnlT)x${JiR=6RZOEmSEjHFL2Iv;J5EmGz9z?nGmn&f!)2Ro0#;SO}Q z(Ha?k>}n3u%{Ap6Em6mKyS-p-{9 zYj-hydQ89I@{>~D-uKk&L1Ldz;D!yy1ZH8{t(~W0hWVK9UcD<;!g)tl1UC=P;hitS zwxNn|sCZUyBc#{y!l`)#$YQ;vSDt29eu?Z!(m$$h4sm~<$dC4Tijdx?G4*)Nl0Lj1 z^p-x99pe0~Joga2?S>!HHwuzoo95(@J+DH?jeo)n%0D~i72tmI3(7x_laStF+bH9t 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 Ry)Q+1Jr=!ZNb2IW`5*tMtBU{t diff --git a/scripting/l4d2_extraplayeritems.sp b/scripting/l4d2_extraplayeritems.sp index e147e2b..6a3e934 100644 --- a/scripting/l4d2_extraplayeritems.sp +++ b/scripting/l4d2_extraplayeritems.sp @@ -11,8 +11,16 @@ #include #include #include -//TODO: finale_start //TODO: On 3rd/4th kit pickup in area, add more +//TODO: Add extra pills too, on pickup + +#define L4D2_WEPUPGFLAG_NONE (0 << 0) +#define L4D2_WEPUPGFLAG_INCENDIARY (1 << 0) +#define L4D2_WEPUPGFLAG_EXPLOSIVE (1 << 1) +#define L4D2_WEPUPGFLAG_LASER (1 << 2) + +#define AMMOPACK_ENTID 0 +#define AMMOPACK_USERS 1 public Plugin myinfo = { @@ -23,10 +31,12 @@ public Plugin myinfo = url = "" }; -static ConVar hExtraItemBasePercentage, hAddExtraKits, hMinPlayers, hUpdateMinPlayers; -static int extraKitsAmount, extraKitsStarted, isFailureRound, abmExtraCount; +static ConVar hExtraItemBasePercentage, hAddExtraKits, hMinPlayers, hUpdateMinPlayers, hMinPlayersSaferoomDoor, hSaferoomDoorWaitSeconds, hSaferoomDoorAutoOpen; +static int extraKitsAmount, extraKitsStarted, abmExtraCount, firstSaferoomDoorEntity, playersLoadedIn, playerstoWaitFor; static int isBeingGivenKit[MAXPLAYERS+1]; -static bool isCheckpointReached, isLateLoaded, firstGiven; +static bool isCheckpointReached, isLateLoaded, firstGiven, isFailureRound; +static ArrayList ammoPacks; +static int g_iAmmoTable; /* on first start: Everyone has a kit, new comers also get a kit. @@ -44,26 +54,41 @@ public void OnPluginStart() { if(g_Game != Engine_Left4Dead && g_Game != Engine_Left4Dead2) { SetFailState("This plugin is for L4D/L4D2 only."); } + + //Create an array list that contains + ammoPacks = new ArrayList(2); HookEvent("player_spawn", Event_PlayerSpawn); HookEvent("player_first_spawn", Event_PlayerFirstSpawn); HookEvent("round_end", Event_RoundEnd); - HookEvent("heal_success", Event_HealFinished); + //HookEvent("heal_success", Event_HealFinished); HookEvent("map_transition", Event_MapTransition); HookEvent("game_start", Event_GameStart); hExtraItemBasePercentage = CreateConVar("l4d2_extraitem_chance", "0.056", "The base chance (multiplied by player count) of an extra item being spawned.", FCVAR_NONE, true, 0.0, true, 1.0); hAddExtraKits = CreateConVar("l4d2_extraitems_kitmode", "0", "Decides how extra kits should be added.\n0 -> Overwrites previous extra kits, 1 -> Adds onto previous extra kits", FCVAR_NONE, true, 0.0, true, 1.0); hUpdateMinPlayers = CreateConVar("l4d2_extraitems_updateminplayers", "1", "Should the plugin update abm's cvar min_players convar to the player count?\n 0 -> NO, 1 -> YES", FCVAR_NONE, true, 0.0, true, 1.0); + hMinPlayersSaferoomDoor = CreateConVar("l4d2_extraitems_doorunlock_percent", "0.75", "The percent of players that need to be loaded in before saferoom door is opened.\n 0 to disable", FCVAR_NONE, true, 0.0, true, 1.0); + hSaferoomDoorWaitSeconds = CreateConVar("l4d2_extraitems_doorunlock_wait", "35", "How many seconds after to unlock saferoom door. 0 to disable", FCVAR_NONE, true, 0.0); + hSaferoomDoorAutoOpen = CreateConVar("l4d2_extraitems_doorunlock_open", "0", "Controls when the door automatically opens after unlocked. Add bits together.\n0 = Never, 1 = When timer expires, 2 = When all players loaded in", FCVAR_NONE, true, 0.0); + if(hUpdateMinPlayers.BoolValue) { hMinPlayers = FindConVar("abm_minplayers"); if(hMinPlayers != null) PrintToServer("Found convar abm_minplayers"); } + if(isLateLoaded) { + for(int i = 1; i <= MaxClients; i++) { + if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2) + SDKHook(i, SDKHook_WeaponEquip, Event_Pickup); + } + } + AutoExecConfig(true, "l4d2_extraplayeritems"); #if defined DEBUG RegAdminCmd("sm_epi_setkits", Command_SetKitAmount, ADMFLAG_CHEATS, "Sets the amount of extra kits that will be provided"); + RegAdminCmd("sm_epi_lock", Command_ToggleDoorLocks, ADMFLAG_CHEATS, "Toggle all toggle's lock state"); RegAdminCmd("sm_epi_kits", Command_GetKitAmount, ADMFLAG_CHEATS); RegAdminCmd("sm_epi_items", Command_RunExtraItems, ADMFLAG_CHEATS); #endif @@ -89,6 +114,16 @@ public Action Command_SetKitAmount(int client, int args) { return Plugin_Handled; } +public Action Command_ToggleDoorLocks(int client, int args) { + for(int i = MaxClients + 1; i < GetMaxEntities(); i++) { + if(HasEntProp(i, Prop_Send, "m_bLocked")) { + int state = GetEntProp(i, Prop_Send, "m_bLocked"); + SetEntProp(i, Prop_Send, "m_bLocked", state > 0 ? 0 : 1); + } + } + return Plugin_Handled; +} + public Action Command_GetKitAmount(int client, int args) { ReplyToCommand(client, "Extra kits available: %d (%d) | Survivors: %d", extraKitsAmount, extraKitsStarted, GetSurvivorsCount()); ReplyToCommand(client, "isCheckpointReached %b, isLateLoaded %b, firstGiven %b", isCheckpointReached, isLateLoaded, firstGiven); @@ -116,7 +151,6 @@ public Action Event_GameStart(Event event, const char[] name, bool dontBroadcast public Action Event_PlayerFirstSpawn(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if(GetClientTeam(client) == 2 && !IsFakeClient(client)) { - if(L4D_IsFirstMapInScenario()) { //Check if all clients are ready, and survivor count is > 4. if(AreAllClientsReady() && !firstGiven) { @@ -133,7 +167,6 @@ public Action Event_PlayerFirstSpawn(Event event, const char[] name, bool dontBr RequestFrame(Frame_GiveNewClientKit, client); } }else { - //CreateTimer(1.0, Timer_UpdateMinPlayers); RequestFrame(Frame_GiveNewClientKit, client); } } @@ -171,9 +204,18 @@ public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadca int user = event.GetInt("userid"); int client = GetClientOfUserId(user); if(GetClientTeam(client) == 2) { + if(!IsFakeClient(client)) { + if(firstSaferoomDoorEntity > 0 && playerstoWaitFor > 0 && ++playersLoadedIn / playerstoWaitFor >= hMinPlayersSaferoomDoor.FloatValue) { + SetEntProp(firstSaferoomDoorEntity, Prop_Send, "m_bLocked", 0); + if(hSaferoomDoorAutoOpen.IntValue % 2 == 2) { + AcceptEntityInput(firstSaferoomDoorEntity, "Open"); + } + firstSaferoomDoorEntity = -1; + } + } CreateTimer(0.5, Timer_GiveClientKit, user); + SDKHook(client, SDKHook_WeaponEquip, Event_Pickup); } - SDKHook(client, SDKHook_WeaponEquip, Event_Pickup); } @@ -192,8 +234,10 @@ public void OnMapStart() { }else if(L4D_IsMissionFinalMap()) { //Add extra kits for finales int extraKits = GetSurvivorsCount() - 4; - if(extraKits > 0) - extraKitsAmount = extraKits; + if(extraKits > 0) { + extraKitsAmount += extraKits; + extraKitsStarted = extraKitsAmount; + } } if(!isLateLoaded) { CreateTimer(30.0, Timer_AddExtraCounts); @@ -202,6 +246,23 @@ public void OnMapStart() { //Hook the end saferoom as event HookEntityOutput("info_changelevel", "OnStartTouch", EntityOutput_OnStartTouchSaferoom); HookEntityOutput("trigger_changelevel", "OnStartTouch", EntityOutput_OnStartTouchSaferoom); + + //Lock the saferoom door until 80% loaded in: //&& abmExtraCount > 4 + if(hMinPlayersSaferoomDoor.IntValue > 0 ) { + firstSaferoomDoorEntity = FindEntityByClassname(-1, "prop_door_rotating_checkpoint"); + playersLoadedIn = 0; + if(firstSaferoomDoorEntity > 0) { + SetEntProp(firstSaferoomDoorEntity, Prop_Send, "m_bLocked", 1); + CreateTimer(hSaferoomDoorWaitSeconds.IntValue, Timer_OpenSaferoomDoor); + } + } +} +public void OnMapEnd() { + for(int i = 0; i < ammoPacks.Length; i++) { + ArrayList clients = ammoPacks.Get(i, AMMOPACK_USERS); + delete clients; + } + ammoPacks.Clear(); } public void EntityOutput_OnStartTouchSaferoom(const char[] output, int caller, int client, float time) { if(!isCheckpointReached && client > 0 && client <= MaxClients && IsValidClient(client) && GetClientTeam(client) == 2) { @@ -211,7 +272,7 @@ public void EntityOutput_OnStartTouchSaferoom(const char[] output, int caller, i float averageTeamHP = GetAverageHP(); if(averageTeamHP <= 30.0) extraPlayers += extraPlayers; //if perm. health < 30, give an extra 4 on top of the extra - else if(averageTeamHP <= 50.0) ++extraPlayers; //if the team's average health is less than 50 (permament) then give another + else if(averageTeamHP <= 50.0) extraPlayers = (extraPlayers / 2); //if the team's average health is less than 50 (permament) then give another //Chance to get 1-2 extra kits (might need to be nerfed or restricted to > 50 HP) if(GetRandomFloat() < 0.3) ++extraPlayers; @@ -240,9 +301,10 @@ public Action Event_MapTransition(Event event, const char[] name, bool dontBroad #endif extraKitsStarted = extraKitsAmount; abmExtraCount = GetRealSurvivorsCount(); + playerstoWaitFor = GetSurvivorsCount(); } - public Action Event_Pickup(int client, int weapon) { + if(extraKitsAmount > 0) { char name[32]; GetEntityClassname(weapon, name, sizeof(name)); @@ -252,22 +314,61 @@ public Action Event_Pickup(int client, int weapon) { return Plugin_Continue; }else{ isBeingGivenKit[client] = true; - //FIXME: Runs errors on map transitionining UseExtraKit(client); return Plugin_Stop; } } - } return Plugin_Continue; } -public Action Event_HealFinished(Event event, const char[] name, bool dontBroadcast) { - int client = GetClientOfUserId(event.GetInt("userid")); - UseExtraKit(client); +public void OnEntityCreated(int entity, const char[] classname) { + if (StrEqual(classname, "upgrade_ammo_explosive") || StrEqual(classname, "upgrade_ammo_incendiary")) { + int index = ammoPacks.Push(entity); + ammoPacks.Set(index, new ArrayList(1), AMMOPACK_USERS); + SDKHook(entity, SDKHook_Use, OnUpgradePackUse); + } } +public Action OnUpgradePackUse(int entity, int activator, int caller, UseType type, float value) { + if (entity > 2048 || entity <= MaxClients || !IsValidEntity(entity)) return Plugin_Continue; + int primaryWeapon = GetPlayerWeaponSlot(activator, 0); + if(IsValidEdict(primaryWeapon) && HasEntProp(primaryWeapon, Prop_Send, "m_upgradeBitVec")) { + int index = ammoPacks.FindValue(entity, AMMOPACK_ENTID); + if(index == -1) return Plugin_Continue; + ArrayList clients = ammoPacks.Get(index, AMMOPACK_USERS); + if(clients.FindValue(activator) > -1) { + ClientCommand(activator, "play ui/menu_invalid.wav"); + return Plugin_Stop; + } + char classname[32]; + int upgradeBits = GetEntProp(primaryWeapon, Prop_Send, "m_upgradeBitVec"), ammo = 40; + + //Get the new flag bits + GetEntityClassname(entity, classname, sizeof(classname)); + //SetUsedBySurvivor(activator, entity); + int newFlags = StrEqual(classname, "upgrade_ammo_explosive") ? L4D2_WEPUPGFLAG_EXPLOSIVE : L4D2_WEPUPGFLAG_INCENDIARY; + if(upgradeBits & L4D2_WEPUPGFLAG_LASER == L4D2_WEPUPGFLAG_LASER) newFlags |= L4D2_WEPUPGFLAG_LASER; + SetEntProp(primaryWeapon, Prop_Send, "m_upgradeBitVec", newFlags); + + GetEntityClassname(primaryWeapon, classname, sizeof(classname)); + if(StrEqual(classname, "weapon_grenade_launcher", true)) ammo = 1; + else if(StrEqual(classname, "weapon_rifle_m60", true)) ammo = 150; + SetEntProp(primaryWeapon, Prop_Send, "m_nUpgradedPrimaryAmmoLoaded", ammo); + + clients.Push(activator); + ClientCommand(activator, "play player/orch_hit_csharp_short.wav"); + + if(clients.Length >= GetSurvivorsCount()) { + AcceptEntityInput(entity, "kill"); + delete clients; + ammoPacks.Erase(index); + } + return Plugin_Stop; + } + return Plugin_Continue; +} ///////////////////////////////////// /// TIMERS @@ -312,6 +413,16 @@ public Action Timer_AddExtraCounts(Handle hd) { PrintToServer("Incremented counts for %d items", affected); } +public Action Timer_OpenSaferoomDoor(Handle h) { + if(firstSaferoomDoorEntity != -1) { + SetEntProp(firstSaferoomDoorEntity, Prop_Send, "m_bLocked", 0); + if(hSaferoomDoorAutoOpen.IntValue % 1 == 1) { + AcceptEntityInput(firstSaferoomDoorEntity, "Open"); + } + firstSaferoomDoorEntity = -1; + } +} + ///////////////////////////////////// /// Stocks //////////////////////////////////// @@ -342,7 +453,6 @@ stock int GetSurvivorsCount() { return count; } -//TODO: Count idle bots stock int GetRealSurvivorsCount() { int count = 0; for(int i = 1; i <= MaxClients; i++) { @@ -379,9 +489,6 @@ stock void UseExtraKit(int client) { if(--extraKitsAmount <= 0) { extraKitsAmount = 0; } - #if defined DEBUG - PrintToServer("Client %N used extra: %d", client, extraKitsAmount); - #endif } } @@ -394,4 +501,13 @@ stock float GetAverageHP() { } } return float(totalHP) / float(clients); +} + +void SetUsedBySurvivor(int client, int entity) { + int usedMask = GetEntProp(entity, Prop_Send, "m_iUsedBySurvivorsMask"); + bool bAlreadyUsed = !(usedMask & (1 << client - 1)); + if (bAlreadyUsed) return; + + int newMask = usedMask | (1 << client - 1); + SetEntProp(entity, Prop_Send, "m_iUsedBySurvivorsMask", newMask); } \ No newline at end of file