Add working impulse 102 weapon cheat.

This commit is contained in:
Andrey Akhmichin 2024-03-24 18:29:59 +05:00
parent 4a156e93bd
commit db5a2d0cb1
25 changed files with 858 additions and 199 deletions

View File

@ -72,20 +72,20 @@ def build(bld):
source += bld.path.parent.ant_glob('game_shared/*.cpp', excl=excluded_files)
source += bld.path.parent.ant_glob([
'pm_shared/*.c',
'dlls/crossbow.cpp',
'dlls/crowbar.cpp',
'dlls/egon.cpp',
'dlls/gauss.cpp',
'dlls/glock.cpp',
'dlls/handgrenade.cpp',
'dlls/hornetgun.cpp',
'dlls/mp5.cpp',
'dlls/python.cpp',
'dlls/rpg.cpp',
'dlls/satchel.cpp',
'dlls/shotgun.cpp',
'dlls/squeakgrenade.cpp',
'dlls/tripmine.cpp'
# 'dlls/crossbow.cpp',
# 'dlls/crowbar.cpp',
# 'dlls/egon.cpp',
# 'dlls/gauss.cpp',
# 'dlls/glock.cpp',
# 'dlls/handgrenade.cpp',
# 'dlls/hornetgun.cpp',
# 'dlls/mp5.cpp',
# 'dlls/python.cpp',
# 'dlls/rpg.cpp',
# 'dlls/satchel.cpp',
# 'dlls/shotgun.cpp',
# 'dlls/squeakgrenade.cpp',
# 'dlls/tripmine.cpp'
])

View File

