485 lines
12 KiB
C++
485 lines
12 KiB
C++
#include "cbase.h"
|
|
#include "asw_pickup_weapon.h"
|
|
#include "gamerules.h"
|
|
#include "items.h"
|
|
#include "ammodef.h"
|
|
#include "asw_player.h"
|
|
#include "asw_marine.h"
|
|
#include "asw_weapon.h"
|
|
#include "cvisibilitymonitor.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon, DT_ASW_Pickup_Weapon)
|
|
SendPropInt (SENDINFO(m_iBulletsInGun), 16 ),
|
|
SendPropInt (SENDINFO(m_iClips), 10 ),
|
|
SendPropInt (SENDINFO(m_iSecondary), 10 ),
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon )
|
|
DEFINE_KEYFIELD( m_iBulletsInGun, FIELD_INTEGER, "BulletsInGun"),
|
|
DEFINE_KEYFIELD( m_iClips, FIELD_INTEGER, "Clips"),
|
|
DEFINE_KEYFIELD( m_iSecondary, FIELD_INTEGER, "SecondaryBullets"),
|
|
END_DATADESC()
|
|
|
|
//---------------------------------------------------------
|
|
// Callback for the visibility monitor.
|
|
//---------------------------------------------------------
|
|
bool CASW_Pickup_Weapon::VismonCallback( CBaseEntity *pPickup, CBasePlayer *pViewingPlayer )
|
|
{
|
|
CASW_Pickup_Weapon *pPickupPtr = dynamic_cast < CASW_Pickup_Weapon* >( pPickup );
|
|
|
|
if ( !pPickupPtr )
|
|
return true;
|
|
|
|
IGameEvent * event = gameeventmanager->CreateEvent( "entity_visible" );
|
|
if ( event )
|
|
{
|
|
event->SetInt( "userid", pViewingPlayer->GetUserID() );
|
|
event->SetInt( "subject", pPickupPtr->entindex() );
|
|
event->SetString( "classname", pPickupPtr->GetWeaponClass() );
|
|
event->SetString( "entityname", STRING( pPickupPtr->GetEntityName() ) );
|
|
gameeventmanager->FireEvent( event );
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
void CASW_Pickup_Weapon::Spawn( void )
|
|
{
|
|
BaseClass::Spawn();
|
|
|
|
VisibilityMonitor_AddEntity( this, asw_visrange_generic.GetFloat() * 0.9f, &CASW_Pickup_Weapon::VismonCallback, NULL );
|
|
}
|
|
|
|
//---------------------
|
|
// Weapon pickup class
|
|
//---------------------
|
|
|
|
// init a pickup created from a weapon carried by the marine
|
|
void CASW_Pickup_Weapon::InitFrom(CASW_Marine* pMarine, CASW_Weapon* pWeapon)
|
|
{
|
|
if (!pWeapon)
|
|
return;
|
|
|
|
int iAmmoIndex = pWeapon->GetPrimaryAmmoType();
|
|
int bullets_on_player = pMarine->GetAmmoCount(iAmmoIndex);
|
|
// fill in the properties of the pickup
|
|
m_iBulletsInGun = pWeapon->Clip1();
|
|
m_iClips = bullets_on_player / pWeapon->GetMaxClip1();
|
|
m_iSecondary = pWeapon->Clip2();
|
|
|
|
if (pMarine->GetNumberOfWeaponsUsingAmmo(iAmmoIndex) > 1)
|
|
{
|
|
// need to leave at least X clips with the marine, since he has a gun using this ammo
|
|
int iMax = GetAmmoDef()->MaxCarry(iAmmoIndex, pMarine);
|
|
int iKeep = MAX(0, (bullets_on_player - iMax));
|
|
m_iClips = iKeep / pWeapon->GetMaxClip1();
|
|
}
|
|
}
|
|
|
|
// init a weapon given to a marine from this pickup
|
|
void CASW_Pickup_Weapon::InitWeapon(CASW_Marine* pMarine, CASW_Weapon* pWeapon)
|
|
{
|
|
if (!pMarine || !pWeapon)
|
|
return;
|
|
|
|
// set the amount of bullets in the gun
|
|
pWeapon->SetClip1( GetNumBulletsInGun() );
|
|
// set secondary bullets in the gun
|
|
pWeapon->SetClip2( GetSecondary() );
|
|
|
|
// equip the weapon
|
|
pMarine->Weapon_Equip_In_Index( pWeapon, pMarine->GetWeaponPositionForPickup(GetWeaponClass()) );
|
|
// set the number of clips
|
|
if (pWeapon->GetPrimaryAmmoType()!=-1)
|
|
pMarine->GiveAmmo(GetNumClips() * pWeapon->GetMaxClip1(), pWeapon->GetPrimaryAmmoType());
|
|
}
|
|
|
|
// player has used this item
|
|
void CASW_Pickup_Weapon::ActivateUseIcon( CASW_Marine* pMarine, int nHoldType )
|
|
{
|
|
if ( nHoldType == ASW_USE_HOLD_START )
|
|
return;
|
|
|
|
//if (UseIconType==USE_ICON_TAKE)
|
|
{
|
|
if (pMarine->TakeWeaponPickup(this))
|
|
{
|
|
// destroy self
|
|
}
|
|
else
|
|
{
|
|
//todo: print a message about why he couldn't take it
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------
|
|
// Assault Rifle
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Rifle, DT_ASW_Pickup_Weapon_Rifle)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Rifle )
|
|
END_DATADESC()
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_rifle, CASW_Pickup_Weapon_Rifle);
|
|
|
|
void CASW_Pickup_Weapon_Rifle::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/assaultrifle/assaultrifle.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Rifle::Precache( void )
|
|
{
|
|
PrecacheModel ("models/weapons/assaultrifle/assaultrifle.mdl");
|
|
}
|
|
|
|
//---------------------
|
|
// Prototype Rifle
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_PRifle, DT_ASW_Pickup_Weapon_PRifle)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_PRifle )
|
|
END_DATADESC()
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_prifle, CASW_Pickup_Weapon_PRifle);
|
|
|
|
void CASW_Pickup_Weapon_PRifle::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/Prototype/prototyperifle.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_PRifle::Precache( void )
|
|
{
|
|
PrecacheModel ("models/weapons/Prototype/prototyperifle.mdl");
|
|
}
|
|
|
|
//---------------------
|
|
// Autogun
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Autogun, DT_ASW_Pickup_Weapon_Autogun)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Autogun )
|
|
END_DATADESC()
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_autogun, CASW_Pickup_Weapon_Autogun);
|
|
|
|
void CASW_Pickup_Weapon_Autogun::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/autogun/autogun.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Autogun::Precache( void )
|
|
{
|
|
PrecacheModel ("models/weapons/autogun/autogun.mdl");
|
|
}
|
|
|
|
//---------------------
|
|
// Shotgun
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Shotgun, DT_ASW_Pickup_Weapon_Shotgun)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Shotgun )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_Shotgun::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/Shotgun/Shotgun.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Shotgun::Precache( void )
|
|
{
|
|
PrecacheModel ("models/weapons/Shotgun/Shotgun.mdl");
|
|
}
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_shotgun, CASW_Pickup_Weapon_Shotgun);
|
|
|
|
//---------------------
|
|
// Vindicator (Assault Shotgun)
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Assault_Shotgun, DT_ASW_Pickup_Weapon_Assault_Shotgun)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Assault_Shotgun )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_Assault_Shotgun::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/vindicator/vindicator.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Assault_Shotgun::Precache( void )
|
|
{
|
|
PrecacheModel ("models/weapons/vindicator/vindicator.mdl");
|
|
}
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_vindicator, CASW_Pickup_Weapon_Assault_Shotgun);
|
|
|
|
//---------------------
|
|
// Flamer
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Flamer, DT_ASW_Pickup_Weapon_Flamer)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Flamer )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_Flamer::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/flamethrower/flamethrower.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Flamer::Precache( void )
|
|
{
|
|
PrecacheModel ("models/weapons/flamethrower/flamethrower.mdl");
|
|
}
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_flamer, CASW_Pickup_Weapon_Flamer);
|
|
|
|
//---------------------
|
|
// Railgun
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Railgun, DT_ASW_Pickup_Weapon_Railgun)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Railgun )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_Railgun::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/Railgun/Railgun.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Railgun::Precache( void )
|
|
{
|
|
PrecacheModel ("models/weapons/Railgun/Railgun.mdl");
|
|
}
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_railgun, CASW_Pickup_Weapon_Railgun);
|
|
|
|
//---------------------
|
|
// Ricochet
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Ricochet, DT_ASW_Pickup_Weapon_Ricochet)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Ricochet )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_Ricochet::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/swarm/Railgun/Railgun.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Ricochet::Precache( void )
|
|
{
|
|
PrecacheModel ("models/swarm/Railgun/Railgun.mdl");
|
|
}
|
|
|
|
//LINK_ENTITY_TO_CLASS(asw_pickup_ricochet, CASW_Pickup_Weapon_Ricochet);
|
|
|
|
//---------------------
|
|
// Rocket
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Flechette, DT_ASW_Pickup_Weapon_Flechette)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Flechette )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_Flechette::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/swarm/Railgun/Railgun.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Flechette::Precache( void )
|
|
{
|
|
PrecacheModel ("models/swarm/Railgun/Railgun.mdl");
|
|
}
|
|
|
|
//LINK_ENTITY_TO_CLASS(asw_pickup_flechette, CASW_Pickup_Weapon_Flechette);
|
|
|
|
//---------------------
|
|
// Fire Extinguisher
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_FireExtinguisher, DT_ASW_Pickup_Weapon_FireExtinguisher)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_FireExtinguisher )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_FireExtinguisher::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/swarm/FireExt/fireextpickup.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_FireExtinguisher::Precache( void )
|
|
{
|
|
PrecacheModel ("models/swarm/FireExt/fireextpickup.mdl");
|
|
}
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_fire_extinguisher, CASW_Pickup_Weapon_FireExtinguisher);
|
|
|
|
|
|
//---------------------
|
|
// Pistol
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Pistol, DT_ASW_Pickup_Weapon_Pistol)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Pistol )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_Pistol::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/pistol/Pistol.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Pistol::Precache( void )
|
|
{
|
|
PrecacheModel("models/weapons/pistol/Pistol.mdl");
|
|
}
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_pistol, CASW_Pickup_Weapon_Pistol);
|
|
|
|
|
|
//---------------------
|
|
// Mining Laser
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Mining_Laser, DT_ASW_Pickup_Weapon_Mining_Laser)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Mining_Laser )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_Mining_Laser::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/MiningLaser/MiningLaser.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Mining_Laser::Precache( void )
|
|
{
|
|
PrecacheModel ("models/weapons/MiningLaser/MiningLaser.mdl");
|
|
}
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_mining_laser, CASW_Pickup_Weapon_Mining_Laser);
|
|
|
|
//---------------------
|
|
// Chainsaw
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Chainsaw, DT_ASW_Pickup_Weapon_Chainsaw)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Chainsaw )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_Chainsaw::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/Chainsaw/Chainsaw.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Chainsaw::Precache( void )
|
|
{
|
|
PrecacheModel ("models/weapons/Chainsaw/Chainsaw.mdl");
|
|
}
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_chainsaw, CASW_Pickup_Weapon_Chainsaw);
|
|
|
|
//---------------------
|
|
// PDW
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_PDW, DT_ASW_Pickup_Weapon_PDW)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_PDW )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_PDW::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/weapons/pdw/pdw.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_PDW::Precache( void )
|
|
{
|
|
PrecacheModel ("models/weapons/pdw/pdw.mdl");
|
|
}
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_pdw, CASW_Pickup_Weapon_PDW);
|
|
PRECACHE_REGISTER(asw_pickup_pdw);
|
|
|
|
//---------------------
|
|
// Cluster Grenades
|
|
//---------------------
|
|
|
|
IMPLEMENT_SERVERCLASS_ST(CASW_Pickup_Weapon_Grenades, DT_ASW_Pickup_Weapon_Grenades)
|
|
END_SEND_TABLE()
|
|
|
|
BEGIN_DATADESC( CASW_Pickup_Weapon_Grenades )
|
|
END_DATADESC()
|
|
|
|
void CASW_Pickup_Weapon_Grenades::Spawn( void )
|
|
{
|
|
Precache( );
|
|
SetModel( "models/swarm/grenades/grenadebox.mdl");
|
|
BaseClass::Spawn( );
|
|
}
|
|
|
|
void CASW_Pickup_Weapon_Grenades::Precache( void )
|
|
{
|
|
PrecacheModel ("models/swarm/grenades/grenadebox.mdl");
|
|
}
|
|
|
|
LINK_ENTITY_TO_CLASS(asw_pickup_grenades, CASW_Pickup_Weapon_Grenades);
|
|
PRECACHE_REGISTER(asw_pickup_grenades);
|
|
|