From db5a2d0cb18962fcbdd86858a16515f7c1076f39 Mon Sep 17 00:00:00 2001 From: Andrey Akhmichin <15944199+nekonomicon@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:29:59 +0500 Subject: [PATCH] Add working impulse 102 weapon cheat. --- cl_dll/wscript | 28 +-- dlls/CMakeLists.txt | 16 +- dlls/agrunt.cpp | 13 -- dlls/crossbow.cpp | 43 ++--- dlls/crowbar.cpp | 2 +- dlls/egon.cpp | 55 +++--- dlls/func_break.cpp | 2 +- dlls/game.cpp | 4 +- dlls/game.h | 2 +- dlls/gamerules.h | 6 +- dlls/gauss.cpp | 17 +- dlls/glock.cpp | 29 +-- dlls/handgrenade.cpp | 4 +- dlls/hornet.cpp | 17 +- dlls/hornetgun.cpp | 24 +-- dlls/mp5.cpp | 62 ++++++- dlls/multiplay_gamerules.cpp | 6 +- dlls/player.cpp | 25 ++- dlls/python.cpp | 6 +- dlls/rpg.cpp | 340 +++++++++++++++++++++++++++++++++++ dlls/satchel.cpp | 8 +- dlls/squeakgrenade.cpp | 14 +- dlls/tripmine.cpp | 164 +++++++++++++++++ dlls/weapons.cpp | 76 ++++++-- dlls/weapons.h | 94 ++++++++-- 25 files changed, 858 insertions(+), 199 deletions(-) diff --git a/cl_dll/wscript b/cl_dll/wscript index 16d0f055..c04046ec 100644 --- a/cl_dll/wscript +++ b/cl_dll/wscript @@ -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' ]) diff --git a/dlls/CMakeLists.txt b/dlls/CMakeLists.txt index 7f2c8931..9d1ae60c 100644 --- a/dlls/CMakeLists.txt +++ b/dlls/CMakeLists.txt @@ -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 diff --git a/dlls/agrunt.cpp b/dlls/agrunt.cpp index 6c58ba8c..210b783e 100644 --- a/dlls/agrunt.cpp +++ b/dlls/agrunt.cpp @@ -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 ) diff --git a/dlls/crossbow.cpp b/dlls/crossbow.cpp index 97bc583c..53f146c4 100644 --- a/dlls/crossbow.cpp +++ b/dlls/crossbow.cpp @@ -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; diff --git a/dlls/crowbar.cpp b/dlls/crowbar.cpp index b21b6a71..e0f6d12d 100644 --- a/dlls/crowbar.cpp +++ b/dlls/crowbar.cpp @@ -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; } diff --git a/dlls/egon.cpp b/dlls/egon.cpp index ab6fe24c..d0d3b111 100644 --- a/dlls/egon.cpp +++ b/dlls/egon.cpp @@ -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(); diff --git a/dlls/func_break.cpp b/dlls/func_break.cpp index 6ca81e4e..7bcfa8ea 100644 --- a/dlls/func_break.cpp +++ b/dlls/func_break.cpp @@ -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 diff --git a/dlls/game.cpp b/dlls/game.cpp index 40458853..a8011a37 100644 --- a/dlls/game.cpp +++ b/dlls/game.cpp @@ -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 diff --git a/dlls/game.h b/dlls/game.h index 999650fc..8a0f6d34 100644 --- a/dlls/game.h +++ b/dlls/game.h @@ -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; diff --git a/dlls/gamerules.h b/dlls/gamerules.h index 8b90620a..adbbaa31 100644 --- a/dlls/gamerules.h +++ b/dlls/gamerules.h @@ -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 diff --git a/dlls/gauss.cpp b/dlls/gauss.cpp index 734950f4..603308af 100644 --- a/dlls/gauss.cpp +++ b/dlls/gauss.cpp @@ -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, diff --git a/dlls/glock.cpp b/dlls/glock.cpp index fc7374ae..1ff95d65 100644 --- a/dlls/glock.cpp +++ b/dlls/glock.cpp @@ -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; diff --git a/dlls/handgrenade.cpp b/dlls/handgrenade.cpp index fb729b2a..801fe0bd 100644 --- a/dlls/handgrenade.cpp +++ b/dlls/handgrenade.cpp @@ -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; } diff --git a/dlls/hornet.cpp b/dlls/hornet.cpp index 782e1a27..8eb29992 100644 --- a/dlls/hornet.cpp +++ b/dlls/hornet.cpp @@ -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 ) ) { diff --git a/dlls/hornetgun.cpp b/dlls/hornetgun.cpp index 1ae35df2..4d2d45cf 100644 --- a/dlls/hornetgun.cpp +++ b/dlls/hornetgun.cpp @@ -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 ); diff --git a/dlls/mp5.cpp b/dlls/mp5.cpp index 952b5724..0f3bd29e 100644 --- a/dlls/mp5.cpp +++ b/dlls/mp5.cpp @@ -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 ) diff --git a/dlls/multiplay_gamerules.cpp b/dlls/multiplay_gamerules.cpp index d4ef16d2..006fc63d 100644 --- a/dlls/multiplay_gamerules.cpp +++ b/dlls/multiplay_gamerules.cpp @@ -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; +} diff --git a/dlls/player.cpp b/dlls/player.cpp index 23cef799..d3dc5c79 100644 --- a/dlls/player.cpp +++ b/dlls/player.cpp @@ -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? diff --git a/dlls/python.cpp b/dlls/python.cpp index 567187c0..d9a4b2c5 100644 --- a/dlls/python.cpp +++ b/dlls/python.cpp @@ -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; } } diff --git a/dlls/rpg.cpp b/dlls/rpg.cpp index 2630b3d1..43b60cf8 100644 --- a/dlls/rpg.cpp +++ b/dlls/rpg.cpp @@ -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 diff --git a/dlls/satchel.cpp b/dlls/satchel.cpp index f5fa886b..711d4dde 100644 --- a/dlls/satchel.cpp +++ b/dlls/satchel.cpp @@ -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; diff --git a/dlls/squeakgrenade.cpp b/dlls/squeakgrenade.cpp index f9e77472..1b15263d 100644 --- a/dlls/squeakgrenade.cpp +++ b/dlls/squeakgrenade.cpp @@ -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; } } diff --git a/dlls/tripmine.cpp b/dlls/tripmine.cpp index 0dbc9be8..2c4277ad 100644 --- a/dlls/tripmine.cpp +++ b/dlls/tripmine.cpp @@ -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 ); +} diff --git a/dlls/weapons.cpp b/dlls/weapons.cpp index 8c2d3584..63be90cf 100644 --- a/dlls/weapons.cpp +++ b/dlls/weapons.cpp @@ -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[] = { diff --git a/dlls/weapons.h b/dlls/weapons.h index be55e41a..89240a8e 100644 --- a/dlls/weapons.h +++ b/dlls/weapons.h @@ -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<