@ -75,12 +75,12 @@ set (SVDLL_SOURCES
client.cpp
combat.cpp
controller.cpp
# crossbow.cpp
crossbow.cpp
crowbar.cpp
defaultai.cpp
doors.cpp
effects.cpp
# egon.cpp
egon.cpp
explode.cpp
flyingmonster.cpp
func_break.cpp
@ -88,7 +88,7 @@ set (SVDLL_SOURCES
game.cpp
gamerules.cpp
gargantua.cpp
# gauss.cpp
gauss.cpp
genericmonster.cpp
ggrenade.cpp
globals.cpp
@ -99,13 +99,13 @@ set (SVDLL_SOURCES
h_cine.cpp
h_cycler.cpp
h_export.cpp
# handgrenade.cpp
handgrenade.cpp
hassassin.cpp
headcrab.cpp
healthkit.cpp
hgrunt.cpp
hornet.cpp
# hornetgun.cpp
hornetgun.cpp
houndeye.cpp
ichthyosaur.cpp
islave.cpp
@ -127,12 +127,12 @@ set (SVDLL_SOURCES
plane.cpp
plats.cpp
player.cpp
# python.cpp
python.cpp
playermonster.cpp
rat.cpp
roach.cpp
rpg.cpp
# satchel.cpp
satchel.cpp
schedule.cpp
scientist.cpp
scripted.cpp
@ -143,7 +143,7 @@ set (SVDLL_SOURCES
soundent.cpp
spectator.cpp
squadmonster.cpp
# squeakgrenade.cpp
squeakgrenade.cpp
subs.cpp
talkmonster.cpp
teamplay_gamerules.cpp

View File

@ -466,19 +466,6 @@ void CAGrunt::HandleAnimEvent( MonsterEvent_t *pEvent )
UTIL_MakeVectors( pHornet->pev->angles );
pHornet->pev->velocity = gpGlobals->v_forward * 300.0f;
switch( RANDOM_LONG( 0, 2 ) )
{
case 0:
EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "agrunt/ag_fire1.wav", 1.0, ATTN_NORM, 0, 100 );
break;
case 1:
EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "agrunt/ag_fire2.wav", 1.0, ATTN_NORM, 0, 100 );
break;
case 2:
EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, "agrunt/ag_fire3.wav", 1.0, ATTN_NORM, 0, 100 );
break;
}
CBaseMonster *pHornetMonster = pHornet->MyMonsterPointer();
if( pHornetMonster )

View File

@ -291,8 +291,8 @@ void CCrossbow::Precache( void )
UTIL_PrecacheOther( "crossbow_bolt" );
m_usCrossbow = PRECACHE_EVENT( 1, "events/crossbow1.sc" );
m_usCrossbow2 = PRECACHE_EVENT( 1, "events/crossbow2.sc" );
// m_usCrossbow = PRECACHE_EVENT( 1, "events/crossbow1.sc" );
// m_usCrossbow2 = PRECACHE_EVENT( 1, "events/crossbow2.sc" );
}
int CCrossbow::GetItemInfo( ItemInfo *p )
@ -352,7 +352,7 @@ void CCrossbow::PrimaryAttack( void )
// this function only gets called in multiplayer
void CCrossbow::FireSniperBolt()
{
m_flNextPrimaryAttack = GetNextAttackDelay( 0.75f );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75f;
if( m_iClip == 0 )
{
@ -365,14 +365,16 @@ void CCrossbow::FireSniperBolt()
m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
m_iClip--;
int flags;
#if CLIENT_WEAPONS
flags = FEV_NOTHOST;
#else
flags = 0;
#endif
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usCrossbow2, 0.0f, g_vecZero, g_vecZero, 0, 0, m_iClip, 0, 0, 0 );
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/xbow_fire1.wav", RANDOM_FLOAT( 0.95f, 1.0f ), ATTN_NORM, 0, 93 + RANDOM_LONG( 0, 0xF ) );
if( m_iClip )
{
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/xbow_reload1.wav", RANDOM_FLOAT( 0.95f, 1.0f ), ATTN_NORM, 0, 93 + RANDOM_LONG( 0, 0xF ) );
SendWeaponAnim( CROSSBOW_FIRE1 );
}
else
{
SendWeaponAnim( CROSSBOW_FIRE3 );
}
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
@ -408,14 +410,15 @@ void CCrossbow::FireBolt()
m_iClip--;
int flags;
#if CLIENT_WEAPONS
flags = FEV_NOTHOST;
#else
flags = 0;
#endif
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usCrossbow, 0.0f, g_vecZero, g_vecZero, 0, 0, m_iClip, 0, 0, 0 );
if( m_iClip )
{
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/xbow_reload1.wav", RANDOM_FLOAT( 0.95f, 1.0f ), ATTN_NORM, 0, 93 + RANDOM_LONG( 0, 0xF ) );
SendWeaponAnim( CROSSBOW_FIRE1 );
}
else
{
SendWeaponAnim( CROSSBOW_FIRE3 );
}
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
@ -451,7 +454,7 @@ void CCrossbow::FireBolt()
// HEV suit - indicate out of ammo condition
m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
m_flNextPrimaryAttack = GetNextAttackDelay( 0.75f );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75f;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75f;

View File

@ -275,7 +275,7 @@ int CCrowbar::Swing( int fFirst )
if( !pEntity->IsAlive() )
{
#if CROWBAR_FIX_RAPID_CROWBAR
m_flNextPrimaryAttack = GetNextAttackDelay(0.25);
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.25f;
#endif
return TRUE;
}

View File

@ -51,6 +51,9 @@ enum egon_e {
LINK_ENTITY_TO_CLASS( weapon_egon, CEgon )
int CEgon::g_fireAnims1[] = { EGON_FIRE1, EGON_FIRE2, EGON_FIRE3, EGON_FIRE4 };
int CEgon::g_fireAnims2[] = { EGON_ALTFIRECYCLE };
void CEgon::Spawn()
{
Precache();
@ -80,8 +83,8 @@ void CEgon::Precache( void )
PRECACHE_SOUND( "weapons/357_cock1.wav" );
m_usEgonFire = PRECACHE_EVENT( 1, "events/egon_fire.sc" );
m_usEgonStop = PRECACHE_EVENT( 1, "events/egon_stop.sc" );
// m_usEgonFire = PRECACHE_EVENT( 1, "events/egon_fire.sc" );
// m_usEgonStop = PRECACHE_EVENT( 1, "events/egon_stop.sc" );
}
BOOL CEgon::Deploy( void )
@ -197,13 +200,21 @@ void CEgon::Attack( void )
m_flAmmoUseTime = gpGlobals->time;// start using ammo ASAP.
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0.0f, g_vecZero, g_vecZero, 0.0f, 0.0f, 0, m_fireMode, 1, 0 );
SendWeaponAnim( g_fireAnims1[ RANDOM_LONG( 0, ARRAYSIZE( g_fireAnims1 ) - 1 ) ] );
m_shakeTime = 0;
m_pPlayer->m_iWeaponVolume = EGON_PRIMARY_VOLUME;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.1f;
pev->fuser1 = UTIL_WeaponTimeBase() + 2.0f;
m_shootTime = UTIL_WeaponTimeBase() + 2.0f;
if( m_fireMode == FIRE_WIDE )
{
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, EGON_SOUND_STARTUP, 0.98f, ATTN_NORM, 0, 125 );
}
else
{
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, EGON_SOUND_STARTUP, 0.9f, ATTN_NORM, 0, 100 );
}
pev->dmgtime = gpGlobals->time + GetPulseInterval();
m_fireState = FIRE_CHARGE;
@ -214,10 +225,17 @@ void CEgon::Attack( void )
Fire( vecSrc, vecAiming );
m_pPlayer->m_iWeaponVolume = EGON_PRIMARY_VOLUME;
if( pev->fuser1 <= UTIL_WeaponTimeBase() )
if( m_shootTime != 0 && gpGlobals->time > m_shootTime )
{
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usEgonFire, 0.0f, g_vecZero, g_vecZero, 0.0f, 0.0f, 0, m_fireMode, 0, 0 );
pev->fuser1 = 1000;
if( m_fireMode == FIRE_WIDE )
{
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_STATIC, EGON_SOUND_RUN, 0.98f, ATTN_NORM, 0, 125 );
}
else
{
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_STATIC, EGON_SOUND_RUN, 0.9f, ATTN_NORM, 0, 100 );
}
m_shootTime = 0;
}
if( !HasAmmo() )
@ -409,8 +427,8 @@ void CEgon::CreateEffect( void )
m_pBeam->SetFlags( BEAM_FSINE );
m_pBeam->SetEndAttachment( 1 );
m_pBeam->pev->spawnflags |= SF_BEAM_TEMPORARY; // Flag these to be destroyed on save/restore or level transition
m_pBeam->pev->flags |= FL_SKIPLOCALHOST;
m_pBeam->pev->owner = m_pPlayer->edict();
// m_pBeam->pev->flags |= FL_SKIPLOCALHOST;
// m_pBeam->pev->owner = m_pPlayer->edict();
m_pNoise = CBeam::BeamCreate( EGON_BEAM_SPRITE, 55 );
m_pNoise->PointEntInit( pev->origin, m_pPlayer->entindex() );
@ -418,15 +436,15 @@ void CEgon::CreateEffect( void )
m_pNoise->SetBrightness( 100 );
m_pNoise->SetEndAttachment( 1 );
m_pNoise->pev->spawnflags |= SF_BEAM_TEMPORARY;
m_pNoise->pev->flags |= FL_SKIPLOCALHOST;
m_pNoise->pev->owner = m_pPlayer->edict();
// m_pNoise->pev->flags |= FL_SKIPLOCALHOST;
// m_pNoise->pev->owner = m_pPlayer->edict();
m_pSprite = CSprite::SpriteCreate( EGON_FLARE_SPRITE, pev->origin, FALSE );
m_pSprite->pev->scale = 1.0;
m_pSprite->SetTransparency( kRenderGlow, 255, 255, 255, 255, kRenderFxNoDissipation );
m_pSprite->pev->spawnflags |= SF_SPRITE_TEMPORARY;
m_pSprite->pev->flags |= FL_SKIPLOCALHOST;
m_pSprite->pev->owner = m_pPlayer->edict();
// m_pSprite->pev->flags |= FL_SKIPLOCALHOST;
// m_pSprite->pev->owner = m_pPlayer->edict();
if( m_fireMode == FIRE_WIDE )
{
@ -510,16 +528,11 @@ BOOL CEgon::CanHolster( void )
void CEgon::EndAttack( void )
{
bool bMakeNoise = false;
if( m_fireState != FIRE_OFF ) //Checking the button just in case!.
bMakeNoise = true;
PLAYBACK_EVENT_FULL( FEV_GLOBAL | FEV_RELIABLE, m_pPlayer->edict(), m_usEgonStop, 0.0f, m_pPlayer->pev->origin, m_pPlayer->pev->angles, 0.0f, 0.0f, bMakeNoise, 0, 0, 0 );
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 2.0f;
m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5f;
STOP_SOUND( ENT( m_pPlayer->pev ), CHAN_STATIC, EGON_SOUND_RUN );
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, EGON_SOUND_OFF, 0.98, ATTN_NORM, 0, 100 );
m_fireState = FIRE_OFF;
DestroyEffect();

View File

@ -51,7 +51,7 @@ const char *CBreakable::pSpawnObjects[] =
"ammo_crossbow", // 11
"weapon_357", // 12
"ammo_357", // 13
"weapon_rpg", // 14
"weapon_sillyrocket", // 14
"ammo_rpgclip", // 15
"ammo_gaussclip", // 16
"weapon_handgrenade", // 17

View File

@ -456,7 +456,7 @@ cvar_t sk_player_leg3 = { "sk_player_leg3","1" };
// END Cvars for Skill Level settings
cvar_t sv_pushable_fixed_tick_fudge = { "sv_pushable_fixed_tick_fudge", "15" };
// cvar_t sv_busters = { "sv_busters", "0" };
cvar_t sv_busters = { "sv_busters", "0" };
// Register your console variables here
// This gets called one time when the game is initialied
@ -502,7 +502,7 @@ void GameDLLInit( void )
CVAR_REGISTER( &multibyte_only );
CVAR_REGISTER( &mp_chattime );
// CVAR_REGISTER( &sv_busters );
CVAR_REGISTER( &sv_busters );
// REGISTER CVARS FOR SKILL LEVEL STUFF

View File

@ -44,7 +44,7 @@ extern cvar_t defaultteam;
extern cvar_t allowmonsters;
extern cvar_t bhopcap;
extern cvar_t sv_pushable_fixed_tick_fudge;
// extern cvar_t sv_busters;
extern cvar_t sv_busters;
// Engine Cvars
extern cvar_t *g_psv_gravity;

View File

@ -162,7 +162,7 @@ public:
// Immediately end a multiplayer game
virtual void EndMultiplayerGame( void ) {}
// virtual BOOL IsBustingGame( void ){ return FALSE; };
virtual BOOL IsBustingGame( void ){ return FALSE; };
};
extern CGameRules *InstallGameRules( void );
@ -362,7 +362,7 @@ protected:
BOOL m_iEndIntermissionButtonHit;
void SendMOTDToClient( edict_t *client );
};
/*
bool IsPlayerBusting( CBaseEntity *pPlayer );
BOOL BustingCanHaveItem( CBasePlayer *pPlayer, CBaseEntity *pItem );
@ -387,6 +387,6 @@ public:
protected:
float m_flEgonBustingCheckTime;
};
*/
extern DLL_GLOBAL CGameRules *g_pGameRules;
#endif // GAMERULES_H

View File

