From d00fec91b8bf1585ca53357935289e66331c177f Mon Sep 17 00:00:00 2001 From: Giegue Date: Tue, 25 Apr 2023 22:32:36 -0300 Subject: [PATCH] Update extra AMXX plugins. --- README.md | 97 -------------------- extra/base/README.md | 14 ++- extra/base/bin/glb_takedamage.amxx | Bin 0 -> 1875 bytes extra/base/src/glb_dispatchuse.sma | 35 ++++++- extra/base/src/glb_takedamage.sma | 42 +++++++++ extra/cstrike/README.md | 17 ++++ extra/cstrike/bin/cs_unprecacher.amxx | Bin 0 -> 2377 bytes extra/cstrike/src/cs_unprecacher.sma | 126 ++++++++++++++++++++++++++ extra/valve/README.md | 2 +- extra/valve/bin/hl_monsterbridge.amxx | Bin 4426 -> 4431 bytes extra/valve/src/hl_monsterbridge.sma | 122 ++++++++++++------------- 11 files changed, 288 insertions(+), 167 deletions(-) create mode 100644 extra/base/bin/glb_takedamage.amxx create mode 100644 extra/base/src/glb_takedamage.sma create mode 100644 extra/cstrike/README.md create mode 100644 extra/cstrike/bin/cs_unprecacher.amxx create mode 100644 extra/cstrike/src/cs_unprecacher.sma diff --git a/README.md b/README.md index 27602d2..6ffedc0 100644 --- a/README.md +++ b/README.md @@ -57,103 +57,6 @@ Usage of ReHLDS is highly recommended, as you can use the command `rescount` whi Keeping track of the number of precached content will allow you to maximize the number of monsters you can use without risking going over the limits. -## Using MonsterMod on Counter-Strike - -Counter-Strike precaches the sounds of all weapons. This means that sounds such as "clip-ins", "clip-outs" are added to the list, taking quite a bit of space in the precache count. Let it be a reminder that our good old Half-Life can only store a maximum of 512 precached resources. Most of these sounds are handled client-side by the models themselves, there is no need for all of them to be kept precached on the server. Only the weapons fire sounds are needed. - -MonsterMod does not have an integrated "Unprecacher" to remove those sounds, but you can remove them manually with AMX Mod X, using Fakemeta. Register forward **FM_PrecacheSound** and return **FMRES_SUPERCEDE** on the following sounds: - -``` -"weapons/ak47_boltpull.wav" -"weapons/ak47_clipin.wav" -"weapons/ak47_clipout.wav" -"weapons/aug_boltpull.wav" -"weapons/aug_boltslap.wav" -"weapons/aug_clipin.wav" -"weapons/aug_clipout.wav" -"weapons/aug_forearm.wav" -"weapons/awp_clipin.wav" -"weapons/awp_clipout.wav" -"weapons/awp_deploy.wav" -"weapons/boltdown.wav" -"weapons/boltpull1.wav" -"weapons/boltup.wav" -"weapons/clipin1.wav" -"weapons/clipout1.wav" -"weapons/de_clipin.wav" -"weapons/de_clipout.wav" -"weapons/de_deploy.wav" -"weapons/elite_clipout.wav" -"weapons/elite_deploy.wav" -"weapons/elite_leftclipin.wav" -"weapons/elite_reloadstart.wav" -"weapons/elite_rightclipin.wav" -"weapons/elite_sliderelease.wav" -"weapons/elite_twirl.wav" -"weapons/famas_boltpull.wav" -"weapons/famas_boltslap.wav" -"weapons/famas_clipin.wav" -"weapons/famas_clipout.wav" -"weapons/famas_forearm.wav" -"weapons/fiveseven_clipin.wav" -"weapons/fiveseven_clipout.wav" -"weapons/fiveseven_slidepull.wav" -"weapons/fiveseven_sliderelease.wav" -"weapons/g3sg1_clipin.wav" -"weapons/g3sg1_clipout.wav" -"weapons/g3sg1_slide.wav" -"weapons/galil_boltpull.wav" -"weapons/galil_clipin.wav" -"weapons/galil_clipout.wav" -"weapons/m4a1_boltpull.wav" -"weapons/m4a1_clipin.wav" -"weapons/m4a1_clipout.wav" -"weapons/m4a1_deploy.wav" -"weapons/m4a1_silencer_off.wav" -"weapons/m4a1_silencer_on.wav" -"weapons/m249_boxin.wav" -"weapons/m249_boxout.wav" -"weapons/m249_chain.wav" -"weapons/m249_coverdown.wav" -"weapons/m249_coverup.wav" -"weapons/mac10_boltpull.wav" -"weapons/mac10_clipin.wav" -"weapons/mac10_clipout.wav" -"weapons/mp5_clipin.wav" -"weapons/mp5_clipout.wav" -"weapons/mp5_slideback.wav" -"weapons/p90_boltpull.wav" -"weapons/p90_clipin.wav" -"weapons/p90_clipout.wav" -"weapons/p90_cliprelease.wav" -"weapons/p228_clipin.wav" -"weapons/p228_clipout.wav" -"weapons/p228_slidepull.wav" -"weapons/p228_sliderelease.wav" -"weapons/scout_bolt.wav" -"weapons/scout_clipin.wav" -"weapons/scout_clipout.wav" -"weapons/sg550_boltpull.wav" -"weapons/sg550_clipin.wav" -"weapons/sg550_clipout.wav" -"weapons/sg552_boltpull.wav" -"weapons/sg552_clipin.wav" -"weapons/sg552_clipout.wav" -"weapons/slideback1.wav" -"weapons/sliderelease1.wav" -"weapons/ump45_boltslap.wav" -"weapons/ump45_clipin.wav" -"weapons/ump45_clipout.wav" -"weapons/usp_clipin.wav" -"weapons/usp_clipout.wav" -"weapons/usp_silencer_off.wav" -"weapons/usp_silencer_on.wav" -"weapons/usp_slideback.wav" -"weapons/usp_sliderelease.wav" -``` - -Doing this will free **85** sounds from the precache list that you can now use for additional monsters. - ## Known Bugs I'm aware that the plugin is far from perfect, and there are a few things that need polishing *-especially the AI-*. I'll try to fix/will be fixing as the project evolves: diff --git a/extra/base/README.md b/extra/base/README.md index 4e3384d..e6df5c1 100644 --- a/extra/base/README.md +++ b/extra/base/README.md @@ -12,14 +12,18 @@ All plugins in this section require AMXX 1.9.0 or greater, they will not work on Compiled plugins are provided in the `bin` folder for your convenience. However, if you prefer to build the plugins yourself, the source code of all AMXX plugins are located in the `src` folder for compilation. -#### GoldSrc --> MonsterMod Use Dispatcher +#### Use Dispatcher Because MonsterMod entities are, -quite literally-, just a func_wall with its own logic, trying to trigger any MonsterMod entity from the outside will fail, as it will attempt to use the logic of game's "func_wall" instead of our own. -To add salt to injury, Metamod is incapable of hooking use functions, as the pfnUse/DispatchUse methods provided by the API has been deprecated, and no longer work. Leaving AMXX's HamSandwich as the only module that can hook an entity's Use() function. - In normal circunstances, you do not need this plugin. But let's say you have a turret monster, disabled by default, and you gave it a targetname. Even with a name, triggering this turret regardless of the method used will not activate it. -This plugin redirects the game's func_wall Use() function to MonsterMod, connecting the missing piece and allowing you to trigger MonsterMod entities with your shiny func_button. +The same problem occurs from the other side, a MonsterMod entity trying to trigger something will expect said entity to be part of MonsterMod as well. -I can't believe I've done this. *incomprehensible screams* +This plugin redirects the game's func_wall Use() function to MonsterMod, as well as bridging Use() calls from MonsterMod back to the game, connecting the missing pieces and allowing you to trigger MonsterMod entities from the game, and game entities from MonsterMod. + +#### External TakeDamage + +When a MonsterMod entity tries to inflict damage to something, it expects said entity to be either a player or a MonsterMod monster. If something else is to be found, it will deal no damage to it, as it doesn't know how to manage it. + +This plugin allows MonsterMod entities to inflict damage to normal game entities, such as breakables. diff --git a/extra/base/bin/glb_takedamage.amxx b/extra/base/bin/glb_takedamage.amxx new file mode 100644 index 0000000000000000000000000000000000000000..1f9807dd85ece497e51a203fa7c762a9751b7786 GIT binary patch literal 1875 zcmV-Z2dwy5SWQ6y0|5j(2LJ$T5C8zkNB{sB0001ZoSj!)Y+S_^K6iJ48{&Y|8fpR* z(?TI7{z-_5TOkGi#daI7?cGiJ5z;c=o!!0o{+N63nzizhheisIl~9#O5dS|yAW+Lg z1PDdKPyFVgl_27=g-E1QB>N#Kd^2-)_hudHmX*$abIzPOb7tn8nRC}{qObpB+bOcC zkRlqohG-44wP~VD_>B?ae}Kp$ItJYo5UR8TcnWlzMf!IS;{nEL#zz=k##P1> zj3*giWc(ZB2aF#xo@M-&aUGZerc%bA>wsyZ2X?9TfbRqDRek}7fy2Q2fRn(3R1iyY zLU^JosaULtSh&TS@QN}FgOHZpde!lZj_<@&m2t6B_e({mOeNvEy1giMe_OCzk8045 zJ0wvYwk6UpQ>3g3$3>5bC55mP#WF0K8QXkmMTBiG3Rg;A8N4VLMOZDhS}S_aHdk>2 z5t9=YSA^@7F=I@V4Oyzka$0y}G%Fh8t^;XA*&~M!7xRVOOm@n&|1>#Xn9I>2ZQ)?( zVlX_Cbg4bkt-J@)84`b5zrhkuuHh7=X+*bXsC;V^D*YxeGgl|n$>mKSj zGd1Q6<7vkG8N1ll)oi1?!}lZ(Sq9HD-_2vM;juke82hxV}Gwr>}zKnr?$}DNa&`w(7lk*&2;E)@6bJ;(7kF4 zyXROpnM+OGu7qxZ_s{12dpL2PL)4DHjsL;ML}qh5@8&gbHTGCyY;#YJ^E!_6+K+SJ zakiga+cw^hUY=tI&v8p)Ja;giBD%hgZ4g#(H8OtH_B_38=TBFoe~i_FIz zbCtK4i+;km|7Shw_Z%*h?@-664C})UGorInMaf_-@Z{j*b=ML8;Dn4ycppVHD7=Oj zlpFnf2Yxp&)L(Vt;e7}8_PdT>Z#4S`qf+QB$Bthebo`QAFU!HiGdBR4E_rO#UCrh6WE82AG4A>d2EHQ+12bHG=X9_TgD{g%18)ou5NWp4SmEK?!9 zZJA0)-CC!)^4hRW_U=!asQq)w%y|O%GvGTZ6TP1TZvcJ?yb<`Xl!^8pTroER9{}!B zrwqIqcrtCG|1|J6;Dxk_GL`AS0*(NGO(tvaP$vt#lT0S6Oi~$U>ALY9cxZuCsiPCl zIMfoO9MS@_9<`kr$Wg~cfzL;)7Ibf`Ta7|(rnh+CWm1%7=kx?$r_7zMgyvAj927e0 z8c5TbO`ZB)z?mdEL>!CKk_`1iu(Lqwy&%*xc7rn`M|~X6PO!7muOmaoqdx?WpVt-m&(-K!7(6-Q zgc9e7`0Ig4b=IRX6yZ03dr*qyz#n%-6lv2ps)_1xFjik}3xA=6o)>7Qw>4_UuLQ`p zmXRQewZ<;BkXU*x!Oc9rCAbBPccpILYMPE`*k4j16n^waxr#i^2Vp#GPNYvWTIF^c z4MVYtyqyTLL3|{VNZq`OZ=`M^bR;rY0bB^_Hj=kL5VXE)ob&g?=i z^li`CIx(&_7ti$PIlJ-qv+Lc=H;&BNkHtsyIH7Lp+O+*pX3p;Bi|Pd0&p==GkD`C$ zi3NM)LRRam+N$wc&OYfc*nLg?i`kYBJE8xww_x{vpVju%mGbV#IeX(`wrwB&uzU0t zs2BE>&WSH__OsyEj^^x_FD>Xb{6+PL3-(Ej(J?UN<3Qqk9O6kEla(NpWWm}o?1R!* z7jE~^l(zrxzkay>)&BR^KY8!{b$avc`ZpiF_)nYf6xxQ$W!D#%I`{LLqYIbqX9Y%= N+4iSIKLF(rHLUCYy!ikC literal 0 HcmV?d00001 diff --git a/extra/base/src/glb_dispatchuse.sma b/extra/base/src/glb_dispatchuse.sma index ab5066e..94b3196 100644 --- a/extra/base/src/glb_dispatchuse.sma +++ b/extra/base/src/glb_dispatchuse.sma @@ -6,9 +6,15 @@ public plugin_init() { - register_plugin( "GAME-MONSTER: Use Dispatcher", "1.0", "Giegue" ); + register_plugin( "GAME-MONSTER: Use Dispatcher", "1.1", "Giegue" ); + register_cvar( "_glb_use", "1" ); + + // Game --> MonsterMod RegisterHam( Ham_Use, "func_wall", "DispatchUse" ); + + // MonsterMod --> Game + register_srvcmd( "_trigger", "FireTargets" ); } public DispatchUse( entity, caller, activator, useType, Float:value ) @@ -22,3 +28,30 @@ public DispatchUse( entity, caller, activator, useType, Float:value ) return HAM_IGNORED; } + +public FireTargets() +{ + if ( read_argc() == 6 ) + { + new entity, caller, activator; + new Float:value; + new useType; + + entity = read_argv_int( 1 ); + caller = read_argv_int( 2 ); + activator = read_argv_int( 3 ); + value = read_argv_float( 4 ); + useType = read_argv_int( 5 ); + + // caller and activator can be null, but never allow entity to be null + if ( !is_valid_ent( entity ) ) + return; + + if ( !is_valid_ent( caller ) ) + caller = 0; + if ( !is_valid_ent( activator ) ) + activator = 0; + + ExecuteHamB( Ham_Use, entity, caller, activator, useType, value ); + } +} diff --git a/extra/base/src/glb_takedamage.sma b/extra/base/src/glb_takedamage.sma new file mode 100644 index 0000000..2a60294 --- /dev/null +++ b/extra/base/src/glb_takedamage.sma @@ -0,0 +1,42 @@ +#pragma semicolon 1 + +#include +#include +#include + +public plugin_init() +{ + register_plugin( "GAME-MONSTER: External TakeDamage", "1.0", "Giegue" ); + + register_cvar( "_glb_takedamage", "1" ); + + // MonsterMod --> Game + register_srvcmd( "_takedamage", "TakeDamage" ); +} + +public TakeDamage() +{ + if ( read_argc() == 6 ) + { + new victim, inflictor, attacker; + new Float:damage; + new damageBits; + + victim = read_argv_int( 1 ); + inflictor = read_argv_int( 2 ); + attacker = read_argv_int( 3 ); + damage = read_argv_float( 4 ); + damageBits = read_argv_int( 5 ); + + // attacker and inflictor can be null, but never allow victim to be null + if ( !is_valid_ent( victim ) ) + return; + + if ( !is_valid_ent( inflictor ) ) + inflictor = 0; + if ( !is_valid_ent( attacker ) ) + attacker = 0; + + ExecuteHamB( Ham_TakeDamage, victim, inflictor, attacker, damage, damageBits ); + } +} diff --git a/extra/cstrike/README.md b/extra/cstrike/README.md new file mode 100644 index 0000000..de3fcbf --- /dev/null +++ b/extra/cstrike/README.md @@ -0,0 +1,17 @@ +## Counter-Strike (cstrike) + +Auxiliary Tools to use MonsterMod in Counter-Strike. + +### AMX Mod X Plugins + +#### -A note about AMXX plugins- + +All plugins in this section require AMXX 1.9.0 or greater, they will not work on 1.8.2 or older. + +Compiled plugins are provided in the `bin` folder for your convenience. However, if you prefer to build the plugins yourself, the source code of all AMXX plugins are located in the `src` folder for compilation. + +#### Unprecacher + +Counter-Strike precaches the sounds of all weapons. This means that sounds such as "clip-ins", "clip-outs" are added to the list, taking quite a bit of space in the precache count. Let it be a reminder that our good old GoldSrc can only store a maximum of 512 precached resources. Most of these sounds are handled client-side by the models themselves, so there is no need for them to be kept precached on the server. Only the weapons fire sounds are needed. + +This plugin removes 85 sounds from the precache list, adding extra space for additional monsters to fit in the map. diff --git a/extra/cstrike/bin/cs_unprecacher.amxx b/extra/cstrike/bin/cs_unprecacher.amxx new file mode 100644 index 0000000000000000000000000000000000000000..f4af3386715ccf270606ad8fe033d15f67f1c89b GIT binary patch literal 2377 zcmV-P3AXlFSWQ6y0|5jv2><{IVE_Oqn*ab90001ZoaLNNY#iko$DehaWW!ei36MYl z10gXXfsmLGXi99aKVn$hi+2-JwbC-)o%K#VJF}XZjqSpLLl3P~AyARp8V(#dAhib$ zk?5g^R-$ST9D1l!4pd4d4yhEiAR&R;O7#ECJmcLMJG(pHNPcG@>GAvh@q6Bnd3V

