etqw-sdk/base/script/misc/auto_respawn.script
2008-05-29 00:00:00 +00:00

176 lines
3.6 KiB
Text

/*
auto_respawn.script
handles the automatic repawning of vehicles around bases
*/
object auto_respawn {
void preinit();
void init();
void destroy();
boolean SpawnVehicle();
boolean CheckSpawn();
void UpdateThread( float initialWait );
void vOnVehicleDestroyed();
void vOnUnDeploy();
void vOnDeploy();
void StartThread( float delay );
void StopThread();
void KillVehicle();
float updateThreadHandle;
entity vehicle;
float waitTime;
float delayTime;
boolean active;
float vehicleType;
float playerType;
}
void auto_respawn::preinit() {
waitTime = gameRules.GetFloatKeyWithSuffix( self, "wait_time", 0 );
delayTime = getFloatKeyWithDefault( "delay_time", 0.5 );
playerType = sys.getTypeHandle( "idPlayer" );
vehicleType = sys.getTypeHandle( "sdTransport" );
setGameTeam( sys.getTeam( getKey( "team" ) ) );
updateThreadHandle = -1;
active = getIntKeyWithDefault( "start_active", false );
setContents( CONTENTS_TRIGGER );
}
void auto_respawn::init() {
if ( active ) {
StartThread( delayTime );
}
}
void auto_respawn::KillVehicle() {
if ( vehicle != $null_entity ) {
if ( vehicle.getNumOccupiedPositions() <= 0 ) {
// get the distance away that it is
float distSquared = sys.vecLengthSquared( vehicle.getWorldOrigin() - getWorldOrigin() );
if ( distSquared < 102400 ) {
// less than ~10m away
vector up;
up_z = 1.f;
vehicle.setTakesDamage( true );
vehicle.setIconEnabled( false );
vehicle.applyDamage( $null_entity, $null_entity, up, GetDamage( "damage_magog_npc_collide" ), 10000.f, $null_entity );
}
}
}
}
void auto_respawn::destroy() {
KillVehicle();
}
void auto_respawn::UpdateThread( float initialWait ) {
sys.wait( initialWait );
while ( true ) {
if ( SpawnVehicle() ) {
break;
}
sys.waitFrame();
}
updateThreadHandle = -1;
}
boolean auto_respawn::SpawnVehicle() {
if ( CheckSpawn() ) {
vehicle = sys.spawn( getKey( "def_construction" ) );
vehicle.setGameTeam( getGameTeam() );
vehicle.setOrigin( getOrigin() );
vehicle.setAngles( getAngles() );
vehicle.vSetDeployer( self );
return true;
}
return false;
}
boolean auto_respawn::CheckSpawn() {
team_base team = getGameTeam();
if ( sys.getTime() < team.GetNextVehicleSpawnTime() ) {
return false;
}
if ( g_disableVehicleSpawns.getBoolValue() ) {
return false;
}
float count = entitiesInBounds( getMins(), getMaxs(), CONTENTS_VEHICLECLIP | CONTENTS_BODY | CONTENTS_SLIDEMOVER | CONTENTS_MONSTER | CONTENTS_SOLID, 0 );
float index;
entity other;
if ( count ) {
for( index = 0; index < count; index++ ) {
other = getBoundsCacheEntity( index );
if ( other == $null_entity ) {
continue;
}
if ( other.vBlockVehicleSpawn() ) {
return false;
}
}
}
return true;
}
void auto_respawn::vOnVehicleDestroyed() {
vehicle = $null_entity;
StopThread();
if ( active ) {
StartThread( waitTime );
}
}
void auto_respawn::StartThread( float delay ) {
if ( sys.isClient() ) {
return;
}
if ( vehicle != $null_entity ) {
return;
}
if ( updateThreadHandle == -1 ) {
updateThreadHandle = thread UpdateThread( delay );
}
}
void auto_respawn::StopThread() {
if ( updateThreadHandle != -1 ) {
sys.terminate( updateThreadHandle );
updateThreadHandle = -1;
}
}
void auto_respawn::vOnUnDeploy() {
active = false;
StopThread();
KillVehicle();
}
void auto_respawn::vOnDeploy() {
active = true;
StartThread( delayTime );
}