@ -132,12 +132,11 @@ BOOL CGauss::Deploy()
void CGauss::Holster( int skiplocal /* = 0 */ )
{
PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_GLOBAL, m_pPlayer->edict(), m_usGaussFire, 0.01f, m_pPlayer->pev->origin, m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 );
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5f;
SendWeaponAnim( GAUSS_HOLSTER );
m_fInAttack = 0;
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM );
}
void CGauss::PrimaryAttack()
@ -146,7 +145,7 @@ void CGauss::PrimaryAttack()
if( m_pPlayer->pev->waterlevel == 3 )
{
PlayEmptySound();
m_flNextSecondaryAttack = m_flNextPrimaryAttack = GetNextAttackDelay( 0.15f );
m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15f;
return;
}
@ -186,7 +185,7 @@ void CGauss::SecondaryAttack()
PlayEmptySound();
}
m_flNextSecondaryAttack = m_flNextPrimaryAttack = GetNextAttackDelay( 0.5f );
m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5f;
return;
}
@ -213,7 +212,7 @@ void CGauss::SecondaryAttack()
m_pPlayer->m_flStartCharge = gpGlobals->time;
m_pPlayer->m_flAmmoStartCharge = UTIL_WeaponTimeBase() + GetFullChargeTime();
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0f, g_vecZero, g_vecZero, 0.0f, 0.0f, 110, 0, 0, 0 );
PLAYBACK_EVENT_FULL( 0, m_pPlayer->edict(), m_usGaussSpin, 0.0f, g_vecZero, g_vecZero, 0.0f, 0.0f, 110, 0, 0, 0 );
m_iSoundState = SND_CHANGE_PITCH;
}
@ -276,7 +275,7 @@ void CGauss::SecondaryAttack()
#if GAUSS_OVERCHARGE_FIX
if (!overcharge)
#endif
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0f, g_vecZero, g_vecZero, 0.0f, 0.0f, pitch, 0, ( m_iSoundState == SND_CHANGE_PITCH ) ? 1 : 0, 0 );
PLAYBACK_EVENT_FULL( 0, m_pPlayer->edict(), m_usGaussSpin, 0.0f, g_vecZero, g_vecZero, 0.0f, 0.0f, pitch, 0, ( m_iSoundState == SND_CHANGE_PITCH ) ? 1 : 0, 0 );
m_iSoundState = SND_CHANGE_PITCH; // hack for going through level transitions
@ -287,7 +286,7 @@ void CGauss::SecondaryAttack()
{
// Player charged up too long. Zap him.
#if GAUSS_OVERCHARGE_FIX
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussSpin, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, pitch, 0, 0, 1 );
PLAYBACK_EVENT_FULL( 0, m_pPlayer->edict(), m_usGaussSpin, 0.0, g_vecZero, g_vecZero, 0.0, 0.0, pitch, 0, 0, 1 );
#endif
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/electro4.wav", 1.0f, ATTN_NORM, 0, 80 + RANDOM_LONG( 0, 0x3f ) );
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/electro6.wav", 1.0f, ATTN_NORM, 0, 75 + RANDOM_LONG( 0, 0x3f ) );
@ -389,13 +388,13 @@ void CGauss::Fire( Vector vecOrigSrc, Vector vecDir, float flDamage )
g_irunninggausspred = true;
#endif
// The main firing event is sent unreliably so it won't be delayed.
PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usGaussFire, 0.0f, m_pPlayer->pev->origin, m_pPlayer->pev->angles, flDamage, 0.0, 0, 0, m_fPrimaryFire ? 1 : 0, 0 );
PLAYBACK_EVENT_FULL( 0, m_pPlayer->edict(), m_usGaussFire, 0.0f, m_pPlayer->pev->origin, m_pPlayer->pev->angles, flDamage, 0.0, 0, 0, m_fPrimaryFire ? 1 : 0, 0 );
// This reliable event is used to stop the spinning sound
// It's delayed by a fraction of second to make sure it is delayed by 1 frame on the client
// It's sent reliably anyway, which could lead to other delays
PLAYBACK_EVENT_FULL( FEV_NOTHOST | FEV_RELIABLE | FEV_GLOBAL, m_pPlayer->edict(), m_usGaussFire, 0.01f, m_pPlayer->pev->origin, m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 );
PLAYBACK_EVENT_FULL( FEV_RELIABLE | FEV_GLOBAL, m_pPlayer->edict(), m_usGaussFire, 0.01f, m_pPlayer->pev->origin, m_pPlayer->pev->angles, 0.0, 0.0, 0, 0, 0, 1 );
/*ALERT( at_console, "%f %f %f\n%f %f %f\n",
vecSrc.x, vecSrc.y, vecSrc.z,

View File

@ -101,14 +101,7 @@ int CGlock::AddToPlayer( CBasePlayer *pPlayer )
BOOL CGlock::Deploy()
{
BOOL bResult = DefaultDeploy( "models/v_9mmhandgun.mdl", "models/p_9mmhandgun.mdl", GLOCK_DRAW, "onehanded", /*UseDecrement() ? 1 : 0*/ 0 );
if( bResult )
{
m_fInAttack = 0;
}
return bResult;
return DefaultDeploy( "models/v_9mmhandgun.mdl", "models/p_9mmhandgun.mdl", GLOCK_DRAW, "onehanded", /*UseDecrement() ? 1 : 0*/ 0 );
}
void CGlock::Holster( int skiplocal /*= 0*/ )
@ -117,8 +110,6 @@ void CGlock::Holster( int skiplocal /*= 0*/ )
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5f;
SendWeaponAnim( GLOCK_HOLSTER );
m_fInAttack = 0;
}
void CGlock::SecondaryAttack( void )
@ -135,10 +126,6 @@ void CGlock::PrimaryAttack( void )
void CGlock::GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim )
{
// Do not allow attack unless primary attack key was released.
if( m_fInAttack )
return;
if( m_iClip <= 0 )
{
if( !m_fFireOnEmpty )
@ -152,9 +139,6 @@ void CGlock::GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim )
return;
}
// Prevent from continuously refire.
m_fInAttack = 1;
m_iClip--;
m_pPlayer->pev->effects = (int)( m_pPlayer->pev->effects ) | EF_MUZZLEFLASH;
@ -198,7 +182,7 @@ void CGlock::GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim )
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), fUseAutoAim ? m_usFireGlock1 : m_usFireGlock2, 0.0, g_vecZero, g_vecZero, vecDir.x, vecDir.y, 0, 0, ( m_iClip == 0 ) ? 1 : 0, 0 );
m_flNextPrimaryAttack = m_flNextSecondaryAttack = GetNextAttackDelay( flCycleTime );
m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + flCycleTime;
if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
// HEV suit - indicate out of ammo condition
@ -235,9 +219,6 @@ void CGlock::Reload( void )
if( iResult )
{
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
// Unblock primary attack.
m_fInAttack = 0;
}
}
}
@ -248,12 +229,6 @@ void CGlock::WeaponIdle( void )
m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
//
// Unblock primary attack.
// This will only occur if players released primary attack key.
//
m_fInAttack = 0;
if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return;

View File

@ -177,7 +177,7 @@ void CHandGrenade::WeaponIdle( void )
m_flReleaseThrow = 0.0f;
#endif
m_flStartThrow = 0.0f;
m_flNextPrimaryAttack = GetNextAttackDelay( 0.5f );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5f;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5f;
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
@ -187,7 +187,7 @@ void CHandGrenade::WeaponIdle( void )
// just threw last grenade
// set attack times in the future, and weapon idle in the future so we can see the whole throw
// animation, weapon idle will automatically retire the weapon for us.
m_flTimeWeaponIdle = m_flNextSecondaryAttack = m_flNextPrimaryAttack = GetNextAttackDelay( 0.5f );// ensure that the animation can finish playing
m_flTimeWeaponIdle = m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5f;// ensure that the animation can finish playing
}
return;
}

