mirror of
https://github.com/celisej567/source-sdk-2013.git
synced 2026-09-23 20:09:45 +03:00
Initial Mapbase commit (squashed from mapbase-beta)
This commit is contained in:
@@ -54,7 +54,11 @@ class CCrossbowBolt : public CBaseCombatCharacter
|
||||
DECLARE_CLASS( CCrossbowBolt, CBaseCombatCharacter );
|
||||
|
||||
public:
|
||||
#ifdef MAPBASE
|
||||
CCrossbowBolt();
|
||||
#else
|
||||
CCrossbowBolt() { };
|
||||
#endif
|
||||
~CCrossbowBolt();
|
||||
|
||||
Class_T Classify( void ) { return CLASS_NONE; }
|
||||
@@ -66,7 +70,16 @@ public:
|
||||
void BoltTouch( CBaseEntity *pOther );
|
||||
bool CreateVPhysics( void );
|
||||
unsigned int PhysicsSolidMaskForEntity() const;
|
||||
#ifdef MAPBASE
|
||||
static CCrossbowBolt *BoltCreate( const Vector &vecOrigin, const QAngle &angAngles, CBaseCombatCharacter *pentOwner = NULL );
|
||||
|
||||
void InputSetDamage( inputdata_t &inputdata );
|
||||
float m_flDamage;
|
||||
|
||||
virtual void SetDamage(float flDamage) { m_flDamage = flDamage; }
|
||||
#else
|
||||
static CCrossbowBolt *BoltCreate( const Vector &vecOrigin, const QAngle &angAngles, CBasePlayer *pentOwner = NULL );
|
||||
#endif
|
||||
|
||||
protected:
|
||||
|
||||
@@ -89,12 +102,23 @@ BEGIN_DATADESC( CCrossbowBolt )
|
||||
DEFINE_FIELD( m_pGlowSprite, FIELD_EHANDLE ),
|
||||
//DEFINE_FIELD( m_pGlowTrail, FIELD_EHANDLE ),
|
||||
|
||||
#ifdef MAPBASE
|
||||
DEFINE_KEYFIELD( m_flDamage, FIELD_FLOAT, "Damage" ),
|
||||
|
||||
// Inputs
|
||||
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetDamage", InputSetDamage ),
|
||||
#endif
|
||||
|
||||
END_DATADESC()
|
||||
|
||||
IMPLEMENT_SERVERCLASS_ST( CCrossbowBolt, DT_CrossbowBolt )
|
||||
END_SEND_TABLE()
|
||||
|
||||
#ifdef MAPBASE
|
||||
CCrossbowBolt *CCrossbowBolt::BoltCreate( const Vector &vecOrigin, const QAngle &angAngles, CBaseCombatCharacter *pentOwner )
|
||||
#else
|
||||
CCrossbowBolt *CCrossbowBolt::BoltCreate( const Vector &vecOrigin, const QAngle &angAngles, CBasePlayer *pentOwner )
|
||||
#endif
|
||||
{
|
||||
// Create a new entity with CCrossbowBolt private data
|
||||
CCrossbowBolt *pBolt = (CCrossbowBolt *)CreateEntityByName( "crossbow_bolt" );
|
||||
@@ -102,10 +126,27 @@ CCrossbowBolt *CCrossbowBolt::BoltCreate( const Vector &vecOrigin, const QAngle
|
||||
pBolt->SetAbsAngles( angAngles );
|
||||
pBolt->Spawn();
|
||||
pBolt->SetOwnerEntity( pentOwner );
|
||||
#ifdef MAPBASE
|
||||
if (pentOwner && pentOwner->IsNPC())
|
||||
pBolt->m_flDamage = sk_npc_dmg_crossbow.GetFloat();
|
||||
//else
|
||||
// pBolt->m_flDamage = sk_plr_dmg_crossbow.GetFloat();
|
||||
#endif
|
||||
|
||||
return pBolt;
|
||||
}
|
||||
|
||||
#ifdef MAPBASE
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
CCrossbowBolt::CCrossbowBolt( void )
|
||||
{
|
||||
// Independent bolts without m_flDamage set need damage
|
||||
m_flDamage = sk_plr_dmg_crossbow.GetFloat();
|
||||
}
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -194,6 +235,16 @@ void CCrossbowBolt::Precache( void )
|
||||
PrecacheModel( "sprites/light_glow02_noz.vmt" );
|
||||
}
|
||||
|
||||
#ifdef MAPBASE
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CCrossbowBolt::InputSetDamage( inputdata_t &inputdata )
|
||||
{
|
||||
m_flDamage = inputdata.value.Float();
|
||||
}
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
void CCrossbowBolt::BoltTouch( CBaseEntity *pOther )
|
||||
@@ -201,7 +252,19 @@ void CCrossbowBolt::BoltTouch( CBaseEntity *pOther )
|
||||
if ( pOther->IsSolidFlagSet(FSOLID_VOLUME_CONTENTS | FSOLID_TRIGGER) )
|
||||
{
|
||||
// Some NPCs are triggers that can take damage (like antlion grubs). We should hit them.
|
||||
#ifdef MAPBASE
|
||||
// But some physics objects that are also triggers (like weapons) shouldn't go through this check.
|
||||
//
|
||||
// Note: rpg_missile has the same code, except it properly accounts for weapons in a different way.
|
||||
// This was discovered after I implemented this and both work fine, but if this ever causes problems,
|
||||
// use rpg_missile's implementation:
|
||||
//
|
||||
// if ( pOther->IsSolidFlagSet(FSOLID_TRIGGER|FSOLID_VOLUME_CONTENTS) && pOther->GetCollisionGroup() != COLLISION_GROUP_WEAPON )
|
||||
//
|
||||
if ( pOther->GetMoveType() == MOVETYPE_NONE && (( pOther->m_takedamage == DAMAGE_NO ) || ( pOther->m_takedamage == DAMAGE_EVENTS_ONLY )) )
|
||||
#else
|
||||
if ( ( pOther->m_takedamage == DAMAGE_NO ) || ( pOther->m_takedamage == DAMAGE_EVENTS_ONLY ) )
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -228,7 +291,11 @@ void CCrossbowBolt::BoltTouch( CBaseEntity *pOther )
|
||||
|
||||
if( GetOwnerEntity() && GetOwnerEntity()->IsPlayer() && pOther->IsNPC() )
|
||||
{
|
||||
#ifdef MAPBASE
|
||||
CTakeDamageInfo dmgInfo( this, GetOwnerEntity(), m_flDamage, DMG_NEVERGIB );
|
||||
#else
|
||||
CTakeDamageInfo dmgInfo( this, GetOwnerEntity(), sk_plr_dmg_crossbow.GetFloat(), DMG_NEVERGIB );
|
||||
#endif
|
||||
dmgInfo.AdjustPlayerDamageInflictedForSkillLevel();
|
||||
CalculateMeleeDamageForce( &dmgInfo, vecNormalizedVel, tr.endpos, 0.7f );
|
||||
dmgInfo.SetDamagePosition( tr.endpos );
|
||||
@@ -243,7 +310,11 @@ void CCrossbowBolt::BoltTouch( CBaseEntity *pOther )
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef MAPBASE
|
||||
CTakeDamageInfo dmgInfo( this, GetOwnerEntity(), m_flDamage, DMG_BULLET | DMG_NEVERGIB );
|
||||
#else
|
||||
CTakeDamageInfo dmgInfo( this, GetOwnerEntity(), sk_plr_dmg_crossbow.GetFloat(), DMG_BULLET | DMG_NEVERGIB );
|
||||
#endif
|
||||
CalculateMeleeDamageForce( &dmgInfo, vecNormalizedVel, tr.endpos, 0.7f );
|
||||
dmgInfo.SetDamagePosition( tr.endpos );
|
||||
pOther->DispatchTraceAttack( dmgInfo, vecNormalizedVel, &tr );
|
||||
@@ -434,17 +505,48 @@ public:
|
||||
virtual void Drop( const Vector &vecVelocity );
|
||||
virtual bool Holster( CBaseCombatWeapon *pSwitchingTo = NULL );
|
||||
virtual bool Reload( void );
|
||||
#ifdef MAPBASE
|
||||
virtual void Reload_NPC( void );
|
||||
#endif
|
||||
virtual void ItemPostFrame( void );
|
||||
virtual void ItemBusyFrame( void );
|
||||
virtual void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator );
|
||||
#ifdef MAPBASE
|
||||
virtual void Operator_ForceNPCFire( CBaseCombatCharacter *pOperator, bool bSecondary );
|
||||
#endif
|
||||
virtual bool SendWeaponAnim( int iActivity );
|
||||
virtual bool IsWeaponZoomed() { return m_bInZoom; }
|
||||
|
||||
bool ShouldDisplayHUDHint() { return true; }
|
||||
|
||||
#ifdef MAPBASE
|
||||
int CapabilitiesGet( void ) { return bits_CAP_WEAPON_RANGE_ATTACK1; }
|
||||
|
||||
virtual int GetMinBurst() { return 1; }
|
||||
virtual int GetMaxBurst() { return 1; }
|
||||
|
||||
virtual float GetMinRestTime( void ) { return 3.0f; } // 1.5f
|
||||
virtual float GetMaxRestTime( void ) { return 3.0f; } // 2.0f
|
||||
|
||||
virtual float GetFireRate( void ) { return 5.0f; }
|
||||
|
||||
virtual const Vector& GetBulletSpread( void )
|
||||
{
|
||||
static Vector cone = VECTOR_CONE_15DEGREES;
|
||||
if (!GetOwner() || !GetOwner()->IsNPC())
|
||||
return cone;
|
||||
|
||||
static Vector NPCCone = VECTOR_CONE_5DEGREES;
|
||||
|
||||
return NPCCone;
|
||||
}
|
||||
#endif
|
||||
|
||||
DECLARE_SERVERCLASS();
|
||||
DECLARE_DATADESC();
|
||||
#ifdef MAPBASE
|
||||
DECLARE_ACTTABLE();
|
||||
#endif
|
||||
|
||||
private:
|
||||
|
||||
@@ -452,6 +554,9 @@ private:
|
||||
void SetSkin( int skinNum );
|
||||
void CheckZoomToggle( void );
|
||||
void FireBolt( void );
|
||||
#ifdef MAPBASE
|
||||
void FireNPCBolt( CAI_BaseNPC *pOwner, Vector &vecShootOrigin, Vector &vecShootDir );
|
||||
#endif
|
||||
void ToggleZoom( void );
|
||||
|
||||
// Various states for the crossbow's charger
|
||||
@@ -494,6 +599,62 @@ BEGIN_DATADESC( CWeaponCrossbow )
|
||||
|
||||
END_DATADESC()
|
||||
|
||||
#ifdef MAPBASE
|
||||
acttable_t CWeaponCrossbow::m_acttable[] =
|
||||
{
|
||||
{ ACT_RANGE_ATTACK1, ACT_RANGE_ATTACK_SMG1, true },
|
||||
{ ACT_RELOAD, ACT_RELOAD_SMG1, true },
|
||||
{ ACT_IDLE, ACT_IDLE_SMG1, true },
|
||||
{ ACT_IDLE_ANGRY, ACT_IDLE_ANGRY_SMG1, true },
|
||||
|
||||
{ ACT_WALK, ACT_WALK_RIFLE, true },
|
||||
{ ACT_WALK_AIM, ACT_WALK_AIM_RIFLE, true },
|
||||
|
||||
// Readiness activities (not aiming)
|
||||
{ ACT_IDLE_RELAXED, ACT_IDLE_SMG1_RELAXED, false },//never aims
|
||||
{ ACT_IDLE_STIMULATED, ACT_IDLE_SMG1_STIMULATED, false },
|
||||
{ ACT_IDLE_AGITATED, ACT_IDLE_ANGRY_SMG1, false },//always aims
|
||||
|
||||
{ ACT_WALK_RELAXED, ACT_WALK_RIFLE_RELAXED, false },//never aims
|
||||
{ ACT_WALK_STIMULATED, ACT_WALK_RIFLE_STIMULATED, false },
|
||||
{ ACT_WALK_AGITATED, ACT_WALK_AIM_RIFLE, false },//always aims
|
||||
|
||||
{ ACT_RUN_RELAXED, ACT_RUN_RIFLE_RELAXED, false },//never aims
|
||||
{ ACT_RUN_STIMULATED, ACT_RUN_RIFLE_STIMULATED, false },
|
||||
{ ACT_RUN_AGITATED, ACT_RUN_AIM_RIFLE, false },//always aims
|
||||
|
||||
// Readiness activities (aiming)
|
||||
{ ACT_IDLE_AIM_RELAXED, ACT_IDLE_SMG1_RELAXED, false },//never aims
|
||||
{ ACT_IDLE_AIM_STIMULATED, ACT_IDLE_AIM_RIFLE_STIMULATED, false },
|
||||
{ ACT_IDLE_AIM_AGITATED, ACT_IDLE_ANGRY_SMG1, false },//always aims
|
||||
|
||||
{ ACT_WALK_AIM_RELAXED, ACT_WALK_RIFLE_RELAXED, false },//never aims
|
||||
{ ACT_WALK_AIM_STIMULATED, ACT_WALK_AIM_RIFLE_STIMULATED, false },
|
||||
{ ACT_WALK_AIM_AGITATED, ACT_WALK_AIM_RIFLE, false },//always aims
|
||||
|
||||
{ ACT_RUN_AIM_RELAXED, ACT_RUN_RIFLE_RELAXED, false },//never aims
|
||||
{ ACT_RUN_AIM_STIMULATED, ACT_RUN_AIM_RIFLE_STIMULATED, false },
|
||||
{ ACT_RUN_AIM_AGITATED, ACT_RUN_AIM_RIFLE, false },//always aims
|
||||
//End readiness activities
|
||||
|
||||
{ ACT_WALK_AIM, ACT_WALK_AIM_RIFLE, true },
|
||||
{ ACT_WALK_CROUCH, ACT_WALK_CROUCH_RIFLE, true },
|
||||
{ ACT_WALK_CROUCH_AIM, ACT_WALK_CROUCH_AIM_RIFLE, true },
|
||||
{ ACT_RUN, ACT_RUN_RIFLE, true },
|
||||
{ ACT_RUN_AIM, ACT_RUN_AIM_RIFLE, true },
|
||||
{ ACT_RUN_CROUCH, ACT_RUN_CROUCH_RIFLE, true },
|
||||
{ ACT_RUN_CROUCH_AIM, ACT_RUN_CROUCH_AIM_RIFLE, true },
|
||||
{ ACT_GESTURE_RANGE_ATTACK1, ACT_GESTURE_RANGE_ATTACK_SMG1, true },
|
||||
{ ACT_RANGE_ATTACK1_LOW, ACT_RANGE_ATTACK_SMG1_LOW, true },
|
||||
{ ACT_COVER_LOW, ACT_COVER_SMG1_LOW, false },
|
||||
{ ACT_RANGE_AIM_LOW, ACT_RANGE_AIM_SMG1_LOW, false },
|
||||
{ ACT_RELOAD_LOW, ACT_RELOAD_SMG1_LOW, false },
|
||||
{ ACT_GESTURE_RELOAD, ACT_GESTURE_RELOAD_SMG1, true },
|
||||
};
|
||||
|
||||
IMPLEMENT_ACTTABLE(CWeaponCrossbow);
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Constructor
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -504,6 +665,13 @@ CWeaponCrossbow::CWeaponCrossbow( void )
|
||||
m_bAltFiresUnderwater = true;
|
||||
m_bInZoom = false;
|
||||
m_bMustReload = false;
|
||||
|
||||
#ifdef MAPBASE
|
||||
m_fMinRange1 = 24;
|
||||
m_fMaxRange1 = 5000;
|
||||
m_fMinRange2 = 24;
|
||||
m_fMaxRange2 = 5000;
|
||||
#endif
|
||||
}
|
||||
|
||||
#define CROSSBOW_GLOW_SPRITE "sprites/light_glow02_noz.vmt"
|
||||
@@ -577,6 +745,18 @@ bool CWeaponCrossbow::Reload( void )
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef MAPBASE
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CWeaponCrossbow::Reload_NPC( void )
|
||||
{
|
||||
BaseClass::Reload_NPC();
|
||||
|
||||
m_nSkin = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -699,6 +879,44 @@ void CWeaponCrossbow::FireBolt( void )
|
||||
SetChargerState( CHARGER_STATE_DISCHARGE );
|
||||
}
|
||||
|
||||
#ifdef MAPBASE
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CWeaponCrossbow::FireNPCBolt( CAI_BaseNPC *pOwner, Vector &vecShootOrigin, Vector &vecShootDir )
|
||||
{
|
||||
Assert(pOwner);
|
||||
|
||||
QAngle angAiming;
|
||||
VectorAngles( vecShootDir, angAiming );
|
||||
|
||||
CCrossbowBolt *pBolt = CCrossbowBolt::BoltCreate( vecShootOrigin, angAiming, pOwner );
|
||||
|
||||
if ( pOwner->GetWaterLevel() == 3 )
|
||||
{
|
||||
pBolt->SetAbsVelocity( vecShootDir * BOLT_WATER_VELOCITY );
|
||||
}
|
||||
else
|
||||
{
|
||||
pBolt->SetAbsVelocity( vecShootDir * BOLT_AIR_VELOCITY );
|
||||
}
|
||||
|
||||
m_iClip1--;
|
||||
|
||||
m_nSkin = 1;
|
||||
|
||||
WeaponSound( SINGLE_NPC );
|
||||
WeaponSound( SPECIAL2 );
|
||||
|
||||
CSoundEnt::InsertSound( SOUND_COMBAT, GetAbsOrigin(), 200, 0.2 );
|
||||
|
||||
m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->curtime + 2.5f;
|
||||
|
||||
SetSkin( BOLT_SKIN_GLOW );
|
||||
SetChargerState( CHARGER_STATE_DISCHARGE );
|
||||
}
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
// Output : Returns true on success, false on failure.
|
||||
@@ -761,7 +979,11 @@ void CWeaponCrossbow::CreateChargerEffects( void )
|
||||
{
|
||||
CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
|
||||
|
||||
#ifdef MAPBASE
|
||||
if ( m_hChargerSprite != NULL || pOwner == NULL )
|
||||
#else
|
||||
if ( m_hChargerSprite != NULL )
|
||||
#endif
|
||||
return;
|
||||
|
||||
m_hChargerSprite = CSprite::SpriteCreate( CROSSBOW_GLOW_SPRITE, GetAbsOrigin(), false );
|
||||
@@ -933,12 +1155,46 @@ void CWeaponCrossbow::Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombat
|
||||
SetChargerState( CHARGER_STATE_READY );
|
||||
break;
|
||||
|
||||
#ifdef MAPBASE
|
||||
case EVENT_WEAPON_SMG1:
|
||||
{
|
||||
CAI_BaseNPC *pNPC = pOperator->MyNPCPointer();
|
||||
Assert(pNPC);
|
||||
|
||||
Vector vecSrc = pNPC->Weapon_ShootPosition();
|
||||
Vector vecAiming = pNPC->GetActualShootTrajectory( vecSrc );
|
||||
|
||||
FireNPCBolt( pNPC, vecSrc, vecAiming );
|
||||
//m_bMustReload = true;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
BaseClass::Operator_HandleAnimEvent( pEvent, pOperator );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MAPBASE
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CWeaponCrossbow::Operator_ForceNPCFire( CBaseCombatCharacter *pOperator, bool bSecondary )
|
||||
{
|
||||
// Ensure we have enough rounds in the clip
|
||||
m_iClip1++;
|
||||
|
||||
Vector vecShootOrigin, vecShootDir;
|
||||
QAngle angShootDir;
|
||||
GetAttachment( LookupAttachment( "muzzle" ), vecShootOrigin, angShootDir );
|
||||
AngleVectors( angShootDir, &vecShootDir );
|
||||
FireNPCBolt( pOperator->MyNPCPointer(), vecShootOrigin, vecShootDir );
|
||||
|
||||
//m_bMustReload = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Set the desired activity for the weapon and its viewmodel counterpart
|
||||
// Input : iActivity - activity to play
|
||||
|
||||
Reference in New Issue
Block a user