You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
6.1 KiB
223 lines
6.1 KiB
#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); |
|
} |
|
*/ |
|
} |