View File

@ -95,9 +95,22 @@ void CHornet::Spawn( void )
SetTouch( &CHornet::DieTouch );
SetThink( &CHornet::StartTrack );
/*edict_t *pSoundEnt = pev->owner;
edict_t *pSoundEnt = pev->owner;
if( !pSoundEnt )
pSoundEnt = edict();*/
pSoundEnt = edict();
switch( RANDOM_LONG( 0, 2 ) )
{
case 0:
EMIT_SOUND( pSoundEnt, CHAN_WEAPON, "agrunt/ag_fire1.wav", 1, ATTN_NORM );
break;
case 1:
EMIT_SOUND( pSoundEnt, CHAN_WEAPON, "agrunt/ag_fire2.wav", 1, ATTN_NORM );
break;
case 2:
EMIT_SOUND( pSoundEnt, CHAN_WEAPON, "agrunt/ag_fire3.wav", 1, ATTN_NORM );
break;
}
if( !FNullEnt( pev->owner ) && ( pev->owner->v.flags & FL_CLIENT ) )
{

View File

@ -149,13 +149,7 @@ void CHgun::PrimaryAttack()
m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
int flags;
#if CLIENT_WEAPONS
flags = FEV_NOTHOST;
#else
flags = 0;
#endif
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0f, g_vecZero, g_vecZero, 0.0f, 0.0f, 0, 0, 0, 0 );
SendWeaponAnim( HGUN_SHOOT );
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
@ -228,6 +222,10 @@ void CHgun::SecondaryAttack( void )
pHornet->SetThink( &CHornet::StartDart );
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
float flRechargeTimePause = 0.5f;
if( g_pGameRules->IsMultiplayer() )
@ -236,17 +234,7 @@ void CHgun::SecondaryAttack( void )
m_flRechargeTime = gpGlobals->time + flRechargeTimePause;
#endif
int flags;
#if CLIENT_WEAPONS
flags = FEV_NOTHOST;
#else
flags = 0;
#endif
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usHornetFire, 0.0f, g_vecZero, g_vecZero, 0.0f, 0.0f, 0, 0, 0, 0 );
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = DIM_GUN_FLASH;
SendWeaponAnim( HGUN_SHOOT );
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );

View File

@ -104,10 +104,10 @@ void CMP5::Precache( void )
int CMP5::GetItemInfo( ItemInfo *p )
{
p->pszName = STRING( pev->classname );
p->pszAmmo1 = "ak47";
p->pszAmmo1 = "akmm";
p->iMaxAmmo1 = AK47_MAX_CARRY;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->pszAmmo2 = "ARgrenades";
p->iMaxAmmo2 = M203_GRENADE_MAX_CARRY;
p->iMaxClip = MP5_MAX_CLIP;
p->iSlot = 0;
p->iPosition = 5;
@ -267,7 +267,7 @@ class CMP5AmmoClip : public CBasePlayerAmmo
}
BOOL AddAmmo( CBaseEntity *pOther )
{
int bResult = ( pOther->GiveAmmo( AMMO_MP5CLIP_GIVE, "ak47", AK47_MAX_CARRY ) != -1 );
int bResult = ( pOther->GiveAmmo( AMMO_MP5CLIP_GIVE, "akmm", AK47_MAX_CARRY ) != -1 );
if( bResult )
{
EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
@ -278,3 +278,57 @@ class CMP5AmmoClip : public CBasePlayerAmmo
LINK_ENTITY_TO_CLASS( ammo_mp5clip, CMP5AmmoClip )
LINK_ENTITY_TO_CLASS( ammo_9mmAR, CMP5AmmoClip )
class CMP5Chainammo : public CBasePlayerAmmo
{
void Spawn( void )
{
Precache();
SET_MODEL( ENT( pev ), "models/w_chainammo.mdl" );
CBasePlayerAmmo::Spawn();
}
void Precache( void )
{
PRECACHE_MODEL( "models/w_chainammo.mdl" );
PRECACHE_SOUND( "items/9mmclip1.wav" );
}
BOOL AddAmmo( CBaseEntity *pOther )
{
int bResult = ( pOther->GiveAmmo( AMMO_CHAINBOX_GIVE, "akmm", _9MM_MAX_CARRY ) != -1 );
if( bResult )
{
EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
}
return bResult;
}
};
LINK_ENTITY_TO_CLASS( ammo_9mmbox, CMP5Chainammo )
class CMP5AmmoGrenade : public CBasePlayerAmmo
{
void Spawn( void )
{
Precache();
SET_MODEL( ENT( pev ), "models/w_ARgrenade.mdl" );
CBasePlayerAmmo::Spawn();
}
void Precache( void )
{
PRECACHE_MODEL( "models/w_ARgrenade.mdl" );
PRECACHE_SOUND( "items/9mmclip1.wav" );
}
BOOL AddAmmo( CBaseEntity *pOther )
{
int bResult = ( pOther->GiveAmmo( AMMO_M203BOX_GIVE, "ARgrenades", M203_GRENADE_MAX_CARRY ) != -1 );
if( bResult )
{
EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
}
return bResult;
}
};
LINK_ENTITY_TO_CLASS( ammo_mp5grenades, CMP5AmmoGrenade )
LINK_ENTITY_TO_CLASS( ammo_ARgrenades, CMP5AmmoGrenade )

View File

@ -1664,7 +1664,7 @@ void CHalfLifeMultiplay::SendMOTDToClient( edict_t *client )
FREE_FILE( (void*)aFileList );
}
/*
int CMultiplayBusters::WeaponShouldRespawn( CBasePlayerItem *pWeapon )
{
if( pWeapon->m_iId == WEAPON_EGON )
@ -1878,5 +1878,5 @@ void CMultiplayBusters::PlayerGotWeapon( CBasePlayer *pPlayer, CBasePlayerItem *
pPlayer->pev->renderfx = kRenderFxGlowShell;
pPlayer->pev->renderamt = 25;
pPlayer->pev->rendercolor = Vector( 0, 75, 250 );
pPlayer->m_rgAmmo[pWeapon->PrimaryAmmoIndex()] = pPlayer->ammo_uranium = 100;
}*/
pPlayer->m_rgAmmo[pWeapon->PrimaryAmmoIndex()] = 100;
}

View File

@ -769,7 +769,7 @@ void CBasePlayer::PackDeadPlayerItems( void )
iPA = 0;
iPW = 0;
/*if( g_pGameRules->IsBustingGame())
if( g_pGameRules->IsBustingGame())
{
while( rgpPackWeapons[iPW] )
{
@ -787,7 +787,7 @@ void CBasePlayer::PackDeadPlayerItems( void )
iPW++;
}
}
else*/
else
{
// pack the ammo
while( iPackAmmo[iPA] != -1 )
@ -3526,8 +3526,25 @@ void CBasePlayer::CheatImpulseCommands( int iImpulse )
gEvilImpulse101 = FALSE;
break;
case 102:
// Gibbage!!!
CGib::SpawnRandomGibs( pev, 1, 1 );
gEvilImpulse101 = TRUE;
GiveNamedItem( "item_suit" );
GiveNamedItem( "weapon_handgrenade" );
GiveNamedItem( "weapon_tripmine" );
GiveNamedItem( "weapon_357" );
GiveNamedItem( "ammo_357" );
GiveNamedItem( "weapon_crossbow" );
GiveNamedItem( "ammo_crossbow" );
GiveNamedItem( "weapon_egon" );
GiveNamedItem( "weapon_gauss" );
GiveNamedItem( "ammo_gaussclip" );
GiveNamedItem( "weapon_sillyrocket" );
GiveNamedItem( "ammo_rpgclip" );
GiveNamedItem( "weapon_satchel" );
GiveNamedItem( "weapon_snark" );
GiveNamedItem( "weapon_hornetgun" );
gEvilImpulse101 = FALSE;
break;
case 103:
// What the hell are you doing?

View File

@ -75,6 +75,8 @@ void CPython::Spawn()
m_iDefaultAmmo = PYTHON_DEFAULT_GIVE;
m_flSoundDelay = 0;
FallInit();// get ready to fall down.
}
@ -206,7 +208,7 @@ void CPython::PrimaryAttack()
// HEV suit - indicate out of ammo condition
m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
m_flNextPrimaryAttack = 0.75f;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.75f;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10.0f, 15.0f );
}
@ -229,7 +231,7 @@ void CPython::Reload( void )
#endif
if( DefaultReload( PYTHON_MAX_CLIP, PYTHON_RELOAD, 2.0f, bUseScope ) )
{
m_flSoundDelay = 1.5f;
m_flSoundDelay = UTIL_WeaponTimeBase() + 1.5f;
}
}

