mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-31 22:49:19 +00:00
upload "kind" alien swarm
This commit is contained in:
@@ -0,0 +1,223 @@
|
||||
#include "cbase.h"
|
||||
#include "props.h"
|
||||
#include "asw_firewall_piece.h"
|
||||
#include "asw_marine.h"
|
||||
#include "asw_alien.h"
|
||||
#include "asw_fire.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
LINK_ENTITY_TO_CLASS( asw_firewall_piece, CASW_Firewall_Piece );
|
||||
PRECACHE_REGISTER( asw_firewall_piece );
|
||||
//---------------------------------------------------------
|
||||
//
|
||||
//---------------------------------------------------------
|
||||
IMPLEMENT_SERVERCLASS_ST(CASW_Firewall_Piece, DT_ASW_Firewall_Piece)
|
||||
|
||||
END_SEND_TABLE()
|
||||
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Save/Restore
|
||||
//---------------------------------------------------------
|
||||
BEGIN_DATADESC( CASW_Firewall_Piece )
|
||||
DEFINE_THINKFUNC( FireThink ),
|
||||
DEFINE_ENTITYFUNC( FireTouch ),
|
||||
DEFINE_FIELD( m_iLeftFire, FIELD_INTEGER ),
|
||||
DEFINE_FIELD( m_iRightFire, FIELD_INTEGER ),
|
||||
DEFINE_FIELD( m_fSpawnTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( m_fFireDuration, FIELD_FLOAT ),
|
||||
END_DATADESC()
|
||||
|
||||
|
||||
CASW_Firewall_Piece::CASW_Firewall_Piece()
|
||||
{
|
||||
m_iLeftFire = 0;
|
||||
m_iRightFire = 0;
|
||||
m_fFireDuration = 30.0f;
|
||||
m_hCreatorWeapon = NULL;
|
||||
}
|
||||
|
||||
|
||||
CASW_Firewall_Piece::~CASW_Firewall_Piece()
|
||||
{
|
||||
m_hCreatorWeapon = NULL;
|
||||
}
|
||||
|
||||
#define ASW_FIREWALL_SPREAD_TIME 0.2f
|
||||
#define ASW_FIREWALL_SPACING 38.0f
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CASW_Firewall_Piece::Spawn( void )
|
||||
{
|
||||
Precache();
|
||||
|
||||
SetSolid( SOLID_BBOX );
|
||||
SetCollisionBounds( Vector(-12,-12,0), Vector(12,12,60));
|
||||
//SetCollisionGroup( COLLISION_GROUP_WEAPON );
|
||||
SetCollisionGroup( ASW_COLLISION_GROUP_PASSABLE );
|
||||
CollisionProp()->UseTriggerBounds( true, 16 );
|
||||
|
||||
|
||||
//SetCollisionGroup( ASW_COLLISION_GROUP_PASSABLE );
|
||||
AddSolidFlags( FSOLID_TRIGGER); // FSOLID_NOT_SOLID ||
|
||||
//SetMoveType( MOVETYPE_FLYGRAVITY );
|
||||
|
||||
//BaseClass::Spawn();
|
||||
|
||||
AddEFlags( EFL_NO_DISSOLVE | EFL_NO_MEGAPHYSCANNON_RAGDOLL | EFL_NO_PHYSCANNON_INTERACTION );
|
||||
AddEFlags( EFL_FORCE_CHECK_TRANSMIT );
|
||||
AddEffects( EF_NODRAW );
|
||||
|
||||
SetThink( &CASW_Firewall_Piece::FireThink );
|
||||
SetNextThink( gpGlobals->curtime + ASW_FIREWALL_SPREAD_TIME );
|
||||
m_fSpawnTime = gpGlobals->curtime;
|
||||
SetTouch( &CASW_Firewall_Piece::FireTouch );
|
||||
|
||||
// spawn our env fire
|
||||
//CFire *pFire = (CFire *)CreateEntityByName( "env_fire" );
|
||||
//pFire->SetAbsAngles( GetAbsAngles() );
|
||||
//UTIL_SetOrigin( pFire, GetAbsOrigin() );
|
||||
//pFire->Spawn();
|
||||
//pFire->SetAbsVelocity( vec3_origin );
|
||||
|
||||
trace_t tr;
|
||||
UTIL_TraceHull( GetAbsOrigin() + Vector( 0.0f,0.0f, 5.0f), GetAbsOrigin() + Vector( 0.0f, 0.0f, -100.0f ),
|
||||
Vector( -30.0f, -30.0f, 0.0f ), Vector( 30.0f, 30.0f, 30.0f ), MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr );
|
||||
|
||||
int nFlags = ( SF_FIRE_START_ON | SF_FIRE_SMOKELESS );
|
||||
|
||||
if ( m_iLeftFire <= 0 || m_iRightFire <= 0 )
|
||||
{
|
||||
nFlags |= SF_FIRE_NO_SOUND;
|
||||
}
|
||||
|
||||
FireSystem_StartFire(tr.endpos, 64, 4, m_fFireDuration, nFlags, GetOwnerEntity(), FIRE_WALL_MINE, GetAbsAngles().y, m_hCreatorWeapon );
|
||||
}
|
||||
|
||||
void CASW_Firewall_Piece::Precache()
|
||||
{
|
||||
BaseClass::Precache();
|
||||
}
|
||||
|
||||
|
||||
int CASW_Firewall_Piece::ShouldTransmit( const CCheckTransmitInfo *pInfo )
|
||||
{
|
||||
//return FL_EDICT_ALWAYS;
|
||||
return FL_EDICT_DONTSEND;
|
||||
}
|
||||
|
||||
int CASW_Firewall_Piece::UpdateTransmitState()
|
||||
{
|
||||
return SetTransmitState( FL_EDICT_FULLCHECK );
|
||||
}
|
||||
|
||||
void CASW_Firewall_Piece::FireThink( void )
|
||||
{
|
||||
//NDebugOverlay::Box( GetAbsOrigin(), CollisionProp()->OBBMins(), CollisionProp()->OBBMaxs(), 255, 0, 255, 64, 1.0f );
|
||||
|
||||
// check for spawning out fire to either side
|
||||
if (m_iLeftFire > 0 || m_iRightFire> 0)
|
||||
{
|
||||
if (gpGlobals->curtime - m_fSpawnTime >= ASW_FIREWALL_SPREAD_TIME)
|
||||
{
|
||||
if (m_iLeftFire > 0)
|
||||
{
|
||||
// spawn another firewall piece to the left
|
||||
CASW_Firewall_Piece* pFirewall = CreateAnotherPiece(false);
|
||||
if (pFirewall)
|
||||
{
|
||||
pFirewall->SetSideFire(m_iLeftFire-1, 0);
|
||||
}
|
||||
m_iLeftFire = 0;
|
||||
}
|
||||
if (m_iRightFire > 0)
|
||||
{
|
||||
// spawn another firewall piece to the right
|
||||
CASW_Firewall_Piece* pFirewall = CreateAnotherPiece(true);
|
||||
if (pFirewall)
|
||||
{
|
||||
pFirewall->SetSideFire(0, m_iRightFire-1);
|
||||
}
|
||||
m_iRightFire = 0;
|
||||
}
|
||||
}
|
||||
SetNextThink( gpGlobals->curtime + 0.001f );
|
||||
}
|
||||
else
|
||||
{
|
||||
// if we're done spawning all our children, remove ourself
|
||||
SetThink( &CASW_Firewall_Piece::SUB_Remove );
|
||||
SetNextThink( gpGlobals->curtime );
|
||||
}
|
||||
}
|
||||
|
||||
CASW_Firewall_Piece* CASW_Firewall_Piece::CreateAnotherPiece(bool bRight)
|
||||
{
|
||||
Vector offset;
|
||||
QAngle ang = GetAbsAngles();
|
||||
if (bRight)
|
||||
ang.y+=90;
|
||||
else
|
||||
ang.y-=90;
|
||||
AngleVectors(ang, &offset);
|
||||
offset *= ASW_FIREWALL_SPACING;
|
||||
Vector start = GetAbsOrigin() + Vector(0,0,20);
|
||||
Vector dest = start + offset;
|
||||
//todo: trace from abs to dest
|
||||
trace_t tr;
|
||||
UTIL_TraceLine(start, dest, MASK_SOLID, this, ASW_COLLISION_GROUP_IGNORE_NPCS, &tr);
|
||||
if (tr.fraction < 1.0f)
|
||||
{
|
||||
//Msg("firewall trace got %f startsolid=%d allsolid=%d\n", tr.fraction, tr.startsolid, tr.allsolid);
|
||||
//if (tr.m_pEnt)
|
||||
//Msg("firewall trace hit %s\n", tr.m_pEnt->GetClassname());
|
||||
return NULL;
|
||||
}
|
||||
//else if (tr.fraction < 1.0f)
|
||||
//dest = GetAbsOrigin() + (offset * tr.fraction);
|
||||
|
||||
CASW_Firewall_Piece* pFirewall = (CASW_Firewall_Piece *)CreateEntityByName( "asw_firewall_piece" );
|
||||
if (pFirewall)
|
||||
{
|
||||
pFirewall->SetAbsAngles( GetAbsAngles() );
|
||||
pFirewall->SetOwnerEntity(GetOwnerEntity());
|
||||
//if (GetOwnerEntity())
|
||||
//Msg("Creating another firewall piece with owner %s\n", GetOwnerEntity()->GetClassname());
|
||||
//UTIL_SetOrigin( pFirewall, GetAbsOrigin() + offset );
|
||||
pFirewall->SetAbsOrigin( dest - Vector(0,0,20) );
|
||||
pFirewall->SetDuration(m_fFireDuration);
|
||||
pFirewall->m_hCreatorWeapon = m_hCreatorWeapon;
|
||||
pFirewall->Spawn();
|
||||
pFirewall->SetAbsVelocity( vec3_origin );
|
||||
}
|
||||
else
|
||||
{
|
||||
//Msg("Failed to create firewall piece!");
|
||||
}
|
||||
|
||||
return pFirewall;
|
||||
}
|
||||
|
||||
// redundant now, just let the env_fires set people alight
|
||||
void CASW_Firewall_Piece::FireTouch(CBaseEntity* pOther)
|
||||
{
|
||||
/*
|
||||
//Msg("fire touched by %s\n", pOther->GetClassname());
|
||||
//todo: set other on fire
|
||||
CASW_Marine* pMarine = CASW_Marine::AsMarine( pOther );
|
||||
if (pMarine)
|
||||
{
|
||||
pMarine->Ignite(30.0f);
|
||||
//Msg("OUCH OUCH BURNING MARINE\n");
|
||||
}
|
||||
CASW_Alien* pAlien = dynamic_cast<CASW_Alien*>(pOther);
|
||||
if (pAlien)
|
||||
{
|
||||
pAlien->Ignite(30.0f);
|
||||
}
|
||||
*/
|
||||
}
|
||||
Reference in New Issue
Block a user