302 lines
No EOL
6.1 KiB
Text
302 lines
No EOL
6.1 KiB
Text
|
|
object door {
|
|
void preinit();
|
|
void syncFields();
|
|
|
|
void vLock();
|
|
void vUnlock();
|
|
|
|
float allowOpen( entity other );
|
|
|
|
boolean vDisablePlantCharge() { return true; }
|
|
|
|
boolean locked;
|
|
}
|
|
|
|
void door::syncFields() {
|
|
syncBroadcast( "locked" );
|
|
}
|
|
|
|
void door::preinit() {
|
|
locked = getIntKey( "start_locked" );
|
|
}
|
|
|
|
void door::vLock() {
|
|
locked = true;
|
|
}
|
|
|
|
void door::vUnlock() {
|
|
locked = false;
|
|
}
|
|
|
|
float door::allowOpen( entity other ) {
|
|
if ( locked ) {
|
|
return 0.f;
|
|
}
|
|
return 1.f;
|
|
}
|
|
|
|
#define DOOR_PICK_TIME 30.f
|
|
|
|
object teamDoor : door {
|
|
void preinit();
|
|
void destroy();
|
|
void syncFields();
|
|
|
|
float allowOpen( entity p );
|
|
|
|
boolean vCheckActionCode( entity p, float actionCode );
|
|
float vGetPliersProgressBarValue( float action );
|
|
void vHack( entity p );
|
|
|
|
void vCreateMission();
|
|
void vFreeMission();
|
|
void vCompleteMission();
|
|
|
|
float OnActivate( entity p, float distance );
|
|
float OnUpdateCrosshairInfo( entity p );
|
|
|
|
void PickLock();
|
|
void LockPickWaitThread();
|
|
float GetActivateCode( entity p, float distance );
|
|
|
|
string vGetQuickChatString( entity p );
|
|
void vOnContextHack( entity p );
|
|
|
|
float lockpickEndTime;
|
|
boolean canPickLock;
|
|
handle objectName;
|
|
|
|
float maxHackCount;
|
|
float hackCount;
|
|
|
|
boolean hackMissionActive;
|
|
task missionTask;
|
|
|
|
flashpoint_obj flashpoint;
|
|
}
|
|
|
|
void teamDoor::preinit() {
|
|
lockpickEndTime = 0.f;
|
|
|
|
canPickLock = getIntKey( "pickable" );
|
|
|
|
maxHackCount = getFloatKeyWithDefault( "hack_count", 40.f );
|
|
hackCount = 0;
|
|
|
|
string objectNameKey = getKey( "object_name" );
|
|
if ( objectNameKey != "" ) {
|
|
objectName = sys.localizeString( objectNameKey );
|
|
} else {
|
|
objectName = invalid_handle;
|
|
}
|
|
|
|
setGameTeam( sys.getTeam( getKey( "team" ) ) );
|
|
}
|
|
|
|
void teamDoor::destroy() {
|
|
vFreeMission();
|
|
|
|
if ( flashpoint != $null ) {
|
|
delete flashpoint;
|
|
}
|
|
}
|
|
|
|
void teamDoor::syncFields() {
|
|
syncBroadcast( "lockpickEndTime" );
|
|
}
|
|
|
|
float teamDoor::allowOpen( entity p ) {
|
|
if ( locked ) {
|
|
return 0.f;
|
|
}
|
|
|
|
if ( lockpickEndTime < sys.getTime() ) {
|
|
float allegiance = getEntityAllegiance( p );
|
|
float disguiseAllegiance = allegiance;
|
|
|
|
player playerP = p;
|
|
if ( playerP != $null_entity ) {
|
|
entity disguised = playerP.getDisguiseClient();
|
|
if ( disguised != $null_entity ) {
|
|
disguiseAllegiance = getEntityAllegiance( disguised );
|
|
}
|
|
}
|
|
|
|
if ( allegiance != TA_FRIEND && disguiseAllegiance != TA_FRIEND ) {
|
|
return 0.f;
|
|
}
|
|
}
|
|
|
|
return 1.f;
|
|
}
|
|
|
|
void teamDoor::PickLock() {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
if ( missionTask != $null ) {
|
|
missionTask.complete();
|
|
missionTask.free();
|
|
missionTask = $null;
|
|
}
|
|
|
|
lockpickEndTime = sys.getTime() + DOOR_PICK_TIME;
|
|
thread LockPickWaitThread();
|
|
}
|
|
|
|
void teamDoor::LockPickWaitThread() {
|
|
sys.wait( DOOR_PICK_TIME + 1.f );
|
|
|
|
if ( hackMissionActive ) {
|
|
if ( missionTask == $null_entity ) {
|
|
vCreateMission();
|
|
}
|
|
}
|
|
}
|
|
|
|
void teamDoor::vCreateMission() {
|
|
vFreeMission();
|
|
hackMissionActive = true;
|
|
missionTask = taskManager.allocEntityTask( GetPlayerTask( getKey( "task_hack" ) ), self );
|
|
}
|
|
|
|
void teamDoor::vFreeMission() {
|
|
hackMissionActive = false;
|
|
if ( missionTask != $null ) {
|
|
missionTask.free();
|
|
missionTask = $null;
|
|
}
|
|
}
|
|
|
|
void teamDoor::vCompleteMission() {
|
|
hackMissionActive = false;
|
|
if ( missionTask != $null ) {
|
|
missionTask.complete();
|
|
missionTask.free();
|
|
missionTask = $null;
|
|
}
|
|
}
|
|
|
|
float teamDoor::GetActivateCode( entity p, float distance ) {
|
|
if ( p.getViewingEntity() != p ) {
|
|
return AK_NONE;
|
|
}
|
|
|
|
if ( p.getHealth() <= 0 ) {
|
|
return AK_NONE;
|
|
}
|
|
|
|
float allegiance = getEntityAllegiance( p );
|
|
|
|
if ( distance < DISTANCE_FOR_ACTION ) {
|
|
if ( allegiance == TA_ENEMY ) {
|
|
if ( canPickLock && lockpickEndTime < sys.getTime() ) {
|
|
if ( p.vHasActionItem( AK_HACK ) ) {
|
|
return AK_HACK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return AK_NONE;
|
|
}
|
|
|
|
float teamDoor::OnUpdateCrosshairInfo( entity p ) {
|
|
if ( !sys.doClientSideStuff() ) {
|
|
return 1.f;
|
|
}
|
|
|
|
float allegiance = getEntityAllegiance( p );
|
|
vector color = GetAllegianceColor( allegiance );
|
|
float distance = chGetDistance();
|
|
|
|
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 );
|
|
}
|
|
}
|
|
|
|
index = chAddLine();
|
|
chSetLineTextIndex( index, objectName );
|
|
chSetLineColor( index, color, 1.f );
|
|
chSetLineType( index, CI_TEXT );
|
|
chSetLineSize( index, 0, 0 );
|
|
|
|
return 1.f;
|
|
}
|
|
|
|
float teamDoor::OnActivate( entity p, float distance ) {
|
|
if ( p.vSelectActionItem( GetActivateCode( p, distance ) ) ) {
|
|
return 1.f;
|
|
}
|
|
|
|
return 0.f;
|
|
}
|
|
|
|
boolean teamDoor::vCheckActionCode( entity p, float actionCode ) {
|
|
if ( actionCode == AC_HACK ) {
|
|
if ( getEntityAllegiance( p ) != TA_ENEMY || !canPickLock ) {
|
|
return false;
|
|
}
|
|
if ( lockpickEndTime > sys.getTime() ) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
float teamDoor::vGetPliersProgressBarValue( float action ) {
|
|
if ( action == AC_HACK ) {
|
|
return hackCount / maxHackCount;
|
|
}
|
|
|
|
return 0.f;
|
|
}
|
|
|
|
void teamDoor::vHack( entity p ) {
|
|
if ( hackCount >= maxHackCount ) {
|
|
hackCount = 0;
|
|
}
|
|
hackCount = hackCount + 1;
|
|
if ( hackCount >= maxHackCount ) {
|
|
PickLock();
|
|
}
|
|
}
|
|
|
|
string teamDoor::vGetQuickChatString( entity p ) {
|
|
if ( p.getGameTeam() == stroggTeam ) {
|
|
if ( canPickLock ) {
|
|
return "quickchat/context/hack_gates";
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
void teamDoor::vOnContextHack( entity p ) {
|
|
player local = sys.getLocalViewPlayer();
|
|
if ( local == $null_entity || p == $null_entity ) {
|
|
return;
|
|
}
|
|
|
|
if ( flashpoint != $null ) {
|
|
delete flashpoint;
|
|
}
|
|
|
|
flashpoint = new flashpoint_obj;
|
|
flashpoint.SetOwner( self );
|
|
flashpoint.SetMaterial( getKey( "mtr_icon_flash" ) );
|
|
} |