View File

@ -23,6 +23,22 @@
#include "player.h"
#include "gamerules.h"
enum rpg_e
{
RPG_IDLE = 0,
RPG_FIDGET,
RPG_RELOAD, // to reload
RPG_FIRE2, // to empty
RPG_HOLSTER1, // loaded
RPG_DRAW1, // loaded
RPG_HOLSTER2, // unloaded
RPG_DRAW_UL, // unloaded
RPG_IDLE_UL, // unloaded idle
RPG_FIDGET_UL // unloaded fidget
};
LINK_ENTITY_TO_CLASS( weapon_sillyrocket, CRpg )
#if !CLIENT_DLL
LINK_ENTITY_TO_CLASS( laser_spot, CLaserSpot )
@ -288,4 +304,328 @@ void CRpgRocket::FollowThink( void )
pev->nextthink = gpGlobals->time + 0.1f;
}
#endif
void CRpg::Reload( void )
{
int iResult = 0;
// don't bother with any of this if don't need to reload.
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == RPG_MAX_CLIP )
return;
// because the RPG waits to autoreload when no missiles are active while the LTD is on, the
// weapons code is constantly calling into this function, but is often denied because
// a) missiles are in flight, but the LTD is on
// or
// b) player is totally out of ammo and has nothing to switch to, and should be allowed to
// shine the designator around
//
// Set the next attack time into the future so that WeaponIdle will get called more often
// than reload, allowing the RPG LTD to be updated
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5f;
if( m_cActiveRockets && m_fSpotActive )
{
// no reloading when there are active missiles tracking the designator.
// ward off future autoreload attempts by setting next attack time into the future for a bit.
return;
}
#if !CLIENT_DLL
if( m_pSpot && m_fSpotActive )
{
m_pSpot->Suspend( 2.1f );
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 2.1f;
}
#endif
if( m_iClip == 0 )
iResult = DefaultReload( RPG_MAX_CLIP, RPG_RELOAD, 2 );
if( iResult )
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
}
void CRpg::Spawn()
{
Precache();
m_iId = WEAPON_RPG;
SET_MODEL( ENT( pev ), "models/w_rpg.mdl" );
m_fSpotActive = 1;
#if CLIENT_DLL
if( bIsMultiplayer() )
#else
if( g_pGameRules->IsMultiplayer() )
#endif
{
// more default ammo in multiplay.
m_iDefaultAmmo = RPG_DEFAULT_GIVE * 2;
}
else
{
m_iDefaultAmmo = RPG_DEFAULT_GIVE;
}
FallInit();// get ready to fall down.
}
void CRpg::Precache( void )
{
PRECACHE_MODEL( "models/w_rpg.mdl" );
PRECACHE_MODEL( "models/v_rpg.mdl" );
PRECACHE_MODEL( "models/p_rpg.mdl" );
PRECACHE_SOUND( "items/9mmclip1.wav" );
UTIL_PrecacheOther( "laser_spot" );
UTIL_PrecacheOther( "rpg_rocket" );
PRECACHE_SOUND( "weapons/rocketfire1.wav" );
PRECACHE_SOUND( "weapons/glauncher.wav" ); // alternative fire sound
// m_usRpg = PRECACHE_EVENT( 1, "events/rpg.sc" );
}
int CRpg::GetItemInfo( ItemInfo *p )
{
p->pszName = STRING( pev->classname );
p->pszAmmo1 = "rockets";
p->iMaxAmmo1 = ROCKET_MAX_CARRY;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->iMaxClip = RPG_MAX_CLIP;
p->iSlot = 3;
p->iPosition = 0;
p->iId = m_iId = WEAPON_RPG;
p->iFlags = ITEM_FLAG_NOCHOICE;
p->iWeight = RPG_WEIGHT;
return 1;
}
int CRpg::AddToPlayer( CBasePlayer *pPlayer )
{
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}
BOOL CRpg::Deploy()
{
if( m_iClip == 0 )
{
return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW_UL, "rpg" );
}
return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW1, "rpg" );
}
BOOL CRpg::CanHolster( void )
{
if( m_fSpotActive && m_cActiveRockets )
{
// can't put away while guiding a missile.
return FALSE;
}
return TRUE;
}
void CRpg::Holster( int skiplocal /* = 0 */ )
{
m_fInReload = FALSE;// cancel any reload in progress.
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5f;
SendWeaponAnim( RPG_HOLSTER1 );
#if !CLIENT_DLL
if( m_pSpot )
{
m_pSpot->Killed( NULL, GIB_NEVER );
m_pSpot = NULL;
}
#endif
}
void CRpg::PrimaryAttack()
{
if( m_iClip )
{
m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH;
#if !CLIENT_DLL
SendWeaponAnim( RPG_FIRE2 );
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
UTIL_MakeVectors( m_pPlayer->pev->v_angle );
Vector vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16.0f + gpGlobals->v_right * 8.0f + gpGlobals->v_up * -8.0f;
CRpgRocket *pRocket = CRpgRocket::CreateRpgRocket( vecSrc, m_pPlayer->pev->v_angle, m_pPlayer, this );
UTIL_MakeVectors( m_pPlayer->pev->v_angle );// RpgRocket::Create stomps on globals, so remake.
pRocket->pev->velocity = pRocket->pev->velocity + gpGlobals->v_forward * DotProduct( m_pPlayer->pev->velocity, gpGlobals->v_forward );
#endif
// firing RPG no longer turns on the designator. ALT fire is a toggle switch for the LTD.
// Ken signed up for this as a global change (sjb)
int flags;
#if CLIENT_WEAPONS
flags = FEV_NOTHOST;
#else
flags = 0;
#endif
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/rocketfire1.wav", 0.9, ATTN_NORM );
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/glauncher.wav", 0.7, ATTN_NORM );
m_iClip--;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.5f;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5f;
m_pPlayer->pev->punchangle.x -= 5;
ResetEmptySound();
}
else
{
PlayEmptySound();
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2f;
}
UpdateSpot();
}
void CRpg::SecondaryAttack()
{
m_fSpotActive = !m_fSpotActive;
#if !CLIENT_DLL
if( !m_fSpotActive && m_pSpot )
{
m_pSpot->Killed( NULL, GIB_NORMAL );
m_pSpot = NULL;
}
#endif
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.2f;
}
void CRpg::WeaponIdle( void )
{
UpdateSpot();
if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return;
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{
ResetEmptySound();
int iAnim;
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0.0f, 1.0f );
if( flRand <= 0.75f || m_fSpotActive )
{
if( m_iClip == 0 )
iAnim = RPG_IDLE_UL;
else
iAnim = RPG_IDLE;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 90.0f / 15.0f;
}
else
{
if( m_iClip == 0 )
iAnim = RPG_FIDGET_UL;
else
iAnim = RPG_FIDGET;
#if WEAPONS_ANIMATION_TIMES_FIX
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 6.1f;
#else
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 3.0f;
#endif
}
SendWeaponAnim( iAnim );
}
else
{
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0f;
}
}
void CRpg::UpdateSpot( void )
{
#if !CLIENT_DLL
if( m_fSpotActive )
{
if (m_pPlayer->pev->viewmodel == 0)
return;
if( !m_pSpot )
{
m_pSpot = CLaserSpot::CreateSpot();
}
UTIL_MakeVectors( m_pPlayer->pev->v_angle );
Vector vecSrc = m_pPlayer->GetGunPosition();
Vector vecAiming = gpGlobals->v_forward;
TraceResult tr;
UTIL_TraceLine( vecSrc, vecSrc + vecAiming * 8192.0f, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
UTIL_SetOrigin( m_pSpot->pev, tr.vecEndPos );
}
#endif
}
class CRpgAmmo : public CBasePlayerAmmo
{
void Spawn( void )
{
Precache();
SET_MODEL( ENT( pev ), "models/w_rpgammo.mdl" );
CBasePlayerAmmo::Spawn();
}
void Precache( void )
{
PRECACHE_MODEL( "models/w_rpgammo.mdl" );
PRECACHE_SOUND( "items/9mmclip1.wav" );
}
BOOL AddAmmo( CBaseEntity *pOther )
{
int iGive;
#if CLIENT_DLL
if( bIsMultiplayer() )
#else
if( g_pGameRules->IsMultiplayer() )
#endif
{
// hand out more ammo per rocket in multiplayer.
iGive = AMMO_RPGCLIP_GIVE * 2;
}
else
{
iGive = AMMO_RPGCLIP_GIVE;
}
if( pOther->GiveAmmo( iGive, "rockets", ROCKET_MAX_CARRY ) != -1 )
{
EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
return TRUE;
}
return FALSE;
}
};
LINK_ENTITY_TO_CLASS( ammo_rpgclip, CRpgAmmo )
#endif

View File

@ -377,7 +377,7 @@ void CSatchel::PrimaryAttack( void )
}
m_chargeReady = SATCHEL_RELOAD;
m_flNextPrimaryAttack = GetNextAttackDelay( 0.5f );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5f;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5f;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5f;
break;
@ -426,7 +426,7 @@ void CSatchel::SecondaryAttack( void )
}
m_chargeReady = SATCHEL_RELOAD;
m_flNextPrimaryAttack = GetNextAttackDelay( 0.5f );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5f;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5f;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5f;
break;
@ -466,7 +466,7 @@ void CSatchel::Throw( void )
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
m_flNextPrimaryAttack = GetNextAttackDelay( 1.0f );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0f;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5f;
}
}
@ -507,7 +507,7 @@ void CSatchel::WeaponIdle( void )
// use tripmine animations
strcpy( m_pPlayer->m_szAnimExtention, "trip" );
m_flNextPrimaryAttack = GetNextAttackDelay( 0.5f );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5f;
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.5f;
m_chargeReady = SATCHEL_IDLE;
break;

