Initial Mapbase commit (squashed from mapbase-beta)

This commit is contained in:
Blixibon
2019-08-31 19:28:20 +00:00
parent 0d8dceea43
commit 3d464bc051
816 changed files with 105527 additions and 957 deletions
+256
View File
@@ -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