Fix Male Assassin unable to use the Sniper Rifle.
Partially fixed the Stukabat being unable to move when target is unreachable. Removed zombie/gonome bullet resistance. Add Global Model Replacement and Global Sound Replacement. Update Tier milestones.
This commit is contained in:
18
README.md
18
README.md
@@ -29,7 +29,7 @@ Not anymore...
|
|||||||
|
|
||||||
The first goal of this project aims towards the recreation of the new features of the "obscured and updated" Monster Mod plugin. Taking botman's original 2002 plugin and working from the ground up, the mission is to rebuild it with the new features and monsters that only few were able to see.
|
The first goal of this project aims towards the recreation of the new features of the "obscured and updated" Monster Mod plugin. Taking botman's original 2002 plugin and working from the ground up, the mission is to rebuild it with the new features and monsters that only few were able to see.
|
||||||
|
|
||||||
The source code is completely free for everyone to use: In the event that the development of this project falls and becomes stagnant again, the plugin will live on, as the project's second goal is its preservation. The original botman's page where you can download the 2002 plugin will not stay up forever.
|
The source code is completely free for everyone to use: In the event that the development of this project falls and becomes stagnant again, the plugin will live on, as the project's second goal is its preservation. ~~The original botman's page where you can download the 2002 plugin will not stay up forever.~~ **April 2023 update**: The page is gone, the original 2002 plugin can no longer be found.
|
||||||
|
|
||||||
Under no circumstances shall we allow this project to fade away and become lost amidst the gears of time.
|
Under no circumstances shall we allow this project to fade away and become lost amidst the gears of time.
|
||||||
|
|
||||||
@@ -45,6 +45,8 @@ The plugin -should- be able to be used out-of-the-box by simply downloading the
|
|||||||
|
|
||||||
Additional configuration files are included in the release files, each explaining it's usage and installation instructions.
|
Additional configuration files are included in the release files, each explaining it's usage and installation instructions.
|
||||||
|
|
||||||
|
Extra MonsterMod features can be unlocked with additional AMX Mod X plugins which are located in the `extra` folder. All these plugins are optional, and only required based on your use-case.
|
||||||
|
|
||||||
## Build Instructions
|
## Build Instructions
|
||||||
|
|
||||||
The [wiki](https://github.com/JulianR0/monstermod-redo/wiki) contains instructions on how to compile MonsterMod by yourself.
|
The [wiki](https://github.com/JulianR0/monstermod-redo/wiki) contains instructions on how to compile MonsterMod by yourself.
|
||||||
@@ -196,15 +198,21 @@ Current milestones are separated by "Tiers", which are as follows:
|
|||||||
|
|
||||||
- Implement reading entities within the BSP itself. **[DONE]**
|
- Implement reading entities within the BSP itself. **[DONE]**
|
||||||
- Add build instructions. **[DONE]**
|
- Add build instructions. **[DONE]**
|
||||||
- Custom sound support, along with sentences.
|
- Global Model Replacement. **[DONE]**
|
||||||
- Fix all pending bugs.
|
- Global Sound Replacement. **[DONE]**
|
||||||
|
- Miscellaneous customization options, such as blood color.
|
||||||
|
- Individual sound replacement: "soundlist" keyvalue for monsters.
|
||||||
|
- Sentences support for speakable monsters.
|
||||||
|
- Attempt to fix bugs as they appear.
|
||||||
|
|
||||||
### Tier 5
|
### Tier 5
|
||||||
|
|
||||||
|
- Enhance the AI.
|
||||||
- Add configurations to change AI behaviour.
|
- Add configurations to change AI behaviour.
|
||||||
- Optimize code and enhance the AI.
|
|
||||||
- Create "tool" entities for easier map customization.
|
- Create "tool" entities for easier map customization.
|
||||||
- Do more fixes not covered in Tier 4.
|
- Optimize and clean the code.
|
||||||
|
- Add a wiki with full documentation.
|
||||||
|
- Fix **ALL** bugs, specially those not covered in Tier 4.
|
||||||
|
|
||||||
|
|
||||||
What will the future hold after all Tiers has been completed?
|
What will the future hold after all Tiers has been completed?
|
||||||
|
|||||||
@@ -19,12 +19,12 @@
|
|||||||
#include "extdll.h"
|
#include "extdll.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "cmbase.h"
|
#include "cmbase.h"
|
||||||
#include "cmbasemonster.h"
|
#include "cmbasemonster.h"
|
||||||
#include "monsters.h"
|
#include "monsters.h"
|
||||||
#include "schedule.h"
|
#include "schedule.h"
|
||||||
#include "weapons.h"
|
#include "weapons.h"
|
||||||
#include "hornet.h"
|
#include "hornet.h"
|
||||||
#include "skill.h"
|
#include "skill.h"
|
||||||
|
|
||||||
|
|
||||||
//=========================================================
|
//=========================================================
|
||||||
@@ -532,7 +532,7 @@ void CMAGrunt :: Spawn()
|
|||||||
{
|
{
|
||||||
Precache( );
|
Precache( );
|
||||||
|
|
||||||
SET_MODEL(ENT(pev), "models/agrunt.mdl");
|
SET_MODEL(ENT(pev), (!FStringNull( pev->model ) ? STRING( pev->model ) : "models/agrunt.mdl"));
|
||||||
UTIL_SetSize(pev, Vector(-32, -32, 0), Vector(32, 32, 64));
|
UTIL_SetSize(pev, Vector(-32, -32, 0), Vector(32, 32, 64));
|
||||||
|
|
||||||
pev->solid = SOLID_SLIDEBOX;
|
pev->solid = SOLID_SLIDEBOX;
|
||||||
@@ -563,40 +563,23 @@ void CMAGrunt :: Spawn()
|
|||||||
//=========================================================
|
//=========================================================
|
||||||
void CMAGrunt :: Precache()
|
void CMAGrunt :: Precache()
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
PRECACHE_MODEL("models/agrunt.mdl");
|
PRECACHE_MODEL("models/agrunt.mdl");
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ )
|
PRECACHE_SOUND_ARRAY( pAttackHitSounds );
|
||||||
PRECACHE_SOUND((char *)pAttackHitSounds[i]);
|
PRECACHE_SOUND_ARRAY( pAttackHitSounds );
|
||||||
|
PRECACHE_SOUND_ARRAY( pAttackMissSounds );
|
||||||
|
PRECACHE_SOUND_ARRAY( pIdleSounds );
|
||||||
|
PRECACHE_SOUND_ARRAY( pDieSounds );
|
||||||
|
PRECACHE_SOUND_ARRAY( pPainSounds );
|
||||||
|
PRECACHE_SOUND_ARRAY( pAttackSounds );
|
||||||
|
PRECACHE_SOUND_ARRAY( pAlertSounds );
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ )
|
iAgruntMuzzleFlash = PRECACHE_MODELINDEX("sprites/muz4.spr");
|
||||||
PRECACHE_SOUND((char *)pAttackMissSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ )
|
CMHornet hornet;
|
||||||
PRECACHE_SOUND((char *)pIdleSounds[i]);
|
hornet.Precache();
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pDieSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pDieSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pPainSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pPainSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pAttackSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pAlertSounds[i]);
|
|
||||||
|
|
||||||
|
|
||||||
PRECACHE_SOUND( "hassault/hw_shoot1.wav" );
|
|
||||||
|
|
||||||
iAgruntMuzzleFlash = PRECACHE_MODEL( "sprites/muz4.spr" );
|
|
||||||
|
|
||||||
CMHornet hornet;
|
|
||||||
hornet.Precache();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//=========================================================
|
//=========================================================
|
||||||
// AI Schedules Specific to this monster
|
// AI Schedules Specific to this monster
|
||||||
//=========================================================
|
//=========================================================
|
||||||
@@ -1030,7 +1013,7 @@ Schedule_t *CMAGrunt :: GetSchedule ( void )
|
|||||||
// zap player!
|
// zap player!
|
||||||
if ( HasConditions ( bits_COND_CAN_MELEE_ATTACK1 ) )
|
if ( HasConditions ( bits_COND_CAN_MELEE_ATTACK1 ) )
|
||||||
{
|
{
|
||||||
AttackSound();// this is a total hack. Should be parto f the schedule
|
AttackSound();// this is a total hack. Should be part of the schedule
|
||||||
return GetScheduleOfType ( SCHED_MELEE_ATTACK1 );
|
return GetScheduleOfType ( SCHED_MELEE_ATTACK1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ void SequencePrecache( void *pmodel, const char *pSequenceName )
|
|||||||
ALERT( at_error, "Bad sound event %d in sequence %s :: %s (sound is \"%s\")\n", pevent[i].event, pstudiohdr->name, pSequenceName, pevent[i].options );
|
ALERT( at_error, "Bad sound event %d in sequence %s :: %s (sound is \"%s\")\n", pevent[i].event, pstudiohdr->name, pSequenceName, pevent[i].options );
|
||||||
}
|
}
|
||||||
|
|
||||||
PRECACHE_SOUND( (char *)(gpGlobals->pStringBase + ALLOC_STRING(pevent[i].options) ) );
|
PRECACHE_SOUND2( (char *)(gpGlobals->pStringBase + ALLOC_STRING(pevent[i].options) ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,14 +105,14 @@ void CMApache::Precache( void )
|
|||||||
|
|
||||||
PRECACHE_SOUND("weapons/mortarhit.wav");
|
PRECACHE_SOUND("weapons/mortarhit.wav");
|
||||||
|
|
||||||
m_iSpriteTexture = PRECACHE_MODEL( "sprites/white.spr" );
|
m_iSpriteTexture = PRECACHE_MODELINDEX( "sprites/white.spr" );
|
||||||
|
|
||||||
PRECACHE_SOUND("turret/tu_fire1.wav");
|
PRECACHE_SOUND("turret/tu_fire1.wav");
|
||||||
|
|
||||||
PRECACHE_MODEL("sprites/lgtning.spr");
|
PRECACHE_MODEL("sprites/lgtning.spr");
|
||||||
|
|
||||||
m_iExplode = PRECACHE_MODEL( "sprites/fexplo.spr" );
|
m_iExplode = PRECACHE_MODELINDEX( "sprites/fexplo.spr" );
|
||||||
m_iBodyGibs = PRECACHE_MODEL( "models/metalplategibs_green.mdl" );
|
m_iBodyGibs = PRECACHE_MODELINDEX( "models/metalplategibs_green.mdl" );
|
||||||
|
|
||||||
CMApacheHVR apache_rocket;
|
CMApacheHVR apache_rocket;
|
||||||
apache_rocket.Precache();
|
apache_rocket.Precache();
|
||||||
@@ -178,7 +178,7 @@ void CMApache :: DyingThink( void )
|
|||||||
if (m_flNextRocket > gpGlobals->time )
|
if (m_flNextRocket > gpGlobals->time )
|
||||||
{
|
{
|
||||||
if (g_sModelIndexFireball == 0)
|
if (g_sModelIndexFireball == 0)
|
||||||
g_sModelIndexFireball = PRECACHE_MODEL ("sprites/zerogxplode.spr"); // fireball
|
g_sModelIndexFireball = PRECACHE_MODELINDEX("sprites/zerogxplode.spr"); // fireball
|
||||||
|
|
||||||
// random explosions
|
// random explosions
|
||||||
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin );
|
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin );
|
||||||
@@ -193,7 +193,7 @@ void CMApache :: DyingThink( void )
|
|||||||
MESSAGE_END();
|
MESSAGE_END();
|
||||||
|
|
||||||
if (g_sModelIndexSmoke == 0)
|
if (g_sModelIndexSmoke == 0)
|
||||||
g_sModelIndexSmoke = PRECACHE_MODEL ("sprites/steam1.spr"); // smoke
|
g_sModelIndexSmoke = PRECACHE_MODELINDEX("sprites/steam1.spr"); // smoke
|
||||||
|
|
||||||
// lots of smoke
|
// lots of smoke
|
||||||
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin );
|
MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin );
|
||||||
@@ -930,7 +930,7 @@ void CMApacheHVR :: Spawn( void )
|
|||||||
void CMApacheHVR :: Precache( void )
|
void CMApacheHVR :: Precache( void )
|
||||||
{
|
{
|
||||||
PRECACHE_MODEL("models/HVR.mdl");
|
PRECACHE_MODEL("models/HVR.mdl");
|
||||||
m_iTrail = PRECACHE_MODEL("sprites/smoke.spr");
|
m_iTrail = PRECACHE_MODELINDEX("sprites/smoke.spr");
|
||||||
PRECACHE_SOUND ("weapons/rocket1.wav");
|
PRECACHE_SOUND ("weapons/rocket1.wav");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -648,8 +648,8 @@ void CMBigMomma :: Precache()
|
|||||||
|
|
||||||
// TEMP: Squid
|
// TEMP: Squid
|
||||||
PRECACHE_MODEL("sprites/mommaspit.spr");// spit projectile.
|
PRECACHE_MODEL("sprites/mommaspit.spr");// spit projectile.
|
||||||
gSpitSprite = PRECACHE_MODEL("sprites/mommaspout.spr");// client side spittle.
|
gSpitSprite = PRECACHE_MODELINDEX("sprites/mommaspout.spr");// client side spittle.
|
||||||
gSpitDebrisSprite = PRECACHE_MODEL("sprites/mommablob.spr" );
|
gSpitDebrisSprite = PRECACHE_MODELINDEX("sprites/mommablob.spr" );
|
||||||
|
|
||||||
PRECACHE_SOUND( "bullchicken/bc_acid1.wav" );
|
PRECACHE_SOUND( "bullchicken/bc_acid1.wav" );
|
||||||
PRECACHE_SOUND( "bullchicken/bc_spithit1.wav" );
|
PRECACHE_SOUND( "bullchicken/bc_spithit1.wav" );
|
||||||
|
|||||||
@@ -642,7 +642,7 @@ void CMBullsquid :: Precache()
|
|||||||
|
|
||||||
PRECACHE_MODEL("sprites/bigspit.spr");// spit projectile.
|
PRECACHE_MODEL("sprites/bigspit.spr");// spit projectile.
|
||||||
|
|
||||||
iSquidSpitSprite = PRECACHE_MODEL("sprites/tinyspit.spr");// client side spittle.
|
iSquidSpitSprite = PRECACHE_MODELINDEX("sprites/tinyspit.spr");// client side spittle.
|
||||||
|
|
||||||
PRECACHE_SOUND("zombie/claw_miss2.wav");// because we use the basemonster SWIPE animation event
|
PRECACHE_SOUND("zombie/claw_miss2.wav");// because we use the basemonster SWIPE animation event
|
||||||
|
|
||||||
|
|||||||
@@ -608,3 +608,7 @@ template <class T> T * CreateClassPtr( T *a )
|
|||||||
|
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef GLOBALREPLACE_H
|
||||||
|
#include "globalreplace.h"
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -809,18 +809,18 @@ DLL_GLOBAL short g_sModelIndexLaserDot;// holds the index for the laser beam dot
|
|||||||
|
|
||||||
void world_precache(void)
|
void world_precache(void)
|
||||||
{
|
{
|
||||||
g_sModelIndexFireball = PRECACHE_MODEL ("sprites/zerogxplode.spr");// fireball
|
g_sModelIndexFireball = PRECACHE_MODELINDEX("sprites/zerogxplode.spr");// fireball
|
||||||
g_sModelIndexSmoke = PRECACHE_MODEL ("sprites/steam1.spr");// smoke
|
g_sModelIndexSmoke = PRECACHE_MODELINDEX("sprites/steam1.spr");// smoke
|
||||||
g_sModelIndexTinySpit = PRECACHE_MODEL ("sprites/tinyspit.spr");// spore
|
g_sModelIndexTinySpit = PRECACHE_MODELINDEX("sprites/tinyspit.spr");// spore
|
||||||
g_sModelIndexWExplosion = PRECACHE_MODEL ("sprites/WXplo1.spr");// underwater fireball
|
g_sModelIndexWExplosion = PRECACHE_MODELINDEX("sprites/WXplo1.spr");// underwater fireball
|
||||||
g_sModelIndexBubbles = PRECACHE_MODEL ("sprites/bubble.spr");//bubbles
|
g_sModelIndexBubbles = PRECACHE_MODELINDEX("sprites/bubble.spr");//bubbles
|
||||||
g_sModelIndexBloodSpray = PRECACHE_MODEL ("sprites/bloodspray.spr"); // initial blood
|
g_sModelIndexBloodSpray = PRECACHE_MODELINDEX("sprites/bloodspray.spr"); // initial blood
|
||||||
g_sModelIndexBloodDrop = PRECACHE_MODEL ("sprites/blood.spr"); // splattered blood
|
g_sModelIndexBloodDrop = PRECACHE_MODELINDEX("sprites/blood.spr"); // splattered blood
|
||||||
|
|
||||||
g_sModelIndexLaser = PRECACHE_MODEL( (char *)g_pModelNameLaser );
|
g_sModelIndexLaser = PRECACHE_MODELINDEX( (char *)g_pModelNameLaser );
|
||||||
g_sModelIndexLaserDot = PRECACHE_MODEL("sprites/laserdot.spr");
|
g_sModelIndexLaserDot = PRECACHE_MODELINDEX("sprites/laserdot.spr");
|
||||||
|
|
||||||
PRECACHE_MODEL ("models/w_grenade.mdl");
|
PRECACHE_MODEL("models/w_grenade.mdl");
|
||||||
}
|
}
|
||||||
|
|
||||||
void MonsterCommand(void)
|
void MonsterCommand(void)
|
||||||
@@ -1265,7 +1265,9 @@ int mmDispatchSpawn( edict_t *pent )
|
|||||||
for (index = 0; monster_types[index].name[0]; index++)
|
for (index = 0; monster_types[index].name[0]; index++)
|
||||||
monster_types[index].need_to_precache = FALSE;
|
monster_types[index].need_to_precache = FALSE;
|
||||||
|
|
||||||
world_precache();
|
CVAR_SET_STRING("monster_gmr", "");
|
||||||
|
CVAR_SET_STRING("monster_gsr", "");
|
||||||
|
REPLACER::Init();
|
||||||
|
|
||||||
monster_spawn_count = 0;
|
monster_spawn_count = 0;
|
||||||
node_spawn_count = 0;
|
node_spawn_count = 0;
|
||||||
@@ -1276,6 +1278,9 @@ int mmDispatchSpawn( edict_t *pent )
|
|||||||
|
|
||||||
process_monster_cfg();
|
process_monster_cfg();
|
||||||
|
|
||||||
|
// precache last in the event of a GMR being present
|
||||||
|
world_precache();
|
||||||
|
|
||||||
// node support. -Giegue
|
// node support. -Giegue
|
||||||
// init the WorldGraph.
|
// init the WorldGraph.
|
||||||
WorldGraph.InitGraph();
|
WorldGraph.InitGraph();
|
||||||
@@ -1818,7 +1823,7 @@ void mmMessageEnd_Post( void )
|
|||||||
|
|
||||||
RETURN_META( MRES_IGNORED );
|
RETURN_META( MRES_IGNORED );
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
enginefuncs_t meta_engfuncs =
|
enginefuncs_t meta_engfuncs =
|
||||||
{
|
{
|
||||||
NULL, // pfnPrecacheModel()
|
NULL, // pfnPrecacheModel()
|
||||||
@@ -2042,7 +2047,7 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte
|
|||||||
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
|
memcpy(pengfuncsFromEngine, &meta_engfuncs, sizeof(enginefuncs_t));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
enginefuncs_t meta_engfuncs_post =
|
enginefuncs_t meta_engfuncs_post =
|
||||||
{
|
{
|
||||||
NULL, // pfnPrecacheModel()
|
NULL, // pfnPrecacheModel()
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ void CMBeam::BeamInit( const char *pSpriteName, int width )
|
|||||||
SetFrame( 0 );
|
SetFrame( 0 );
|
||||||
SetScrollRate( 0 );
|
SetScrollRate( 0 );
|
||||||
pev->model = MAKE_STRING( pSpriteName );
|
pev->model = MAKE_STRING( pSpriteName );
|
||||||
SetTexture( PRECACHE_MODEL( (char *)pSpriteName ) );
|
SetTexture( PRECACHE_MODELINDEX( (char *)pSpriteName ) );
|
||||||
SetWidth( width );
|
SetWidth( width );
|
||||||
pev->skin = 0;
|
pev->skin = 0;
|
||||||
pev->sequence = 0;
|
pev->sequence = 0;
|
||||||
|
|||||||
@@ -23,10 +23,10 @@ extern enginefuncs_t g_engfuncs;
|
|||||||
|
|
||||||
// The actual engine callbacks
|
// The actual engine callbacks
|
||||||
#define GETPLAYERUSERID (*g_engfuncs.pfnGetPlayerUserId)
|
#define GETPLAYERUSERID (*g_engfuncs.pfnGetPlayerUserId)
|
||||||
#define PRECACHE_MODEL (*g_engfuncs.pfnPrecacheModel)
|
#define PRECACHE_MODEL2 (*g_engfuncs.pfnPrecacheModel)
|
||||||
#define PRECACHE_SOUND (*g_engfuncs.pfnPrecacheSound)
|
#define PRECACHE_SOUND2 (*g_engfuncs.pfnPrecacheSound)
|
||||||
#define PRECACHE_GENERIC (*g_engfuncs.pfnPrecacheGeneric)
|
#define PRECACHE_GENERIC (*g_engfuncs.pfnPrecacheGeneric)
|
||||||
#define SET_MODEL (*g_engfuncs.pfnSetModel)
|
#define SET_MODEL2 (*g_engfuncs.pfnSetModel)
|
||||||
#define MODEL_INDEX (*g_engfuncs.pfnModelIndex)
|
#define MODEL_INDEX (*g_engfuncs.pfnModelIndex)
|
||||||
#define MODEL_FRAMES (*g_engfuncs.pfnModelFrames)
|
#define MODEL_FRAMES (*g_engfuncs.pfnModelFrames)
|
||||||
#define SET_SIZE (*g_engfuncs.pfnSetSize)
|
#define SET_SIZE (*g_engfuncs.pfnSetSize)
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ void CMShower::Spawn( void )
|
|||||||
pev->speed = RANDOM_FLOAT( 0.5, 1.5 );
|
pev->speed = RANDOM_FLOAT( 0.5, 1.5 );
|
||||||
|
|
||||||
pev->angles = g_vecZero;
|
pev->angles = g_vecZero;
|
||||||
pev->classname = MAKE_STRING( "_spark_shower" );
|
pev->classname = MAKE_STRING( "spark_shower" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -172,7 +172,7 @@ void CMEnvExplosion::Spawn( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_spriteScale = (int)flSpriteScale;
|
m_spriteScale = (int)flSpriteScale;
|
||||||
pev->classname = MAKE_STRING( "_env_explosion" );
|
pev->classname = MAKE_STRING( "env_explosion" );
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMEnvExplosion::DelayUse( void )
|
void CMEnvExplosion::DelayUse( void )
|
||||||
|
|||||||
@@ -712,48 +712,25 @@ void CMGargantua :: Spawn()
|
|||||||
//=========================================================
|
//=========================================================
|
||||||
void CMGargantua :: Precache()
|
void CMGargantua :: Precache()
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
PRECACHE_MODEL("models/garg.mdl");
|
PRECACHE_MODEL("models/garg.mdl");
|
||||||
PRECACHE_MODEL( GARG_EYE_SPRITE_NAME );
|
PRECACHE_MODEL( GARG_EYE_SPRITE_NAME );
|
||||||
PRECACHE_MODEL( GARG_BEAM_SPRITE_NAME );
|
PRECACHE_MODEL( GARG_BEAM_SPRITE_NAME );
|
||||||
PRECACHE_MODEL( GARG_BEAM_SPRITE2 );
|
PRECACHE_MODEL( GARG_BEAM_SPRITE2 );
|
||||||
gStompSprite = PRECACHE_MODEL( GARG_STOMP_SPRITE_NAME );
|
gStompSprite = PRECACHE_MODELINDEX( GARG_STOMP_SPRITE_NAME );
|
||||||
gGargGibModel = PRECACHE_MODEL( GARG_GIB_MODEL );
|
gGargGibModel = PRECACHE_MODELINDEX( GARG_GIB_MODEL );
|
||||||
PRECACHE_SOUND( GARG_STOMP_BUZZ_SOUND );
|
PRECACHE_SOUND( GARG_STOMP_BUZZ_SOUND );
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pAttackHitSounds);
|
||||||
PRECACHE_SOUND((char *)pAttackHitSounds[i]);
|
PRECACHE_SOUND_ARRAY(pBeamAttackSounds);
|
||||||
|
PRECACHE_SOUND_ARRAY(pAttackMissSounds);
|
||||||
for ( i = 0; i < ARRAYSIZE( pBeamAttackSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pRicSounds);
|
||||||
PRECACHE_SOUND((char *)pBeamAttackSounds[i]);
|
PRECACHE_SOUND_ARRAY(pFootSounds);
|
||||||
|
PRECACHE_SOUND_ARRAY(pIdleSounds);
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pAlertSounds);
|
||||||
PRECACHE_SOUND((char *)pAttackMissSounds[i]);
|
PRECACHE_SOUND_ARRAY(pPainSounds);
|
||||||
|
PRECACHE_SOUND_ARRAY(pAttackSounds);
|
||||||
for ( i = 0; i < ARRAYSIZE( pRicSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pStompSounds);
|
||||||
PRECACHE_SOUND((char *)pRicSounds[i]);
|
PRECACHE_SOUND_ARRAY(pBreatheSounds);
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pFootSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pFootSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pIdleSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pAlertSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pPainSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pPainSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pAttackSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pStompSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pStompSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pBreatheSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pBreatheSounds[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1379,51 +1356,26 @@ void CMBabyGargantua::Spawn()
|
|||||||
//=========================================================
|
//=========================================================
|
||||||
void CMBabyGargantua::Precache()
|
void CMBabyGargantua::Precache()
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
PRECACHE_MODEL("models/babygarg.mdl");
|
PRECACHE_MODEL("models/babygarg.mdl");
|
||||||
PRECACHE_MODEL( GARG_EYE_SPRITE_NAME );
|
PRECACHE_MODEL( GARG_EYE_SPRITE_NAME );
|
||||||
PRECACHE_MODEL( GARG_BEAM_SPRITE_NAME );
|
PRECACHE_MODEL( GARG_BEAM_SPRITE_NAME );
|
||||||
PRECACHE_MODEL( GARG_BEAM_SPRITE2 );
|
PRECACHE_MODEL( GARG_BEAM_SPRITE2 );
|
||||||
gStompSprite = PRECACHE_MODEL( GARG_STOMP_SPRITE_NAME );
|
gStompSprite = PRECACHE_MODELINDEX( GARG_STOMP_SPRITE_NAME );
|
||||||
gGargGibModel = PRECACHE_MODEL( GARG_GIB_MODEL );
|
gGargGibModel = PRECACHE_MODELINDEX( GARG_GIB_MODEL );
|
||||||
PRECACHE_SOUND( GARG_STOMP_BUZZ_SOUND );
|
PRECACHE_SOUND( GARG_STOMP_BUZZ_SOUND );
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pAttackHitSounds);
|
||||||
PRECACHE_SOUND((char *)pAttackHitSounds[i]);
|
PRECACHE_SOUND_ARRAY(pBeamAttackSounds);
|
||||||
|
PRECACHE_SOUND_ARRAY(pAttackMissSounds);
|
||||||
for ( i = 0; i < ARRAYSIZE( pBeamAttackSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pRicSounds);
|
||||||
PRECACHE_SOUND((char *)pBeamAttackSounds[i]);
|
PRECACHE_SOUND_ARRAY(pFootSounds);
|
||||||
|
PRECACHE_SOUND_ARRAY(pIdleSounds);
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pAlertSounds);
|
||||||
PRECACHE_SOUND((char *)pAttackMissSounds[i]);
|
PRECACHE_SOUND_ARRAY(pPainSounds);
|
||||||
|
PRECACHE_SOUND_ARRAY(pAttackSounds);
|
||||||
for ( i = 0; i < ARRAYSIZE( pRicSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pStompSounds);
|
||||||
PRECACHE_SOUND((char *)pRicSounds[i]);
|
PRECACHE_SOUND_ARRAY(pBreatheSounds);
|
||||||
|
PRECACHE_SOUND_ARRAY(pDieSounds);
|
||||||
for ( i = 0; i < ARRAYSIZE( pFootSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pFootSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pIdleSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pAlertSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pPainSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pPainSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pAttackSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pStompSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pStompSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pBreatheSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pBreatheSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pDieSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pDieSounds[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMBabyGargantua::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType )
|
void CMBabyGargantua::TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType )
|
||||||
|
|||||||
121
src/dlls/globalreplace.cpp
Normal file
121
src/dlls/globalreplace.cpp
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
//=========================================================
|
||||||
|
// Global Replacement:
|
||||||
|
// Tool to replace all default models/sounds with a
|
||||||
|
// customized list.
|
||||||
|
//=========================================================
|
||||||
|
#include "extdll.h"
|
||||||
|
#include "dllapi.h"
|
||||||
|
#include "meta_api.h"
|
||||||
|
|
||||||
|
#include "cmbase.h"
|
||||||
|
#include "cmbasemonster.h"
|
||||||
|
|
||||||
|
namespace REPLACER
|
||||||
|
{
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char source[128];
|
||||||
|
char destination[128];
|
||||||
|
} REPLACER;
|
||||||
|
|
||||||
|
REPLACER *GMR;
|
||||||
|
REPLACER *GSR;
|
||||||
|
int numModels;
|
||||||
|
int numSounds;
|
||||||
|
|
||||||
|
void Init(void)
|
||||||
|
{
|
||||||
|
if ( GMR != NULL )
|
||||||
|
{
|
||||||
|
free( GMR );
|
||||||
|
GMR = NULL;
|
||||||
|
}
|
||||||
|
if ( GSR != NULL )
|
||||||
|
{
|
||||||
|
free( GSR );
|
||||||
|
GSR = NULL;
|
||||||
|
}
|
||||||
|
numModels = 0;
|
||||||
|
numSounds = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AddGlobalModel(const char *from, const char *to)
|
||||||
|
{
|
||||||
|
if (numModels < MAX_REPLACEMENTS)
|
||||||
|
{
|
||||||
|
// allocate for the first time
|
||||||
|
if (!numModels)
|
||||||
|
GMR = (REPLACER*)calloc(MAX_REPLACEMENTS, sizeof(*GMR));
|
||||||
|
|
||||||
|
strcpy(GMR[numModels].source, from);
|
||||||
|
strcpy(GMR[numModels].destination, to);
|
||||||
|
|
||||||
|
numModels++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_MESSAGE(PLID, "Can't replace model '%s', too many models in GMR.", from);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AddGlobalSound(const char *from, const char *to)
|
||||||
|
{
|
||||||
|
if (numSounds < MAX_REPLACEMENTS)
|
||||||
|
{
|
||||||
|
// allocate for the first time
|
||||||
|
if (!numSounds)
|
||||||
|
GSR = (REPLACER*)calloc(MAX_REPLACEMENTS, sizeof(*GSR));
|
||||||
|
|
||||||
|
strcpy(GSR[numSounds].source, from);
|
||||||
|
strcpy(GSR[numSounds].destination, to);
|
||||||
|
|
||||||
|
numSounds++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_MESSAGE(PLID, "Can't replace sound '%s', too many sounds in GSR.", from);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* FindModelReplacement( edict_t *pMonster, const char *from )
|
||||||
|
{
|
||||||
|
// Individually set models takes priority!
|
||||||
|
if ( pMonster && !FStringNull(pMonster->v.model))
|
||||||
|
return STRING(pMonster->v.model);
|
||||||
|
|
||||||
|
// Find the model
|
||||||
|
for (int model = 0; model < numModels; model++)
|
||||||
|
{
|
||||||
|
if (strcmp(GMR[model].source, from) == 0)
|
||||||
|
{
|
||||||
|
// If found, use that model instead
|
||||||
|
return GMR[model].destination;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing found, stick with default
|
||||||
|
return from;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* FindSoundReplacement( edict_t *pMonster, const char *from )
|
||||||
|
{
|
||||||
|
// Individually set sounds takes priority!
|
||||||
|
if ( pMonster )
|
||||||
|
{
|
||||||
|
CMBaseMonster *castMonster = GetClassPtr((CMBaseMonster *)VARS(pMonster));
|
||||||
|
//placeholder for soundlist keyvalue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int sound = 0; sound < numSounds; sound++)
|
||||||
|
{
|
||||||
|
if (strcmp(GSR[sound].source, from) == 0)
|
||||||
|
{
|
||||||
|
// If found, use that model instead
|
||||||
|
return GSR[sound].destination;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing found, stick with default
|
||||||
|
return from;
|
||||||
|
}
|
||||||
|
}
|
||||||
19
src/dlls/globalreplace.h
Normal file
19
src/dlls/globalreplace.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef GLOBALREPLACE_H
|
||||||
|
#define GLOBALREPLACE_H
|
||||||
|
|
||||||
|
#define MAX_REPLACEMENTS 255
|
||||||
|
|
||||||
|
namespace REPLACER
|
||||||
|
{
|
||||||
|
void Init(void);
|
||||||
|
bool AddGlobalModel(const char *from, const char *to);
|
||||||
|
bool AddGlobalSound(const char *from, const char *to);
|
||||||
|
|
||||||
|
const char* FindModelReplacement( edict_t *pMonster, const char *from );
|
||||||
|
inline const char* FindModelReplacement( const char *from ) { return FindModelReplacement( NULL, from ); }
|
||||||
|
|
||||||
|
const char* FindSoundReplacement( edict_t *pMonster, const char *from );
|
||||||
|
inline const char* FindSoundReplacement( const char *from ) { return FindSoundReplacement( NULL, from ); }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -256,7 +256,7 @@ void CMHAssassin :: Precache()
|
|||||||
|
|
||||||
PRECACHE_SOUND("debris/beamstart1.wav");
|
PRECACHE_SOUND("debris/beamstart1.wav");
|
||||||
|
|
||||||
m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shell
|
m_iShell = PRECACHE_MODELINDEX("models/shell.mdl");// brass shell
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -937,8 +937,8 @@ void CMHGrunt :: Precache()
|
|||||||
else
|
else
|
||||||
m_voicePitch = 100;
|
m_voicePitch = 100;
|
||||||
|
|
||||||
m_iBrassShell = PRECACHE_MODEL ("models/shell.mdl");// brass shell
|
m_iBrassShell = PRECACHE_MODELINDEX("models/shell.mdl");// brass shell
|
||||||
m_iShotgunShell = PRECACHE_MODEL ("models/shotgunshell.mdl");
|
m_iShotgunShell = PRECACHE_MODELINDEX("models/shotgunshell.mdl");
|
||||||
}
|
}
|
||||||
|
|
||||||
//=========================================================
|
//=========================================================
|
||||||
|
|||||||
@@ -104,8 +104,8 @@ void CMHornet :: Precache()
|
|||||||
PRECACHE_SOUND( "hornet/ag_hornethit2.wav" );
|
PRECACHE_SOUND( "hornet/ag_hornethit2.wav" );
|
||||||
PRECACHE_SOUND( "hornet/ag_hornethit3.wav" );
|
PRECACHE_SOUND( "hornet/ag_hornethit3.wav" );
|
||||||
|
|
||||||
iHornetPuff = PRECACHE_MODEL( "sprites/muz1.spr" );
|
iHornetPuff = PRECACHE_MODELINDEX( "sprites/muz1.spr" );
|
||||||
iHornetTrail = PRECACHE_MODEL("sprites/laserbeam.spr");
|
iHornetTrail = PRECACHE_MODELINDEX("sprites/laserbeam.spr");
|
||||||
}
|
}
|
||||||
|
|
||||||
//=========================================================
|
//=========================================================
|
||||||
|
|||||||
@@ -326,7 +326,7 @@ void CMHoundeye :: Precache()
|
|||||||
PRECACHE_SOUND("houndeye/he_blast2.wav");
|
PRECACHE_SOUND("houndeye/he_blast2.wav");
|
||||||
PRECACHE_SOUND("houndeye/he_blast3.wav");
|
PRECACHE_SOUND("houndeye/he_blast3.wav");
|
||||||
|
|
||||||
m_iSpriteTexture = PRECACHE_MODEL( "sprites/shockwave.spr" );
|
m_iSpriteTexture = PRECACHE_MODELINDEX( "sprites/shockwave.spr" );
|
||||||
}
|
}
|
||||||
|
|
||||||
//=========================================================
|
//=========================================================
|
||||||
|
|||||||
@@ -451,8 +451,6 @@ void CMISlave :: Spawn()
|
|||||||
//=========================================================
|
//=========================================================
|
||||||
void CMISlave :: Precache()
|
void CMISlave :: Precache()
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
PRECACHE_MODEL("models/islave.mdl");
|
PRECACHE_MODEL("models/islave.mdl");
|
||||||
PRECACHE_MODEL("sprites/lgtning.spr");
|
PRECACHE_MODEL("sprites/lgtning.spr");
|
||||||
PRECACHE_SOUND("debris/zap1.wav");
|
PRECACHE_SOUND("debris/zap1.wav");
|
||||||
@@ -463,17 +461,10 @@ void CMISlave :: Precache()
|
|||||||
PRECACHE_SOUND("headcrab/hc_headbite.wav");
|
PRECACHE_SOUND("headcrab/hc_headbite.wav");
|
||||||
PRECACHE_SOUND("weapons/cbar_miss1.wav");
|
PRECACHE_SOUND("weapons/cbar_miss1.wav");
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pAttackHitSounds);
|
||||||
PRECACHE_SOUND((char *)pAttackHitSounds[i]);
|
PRECACHE_SOUND_ARRAY(pAttackMissSounds);
|
||||||
|
PRECACHE_SOUND_ARRAY(pPainSounds);
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pDeathSounds);
|
||||||
PRECACHE_SOUND((char *)pAttackMissSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pPainSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pPainSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pDeathSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pDeathSounds[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -314,7 +314,7 @@ void CMMassn::Precache()
|
|||||||
else
|
else
|
||||||
m_voicePitch = 100;
|
m_voicePitch = 100;
|
||||||
|
|
||||||
m_iBrassShell = PRECACHE_MODEL("models/shell.mdl");// brass shell
|
m_iBrassShell = PRECACHE_MODELINDEX("models/shell.mdl");// brass shell
|
||||||
}
|
}
|
||||||
|
|
||||||
//=========================================================
|
//=========================================================
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ static META_FUNCTIONS gMetaFunctionTable =
|
|||||||
GetEntityAPI2_Post, // pfnGetEntityAPI2_Post META; called after game DLL
|
GetEntityAPI2_Post, // pfnGetEntityAPI2_Post META; called after game DLL
|
||||||
NULL, // pfnGetNewDLLFunctions HL SDK2; called before game DLL
|
NULL, // pfnGetNewDLLFunctions HL SDK2; called before game DLL
|
||||||
NULL, // pfnGetNewDLLFunctions_Post META; called after game DLL
|
NULL, // pfnGetNewDLLFunctions_Post META; called after game DLL
|
||||||
GetEngineFunctions, // pfnGetEngineFunctions META; called before HL engine
|
NULL, // pfnGetEngineFunctions META; called before HL engine
|
||||||
GetEngineFunctions_Post, // pfnGetEngineFunctions_Post META; called after HL engine
|
GetEngineFunctions_Post, // pfnGetEngineFunctions_Post META; called after HL engine
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -91,6 +91,10 @@ cvar_t init_monster_turn_coeficient = {"monster_turn_coeficient", "1.75", FCVAR_
|
|||||||
cvar_t *monster_turn_coeficient = NULL;
|
cvar_t *monster_turn_coeficient = NULL;
|
||||||
cvar_t init_monster_entity_config = {"monster_entity_config", "1", FCVAR_EXTDLL, 0, NULL};
|
cvar_t init_monster_entity_config = {"monster_entity_config", "1", FCVAR_EXTDLL, 0, NULL};
|
||||||
cvar_t *monster_entity_config = NULL;
|
cvar_t *monster_entity_config = NULL;
|
||||||
|
cvar_t init_globalmodellist = {"monster_gmr", "", FCVAR_EXTDLL, 0, NULL};
|
||||||
|
cvar_t *globalmodellist = NULL;
|
||||||
|
cvar_t init_globalsoundlist = {"monster_gsr", "", FCVAR_EXTDLL, 0, NULL};
|
||||||
|
cvar_t *globalsoundlist = NULL;
|
||||||
|
|
||||||
|
|
||||||
// Metamod requesting info about this plugin:
|
// Metamod requesting info about this plugin:
|
||||||
@@ -156,6 +160,11 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m
|
|||||||
CVAR_REGISTER(&init_monster_entity_config);
|
CVAR_REGISTER(&init_monster_entity_config);
|
||||||
monster_entity_config = CVAR_GET_POINTER("monster_entity_config");
|
monster_entity_config = CVAR_GET_POINTER("monster_entity_config");
|
||||||
|
|
||||||
|
CVAR_REGISTER(&init_globalmodellist);
|
||||||
|
globalmodellist = CVAR_GET_POINTER("monster_gmr");
|
||||||
|
CVAR_REGISTER(&init_globalsoundlist);
|
||||||
|
globalsoundlist = CVAR_GET_POINTER("monster_gsr");
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,10 +14,14 @@
|
|||||||
|
|
||||||
#include "monster_plugin.h"
|
#include "monster_plugin.h"
|
||||||
#include "ripent.h"
|
#include "ripent.h"
|
||||||
|
#include "globalreplace.h"
|
||||||
|
|
||||||
extern cvar_t *dllapi_log;
|
extern cvar_t *dllapi_log;
|
||||||
extern cvar_t *monster_entity_config;
|
extern cvar_t *monster_entity_config;
|
||||||
|
|
||||||
|
extern cvar_t *globalmodellist;
|
||||||
|
extern cvar_t *globalsoundlist;
|
||||||
|
|
||||||
extern monster_type_t monster_types[];
|
extern monster_type_t monster_types[];
|
||||||
extern int monster_spawn_count;
|
extern int monster_spawn_count;
|
||||||
extern int node_spawn_count;
|
extern int node_spawn_count;
|
||||||
@@ -716,11 +720,107 @@ void scan_monster_bsp(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void scan_extra_cfg(FILE *fp)
|
||||||
|
{
|
||||||
|
char input[1024];
|
||||||
|
|
||||||
|
while (get_input(fp, input))
|
||||||
|
{
|
||||||
|
char *cmd = strtok(input, " ");
|
||||||
|
char *value = strtok(NULL, " ");
|
||||||
|
|
||||||
|
// Remove all quotes from "value"
|
||||||
|
char parse[128] = {0};
|
||||||
|
int skip = 0;
|
||||||
|
for (unsigned i = 0; i < strlen(value); i++)
|
||||||
|
{
|
||||||
|
if (value[i] == '"')
|
||||||
|
{
|
||||||
|
skip++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
parse[i-skip] = value[i];
|
||||||
|
}
|
||||||
|
parse[strlen(parse)] = '\0';
|
||||||
|
strcpy(value, parse);
|
||||||
|
|
||||||
|
if (strcmp(cmd, "globalmodellist") == 0)
|
||||||
|
{
|
||||||
|
// ugh...
|
||||||
|
//globalmodellist->string = value;
|
||||||
|
CVAR_SET_STRING( "monster_gmr", value );
|
||||||
|
|
||||||
|
// Verbose if logging is enabled
|
||||||
|
if (dllapi_log->value)
|
||||||
|
LOG_CONSOLE(PLID, "[DEBUG] Using global model replacement file: %s", value);
|
||||||
|
}
|
||||||
|
else if (strcmp(cmd, "globalsoundlist") == 0)
|
||||||
|
{
|
||||||
|
//globalsoundlist->string = value;
|
||||||
|
CVAR_SET_STRING( "monster_gsr", value );
|
||||||
|
|
||||||
|
// Verbose if logging is enabled
|
||||||
|
if (dllapi_log->value)
|
||||||
|
LOG_CONSOLE(PLID, "[DEBUG] Using global sound replacement file: %s", value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void scan_monster_replace(FILE *fp, bool toGSR )
|
||||||
|
{
|
||||||
|
char input[1024];
|
||||||
|
|
||||||
|
while (get_input(fp, input))
|
||||||
|
{
|
||||||
|
char *source = strtok(input, " ");
|
||||||
|
char *destination = strtok(NULL, " ");
|
||||||
|
|
||||||
|
// Remove all quotes
|
||||||
|
char parse[128] = {0};
|
||||||
|
int skip;
|
||||||
|
|
||||||
|
// source
|
||||||
|
skip = 0;
|
||||||
|
for (unsigned i = 0; i < strlen(source); i++)
|
||||||
|
{
|
||||||
|
if (source[i] == '"')
|
||||||
|
{
|
||||||
|
skip++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
parse[i-skip] = source[i];
|
||||||
|
}
|
||||||
|
parse[strlen(parse)] = '\0';
|
||||||
|
strcpy(source, parse);
|
||||||
|
|
||||||
|
// destination
|
||||||
|
memset(parse, 0, sizeof(parse));
|
||||||
|
skip = 0;
|
||||||
|
for (unsigned i = 0; i < strlen(destination); i++)
|
||||||
|
{
|
||||||
|
if (destination[i] == '"')
|
||||||
|
{
|
||||||
|
skip++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
parse[i-skip] = destination[i];
|
||||||
|
}
|
||||||
|
parse[strlen(parse)] = '\0';
|
||||||
|
strcpy(destination, parse);
|
||||||
|
|
||||||
|
if ( toGSR )
|
||||||
|
REPLACER::AddGlobalSound( source, destination );
|
||||||
|
else
|
||||||
|
REPLACER::AddGlobalModel( source, destination );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool process_monster_cfg(void)
|
bool process_monster_cfg(void)
|
||||||
{
|
{
|
||||||
char game_dir[256];
|
char game_dir[256];
|
||||||
char BSPfilename[256];
|
char BSPfilename[256]; // to read ents directly from BSP
|
||||||
char CFGfilename[256];
|
char CFGfilename[256]; // read ents from MAPNAME_monster.cfg file
|
||||||
|
char EXTfilename[256]; // extra map configs from MAPNAME.cfg
|
||||||
FILE *fp = NULL;
|
FILE *fp = NULL;
|
||||||
|
|
||||||
monster_spawn_count = 0;
|
monster_spawn_count = 0;
|
||||||
@@ -729,18 +829,17 @@ bool process_monster_cfg(void)
|
|||||||
// find the directory name of the currently running MOD...
|
// find the directory name of the currently running MOD...
|
||||||
(*g_engfuncs.pfnGetGameDir)(game_dir);
|
(*g_engfuncs.pfnGetGameDir)(game_dir);
|
||||||
|
|
||||||
|
// build route...
|
||||||
strcpy(CFGfilename, game_dir);
|
strcpy(CFGfilename, game_dir);
|
||||||
#ifdef __linux__
|
|
||||||
strcat(CFGfilename, "/maps/");
|
strcat(CFGfilename, "/maps/");
|
||||||
#else
|
|
||||||
strcat(CFGfilename, "\\maps\\");
|
|
||||||
#endif
|
|
||||||
strcat(CFGfilename, STRING(gpGlobals->mapname));
|
strcat(CFGfilename, STRING(gpGlobals->mapname));
|
||||||
strcpy(BSPfilename, CFGfilename);
|
strcpy(BSPfilename, CFGfilename);
|
||||||
|
strcpy(EXTfilename, CFGfilename);
|
||||||
|
|
||||||
strcat(BSPfilename, ".bsp");
|
strcat(BSPfilename, ".bsp");
|
||||||
strcat(CFGfilename, "_monster.cfg");
|
strcat(CFGfilename, "_monster.cfg");
|
||||||
|
strcat(EXTfilename, ".cfg");
|
||||||
|
|
||||||
// process config files?
|
// process config files?
|
||||||
// -1 = don't process monster config, dynamic spawns only
|
// -1 = don't process monster config, dynamic spawns only
|
||||||
// 0 = read entities from BSP file
|
// 0 = read entities from BSP file
|
||||||
@@ -783,6 +882,55 @@ bool process_monster_cfg(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The code is only getting worse from here, I have to finish T4 quickly
|
||||||
|
* so I can move into making actual clean and optimized code for the final tier...
|
||||||
|
* -Giegue */
|
||||||
|
|
||||||
|
// extra map configs
|
||||||
|
if (access(EXTfilename, 0) == 0)
|
||||||
|
{
|
||||||
|
// first read configs
|
||||||
|
if ((fp = fopen(EXTfilename, "r")) != NULL)
|
||||||
|
{
|
||||||
|
scan_extra_cfg(fp);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// then process them here
|
||||||
|
if (strlen(globalmodellist->string))
|
||||||
|
{
|
||||||
|
char gmrPath[192];
|
||||||
|
|
||||||
|
// SC globalmodellist path starts from models/MAPNAME
|
||||||
|
sprintf(gmrPath, "%s/models/%s/%s", game_dir, STRING(gpGlobals->mapname), globalmodellist->string);
|
||||||
|
|
||||||
|
if (access(gmrPath, 0) == 0)
|
||||||
|
{
|
||||||
|
if ((fp = fopen(gmrPath, "r")) != NULL)
|
||||||
|
{
|
||||||
|
scan_monster_replace(fp, false);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (strlen(globalsoundlist->string))
|
||||||
|
{
|
||||||
|
char gsrPath[192];
|
||||||
|
|
||||||
|
// SC globalsoundlist path starts from sound/MAPNAME
|
||||||
|
sprintf(gsrPath, "%s/sound/%s/%s", game_dir, STRING(gpGlobals->mapname), globalsoundlist->string);
|
||||||
|
|
||||||
|
if (access(gsrPath, 0) == 0)
|
||||||
|
{
|
||||||
|
if ((fp = fopen(gsrPath, "r")) != NULL)
|
||||||
|
{
|
||||||
|
scan_monster_replace(fp, true);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return FALSE; // all ok
|
return FALSE; // all ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -605,7 +605,7 @@ void CMPitdrone::Precache()
|
|||||||
{
|
{
|
||||||
PRECACHE_MODEL("models/pit_drone.mdl");
|
PRECACHE_MODEL("models/pit_drone.mdl");
|
||||||
PRECACHE_MODEL("models/pit_drone_gibs.mdl");
|
PRECACHE_MODEL("models/pit_drone_gibs.mdl");
|
||||||
iPitdroneSpitSprite = PRECACHE_MODEL("sprites/tinyspit.spr");// client side spittle.
|
iPitdroneSpitSprite = PRECACHE_MODELINDEX("sprites/tinyspit.spr");// client side spittle.
|
||||||
|
|
||||||
PRECACHE_SOUND_ARRAY(pAttackMissSounds);
|
PRECACHE_SOUND_ARRAY(pAttackMissSounds);
|
||||||
PRECACHE_SOUND_ARRAY(pIdleSounds);
|
PRECACHE_SOUND_ARRAY(pIdleSounds);
|
||||||
@@ -642,7 +642,7 @@ void CMPitdrone::Precache()
|
|||||||
PRECACHE_SOUND("weapons/xbow_hitbod2.wav");
|
PRECACHE_SOUND("weapons/xbow_hitbod2.wav");
|
||||||
PRECACHE_SOUND("weapons/xbow_hit1.wav");
|
PRECACHE_SOUND("weapons/xbow_hit1.wav");
|
||||||
#if FEATURE_PITDRONE_SPIKE_TRAIL
|
#if FEATURE_PITDRONE_SPIKE_TRAIL
|
||||||
iSpikeTrail = PRECACHE_MODEL("sprites/spike_trail.spr");
|
iSpikeTrail = PRECACHE_MODELINDEX("sprites/spike_trail.spr");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -387,7 +387,7 @@ void CMRGrunt::Precache()
|
|||||||
{
|
{
|
||||||
PRECACHE_MODEL("models/rgrunt.mdl");
|
PRECACHE_MODEL("models/rgrunt.mdl");
|
||||||
|
|
||||||
m_iBodyGibs = PRECACHE_MODEL( "models/metalplategibs_green.mdl" );
|
m_iBodyGibs = PRECACHE_MODELINDEX( "models/metalplategibs_green.mdl" );
|
||||||
|
|
||||||
PRECACHE_SOUND("hgrunt/gr_mgun1.wav");
|
PRECACHE_SOUND("hgrunt/gr_mgun1.wav");
|
||||||
PRECACHE_SOUND("hgrunt/gr_mgun2.wav");
|
PRECACHE_SOUND("hgrunt/gr_mgun2.wav");
|
||||||
@@ -419,5 +419,5 @@ void CMRGrunt::Precache()
|
|||||||
m_voicePitch = 100;
|
m_voicePitch = 100;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
m_iBrassShell = PRECACHE_MODEL("models/shell.mdl");// brass shell
|
m_iBrassShell = PRECACHE_MODELINDEX("models/shell.mdl");// brass shell
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -540,19 +540,18 @@ int SENTENCEG_Lookup(const char *sample, char *sentencenum)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EMIT_SOUND_DYN(edict_t *entity, int channel, const char *sample, float volume, float attenuation,
|
void EMIT_SOUND_DYN(edict_t *entity, int channel, const char *sample, float volume, float attenuation, int flags, int pitch)
|
||||||
int flags, int pitch)
|
|
||||||
{
|
{
|
||||||
if (sample && *sample == '!')
|
if (sample && *sample == '!')
|
||||||
{
|
{
|
||||||
char name[32];
|
char name[32];
|
||||||
if (SENTENCEG_Lookup(sample, name) >= 0)
|
if (SENTENCEG_Lookup(sample, name) >= 0)
|
||||||
EMIT_SOUND_DYN2(entity, channel, name, volume, attenuation, flags, pitch);
|
EMIT_SOUND_DYN2(entity, channel, name, volume, attenuation, flags, pitch);
|
||||||
else
|
else
|
||||||
ALERT( at_aiconsole, "Unable to find %s in sentences.txt\n", sample );
|
ALERT( at_aiconsole, "Unable to find %s in sentences.txt\n", sample );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
EMIT_SOUND_DYN2(entity, channel, sample, volume, attenuation, flags, pitch);
|
EMIT_SOUND_DYN2(entity, channel, REPLACER::FindSoundReplacement( entity, sample ), volume, attenuation, flags, pitch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// play a specific sentence over the HEV suit speaker - just pass player entity, and !sentencename
|
// play a specific sentence over the HEV suit speaker - just pass player entity, and !sentencename
|
||||||
|
|||||||
@@ -31,9 +31,9 @@ void CMSporeGrenade::Precache()
|
|||||||
{
|
{
|
||||||
PRECACHE_MODEL("models/spore.mdl");
|
PRECACHE_MODEL("models/spore.mdl");
|
||||||
PRECACHE_MODEL("sprites/glow02.spr");
|
PRECACHE_MODEL("sprites/glow02.spr");
|
||||||
g_sModelIndexTinySpit = PRECACHE_MODEL("sprites/tinyspit.spr");
|
g_sModelIndexTinySpit = PRECACHE_MODELINDEX("sprites/tinyspit.spr");
|
||||||
gSporeExplode = PRECACHE_MODEL("sprites/spore_exp_01.spr");
|
gSporeExplode = PRECACHE_MODELINDEX("sprites/spore_exp_01.spr");
|
||||||
gSporeExplodeC = PRECACHE_MODEL("sprites/spore_exp_c_01.spr");
|
gSporeExplodeC = PRECACHE_MODELINDEX("sprites/spore_exp_c_01.spr");
|
||||||
PRECACHE_SOUND("weapons/splauncher_bounce.wav");
|
PRECACHE_SOUND("weapons/splauncher_bounce.wav");
|
||||||
PRECACHE_SOUND("weapons/splauncher_impact.wav");
|
PRECACHE_SOUND("weapons/splauncher_impact.wav");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -443,7 +443,7 @@ void CMStrooper::Precache()
|
|||||||
{
|
{
|
||||||
PRECACHE_MODEL("models/strooper.mdl");
|
PRECACHE_MODEL("models/strooper.mdl");
|
||||||
PRECACHE_MODEL("models/strooper_gibs.mdl");
|
PRECACHE_MODEL("models/strooper_gibs.mdl");
|
||||||
iStrooperMuzzleFlash = PRECACHE_MODEL(STROOPER_MUZZLEFLASH);
|
iStrooperMuzzleFlash = PRECACHE_MODELINDEX(STROOPER_MUZZLEFLASH);
|
||||||
PRECACHE_SOUND("shocktrooper/shock_trooper_attack.wav");
|
PRECACHE_SOUND("shocktrooper/shock_trooper_attack.wav");
|
||||||
|
|
||||||
PRECACHE_SOUND("shocktrooper/shock_trooper_die1.wav");
|
PRECACHE_SOUND("shocktrooper/shock_trooper_die1.wav");
|
||||||
@@ -480,7 +480,7 @@ void CMStrooper::Precache()
|
|||||||
else
|
else
|
||||||
m_voicePitch = 100;
|
m_voicePitch = 100;
|
||||||
|
|
||||||
m_iBrassShell = PRECACHE_MODEL("models/shell.mdl");// brass shell
|
m_iBrassShell = PRECACHE_MODELINDEX("models/shell.mdl");// brass shell
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ void CMStukabat :: Spawn()
|
|||||||
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
|
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
|
||||||
m_MonsterState = MONSTERSTATE_NONE;
|
m_MonsterState = MONSTERSTATE_NONE;
|
||||||
|
|
||||||
m_pFlapSound = "stukabat/stukabat_flap1.wav";
|
m_pFlapSound = REPLACER::FindSoundReplacement( "stukabat/stukabat_flap1.wav" );
|
||||||
|
|
||||||
MonsterInit();
|
MonsterInit();
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ void CMStukabat :: Precache()
|
|||||||
{
|
{
|
||||||
PRECACHE_MODEL("models/stukabat.mdl");
|
PRECACHE_MODEL("models/stukabat.mdl");
|
||||||
|
|
||||||
PRECACHE_SOUND("stukabat/stukabat_flap1.wav"); // flying sound
|
PRECACHE_SOUND("stukabat/stukabat_flap1.wav" ); // flying sound
|
||||||
PRECACHE_SOUND("headcrab/hc_headbite.wav"); // bite sound
|
PRECACHE_SOUND("headcrab/hc_headbite.wav"); // bite sound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2141,7 +2141,7 @@ bool UTIL_IsBSPModel( edict_t *pent )
|
|||||||
|
|
||||||
void UTIL_TakeDamageExternal( edict_t *pEdict, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
|
void UTIL_TakeDamageExternal( edict_t *pEdict, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
|
||||||
{
|
{
|
||||||
// Tell AMXX to call TakeDamage for us.
|
// Tell AMXX to call TakeDamage for us if it can.
|
||||||
char extCmd[64];
|
char extCmd[64];
|
||||||
sprintf( extCmd, "monster_hurt_entity %i %i %i %f %i\n", ENTINDEX( pEdict ), ENTINDEX( ENT( pevInflictor ) ), ENTINDEX( ENT( pevAttacker ) ), flDamage, bitsDamageType );
|
sprintf( extCmd, "monster_hurt_entity %i %i %i %f %i\n", ENTINDEX( pEdict ), ENTINDEX( ENT( pevInflictor ) ), ENTINDEX( ENT( pevAttacker ) ), flDamage, bitsDamageType );
|
||||||
SERVER_COMMAND( extCmd );
|
SERVER_COMMAND( extCmd );
|
||||||
|
|||||||
@@ -436,6 +436,18 @@ extern DLL_GLOBAL const Vector g_vecZero;
|
|||||||
|
|
||||||
#define SF_TRIG_PUSH_ONCE 1
|
#define SF_TRIG_PUSH_ONCE 1
|
||||||
|
|
||||||
|
// Override a few engine callbacks for model replacements
|
||||||
|
#include "globalreplace.h"
|
||||||
|
#define SET_MODEL( entity, model ) \
|
||||||
|
{ SET_MODEL2( entity, REPLACER::FindModelReplacement( entity, model ) ); }
|
||||||
|
#define PRECACHE_MODEL( model ) \
|
||||||
|
{ PRECACHE_MODEL2( (char*)REPLACER::FindModelReplacement( model ) ); }
|
||||||
|
#define PRECACHE_SOUND( sound ) \
|
||||||
|
{ PRECACHE_SOUND2( (char*)REPLACER::FindSoundReplacement( sound ) ); }
|
||||||
|
inline int PRECACHE_MODELINDEX( char* model )
|
||||||
|
{
|
||||||
|
return PRECACHE_MODEL2( (char*)REPLACER::FindModelReplacement( model ) );
|
||||||
|
}
|
||||||
|
|
||||||
// Sound Utilities
|
// Sound Utilities
|
||||||
|
|
||||||
@@ -469,9 +481,7 @@ float TEXTURETYPE_PlaySound(TraceResult *ptr, Vector vecSrc, Vector vecEnd, int
|
|||||||
// EMIT_SOUND_DYN with pitch != 100 should be used sparingly, as it's not quite as
|
// EMIT_SOUND_DYN with pitch != 100 should be used sparingly, as it's not quite as
|
||||||
// fast as EMIT_SOUND (the pitchshift mixer is not native coded).
|
// fast as EMIT_SOUND (the pitchshift mixer is not native coded).
|
||||||
|
|
||||||
void EMIT_SOUND_DYN(edict_t *entity, int channel, const char *sample, float volume, float attenuation,
|
void EMIT_SOUND_DYN(edict_t *entity, int channel, const char *sample, float volume, float attenuation, int flags, int pitch);
|
||||||
int flags, int pitch);
|
|
||||||
|
|
||||||
|
|
||||||
inline void EMIT_SOUND(edict_t *entity, int channel, const char *sample, float volume, float attenuation)
|
inline void EMIT_SOUND(edict_t *entity, int channel, const char *sample, float volume, float attenuation)
|
||||||
{
|
{
|
||||||
@@ -488,7 +498,7 @@ void EMIT_GROUPID_SUIT(edict_t *entity, int isentenceg);
|
|||||||
void EMIT_GROUPNAME_SUIT(edict_t *entity, const char *groupname);
|
void EMIT_GROUPNAME_SUIT(edict_t *entity, const char *groupname);
|
||||||
|
|
||||||
#define PRECACHE_SOUND_ARRAY( a ) \
|
#define PRECACHE_SOUND_ARRAY( a ) \
|
||||||
{ for (int i = 0; i < ARRAYSIZE( a ); i++ ) PRECACHE_SOUND((char *) a [i]); }
|
{ for (int i = 0; i < ARRAYSIZE( a ); i++ ) PRECACHE_SOUND2((char *) REPLACER::FindSoundReplacement(a[i])); }
|
||||||
|
|
||||||
#define EMIT_SOUND_ARRAY_DYN( chan, array ) \
|
#define EMIT_SOUND_ARRAY_DYN( chan, array ) \
|
||||||
EMIT_SOUND_DYN ( ENT(pev), chan , array [ RANDOM_LONG(0,ARRAYSIZE( array )-1) ], 1.0, ATTN_NORM, 0, RANDOM_LONG(95,105) );
|
EMIT_SOUND_DYN ( ENT(pev), chan , array [ RANDOM_LONG(0,ARRAYSIZE( array )-1) ], 1.0, ATTN_NORM, 0, RANDOM_LONG(95,105) );
|
||||||
@@ -541,4 +551,4 @@ Vector UTIL_Center(edict_t *pEdict);
|
|||||||
edict_t *UTIL_GetNextTarget( edict_t *pEntity );
|
edict_t *UTIL_GetNextTarget( edict_t *pEntity );
|
||||||
edict_t *UTIL_FindNearestPlayer(edict_t *pEdict, float m_flFieldOfView);
|
edict_t *UTIL_FindNearestPlayer(edict_t *pEdict, float m_flFieldOfView);
|
||||||
bool UTIL_IsBSPModel( edict_t *pent );
|
bool UTIL_IsBSPModel( edict_t *pent );
|
||||||
void UTIL_TakeDamageExternal( edict_t *pEdict, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
|
void UTIL_TakeDamageExternal( edict_t *pEdict, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
|
||||||
@@ -692,7 +692,7 @@ void CMVoltigore::PrecacheImpl(char *modelName)
|
|||||||
|
|
||||||
PRECACHE_SOUND("debris/beamstart1.wav");
|
PRECACHE_SOUND("debris/beamstart1.wav");
|
||||||
|
|
||||||
m_beamTexture = PRECACHE_MODEL(VOLTIGORE_ZAP_BEAM);
|
m_beamTexture = PRECACHE_MODELINDEX(VOLTIGORE_ZAP_BEAM);
|
||||||
PRECACHE_MODEL(VOLTIGORE_GLOW_SPRITE);
|
PRECACHE_MODEL(VOLTIGORE_GLOW_SPRITE);
|
||||||
|
|
||||||
PRECACHE_MODEL("sprites/lgtning.spr");
|
PRECACHE_MODEL("sprites/lgtning.spr");
|
||||||
|
|||||||
@@ -263,27 +263,14 @@ void CMZombie :: Spawn()
|
|||||||
//=========================================================
|
//=========================================================
|
||||||
void CMZombie :: Precache()
|
void CMZombie :: Precache()
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
PRECACHE_MODEL("models/zombie.mdl");
|
PRECACHE_MODEL("models/zombie.mdl");
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pAttackHitSounds);
|
||||||
PRECACHE_SOUND((char *)pAttackHitSounds[i]);
|
PRECACHE_SOUND_ARRAY(pAttackMissSounds);
|
||||||
|
PRECACHE_SOUND_ARRAY(pAttackSounds);
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ )
|
PRECACHE_SOUND_ARRAY(pIdleSounds);
|
||||||
PRECACHE_SOUND((char *)pAttackMissSounds[i]);
|
PRECACHE_SOUND_ARRAY(pAlertSounds);
|
||||||
|
PRECACHE_SOUND_ARRAY(pPainSounds);
|
||||||
for ( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pAttackSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pIdleSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pAlertSounds[i]);
|
|
||||||
|
|
||||||
for ( i = 0; i < ARRAYSIZE( pPainSounds ); i++ )
|
|
||||||
PRECACHE_SOUND((char *)pPainSounds[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//=========================================================
|
//=========================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user