View File

@ -434,7 +434,7 @@ void CSqueak::Precache( void )
PRECACHE_SOUND( "squeek/sqk_hunt3.wav" );
UTIL_PrecacheOther( "monster_snark" );
m_usSnarkFire = PRECACHE_EVENT( 1, "events/snarkfire.sc" );
//m_usSnarkFire = PRECACHE_EVENT( 1, "events/snarkfire.sc" );
}
int CSqueak::GetItemInfo( ItemInfo *p )
@ -525,16 +525,10 @@ void CSqueak::PrimaryAttack()
// find place to toss monster
UTIL_TraceLine( trace_origin + forward * 24.0f, trace_origin + gpGlobals->v_forward * 60.0f, dont_ignore_monsters, NULL, &tr );
int flags;
#if CLIENT_WEAPONS
flags = FEV_NOTHOST;
#else
flags = 0;
#endif
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSnarkFire, 0.0f, g_vecZero, g_vecZero, 0.0f, 0.0f, 0, 0, 0, 0 );
if( tr.fAllSolid == 0 && tr.fStartSolid == 0 && tr.flFraction > 0 )
{
SendWeaponAnim( SQUEAK_THROW );
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
#if !CLIENT_DLL
@ -555,7 +549,7 @@ void CSqueak::PrimaryAttack()
m_fJustThrown = 1;
m_flNextPrimaryAttack = GetNextAttackDelay( 0.3f );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.3f;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0f;
}
}

View File

@ -367,3 +367,167 @@ void CTripmineGrenade::DelayDeathThink( void )
}
#endif
LINK_ENTITY_TO_CLASS( weapon_tripmine, CTripmine )
void CTripmine::Spawn()
{
Precache();
m_iId = WEAPON_TRIPMINE;
SET_MODEL( ENT( pev ), "models/v_tripmine.mdl" );
pev->frame = 0;
#ifdef CLIENT_DLL
pev->body = 0;
#else
pev->body = 3;
#endif
pev->sequence = TRIPMINE_GROUND;
// ResetSequenceInfo();
pev->framerate = 0;
FallInit();// get ready to fall down
m_iDefaultAmmo = TRIPMINE_DEFAULT_GIVE;
#if CLIENT_DLL
if( !bIsMultiplayer() )
#else
if( !g_pGameRules->IsDeathmatch() )
#endif
{
UTIL_SetSize( pev, Vector( -16.0f, -16.0f, 0.0f ), Vector( 16.0f, 16.0f, 28.0f ) );
}
}
void CTripmine::Precache( void )
{
PRECACHE_MODEL( "models/v_tripmine.mdl" );
PRECACHE_MODEL( "models/p_tripmine.mdl" );
UTIL_PrecacheOther( "monster_tripmine" );
//m_usTripFire = PRECACHE_EVENT( 1, "events/tripfire.sc" );
}
int CTripmine::GetItemInfo( ItemInfo *p )
{
p->pszName = STRING( pev->classname );
p->pszAmmo1 = "Trip Mine";
p->iMaxAmmo1 = TRIPMINE_MAX_CARRY;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->iMaxClip = WEAPON_NOCLIP;
p->iSlot = 4;
p->iPosition = 2;
p->iId = m_iId = WEAPON_TRIPMINE;
p->iWeight = TRIPMINE_WEIGHT;
p->iFlags = ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE;
return 1;
}
BOOL CTripmine::Deploy()
{
pev->body = 0;
return DefaultDeploy( "models/v_tripmine.mdl", "models/p_tripmine.mdl", TRIPMINE_DRAW, "trip" );
}
void CTripmine::Holster( int skiplocal /* = 0 */ )
{
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5f;
if( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
{
// out of mines
m_pPlayer->pev->weapons &= ~( 1 << WEAPON_TRIPMINE );
DestroyItem();
}
SendWeaponAnim( TRIPMINE_HOLSTER );
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "common/null.wav", 1.0f, ATTN_NORM );
}
void CTripmine::PrimaryAttack( void )
{
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
return;
UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle );
Vector vecSrc = m_pPlayer->GetGunPosition();
Vector vecAiming = gpGlobals->v_forward;
TraceResult tr;
UTIL_TraceLine( vecSrc, vecSrc + vecAiming * 128.0f, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
if( tr.flFraction < 1.0f )
{
CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit );
if( pEntity && !( pEntity->pev->flags & FL_CONVEYOR ) )
{
Vector angles = UTIL_VecToAngles( tr.vecPlaneNormal );
CBaseEntity::Create( "monster_tripmine", tr.vecEndPos + tr.vecPlaneNormal * 8.0f, angles, m_pPlayer->edict() );
m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--;
// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
{
// no more mines!
RetireWeapon();
return;
}
}
/*else
{
// ALERT( at_console, "no deploy\n" );
}*/
}
/*else
{
}*/
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.3f;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
}
void CTripmine::WeaponIdle( void )
{
pev->body = 0;
if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return;
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] > 0 )
{
SendWeaponAnim( TRIPMINE_DRAW );
}
else
{
RetireWeapon();
return;
}
int iAnim;
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
if( flRand <= 0.25f )
{
iAnim = TRIPMINE_IDLE1;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 90.0f / 30.0f;
}
else if( flRand <= 0.75f )
{
iAnim = TRIPMINE_IDLE2;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 60.0f / 30.0f;
}
else
{
iAnim = TRIPMINE_FIDGET;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 100.0f / 30.0f;
}
SendWeaponAnim( iAnim );
}

