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

718 lines
17 KiB
Text

/*
===============================================================================
spawn_master.script
contains the spawn masters
===============================================================================
*/
object spawn_master {
void preinit();
void destroy();
void SetupCommandmapIcon();
void ClearCommandmapIcon();
void ClearCommandmapSelectedIcon();
void OnSpawnPointSelected( float isDefault );
void OnSpawnPointDeselected();
void OnGuiMessage( entity p );
void OnSetTeam( object oldTeam, object newTeam );
void OnHighlight( boolean set );
boolean CanSetSpawn() { return true; }
void DeployTeam( object team );
void UnDeployTeam( object team );
float commandmapIcon;
float commandmapSelectedIcon;
float commandmapHighlightIcon;
}
void spawn_master::preinit() {
commandmapIcon = -1;
commandmapSelectedIcon = -1;
commandmapHighlightIcon = -1;
}
void spawn_master::destroy() {
ClearCommandmapIcon();
ClearCommandmapSelectedIcon();
object team = getGameTeam();
if ( team != $null_entity ) {
team.unRegisterSpawnPoint( self );
}
if( commandmapHighlightIcon != -1 ) {
sys.freeCMIcon( self, commandmapHighlightIcon );
commandmapHighlightIcon = -1;
}
}
void spawn_master::OnSetTeam( object oldTeam, object newTeam ) {
if ( oldTeam != $null_entity ) {
oldTeam.unRegisterSpawnPoint( self );
}
UnDeployTeam( oldTeam );
DeployTeam( newTeam );
if ( newTeam == $null_entity ) {
ClearCommandmapIcon();
} else {
newTeam.registerSpawnPoint( self );
SetupCommandmapIcon();
}
}
void spawn_master::DeployTeam( object team ) {
if ( team == $null_entity ) {
return;
}
string teamName = team.getName();
string lastMatch;
entity targetEnt;
string targetPrefix = "target_" + teamName;
while ( true ) {
lastMatch = getNextKey( targetPrefix, lastMatch );
if ( lastMatch == "" ) {
break;
}
targetEnt = getEntityKey( lastMatch );
targetEnt.vOnDeploy();
}
}
void spawn_master::UnDeployTeam( object team ) {
if ( team == $null_entity ) {
return;
}
string teamName = team.getName();
string lastMatch;
entity targetEnt;
string targetPrefix = "target_" + teamName;
while ( true ) {
lastMatch = getNextKey( targetPrefix, lastMatch );
if ( lastMatch == "" ) {
break;
}
targetEnt = getEntityKey( lastMatch );
targetEnt.vOnUnDeploy();
}
}
void spawn_master::SetupCommandmapIcon() {
ClearCommandmapIcon();
object team = getGameTeam();
if ( team == $null_entity ) {
return;
}
commandmapIcon = sys.allocCMIcon( self, getFloatKey( "icon_sort_cm" ) );
sys.setCMIconMaterial( commandmapIcon, GetMaterial( getKey( "mtr_icon_" + team.getName() ) ) );
sys.setCMIconFlag( commandmapIcon, CMF_TEAMONLY );
sys.setCMIconFlag( commandmapIcon, CMF_ALWAYSKNOWN );
sys.setCMIconFlag( commandmapIcon, CMF_ONLYSHOWONFULLVIEW );
//sys.setCMIconColorMode( commandmapIcon, CM_ALLEGIANCE );
sys.setCMIconSize( commandmapIcon, getFloatKey( "icon_size_cm" ) );
sys.setCMIconGuiMessage( commandmapIcon, "selectspawn" );
}
void spawn_master::OnGuiMessage( entity p ) {
if ( getEntityAllegiance( p ) != TA_FRIEND ) {
return;
}
string message = sys.argv( 0 );
if ( message == "selectspawn" ) {
if ( !CanSetSpawn() ) {
return;
}
p.setSpawnPoint( self );
if ( p.isLocalPlayer() ) {
sys.startSoundDirect( getKey( "snd_selected" ), SND_STRUCTURE_ALARM );
}
}
}
void spawn_master::ClearCommandmapIcon() {
if ( commandmapIcon != -1 ) {
sys.freeCMIcon( self, commandmapIcon );
commandmapIcon = -1;
}
}
void spawn_master::ClearCommandmapSelectedIcon() {
if ( commandmapSelectedIcon != -1 ) {
sys.freeCMIcon( self, commandmapSelectedIcon );
commandmapSelectedIcon = -1;
}
}
void spawn_master::OnSpawnPointSelected( float isDefault ) {
ClearCommandmapSelectedIcon();
commandmapSelectedIcon = sys.allocCMIcon( self, getFloatKey( "icon_sort_selected_cm" ) );
if ( isDefault ) {
sys.setCMIconMaterial( commandmapSelectedIcon, GetMaterial( getKey( "mtr_icon_default" ) ) );
} else {
sys.setCMIconMaterial( commandmapSelectedIcon, GetMaterial( getKey( "mtr_icon_selected" ) ) );
}
sys.setCMIconFlag( commandmapSelectedIcon, CMF_ONLYSHOWONFULLVIEW );
sys.setCMIconFlag( commandmapSelectedIcon, CMF_ALWAYSKNOWN );
sys.setCMIconSize( commandmapSelectedIcon, getFloatKey( "icon_size_cm" ) );
}
void spawn_master::OnSpawnPointDeselected() {
ClearCommandmapSelectedIcon();
}
void spawn_master::OnHighlight( boolean set ) {
vector color;
color_x = 1;
color_y = 1;
color_z = 1;
if( commandmapHighlightIcon == -1 && set ) {
commandmapHighlightIcon = sys.allocCMIcon( self, getFloatKey( "icon_sort_cm" ) );
sys.setCMIconFlag( commandmapHighlightIcon, CMF_ONLYSHOWONFULLVIEW );
sys.setCMIconDrawMode( commandmapHighlightIcon, DM_CROSSHAIR );
sys.setCMIconColor( commandmapHighlightIcon, color, 0.5 );
sys.setCMIconMaterial( commandmapHighlightIcon, GetMaterial( getKey( "mtr_commandmapicon_tracking" ) ) );
return;
}
if( !set && commandmapHighlightIcon != -1 ) {
sys.freeCMIcon( self, commandmapHighlightIcon );
commandmapHighlightIcon = -1;
}
}
object spawn_host {
void preinit();
void init();
void destroy();
void syncFields();
void RemoveThread( float removeTime );
void Fizzle();
void Idle();
void vSetOwner( entity o );
float GetActivateCode( entity p, float distance );
boolean CanSetSpawn();
void FreeSelectTask();
void MakeSelectTask();
void CheckContextToolTip( float allegiance, float code, entity p );
void SetupCommandmapIcon();
void ClearCommandmapIcon();
// game callbacks
float OnUpdateCrosshairInfo( entity p );
float OnActivate( entity p, float distance );
void OnPlayerSpawned( entity p );
void OnKilled( entity inflictor, entity attacker, float damage, vector direction, float location );
void OnSpawnPointActivate( entity p );
void OnSpawnPointDeactivate( entity p );
void OnSpawnPointSelected( float isDefault );
void OnSpawnPointDeselected();
void OnTimeStartedChanged();
void OnSpawnerChanged();
void vOnLocalTeamChanged();
void UpdateVisualState();
string vGetQuickChatString( entity p );
void vOnContextDestroy( entity p );
void vSetBody( entity body );
void InitDestroyTask();
void FreeDestroyTask();
void CreatedVOThread();
entity owner;
float usedProficiency;
entity spawner;
boolean selectedModel;
entity originalBody;
boolean expired;
task selectTask;
float timeStarted;
float toolTip_gdf_1;
float toolTip_gdf_2;
float toolTip_strogg_use;
float toolTip_strogg_destroyed;
float toolTip_strogg_select;
float toolTip_strogg_already_selected_1;
float toolTip_strogg_already_selected_2;
float lastTooltipTime;
float commandmapIcon;
task destroyTask;
boolean spawnerLocal;
}
void spawn_host::preinit() {
usedProficiency = GetProficiency( getKey( "prof_used" ) );
timeStarted = -1;
commandmapIcon = -1;
toolTip_gdf_1 = GetToolTip( getKey( "tt_intro_gdf_1" ) );
toolTip_gdf_2 = GetToolTip( getKey( "tt_intro_gdf_2" ) );
toolTip_strogg_use = GetToolTip( getKey( "tt_intro_strogg_use" ) );
toolTip_strogg_destroyed = GetToolTip( getKey( "tt_strogg_destroyed" ) );
toolTip_strogg_select = GetToolTip( getKey( "tt_strogg_select" ) );
toolTip_strogg_already_selected_1 = GetToolTip( getKey( "tt_strogg_already_selected_1" ) );
toolTip_strogg_already_selected_2 = GetToolTip( getKey( "tt_strogg_already_selected_2" ) );
thread CreatedVOThread();
}
void spawn_host::init() {
if ( !sys.isClient() ) {
owner.setPlayerSpawnHostState( self, false );
if ( originalBody != $null_entity ) {
originalBody.vCancel();
}
}
if ( !sys.isClient() ) {
timeStarted = sys.getTime();
setState( "Idle" );
}
}
void spawn_host::destroy() {
if ( !sys.isClient() ) {
if ( owner != $null_entity ) {
owner.setPlayerSpawnHostState( self, true );
}
}
ClearCommandmapIcon();
FreeDestroyTask();
FreeSelectTask();
if ( spawner != $null_entity ) {
spawner.setSpawnPoint( $null_entity );
}
}
void spawn_host::syncFields() {
syncBroadcast( "spawner" );
syncCallback( "spawner", "OnSpawnerChanged" );
syncBroadcast( "timeStarted" );
syncCallback( "timeStarted", "OnTimeStartedChanged" );
}
void spawn_host::FreeSelectTask() {
if ( selectTask == $null ) {
return;
}
selectTask.free();
selectTask = $null;
}
void spawn_host::MakeSelectTask() {
if ( selectTask != $null ) {
return;
}
selectTask = taskManager.allocEntityTask( GetPlayerTask( getKey( "task_select" ) ), self );
}
void spawn_host::OnTimeStartedChanged() {
setState( "Idle" );
}
void spawn_host::OnSpawnerChanged() {
if ( spawner != $null_entity ) {
spawnerLocal = false;
if ( spawner == sys.getLocalPlayer() ) {
spawnerLocal = true;
}
}
UpdateVisualState();
}
void spawn_host::Idle() {
setContents( CONTENTS_RENDERMODEL );
setClipmask( 0 );
UpdateVisualState();
float timeLeft = ( sys.getTime() - timeStarted ) + 60.f;
if ( timeLeft > 0.f ) {
sys.wait( timeLeft );
}
expired = true;
if ( spawner == $null_entity ) {
Fizzle();
}
}
void spawn_host::OnPlayerSpawned( entity p ) {
if ( owner != $null_entity ) {
owner.giveProficiency( usedProficiency, 1.f, $null, "spawnhost used" );
}
p.vSetSpawnHostSpawned();
p.setSpawnPoint( $null_entity );
remove();
}
void spawn_host::OnKilled( entity inflictor, entity attacker, float damage, vector direction, float location ) {
Fizzle();
player playerAttacker = attacker;
if ( playerAttacker != $null_entity ) {
team_base team = playerAttacker.getGameTeam();
if ( team != $null ) {
string statName = team.getName() + "_spawnhosts_destroyed";
sys.increaseStatInt( sys.allocStatInt( statName ), playerAttacker.getEntityNumber(), 1 );
}
}
}
void spawn_host::vSetOwner( entity o ) {
owner = o;
}
float spawn_host::GetActivateCode( entity p, float distance ) {
if ( p.getViewingEntity() != p ) {
return AK_NONE;
}
if ( p.getHealth() <= 0 ) {
return AK_NONE;
}
if ( distance > DISTANCE_FOR_ACTION ) {
return AK_NONE;
}
if ( p.getGameTeam() == getGameTeam() ) {
if ( spawner != $null_entity ) {
return AK_NONE;
}
} else {
return AK_DISARM_SPAWNHOST;
}
return AK_USE;
}
float spawn_host::OnUpdateCrosshairInfo( entity p ) {
if ( !sys.doClientSideStuff() ) {
return 1.f;
}
float allegiance = getEntityAllegiance( p );
vector color = GetAllegianceColor( allegiance );
float distance = chGetDistance();
float range = InchesToMetres( distance );
chSetNumLines( 0 );
float index;
if ( p != $null_entity ) {
// see if theres a valid action to perform
float code = GetActivateCode( p, distance );
if ( code != AK_NONE && p.vHasActionItem( code ) ) {
index = chAddLine();
chSetLineMaterial( index, p.vGetActionIcon( code ) );
chSetLineType( index, CI_IMAGE );
chSetLineSize( index, 64, 64 );
chSetLineColor( index, g_colorWhite, 0.9f );
CheckContextToolTip( allegiance, code, p );
}
}
index = chAddLine();
chSetLineTextIndex( index, g_locStr_SpawnHost );
chSetLineColor( index, color, 1.f );
chSetLineType( index, CI_TEXT );
chSetLineSize( index, 0, 0 );
index = chAddLine();
chSetLineColor( index, color, 0.5f );
chSetLineType( index, CI_BAR );
chSetLineFraction( index, getHealth() / getMaxHealth() );
chSetLineSize( index, 75.f, CROSSHAIR_INFO_BAR_HEIGHT );
return 1.f;
}
float spawn_host::OnActivate( entity p, float distance ) {
if ( distance > 128.f ) {
return 0.f;
}
if ( p.getViewingEntity() != p ) {
return 0.0f;
}
if ( p.getHealth() <= 0.f ) {
return 0.f;
}
if ( p.getGameTeam() == gdfTeam ) {
float code = GetActivateCode( p, distance );
if ( code != AK_NONE ) {
p.vSelectActionItem( code );
}
return 1.0f;
}
if ( getEntityAllegiance( p ) != TA_FRIEND ) {
return 0.0f;
}
if ( spawner != $null_entity ) {
if( p.isLocalPlayer() ) {
if ( !p.isToolTipPlaying() ) {
if ( p != spawner ) {
p.sendToolTip( toolTip_strogg_already_selected_1 );
} else {
p.sendToolTip( toolTip_strogg_already_selected_2 );
}
}
}
return 0.0f;
}
p.setSpawnPoint( self );
if( p.isLocalPlayer() ) {
if ( !p.isToolTipPlaying() ) {
p.sendToolTip( toolTip_strogg_select );
}
}
return 1.f;
}
boolean spawn_host::CanSetSpawn() {
if ( spawner == $null_entity ) {
return true;
}
return false;
}
void spawn_host::Fizzle() {
playEffect( "fx_fizzle", "", 0 );
if ( spawnerLocal ) {
entity p = sys.getLocalPlayer();
p.sendToolTip( toolTip_strogg_destroyed );
}
if ( spawner != $null_entity ) {
spawner.setSpawnPoint( $null_entity );
}
if ( !sys.isClient() ) {
thread RemoveThread( 0.5 );
}
}
void spawn_host::RemoveThread( float removeTime ) {
sys.wait( removeTime );
remove();
}
void spawn_host::CheckContextToolTip( float allegiance, float code, entity p ) {
team_base team;
if ( p.isLocalPlayer() ) {
if ( !p.isToolTipPlaying() ) {
float time = sys.getTime();
if ( time - p.getCrosshairStartTime() > 0.5f ) {
if ( time - lastTooltipTime > 5.0f ) {
if ( allegiance == TA_FRIEND ) {
if ( CanSetSpawn() ) {
p.sendToolTip( toolTip_strogg_use );
}
} else {
if ( p.getCurrentWeapon() != p.vGetActionItem( code ) ) {
p.sendToolTip( toolTip_gdf_1 );
} else {
p.sendToolTip( toolTip_gdf_2 );
}
}
lastTooltipTime = time;
}
}
}
}
}
void spawn_host::OnSpawnPointActivate( entity p ) {
if ( spawner != $null_entity ) {
sys.warning( "spawn_host::OnSpawnPointActivate Multiple Spawners Set" );
}
spawner = p;
OnSpawnerChanged();
}
void spawn_host::OnSpawnPointDeactivate( entity p ) {
if ( spawner == p ) {
spawner = $null_entity;
if ( expired ) {
Fizzle();
}
OnSpawnerChanged();
}
}
void spawn_host::vOnLocalTeamChanged() {
UpdateVisualState();
}
void spawn_host::UpdateVisualState() {
if ( !sys.isClient() ) {
if ( spawner == $null_entity ) {
MakeSelectTask();
} else {
FreeSelectTask();
}
}
if ( spawner == $null_entity ) {
if ( selectedModel ) {
setModel( getKey( "model" ) );
selectedModel = false;
}
} else {
if ( !selectedModel ) {
setModel( getKey( "model_selected" ) );
selectedModel = true;
}
}
}
void spawn_host::SetupCommandmapIcon() {
ClearCommandmapIcon();
commandmapIcon = sys.allocCMIcon( self, getFloatKey( "icon_sort_cm" ) );
team_base team = getGameTeam();
sys.setCMIconMaterial( commandmapIcon, GetMaterial( getKey( "mtr_icon_" + team.getName() ) ) );
sys.setCMIconFlag( commandmapIcon, CMF_ALWAYSKNOWN );
sys.setCMIconFlag( commandmapIcon, CMF_ONLYSHOWONFULLVIEW );
sys.setCMIconColorMode( commandmapIcon, CM_ALLEGIANCE );
sys.setCMIconSize( commandmapIcon, getFloatKey( "icon_size_cm" ) );
}
void spawn_host::ClearCommandmapIcon() {
if ( commandmapIcon != -1 ) {
sys.freeCMIcon( self, commandmapIcon );
commandmapIcon = -1;
}
}
void spawn_host::OnSpawnPointSelected( float isDefault ) {
SetupCommandmapIcon();
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.spawnHostActive", 1 );
}
void spawn_host::OnSpawnPointDeselected() {
ClearCommandmapIcon();
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.spawnHostActive", 0 );
}
string spawn_host::vGetQuickChatString( entity p ) {
if ( getEntityAllegiance( p ) == TA_FRIEND ) {
return getKey( "contextmenu_quickchat_friendly" );
}
return getKey( "contextmenu_quickchat_enemy" );
}
void spawn_host::vOnContextDestroy( entity p ) {
if ( getEntityAllegiance( p ) != TA_FRIEND ) {
InitDestroyTask();
}
}
void spawn_host::FreeDestroyTask() {
if ( destroyTask != $null ) {
destroyTask.free();
}
}
void spawn_host::InitDestroyTask() {
if ( destroyTask != $null ) {
return;
}
float taskHandle = GetPlayerTask( getKey( "task_destroy" ) );
if ( taskHandle != -1 ) {
destroyTask = taskManager.allocEntityTask( taskHandle, self );
}
}
void spawn_host::CreatedVOThread() {
sys.wait( getFloatKey( "vo_created_delay" ) );
if ( spawner == $null_entity ) {
objManager.PlaySoundRanged( getKey( "snd_spawn_created" ), stroggTeam, getWorldOrigin(), 2048.f );
objManager.CPrintEventRanged( sys.localizeString( "game/misc/spawn_host_created" ), stroggTeam, getWorldOrigin(), 2048.f );
}
}
void spawn_host::vSetBody( entity body ) {
originalBody = body;
}