etqw-sdk/source/game/PlayerProperties.cpp

2059 lines
60 KiB
C++

// Copyright (C) 2007 Id Software, Inc.
//
#include "precompiled.h"
#pragma hdrstop
#if defined( _DEBUG ) && !defined( ID_REDIRECT_NEWDELETE )
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "PlayerProperties.h"
#include "Player.h"
#include "rules/GameRules.h"
#include "vehicles/Transport.h"
#include "vehicles/VehicleWeapon.h"
#include "vehicles/VehicleControl.h"
#include "vehicles/VehicleView.h"
#include "Weapon.h"
#include "roles/Tasks.h"
#include "roles/FireTeams.h"
#include "guis/UserInterfaceLocal.h"
#include "guis/UserInterfaceTypes.h"
#include "guis/UIIconNotification.h"
#include "guis/UserInterfaceManager.h"
#include "script/Script_Helper.h"
#include "script/Script_ScriptObject.h"
#include "../decllib/declTypeHolder.h"
#include "../decllib/declLocStr.h"
#include "demos/DemoManager.h"
#include "rules/VoteManager.h"
#include "misc/WorldToScreen.h"
#include "Waypoints/LocationMarker.h"
typedef sdUIIconNotification::iconHandle_t iconHandle_t;
/*
===============================================================================
sdPlayerProperties
===============================================================================
*/
/*
================
sdPlayerProperties::sdPlayerProperties
================
*/
sdPlayerProperties::sdPlayerProperties( void ) {
localPlayer = NULL;
commandMapExpanding = false;
killedPlayerMessage = NULL;
killedByPlayerMessage = NULL;
killedPlayerTeamMessage = NULL;
killedByPlayerTeamMessage = NULL;
}
/*
============
sdPlayerProperties::InitGUIs
============
*/
void sdPlayerProperties::InitGUIs( void ) {
if ( !gameLocal.DoClientSideStuff() ) {
return;
}
playerHud .Reset( new sdPlayerHud() );
playerHud->InitGui( "hud", false );
limboMenu .Reset( new sdLimboMenu() );
limboMenu->InitGui( "limbo", false );
deployMenu .Reset( new sdDeployMenu() );
quickChatMenu .Reset( new sdQuickChatMenu() );
quickChatMenu->InitGui( "quickchat", false );
fireTeamMenu .Reset( new sdFireTeamMenu() );
fireTeamMenu->InitGui( "fireteam", false );
contextMenu .Reset( new sdQuickChatMenu() );
contextMenu->InitGui( "context", false );
chatMenu .Reset( new sdChatMenu() );
chatMenu->InitGui( "chat", false );
takeViewNoteMenu .Reset( new sdTakeViewNoteMenu() );
takeViewNoteMenu->InitGui( "takeViewNote", false );
weaponSelectionMenu .Reset( new sdWeaponSelectionMenu() );
weaponSelectionMenu->InitGui( "weaponSelection", false );
postProcess .Reset( new sdPostProcess() );
postProcess->InitGui( "guis/postprocess" );
gameLocal.FreeUserInterface( scoreBoard );
scoreBoard = gameLocal.LoadUserInterface( "scoreboard", false, false );
InitGUIStates();
}
/*
============
sdPlayerProperties::InitGUIStates
============
*/
void sdPlayerProperties::InitGUIStates() {
if ( !gameLocal.DoClientSideStuff() ) {
return;
}
// set everything up sensibly
deployMenu->Enable( false );
deployMenu->SetSort( -1 );
fireTeamMenu->SetSort( -2 );
quickChatMenu->SetSort( -3 );
contextMenu->SetSort( -3 );
chatMenu->SetSort( -2 );
limboMenu->SetSort( -100 );
weaponSelectionMenu->SetSort( 0 );
weaponSelectionMenu->Enable( true );
playerHud->SetSort( 0 );
playerHud->Enable( true );
postProcess->Enable( true );
}
/*
============
sdPlayerProperties::Init
============
*/
SD_UI_PUSH_CLASS_TAG( sdPlayerProperties )
void sdPlayerProperties::Init( void ) {
properties.RegisterProperty( "health", health );
properties.RegisterProperty( "maxHealth", maxHealth );
properties.RegisterProperty( "speed", speed );
properties.RegisterProperty( "name", name );
properties.RegisterProperty( "role", role );
properties.RegisterProperty( "roleTitle", roleTitle );
properties.RegisterProperty( "xp", xp );
properties.RegisterProperty( "rank", rank );
properties.RegisterProperty( "rankMaterial", rankMaterial );
properties.RegisterProperty( "yaw", yaw );
properties.RegisterProperty( "vehicleYaw", vehicleYaw );
properties.RegisterProperty( "pitch", pitch );
properties.RegisterProperty( "spreadFraction", spreadFraction );
properties.RegisterProperty( "dead", isDead );
properties.RegisterProperty( "viewDead", isViewDead );
properties.RegisterProperty( "limbo", isInLimbo );
properties.RegisterProperty( "spawning", isSpawning );
properties.RegisterProperty( "spectateClient", spectateClient );
properties.RegisterProperty( "location", location );
properties.RegisterProperty( "serverInfoChanged", serverInfoChanged );
properties.RegisterProperty( "voiceSendMode", voiceSendMode );
properties.RegisterProperty( "nextVoteTime", nextVoteTime );
properties.RegisterProperty( "gdfCriticalClass", gdfCriticalClass );
properties.RegisterProperty( "stroggCriticalClass", stroggCriticalClass );
properties.RegisterProperty( "inProxy", inProxy );
properties.RegisterProperty( "vehicleValid", vehicleValid );
properties.RegisterProperty( "vehicleHealth", vehicleHealth );
properties.RegisterProperty( "vehiclePosition", vehiclePosition );
properties.RegisterProperty( "vehicleDestructTime", vehicleDestructTime );
properties.RegisterProperty( "vehicleWrongDirection", vehicleWrongDirection );
properties.RegisterProperty( "vehicleKickDistance", vehicleKickDistance );
properties.RegisterProperty( "vehicleEMPed", vehicleEMPed );
properties.RegisterProperty( "vehicleWeaponEMPed", vehicleWeaponEMPed );
properties.RegisterProperty( "vehicleSiegeMode", vehicleSiegeMode );
properties.RegisterProperty( "vehicleThirdPerson", vehicleThirdPerson );
properties.RegisterProperty( "weaponName", weaponName );
properties.RegisterProperty( "weaponLookupName", weaponLookupName );
properties.RegisterProperty( "weaponNeedsAmmo", weaponNeedsAmmo );
properties.RegisterProperty( "weaponClip", weaponClip );
properties.RegisterProperty( "weaponTotalClip", weaponTotalClip );
properties.RegisterProperty( "weaponShotsPerClip", weaponShotsPerClip );
properties.RegisterProperty( "weaponShotsAvailable", weaponShotsAvailable );
properties.RegisterProperty( "weaponSlot", weaponSlot );
properties.RegisterProperty( "showCrosshair", showCrosshair );
properties.RegisterProperty( "hideDecoyInfo", hideDecoyInfo );
properties.RegisterProperty( "showTargetingInfo", showTargetingInfo );
properties.RegisterProperty( "crosshairDistance", crosshairDistance );
properties.RegisterProperty( "lastDamageIntensity", lastDamageIntensity );
properties.RegisterProperty( "lastDamageTime", lastDamageTime );
properties.RegisterProperty( "matchTime", matchTime );
properties.RegisterProperty( "warmup", warmup );
properties.RegisterProperty( "matchStatus", matchStatus );
properties.RegisterProperty( "matchType", matchType );
properties.RegisterProperty( "toolTipText", toolTipText );
properties.RegisterProperty( "toolTipMaterial", toolTipMaterial );
properties.RegisterProperty( "toolTipLocation", toolTipLocation );
properties.RegisterProperty( "toolTipIsPriority", toolTipIsPriority );
properties.RegisterProperty( "position", position );
properties.RegisterProperty( "spectating", spectating );
properties.RegisterProperty( "spectator", spectator );
properties.RegisterProperty( "localView", localView );
properties.RegisterProperty( "voiceSending", voiceSending );
properties.RegisterProperty( "voiceReceiving", voiceReceiving );
properties.RegisterProperty( "isChatting", isChatting );
properties.RegisterProperty( "isLagged", isLagged );
properties.RegisterProperty( "fireTeamName", fireTeamName );
properties.RegisterProperty( "fireTeamActive", fireTeamActive );
properties.RegisterProperty( "fireTeamLeader", fireTeamLeader );
properties.RegisterProperty( "fireTeamShow", fireTeamShow );
properties.RegisterProperty( "taskAddedTime", taskAddedTime );
properties.RegisterProperty( "taskSelectedTime", taskSelectedTime );
properties.RegisterProperty( "taskCompletedTime", taskCompletedTime );
properties.RegisterProperty( "taskExpiredTime", taskExpiredTime );
properties.RegisterProperty( "taskStatus", taskStatus );
properties.RegisterProperty( "taskIndex", taskIndex );
properties.RegisterProperty( "hasTask", hasTask );
properties.RegisterProperty( "teamName", teamName );
properties.RegisterProperty( "teamNameView", teamNameView );
properties.RegisterProperty( "spawnSelected", spawnSelected );
properties.RegisterProperty( "winningTeam", winningTeam );
properties.RegisterProperty( "winningMusic", winningMusic );
properties.RegisterProperty( "winningTeamTitle", winningTeamTitle );
properties.RegisterProperty( "winningTeamString", winningTeamString );
properties.RegisterProperty( "winningTeamReason", winningTeamReason );
properties.RegisterProperty( "endGame", endGame );
properties.RegisterProperty( "endGameCamera", endGameCamera );
properties.RegisterProperty( "nextGameStateTime", nextGameStateTime );
properties.RegisterProperty( "targetingCenter", targetingCenter );
properties.RegisterProperty( "targetingColor", targetingColor );
properties.RegisterProperty( "targetingPercent", targetingPercent );
properties.RegisterProperty( "deploymentActive", deploymentActive );
properties.RegisterProperty( "deployRotation", deployRotation );
properties.RegisterProperty( "deployPosition", deployPosition );
properties.RegisterProperty( "deployIsRotating", deployIsRotating );
properties.RegisterProperty( "voteActive", voteActive );
properties.RegisterProperty( "votingAllowed", votingAllowed );
properties.RegisterProperty( "voteText", voteText );
properties.RegisterProperty( "voteYesCount", voteYesCount );
properties.RegisterProperty( "voteNoCount", voteNoCount );
properties.RegisterProperty( "hitFeedback", hitFeedback );
properties.RegisterProperty( "lastHitFeedbackType", lastHitFeedbackType );
properties.RegisterProperty( "commandMapState", commandMapState );
properties.RegisterProperty( "lagOMeter", lagOMeter );
// properties.RegisterProperty( "mapLoadPercent", mapLoadPercent );
properties.RegisterProperty( "taskInfo", taskInfo );
properties.RegisterProperty( "isReady", isReady );
properties.RegisterProperty( "needsReady", needsReady );
properties.RegisterProperty( "lastVoiceSender", lastVoiceSender );
properties.RegisterProperty( "lastKillMessage", lastKillMessage );
properties.RegisterProperty( "lastKillMessageTime", lastKillMessageTime );
properties.RegisterProperty( "scoreboardActive", scoreboardActive );
properties.RegisterProperty( "gameTime", gameTime );
properties.RegisterProperty( "showFireTeam", showFireTeam );
properties.RegisterProperty( "isPaused", isPaused );
properties.RegisterProperty( "isSinglePlayer", singlePlayerGame );
properties.RegisterProperty( "unpauseKeyString", unpauseKeyString );
properties.RegisterProperty( "serverIsRepeater", serverIsRepeater );
properties.RegisterProperty( "isServer", isServer );
properties.RegisterProperty( "inLetterBox", inLetterBox );
killedPlayerMessage = declHolder.declLocStrType.LocalFind( "game/obit/local/killed" );
killedByPlayerMessage = declHolder.declLocStrType.LocalFind( "game/obit/local/killedby" );
killedPlayerTeamMessage = declHolder.declLocStrType.LocalFind( "game/obit/local/killed_team" );
killedByPlayerTeamMessage = declHolder.declLocStrType.LocalFind( "game/obit/local/killedby_team" );
currentMission = declHolder.declLocStrType.LocalFind( "guis/game/scoreboard/currentmission" );
UpdateTeam( NULL ); // Make sure we have a sensible default
int numProficiency = gameLocal.declProficiencyTypeType.Num();
proficiency.SetNum( numProficiency );
proficiencyPercent.SetNum( numProficiency );
for( int i = 0; i < numProficiency; i++ ) {
properties.RegisterProperty( va( "proficiency%i", i ), proficiency[ i ] );
properties.RegisterProperty( va( "proficiencyPercent%i", i ), proficiencyPercent[ i ] );
}
stroyentType = idWeapon::GetAmmoType( "stroyent" );
clipIndex = 0;
SD_UI_PUSH_GROUP_TAG( "Team Allegiance" )
SD_UI_ENUM_TAG( TA_FRIEND, "Friendly." )
sdDeclGUI::AddDefine( va( "TA_FRIEND %i", TA_FRIEND ) );
SD_UI_ENUM_TAG( TA_ENEMY, "Enemy." )
sdDeclGUI::AddDefine( va( "TA_ENEMY %i", TA_ENEMY ) );
SD_UI_ENUM_TAG( TA_NEUTRAL, "Neutral." )
sdDeclGUI::AddDefine( va( "TA_NEUTRAL %i", TA_NEUTRAL ) );
SD_UI_POP_GROUP_TAG
uiManager->RegisterIconEnumerationCallback( "playerUpgrades", UpdatePlayerUpgradeIcons );
uiManager->RegisterIconEnumerationCallback( "playerAllUpgrades", PlayerUpgradeIcons );
idPlayer::SetupCommandMapZoom();
voipChatTimes.SetNum( MAX_ASYNC_CLIENTS );
activateEndGame = 0;
serverInfoChanged = 0.0f;
showFireTeam = false;
isPaused = false;
voiceSendMode = VO_NUM_MODES + 1;
}
SD_UI_POP_CLASS_TAG
/*
================
sdPlayerProperties::~sdPlayerProperties
================
*/
sdPlayerProperties::~sdPlayerProperties( void ) {
}
/*
================
sdPlayerProperties::ShutdownGUIs
================
*/
void sdPlayerProperties::ShutdownGUIs( void ) {
limboMenu.Reset();
deployMenu.Reset();
quickChatMenu.Reset();
contextMenu.Reset();
fireTeamMenu.Reset();
chatMenu.Reset();
takeViewNoteMenu.Reset();
weaponSelectionMenu.Reset();
playerHud.Reset();
postProcess.Reset();
gameLocal.FreeUserInterface( scoreBoard );
scoreBoard.Release();
}
/*
================
sdPlayerProperties::Shutdown
================
*/
void sdPlayerProperties::Shutdown( void ) {
properties.Clear();
}
/*
============
sdPlayerProperties::GetProperty
============
*/
sdProperties::sdProperty* sdPlayerProperties::GetProperty( const char* name, sdProperties::ePropertyType type ) {
sdProperties::sdProperty* prop = properties.GetProperty( name, sdProperties::PT_INVALID, false );
if ( prop && prop->GetValueType() != type && type != sdProperties::PT_INVALID ) {
gameLocal.Error( "sdPlayerProperties::GetProperty: type mismatch for property '%s'", name );
}
return prop;
}
/*
================
sdPlayerProperties::UpdateTeam
================
*/
void sdPlayerProperties::UpdateTeam( sdTeamInfo* team ) {
teamName = team ? team->GetLookupName() : "spectating";
if ( teamNameView.GetValue().Length() <= 0 ) {
teamNameView = teamName;
}
}
/*
================
sdPlayerProperties::Update
================
*/
void sdPlayerProperties::PacifierUpdate( void ) {
// mapLoadPercent = static_cast< float >( fileSystem->GetReadCount() ) / gameLocal.GetBytesNeededForMapLoad();
}
/*
================
sdPlayerProperties::Update
================
*/
void sdPlayerProperties::Update( idPlayer* player ) {
using namespace sdProperties;
gameTime = gameLocal.time;
serverIsRepeater = gameLocal.serverIsRepeater;
localView = localPlayer == player ? 1.0f : 0.0f;
if ( localPlayer != NULL ) {
assert( player != NULL );
spectator = localPlayer->IsSpectator() ? 1.0f : 0.0f;
spectating = localPlayer->IsSpectating() ? 1.0f : 0.0f;
isDead = localPlayer->IsDead();
isInLimbo = localPlayer->IsInLimbo();
isSpawning = localPlayer->WantRespawn();
isReady = localPlayer->IsReady();
needsReady = gameLocal.rules->IsWarmup() && ( !gameLocal.serverInfoData.adminStart && !gameLocal.rules->IsCountDown() );
isLagged = localPlayer->GetIsLagged() ? 1.0f : 0.0f;
float distance = localPlayer->GetCrosshairInfoDirect().GetDistance();
crosshairDistance = distance < localPlayer->targetIdRangeNormal ? va( "%.2fm", InchesToMetres( distance ) ) : "-1";
name = localPlayer->userInfo.name;
singlePlayerGame = gameLocal.isServer ? 1.0f : 0.0f;
toolTipIsPriority = localPlayer->IsSinglePlayerToolTipPlaying();
} else {
spectator = 1.f;
spectating = 1.f;
isDead = 0.f;
isInLimbo = 0.f;
isSpawning = 0.f;
isReady = 0.f;
needsReady = 0.f;
crosshairDistance = "";
isLagged = 0.0f;
name = "";
singlePlayerGame = 0.0f;
toolTipIsPriority = 0.0f;
UpdateTeam( NULL );
}
const char* newViewTeamName = teamName.GetValue().c_str();
if ( player != NULL ) {
sdTeamInfo* spectateTeam = player->GetGameTeam();
if ( spectateTeam != NULL ) {
newViewTeamName = spectateTeam->GetLookupName();
}
isViewDead = player->IsDead() ? 1.f : 0.f;
} else {
isViewDead = 0.f;
}
teamNameView = newViewTeamName;
isPaused = gameLocal.isPaused;
isServer = gameLocal.isServer;
sdUserInterfaceLocal* scoreboardUI = gameLocal.GetUserInterface( scoreBoard );
if ( scoreboardUI != NULL ){
scoreboardActive = scoreboardUI->IsActive() ? 1.0f : 0.0f;
} else {
scoreboardActive = 0.0f;
}
if ( player != NULL ) {
if ( g_hitBeep.GetInteger() > 0 && g_hitBeep.GetInteger() != 2 ) {
hitFeedback = player->NewDamageDealt();
player->ClearDamageDealt();
lastHitFeedbackType = player->GetLastDamageDealtType();
}
const idPlayer::damageEvent_t& event = player->GetLastDamageEvent();
lastDamageTime = event.hitTime;
lastDamageIntensity = event.hitDamage;
}
lagOMeter = ( net_clientLagOMeter.GetBool() && gameLocal.isClient ) ? 1.0f : 0.0f;
commandMapState = GetCommandMapExpanding() ? 1.0f : 0.0f;
const sdDeclPlayerClass* playerClass = NULL;
sdInventory* inv = NULL;
if ( player != NULL ) {
inv = &player->GetInventory();
playerClass = inv->GetClass();
// player
spectateClient = player->userInfo.name;
health = player->GetHealth();
maxHealth = player->GetMaxHealth();
role = ( playerClass != NULL ) ? playerClass->GetName() : "spec";
roleTitle = ( playerClass != NULL ) ? playerClass->GetTitle()->Index() : declHolder.FindLocStr( "spec" )->Index();
idWStr locationText;
sdLocationMarker::GetLocationText( player->GetPhysics()->GetOrigin(), locationText );
location = locationText;
if( player->GetProxyEntity() == NULL && player->weapon && ( localPlayer && !( localPlayer->IsInLimbo() || gameLocal.rules->IsEndGame() ) ) ) {
float fraction = idMath::Sqrt( player->weapon->GetSpreadValueNormalized() );
float min = player->weapon->GetCrosshairSpreadMin();
float max = player->weapon->GetCrosshairSpreadMax();
float scale = player->weapon->GetCrosshairSpreadScale();
assert( !FLOAT_IS_NAN( fraction ) );
fraction = min + fraction * scale;
if ( fraction > max ) {
fraction = max;
}
spreadFraction = fraction;
} else {
spreadFraction = 0.f;
}
} else {
// player
spectateClient = "";
health = 0.f;
maxHealth = 0.f;
role = "spec";
roleTitle = declHolder.FindLocStr( "spec" )->Index();
location = L"";
spreadFraction = 0.f;
}
if( localPlayer != NULL ) {
int time = localPlayer->GetNextCallVoteTime();
nextVoteTime = time >= gameLocal.time ? time - gameLocal.time : 0.0f;
}
warmup = gameLocal.rules->IsWarmup() ? 1.0f : 0.0f;
matchStatus = gameLocal.rules->GetStatusText();
matchType = gameLocal.rules->GetTypeText()->GetText();
matchTime = gameLocal.rules->GetGameTime();
idEntity* proxy = player != NULL ? player->GetProxyEntity() : NULL;
sdTransport* vehicle = proxy ? proxy->Cast< sdTransport >() : NULL;
sdUsableInterface* iface = proxy ? proxy->GetUsableInterface() : NULL;
// speed
float localSpeed = 0.0f;
float localEMPed = 0.0f;
float localWeaponEMPed = 0.0f;
float localSiegeMode = 0.0f;
float localThirdPerson = 0.0f;
if ( proxy != NULL ) {
if ( vehicle != NULL ) {
localEMPed = vehicle->GetRemainingEMP();
if ( vehicle->GetActiveWeapon( player ) != NULL ) {
localWeaponEMPed = vehicle->GetRemainingWeaponEMP();
}
const sdVehicleControlBase* control = vehicle->GetVehicleControl();
if ( control != NULL ) {
localSpeed = control->GetHudSpeed();
localSiegeMode = control->InSiegeMode() == true ? 1.0f : 0.0f;
}
sdVehicleView& view = vehicle->GetViewForPlayer( player );
localThirdPerson = view.GetViewParms().thirdPerson;
} else {
localSpeed = proxy->GetPhysics()->GetLinearVelocity().Length();
}
} else if ( player != NULL ) {
localSpeed = player->GetPhysics()->GetLinearVelocity().Length();
} else {
localSpeed = 0.f;
}
speed = idMath::FtoiFast( UPSToMPH( localSpeed ) );
vehicleEMPed = localEMPed;
vehicleWeaponEMPed = localWeaponEMPed;
vehicleSiegeMode = localSiegeMode;
vehicleThirdPerson = localThirdPerson;
if ( player != NULL ) {
// angles
idAngles viewAngles;
viewAngles = player->renderView.viewaxis.ToAngles();
viewAngles.Normalize360();
yaw = viewAngles.yaw;
pitch = viewAngles.pitch;
spawnSelected = ( player->GetSpawnPoint() == NULL ) ? 0.f : 1.f;
} else {
// angles
idAngles viewAngles = gameLocal.playerView.GetRepeaterViewInfo().viewAngles;
viewAngles.Normalize360();
yaw = viewAngles.yaw;
pitch = viewAngles.pitch;
spawnSelected = 0.f;
}
idWeapon* pWeapon = player == NULL ? NULL : player->GetWeapon();
bool showWeaponInfo = true;
if ( vehicle != NULL ) {
const sdVehiclePosition& pos = vehicle->GetPositionManager().PositionForPlayer( player );
// e.g. the buffalo allows passengers to fire their weapons
showWeaponInfo = pos.GetAllowWeapon();
} else if( proxy != NULL || inv == NULL ) {
showWeaponInfo = false;
vehicleYaw = 0.0f;
} else {
vehicleYaw = 0.0f;
}
if ( showWeaponInfo && ( pWeapon != NULL ) && ( playerClass != NULL ) ) {
assert( inv != NULL );
if ( pWeapon->IsClipBased() ) {
weaponClip = player->GetClip( clipIndex );
weaponShotsPerClip = pWeapon->GetClipSize( clipIndex );
} else {
ammoType_t type = pWeapon->GetAmmoType( clipIndex );
if ( type != -1 ) {
weaponClip = inv->GetAmmo( type );
weaponShotsPerClip = inv->GetMaxAmmo( type );
} else {
weaponClip = -1;
weaponShotsPerClip = -1;
}
}
if ( weaponShotsPerClip == 0 ) {
weaponShotsPerClip = -1;
}
weaponTotalClip = player->AmmoForWeapon( clipIndex );
weaponNeedsAmmo = pWeapon->AmmoRequired( clipIndex ) != 0 ? 1.0f : 0.0f;
weaponShotsAvailable = pWeapon->ShotsAvailable( clipIndex );
if ( inv->IsSwitchActive() ) {
weaponSlot = inv->GetSwitchingSlot() + 1;
} else {
weaponSlot = inv->GetCurrentSlot() + 1;
}
}
inProxy = proxy != NULL ? 1.0f : 0.0f;
if ( proxy != NULL ) {
int minDisplayHealth = proxy->GetMinDisplayHealth();
vehicleHealth = ( proxy->GetHealth() - minDisplayHealth ) / static_cast< float >( proxy->GetMaxHealth() - minDisplayHealth );
sdUsableInterface* iface = proxy->GetUsableInterface();
vehicleDestructTime = iface->GetDestructionEndTime() != 0 ? MS2SEC( iface->GetDestructionEndTime() - gameLocal.time < 0 ? 0 : iface->GetDestructionEndTime() - gameLocal.time ) : 0.0f;
vehicleWrongDirection = iface->GetDirectionWarning() ? 1.f : 0.f;
vehicleKickDistance = iface->GetRouteKickDistance();
showCrosshair = iface->GetShowCrosshair( player ) ? 1.f : 0.f;
hideDecoyInfo = iface->GetHideDecoyInfo( player ) ? 1.f : 0.f;
showTargetingInfo = iface->GetShowTargetingInfo( player ) ? 1.f : 0.f;
vehicleYaw = proxy->GetRenderEntity() != NULL ? proxy->GetRenderEntity()->axis.ToAngles().yaw : 0.0f;
inLetterBox = 0.0f;
} else {
vehicleDestructTime = 0.0f;
vehicleWrongDirection = 0.0f;
vehicleKickDistance = -1;
if ( player != NULL ) {
showCrosshair = player->IsBeingBriefed() ? 0.0f : 1.0f;
inLetterBox = ( player->IsBeingBriefed() ) ? 1.0f : 0.0f;
} else {
showCrosshair = 1.0f;
inLetterBox = 0.0f;
}
hideDecoyInfo = 0.0f;
showTargetingInfo = 0.0f;
}
if ( inv == NULL ) {
weaponNeedsAmmo = 0.f;
weaponName = -1;
weaponLookupName.Set( "" );
} else if ( iface != NULL && !showWeaponInfo ) { // if showWeaponInfo is true then we need to prevent the values being overwritten
weaponNeedsAmmo = 0.0f;
const sdDeclLocStr* weaponTitle = iface->GetWeaponName( player );
weaponName = weaponTitle != NULL ? weaponTitle->Index() : -1;
weaponLookupName.Set( iface->GetWeaponLookupName( player ) );
} else {
weaponName = inv->GetWeaponTitle() != NULL ? inv->GetWeaponTitle()->Index() : -1;
weaponLookupName.Set( inv->GetWeaponName() );
}
sdTransport* viewVehicle = activeObjectView->Cast< sdTransport >();
if ( viewVehicle && localPlayer ) {
if ( proxyOverlay.Get() != NULL ) {
if( proxyOverlay->GetGuiHandle().IsValid() ) {
viewVehicle->GetUsableInterface()->UpdateHud( localPlayer, proxyOverlay->GetGuiHandle() );
}
}
}
// vehicles
vehicleValid = vehicle != NULL ? 1.0f : 0.0f;
UpdateFireTeam( player );
if ( player != NULL ) {
// latitude/longitude/altitude
position = InchesToMetres( player->GetPhysics()->GetOrigin() );
// experience
xp = idMath::Floor( player->GetProficiencyTable().GetXP() );
const sdDeclRank* playerRank = player->GetProficiencyTable().GetRank();
if ( playerRank != NULL ) {
rank = playerRank->GetTitle() != NULL ? playerRank->GetTitle()->Index() : -1;
rankMaterial = playerRank->GetMaterial();
} else {
rank = -1;
rankMaterial = "";
}
} else {
position = vec3_origin;
xp = 0.f;
rank = -1;
rankMaterial = "";
}
// voice chat
int currentTime = sys->Milliseconds();
voiceSending = ( currentTime - networkSystem->GetLastVoiceSentTime() ) < SEC2MS( 0.5f ) ? 1.0f : 0.0f;
bool receivingNow = false;
int bestDiffIndex = -1;
int bestDiff = -1;
for ( int i = 0; i < MAX_ASYNC_CLIENTS; i++ ) {
int diff = ( currentTime - networkSystem->GetLastVoiceReceivedTime( i ) );
receivingNow |= diff < SEC2MS( 0.5f );
voipChatTimes[ i ] = gameLocal.time - diff;
if ( bestDiff == -1 || diff < bestDiff ) {
bestDiffIndex = i;
bestDiff = diff;
}
}
voiceReceiving = receivingNow ? 1.f : 0.f;
if ( bestDiffIndex != -1 ) {
const idPlayer* client = gameLocal.GetClient( bestDiffIndex );
if ( client != NULL ) {
lastVoiceSender = client->GetUserInfo().name;
}
}
switch( networkSystem->GetVoiceMode() ) {
case VO_GLOBAL:
voiceSendMode = sdUserInterfaceLocal::VOIPC_GLOBAL;
break;
case VO_TEAM:
voiceSendMode = sdUserInterfaceLocal::VOIPC_TEAM;
break;
case VO_FIRETEAM:
voiceSendMode = sdUserInterfaceLocal::VOIPC_FIRETEAM;
break;
default:
voiceSendMode = sdUserInterfaceLocal::VOIPC_DISABLE;
break;
}
isChatting = 0.0f;
// Campaign/Match status
if( gameLocal.rules->IsEndGame() ) {
sdTeamInfo* winner = gameLocal.rules->GetWinningTeam();
const sdDeclLocStr* reason = gameLocal.rules->GetWinningReason();
winningTeam = ( winner != NULL ) ? winner->GetLookupName() : "";
winningTeamTitle = ( winner != NULL && winner->GetTitle() != NULL ) ? winner->GetTitle()->Index() : -1;
winningTeamString = ( winner != NULL && winner->GetWinString() != NULL ) ? winner->GetWinString()->Index() : -1;
winningTeamReason = ( reason != NULL ) ? reason->Index() : -1;
winningMusic = ( winner != NULL ) ? winner->GetWinMusic() : "";
if( activateEndGame == 0 ) {
activateEndGame = gameLocal.time + SEC2MS( gameLocal.GetMapInfo().GetData().GetFloat( va( "%s_endgame_pause", winningTeam.GetValue().c_str() ), "3.0" ) );
}
} else {
winningTeam = "";
winningTeamTitle = -1;
winningTeamString = -1;
winningMusic = "";
activateEndGame = 0;
}
if( gameLocal.time >= activateEndGame && gameLocal.rules->IsEndGame() ) {
endGame = 1.0f;
} else {
endGame = 0.0f;
}
endGameCamera = gameLocal.rules->IsEndGame();
nextGameStateTime = gameLocal.rules->GetNextStateTime();
// targeting display
UpdateTargetingInfo( player );
// deployment feedback
deploymentActive = gameLocal.GetDeploymentRequest( player ) != NULL ? 1.0f : 0.0f;
if( deployMenu.Get() ) {
deployIsRotating = deployMenu->GetDeployMode() ? 1.0f : 0.0f;
deployRotation = deployMenu->GetRotation();
deployPosition = deployMenu->GetPosition();
}
votingAllowed = gameLocal.serverInfoData.votingDisabled == false;
if ( sdPlayerVote* vote = sdVoteManager::GetInstance().GetActiveVote( player ) ) {
voteActive = 1.0f;
voteText = vote->GetText();
voteYesCount = vote->GetYesCount();
voteNoCount = vote->GetNoCount();
} else {
voteActive = 0.0f;
voteText = L"";
voteYesCount = 0.0f;
voteNoCount = 0.0f;
}
// update proficiency statistics
if ( playerClass ) {
const sdProficiencyTable& table = player->GetProficiencyTable();
for( int i = 0; i < playerClass->GetNumProficiencies(); i++ ) {
const sdDeclPlayerClass::proficiencyCategory_t& category = playerClass->GetProficiency( i );
int profIndex = category.index;
proficiency[ i ] = static_cast< float >( table.GetLevel( profIndex ) );
const sdDeclProficiencyType* prof = gameLocal.declProficiencyTypeType.LocalFindByIndex( profIndex );
float currentCost = 0.0f;
int maxLevel = Min( table.GetLevel( profIndex ) + 1, prof->GetNumLevels() );
int levelIndex;
for( levelIndex = 0; levelIndex < maxLevel; levelIndex++ ) {
currentCost += static_cast< float >( prof->GetLevel( levelIndex ) );
}
float baseCost = 0.0f;
for( levelIndex = 0; levelIndex < table.GetLevel( profIndex ); levelIndex++ ) {
baseCost += static_cast< float >( prof->GetLevel( levelIndex ) );
}
if( currentCost > idMath::FLT_EPSILON ) {
proficiencyPercent[ i ] = ( table.GetPoints( profIndex ) - baseCost ) / ( currentCost - baseCost );
} else {
proficiencyPercent[ i ] = 0.0f;
}
}
}
}
/*
============
sdPlayerProperties::SetToolTipInfo
============
*/
void sdPlayerProperties::SetToolTipInfo( const wchar_t* text, int index, const idMaterial* icon ) {
toolTipText = text;
toolTipLocation = index;
toolTipMaterial = icon ? icon->GetName() : "";
}
/*
============
FindItemWithData
============
*/
static iconHandle_t FindItemWithData( sdUIIconNotification* icons, int data ) {
iconHandle_t handle = icons->GetFirstItem();
while( handle.IsValid() ) {
int itemData = icons->GetItemDataInt( handle );
if( data == itemData ) {
break;
}
handle = icons->GetNextItem( handle );
}
return handle;
}
/*
============
sdPlayerProperties::UpdatePlayerUpgradeIcons
============
*/
void sdPlayerProperties::UpdatePlayerUpgradeIcons( sdUIIconNotification* icons ) {
int desiredCategory;
icons->GetUI()->PopScriptVar( desiredCategory );
idStr playerClassName;
icons->GetUI()->PopScriptVar( playerClassName );
idPlayer* localPlayer = gameLocal.GetLocalPlayer();
if( localPlayer == NULL ) {
icons->Clear();
return;
}
const sdDeclPlayerClass* pc = gameLocal.declPlayerClassType.LocalFind( playerClassName, false );
if ( pc == NULL ) {
icons->Clear();
return;
}
idStaticList< iconHandle_t, 32 > iconsToRemove;
iconHandle_t start = icons->GetFirstItem();
while( start.IsValid() ) {
iconsToRemove.Append( start );
start = icons->GetNextItem( start );
}
const sdProficiencyTable& table = localPlayer->GetProficiencyTable();
for ( int i = 0; i < pc->GetNumProficiencies(); i++ ) {
const sdDeclPlayerClass::proficiencyCategory_t& category = pc->GetProficiency( i );
if( desiredCategory != -1 && category.index != desiredCategory ) {
continue;
}
int profIndex = category.index;
int playerLevel = idMath::Ftoi( table.GetLevel( profIndex ) );
// add all icons from the current level and below
for ( int level = 0; level < playerLevel && level < category.upgrades.Num(); level++ ) {
const sdDeclPlayerClass::proficiencyUpgrade_t& upgrade = category.upgrades[ level ];
iconHandle_t handle = FindItemWithData( icons, category.index + level );
if( !handle.IsValid() ) {
iconHandle_t newItem = icons->AddIcon( upgrade.materialInfo );
icons->SetItemDataInt( newItem, category.index + level );
icons->SetItemText( newItem, upgrade.text->GetText() );
} else {
verify( iconsToRemove.Remove( handle ) );
}
}
}
for( int i = 0; i < iconsToRemove.Num(); i++ ) {
icons->RemoveIcon( iconsToRemove[ i ] );
}
}
/*
============
sdPlayerProperties::PlayerUpgradeIcons
============
*/
void sdPlayerProperties::PlayerUpgradeIcons( sdUIIconNotification* icons ) {
int desiredCategory;
icons->GetUI()->PopScriptVar( desiredCategory );
idStr playerClassName;
icons->GetUI()->PopScriptVar( playerClassName );
idPlayer* localPlayer = gameLocal.GetLocalPlayer();
if( localPlayer == NULL ) {
icons->Clear();
return;
}
const sdDeclPlayerClass* pc = gameLocal.declPlayerClassType.LocalFind( playerClassName, false );
if ( pc == NULL ) {
icons->Clear();
return;
}
const sdProficiencyTable& table = localPlayer->GetProficiencyTable();
for ( int i = pc->GetNumProficiencies() - 1; i >= 0 ; i-- ) {
const sdDeclPlayerClass::proficiencyCategory_t& category = pc->GetProficiency( i );
if( desiredCategory != -1 && category.index != desiredCategory ) {
continue;
}
int profIndex = category.index;
// add all icons from the current level and below
for ( int level = 0; level < category.upgrades.Num(); level++ ) {
const sdDeclPlayerClass::proficiencyUpgrade_t& upgrade = category.upgrades[ level ];
iconHandle_t newItem = icons->AddIcon( upgrade.materialInfo );
icons->SetItemText( newItem, upgrade.text->GetText() );
}
}
}
/*
================
sdPlayerProperties::UpdateHudModules
================
*/
void sdPlayerProperties::UpdateHudModules( void ) {
sdHudModule* module = GetActiveHudModule();
if ( module ) {
module->Activate();
module->Update();
sdUserInterfaceLocal* ui = module->GetGui();
if ( ui && !ui->IsActive() ) {
module->Enable( false );
}
}
for ( module = GetPassiveHudModule(); module; module = module->GetNode().Next() ) {
module->Update();
}
}
/*
================
sdPlayerProperties::UpdateTargetingInfo
================
*/
void sdPlayerProperties::UpdateTargetingInfo( idPlayer* player ) {
idEntity* targetEnt = NULL;
if ( player != NULL ) {
idEntity* proxy = player->GetProxyEntity();
targetEnt = player->targetEntity;
if ( targetEnt ) {
targetingColor = player->GetTargetLocked() ? colorRed : colorGreen;
} else {
targetEnt = player->targetEntityPrevious;
if ( targetEnt ) {
targetingColor = idVec4( colorGreen.x, colorGreen.y, colorGreen.z, 0.5f );
}
}
}
if ( targetEnt ) {
idVec2 point;
sdWorldToScreenConverter converter( gameLocal.playerView.GetCurrentView() );
idPhysics* targetPhysics = targetEnt->GetPhysics();
if ( targetEnt->GetSelectionBounds() != NULL && !targetEnt->GetSelectionBounds()->IsCleared() ) {
converter.Transform( targetEnt->GetLastPushedOrigin() + ( targetEnt->GetSelectionBounds()->GetCenter() * targetEnt->GetLastPushedAxis() ), point );
} else {
converter.Transform( targetEnt->GetLastPushedOrigin() + ( targetPhysics->GetBounds().GetCenter() * targetEnt->GetLastPushedAxis() ), point );
}
targetingCenter = point;
if( player->targetLockEndTime ) {
float f = 1.0f - static_cast< float >( player->targetLockEndTime - gameLocal.time ) / player->targetLockDuration;
targetingPercent = idMath::ClampFloat( 0.0f, 1.0f, f );
} else if( player->targetLockLastTime != 0 ) {
float f = static_cast< float >( player->targetLockLastTime - gameLocal.time ) / 1000;
targetingPercent = idMath::ClampFloat( 0.0f, 1.0f, f );
} else {
targetingPercent = 0.0f;
}
} else {
targetingPercent = 0.0f;
}
}
/*
================
sdPlayerProperties::UpdateFireTeam
================
*/
void sdPlayerProperties::UpdateFireTeam( idPlayer* player ) {
sdFireTeam* fireTeam = player != NULL ? gameLocal.rules->GetPlayerFireTeam( player->entityNumber ) : NULL;
if ( fireTeam != NULL ) {
fireTeamName = va( L"%hs", fireTeam->GetName() );
fireTeamActive = 1.f;
fireTeamLeader = fireTeam->GetCommander() == player;
fireTeamShow = 1.f;
return;
}
fireTeamActive = 0.f;
fireTeamLeader = 0.f;
fireTeamShow = sdObjectiveManager::GetInstance().GetNumObjectives() > 0 ? 1.0f : 0.0f;
if( fireTeamShow > 0.0f ) {
fireTeamName = currentMission->GetText();
} else {
fireTeamName = L"";
}
}
/*
================
sdPlayerProperties::GetProperty
================
*/
sdProperties::sdProperty* sdPlayerProperties::GetProperty( const char* name ) {
return properties.GetProperty( name, sdProperties::PT_INVALID, false );
}
/*
============
sdPlayerProperties::SetupVehiclePosition
============
*/
void sdPlayerProperties::SetupVehiclePosition( sdUsableInterface* interface, int positionID, sdUserInterfaceLocal* ui ) {
positionMode_t mode = PM_EMPTY;
idPlayer* other = interface->GetPlayerAtPosition( positionID );
if ( other ) {
if ( other == gameLocal.GetLocalViewPlayer() ) {
mode = PM_SELF;
} else {
mode = PM_OTHER;
}
} else {
mode = PM_EMPTY;
}
SetupVehiclePosition( interface, positionID, mode, ui );
}
/*
============
sdPlayerProperties::SetupVehiclePosition
============
*/
void sdPlayerProperties::SetupVehiclePosition( sdUsableInterface* interface, int positionID, positionMode_t mode, sdUserInterfaceLocal* ui ) {
const char* eventName;
switch ( mode ) {
case PM_OTHER:
eventName = va( "otherEnterPosition%i", positionID );
break;
case PM_SELF:
eventName = va( "selfEnterPosition%i", positionID );
vehiclePosition = interface->GetPositionTitle( positionID )->Index();
break;
case PM_EMPTY:
eventName = va( "exitPosition%i", positionID );
break;
}
ui->PostNamedEvent( eventName, true );
}
/*
============
sdPlayerProperties::OnEntityDestroyed
============
*/
void sdPlayerProperties::OnEntityDestroyed( idEntity* entity ) {
if ( gameLocal.playerView.GetActiveViewProxy() == entity ) {
gameLocal.playerView.SetActiveProxyView( NULL, NULL ); // make sure this gets cleared out
}
if ( entity == currentSpawnPoint ) {
OnSetActiveSpawn( NULL );
gameLocal.limboProperties.OnSetActiveSpawn( NULL );
}
}
/*
============
sdPlayerProperties::OnNewTask
============
*/
void sdPlayerProperties::OnNewTask( sdPlayerTask* task ) {
taskStatus = common->LocalizeText( "guis/game/new_tasks_available" );
taskAddedTime = MS2SEC( gameLocal.ToGuiTime( gameLocal.time ) );
sdScriptHelper h1;
h1.Push( task->GetScriptObject() );
h1.Push( task->IsMission() );
localPlayer->CallNonBlockingScriptEvent( localPlayer->GetScriptFunction( "OnNewTask" ), h1 );
}
/*
============
sdPlayerProperties::OnTaskSelected
============
*/
void sdPlayerProperties::OnTaskSelected( sdPlayerTask* task ) {
/*
if( localPlayer == NULL ) {
return;
}
if( task != NULL ) {
if( taskIndex.GetValue().IsEmpty() ) {
taskInfo = va( L"%ls - %ls", task->GetTitle(), task->GetInfo()->GetXPString() );
} else {
taskInfo = va( L"%ls - %ls (%ls)", task->GetTitle(), task->GetInfo()->GetXPString(), taskIndex.GetValue().c_str() );
}
} else {
// see if there's an objective to show
sdTeamInfo* team = localPlayer->GetGameTeam();
if ( team != NULL ) {
const sdPlayerTask::nodeType_t& objectiveTasks = sdTaskManager::GetInstance().GetObjectiveTasks( team );
sdPlayerTask* objectiveTask = objectiveTasks.Next();
if ( objectiveTask != NULL ) {
if( taskIndex.GetValue().IsEmpty() ) {
taskInfo = va( L"%ls - %ls", objectiveTask->GetTitle(), objectiveTask->GetInfo()->GetXPString() );
} else {
taskInfo = va( L"%ls - %ls (%ls)", objectiveTask->GetTitle(), objectiveTask->GetInfo()->GetXPString(), taskIndex.GetValue().c_str() );
}
} else {
taskInfo = common->LocalizeText( "guis/game/scoreboard/nomission" ).c_str();
}
} else {
taskInfo = L"";
}
}
*/
sdTeamInfo* team = localPlayer->GetGameTeam();
if ( team != NULL ) {
const sdPlayerTask::nodeType_t& objectiveTasks = sdTaskManager::GetInstance().GetObjectiveTasks( team );
sdPlayerTask* objectiveTask = objectiveTasks.Next();
if ( objectiveTask != NULL ) {
if( task == NULL ) {
objectiveTask->SelectWayPoints( gameLocal.time );
} else {
objectiveTask->SelectWayPoints( -1 );
}
}
}
taskSelectedTime = gameLocal.ToGuiTime( gameLocal.time );
}
/*
============
sdPlayerProperties::ClearTask
============
*/
void sdPlayerProperties::ClearTask() {
taskSelectedTime = 0;
taskInfo = L"";
}
/*
============
sdPlayerProperties::OnObituary
============
*/
void sdPlayerProperties::OnObituary( idPlayer* self, idPlayer* other ) {
if ( self == other || other == NULL || !( gameLocal.rules != NULL && gameLocal.rules->IsGameOn() ) ) {
return;
}
bool sameTeam = self->GetTeam() == other->GetTeam();
if ( self == localPlayer ) {
idWStrList parms;
parms.Append( other->userInfo.wideName );
if ( sameTeam ) {
lastKillMessage = common->LocalizeText( killedByPlayerTeamMessage, parms );
} else {
lastKillMessage = common->LocalizeText( killedByPlayerMessage, parms );
}
lastKillMessageTime = MS2SEC( gameLocal.ToGuiTime( gameLocal.time ) );
} else if ( other == localPlayer ) {
idWStrList parms;
parms.Append( self->userInfo.wideName );
if ( sameTeam ) {
lastKillMessage = common->LocalizeText( killedPlayerTeamMessage, parms );
} else {
lastKillMessage = common->LocalizeText( killedPlayerMessage, parms );
}
lastKillMessageTime = MS2SEC( gameLocal.ToGuiTime( gameLocal.time ) );
}
}
/*
============
sdPlayerProperties::OnActiveViewProxyChanged
============
*/
void sdPlayerProperties::OnActiveViewProxyChanged( idEntity* object ) {
proxyOverlay.Reset();
activeObjectView = object;
if ( object != NULL ) {
sdUsableInterface* iface = object->GetUsableInterface();
if ( iface != NULL ) {
const sdDeclGUI* gui = iface->GetOverlayGUI();
if ( gui != NULL ) {
proxyOverlay.Reset( new sdPassiveHudModule );
proxyOverlay->InitGui( gui->GetName(), false );
proxyOverlay->SetSort( object->spawnArgs.GetInt( "hud_sort", "0" ) );
}
}
}
if ( proxyOverlay.Get() != NULL && proxyOverlay->GetGuiHandle().IsValid() ) {
sdUserInterfaceLocal* ui = proxyOverlay->GetGui();
if ( ui != NULL ) {
proxyOverlay->Enable( true );
ui->Activate();
sdUsableInterface* iface = object->GetUsableInterface();
if ( iface != NULL ) {
for ( int i = 0; i < iface->GetNumPositions(); i++ ) {
SetupVehiclePosition( iface, i, ui );
}
}
}
}
}
/*
============
sdPlayerProperties::EnteredObject
============
*/
void sdPlayerProperties::EnteredObject( idPlayer* player, idEntity* object ) {
if ( activeObjectView != object ) {
return;
}
if ( proxyOverlay.Get() != NULL && proxyOverlay->GetGuiHandle().IsValid() ) {
sdUserInterfaceLocal* ui = proxyOverlay->GetGui();
if ( ui != NULL ) {
sdUsableInterface* iface = object->GetUsableInterface();
if ( iface != NULL ) {
SetupVehiclePosition( iface, player->GetProxyPositionId(), ui );
}
}
}
}
/*
============
sdPlayerProperties::ExitingObject
============
*/
void sdPlayerProperties::ExitingObject( idPlayer* player, idEntity* object ) {
if ( activeObjectView != object ) {
return;
}
if ( proxyOverlay.Get() != NULL && proxyOverlay->GetGuiHandle().IsValid() ) {
sdUserInterfaceLocal* ui = proxyOverlay->GetGui();
if ( ui != NULL ) {
sdUsableInterface* iface = object->GetUsableInterface();
if ( iface != NULL ) {
SetupVehiclePosition( iface, player->GetProxyPositionId(), ui );
}
}
}
}
/*
============
sdPlayerProperties::CloseActiveHudModules
============
*/
void sdPlayerProperties::CloseActiveHudModules( void ) {
while ( sdHudModule* module = activeHudModules.Next() ) {
module->Enable( false );
}
}
/*
============
sdPlayerProperties::ClosePassiveHudModules
============
*/
void sdPlayerProperties::ClosePassiveHudModules( void ) {
while ( sdHudModule* module = passiveHudModules.Next() ) {
module->Enable( false );
}
}
/*
============
sdPlayerProperties::CloseScriptHudModules
============
*/
void sdPlayerProperties::CloseScriptHudModules( void ) {
while ( sdHudModule* module = scriptHudModules.Next() ) {
module->Enable( false );
}
}
/*
============
sdPlayerProperties::AllocHudModule
============
*/
guiHandle_t sdPlayerProperties::AllocHudModule( const char* name, int sort, bool allowInhibit ) {
sdHudModule* module = new sdHudModule();
module->SetSort( sort );
module->InitGui( name, false );
module->SetAllowInhibit( allowInhibit );
sdUserInterfaceLocal* ui = module->GetGui();
if ( ui != NULL ) {
ui->Activate();
}
allocedHudModules.Alloc() = module;
PushScriptHudModule( *module );
AddDrawHudModule( *module );
return module->GetGuiHandle();
}
/*
============
sdPlayerProperties::FreeHudModule
============
*/
void sdPlayerProperties::FreeHudModule( guiHandle_t handle ) {
int i;
for ( i = 0; i < allocedHudModules.Num(); i++ ) {
if ( allocedHudModules[ i ]->GetGuiHandle() == handle ) {
sdUserInterfaceLocal* ui = gameLocal.GetUserInterface( handle );
if ( ui ) {
ui->Deactivate( true );
}
delete allocedHudModules[ i ];
allocedHudModules.RemoveIndex( i );
return;
}
}
}
/*
============
sdPlayerProperties::OnTeamChanged
============
*/
void sdPlayerProperties::OnTeamChanged( sdTeamInfo* oldTeam, sdTeamInfo* newTeam ) {
if ( GetQuickChatMenu() != NULL && quickChatMenu->Enabled() ) {
quickChatMenu->Enable( false );
}
if ( fireTeamMenu.Get() != NULL && fireTeamMenu->Enabled() ) {
fireTeamMenu->Enable( false );
}
UpdateTeam( newTeam );
OnSpawnChanged();
}
/*
============
sdPlayerProperties::OnDefaultSpawnChanged
============
*/
void sdPlayerProperties::OnDefaultSpawnChanged( sdTeamInfo* team, idEntity* newSpawn ) {
OnSpawnChanged();
}
/*
============
sdPlayerProperties::OnSetActiveSpawn
============
*/
void sdPlayerProperties::OnSetActiveSpawn( idEntity* newSpawn ) {
if ( !localPlayer ) {
return;
}
bool isDefault = false;
if ( !newSpawn ) {
isDefault = true;
sdTeamInfo* team = localPlayer->GetTeam();
if ( team ) {
newSpawn = team->GetDefaultSpawn();
}
}
if ( newSpawn ) {
currentSpawnPoint = newSpawn;
idScriptObject* obj = newSpawn->GetScriptObject();
if ( obj ) {
sdScriptHelper h2;
h2.Push( isDefault ? 1.f : 0.f );
obj->CallNonBlockingScriptEvent( obj->GetFunction( "OnSpawnPointSelected" ), h2 );
}
}
}
/*
============
sdPlayerProperties::SetCurrentSpawn
============
*/
void sdPlayerProperties::OnSpawnChanged( void ) {
idEntity* current = currentSpawnPoint;
if ( current != NULL && localPlayer != NULL && current == localPlayer->GetSpawnPoint() ) {
return;
}
if ( current ) {
idScriptObject* obj = current->GetScriptObject();
if ( obj ) {
sdScriptHelper h1;
obj->CallNonBlockingScriptEvent( obj->GetFunction( "OnSpawnPointDeselected" ), h1 );
}
}
currentSpawnPoint = NULL;
if ( localPlayer ) {
OnSetActiveSpawn( localPlayer->GetSpawnPoint() );
gameLocal.limboProperties.OnSetActiveSpawn( localPlayer->GetSpawnPoint() );
}
}
/*
============
sdPlayerProperties::OnTaskExpired
============
*/
void sdPlayerProperties::OnTaskExpired( sdPlayerTask* task ) {
taskExpiredTime = MS2SEC( gameLocal.ToGuiTime( gameLocal.time ) );
idWStrList args( 1 );
args.Append( task->GetTitle() );
taskStatus = common->LocalizeText( "guis/game/task_removed", args );
}
/*
============
sdPlayerProperties::OnTaskCompleted
============
*/
void sdPlayerProperties::OnTaskCompleted( sdPlayerTask* task ) {
taskCompletedTime = MS2SEC( gameLocal.ToGuiTime( gameLocal.time ) );
idWStrList args( 1 );
args.Append( task->GetCompletedTitle() );
taskStatus = common->LocalizeText( "guis/game/task_completed", args );
}
/*
===============================================================================
sdGlobalProperties
===============================================================================
*/
/*
================
sdGlobalProperties::sdGlobalProperties
================
*/
sdGlobalProperties::sdGlobalProperties( void ) {
}
/*
================
sdGlobalProperties::~sdGlobalProperties
================
*/
sdGlobalProperties::~sdGlobalProperties( void ) {
}
/*
================
sdGlobalProperties::Init
================
*/
void sdGlobalProperties::Init( void ) {
const sdDeclStringMap* stringMap = gameLocal.declStringMapType[ "guiGlobals" ];
if ( !stringMap ) {
return;
}
gameLocal.Printf( "Initializing global UI namespaces\n" );
sdGlobalPropertiesNameSpace::Init( stringMap->GetDict() );
gameLocal.Printf( "...%i namespaces\n...%i properties\n", GetNumNamespaces(), GetNumProperties() );
}
/*
============
sdGlobalProperties::Shutdown
============
*/
void sdGlobalProperties::Shutdown() {
sdGlobalPropertiesNameSpace::Shutdown();
}
/*
===============================================================================
sdGlobalPropertiesNameSpace
===============================================================================
*/
/*
================
sdGlobalPropertiesNameSpace::~sdGlobalPropertiesNameSpace
================
*/
sdGlobalPropertiesNameSpace::~sdGlobalPropertiesNameSpace( void ) {
namespaces.DeleteContents();
propertyValues.DeleteContents( true );
properties.Clear();
}
/*
================
sdGlobalPropertiesNameSpace::Shutdown
================
*/
void sdGlobalPropertiesNameSpace::Shutdown( void ) {
int i;
for ( i = 0; i < namespaces.Num(); i++ ) {
sdGlobalPropertiesNameSpace* ns = *namespaces.GetIndex( i );
ns->Shutdown();
}
propertyValues.DeleteContents( true );
properties.Clear();
}
/*
================
sdGlobalPropertiesNameSpace::Init
================
*/
void sdGlobalPropertiesNameSpace::Init( const idDict& dict ) {
int i;
for ( i = 0; i < dict.GetNumKeyVals(); i++ ) {
const idKeyValue* kv = dict.GetKeyVal( i );
const char* typeName = kv->GetValue();
if ( properties.GetProperty( kv->GetKey(), sdProperties::PT_INVALID, false ) ) {
continue;
}
if ( !idStr::Icmpn( "namespace_", kv->GetKey(), 10 ) ) {
const sdDeclStringMap* info = gameLocal.declStringMapType[ kv->GetValue() ];
if ( !info ) {
gameLocal.Error( "sdGlobalPropertiesNameSpace::Init Invalid Namespace Data '%s'", kv->GetKey().c_str() );
}
sdGlobalPropertiesNameSpace* ns = new sdGlobalPropertiesNameSpace();
ns->Init( info->GetDict() );
idStr name = kv->GetKey().Right( kv->GetKey().Length() - 10 );
name.ToLower();
namespaces.Set( name, ns );
continue;
}
if ( !idStr::Icmp( typeName, "float" ) ) {
sdFloatProperty* property = new sdFloatProperty;
*property = 0.f;
properties.RegisterProperty( kv->GetKey(), *property );
propertyValues.Append( property );
} else if ( !idStr::Icmp( typeName, "vec2" ) ) {
sdVec2Property* property = new sdVec2Property;
*property = vec2_origin;
properties.RegisterProperty( kv->GetKey(), *property );
propertyValues.Append( property );
} else if ( !idStr::Icmp( typeName, "vec3" ) ) {
sdVec3Property* property = new sdVec3Property;
*property = vec3_origin;
properties.RegisterProperty( kv->GetKey(), *property );
propertyValues.Append( property );
} else if ( !idStr::Icmp( typeName, "vec4" ) || !idStr::Icmp( typeName, "rect" ) || !idStr::Icmp( typeName, "color" ) ) {
sdVec4Property* property = new sdVec4Property;
*property = vec4_origin;
properties.RegisterProperty( kv->GetKey(), *property );
propertyValues.Append( property );
} else if ( !idStr::Icmp( typeName, "string" ) ) {
sdStringProperty* property = new sdStringProperty;
*property = "";
properties.RegisterProperty( kv->GetKey(), *property );
propertyValues.Append( property );
} else if ( !idStr::Icmp( typeName, "wstring" ) ) {
sdWStringProperty* property = new sdWStringProperty;
*property = L"";
properties.RegisterProperty( kv->GetKey(), *property );
propertyValues.Append( property );
} else if ( !idStr::Icmp( typeName, "handle" ) ) {
sdIntProperty* property = new sdIntProperty;
*property = -1;
properties.RegisterProperty( kv->GetKey(), *property );
propertyValues.Append( property );
} else {
gameLocal.Error( "sdGlobalPropertiesNameSpace::Init Invalid Type '%s'", typeName );
}
}
}
/*
================
sdGlobalPropertiesNameSpace::GetProperty
================
*/
sdProperties::sdProperty* sdGlobalPropertiesNameSpace::GetProperty( const char* name ) {
return properties.GetProperty( name, sdProperties::PT_INVALID, false );
}
/*
================
sdGlobalPropertiesNameSpace::GetProperty
================
*/
sdProperties::sdProperty* sdGlobalPropertiesNameSpace::GetProperty( const char* name, sdProperties::ePropertyType type ) {
sdProperties::sdProperty* prop = properties.GetProperty( name, sdProperties::PT_INVALID, false );
if ( prop && ( prop->GetValueType() != type && type != sdProperties::PT_INVALID ) ) {
gameLocal.Error( "sdGlobalPropertiesNameSpace::GetProperty: type mismatch for property '%s'", name );
}
return prop;
}
/*
================
sdGlobalPropertiesNameSpace::GetSubScope
================
*/
sdUserInterfaceScope* sdGlobalPropertiesNameSpace::GetSubScope( const char* name ) {
sdGlobalPropertiesNameSpace** ns;
idStr lower = name;
lower.ToLower();
if ( !namespaces.Get( lower.c_str(), &ns ) ) {
return NULL;
}
return *ns;
}
/*
============
sdGlobalPropertiesNameSpace::GetNumProperties
============
*/
int sdGlobalPropertiesNameSpace::GetNumProperties() const {
int total = GetProperties().Num();
for( int i = 0; i < namespaces.Num(); i++ ) {
total += (*namespaces.GetIndex( i ))->GetNumProperties();
}
return total;
}
/*
============
sdGlobalPropertiesNameSpace::GetNumNamespaces
============
*/
int sdGlobalPropertiesNameSpace::GetNumNamespaces() const {
int total = 1;
for( int i = 0; i < namespaces.Num(); i++ ) {
total += (*namespaces.GetIndex( i ))->GetNumNamespaces();
}
return total;
}
/*
============
sdPlayerProperties::AddDrawHudModule
smaller values are drawn after larger values
============
*/
void sdPlayerProperties::AddDrawHudModule( sdHudModule& module ) {
int localSort = module.GetSort();
sdHudModule* other;
for ( other = GetDrawHudModule(); other; other = other->GetDrawNode().Next() ) {
if ( localSort >= other->GetSort() ) {
module.GetDrawNode().InsertBefore( other->GetDrawNode() );
return;
}
}
module.GetDrawNode().AddToEnd( drawHudModules );
}
/*
============
sdPlayerProperties::ShouldShowEndGame
============
*/
bool sdPlayerProperties::ShouldShowEndGame() const {
return activateEndGame != 0 && gameLocal.time >= activateEndGame;
}
/*
============
sdPlayerProperties::SetActiveCamera
============
*/
void sdPlayerProperties::SetActiveCamera( idEntity* camera ) {
if ( camera == activeCameraEntity ) {
return;
}
idEntity* cam = activeCameraEntity;
if ( cam != NULL ) {
idScriptObject* obj = cam->GetScriptObject();
if ( obj != NULL ) {
sdScriptHelper h1;
obj->CallNonBlockingScriptEvent( obj->GetFunction( "OnFinishRemoteCamera" ), h1 );
}
}
activeCameraEntity = camera;
if ( camera != NULL ) {
idScriptObject* obj = camera->GetScriptObject();
if ( obj != NULL ) {
sdScriptHelper h1;
obj->CallNonBlockingScriptEvent( obj->GetFunction( "OnBecomeRemoteCamera" ), h1 );
}
}
}
/*
============
sdPlayerProperties::SetActiveTask
============
*/
void sdPlayerProperties::SetActiveTask( sdPlayerTask* task ) {
sdPlayerTask* currentTask = NULL;
if ( activeTask.IsValid() ) {
currentTask = sdTaskManager::GetInstance().TaskForHandle( activeTask );
}
if ( currentTask == task ) {
return;
}
if ( currentTask != NULL ) {
if ( !currentTask->IsObjective() ) {
currentTask->HideWayPoint(); // Gordon: Objective waypoints are always active
}
idScriptObject* obj = currentTask->GetScriptObject();
if ( obj != NULL ) {
obj->CallEvent( "OnTaskDeselected" );
}
currentTask->SelectWayPoints( -1 );
}
if ( task == NULL ) {
activeTask = taskHandle_t();
return;
}
activeTask = task->GetHandle();
task->ShowWayPoint();
idScriptObject* obj = task->GetScriptObject();
if ( obj != NULL ) {
obj->CallEvent( "OnTaskSelected" );
}
task->SelectWayPoints( gameLocal.time );
}
/*
============
sdPlayerProperties::SetActiveWeapon
============
*/
void sdPlayerProperties::SetActiveWeapon( idWeapon* weapon ) {
if ( weapon == activeWeaponEntity ) {
return;
}
idWeapon* weap = activeWeaponEntity;
if ( weap != NULL ) {
idScriptObject* obj = weap->GetScriptObject();
if ( obj != NULL ) {
sdScriptHelper h1;
obj->CallNonBlockingScriptEvent( obj->GetFunction( "OnFinishViewWeapon" ), h1 );
}
idPlayer* viewPlayer = gameLocal.GetLocalViewPlayer();
if ( viewPlayer != NULL ) {
sdTransport* transport = viewPlayer->GetProxyEntity()->Cast<sdTransport>();
if ( transport != NULL ) {
sdVehicleWeapon* vehicleWeap = transport->GetActiveWeapon( viewPlayer );
if ( vehicleWeap != NULL ) {
idScriptObject* obj = vehicleWeap->GetScriptObject();
if ( obj != NULL ) {
sdScriptHelper h1;
obj->CallNonBlockingScriptEvent( obj->GetFunction( "OnFinishViewWeapon" ), h1 );
}
}
}
}
}
activeWeaponEntity = weapon;
if ( weapon != NULL ) {
idScriptObject* obj = weapon->GetScriptObject();
if ( obj != NULL ) {
sdScriptHelper h1;
obj->CallNonBlockingScriptEvent( obj->GetFunction( "OnBecomeViewWeapon" ), h1 );
}
idPlayer* viewPlayer = gameLocal.GetLocalViewPlayer();
if ( viewPlayer != NULL ) {
sdTransport* transport = viewPlayer->GetProxyEntity()->Cast<sdTransport>();
if ( transport != NULL ) {
sdVehicleWeapon* vehicleWeap = transport->GetActiveWeapon( viewPlayer );
if ( vehicleWeap != NULL ) {
idScriptObject* obj = vehicleWeap->GetScriptObject();
if ( obj != NULL ) {
sdScriptHelper h1;
obj->CallNonBlockingScriptEvent( obj->GetFunction( "OnBecomeViewWeapon" ), h1 );
}
}
}
}
}
}
/*
============
sdPlayerProperties::GetActivePlayer
============
*/
idPlayer* sdPlayerProperties::GetActivePlayer( void ) {
return activePlayerEntity.GetEntity();
}
/*
============
sdPlayerProperties::SetActivePlayer
============
*/
void sdPlayerProperties::SetActivePlayer( idPlayer* player ) {
if ( player == activePlayerEntity ) {
return;
}
idPlayer* p = activePlayerEntity;
if ( p != NULL ) {
sdScriptHelper h1;
p->CallNonBlockingScriptEvent( p->GetScriptFunction( "OnExitView" ), h1 );
}
activePlayerEntity = player;
if ( activePlayerEntity != NULL ) {
sdScriptHelper h1;
activePlayerEntity->CallNonBlockingScriptEvent( activePlayerEntity->GetScriptFunction( "OnEnterView" ), h1 );
}
}
/*
============
sdPlayerProperties::SetCriticalClass
jrad - ack...
============
*/
void sdPlayerProperties::SetCriticalClass( const playerTeamTypes_t playerTeam, const playerClassTypes_t criticalClass ) {
sdStringProperty* prop = NULL;
switch( playerTeam ) {
case GDF:
switch( criticalClass ) {
case SOLDIER:
gdfCriticalClass = "soldier";
break;
case MEDIC:
gdfCriticalClass = "medic";
break;
case ENGINEER:
gdfCriticalClass = "engineer";
break;
case FIELDOPS:
gdfCriticalClass = "fieldops";
break;
case COVERTOPS:
gdfCriticalClass = "covertops";
break;
default:
gdfCriticalClass = "";
break;
}
break;
case STROGG:
switch( criticalClass ) {
case SOLDIER:
stroggCriticalClass = "aggressor";
break;
case MEDIC:
stroggCriticalClass = "technician";
break;
case ENGINEER:
stroggCriticalClass = "constructor";
break;
case FIELDOPS:
stroggCriticalClass = "oppressor";
break;
case COVERTOPS:
stroggCriticalClass = "infiltrator";
break;
default:
stroggCriticalClass = "";
break;
}
break;
}
}