sWtj!r#-mnZW z^j9SVIr^O8db*Pj66)cS?JQ_ckqWluX-JsV7E`97Tb@f(=hEqXHa9adH6HlSkEU|d zGc;z}nn!0GGhfo?^@{Fkbf#4I6D9T-pgb(5>a&=K-@)2FO;r3Y(aX;f{ooAvF~GSY z@DGDO1^yB6kAi;;{Nvz13;qf4KM(#Fz>fufU=sWo;QiC!$EL97MexsnKMVdG_%R_C zU;-V=>!b>`p%&DIJ|Xe*P;{4g?DNoB$!GFhka9H%n=-!_r0m6Y#&fes6#fDQoQ9M! zq>M`3p>%?u%kcQ~Tu{vht?)D39K~<$vuu>#6@OSh?)-6D`z#yfS9$HTw98+TJWfM7 z_Vc+cuKWv<)~)mZdi>om{~P&>lApt-~1- zezze$+zT4#L|CUQ{>^HGsQjLk<#>nGeD}-JjK3sl6{?SCoZf?XieJ_D;8FQi-0Rko zPVvX}{I?!|T;7AX!p~!TQSyb)voOqgRbCG_ieHuW&?)}4&O<6Z6K^EH3g^LQ{CvJY zAz}9OJ3p1z`)cVFzbfl}wM6A#Yrd<*9ZDH_4vDK{kOs&*Y(fm*#Sup z*M3~)K1&q-xXgW)PVlQb_gSLw$K~BWOB8-i3-`kC3|yf4nKv)>lteePU2Y`53VT8; z{KqM<0sq#easTJvm8iV;v22uI<-Lz33O~>FvXtq@@h?ce@EriJc~$=}u2cM~{$E%t z{G7(jy#Mp>v*L6Hj>;dGGjON)RecV$!q4&i+r>DIdng;_S9RP&X_tSk_kOcfUnBfm zIhE|tjGyE9xfi#6Ka_U)yKVh9-=AjKhE>N+4~-qe+L|e|9WR#)ojs>pXYS=4v@bC3f}{E%kMwd z(!U>Y=&3pOQ9QHpzKEeNgfQ zf729H)_7rf+D}bOa}B90SBUdGNzklqn`lI{me5#m6L>F`*mbzod`0)lc9FIs$DFBG z?4nNFC~eHD~1~IqLm|+!zs37K6O1Tpj%2}E@iIz>e4KX=gtGJkxDR;=J*pA=gE`)-T zLzYpY+Yy}9ts30{&-1onWj)Q)X*ZWHJNCke0V8;ZZNc0rmlJF5u;$R62)(3hRohCL zn(O*i-^C5pJbSpdRFAxyBP$i#5A0njHDQ%(+E=f{c0E7GJq+UMm6eElrTj|7e!!c$ z@4YYZ8kHb;Kjj?Fa$nGw=mE;wjyD;MNS`0@vph&cj-xHnLo{Mf+1@!|qeC>Jd0K|^^{;p{wo8vvb~2UG92fZyvwuc+Yob-K%i{f^Vt8#wThmyt&%Z^4GbIwU21xg0CZk6YdW_} z$0=B9e&7U+TAtx81%oy~;BiuwB0f3{nYtjKgpqW!==-0hVa?U+;ZxV%W&g~o+w23` zChnJ){_xf3pDrg4&ph|{o#CoVVpsp{kKeHOBom zw!aJi`ITQq-(XdH5u4A2U%Z}N{P6NuBl+R!>GbH(6tyqhFWyqQ{>6VSC;J9<9)rF& v5x(-z<>V)?|2#Q1F`6F9XU|U0r`QdF~%?VLdCm2KfIEL7rMNmNNaa literal 0 HcmV?d00001 diff --git a/extra/cstrike/src/cs_unprecacher.sma b/extra/cstrike/src/cs_unprecacher.sma new file mode 100644 index 0000000..056e93c --- /dev/null +++ b/extra/cstrike/src/cs_unprecacher.sma @@ -0,0 +1,126 @@ +#pragma semicolon 1 + +#include +#include + +// List of sounds that must NOT be precached +new g_SoundList[][64] = +{ + "weapons/ak47_boltpull.wav", + "weapons/ak47_clipin.wav", + "weapons/ak47_clipout.wav", + "weapons/aug_boltpull.wav", + "weapons/aug_boltslap.wav", + "weapons/aug_clipin.wav", + "weapons/aug_clipout.wav", + "weapons/aug_forearm.wav", + "weapons/awp_clipin.wav", + "weapons/awp_clipout.wav", + "weapons/awp_deploy.wav", + "weapons/boltdown.wav", + "weapons/boltpull1.wav", + "weapons/boltup.wav", + "weapons/clipin1.wav", + "weapons/clipout1.wav", + "weapons/de_clipin.wav", + "weapons/de_clipout.wav", + "weapons/de_deploy.wav", + "weapons/elite_clipout.wav", + "weapons/elite_deploy.wav", + "weapons/elite_leftclipin.wav", + "weapons/elite_reloadstart.wav", + "weapons/elite_rightclipin.wav", + "weapons/elite_sliderelease.wav", + "weapons/elite_twirl.wav", + "weapons/famas_boltpull.wav", + "weapons/famas_boltslap.wav", + "weapons/famas_clipin.wav", + "weapons/famas_clipout.wav", + "weapons/famas_forearm.wav", + "weapons/fiveseven_clipin.wav", + "weapons/fiveseven_clipout.wav", + "weapons/fiveseven_slidepull.wav", + "weapons/fiveseven_sliderelease.wav", + "weapons/g3sg1_clipin.wav", + "weapons/g3sg1_clipout.wav", + "weapons/g3sg1_slide.wav", + "weapons/galil_boltpull.wav", + "weapons/galil_clipin.wav", + "weapons/galil_clipout.wav", + "weapons/m4a1_boltpull.wav", + "weapons/m4a1_clipin.wav", + "weapons/m4a1_clipout.wav", + "weapons/m4a1_deploy.wav", + "weapons/m4a1_silencer_off.wav", + "weapons/m4a1_silencer_on.wav", + "weapons/m249_boxin.wav", + "weapons/m249_boxout.wav", + "weapons/m249_chain.wav", + "weapons/m249_coverdown.wav", + "weapons/m249_coverup.wav", + "weapons/mac10_boltpull.wav", + "weapons/mac10_clipin.wav", + "weapons/mac10_clipout.wav", + "weapons/mp5_clipin.wav", + "weapons/mp5_clipout.wav", + "weapons/mp5_slideback.wav", + "weapons/p90_boltpull.wav", + "weapons/p90_clipin.wav", + "weapons/p90_clipout.wav", + "weapons/p90_cliprelease.wav", + "weapons/p228_clipin.wav", + "weapons/p228_clipout.wav", + "weapons/p228_slidepull.wav", + "weapons/p228_sliderelease.wav", + "weapons/scout_bolt.wav", + "weapons/scout_clipin.wav", + "weapons/scout_clipout.wav", + "weapons/sg550_boltpull.wav", + "weapons/sg550_clipin.wav", + "weapons/sg550_clipout.wav", + "weapons/sg552_boltpull.wav", + "weapons/sg552_clipin.wav", + "weapons/sg552_clipout.wav", + "weapons/slideback1.wav", + "weapons/sliderelease1.wav", + "weapons/ump45_boltslap.wav", + "weapons/ump45_clipin.wav", + "weapons/ump45_clipout.wav", + "weapons/usp_clipin.wav", + "weapons/usp_clipout.wav", + "weapons/usp_silencer_off.wav", + "weapons/usp_silencer_on.wav", + "weapons/usp_slideback.wav", + "weapons/usp_sliderelease.wav" +}; + +public plugin_init() +{ + register_plugin( "CS-MONSTER: Unprecacher", "1.0", "Giegue" ); +} + +public plugin_precache() +{ + register_forward( FM_PrecacheSound, "fw_PrecacheSound" ); +} + +public fw_PrecacheSound( const sound[] ) +{ + static bool:bBlock, i; + bBlock = false; + i = 0; + + for ( i = 0; i < sizeof( g_SoundList ); i++ ) + { + if (contain( sound, g_SoundList[ i ] ) != -1 ) + { + bBlock = true; + break; + } + } + + if ( bBlock ) + return FMRES_SUPERCEDE; + + return FMRES_IGNORED; +} diff --git a/extra/valve/README.md b/extra/valve/README.md index 0010cdf..1b063f8 100644 --- a/extra/valve/README.md +++ b/extra/valve/README.md @@ -10,7 +10,7 @@ All plugins in this section require AMXX 1.9.0 or greater, they will not work on Compiled plugins are provided in the `bin` folder for your convenience. However, if you prefer to build the plugins yourself, the source code of all AMXX plugins are located in the `src` folder for compilation. -#### Half-Life <--> MonsterMod Bridge Plugin +#### Bridge Plugin MonsterMod monsters are hacked "func_wall"'s with simulated AI. Because of this, MonsterMod cannot interact with the Half-Life monsters. This issue also happens on the other side: The Half-Life monsters cannot interact with the MonsterMod monsters. diff --git a/extra/valve/bin/hl_monsterbridge.amxx b/extra/valve/bin/hl_monsterbridge.amxx index ada2c3eb826b26a78c41e0c717ec36ede769cdaa..cb05ae8e7999f802f64b28e53d7de643552d7bdc 100644 GIT binary patch literal 4431 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 V@K}R++PB}-CVzMF{{fb3KvqnP0we$c literal 4426 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 Q{N^JnH@4UR11Ob1d3T58V*mgE diff --git a/extra/valve/src/hl_monsterbridge.sma b/extra/valve/src/hl_monsterbridge.sma index cb4b933..57b8fe6 100644 --- a/extra/valve/src/hl_monsterbridge.sma +++ b/extra/valve/src/hl_monsterbridge.sma @@ -14,9 +14,11 @@ const R_HT = 2; // (HATE) will attack this character instead of any visible DISL new Trie:g_HLDefaultNames; +const bits_MEMORY_NAMED = ( 1 << 2 ); + public plugin_init() { - register_plugin( "HL-MONSTER Bridge", "1.1", "Giegue" ); + register_plugin( "HL-MONSTER Bridge", "1.2", "Giegue" ); RegisterHam( Ham_IRelationship, "monster_alien_controller", "mmIRelationship" ); RegisterHam( Ham_IRelationship, "monster_alien_grunt", "mmIRelationship" ); @@ -69,8 +71,32 @@ public plugin_init() TrieSetString( g_HLDefaultNames, "monster_nihilanth", "Nihilanth" ); TrieSetString( g_HLDefaultNames, "monster_tentacle", "Tentacle" ); - set_task( 0.3, "hlScan", 0, "", 0, "b" ); - register_srvcmd( "monster_hurt_entity", "hlTakeDamage" ); + // HACK: since Ham_Spawn won't work, this should do as an alternative + RegisterHam( Ham_SetObjectCollisionBox, "monster_headcrab", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_babycrab", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_bullchicken", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_barnacle", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_bigmomma", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_houndeye", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_alien_slave", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_alien_controller", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_alien_grunt", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_zombie", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_ichthyosaur", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_human_grunt", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_human_assassin", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_barney", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_gman", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_scientist", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_sentry", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_snark", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_miniturret", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_turret", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_apache", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_osprey", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_gargantua", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_nihilanth", "hlSpawn", 1 ); + RegisterHam( Ham_SetObjectCollisionBox, "monster_tentacle", "hlSpawn", 1 ); RegisterHam( Ham_Killed, "player", "PlayerKilled", 1 ); } @@ -94,43 +120,40 @@ public mmIRelationship( entity, other ) return HAM_OVERRIDE; } -public hlScan() +public hlSpawn( entity ) { - new entity, szClassname[ 33 ], szDisplayname[ 129 ], bool:found; - for ( entity = 0; entity < get_global_int( GL_maxEntities ); entity++ ) + // Why is it called 3 times? Restrict this to only once + if ( !( entity_get_int( entity, EV_INT_impulse ) & bits_MEMORY_NAMED ) ) { - // Nothing deleted me? - if ( is_valid_ent( entity ) ) + // Classify not overriden? + if ( !entity_get_int( entity, EV_INT_iuser4 ) ) { - entity_get_string( entity, EV_SZ_classname, szClassname, charsmax( szClassname ) ); - if ( equal( szClassname, "monster_", 8 ) ) - { - // Classify not overriden? - if ( !entity_get_int( entity, EV_INT_iuser4 ) ) - { - // Set default - entity_set_int( entity, EV_INT_iuser4, ExecuteHam( Ham_Classify, entity ) ); - } - - // Blood color not overriden? - if ( !entity_get_int( entity, EV_INT_iuser3 ) ) - { - // Set default - entity_set_int( entity, EV_INT_iuser3, ExecuteHam( Ham_BloodColor, entity ) ); - } - - // No name set? - entity_get_string( entity, EV_SZ_netname, szDisplayname, charsmax( szDisplayname ) ); - if ( !strlen( szDisplayname ) ) - { - // Find a default name - found = TrieGetString( g_HLDefaultNames, szClassname, szDisplayname, charsmax( szDisplayname ) ); - - // Use this name - entity_set_string( entity, EV_SZ_netname, ( found ? szDisplayname : "Monster" ) ); - } - } + // Set default + entity_set_int( entity, EV_INT_iuser4, ExecuteHam( Ham_Classify, entity ) ); } + + // Blood color not overriden? + if ( !entity_get_int( entity, EV_INT_iuser3 ) ) + { + // Set default + entity_set_int( entity, EV_INT_iuser3, ExecuteHam( Ham_BloodColor, entity ) ); + } + + // No name set? + new szDisplayname[ 129 ]; + entity_get_string( entity, EV_SZ_netname, szDisplayname, charsmax( szDisplayname ) ); + if ( !strlen( szDisplayname ) ) + { + // Find a default name + new szClassname[ 33 ], bool:found; + entity_get_string( entity, EV_SZ_classname, szClassname, charsmax( szClassname ) ); + found = TrieGetString( g_HLDefaultNames, szClassname, szDisplayname, charsmax( szDisplayname ) ); + + // Use this name + entity_set_string( entity, EV_SZ_netname, ( found ? szDisplayname : "Monster" ) ); + } + + entity_set_int( entity, EV_INT_impulse, entity_get_int( entity, EV_INT_impulse ) | bits_MEMORY_NAMED ); } } @@ -162,33 +185,6 @@ stock IRelationshipByClass( classEntity, classOther ) return iEnemy[ classEntity ][ classOther ]; } -public hlTakeDamage() -{ - if ( read_argc() == 6 ) - { - new victim, inflictor, attacker; - new Float:damage; - new damageBits; - - victim = read_argv_int( 1 ); - inflictor = read_argv_int( 2 ); - attacker = read_argv_int( 3 ); - damage = read_argv_float( 4 ); - damageBits = read_argv_int( 5 ); - - // attacker and inflictor can be null, but never allow victim to be null - if ( !is_valid_ent( victim ) ) - return; - - if ( !is_valid_ent( inflictor ) ) - inflictor = 0; - if ( !is_valid_ent( attacker ) ) - attacker = 0; - - ExecuteHamB( Ham_TakeDamage, victim, inflictor, attacker, damage, damageBits ); - } -} - public PlayerKilled( victim, attacker, shouldgib ) { // don't obstruct monstermod