3117 lines
No EOL
73 KiB
Text
3117 lines
No EOL
73 KiB
Text
|
|
/***********************************************************************
|
|
|
|
This script contains any player specific code.
|
|
|
|
***********************************************************************/
|
|
|
|
object parachute_base {
|
|
}
|
|
|
|
object team_gdf : team_base {
|
|
}
|
|
|
|
object team_strogg : team_base {
|
|
}
|
|
|
|
object waypoint_info {
|
|
void Show( entity _owner, vector pos );
|
|
}
|
|
|
|
object deployable_base;
|
|
object dead_body;
|
|
|
|
object player {
|
|
void preinit();
|
|
void init();
|
|
void destroy();
|
|
void syncFields();
|
|
|
|
// Gamecode callbacks
|
|
void OnProficiencyChanged( float type, float oldLevel, float newLevel );
|
|
void OnSpawn( boolean isRevived, boolean parachute );
|
|
void OnKilled( entity inflictor, entity attacker, float damage, vector direction, float location );
|
|
void OnPain( entity inflictor, entity attacker, float damage, vector direction, float location );
|
|
void OnEnterVehicle( entity vehicle, float positionIndex, float oldPositionIndex );
|
|
void OnExitVehicle( entity vehicle, float positionIndex );
|
|
void OnNewModel();
|
|
void OnFullyKilled();
|
|
float OnUpdateCrosshairInfo( entity p );
|
|
void OnClassChanged();
|
|
void OnSetTeam( object oldTeam, object newTeam );
|
|
float OnActivate( entity p, float distance );
|
|
float GetActivateCode( entity p, float distance );
|
|
void OnConsumeHealth();
|
|
void OnConsumeStroyent();
|
|
void OnHitActivate();
|
|
void OnJumpHeld();
|
|
void OnDisguised( entity p );
|
|
void OnRankChanged( float rankLevel );
|
|
void OnFireTeamJoined();
|
|
void OnFireTeamBecomeLeader();
|
|
void OnTeleportEntityChanged( entity other );
|
|
void OnEnterView();
|
|
void OnExitView();
|
|
void OnWeaponFired();
|
|
void OnSendingVoice( boolean sending );
|
|
void OnNewTask( entity newTask, boolean isMission );
|
|
|
|
boolean NeedsParachute();
|
|
|
|
boolean vCheckActionCode( entity p, float actionCode );
|
|
|
|
boolean vShouldCreateSpawnHost( entity p );
|
|
boolean vCreateSpawnHost( entity other, string hostName );
|
|
|
|
boolean vNeedsRevive( entity p );
|
|
boolean vRevive( entity p, float healthScale );
|
|
void vForceRespawn();
|
|
void vOnSpawnWavePassed();
|
|
|
|
void vGiveSpotProficiency();
|
|
|
|
void LocalViewerUpdate();
|
|
void ScanForMines();
|
|
|
|
boolean EnergyBar_Remove( float amount );
|
|
boolean EnergyBar_CanRemove( float amount );
|
|
float EnergyBar_CalcChargeUsed();
|
|
|
|
void DestroyBinObjects();
|
|
void DestroyMines();
|
|
|
|
void vHideNormalChargeBar( boolean h );
|
|
|
|
entity vGetCarryableItem();
|
|
|
|
void vDelayDeployment( float delay );
|
|
|
|
void InitReviveTask();
|
|
void FreeReviveTask();
|
|
void CompleteReviveTask( entity p );
|
|
|
|
void RegenThread();
|
|
void KillRegenThread();
|
|
void vStartRegenThread();
|
|
|
|
void InitWaypointObject( vector pos );
|
|
void FreeWaypointObject();
|
|
object FindWaypointObject();
|
|
|
|
// Command map
|
|
void SetupCommandMapIcons( boolean useViewPlayer );
|
|
void FreeCommandMapIcons();
|
|
void SetupMedicIcon();
|
|
void FreeMedicIcon();
|
|
|
|
void SetupRequestIcon( string key, string requirement );
|
|
void FreeRequestIcon();
|
|
|
|
void AllocHealTask();
|
|
void AllocSupplyTask();
|
|
void AllocPickupTask();
|
|
void FreeRequestTask();
|
|
|
|
void AllocSpawnHostTask();
|
|
void FreeSpawnHostTask();
|
|
|
|
void AllocKillTask();
|
|
void FreeEnemyRequestTask();
|
|
|
|
|
|
boolean HasSpawnHostTask();
|
|
|
|
void vOnContextSpawnHost( entity p );
|
|
void vOnContextKill( entity p );
|
|
|
|
void vOnRemovePlayersKillTask( player p );
|
|
|
|
void OnScopeStateChanged();
|
|
|
|
// utilities
|
|
boolean IsGDF();
|
|
boolean IsStrogg();
|
|
|
|
wstring GetDisguisedTitle( entity p );
|
|
|
|
void ChooseStance( float animChannel );
|
|
|
|
boolean CanStab( entity stabbee );
|
|
object GetDisguisedTeam();
|
|
|
|
boolean IsReviveTask( task t );
|
|
boolean IsHealTask( task t );
|
|
boolean IsSupplyTask( task t );
|
|
void OnHealed( float oldHealth, float health );
|
|
void OnAmmoPickup();
|
|
void OnWeaponChanged();
|
|
|
|
float vGetPliersProgressBarValue( float action );
|
|
|
|
boolean vDisablePlantCharge() { return true; }
|
|
|
|
float vGetVehicleCredit();
|
|
void vUseVehicleCredit( float fraction );
|
|
|
|
void NewRankVOThread( float rank );
|
|
|
|
void SetTargetingItem( deployable_base item );
|
|
|
|
void ObjectiveFlashThread();
|
|
|
|
void MissionToolTipThread();
|
|
|
|
void vTargetLockAlarm( entity other );
|
|
void vStopTargetLockAlarm( entity other );
|
|
void vTargetLockAttack( entity other );
|
|
void vMineWarning( entity other );
|
|
|
|
float reviveQuickChat; // FIXME: Move to team
|
|
float reviveQuickChatAck;
|
|
float declinedQuickChat;
|
|
float vehicleWarningQuickChat;
|
|
boolean reviveReward;
|
|
|
|
task enemyRequestTask;
|
|
player killTaskRequestee;
|
|
|
|
task requestTask;
|
|
|
|
task spawnHostTask;
|
|
|
|
boolean playingReviveMeAnimLegs;
|
|
boolean playingReviveMeAnimTorso;
|
|
|
|
boolean playingReviveAnimLegs;
|
|
boolean playingReviveAnimTorso;
|
|
|
|
boolean proxyFiringWeapon;
|
|
boolean proxyFiringWeaponStart;
|
|
|
|
boolean targetingPointValid;
|
|
vector lastValidTarget;
|
|
|
|
float chargeTimer;
|
|
boolean hideNormalChargeBar;
|
|
|
|
float commandMapArcInfo;
|
|
float commandMapRoleInfo;
|
|
float commandMapFireTeamInfo;
|
|
float commandMapMedicIcon;
|
|
float commandMapRequest;
|
|
float commandMapTrackingIcon;
|
|
|
|
float energyChargeTime;
|
|
|
|
float stroyentPerTransfer;
|
|
float healthPerTransfer;
|
|
|
|
float fireTeamLeaderToolTip;
|
|
|
|
float complaintCount;
|
|
|
|
float lastRespawnTime;
|
|
|
|
float nextDeploymentTime;
|
|
|
|
deployable_base targetingItem;
|
|
|
|
boolean respawningChute;
|
|
|
|
void BreatheThread();
|
|
void KillBreatheThread();
|
|
void CreateBreatheThread();
|
|
|
|
void FallSoundThread( boolean create );
|
|
void KillFallSoundThread();
|
|
void CreateFallSoundThread();
|
|
|
|
void ShowProgressBar( entity target, float action );
|
|
float progressBarHideTime;
|
|
|
|
boolean spawnHostSpawned;
|
|
void vSetSpawnHostSpawned() { spawnHostSpawned = true; }
|
|
|
|
boolean vBlockVehicleSpawn() { return true; }
|
|
|
|
parachute_base GetParachute();
|
|
|
|
void vPlayFFWarning( string sound, float nextTime );
|
|
|
|
void FlashCMIcon( entity p, float requiredTeam, float flashTime );
|
|
|
|
float reviveCount;
|
|
|
|
float nextFFWarningTime;
|
|
|
|
boolean sniperScopeUp;
|
|
void SetSniperScopeUp( boolean up );
|
|
boolean IsSniperScopeUp() { return sniperScopeUp; }
|
|
|
|
boolean isPanting;
|
|
boolean PlayerIsPanting() { return isPanting; }
|
|
|
|
boolean ironSightUp;
|
|
void SetIronSightUp( boolean up );
|
|
boolean IsIronSightUp() { return ironSightUp; }
|
|
|
|
float CalcTooltipWait();
|
|
|
|
boolean waitedForRevive;
|
|
|
|
float nextStroyentTransferTime;
|
|
|
|
float vehicleCreditTimer;
|
|
float vehicleCreditChargeTime;
|
|
|
|
boolean vTriggerTripmine() { return true; }
|
|
|
|
void RemoveOldestMine();
|
|
|
|
float parachuteSpeed;
|
|
|
|
float fallSoundThreadId;
|
|
boolean playingFallSound;
|
|
|
|
float hudObjectiveFlashThread;
|
|
|
|
float gatlingSpeed;
|
|
boolean teleportSucceeded;
|
|
|
|
float missionToolTipThreadId;
|
|
|
|
float targetLockCount;
|
|
}
|
|
|
|
/*
|
|
================
|
|
SetProgressBarVisible
|
|
================
|
|
*/
|
|
void SetProgressBarVisible( boolean s ) {
|
|
if ( sys.doClientSideStuff() ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "progressBar.visible", s );
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::SetupCommandMapIcons
|
|
=====================
|
|
*/
|
|
void player::SetupCommandMapIcons( boolean useViewPlayer ) {
|
|
FreeCommandMapIcons();
|
|
|
|
player localPlayer = sys.getLocalPlayer();
|
|
if ( localPlayer == self ) {
|
|
if ( getGameTeam() == $null_entity ) {
|
|
localPlayer = sys.getLocalViewPlayer();
|
|
if ( localPlayer == self || !useViewPlayer ) {
|
|
commandMapRoleInfo = sys.allocCMIcon( self, getFloatKey( "icon_sort_self_cm" ) );
|
|
sys.setCMIconMaterial( commandMapRoleInfo, GetMaterial( getKey( "mtr_commandmapicon_self_spectating" ) ) );
|
|
sys.setCMIconDrawMode( commandMapRoleInfo, DM_MATERIAL );
|
|
sys.setCMIconFlag( commandMapRoleInfo, CMF_ALWAYSKNOWN );
|
|
sys.setCMIconSize( commandMapRoleInfo, 8.0f );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( useViewPlayer ) {
|
|
localPlayer = sys.getLocalViewPlayer();
|
|
}
|
|
|
|
if ( localPlayer == $null_entity || getGameTeam() == $null_entity ) {
|
|
return;
|
|
} else if ( localPlayer.getGameTeam() == $null_entity ) {
|
|
return;
|
|
}
|
|
|
|
string classKey;
|
|
if ( self == localPlayer ) {
|
|
commandMapRoleInfo = sys.allocCMIcon( self, getFloatKey( "icon_sort_self_cm" ) );
|
|
sys.setCMIconUnknownMaterial( commandMapRoleInfo, GetMaterial( getKey( "mtr_commandmapicon_self" ) ) );
|
|
sys.setCMIconMaterial( commandMapRoleInfo, GetMaterial( getKey( "mtr_commandmapicon_self" ) ) );
|
|
sys.setCMIconDrawMode( commandMapRoleInfo, DM_ROTATED_MATERIAL );
|
|
sys.setCMIconSize( commandMapRoleInfo, 16.0f );
|
|
sys.setCMIconFlag( commandMapRoleInfo, CMF_FOLLOWROTATION | CMF_PLAYERROTATIONONLY );
|
|
|
|
commandMapArcInfo = sys.allocCMIcon( self, getFloatKey( "icon_sort_self_arc_cm" ) );
|
|
sys.setCMIconUnknownMaterial( commandMapArcInfo, GetMaterial( getKey( "mtr_commandmapicon_self_arc" ) ) );
|
|
sys.setCMIconMaterial( commandMapArcInfo, GetMaterial( getKey( "mtr_commandmapicon_self_arc" ) ) );
|
|
sys.setCMIconDrawMode( commandMapArcInfo, DM_ROTATED_MATERIAL );
|
|
sys.setCMIconSize( commandMapArcInfo, 96.0f );
|
|
sys.setCMIconFlag( commandMapArcInfo, CMF_FOLLOWROTATION | CMF_FOLLOWREMOTECAMERAORIGIN );
|
|
|
|
commandMapTrackingIcon = sys.allocCMIcon( self, getFloatKey( "icon_sort_self_cm" ) );
|
|
sys.setCMIconDrawMode( commandMapTrackingIcon, DM_CROSSHAIR );
|
|
sys.setCMIconFlag( commandMapTrackingIcon, CMF_ONLYSHOWONFULLVIEW );
|
|
sys.setCMIconMaterial( commandMapTrackingIcon, GetMaterial( getKey( "mtr_commandmapicon_tracking" ) ) );
|
|
sys.setCMIconColor( commandMapTrackingIcon, g_colorYellow, 0.5 );
|
|
} else {
|
|
float allegiance = getEntityAllegiance( localPlayer );
|
|
|
|
boolean showIcon = true;
|
|
if ( allegiance == TA_ENEMY && !isDisguised() ) { // we always want to show the icon if they are disguised, otherwise it'd give them away
|
|
team_base otherTeam = getGameTeam();
|
|
if ( otherTeam != $null ) {
|
|
if ( otherTeam.HasPersonalJammer( self ) ) {
|
|
showIcon = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( showIcon ) {
|
|
entity disguiseClient = getDisguiseClient();
|
|
entity classEntity = disguiseClient;
|
|
if ( allegiance == TA_FRIEND || disguiseClient == $null_entity ) {
|
|
classEntity = self;
|
|
}
|
|
|
|
commandMapRoleInfo = sys.allocCMIcon( self, getFloatKey( "icon_sort_cm" ) );
|
|
sys.setCMIconUnknownMaterial( commandMapRoleInfo, GetMaterial( classEntity.getClassKey( "mtr_cm_icon" ) ) );
|
|
sys.setCMIconMaterial( commandMapRoleInfo, GetMaterial( classEntity.getClassKey( "mtr_cm_icon" ) ) );
|
|
sys.setCMIconFireteamMaterial( commandMapRoleInfo, GetMaterial( classEntity.getClassKey( "mtr_icon_class" ) ) );
|
|
sys.setCMIconDrawMode( commandMapRoleInfo, DM_ROTATED_MATERIAL );
|
|
sys.setCMIconSize( commandMapRoleInfo, 12.0f );
|
|
sys.setCMIconUnknownSize( commandMapRoleInfo, 12.0f );
|
|
sys.setCMIconFlag( commandMapRoleInfo, CMF_FIRETEAMKNOWN | CMF_FIRETEAMCOLORING );
|
|
|
|
if ( disguiseClient != $null_entity ) {
|
|
sys.setCMIconFlag( commandMapRoleInfo, CMF_ALWAYSKNOWN );
|
|
sys.setCMIconColorMode( commandMapRoleInfo, CM_FRIENDLY );
|
|
} else {
|
|
sys.setCMIconColorMode( commandMapRoleInfo, CM_ALLEGIANCE );
|
|
}
|
|
|
|
if ( !classEntity.sameFireTeam( localPlayer ) ) {
|
|
sys.setCMIconFlag( commandMapRoleInfo, CMF_FOLLOWROTATION );
|
|
}
|
|
|
|
commandMapFireTeamInfo = sys.allocCMIcon( self, getFloatKey( "icon_sort_cm_ftring" ) );
|
|
sys.setCMIconMaterial( commandMapFireTeamInfo, GetMaterial( getKey( "mtr_icon_team_ring" ) ) );
|
|
sys.setCMIconSize( commandMapFireTeamInfo, 12.0f * getFloatKey( "team_ring_size" ) );
|
|
sys.setCMIconFlag( commandMapFireTeamInfo, CMF_FOLLOWROTATION | CMF_FIRETEAMONLY | CMF_FIRETEAMKNOWN );
|
|
sys.setCMIconDrawMode( commandMapFireTeamInfo, DM_ROTATED_MATERIAL );
|
|
sys.setCMIconColorMode( commandMapFireTeamInfo, CM_NORMAL );
|
|
sys.setCMIconColor( commandMapFireTeamInfo, g_colorWhite, 1.0f );
|
|
if ( disguiseClient != $null_entity ) {
|
|
sys.setCMIconFlag( commandMapFireTeamInfo, CMF_ALWAYSKNOWN );
|
|
}
|
|
}
|
|
|
|
if ( getVehicle() != $null_entity ) {
|
|
if ( commandMapRoleInfo != -1 ) {
|
|
sys.hideCMIcon( commandMapRoleInfo );
|
|
}
|
|
if ( commandMapFireTeamInfo != -1 ) {
|
|
sys.hideCMIcon( commandMapFireTeamInfo );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::FreeCommandMapIcons
|
|
=====================
|
|
*/
|
|
void player::FreeCommandMapIcons() {
|
|
|
|
if ( commandMapRoleInfo != -1 ) {
|
|
sys.freeCMIcon( self, commandMapRoleInfo );
|
|
commandMapRoleInfo = -1;
|
|
}
|
|
|
|
if( commandMapArcInfo != -1 ) {
|
|
sys.freeCMIcon( self, commandMapArcInfo );
|
|
commandMapArcInfo = -1;
|
|
}
|
|
|
|
if ( commandMapFireTeamInfo != -1 ) {
|
|
sys.freeCMIcon( self, commandMapFireTeamInfo );
|
|
commandMapFireTeamInfo = -1;
|
|
}
|
|
|
|
if ( commandMapTrackingIcon != -1 ) {
|
|
sys.freeCMIcon( self, commandMapTrackingIcon );
|
|
commandMapTrackingIcon = -1;
|
|
}
|
|
|
|
FreeRequestIcon();
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::SetupRequestIcon
|
|
=====================
|
|
*/
|
|
void player::SetupRequestIcon( string key, string requirement ) {
|
|
FreeRequestIcon();
|
|
|
|
commandMapRequest = sys.allocCMIcon( self, getFloatKey( "icon_sort_cm_request" ) );
|
|
|
|
sys.setCMIconMaterial( commandMapRequest, GetMaterial( getClassKey( key ) ) );
|
|
sys.setCMIconUnknownMaterial( commandMapRequest, GetMaterial( getClassKey( key ) ) );
|
|
sys.addCMIconRequirement( commandMapRequest, getClassKey( requirement ) );
|
|
sys.setCMIconColorMode( commandMapRequest, CM_NORMAL );
|
|
sys.setCMIconDrawMode( commandMapRequest, DM_ROTATED_MATERIAL );
|
|
sys.setCMIconSize( commandMapRequest, 24.0f );
|
|
sys.setCMIconUnknownSize( commandMapRequest, 16.0f );
|
|
sys.setCMIconColor( commandMapRequest, '1 1 1', 1.0f );
|
|
sys.flashCMIcon( commandMapRequest, -1, SPOTTED_FLASH_TIME, -1 );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::FreeRequestIcon
|
|
=====================
|
|
*/
|
|
void player::FreeRequestIcon() {
|
|
if( commandMapRequest != -1 ) {
|
|
sys.freeCMIcon( self, commandMapRequest );
|
|
commandMapRequest = -1;
|
|
}
|
|
sys.killThread( "RequestIcon_" + getName() );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::SetupMedicIcon
|
|
=====================
|
|
*/
|
|
void player::SetupMedicIcon() {
|
|
|
|
commandMapMedicIcon = sys.allocCMIcon( self, getFloatKey( "icon_sort_cm" ) );
|
|
sys.setCMIconMaterial( commandMapMedicIcon, GetMaterial( getClassKey( "mtr_cm_icon_need_revive" ) ) );
|
|
sys.setCMIconUnknownMaterial( commandMapMedicIcon, GetMaterial( getClassKey( "mtr_cm_icon_need_revive" ) ) );
|
|
sys.addCMIconRequirement( commandMapMedicIcon, getClassKey( "require_view_revive" ) );
|
|
sys.setCMIconColorMode( commandMapMedicIcon, CM_NORMAL );
|
|
sys.setCMIconDrawMode( commandMapMedicIcon, DM_ROTATED_MATERIAL );
|
|
sys.setCMIconSize( commandMapMedicIcon, 24.0f );
|
|
sys.setCMIconUnknownSize( commandMapMedicIcon, 16.0f );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::FreeMedicIcon
|
|
=====================
|
|
*/
|
|
void player::FreeMedicIcon() {
|
|
if( commandMapMedicIcon != -1 ) {
|
|
sys.freeCMIcon( self, commandMapMedicIcon );
|
|
commandMapMedicIcon = -1;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::OnScopeStateChanged
|
|
=====================
|
|
*/
|
|
void player::OnScopeStateChanged() {
|
|
entity weapon = getWeaponEntity();
|
|
if ( weapon != $null_entity ) {
|
|
weapon.vSetScopeState( sniperScopeUp );
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::syncFields
|
|
=====================
|
|
*/
|
|
void player::syncFields() {
|
|
sync( "reviveCount" );
|
|
|
|
syncBroadcast( "AI_HOLD_WEAPON" );
|
|
syncBroadcast( "sniperScopeUp" );
|
|
syncCallback( "sniperScopeUp", "OnScopeStateChanged" );
|
|
|
|
syncBroadcast( "ironSightUp" );
|
|
|
|
sync( "teleportSucceeded" );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::preinit
|
|
=====================
|
|
*/
|
|
void player::preinit() {
|
|
targetingPointValid = false;
|
|
|
|
commandMapRoleInfo = -1;
|
|
commandMapTrackingIcon = -1;
|
|
commandMapArcInfo = -1;
|
|
|
|
commandMapFireTeamInfo = -1;
|
|
commandMapMedicIcon = -1;
|
|
commandMapRequest = -1;
|
|
|
|
reviveQuickChat = -1;
|
|
reviveQuickChatAck = -1;
|
|
declinedQuickChat = -1;
|
|
vehicleWarningQuickChat = -1;
|
|
spawnHostSpawned = false;
|
|
chargeTimer = -1;
|
|
vehicleCreditTimer = sys.allocTargetTimer( VEHICLECREDIT_TIMER_NAME );
|
|
vehicleCreditChargeTime = GetGlobalFloat( VEHICLECREDIT_TIMER_NAME + "_time" );
|
|
|
|
fireTeamLeaderToolTip = GetToolTip( getKey( "tt_fireteam_become_leader" ) );
|
|
|
|
parachuteSpeed = getFloatKey( "parachute_speed" );
|
|
|
|
setPrefix( ANIMCHANNEL_TORSO, AP_CHANNEL_NAME, "torso" );
|
|
setPrefix( ANIMCHANNEL_LEGS, AP_CHANNEL_NAME, "legs" );
|
|
|
|
isPanting = false;
|
|
fallSoundThreadId = -1;
|
|
missionToolTipThreadId = -1;
|
|
targetLockCount = 0;
|
|
|
|
if ( sys.getLocalPlayer() == self ) {
|
|
hudObjectiveFlashThread = thread ObjectiveFlashThread();
|
|
sys.setGUIWString( GUI_GLOBALS_HANDLE, "gameHud.reviveText", wstr_empty );
|
|
} else {
|
|
hudObjectiveFlashThread = -1;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::destroy
|
|
=====================
|
|
*/
|
|
void player::destroy() {
|
|
FreeCommandMapIcons();
|
|
FreeMedicIcon();
|
|
FreeReviveTask();
|
|
FreeWaypointObject();
|
|
FreeRequestTask();
|
|
FreeEnemyRequestTask();
|
|
FreeSpawnHostTask();
|
|
OnClassChanged(); // Gordon: destroys stuff the player owned
|
|
sys.startSoundDirect( "", SND_PLAYER_FALL );
|
|
|
|
if ( hudObjectiveFlashThread != -1 ) {
|
|
sys.terminate( hudObjectiveFlashThread );
|
|
}
|
|
|
|
if ( missionToolTipThreadId != -1 ) {
|
|
sys.terminate( missionToolTipThreadId );
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::OnWeaponChanged
|
|
=====================
|
|
*/
|
|
void player::OnWeaponChanged() {
|
|
entity w = getWeaponEntity();
|
|
|
|
string energyKey = w.getKeyWithDefault( "timer_charge", "energy_timer" );
|
|
chargeTimer = sys.allocTargetTimer( energyKey );
|
|
energyChargeTime = GetGlobalFloat( energyKey + "_time" );
|
|
if ( energyChargeTime <= 0.f ) {
|
|
energyChargeTime = 1.f;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::InitWaypointObject
|
|
=====================
|
|
*/
|
|
void player::InitWaypointObject( vector pos ) {
|
|
team_base team = getGameTeam();
|
|
if ( team != $null ) {
|
|
FreeWaypointObject();
|
|
waypoint_info wayPoint = sys.spawn( team.getKey( "def_waypoint" ) );
|
|
wayPoint.Show( self, pos );
|
|
binAdd( wayPoint );
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::FreeWaypointObject
|
|
=====================
|
|
*/
|
|
void player::FreeWaypointObject() {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
waypoint_info waypoint = FindWaypointObject();
|
|
if ( waypoint != $null ) {
|
|
binRemove( waypoint );
|
|
waypoint.remove();
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::FindWaypointObject
|
|
=====================
|
|
*/
|
|
object player::FindWaypointObject() {
|
|
float i;
|
|
for ( i = 0; i < binGetSize(); i++ ) {
|
|
waypoint_info waypoint = binGet( i );
|
|
if ( waypoint != $null_entity ) {
|
|
return waypoint;
|
|
}
|
|
}
|
|
|
|
return $null;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::InitReviveTask
|
|
=====================
|
|
*/
|
|
void player::InitReviveTask() {
|
|
if ( IsReviveTask( requestTask ) ) {
|
|
return;
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null ) {
|
|
float reviveTaskInfo = GetPlayerTask( team.getKey( "task_revive" ) );
|
|
if ( reviveTaskInfo != -1 ) {
|
|
FreeRequestTask();
|
|
requestTask = taskManager.allocEntityTask( reviveTaskInfo, self );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::FreeReviveTask
|
|
=====================
|
|
*/
|
|
void player::FreeReviveTask() {
|
|
if ( IsReviveTask( requestTask ) ) {
|
|
requestTask.free();
|
|
requestTask = $null;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::CompleteReviveTask
|
|
=====================
|
|
*/
|
|
void player::CompleteReviveTask( entity p ) {
|
|
if ( IsReviveTask( requestTask ) ) {
|
|
if ( reviveReward ) {
|
|
team_base team = getGameTeam();
|
|
team.GiveReviveProficiency( p );
|
|
|
|
if ( waitedForRevive ) {
|
|
team.GiveReviveWaitProficiency( self );
|
|
}
|
|
}
|
|
|
|
requestTask.complete();
|
|
requestTask.free();
|
|
requestTask = $null;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vForceRespawn
|
|
=====================
|
|
*/
|
|
void player::vForceRespawn() {
|
|
forceRespawn();
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vNeedsRevive
|
|
=====================
|
|
*/
|
|
boolean player::vNeedsRevive( entity p ) {
|
|
if ( getEntityAllegiance( p ) != TA_FRIEND ) {
|
|
return false;
|
|
}
|
|
|
|
if ( !needsRevive() ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vRevive
|
|
=====================
|
|
*/
|
|
boolean player::vRevive( entity p, float healthScale ) {
|
|
if ( !vNeedsRevive( p ) ) {
|
|
return false;
|
|
}
|
|
|
|
float count = 1;
|
|
|
|
team_base team = p.getGameTeam();
|
|
if ( team.HasFastRevive( p ) ) {
|
|
count = count * 1.25f;
|
|
}
|
|
|
|
reviveCount = reviveCount + count;
|
|
|
|
if ( reviveCount < team.GetMaxReviveCount() ) {
|
|
return false;
|
|
}
|
|
|
|
if ( p.isLocalPlayer() ) {
|
|
sys.setGUIWString( GUI_GLOBALS_HANDLE, "gameHud.reviveText", wstr_empty );
|
|
}
|
|
|
|
if ( !sys.isClient() ) {
|
|
if ( HasSpawnHostTask() ) {
|
|
FreeSpawnHostTask();
|
|
}
|
|
|
|
CompleteReviveTask( p );
|
|
|
|
if ( p != $null_entity ) {
|
|
sys.increaseStatInt( sys.allocStatInt( team.getName() + "_revive_uses" ), p.getEntityNumber(), 1 );
|
|
sys.increaseStatInt( sys.allocStatInt( team.getName() + "_players_revived" ), p.getEntityNumber(), 1 );
|
|
}
|
|
|
|
// objManager.PushCPrintString( p.getUserName() );
|
|
// objManager.CPrintEvent( sys.localizeString( "game/revive/completed" ) );
|
|
|
|
revive( p, healthScale );
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::init
|
|
=====================
|
|
*/
|
|
void player::init() {
|
|
stroyentPerTransfer = getFloatKeyWithDefault( "stroyent_per_transfer", 80 );
|
|
healthPerTransfer = getFloatKeyWithDefault( "health_per_transfer", 10 );
|
|
|
|
OnNewModel();
|
|
|
|
if ( isLocalPlayer() ) {
|
|
float count = entitiesOfCollection( "objective_markers" );
|
|
float index;
|
|
for ( index = 0; index < count; index++ ) {
|
|
entity other = getBoundsCacheEntity( index );
|
|
other.vOnDeploy();
|
|
}
|
|
|
|
objManager.RefreshObjectiveEntity();
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::OnNewModel
|
|
=====================
|
|
*/
|
|
void player::OnNewModel() {
|
|
setPrefix( ANIMCHANNEL_TORSO, AP_CHANNEL_NAME, "torso" );
|
|
setPrefix( ANIMCHANNEL_LEGS, AP_CHANNEL_NAME, "legs" );
|
|
|
|
if ( getProxyEntity() == $null_entity && getHealth() > 0 ) {
|
|
animState( ANIMCHANNEL_TORSO, "Torso_Spawn", 0 );
|
|
animState( ANIMCHANNEL_LEGS, "Legs_Spawn", 0 );
|
|
}
|
|
|
|
SetupCommandMapIcons( true );
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::KillBreatheThread
|
|
================
|
|
*/
|
|
void player::KillBreatheThread() {
|
|
sys.killThread( "BreatheThread_" + getName() );
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::CreateBreatheThread
|
|
================
|
|
*/
|
|
void player::CreateBreatheThread() {
|
|
if ( sys.getLocalPlayer() == $null_entity ) {
|
|
return;
|
|
}
|
|
|
|
KillBreatheThread();
|
|
thread BreatheThread();
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::FallSoundThread
|
|
================
|
|
*/
|
|
void player::FallSoundThread( boolean create ) {
|
|
if ( create ) {
|
|
playingFallSound = true;
|
|
sys.startSoundDirect( getClassKey( "snd_freefall" ), SND_PLAYER_FALL );
|
|
} else {
|
|
playingFallSound = false;
|
|
sys.startSoundDirect( "", SND_PLAYER_FALL );
|
|
}
|
|
fallSoundThreadId = -1;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::KillFallSoundThread
|
|
================
|
|
*/
|
|
void player::KillFallSoundThread() {
|
|
if ( playingFallSound ) {
|
|
if ( fallSoundThreadId != -1 ) {
|
|
sys.terminate( fallSoundThreadId );
|
|
fallSoundThreadId = -1;
|
|
}
|
|
fallSoundThreadId = thread FallSoundThread( false );
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::CreateFallSoundThread
|
|
================
|
|
*/
|
|
void player::CreateFallSoundThread() {
|
|
if ( sys.getLocalPlayer() != self || sys.getLocalPlayer() == $null_entity || playingFallSound ) {
|
|
return;
|
|
}
|
|
|
|
if ( fallSoundThreadId == -1 ) {
|
|
fallSoundThreadId = thread FallSoundThread( true );
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnProficiencyChanged
|
|
================
|
|
*/
|
|
void player::OnProficiencyChanged( float type, float oldLevel, float newLevel ) {
|
|
team_base team = getGameTeam();
|
|
if ( team != $null_entity ) {
|
|
team.OnProficiencyUpgrade( self, type, oldLevel, newLevel );
|
|
}
|
|
|
|
entity weapon = getWeaponEntity();
|
|
if ( weapon != $null_entity ) {
|
|
weapon.vCheckProficiency();
|
|
}
|
|
|
|
if ( targetingItem != $null_entity ) {
|
|
targetingItem.vCheckProficiency();
|
|
}
|
|
|
|
entity vehicle = getVehicle();
|
|
if ( vehicle != $null_entity ) {
|
|
vehicle.vCheckProficiency();
|
|
}
|
|
|
|
if( self == sys.getLocalViewPlayer() ) {
|
|
if ( team != $null_entity ) {
|
|
sys.startSoundDirect( team.getKey( "snd_prof_unlock" ), SND_ANY );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnRankChanged
|
|
================
|
|
*/
|
|
void player::OnRankChanged( float rankLevel ) {
|
|
if( self == sys.getLocalViewPlayer() && getGameTeam() != $null_entity ) {
|
|
if ( rankLevel > 0 ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.newRank", 0 );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.newRank", 1 );
|
|
thread NewRankVOThread( rankLevel );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnSpawn
|
|
================
|
|
*/
|
|
void player::OnSpawn( boolean isRevived, boolean parachute ) {
|
|
lastRespawnTime = sys.getTime();
|
|
isPanting = false;
|
|
hideNormalChargeBar = false;
|
|
|
|
playingReviveMeAnimTorso = false;
|
|
playingReviveMeAnimLegs = false;
|
|
|
|
if ( spawnHostSpawned || isRevived ) {
|
|
makeInvulnerable( 2.f );
|
|
} else if ( parachute ) {
|
|
makeInvulnerable( 8.f );
|
|
} else {
|
|
makeInvulnerable( 5.f );
|
|
}
|
|
spawnHostSpawned = false;
|
|
|
|
FreeReviveTask();
|
|
FreeMedicIcon();
|
|
SetupCommandMapIcons( true );
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null_entity ) {
|
|
string teamName = team.getName();
|
|
//playOriginEffect( "fx_spawn_" + teamName, "", getJointPos( getJointHandle( "origin" ) ), getWorldAxis( 2 ), 0 );
|
|
|
|
reviveQuickChat = GetQuickChat( "qc_" + teamName + "_" + getClassName() + "_" + getKey( "qc_revive" ) );
|
|
reviveQuickChatAck = GetQuickChat( "qc_" + teamName + "_" + getClassName() + "_" + getKey( "qc_revive_ack" ) );
|
|
declinedQuickChat = GetQuickChat( teamName + "/quickchat/responses/declined" );
|
|
vehicleWarningQuickChat = GetQuickChat( teamName + "/quickchat/responses/acknowledged" );
|
|
}
|
|
|
|
if ( !isRevived ) {
|
|
if ( team != $null_entity ) {
|
|
team.GiveSpawnItems( self );
|
|
}
|
|
|
|
if ( !sys.isClient() ) {
|
|
float baseHealth = 100.f;
|
|
|
|
float boost = 0;
|
|
if ( team != $null_entity ) {
|
|
boost = team.GetHealthBoost( self );
|
|
}
|
|
setMaxHealth( baseHealth + boost );
|
|
setHealth( baseHealth + boost );
|
|
}
|
|
|
|
if ( g_maxProficiency.getBoolValue() ) {
|
|
giveProficiency( GetProficiency( "pro_soldier_test" ), 15.f, $null, "MAX PROFICIENCY" );
|
|
giveProficiency( GetProficiency( "pro_medic_test" ), 15.f, $null, "MAX PROFICIENCY" );
|
|
giveProficiency( GetProficiency( "pro_engineer_test" ), 15.f, $null, "MAX PROFICIENCY" );
|
|
giveProficiency( GetProficiency( "pro_fieldops_test" ), 15.f, $null, "MAX PROFICIENCY" );
|
|
giveProficiency( GetProficiency( "pro_covertops_test" ), 15.f, $null, "MAX PROFICIENCY" );
|
|
giveProficiency( GetProficiency( "pro_vehicle_test" ), 15.f, $null, "MAX PROFICIENCY" );
|
|
giveProficiency( GetProficiency( "pro_light_weapons_test" ), 15.f, $null, "MAX PROFICIENCY" );
|
|
giveProficiency( GetProficiency( "pro_battlesense_test" ), 15.f, $null, "MAX PROFICIENCY" );
|
|
}
|
|
}
|
|
|
|
if( !sys.isClient() ) {
|
|
if ( parachute ) {
|
|
respawningChute = true;
|
|
if ( !NeedsParachute() ) {
|
|
sys.print( "failed\n" );
|
|
}
|
|
OnHitActivate();
|
|
}
|
|
}
|
|
|
|
if ( team != $null_entity ) {
|
|
CreateBreatheThread();
|
|
}
|
|
|
|
progressBarHideTime = 0.0f;
|
|
|
|
if( self == sys.getLocalPlayer() ) {
|
|
float hudHandle = getGUI( "hud" );
|
|
if ( hudHandle != GUI_INVALID ) {
|
|
sys.guiPostNamedEvent( hudHandle, "", "OnSpawn" );
|
|
}
|
|
}
|
|
|
|
sniperScopeUp = false;
|
|
|
|
if ( team != $null_entity ) {
|
|
team.CreatePersonnelAuras( self );
|
|
}
|
|
|
|
if ( isLocalPlayer() ) {
|
|
sys.setGUIWString( GUI_GLOBALS_HANDLE, "gameHud.reviveText", wstr_empty );
|
|
if ( !isRevived ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.activeCrosshairInfoFlags", CF_CROSSHAIR | CF_PLAYER_ICONS | CF_TASKS | CF_OBJ_MIS );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnKilled
|
|
================
|
|
*/
|
|
void player::OnKilled( entity inflictor, entity attacker, float damage, vector direction, float location ) {
|
|
waitedForRevive = false;
|
|
|
|
boolean spectating;
|
|
team_base team = getGameTeam();
|
|
if ( team == $null_entity ) {
|
|
spectating = true;
|
|
}
|
|
|
|
KillRegenThread();
|
|
FreeRequestTask();
|
|
FreeEnemyRequestTask();
|
|
|
|
reviveReward = getEntityAllegiance( inflictor ) != TA_FRIEND;
|
|
reviveCount = 0;
|
|
|
|
entity other;
|
|
float count;
|
|
float index;
|
|
|
|
boolean toolTipSent;
|
|
|
|
if ( isLocalPlayer() ) {
|
|
sys.startSoundDirect( "", SND_PLAYER_ALARM );
|
|
|
|
if ( objManager.gameState == GS_GAMEON ) {
|
|
if ( inflictor != $null_entity ) {
|
|
if ( !toolTipSent && inflictor.inCollection( "mine" ) ) {
|
|
if ( !isSinglePlayerToolTipPlaying() ) {
|
|
toolTipSent = true;
|
|
cancelToolTips();
|
|
sendToolTip( GetToolTip( getKey( "tt_killed_by_mine" ) ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !spectating ) {
|
|
if ( !toolTipSent ) {
|
|
if( getHealth() > LIMBO_FORCE_HEALTH ) { // FIXME: MAKE FUNCTION
|
|
if ( !isSinglePlayerToolTipPlaying() ) {
|
|
toolTipSent = true;
|
|
cancelToolTips();
|
|
sendToolTip( team.unconsciousToolTip );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
player pAttacker = attacker;
|
|
if ( pAttacker != $null_entity ) {
|
|
if ( !toolTipSent && pAttacker.isDisguised() ) {
|
|
if ( !isSinglePlayerToolTipPlaying() ) {
|
|
toolTipSent = true;
|
|
cancelToolTips();
|
|
sendToolTip( team.killedByDisguisedToolTip );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sys.setGUIWString( GUI_GLOBALS_HANDLE, "gameHud.reviveText", wstr_empty );
|
|
}
|
|
|
|
// see if we're in limbo
|
|
if( getHealth() > LIMBO_FORCE_HEALTH ) { // FIXME: MAKE FUNCTION
|
|
// broadcast a "Medic!" quickchat
|
|
if ( !sys.isClient() ) {
|
|
entitiesOfClass( sys.getTypeHandle( "idPlayer" ), 0 );
|
|
count = filterEntitiesByAllegiance( TA_FLAG_FRIEND, 1 );
|
|
|
|
for ( index = 0; index < count; index++ ) {
|
|
other = getBoundsCacheEntity( index );
|
|
if ( other != self && other.hasAbility( "revive" ) ) {
|
|
sys.sendQuickChat( self, reviveQuickChat, other );
|
|
}
|
|
}
|
|
}
|
|
|
|
FreeCommandMapIcons();
|
|
SetupMedicIcon();
|
|
InitReviveTask();
|
|
}
|
|
|
|
if ( !spectating ) {
|
|
playOriginEffect( "fx_killed", "", getJointPos( getJointHandle( "origin" ) ), getWorldAxis( 2 ), 0 );
|
|
}
|
|
|
|
entity next;
|
|
entity current;
|
|
for ( current = getNextTeamEntity(); current != $null_entity; current = next ) {
|
|
next = current.getNextTeamEntity();
|
|
current.vOnBindMasterDestroyed();
|
|
}
|
|
|
|
count = entitiesOfCollection( "playerkilledwatch" );
|
|
for ( index = 0; index < count; index++ ) {
|
|
other = getBoundsCacheEntity( index );
|
|
other.vOnPlayerKilled( self );
|
|
}
|
|
|
|
other = GetParachute();
|
|
if ( other != $null_entity ) {
|
|
other.vCancel();
|
|
}
|
|
|
|
if ( !spectating ) {
|
|
team.OnPlayerDied( self );
|
|
}
|
|
|
|
KillBreatheThread();
|
|
isPanting = false;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnPain
|
|
================
|
|
*/
|
|
void player::OnPain( entity inflictor, entity attacker, float damage, vector direction, float location ) {
|
|
// pass this through to the vehicle
|
|
entity proxy = getProxyEntity();
|
|
if ( proxy != $null_entity ) {
|
|
proxy.vOnPassengerPain( inflictor, attacker, damage, direction, location );
|
|
}
|
|
|
|
// pass this through to the remote camera
|
|
entity remoteCamera = getRemoteCamera();
|
|
if ( remoteCamera != $null_entity ) {
|
|
remoteCamera.vOnPassengerPain( inflictor, attacker, damage, direction, location );
|
|
}
|
|
|
|
float health = getHealth();
|
|
if ( health < 45 && health > 0 ) {
|
|
if ( isLocalPlayer() ) {
|
|
if ( !isSinglePlayerToolTipPlaying() ) {
|
|
cancelToolTips();
|
|
float playerClass = getPlayerClass();
|
|
team_base team = getGameTeam();
|
|
if ( playerClass == g_playerClassMedic || playerClass == g_playerClassTechnician ) {
|
|
sendToolTip( team.lowHealthSelfToolTip );
|
|
} else {
|
|
sendToolTip( team.lowHealthToolTip );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnUpdateCrosshairInfo
|
|
================
|
|
*/
|
|
float player::OnUpdateCrosshairInfo( entity p ) {
|
|
if ( !sys.doClientSideStuff() ) {
|
|
return 1.f;
|
|
}
|
|
|
|
float allegiance = getEntityAllegiance( p );
|
|
if ( allegiance == TA_ENEMY ) {
|
|
if ( isDisguised() ) {
|
|
allegiance = TA_FRIEND;
|
|
}
|
|
}
|
|
|
|
vector color = GetAllegianceColor( allegiance );
|
|
string title;
|
|
float distance = chGetDistance();
|
|
float range = InchesToMetres( distance );
|
|
|
|
vector up;
|
|
up_z = 16.f;
|
|
|
|
chSetNumLines( 0 );
|
|
float index;
|
|
|
|
index = chAddLine();
|
|
chSetLineText( index, GetDisguisedTitle( p ) );
|
|
chSetLineColor( index, color, 1.f );
|
|
chSetLineType( index, CI_TEXT );
|
|
chSetLineSize( index, 0, 0 );
|
|
|
|
if ( needsRevive() ) {
|
|
index = chAddLine();
|
|
chSetLineType( index, CI_TEXT );
|
|
chSetLineSize( index, 0, 0 );
|
|
chSetLineTextIndex( index, g_locStr_Unconscious );
|
|
chSetLineColor( index, color, 1.f );
|
|
|
|
up_z = 32.f;
|
|
} else if ( getHealth() <= 0 ) {
|
|
index = chAddLine();
|
|
chSetLineType( index, CI_TEXT );
|
|
chSetLineSize( index, 0, 0 );
|
|
chSetLineTextIndex( index, g_locStr_Dead );
|
|
chSetLineColor( index, color, 1.f );
|
|
|
|
up_z = 32.f;
|
|
} else {
|
|
boolean showHealth;
|
|
if ( allegiance == TA_FRIEND ) {
|
|
showHealth = distance < 2048;
|
|
} else {
|
|
showHealth = distance < 1024;
|
|
}
|
|
if ( showHealth ) {
|
|
index = chAddLine();
|
|
chSetLineType( index, CI_BAR );
|
|
chSetLineSize( index, 50, CROSSHAIR_INFO_BAR_HEIGHT );
|
|
chSetLineFraction( index, getHealth() / getMaxHealth() );
|
|
chSetLineColor( index, color, 0.5f );
|
|
}
|
|
}
|
|
|
|
index = chAddLine();
|
|
chSetLineText( index, G_BuildRangeStr( range ) );
|
|
chSetLineColor( index, color, 1.f );
|
|
chSetLineType( index, CI_TEXT );
|
|
chSetLineSize( index, 0, 0 );
|
|
|
|
team_base team = getGameTeam();
|
|
|
|
if ( p != $null_entity ) {
|
|
float code = GetActivateCode( p, distance );
|
|
if ( code != AK_NONE ) {
|
|
if ( p.vHasActionItem( code ) ) {
|
|
index = chAddLine();
|
|
chSetLineMaterial( index, p.vGetActionIcon( code ) );
|
|
chSetLineType( index, CI_IMAGE );
|
|
chSetLineSize( index, 64, 64 );
|
|
chSetLineColor( index, g_colorWhite, 0.9f );
|
|
|
|
if ( p.isLocalPlayer() ) {
|
|
if ( !p.isToolTipPlaying() ) {
|
|
if ( sys.getTime() - p.getCrosshairStartTime() > 1.f ) {
|
|
if ( code == AK_REVIVE ) {
|
|
if ( p.getCurrentWeapon() != p.vGetActionItem( code ) ) {
|
|
p.sendToolTip( team.reviveMeToolTip1 );
|
|
} else {
|
|
p.sendToolTip( team.reviveMeToolTip2 );
|
|
}
|
|
} else if ( code == AK_SPAWNHOST ) {
|
|
if ( p.getCurrentWeapon() != p.vGetActionItem( code ) ) {
|
|
p.sendToolTip( team.spawnHostMeToolTip1 );
|
|
} else {
|
|
p.sendToolTip( team.spawnHostMeToolTip2 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else if ( p.vHasActionItem( AK_DISGUISE ) && p.vGetCarryableItem() != $null_entity ) {
|
|
if ( distance < 128.f ) {
|
|
if ( sys.getTime() - p.getCrosshairStartTime() > 1.f ) {
|
|
if ( !p.isToolTipPlaying() ) {
|
|
p.sendToolTip( GetToolTip( p.getKey( "tt_nodisguise_carryable" ) ) );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return 1.f;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::GetDisguisedTitle
|
|
================
|
|
*/
|
|
wstring player::GetDisguisedTitle( entity p ) {
|
|
if ( isDisguised() && getEntityAllegiance( p ) == TA_ENEMY ) {
|
|
return getCrosshairTitle( true );
|
|
}
|
|
|
|
return getCrosshairTitle( false );
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::LocalViewerUpdate
|
|
================
|
|
*/
|
|
void player::LocalViewerUpdate() {
|
|
team_base team = getGameTeam();
|
|
if( team != $null_entity ) {
|
|
sys.setGUIWString( GUI_GLOBALS_HANDLE, "gameHud.teamMineStatus", sys.toWStr( team.GetMineLimit() - G_CountMinesOwnedByEntity( self ) ) );
|
|
}
|
|
|
|
if ( !hideNormalChargeBar ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "weapons.energyBarCharge", 1 - EnergyBar_CalcChargeUsed() );
|
|
}
|
|
|
|
entity proxy = getProxyEntity();
|
|
if ( proxy != $null_entity ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.targetLockCount", proxy.vGetTargetLockCount() );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.targetLockCountBasedefence", proxy.vGetTargetLockCountBasedefence() );
|
|
} else {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.targetLockCountDeployable", targetLockCount );
|
|
}
|
|
|
|
if( targetingItem != $null_entity ) {
|
|
targetingItem.vUpdateFiringStatusObject( self );
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::ScanForMines
|
|
================
|
|
*/
|
|
void player::ScanForMines() {
|
|
entitiesOfCollection( "mine" );
|
|
filterEntitiesByAllegiance( TA_FLAG_ENEMY, 1 );
|
|
float count = filterEntitiesByRadius( getWorldOrigin(), 512.f, 1 );
|
|
|
|
float time = sys.getTime();
|
|
float index;
|
|
for ( index = 0; index < count; index++ ) {
|
|
entity ent = getBoundsCacheEntity( index );
|
|
ent.vSetSpotTime( time );
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
LocalPlayerUpdateThread
|
|
================
|
|
*/
|
|
void LocalPlayerUpdateThread() {
|
|
player viewer;
|
|
player localPlayer;
|
|
boolean needsParachute;
|
|
boolean usingParachute;
|
|
boolean useParachuteToolTip;
|
|
team_base team;
|
|
|
|
sys.threadName( "LocalPlayerUpdateThread" );
|
|
|
|
while( true ) {
|
|
sys.waitFrame();
|
|
|
|
viewer = sys.getLocalViewPlayer();
|
|
if ( viewer == $null_entity ) {
|
|
continue;
|
|
}
|
|
|
|
localPlayer = sys.getLocalPlayer();
|
|
team = $null;
|
|
if ( localPlayer != $null_entity ) {
|
|
team = localPlayer.getGameTeam();
|
|
}
|
|
|
|
viewer.LocalViewerUpdate();
|
|
if ( viewer.progressBarHideTime < sys.getTime() ) {
|
|
SetProgressBarVisible( false );
|
|
}
|
|
|
|
needsParachute = false;
|
|
usingParachute = false;
|
|
|
|
if ( localPlayer != $null_entity ) {
|
|
if ( localPlayer == viewer ) {
|
|
needsParachute = localPlayer.NeedsParachute();
|
|
}
|
|
|
|
if ( localPlayer.getProficiency( g_proficiencyBattleSense ) >= 3 ) {
|
|
localPlayer.ScanForMines();
|
|
}
|
|
|
|
if ( localPlayer.GetParachute() != $null_entity ) {
|
|
usingParachute = true;
|
|
useParachuteToolTip = false;
|
|
}
|
|
|
|
if ( needsParachute && !usingParachute ) {
|
|
if ( !useParachuteToolTip ) {
|
|
localPlayer.cancelToolTips();
|
|
localPlayer.sendToolTip( team.parachuteToolTip );
|
|
useParachuteToolTip = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.needsParachute", needsParachute );
|
|
if ( team == $null_entity && viewer == localPlayer ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.spectatingRespawnTime", 0 );
|
|
}
|
|
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.parachuteActive", usingParachute );
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::EnergyBar_Remove
|
|
================
|
|
*/
|
|
boolean player::EnergyBar_Remove( float amount ) {
|
|
if ( chargeTimer == -1 ) {
|
|
return false;
|
|
}
|
|
|
|
float chargeUsed = EnergyBar_CalcChargeUsed();
|
|
|
|
if ( ( chargeUsed + amount ) > 1.f ) {
|
|
return false;
|
|
}
|
|
|
|
chargeUsed = chargeUsed + amount;
|
|
sys.setTargetTimerValue( chargeTimer, self, sys.getTime() + ( chargeUsed * energyChargeTime ) );
|
|
|
|
chargeUsed = EnergyBar_CalcChargeUsed();
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/*
|
|
================
|
|
player::EnergyBar_CanRemove
|
|
================
|
|
*/
|
|
boolean player::EnergyBar_CanRemove( float amount ) {
|
|
float chargeUsed = EnergyBar_CalcChargeUsed();
|
|
|
|
if( ( chargeUsed + amount ) > 1.f ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/*
|
|
================
|
|
player::EnergyBar_CalcChargeUsed
|
|
================
|
|
*/
|
|
float player::EnergyBar_CalcChargeUsed() {
|
|
float chargeUsed = sys.getTargetTimerValue( chargeTimer, self ) - sys.getTime();
|
|
if ( chargeUsed < 0 ) {
|
|
return 0;
|
|
}
|
|
|
|
return chargeUsed / energyChargeTime;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::vHideNormalChargeBar
|
|
================
|
|
*/
|
|
void player::vHideNormalChargeBar( boolean h ) {
|
|
hideNormalChargeBar = h;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnEnterVehicle
|
|
================
|
|
*/
|
|
void player::OnEnterVehicle( entity vehicle, float positionIndex, float oldPositionIndex ) {
|
|
hideNormalChargeBar = true;
|
|
if ( sys.getLocalViewPlayer() == self ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "weapons.energyBarCharge", 1 );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "weapons.energyAvailable", 1 );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "weapons.cooling", 0 );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.weaponShowCharge", 1 );
|
|
}
|
|
|
|
// hide our icons if we're in a vehicle
|
|
if ( self != sys.getLocalViewPlayer() ) {
|
|
if ( commandMapRoleInfo != -1 ) {
|
|
sys.hideCMIcon( commandMapRoleInfo );
|
|
}
|
|
if ( commandMapFireTeamInfo != -1 ) {
|
|
sys.hideCMIcon( commandMapFireTeamInfo );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnExitVehicle
|
|
================
|
|
*/
|
|
void player::OnExitVehicle( entity vehicle, float positionIndex ) {
|
|
hideNormalChargeBar = false;
|
|
|
|
if ( self != sys.getLocalPlayer() ) {
|
|
if ( commandMapRoleInfo != -1 ) {
|
|
sys.showCMIcon( commandMapRoleInfo );
|
|
}
|
|
if ( commandMapFireTeamInfo != -1 ) {
|
|
sys.showCMIcon( commandMapFireTeamInfo );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::IsGDF
|
|
================
|
|
*/
|
|
boolean player::IsGDF() {
|
|
team_gdf team = getGameTeam();
|
|
return team != $null_entity;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::IsStrogg
|
|
================
|
|
*/
|
|
boolean player::IsStrogg() {
|
|
team_strogg team = getGameTeam();
|
|
return team != $null_entity;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnFullyKilled
|
|
================
|
|
*/
|
|
void player::OnFullyKilled() {
|
|
FreeEnemyRequestTask();
|
|
FreeReviveTask();
|
|
FreeSpawnHostTask();
|
|
FreeMedicIcon();
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null_entity ) {
|
|
team.OnPlayerTapOut( self );
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::DestroyMines
|
|
================
|
|
*/
|
|
void player::DestroyMines() {
|
|
float count = entitiesOfCollection( "mine" );
|
|
float index;
|
|
for ( index = 0; index < count; index++ ) {
|
|
entity mine = getBoundsCacheEntity( index );
|
|
if ( mine.vGetOwner() == self ) {
|
|
mine.vSetOwner( $null_entity );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::DestroyBinObjects
|
|
================
|
|
*/
|
|
void player::DestroyBinObjects() {
|
|
float i;
|
|
float num = binGetSize();
|
|
|
|
for ( i = 0; i < num; i++ ) {
|
|
entity other = binGet( i );
|
|
if ( other != $null_entity ) {
|
|
other.vRemoveObject();
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnClassChanged
|
|
================
|
|
*/
|
|
void player::OnClassChanged() {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
float count = entitiesOfCollection( "deliver" );
|
|
float i = 0;
|
|
for ( ; i < count; i++ ) {
|
|
entity e = getBoundsCacheEntity( i );
|
|
e.vCancelDeployForPlayer( getEntityNumber() );
|
|
}
|
|
|
|
if ( targetingItem != $null_entity ) {
|
|
targetingItem.vDismantle( self );
|
|
SetTargetingItem( $null_entity );
|
|
}
|
|
|
|
sys.clearDeployRequest( getEntityNumber() );
|
|
|
|
entity other;
|
|
count = entitiesOfCollection( "carryables" );
|
|
for ( i = 0; i < count; i++ ) {
|
|
other = getBoundsCacheEntity( i );
|
|
other.vOnPlayerKilled( self );
|
|
}
|
|
|
|
DestroyBinObjects();
|
|
DestroyMines();
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnSetTeam
|
|
================
|
|
*/
|
|
void player::OnSetTeam( object oldTeam, object newTeam ) {
|
|
stopSound( SND_PLAYER_MOVE );
|
|
|
|
FreeWaypointObject();
|
|
FreeEnemyRequestTask();
|
|
DestroyBinObjects();
|
|
DestroyMines();
|
|
|
|
if ( targetingItem != $null_entity ) {
|
|
targetingItem.vDismantle( self );
|
|
SetTargetingItem( $null_entity );
|
|
}
|
|
|
|
team_base team = newTeam;
|
|
if ( team != $null_entity ) {
|
|
team.OnPlayerJoined( self );
|
|
}
|
|
|
|
if ( isLocalPlayer() ) {
|
|
// Gordon: certain things are based on the local player's team
|
|
float index;
|
|
float count = entitiesOfCollection( "localteamwatch" );
|
|
for ( index = 0; index < count; index++ ) {
|
|
entity other = getBoundsCacheEntity( index );
|
|
other.vOnLocalTeamChanged();
|
|
}
|
|
}
|
|
|
|
SetupCommandMapIcons( true );
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnActivate
|
|
================
|
|
*/
|
|
float player::OnActivate( entity p, float distance ) {
|
|
if ( sys.isClient() ) {
|
|
return 0.f;
|
|
}
|
|
|
|
float action = GetActivateCode( p, distance );
|
|
if ( distance < 128.f ) {
|
|
if ( p.vSelectActionItem( action ) ) {
|
|
return 1.f;
|
|
}
|
|
}
|
|
|
|
return 0.f;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::vPossess
|
|
================
|
|
*/
|
|
void player::vPossess( entity p ) {
|
|
team_base team = getGameTeam();
|
|
if ( team != $null_entity ) {
|
|
sys.broadcastToolTip( team.possessingMeToolTip, self, wstr_empty, wstr_empty, wstr_empty, wstr_empty );
|
|
}
|
|
|
|
forceRespawn();
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::CanStab
|
|
================
|
|
*/
|
|
boolean player::CanStab( entity stabbee ) {
|
|
if ( stabbee.isInvulnerable() ) {
|
|
return false;
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team == $null ) {
|
|
return false;
|
|
}
|
|
|
|
if ( !team.CanStab( self ) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( stabbee.isInWater() > 0.5f ) {
|
|
return false;
|
|
}
|
|
|
|
if ( stabbee.getHealth() <= 0 ) {
|
|
return false;
|
|
}
|
|
|
|
if ( getEntityAllegiance( stabbee ) == TA_FRIEND ) {
|
|
return false;
|
|
}
|
|
|
|
vector myAngles;
|
|
vector stabAngles;
|
|
|
|
if ( getProxyEntity() != $null_entity ) {
|
|
myAngles = getRenderViewAngles();
|
|
} else {
|
|
myAngles = getViewAngles();
|
|
}
|
|
|
|
stabAngles = stabbee.getViewAngles();
|
|
|
|
// ignore pitch
|
|
myAngles_x = 0;
|
|
stabAngles_x = 0;
|
|
|
|
vector myForwards = sys.angToForward( myAngles );
|
|
vector stabForwards = sys.angToForward( stabAngles );
|
|
|
|
vector delta = stabbee.getWorldOrigin() - getWorldOrigin();
|
|
if ( myForwards * delta > 0.0f && myForwards * stabForwards > 0.174f ) {
|
|
if ( sys.vecLength( delta ) < 64.0f ) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::GetActivateCode
|
|
================
|
|
*/
|
|
float player::GetActivateCode( entity p, float distance ) {
|
|
if ( p.getViewingEntity() != p ) {
|
|
return AK_NONE;
|
|
}
|
|
|
|
if ( p.getHealth() <= 0 ) {
|
|
return AK_NONE;
|
|
}
|
|
|
|
team_base team = p.getGameTeam();
|
|
float allegiange = getEntityAllegiance( p );
|
|
|
|
if ( distance < 128.f ) {
|
|
if ( needsRevive() ) {
|
|
if ( allegiange == TA_FRIEND ) {
|
|
return AK_REVIVE;
|
|
}
|
|
|
|
if ( allegiange == TA_ENEMY ) {
|
|
if ( team.HasActionItem( p, AK_SPAWNHOST ) ) {
|
|
return AK_SPAWNHOST;
|
|
}
|
|
|
|
if ( p.vGetCarryableItem() == $null_entity ) {
|
|
return AK_DISGUISE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( distance < 128.f ) {
|
|
if ( allegiange == TA_ENEMY ) {
|
|
if ( !isDisguised() ) {
|
|
player playerOther = p;
|
|
if ( playerOther.CanStab( self ) ) {
|
|
return AK_STAB;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return AK_NONE;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnDisguised
|
|
================
|
|
*/
|
|
void player::OnDisguised( entity p ) {
|
|
SetupCommandMapIcons( true );
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null ) {
|
|
team.UpdateStealth( self );
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnConsumeHealth
|
|
transfer health to stroyent
|
|
================
|
|
*/
|
|
void player::OnConsumeHealth() {
|
|
team_base team = getGameTeam();
|
|
if ( !team.CanTransferStroyent( self ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( sys.getTime() < nextStroyentTransferTime ) {
|
|
sys.broadcastToolTip( GetToolTip( getKey( "tt_stroytransfer_fail" ) ), self, wstr_empty, wstr_empty, wstr_empty, wstr_empty );
|
|
return;
|
|
}
|
|
|
|
float health = getHealth();
|
|
|
|
// get the stroyent
|
|
float stroySauce = getAmmo( g_ammoStroyent );
|
|
float maxStroy = getMaxAmmo( g_ammoStroyent );
|
|
float refillAmount = maxStroy - stroySauce;
|
|
if ( refillAmount > stroyentPerTransfer ) {
|
|
refillAmount = stroyentPerTransfer;
|
|
}
|
|
|
|
float healthAmount = refillAmount * healthPerTransfer / stroyentPerTransfer;
|
|
|
|
refillAmount *= 0.8f;
|
|
|
|
if ( health >= healthAmount + 1 && stroySauce < maxStroy ) {
|
|
if ( unheal( healthAmount ) > 0 ) {
|
|
nextStroyentTransferTime = sys.getTime() + 0.2;
|
|
setAmmo( g_ammoStroyent, stroySauce + refillAmount );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnConsumeStroyent
|
|
transfer stroyent to health
|
|
================
|
|
*/
|
|
void player::OnConsumeStroyent() {
|
|
team_base team = getGameTeam();
|
|
if ( !team.CanTransferStroyent( self ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( sys.getTime() < nextStroyentTransferTime ) {
|
|
sys.broadcastToolTip( GetToolTip( getKey( "tt_stroytransfer_fail" ) ), self, wstr_empty, wstr_empty, wstr_empty, wstr_empty );
|
|
return;
|
|
}
|
|
|
|
// get the stroyent
|
|
float stroySauce = getAmmo( g_ammoStroyent );
|
|
float health = getHealth();
|
|
float maxHealth = getMaxHealth();
|
|
float healAmount = maxHealth - health;
|
|
if ( healAmount > healthPerTransfer ) {
|
|
healAmount = healthPerTransfer;
|
|
}
|
|
|
|
float stroy = healAmount * stroyentPerTransfer / healthPerTransfer;
|
|
|
|
healAmount *= 0.8f;
|
|
|
|
if ( stroySauce >= stroy && health < maxHealth ) {
|
|
if ( heal( healAmount ) > 0 ) {
|
|
nextStroyentTransferTime = sys.getTime() + 0.2;
|
|
setAmmo( g_ammoStroyent, stroySauce - stroy );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::vCheckActionCode
|
|
================
|
|
*/
|
|
boolean player::vCheckActionCode( entity p, float actionCode ) {
|
|
if ( actionCode == AC_SPAWNHOST || actionCode == AC_POSSESS ) {
|
|
if ( getHealth() > 0 ) {
|
|
return false;
|
|
}
|
|
|
|
if ( getEntityAllegiance( p ) == TA_FRIEND ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::vSelectActionItem
|
|
================
|
|
*/
|
|
boolean player::vSelectActionItem( float code ) {
|
|
if ( getHealth() <= 0 ) {
|
|
return false;
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null_entity ) {
|
|
return team.SelectActionItem( self, code );
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::vHasActionItem
|
|
================
|
|
*/
|
|
boolean player::vHasActionItem( float code ) {
|
|
if ( getHealth() <= 0 ) {
|
|
return false;
|
|
}
|
|
|
|
if ( getViewingEntity() != self ) {
|
|
return false;
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null_entity ) {
|
|
return team.HasActionItem( self, code );
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::vGetActionItem
|
|
================
|
|
*/
|
|
string player::vGetActionItem( float code ) {
|
|
team_base team = getGameTeam();
|
|
if ( team != $null_entity ) {
|
|
return team.GetActionItem( self, code );
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::vGetActionIcon
|
|
================
|
|
*/
|
|
string player::vGetActionIcon( float code ) {
|
|
if ( getHealth() <= 0 ) {
|
|
return "";
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null_entity ) {
|
|
return team.GetActionIcon( self, code );
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::GetParachute
|
|
================
|
|
*/
|
|
parachute_base player::GetParachute() {
|
|
float i = 0;
|
|
for ( i = 0; i < binGetSize(); i++ ) {
|
|
parachute_base p = binGet( i );
|
|
if ( p != $null_entity ) {
|
|
return p;
|
|
}
|
|
}
|
|
|
|
return $null_entity;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::NeedsParachute
|
|
================
|
|
*/
|
|
boolean player::NeedsParachute() {
|
|
if ( getProxyEntity() != $null_entity ) {
|
|
return false;
|
|
}
|
|
|
|
if ( getHealth() <= 0 ) {
|
|
return false;
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team == $null ) {
|
|
return false;
|
|
}
|
|
|
|
if ( GetParachute() != $null_entity ) {
|
|
if ( respawningChute ) {
|
|
sys.print( "eep!\n" );
|
|
}
|
|
return false;
|
|
}
|
|
|
|
if ( respawningChute ) {
|
|
return true;
|
|
}
|
|
|
|
vector linearVelocity = InchesToMetres( getLinearVelocity() );
|
|
if ( linearVelocity_z > -parachuteSpeed ) {
|
|
return false;
|
|
}
|
|
|
|
// check if theres enough space below the owner to spawn a parachute
|
|
// ie, if the player has a fair way to fall
|
|
// use a vector that accounts for some of the forward velocity
|
|
float parachuteHeight = getFloatKey( "parachute_height" );
|
|
|
|
vector direction = sys.vecNormalize( linearVelocity );
|
|
direction = direction * parachuteHeight * 0.5f;
|
|
direction_z = -parachuteHeight;
|
|
vector origin = getWorldOrigin();
|
|
|
|
if ( sys.tracePoint( origin, origin + direction, MASK_PLAYERSOLID, self ) < 1.0f ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnHitActivate
|
|
================
|
|
*/
|
|
void player::OnHitActivate() {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
if ( !NeedsParachute() ) {
|
|
return;
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
|
|
string paraDef = team.getKey( "def_parachute" );
|
|
if ( paraDef != "" ) {
|
|
entity parachute = sys.spawn( paraDef );
|
|
if ( parachute != $null_entity ) {
|
|
parachute.vSetOwner( self );
|
|
if ( respawningChute ) {
|
|
parachute.vSetDelay( 0.8f );
|
|
}
|
|
respawningChute = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnJumpHeld
|
|
================
|
|
*/
|
|
void player::OnJumpHeld() {
|
|
OnHitActivate();
|
|
}
|
|
|
|
#include "script/player/mocap_player_state_machine.script"
|
|
#include "script/player/player_requests.script"
|
|
#include "script/player/player_state_machine_vehicles.script"
|
|
#include "script/player/player_state_machine_husky.script"
|
|
#include "script/player/dead_body.script"
|
|
|
|
|
|
/*
|
|
================
|
|
player::BreatheThread
|
|
================
|
|
*/
|
|
void player::BreatheThread() {
|
|
float breathing = 0.0f;
|
|
float soundEndTime = 0.0f;
|
|
float lastSoundLength = 0.0f;
|
|
isPanting = false;
|
|
while( true ) {
|
|
float oldBreathing = breathing;
|
|
|
|
//
|
|
// Logic for adjusting the breathing "bar"
|
|
//
|
|
|
|
float increase = 0.0f;
|
|
float decrease = 0.0f;
|
|
float frameTime = sys.getFrameTime();
|
|
boolean fiftyLimit = false;
|
|
|
|
vector velocity = getLinearVelocity();
|
|
velocity_z = 0.0f;
|
|
boolean moving = false;
|
|
float speed = sys.vecLength( velocity );
|
|
if ( speed > 10.0f ) {
|
|
moving = true;
|
|
}
|
|
|
|
// TODO: Move all the increase/decrease timing values into the defs, or at least precalculate them.
|
|
if ( AI_JUMP ) {
|
|
increase = 0.1f;
|
|
} else if ( !moving ) {
|
|
decrease = ( 1.0f / 5.0f ) * frameTime;
|
|
} else if ( !AI_ONGROUND ) {
|
|
decrease = ( 1.0f / 10.0f ) * frameTime;
|
|
} else if ( AI_CROUCH || AI_PRONE ) {
|
|
decrease = ( 1.0f / 5.0f ) * frameTime;
|
|
} else {
|
|
if ( AI_SPRINT ) {
|
|
increase = ( 1.0f / 20.0f ) * frameTime;
|
|
} else if ( AI_RUN ) {
|
|
if ( breathing <= 0.5f ) {
|
|
fiftyLimit = true;
|
|
increase = ( 1.0f / 40.0f ) * frameTime;
|
|
} else {
|
|
decrease = ( 1.0f / 5.0f ) * frameTime;
|
|
}
|
|
} else {
|
|
decrease = ( 1.0f / 5.0f ) * frameTime;
|
|
}
|
|
}
|
|
|
|
breathing = breathing + increase - decrease;
|
|
if ( fiftyLimit && breathing > 0.5f ) {
|
|
breathing = 0.5f;
|
|
}
|
|
if ( breathing < 0.0f ) {
|
|
breathing = 0.0f;
|
|
}
|
|
if ( breathing > 1.0f ) {
|
|
breathing = 1.0f;
|
|
}
|
|
|
|
//
|
|
// Sound hookups
|
|
//
|
|
float time = sys.getTime();
|
|
string sound = "";
|
|
if ( breathing >= 0.6f && breathing <= 0.8f ) {
|
|
sound = "snd_breathe";
|
|
} else if ( breathing > 0.8f ) {
|
|
sound = "snd_breathe_heavy";
|
|
isPanting = true;
|
|
}
|
|
|
|
if ( sound != "" && time > soundEndTime ) {
|
|
object team = getGameTeam();
|
|
if ( team != $null_entity ) {
|
|
sound = sound + "_" + team.getName();
|
|
lastSoundLength = startSound( sound, SND_PLAYER );
|
|
soundEndTime = time + lastSoundLength;
|
|
}
|
|
}
|
|
|
|
sys.waitFrame();
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::ShowProgressBar
|
|
================
|
|
*/
|
|
void player::ShowProgressBar( entity target, float action ) {
|
|
float value;
|
|
if ( sys.getLocalViewPlayer() == self ) {
|
|
value = target.vGetPliersProgressBarValue( action );
|
|
|
|
handle text = invalid_handle;
|
|
if ( action == AC_HACK ) {
|
|
text = g_locStr_Hacking;
|
|
} else if ( action == AC_ARM || action == AC_ARM_CHARGE ) {
|
|
text = g_locStr_Arming;
|
|
} else if ( action == AC_DISARM || action == AC_DISARM_CHARGE ) {
|
|
text = g_locStr_Disarming;
|
|
value = 1 - value;
|
|
} else if ( action == AC_REPAIR ) {
|
|
text = g_locStr_Repairing;
|
|
} else if ( action == AC_CONSTRUCT ) {
|
|
text = g_locStr_Constructing;
|
|
} else if ( action == AC_CAPTURE ) {
|
|
text = g_locStr_Capturing;
|
|
} else if ( action == AC_LIBERATE ) {
|
|
text = g_locStr_Liberating;
|
|
} else if ( action == AC_SPAWNHOST ) {
|
|
text = g_locStr_Implanting;
|
|
} else if ( action == AC_POSSESS ) {
|
|
text = g_locStr_Disguising;
|
|
} else if ( action == AC_REVIVE ) {
|
|
text = g_locStr_Reviving;
|
|
}
|
|
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "progressBar.percent", value );
|
|
sys.setGUIHandle( GUI_GLOBALS_HANDLE, "progressBar.text", text );
|
|
SetProgressBarVisible( true );
|
|
} else if ( target == sys.getLocalPlayer() ) {
|
|
if ( action == AC_REVIVE ) {
|
|
value = target.vGetPliersProgressBarValue( action );
|
|
sys.pushLocString( sys.toWStr( getUserName() ) );
|
|
|
|
sys.setGUIWString( GUI_GLOBALS_HANDLE, "gameHud.reviveText", sys.localizeStringArgs( "game/revive_by" ) );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "progressBar.percent", value );
|
|
SetProgressBarVisible( true );
|
|
}
|
|
}
|
|
|
|
progressBarHideTime = sys.getTime() + 0.25f;
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::SetSniperScopeUp
|
|
================
|
|
*/
|
|
void player::SetSniperScopeUp( boolean up ) {
|
|
if ( !sys.isClient() ) {
|
|
sniperScopeUp = up;
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::SetIronSightUp
|
|
================
|
|
*/
|
|
void player::SetIronSightUp( boolean up ) {
|
|
if ( !sys.isClient() ) {
|
|
ironSightUp = up;
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::GetDisguisedTeam
|
|
================
|
|
*/
|
|
object player::GetDisguisedTeam() {
|
|
team_base team = getGameTeam();
|
|
if ( !isDisguised() ) {
|
|
return team;
|
|
}
|
|
|
|
if ( team == gdfTeam ) {
|
|
return stroggTeam;
|
|
}
|
|
|
|
return gdfTeam;
|
|
}
|
|
|
|
object vehicle_base {
|
|
void CheckFireTeamInfo( boolean localExiting );
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnFireTeamJoined
|
|
================
|
|
*/
|
|
void player::OnFireTeamJoined() {
|
|
SetupCommandMapIcons( true );
|
|
|
|
entitiesOfClass( sys.getTypeHandle( "idPlayer" ), 0 );
|
|
float count = filterEntitiesByAllegiance( TA_FLAG_FRIEND, 1 );
|
|
|
|
float index;
|
|
for ( index = 0; index < count; index++ ) {
|
|
player other = getBoundsCacheEntity( index );
|
|
if ( other != self ) {
|
|
vehicle_base vehicle = other.getVehicle();
|
|
if ( vehicle != $null_entity ) {
|
|
vehicle.CheckFireTeamInfo( false );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !sys.isClient() ) {
|
|
count = binGetSize();
|
|
for ( index = 0; index < count; index++ ) {
|
|
entity ent = binGet( index );
|
|
if ( ent.inCollection( "waypoint" ) ) {
|
|
ent.remove();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
================
|
|
player::OnFireTeamBecomeLeader
|
|
================
|
|
*/
|
|
void player::OnFireTeamBecomeLeader() {
|
|
sendToolTip( fireTeamLeaderToolTip );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vShouldCreateSpawnHost
|
|
=====================
|
|
*/
|
|
boolean player::vShouldCreateSpawnHost( entity p ) {
|
|
if ( getEntityAllegiance( p ) != TA_ENEMY ) {
|
|
return false;
|
|
}
|
|
|
|
if ( !needsRevive() ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vCreateSpawnHost
|
|
=====================
|
|
*/
|
|
boolean player::vCreateSpawnHost( entity other, string hostName ) {
|
|
team_base team = getGameTeam();
|
|
if ( team != $null_entity ) {
|
|
sys.broadcastToolTip( team.spawnhostingMeToolTip, self, wstr_empty, wstr_empty, wstr_empty, wstr_empty );
|
|
}
|
|
|
|
forceRespawn();
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::AllocHealTask
|
|
=====================
|
|
*/
|
|
void player::AllocHealTask() {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
if ( requestTask != $null_entity ) {
|
|
if ( !requestTask.isUserCreated() ) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null ) {
|
|
float healTaskInfo = GetPlayerTask( team.getKey( "task_heal" ) );
|
|
if ( healTaskInfo != -1 ) {
|
|
FreeRequestTask();
|
|
requestTask = taskManager.allocEntityTask( healTaskInfo, self );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::AllocSupplyTask
|
|
=====================
|
|
*/
|
|
void player::AllocSupplyTask() {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null ) {
|
|
float supplyTaskInfo = GetPlayerTask( team.getKey( "task_supply" ) );
|
|
if ( supplyTaskInfo != -1 ) {
|
|
FreeRequestTask();
|
|
requestTask = taskManager.allocEntityTask( supplyTaskInfo, self );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::AllocPickupTask
|
|
=====================
|
|
*/
|
|
void player::AllocPickupTask() {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null ) {
|
|
float pickupTaskInfo = GetPlayerTask( team.getKey( "task_pickup" ) );
|
|
if ( pickupTaskInfo != -1 ) {
|
|
FreeRequestTask();
|
|
requestTask = taskManager.allocEntityTask( pickupTaskInfo, self );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::FreeRequestTask
|
|
=====================
|
|
*/
|
|
void player::FreeRequestTask() {
|
|
if ( requestTask != $null ) {
|
|
requestTask.free();
|
|
requestTask = $null;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::AllocSpawnHostTask
|
|
=====================
|
|
*/
|
|
void player::AllocSpawnHostTask() {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
if ( HasSpawnHostTask() ) {
|
|
return;
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null ) {
|
|
float spawnHostTaskInfo = GetPlayerTask( team.getKey( "task_create_spawn_host" ) );
|
|
if ( spawnHostTaskInfo != -1 ) {
|
|
spawnHostTask = taskManager.allocEntityTask( spawnHostTaskInfo, self );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::FreeSpawnHostTask
|
|
=====================
|
|
*/
|
|
void player::FreeSpawnHostTask() {
|
|
if ( spawnHostTask != $null ) {
|
|
spawnHostTask.free();
|
|
spawnHostTask = $null;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::AllocKillTask
|
|
=====================
|
|
*/
|
|
void player::AllocKillTask() {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
team_base team = getGameTeam();
|
|
if ( team != $null ) {
|
|
float killTaskInfo = GetPlayerTask( team.getKey( "task_kill" ) );
|
|
if ( killTaskInfo != -1 ) {
|
|
FreeEnemyRequestTask();
|
|
enemyRequestTask = taskManager.allocEntityTask( killTaskInfo, self );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::FreeEnemyRequestTask
|
|
=====================
|
|
*/
|
|
void player::FreeEnemyRequestTask() {
|
|
killTaskRequestee = $null_entity;
|
|
if ( enemyRequestTask != $null ) {
|
|
enemyRequestTask.free();
|
|
enemyRequestTask = $null;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::HasSpawnHostTask
|
|
=====================
|
|
*/
|
|
boolean player::HasSpawnHostTask() {
|
|
task_create_spawnhost other = spawnHostTask;
|
|
return other != $null;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vOnContextSpawnHost
|
|
=====================
|
|
*/
|
|
void player::vOnContextSpawnHost( entity p ) {
|
|
AllocSpawnHostTask();
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vOnContextKill
|
|
=====================
|
|
*/
|
|
void player::vOnContextKill( entity p ) {
|
|
if ( enemyRequestTask == $null ) {
|
|
AllocKillTask();
|
|
killTaskRequestee = p;
|
|
}
|
|
|
|
FlashCMIcon( p, TA_ENEMY, -1 );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vOnRemovePlayersKillTask
|
|
=====================
|
|
*/
|
|
void player::vOnRemovePlayersKillTask( player p ) {
|
|
if ( p == killTaskRequestee ) {
|
|
FreeEnemyRequestTask();
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::IsReviveTask
|
|
=====================
|
|
*/
|
|
boolean player::IsReviveTask( task t ) {
|
|
task_revive_player_strogg stroggRevive = t;
|
|
if ( stroggRevive != $null ) {
|
|
return true;
|
|
}
|
|
|
|
task_revive_player_gdf gdfRevive = t;
|
|
if ( gdfRevive != $null ) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::IsHealTask
|
|
=====================
|
|
*/
|
|
boolean player::IsHealTask( task t ) {
|
|
task_heal_player other = t;
|
|
return other != $null;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::IsSupplyTask
|
|
=====================
|
|
*/
|
|
boolean player::IsSupplyTask( task t ) {
|
|
task_supply_player_strogg stroggSupply = t;
|
|
if ( stroggSupply != $null ) {
|
|
return true;
|
|
}
|
|
|
|
task_supply_player_gdf gdfSupply = t;
|
|
if ( gdfSupply != $null ) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
/*
|
|
=====================
|
|
player::OnHealed
|
|
=====================
|
|
*/
|
|
void player::OnHealed( float oldHealth, float health ) {
|
|
if ( health >= getMaxHealth() ) {
|
|
if ( IsHealTask( requestTask ) ) {
|
|
FreeRequestTask();
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::OnAmmoPickup
|
|
=====================
|
|
*/
|
|
void player::OnAmmoPickup() {
|
|
if ( IsSupplyTask( requestTask ) ) {
|
|
FreeRequestTask();
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::CalcTooltipWait
|
|
=====================
|
|
*/
|
|
float player::CalcTooltipWait() {
|
|
float t = 5.f - ( sys.getTime() - lastRespawnTime );
|
|
if ( t < 2.f ) {
|
|
return 2.f;
|
|
}
|
|
return t;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vGetPliersProgressBarValue
|
|
=====================
|
|
*/
|
|
float player::vGetPliersProgressBarValue( float action ) {
|
|
if ( action == AC_REVIVE ) {
|
|
team_base team = getGameTeam();
|
|
return reviveCount / team.GetMaxReviveCount();
|
|
}
|
|
|
|
return 0.f;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::RegenThread
|
|
=====================
|
|
*/
|
|
void player::RegenThread() {
|
|
team_base team = getGameTeam();
|
|
|
|
while ( true ) {
|
|
team.RegenPulse( self );
|
|
|
|
sys.wait( 5.f );
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::KillRegenThread
|
|
=====================
|
|
*/
|
|
void player::KillRegenThread() {
|
|
sys.killThread( "RegenThread_" + getName() );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vStartRegenThread
|
|
=====================
|
|
*/
|
|
void player::vStartRegenThread() {
|
|
KillRegenThread();
|
|
if ( !sys.isClient() ) {
|
|
thread RegenThread();
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vGiveSpotProficiency
|
|
=====================
|
|
*/
|
|
void player::vGiveSpotProficiency() {
|
|
team_base team = getGameTeam();
|
|
if ( team != $null ) {
|
|
team.GiveSpottingProficiency( self );
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vOnSpawnWavePassed
|
|
=====================
|
|
*/
|
|
void player::vOnSpawnWavePassed() {
|
|
waitedForRevive = true;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vGetCarryableItem
|
|
=====================
|
|
*/
|
|
entity player::vGetCarryableItem() {
|
|
// check that the player doesn't have an item already
|
|
float count = entitiesOfCollection( "carryables" );
|
|
float i;
|
|
for ( i = 0; i < count; i++ ) {
|
|
entity currentEnt = getBoundsCacheEntity( i );
|
|
if ( currentEnt.vGetCarrier() == self ) {
|
|
return currentEnt;
|
|
}
|
|
}
|
|
|
|
return $null_entity;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::RemoveOldestMine
|
|
=====================
|
|
*/
|
|
void player::RemoveOldestMine() {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
float bestTime = -1;
|
|
entity bestMine;
|
|
|
|
float count = entitiesOfCollection( "mine" );
|
|
float index;
|
|
for ( index = 0; index < count; index++ ) {
|
|
entity mine = getBoundsCacheEntity( index );
|
|
if ( mine.vGetOwner() == self ) {
|
|
float launchTime = mine.vGetMineCreationTime();
|
|
|
|
if ( bestTime == -1 ) {
|
|
bestMine = mine;
|
|
bestTime = mine.vGetMineCreationTime();
|
|
} else if ( launchTime < bestTime ) {
|
|
bestTime = launchTime;
|
|
bestMine = mine;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( bestTime != -1 ) {
|
|
bestMine.vSetOwner( $null_entity );
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
=====================
|
|
player::vGetVehicleCredit
|
|
=====================
|
|
*/
|
|
float player::vGetVehicleCredit() {
|
|
float chargeUsed = sys.getTargetTimerValue( vehicleCreditTimer, self ) - sys.getTime();
|
|
if ( chargeUsed < 0 ) {
|
|
return 1.f;
|
|
}
|
|
|
|
return 1 - ( chargeUsed / vehicleCreditChargeTime );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vUseVehicleCredit
|
|
=====================
|
|
*/
|
|
void player::vUseVehicleCredit( float fraction ) {
|
|
float newFrac = vGetVehicleCredit() - fraction;
|
|
if ( newFrac < 0.f ) {
|
|
newFrac = 0.f;
|
|
}
|
|
|
|
sys.setTargetTimerValue( vehicleCreditTimer, self, sys.getTime() + ( ( 1 - newFrac ) * vehicleCreditChargeTime ) );
|
|
}
|
|
|
|
|
|
/*
|
|
=====================
|
|
player::NewRankVOThread
|
|
=====================
|
|
*/
|
|
void player::NewRankVOThread( float rank ) {
|
|
team_base team = getGameTeam();
|
|
sys.startSoundDirect( team.getKey( "snd_newrank" ), SND_ANY );
|
|
sys.wait( 1.0f );
|
|
sys.startSoundDirect( team.getKey( "snd_promotion_" + rank ), SND_PLAYER_VO );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::OnTeleportEntityChanged
|
|
=====================
|
|
*/
|
|
void player::OnTeleportEntityChanged( entity other ) {
|
|
float flags;
|
|
if ( other != $null_entity ) {
|
|
entity weapon = getWeaponEntity();
|
|
if ( weapon != $null_entity ) {
|
|
weapon.vCancelFire();
|
|
}
|
|
|
|
if ( self == sys.getLocalPlayer() ) {
|
|
flags = sys.getGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.activeCrosshairInfoFlags" );
|
|
flags = flags & ~( CF_TASKS | CF_OBJ_MIS );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.activeCrosshairInfoFlags", flags );
|
|
}
|
|
} else {
|
|
if ( self == sys.getLocalPlayer() ) {
|
|
flags = sys.getGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.activeCrosshairInfoFlags" );
|
|
flags = flags | CF_TASKS | CF_OBJ_MIS;
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.activeCrosshairInfoFlags", flags );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::OnEnterView
|
|
=====================
|
|
*/
|
|
void player::OnEnterView() {
|
|
if ( sys.getLocalPlayer() == self || sys.getLocalPlayer() == $null_entity ) {
|
|
return;
|
|
}
|
|
|
|
player p = sys.getLocalPlayer();
|
|
p.SetupCommandMapIcons( true );
|
|
|
|
SetupCommandMapIcons( true );
|
|
|
|
team_base team = getGameTeam();
|
|
team.OnNextRespawnTimeChanged();
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::OnExitView
|
|
=====================
|
|
*/
|
|
void player::OnExitView() {
|
|
if ( sys.getLocalPlayer() == self || sys.getLocalPlayer() == $null_entity ) {
|
|
return;
|
|
}
|
|
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "vehicles.drivingMCP", 0 );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.weaponGrenadeExpireTime", 0 );
|
|
|
|
// Use localPlayer instead of viewPlayer as we are exiting viewPlayers view.
|
|
SetupCommandMapIcons( false );
|
|
|
|
player p = sys.getLocalPlayer();
|
|
p.SetupCommandMapIcons( false );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vDelayDeployment
|
|
=====================
|
|
*/
|
|
void player::vDelayDeployment( float delay ) {
|
|
nextDeploymentTime = sys.getTime() + delay;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vPlayFFWarning
|
|
=====================
|
|
*/
|
|
void player::vPlayFFWarning( string sound, float nextTime ) {
|
|
if ( sys.getTime() > nextFFWarningTime ) {
|
|
objManager.PlaySoundForPlayer( sound, self );
|
|
nextFFWarningTime = sys.getTime() + nextTime;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::FlashCMIcon
|
|
=====================
|
|
*/
|
|
void player::FlashCMIcon( entity p, float requiredTeam, float flashTime ) {
|
|
entity local = sys.getLocalViewPlayer();
|
|
if ( local == $null_entity || local == self ) {
|
|
return;
|
|
}
|
|
|
|
if ( flashTime == -1 ) {
|
|
flashTime = SPOTTED_FLASH_TIME;
|
|
}
|
|
|
|
if ( getEntityAllegiance( local ) == requiredTeam ) {
|
|
if ( requiredTeam == TA_ENEMY ) {
|
|
float flags = sys.getCMIconFlags( commandMapRoleInfo );
|
|
flags = flags | CMF_ENEMYALWAYSKNOWN;
|
|
float materialIndex = GetMaterial( getClassKey( "mtr_cm_icon" ) + "_flash" );
|
|
sys.flashCMIcon( commandMapRoleInfo, materialIndex, flashTime, flags );
|
|
} else {
|
|
sys.flashCMIcon( commandMapRoleInfo, -1, flashTime, -1 );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::SetTargetingItem
|
|
=====================
|
|
*/
|
|
void player::SetTargetingItem( deployable_base item ) {
|
|
targetingItem = item;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::ObjectiveFlashThread
|
|
=====================
|
|
*/
|
|
void player::ObjectiveFlashThread() {
|
|
while ( true ) {
|
|
boolean flash = false;
|
|
float dist = getCrosshairDistance( true );
|
|
float time = getCrosshairStartTime();
|
|
|
|
entity ent = getCrosshairEntity();
|
|
if ( ent != $null_entity && getCrosshairDistance( true ) < 2024.0f && getCrosshairDistance( true ) > 192.0f ) {
|
|
string flashStr = ent.vGetObjectiveString();
|
|
if ( flashStr != "" && ent.vIsPrimaryObjective() ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, flashStr + ".flash", 1.f );
|
|
flash = true;
|
|
}
|
|
}
|
|
|
|
if ( !flash ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "constructObjective.flash", 0.f );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "hackObjective.flash", 0.f );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "destroyObjective1.flash", 0.f );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "destroyObjective2.flash", 0.f );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "mcpObjective.flash", 0.f );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "docObjective.flash", 0.f );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "docObjective2.flash", 0.f );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "docObjective3.flash", 0.f );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "goalObjective.flash", 0.f );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "flyerhiveObjective.flash", 0.f );
|
|
}
|
|
|
|
sys.wait( 0.2f );
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::OnWeaponFired
|
|
=====================
|
|
*/
|
|
void player::OnWeaponFired() {
|
|
nextStroyentTransferTime = sys.getTime() + 2.f;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::OnSendingVoice
|
|
=====================
|
|
*/
|
|
void player::OnSendingVoice( boolean sending ) {
|
|
float flashTime = 0;
|
|
|
|
if ( sending ) {
|
|
flashTime = 3600;
|
|
}
|
|
|
|
FlashCMIcon( $null_entity, TA_FRIEND, flashTime );
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::OnNewTask
|
|
=====================
|
|
*/
|
|
void player::OnNewTask( entity newTask, boolean isMission ) {
|
|
if ( isMission && objManager.gameState == GS_WARMUP ) {
|
|
if ( missionToolTipThreadId == -1 ) {
|
|
//missionToolTipThreadId = thread MissionToolTipThread();
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::MissionToolTipThread
|
|
=====================
|
|
*/
|
|
void player::MissionToolTipThread() {
|
|
sys.wait( 6 );
|
|
waitUntil( !isToolTipPlaying() && getProxyEntity() == $null_entity );
|
|
float toolTip = GetToolTip( getKey( "tt_new_mission" ) );
|
|
sendToolTip( toolTip );
|
|
missionToolTipThreadId = -1;
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vTargetLockAlarm
|
|
=====================
|
|
*/
|
|
void player::vTargetLockAlarm( entity other ) {
|
|
if ( targetLockCount == 0 ) {
|
|
if ( isLocalPlayer() ) {
|
|
if ( g_aptWarning.getIntValue() == 2 || g_aptWarning.getIntValue() == 3 ) {
|
|
sys.startSoundDirect( getKey( "snd_target_lock_alarm" ), SND_PLAYER_ALARM );
|
|
}
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.targetLockDeployableAttack", 0.0f );
|
|
}
|
|
}
|
|
|
|
if ( g_aptWarning.getIntValue() == 1 || g_aptWarning.getIntValue() == 3 ) {
|
|
targetLockCount++;
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vStopTargetLockAlarm
|
|
=====================
|
|
*/
|
|
void player::vStopTargetLockAlarm( entity other ) {
|
|
targetLockCount--;
|
|
|
|
if ( targetLockCount <= 0 ) {
|
|
if ( isLocalPlayer() ) {
|
|
sys.startSoundDirect( "", SND_PLAYER_ALARM );
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.targetLockDeployableAttack", 0.0f );
|
|
}
|
|
targetLockCount = 0; // with warning beep only, we will get negative values for lock count.
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vTargetLockAttack
|
|
=====================
|
|
*/
|
|
void player::vTargetLockAttack( entity other ) {
|
|
if ( targetLockCount > 0 ) {
|
|
if ( isLocalPlayer() ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.targetLockDeployableAttack", 1.0f );
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
=====================
|
|
player::vMineWarning
|
|
=====================
|
|
*/
|
|
void player::vMineWarning( entity other ) {
|
|
if ( isLocalPlayer() ) {
|
|
sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.mineWarningTime", sys.getTime() );
|
|
}
|
|
} |