diff --git a/cl_dll/CMakeLists.txt b/cl_dll/CMakeLists.txt index 6511addf..1cc10564 100644 --- a/cl_dll/CMakeLists.txt +++ b/cl_dll/CMakeLists.txt @@ -37,7 +37,7 @@ set (CLDLL_SOURCES # ../dlls/hornetgun.cpp # ../dlls/mp5.cpp # ../dlls/python.cpp -# ../dlls/rpg.cpp + ../dlls/rpg.cpp ../dlls/satchel.cpp # ../dlls/shotgun.cpp # ../dlls/squeakgrenade.cpp diff --git a/cl_dll/hl/hl_weapons.cpp b/cl_dll/hl/hl_weapons.cpp index 96e05daa..44e2b753 100644 --- a/cl_dll/hl/hl_weapons.cpp +++ b/cl_dll/hl/hl_weapons.cpp @@ -59,10 +59,10 @@ CCrowbar g_Crowbar; CPython g_Python; CMP5 g_Mp5*/; CCrossbow g_Crossbow; -/* -CShotgun g_Shotgun; + +//CShotgun g_Shotgun; CRpg g_Rpg; -CGauss g_Gauss;*/ +//CGauss g_Gauss; CEgon g_Egon; //CHgun g_HGun; CHandGrenade g_HandGren; @@ -630,9 +630,9 @@ void HUD_InitClientWeapons( void ) /*HUD_PrepEntity( &g_Python, &player ); HUD_PrepEntity( &g_Mp5, &player );*/ HUD_PrepEntity( &g_Crossbow, &player ); - /*HUD_PrepEntity( &g_Shotgun, &player ); + //HUD_PrepEntity( &g_Shotgun, &player ); HUD_PrepEntity( &g_Rpg, &player ); - HUD_PrepEntity( &g_Gauss, &player );*/ + //HUD_PrepEntity( &g_Gauss, &player ); HUD_PrepEntity( &g_Egon, &player ); //HUD_PrepEntity( &g_HGun, &player ); HUD_PrepEntity( &g_HandGren, &player ); @@ -714,19 +714,19 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm case WEAPON_MP5: pWeapon = &g_Mp5; break;*/ - case WEAPON_CROSSBOW: + case WEAPON_BOLTGUN: pWeapon = &g_Crossbow; break;/* case WEAPON_SHOTGUN: pWeapon = &g_Shotgun; - break; - case WEAPON_RPG: + break;*/ + case WEAPON_ROCKETL: pWeapon = &g_Rpg; - break; + break;/* case WEAPON_GAUSS: pWeapon = &g_Gauss; break;*/ - case WEAPON_EGON: + case WEAPON_RAILGUN: pWeapon = &g_Egon; break; /*case WEAPON_HORNETGUN: @@ -848,11 +848,11 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm player.m_pActiveItem = g_pWpns[from->client.m_iId]; } - /*if( player.m_pActiveItem->m_iId == WEAPON_RPG ) + if( player.m_pActiveItem->m_iId == WEAPON_ROCKETL ) { ( (CRpg *)player.m_pActiveItem )->m_fSpotActive = (int)from->client.vuser2[1]; ( (CRpg *)player.m_pActiveItem )->m_cActiveRockets = (int)from->client.vuser2[2]; - }*/ + } // Don't go firing anything if we have died. // Or if we don't have a weapon model deployed @@ -916,11 +916,11 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm to->client.vuser2[0] = player.ammo_hornets; to->client.ammo_rockets = player.ammo_rockets; - /*if( player.m_pActiveItem->m_iId == WEAPON_RPG ) + if( player.m_pActiveItem->m_iId == WEAPON_ROCKETL ) { from->client.vuser2[1] = ( (CRpg *)player.m_pActiveItem)->m_fSpotActive; from->client.vuser2[2] = ( (CRpg *)player.m_pActiveItem)->m_cActiveRockets; - }*/ + } // Make sure that weapon animation matches what the game .dll is telling us // over the wire ( fixes some animation glitches ) diff --git a/dlls/CMakeLists.txt b/dlls/CMakeLists.txt index 3a8b8423..7e545bec 100644 --- a/dlls/CMakeLists.txt +++ b/dlls/CMakeLists.txt @@ -100,7 +100,7 @@ set (SVDLL_SOURCES # python.cpp rat.cpp roach.cpp -# rpg.cpp + rpg.cpp satchel.cpp schedule.cpp scientist.cpp @@ -151,7 +151,7 @@ set (SVDLL_SOURCES coldice/uzi.cpp coldice/grenadel.cpp coldice/ppk.cpp - coldice/rocketl.cpp +# coldice/rocketl.cpp ../pm_shared/pm_debug.c ../pm_shared/pm_math.c ../pm_shared/pm_shared.c diff --git a/dlls/client.cpp b/dlls/client.cpp index 268fb86b..788dfecb 100644 --- a/dlls/client.cpp +++ b/dlls/client.cpp @@ -1650,11 +1650,11 @@ void UpdateClientData( const struct edict_s *ent, int sendweapons, struct client cd->vuser4.y = pl->m_rgAmmo[gun->m_iPrimaryAmmoType]; cd->vuser4.z = pl->m_rgAmmo[gun->m_iSecondaryAmmoType]; - /*if( pl->m_pActiveItem->m_iId == WEAPON_RPG ) + if( pl->m_pActiveItem->m_iId == WEAPON_ROCKETL ) { cd->vuser2.y = ( (CRpg *)pl->m_pActiveItem )->m_fSpotActive; cd->vuser2.z = ( (CRpg *)pl->m_pActiveItem )->m_cActiveRockets; - }*/ + } } } } diff --git a/dlls/egon.cpp b/dlls/egon.cpp index cbd86c53..58accf00 100644 --- a/dlls/egon.cpp +++ b/dlls/egon.cpp @@ -55,7 +55,7 @@ LINK_ENTITY_TO_CLASS( weapon_gauss, CEgon ) void CEgon::Spawn() { Precache(); - m_iId = WEAPON_EGON; + m_iId = WEAPON_RAILGUN; SET_MODEL( ENT( pev ), "models/w_egon.mdl" ); m_iDefaultAmmo = RAILGUN_DEFAULT_GIVE; diff --git a/dlls/rpg.cpp b/dlls/rpg.cpp index 1fec5cf1..34630d07 100644 --- a/dlls/rpg.cpp +++ b/dlls/rpg.cpp @@ -38,6 +38,7 @@ enum rpg_e }; LINK_ENTITY_TO_CLASS( weapon_rpg, CRpg ) +LINK_ENTITY_TO_CLASS( weapon_rocketl, CRpg ) #ifndef CLIENT_DLL @@ -97,7 +98,7 @@ void CLaserSpot::Precache( void ) PRECACHE_MODEL( "sprites/laserdot.spr" ); } -LINK_ENTITY_TO_CLASS( rpg_rocket, CRpgRocket ) +LINK_ENTITY_TO_CLASS( rocket, CRpgRocket ) //========================================================= //========================================================= @@ -129,7 +130,7 @@ void CRpgRocket::Spawn( void ) UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) ); UTIL_SetOrigin( pev, pev->origin ); - pev->classname = MAKE_STRING( "rpg_rocket" ); + pev->classname = MAKE_STRING( "rocket" ); SetThink( &CRpgRocket::IgniteThink ); SetTouch( &CGrenade::ExplodeTouch ); @@ -143,7 +144,7 @@ void CRpgRocket::Spawn( void ) pev->nextthink = gpGlobals->time + 0.4; - pev->dmg = gSkillData.plrDmgRPG; + pev->dmg = gSkillData.plrDmgRocket; } //========================================================= @@ -184,7 +185,7 @@ void CRpgRocket::IgniteThink( void ) WRITE_BYTE( TE_BEAMFOLLOW ); WRITE_SHORT( entindex() ); // entity WRITE_SHORT( m_iTrail ); // model - WRITE_BYTE( 40 ); // life + WRITE_BYTE( 5 ); // life WRITE_BYTE( 5 ); // width WRITE_BYTE( 224 ); // r, g, b WRITE_BYTE( 224 ); // r, g, b @@ -315,7 +316,7 @@ void CRpg::Reload( void ) #endif if( m_iClip == 0 ) - iResult = DefaultReload( RPG_MAX_CLIP, RPG_RELOAD, 2 ); + iResult = DefaultReload( ROCKETL_MAX_CLIP, RPG_RELOAD, 2 ); if( iResult ) m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); @@ -323,42 +324,31 @@ void CRpg::Reload( void ) void CRpg::Spawn() { + pev->classname = MAKE_STRING( "weapon_rocketl" ); Precache(); - m_iId = WEAPON_RPG; + m_iId = WEAPON_ROCKETL; - SET_MODEL( ENT( pev ), "models/w_rpg.mdl" ); + SET_MODEL( ENT( pev ), "models/wmodels/w_rocketl.mdl" ); m_fSpotActive = 1; -#ifdef 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; - } + 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" ); + PRECACHE_MODEL( "models/wmodels/w_rocketl.mdl" ); + PRECACHE_MODEL( "models/vmodels/v_rocketl.mdl" ); + PRECACHE_MODEL( "models/pmodels/p_rocketl.mdl" ); UTIL_PrecacheOther( "laser_spot" ); - UTIL_PrecacheOther( "rpg_rocket" ); + UTIL_PrecacheOther( "rocket" ); PRECACHE_SOUND( "weapons/rocketfire1.wav" ); PRECACHE_SOUND( "weapons/glauncher.wav" ); // alternative fire sound + PRECACHE_SOUND( "weapons/rocketalert.wav" ); + PRECACHE_SOUND( "weapons/rocketload.wav" ); m_usRpg = PRECACHE_EVENT( 1, "events/rpg.sc" ); } @@ -366,16 +356,16 @@ void CRpg::Precache( void ) 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->pszAmmo1 = "rocket"; + p->iMaxAmmo1 = ROCKETL_MAX_CARRY; + p->pszAmmo2 = "heli-rockets"; + p->iMaxAmmo2 = HELIROCKET_MAX_CARRY; + p->iMaxClip = ROCKETL_MAX_CLIP; p->iSlot = 3; - p->iPosition = 0; - p->iId = m_iId = WEAPON_RPG; + p->iPosition = 1; + p->iId = m_iId = WEAPON_ROCKETL; p->iFlags = 0; - p->iWeight = RPG_WEIGHT; + p->iWeight = ROCKETL_WEIGHT; return 1; } @@ -396,10 +386,10 @@ BOOL CRpg::Deploy() { if( m_iClip == 0 ) { - return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW_UL, "rpg" ); + return DefaultDeploy( "models/vmodels/v_rocketl.mdl", "models/pmodels/p_rocketl.mdl", RPG_DRAW_UL, "egon" ); } - return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW1, "rpg" ); + return DefaultDeploy( "models/vmodels/v_rocketl.mdl", "models/pmodels/p_rocketl.mdl", RPG_DRAW1, "egon" ); } BOOL CRpg::CanHolster( void ) @@ -417,6 +407,8 @@ void CRpg::Holster( int skiplocal /* = 0 */ ) { m_fInReload = FALSE;// cancel any reload in progress. + rocket_load = 0; + m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; SendWeaponAnim( RPG_HOLSTER1 ); @@ -469,23 +461,74 @@ void CRpg::PrimaryAttack() else { PlayEmptySound(); - m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2; + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; } UpdateSpot(); } void CRpg::SecondaryAttack() { - m_fSpotActive = !m_fSpotActive; + if( g_pGameRules->IsRocketArena() == 0 ) + { + m_fSpotActive = !m_fSpotActive; #ifndef CLIENT_DLL - if( !m_fSpotActive && m_pSpot ) - { - m_pSpot->Killed( NULL, GIB_NORMAL ); - m_pSpot = NULL; - } + if( !m_fSpotActive && m_pSpot ) + { + m_pSpot->Killed( NULL, GIB_NORMAL ); + m_pSpot = NULL; + } #endif - m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.2; + m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.2; + } + else + { + if( m_pPlayer->m_rgAmmo[m_iSecondaryAmmoType] ) + { + ++rocket_load; + if( rocket_load < 4 ) + { + EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/rocketload.wav", 0.9, ATTN_NORM ); + m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0; + } + else + { + EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_BODY, "weapons/rocketalert.wav", 0.9, ATTN_NORM ); + + m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME; + m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH; + + SendWeaponAnim( RPG_FIRE2 ); + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + UTIL_MakeVectors( m_pPlayer->pev->v_angle ); + + Vector vecSrc1 = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * -8 + gpGlobals->v_up * -8; + Vector vecSrc2 = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 0 + gpGlobals->v_up * -8; + Vector vecSrc3 = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -8; + + CRpgRocket *pRocket = CRpgRocket::CreateRpgRocket( vecSrc1, m_pPlayer->pev->v_angle, m_pPlayer, this ); + CRpgRocket::CreateRpgRocket( vecSrc2, m_pPlayer->pev->v_angle, m_pPlayer, this ); + CRpgRocket::CreateRpgRocket( vecSrc3, m_pPlayer->pev->v_angle, m_pPlayer, this ); + + UTIL_MakeVectors( m_pPlayer->pev->v_angle ); + pRocket->pev->velocity = pRocket->pev->velocity + gpGlobals->v_forward * DotProduct( m_pPlayer->pev->velocity, gpGlobals->v_forward ); + + 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_pPlayer->m_rgAmmo[m_iSecondaryAmmoType]--; + + rocket_load = 0; + + m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.5; + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5; + m_pPlayer->pev->punchangle.x -= 5; + } + } + } } void CRpg::WeaponIdle( void ) @@ -555,32 +598,21 @@ class CRpgAmmo : public CBasePlayerAmmo void Spawn( void ) { Precache(); - SET_MODEL( ENT( pev ), "models/w_rpgammo.mdl" ); + SET_MODEL( ENT( pev ), "models/ammo/w_rocketl.mdl" ); CBasePlayerAmmo::Spawn(); } void Precache( void ) { - PRECACHE_MODEL( "models/w_rpgammo.mdl" ); + PRECACHE_MODEL( "models/ammo/w_rocketl.mdl" ); PRECACHE_SOUND( "items/9mmclip1.wav" ); } BOOL AddAmmo( CBaseEntity *pOther ) { int iGive; -#ifdef 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 ) + iGive = AMMO_ROCKET_GIVE; + + if( pOther->GiveAmmo( iGive, "rocket", ROCKETL_MAX_CARRY ) != -1 ) { EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM ); return TRUE; @@ -589,5 +621,31 @@ class CRpgAmmo : public CBasePlayerAmmo } }; -LINK_ENTITY_TO_CLASS( ammo_rpgclip, CRpgAmmo ) +LINK_ENTITY_TO_CLASS( ammo_rocket, CRpgAmmo ) + +class CHeliRocketAmmo : public CBasePlayerAmmo +{ + void Spawn( void ) + { + Precache(); + SET_MODEL( ENT( pev ), "models/ammo/w_rocketl.mdl" ); + CBasePlayerAmmo::Spawn(); + } + void Precache( void ) + { + PRECACHE_MODEL( "models/ammo/w_rocketl.mdl" ); + PRECACHE_SOUND( "items/9mmclip1.wav" ); + } + BOOL AddAmmo( CBaseEntity *pOther ) + { + if( pOther->GiveAmmo( HELIROCKET_MAX_CARRY, "heli-rockets", HELIROCKET_MAX_CARRY ) != -1 ) + { + EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM ); + return TRUE; + } + return FALSE; + } +}; + +LINK_ENTITY_TO_CLASS( ammo_helirockets, CHeliRocketAmmo ) #endif diff --git a/dlls/weapons.cpp b/dlls/weapons.cpp index ffea572c..a96fb838 100644 --- a/dlls/weapons.cpp +++ b/dlls/weapons.cpp @@ -1627,7 +1627,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 ), @@ -1643,7 +1643,7 @@ TYPEDESCRIPTION CRpgRocket::m_SaveData[] = }; IMPLEMENT_SAVERESTORE( CRpgRocket, CGrenade ) - +/* TYPEDESCRIPTION CShotgun::m_SaveData[] = { DEFINE_FIELD( CShotgun, m_flNextReload, FIELD_TIME ), diff --git a/dlls/weapons.h b/dlls/weapons.h index 9fd25c52..99de4e9d 100644 --- a/dlls/weapons.h +++ b/dlls/weapons.h @@ -700,7 +700,7 @@ private: unsigned short m_usDoubleFire; unsigned short m_usSingleFire; }; - +*/ class CLaserSpot : public CBaseEntity { void Spawn( void ); @@ -775,7 +775,7 @@ public: float m_flIgniteTime; CRpg *m_pLauncher;// pointer back to the launcher that fired me. }; - +/* class CGauss : public CBasePlayerWeapon { public: