etqw-sdk/base/script/misc/item_capturepoint.script

286 lines
6.9 KiB
Plaintext
Raw Permalink Normal View History

2008-05-29 00:00:00 +00:00
object item_capturepoint {
void preinit();
void init();
entity FindItem();
void OnTouch( entity p, object traceObject );
entity item;
float objectiveIndex;
float captureProficiency;
float lastTouchTime;
float firstTouchTime;
float transmitTime;
}
void item_capturepoint::preinit() {
captureProficiency = GetProficiency( getKey( "prof_capture" ) );
objectiveIndex = getFloatKeyWithDefault( "objective_index", -1 );
transmitTime = getFloatKeyWithDefault( "transmit_time", 5.f );
}
void item_capturepoint::init() {
setContents( CONTENTS_TRIGGER );
item = FindItem();
if ( item == $null_entity ) {
sys.warning( "item_capturepoint::init Couldn't Find Item On (" + getName() + ")\n" );
}
}
entity item_capturepoint::FindItem() {
return getEntityKey( "item_name" );
}
void item_capturepoint::OnTouch( entity p, object traceObject ) {
if ( item == $null_entity ) {
return;
}
if ( item.vGetCarrier() == p ) {
float now = sys.getTime();
if ( ( now - lastTouchTime ) > 0.5f ) {
firstTouchTime = now;
}
lastTouchTime = now;
if ( ( now - firstTouchTime ) >= transmitTime ) {
item.remove();
if ( captureProficiency != -1 ) {
p.giveProficiency( captureProficiency, 1.f, $null, "item captured" );
}
if ( objectiveIndex != -1 ) {
objManager.CompleteObjective( objectiveIndex, p );
}
}
}
}
object item_capturepoint_use {
void preinit();
void destroy();
void syncFields();
void OnPostMapSpawn();
float OnUpdateCrosshairInfo( entity p );
boolean CanActivate( entity p, float distance );
float OnActivate( entity p, float distance );
float OnActivateHeld( entity p, float distance );
float OnUpdateCrosshairInfo( entity p );
float vGetPliersProgressBarValue( float action );
float vGetTransmitProgress();
void Use( entity p );
void ActivateSoundThread( entity p );
void FinishActivateSound();
void OnTransmitTime();
entity item;
float objectiveIndex;
float captureProficiency;
float currentTransmitCount;
float maxTransmitCount;
float lastTransmitTime;
handle screenName;
handle progressMessage;
float nextProgressMessageTime;
entity lastUser;
float activateSoundThreadId;
}
void item_capturepoint_use::preinit() {
screenName = sys.localizeString( getKey( "screen_name" ) );
captureProficiency = GetProficiency( getKey( "prof_capture" ) );
objectiveIndex = getFloatKeyWithDefault( "objective_index", -1 );
maxTransmitCount = getFloatKeyWithDefault( "transmit_count", 180 );
progressMessage = sys.localizeString( getKeyWithDefault( "progress_message", "maps/generic/obj_transmit" ) );
nextProgressMessageTime = 0;
activateSoundThreadId = -1;
}
void item_capturepoint_use::destroy() {
if ( activateSoundThreadId != -1 ) {
sys.terminate( activateSoundThreadId );
FinishActivateSound();
}
}
void item_capturepoint_use::syncFields() {
syncBroadcast( "currentTransmitCount" );
syncBroadcast( "lastTransmitTime" );
syncBroadcast( "item" );
//syncCallback( "lastTransmitTime", "OnTransmitTime" );
}
void item_capturepoint_use::OnPostMapSpawn() {
if ( !sys.isClient() ) {
item = getEntityKey( "item_name" );
if ( item == $null_entity ) {
sys.error( "item_capturepoint_use::init Couldn't Find Item On (" + getName() + ")\n" );
}
}
}
boolean item_capturepoint_use::CanActivate( entity p, float distance ) {
if ( distance > 128.f ) {
return false;
}
if ( item == $null_entity ) {
return false;
}
if ( p.getViewingEntity() != p ) {
return false;
}
if ( item.vGetCarrier() != p ) {
return false;
}
return true;
}
float item_capturepoint_use::OnUpdateCrosshairInfo( entity p ) {
if ( !sys.doClientSideStuff() ) {
return 1.f;
}
float allegiance = getEntityAllegiance( p );
vector color = GetAllegianceColor( allegiance );
float distance = chGetDistance();
float range = InchesToMetres( distance );
float health = getHealth();
chSetNumLines( 0 );
float index;
if ( p != $null_entity ) {
if ( CanActivate( p, distance ) ) {
index = chAddLine();
chSetLineMaterial( index, p.vGetActionIcon( AK_USE ) );
chSetLineType( index, CI_IMAGE );
chSetLineSize( index, 64, 64 );
chSetLineColor( index, g_colorWhite, 0.9f );
}
}
index = chAddLine();
chSetLineTextIndex( index, screenName );
chSetLineColor( index, color, 1.f );
chSetLineType( index, CI_TEXT );
chSetLineSize( index, 0, 0 );
return 1.f;
}
float item_capturepoint_use::OnActivate( entity p, float distance ) {
if ( !CanActivate( p, distance ) ) {
return 0;
}
return 1;
}
float item_capturepoint_use::OnActivateHeld( entity p, float distance ) {
if ( !CanActivate( p, distance ) ) {
return 0;
}
Use( p );
if ( sys.getLocalPlayer() == p ) {
OnTransmitTime();
}
return 1;
}
#define ITEM_TRANSMIT_TIMEOUT 0.5f
void item_capturepoint_use::Use( entity p ) {
float now = sys.getTime();
if ( now - lastTransmitTime > ITEM_TRANSMIT_TIMEOUT ) {
currentTransmitCount = 0.f;
}
lastTransmitTime = now;
if ( sys.getTime() > nextProgressMessageTime || p != lastUser ) {
objManager.PushCPrintString( p.getUserName() );
objManager.CPrintEvent( progressMessage, $null );
lastUser = p;
nextProgressMessageTime = sys.getTime() + 8.f;
}
player playerP = p;
playerP.ShowProgressBar( self, AC_CAPTURE );
currentTransmitCount++;
if ( currentTransmitCount >= maxTransmitCount ) {
item.vCaptured();
if ( activateSoundThreadId != -1 ) {
FinishActivateSound();
}
if ( !sys.isClient() ) {
item.remove();
item = $null_entity;
if ( captureProficiency != -1 ) {
p.giveProficiency( captureProficiency, 1.f, $null, "item captured" );
}
if ( objectiveIndex != -1 ) {
objManager.CompleteObjective( objectiveIndex, p );
}
}
}
}
float item_capturepoint_use::vGetPliersProgressBarValue( float action ) {
if ( action == AC_CAPTURE ) {
return currentTransmitCount / maxTransmitCount;
}
return 0.f;
}
float item_capturepoint_use::vGetTransmitProgress() {
if ( sys.getTime() - lastTransmitTime > ITEM_TRANSMIT_TIMEOUT ) {
return 0.f;
}
return currentTransmitCount / maxTransmitCount;
}
void item_capturepoint_use::ActivateSoundThread( entity p ) {
sys.startSoundDirect( getKey( "snd_transmitting_start" ), SND_STRUCTURE_CAPTUREPOINT );
waitUntil( sys.getTime() - lastTransmitTime > 0.7f );
FinishActivateSound();
}
void item_capturepoint_use::FinishActivateSound() {
sys.startSoundDirect( getKey( "snd_transmitting_stop" ), SND_STRUCTURE_CAPTUREPOINT );
activateSoundThreadId = -1;
}
void item_capturepoint_use::OnTransmitTime() {
if ( activateSoundThreadId == -1 ) {
activateSoundThreadId = thread ActivateSoundThread( $null_entity );
}
}