View File

@ -319,16 +319,16 @@ void W_Precache( void )
UTIL_PrecacheOther( "item_security" );
UTIL_PrecacheOther( "item_longjump" );
// holster
UTIL_PrecacheOtherWeapon("weapon_holster");
// torch
UTIL_PrecacheOtherWeapon("weapon_torch");
// shotgun
UTIL_PrecacheOtherWeapon( "weapon_shotgun" );
UTIL_PrecacheOther( "ammo_buckshot" );
// holster
UTIL_PrecacheOtherWeapon( "weapon_holster" );
// torch
UTIL_PrecacheOtherWeapon( "weapon_torch" );
// crowbar
UTIL_PrecacheOtherWeapon( "weapon_crowbar" );
@ -339,8 +339,50 @@ void W_Precache( void )
// mp5
UTIL_PrecacheOtherWeapon( "weapon_9mmAR" );
UTIL_PrecacheOther( "ammo_9mmAR" );
UTIL_PrecacheOther( "ammo_ARgrenades" );
// 9mm ammo box
UTIL_PrecacheOther( "ammo_9mmbox" );
#if !OEM_BUILD && !HLDEMO_BUILD
// python
UTIL_PrecacheOtherWeapon( "weapon_357" );
UTIL_PrecacheOther( "ammo_357" );
// gauss
UTIL_PrecacheOtherWeapon( "weapon_gauss" );
UTIL_PrecacheOther( "ammo_gaussclip" );
// rpg
UTIL_PrecacheOtherWeapon( "weapon_sillyrocket" );
UTIL_PrecacheOther( "ammo_rpgclip" );
// crossbow
UTIL_PrecacheOtherWeapon( "weapon_crossbow" );
UTIL_PrecacheOther( "ammo_crossbow" );
// egon
UTIL_PrecacheOtherWeapon( "weapon_egon" );
#endif
// tripmine
UTIL_PrecacheOtherWeapon( "weapon_tripmine" );
#if !OEM_BUILD && !HLDEMO_BUILD
// satchel charge
UTIL_PrecacheOtherWeapon( "weapon_satchel" );
#endif
// hand grenade
UTIL_PrecacheOtherWeapon( "weapon_handgrenade" );
#if !OEM_BUILD && !HLDEMO_BUILD
// squeak grenade
UTIL_PrecacheOtherWeapon( "weapon_snark" );
// hornetgun
UTIL_PrecacheOtherWeapon( "weapon_hornetgun" );
if( g_pGameRules->IsDeathmatch() )
{
UTIL_PrecacheOther( "weaponbox" );// container for dropped deathmatch weapons
@ -464,14 +506,14 @@ void CBasePlayerItem::FallThink( void )
SetThink( NULL );
}
/*if( g_pGameRules->IsBustingGame())
if( g_pGameRules->IsBustingGame())
{
if( !FNullEnt( pev->owner ))
return;
if( FClassnameIs( pev, "weapon_egon" ))
UTIL_Remove( this );
}*/
}
}
//=========================================================
@ -634,7 +676,7 @@ void CBasePlayerWeapon::ItemPostFrame( void )
if( !( m_pPlayer->pev->button & IN_ATTACK ) )
{
m_flLastFireTime = 0.0f;
// m_flLastFireTime = 0.0f;
}
if( ( m_pPlayer->pev->button & IN_ATTACK2 ) && CanAttack( m_flNextSecondaryAttack, gpGlobals->time, UseDecrement() ) )
@ -987,7 +1029,7 @@ BOOL CBasePlayerWeapon::DefaultDeploy( const char *szViewModel, const char *szWe
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5f;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0f;
m_flLastFireTime = 0.0f;
// m_flLastFireTime = 0.0f;
return TRUE;
}
@ -1090,7 +1132,7 @@ void CBasePlayerAmmo::Materialize( void )
void CBasePlayerAmmo::DefaultTouch( CBaseEntity *pOther )
{
if( !pOther->IsPlayer() /*|| IsPlayerBusting( pOther )*/)
if( !pOther->IsPlayer() || IsPlayerBusting( pOther ))
{
return;
}
@ -1187,7 +1229,7 @@ void CBasePlayerWeapon::RetireWeapon( void )
}
}
float CBasePlayerWeapon::GetNextAttackDelay( float delay )
/*float CBasePlayerWeapon::GetNextAttackDelay( float delay )
{
if( m_flLastFireTime == 0 || m_flNextPrimaryAttack == -1.0f )
{
@ -1214,7 +1256,7 @@ float CBasePlayerWeapon::GetNextAttackDelay( float delay )
//_snprintf( szMsg, sizeof(szMsg), "next attack time: %0.4f\n", gpGlobals->time + flNextAttack );
//OutputDebugString( szMsg );
return flNextAttack;
}
}*/
//*********************************************************
// weaponbox code:
@ -1595,7 +1637,7 @@ void CBasePlayerWeapon::PrintState( void )
ALERT( at_console, "m_iclip: %i\n", m_iClip );
}
/*
TYPEDESCRIPTION CRpg::m_SaveData[] =
{
DEFINE_FIELD( CRpg, m_fSpotActive, FIELD_INTEGER ),
@ -1603,7 +1645,7 @@ TYPEDESCRIPTION CRpg::m_SaveData[] =
};
IMPLEMENT_SAVERESTORE( CRpg, CBasePlayerWeapon )
*/
TYPEDESCRIPTION CRpgRocket::m_SaveData[] =
{
DEFINE_FIELD( CRpgRocket, m_flIgniteTime, FIELD_TIME ),
@ -1621,7 +1663,7 @@ TYPEDESCRIPTION CShotgun::m_SaveData[] =
};
IMPLEMENT_SAVERESTORE( CShotgun, CBasePlayerWeapon )
/*
TYPEDESCRIPTION CGauss::m_SaveData[] =
{
DEFINE_FIELD( CGauss, m_fInAttack, FIELD_INTEGER ),
@ -1660,7 +1702,7 @@ TYPEDESCRIPTION CSatchel::m_SaveData[] =
DEFINE_FIELD( CSatchel, m_chargeReady, FIELD_INTEGER ),
};
IMPLEMENT_SAVERESTORE( CSatchel, CBasePlayerWeapon )*/
IMPLEMENT_SAVERESTORE( CSatchel, CBasePlayerWeapon )
TYPEDESCRIPTION CTorch::m_SaveData[] =
{

View File

@ -67,7 +67,18 @@ public:
#define WEAPON_GLOCK 2
#define WEAPON_TORCH 3
#define WEAPON_MP5 4
#define WEAPON_CHAINGUN 5
#define WEAPON_CROSSBOW 6
#define WEAPON_SHOTGUN 7
#define WEAPON_RPG 8
#define WEAPON_GAUSS 9
#define WEAPON_EGON 10
#define WEAPON_HORNETGUN 11
#define WEAPON_HANDGRENADE 12
#define WEAPON_TRIPMINE 13
#define WEAPON_SATCHEL 14
#define WEAPON_SNARK 15
#define WEAPON_PYTHON 16
#define WEAPON_HOLSTER 17
#define WEAPON_ALLWEAPONS (~(1<<WEAPON_SUIT))
@ -81,32 +92,81 @@ public:
#define TORCH_WEIGHT 1
#define CROWBAR_WEIGHT 5
#define GLOCK_WEIGHT 10
#define PYTHON_WEIGHT 15
#define MP5_WEIGHT 15
#define SHOTGUN_WEIGHT 15
#define CROSSBOW_WEIGHT 10
#define RPG_WEIGHT 20
#define GAUSS_WEIGHT 20
#define EGON_WEIGHT 20
#define HORNETGUN_WEIGHT 15
#define HANDGRENADE_WEIGHT 5
#define SNARK_WEIGHT 5
#define SATCHEL_WEIGHT -10
#define TRIPMINE_WEIGHT -10
// weapon clip/carry ammo capacities
#define URANIUM_MAX_CARRY 100
#define _9MM_MAX_CARRY 50
#define _357_MAX_CARRY 36
#define AK47_MAX_CARRY 150
#define BUCKSHOT_MAX_CARRY 125
#define BOLT_MAX_CARRY 50
#define ROCKET_MAX_CARRY 5
#define HANDGRENADE_MAX_CARRY 10
#define SATCHEL_MAX_CARRY 5
#define TRIPMINE_MAX_CARRY 5
#define SNARK_MAX_CARRY 15
#define HORNET_MAX_CARRY 8
#define M203_GRENADE_MAX_CARRY 10
// the maximum amount of ammo each weapon's clip can hold
#define WEAPON_NOCLIP -1
//#define CROWBAR_MAX_CLIP WEAPON_NOCLIP
#define GLOCK_MAX_CLIP 17
#define PYTHON_MAX_CLIP 6
#define MP5_MAX_CLIP 40
#define SHOTGUN_MAX_CLIP 2
#define CROSSBOW_MAX_CLIP 5
#define RPG_MAX_CLIP 1
#define GAUSS_MAX_CLIP WEAPON_NOCLIP
#define EGON_MAX_CLIP WEAPON_NOCLIP
#define HORNETGUN_MAX_CLIP WEAPON_NOCLIP
#define HANDGRENADE_MAX_CLIP WEAPON_NOCLIP
#define SATCHEL_MAX_CLIP WEAPON_NOCLIP
#define TRIPMINE_MAX_CLIP WEAPON_NOCLIP
#define SNARK_MAX_CLIP WEAPON_NOCLIP
// the default amount of ammo that comes with each gun when it spawns
#define GLOCK_DEFAULT_GIVE 17
#define PYTHON_DEFAULT_GIVE 6
#define MP5_DEFAULT_GIVE 25
#define MP5_DEFAULT_GIVE_MP MP5_MAX_CLIP
#define MP5_M203_DEFAULT_GIVE 0
#define SHOTGUN_DEFAULT_GIVE 2
#define CROSSBOW_DEFAULT_GIVE 5
#define RPG_DEFAULT_GIVE 1
#define GAUSS_DEFAULT_GIVE 20
#define EGON_DEFAULT_GIVE 20
#define HANDGRENADE_DEFAULT_GIVE 5
#define SATCHEL_DEFAULT_GIVE 1
#define TRIPMINE_DEFAULT_GIVE 1
#define SNARK_DEFAULT_GIVE 5
#define HIVEHAND_DEFAULT_GIVE 8
// The amount of ammo given to a player by an ammo item.
#define AMMO_URANIUMBOX_GIVE 20
#define AMMO_GLOCKCLIP_GIVE GLOCK_MAX_CLIP
#define AMMO_357BOX_GIVE PYTHON_MAX_CLIP
#define AMMO_MP5CLIP_GIVE MP5_MAX_CLIP
#define AMMO_CHAINBOX_GIVE 200
#define AMMO_M203BOX_GIVE 2
#define AMMO_BUCKSHOTBOX_GIVE 12
#define AMMO_CROSSBOWCLIP_GIVE CROSSBOW_MAX_CLIP
#define AMMO_RPGCLIP_GIVE RPG_MAX_CLIP
#define AMMO_URANIUMBOX_GIVE 20
#define AMMO_SNARKBOX_GIVE 5
// bullet types
typedef enum
@ -292,8 +352,8 @@ public:
int m_iDefaultAmmo;// how much ammo you get when you pick up this weapon as placed by a level designer.
// hle time creep vars
float m_flPrevPrimaryAttack;
float m_flLastFireTime;
// float m_flPrevPrimaryAttack;
// float m_flLastFireTime;
};
class CBasePlayerAmmo : public CBaseEntity
@ -430,7 +490,6 @@ private:
int m_iShell;
int m_iClipModel;
int m_fInAttack;
unsigned short m_usFireGlock1;
unsigned short m_usFireGlock2;
};
@ -466,7 +525,7 @@ public:
void WeaponIdle( void );
private:
unsigned short m_usCrowbar;
//unsigned short m_usCrowbar;
};
class CPython : public CBasePlayerWeapon
@ -529,7 +588,7 @@ public:
private:
unsigned short m_usMP5;
unsigned short m_usMP52;
//unsigned short m_usMP52;
};
class CCrossbow : public CBasePlayerWeapon
@ -562,8 +621,8 @@ public:
}
private:
unsigned short m_usCrossbow;
unsigned short m_usCrossbow2;
//unsigned short m_usCrossbow;
//unsigned short m_usCrossbow2;
};
class CShotgun : public CBasePlayerWeapon
@ -675,7 +734,7 @@ public:
}
private:
unsigned short m_usRpg;
//unsigned short m_usRpg;
};
class CRpgRocket : public CGrenade
@ -697,7 +756,7 @@ public:
float m_flIgniteTime;
EHANDLE m_hLauncher; // handle back to the launcher that fired me.
};
/*
class CGauss : public CBasePlayerWeapon
{
public:
@ -722,6 +781,7 @@ public:
void StartFire( void );
void Fire( Vector vecOrigSrc, Vector vecDirShooting, float flDamage );
float GetFullChargeTime( void );
int m_fInAttack;
int m_iBalls;
int m_iGlow;
int m_iBeam;
@ -783,6 +843,9 @@ public:
void UseAmmo( int count );
static int g_fireAnims1[];
static int g_fireAnims2[];
enum EGON_FIRESTATE { FIRE_OFF, FIRE_CHARGE };
enum EGON_FIREMODE { FIRE_NARROW, FIRE_WIDE};
CBeam *m_pBeam;
@ -798,17 +861,18 @@ public:
#endif
}
unsigned short m_usEgonStop;
//unsigned short m_usEgonStop;
private:
#if !CLIENT_DLL
float m_shootTime;
#endif
EGON_FIRESTATE m_fireState;
EGON_FIREMODE m_fireMode;
float m_shakeTime;
BOOL m_deployed;
unsigned short m_usEgonFire;
//unsigned short m_usEgonFire;
};
class CHgun : public CBasePlayerWeapon
@ -872,6 +936,8 @@ public:
return FALSE;
#endif
}
float m_flStartThrow;
float m_flReleaseThrow;
};
class CSatchel : public CBasePlayerWeapon
@ -906,8 +972,10 @@ public:
return FALSE;
#endif
}
private:
int m_chargeReady;
};
*/
class CTripmine : public CBasePlayerWeapon
{
public:
@ -965,7 +1033,7 @@ public:
}
private:
unsigned short m_usSnarkFire;
//unsigned short m_usSnarkFire;
};
class CHolster : public CBasePlayerWeapon