2935 lines
104 KiB
C++
2935 lines
104 KiB
C++
/////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FILE : MultiplayerGamerTagHud.cpp
|
|
// PURPOSE : manages the Scaleform multiplayer gamer tag hud
|
|
// AUTHOR : Derek Payne
|
|
// STARTED : 08/03/2012
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// fw:
|
|
#include "fwnet/nettypes.h"
|
|
#include "fwsys/gameskeleton.h"
|
|
|
|
// game:
|
|
#include "Frontend/MultiplayerGamerTagHud.h"
|
|
|
|
#include "camera/CamInterface.h"
|
|
#include "camera/gameplay/GameplayDirector.h"
|
|
#include "camera/viewports/Viewport.h"
|
|
#include "Frontend/hud_colour.h"
|
|
#include "Peds/ped.h"
|
|
#include "Network/Live/livemanager.h"
|
|
#include "Network/Live/NetworkClan.h"
|
|
#include "network/NetworkInterface.h"
|
|
#include "network/Players/NetGamePlayer.h"
|
|
#include "Frontend/HudTools.h"
|
|
#include "Frontend/Scaleform/ScaleFormMgr.h"
|
|
#include "Frontend/PauseMenu.h"
|
|
#include "frontend/ui_channel.h"
|
|
#include "renderer/PostProcessFXHelper.h"
|
|
#include "scene/world/GameWorld.h"
|
|
#include "script/script_hud.h"
|
|
#include "Vfx/VfxHelper.h"
|
|
|
|
//FRONTEND_OPTIMISATIONS();
|
|
//OPTIMISATIONS_OFF();
|
|
|
|
#define GAMER_INFO_FILENAME "mp_gamer_info"
|
|
#define GAMERTAG_CENTER_OBJECT "GAMERTAG_CENTER"
|
|
#define GAMERTAG_LEFT_OBJECT "GAMERTAG_LEFT"
|
|
|
|
#define HEALTH_ARMOUR_NAME "HealthArmour"
|
|
#define HEALTH_NO_ARMOUR_NAME "HealthNoArmour"
|
|
#if ARCHIVED_SUMMER_CONTENT_ENABLED
|
|
#define GAMER_INFO_FILENAME_CNC "CNC_GAMER_INFO"
|
|
#define HEALTH_CNC_NO_ARMOUR_NAME "HealthCNC"
|
|
#define HEALTH_CNC_NO_ARMOUR_NO_ENDURANCE_NAME "HealthNoEnduranceCNC"
|
|
#endif
|
|
#define MOVIE_DEPTH_ROOT (1)
|
|
|
|
#if !__FINAL
|
|
PARAM(enableFarGamerTagDistance, "Makes gamer tags work at superfar distances.");
|
|
#endif
|
|
|
|
float CMultiplayerGamerTagHud::sm_fVerticalOffset = 0.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_iconSpacing = 2.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_afterGamerNameSpacing = 4.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_aboveGamerNameSpacing = -19.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_minScaleSize = 0.8f;
|
|
bank_float CMultiplayerGamerTagHud::sm_maxScaleSize = 1.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_nearScalingDistance = 10.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_farScalingDistance = 50.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_maxVisibleDistance = 100.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_maxVisibleSpectatingDistance = 200.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_leftIconXOffset = 50.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_4x3Scaler = 120.0f;
|
|
bank_float CMultiplayerGamerTagHud::sm_bikeOffset = -.08f;
|
|
bank_float CMultiplayerGamerTagHud::sm_defaultVehicleOffset = -.5f;
|
|
bank_float CMultiplayerGamerTagHud::sm_vehicleXSpacing = 0.035f;
|
|
bank_float CMultiplayerGamerTagHud::sm_vehicleYSpacing = 0.023f;
|
|
bank_s32 CMultiplayerGamerTagHud::sm_minSeatCountToGridNames = 2;
|
|
|
|
bool CMultiplayerGamerTagHud::sm_staticDataInited = false;
|
|
float CMultiplayerGamerTagHud::sm_tagWidths[MAX_MP_TAGS] = {0.0f};
|
|
eMP_TAG CMultiplayerGamerTagHud::sm_tagOrder[MAX_MP_TAGS] = {MP_TAG_GAMER_NAME};
|
|
|
|
struct GamerDepthInfo
|
|
{
|
|
float m_depth;
|
|
s16 m_playerIndex;
|
|
|
|
GamerDepthInfo(): m_playerIndex(-1), m_depth(-1.0f) {}
|
|
GamerDepthInfo(float depth, s16 playerIndex): m_playerIndex(playerIndex), m_depth(depth) {}
|
|
|
|
static int DepthCompare(const GamerDepthInfo* info1, const GamerDepthInfo* info2)
|
|
{
|
|
return (info1->m_depth < info2->m_depth) ? 1 : -1;
|
|
}
|
|
};
|
|
|
|
void sGamerTag::Reset()
|
|
{
|
|
if (CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "sGamerTag::Reset can only be called on the UpdateThread!");
|
|
return;
|
|
}
|
|
|
|
m_rtDepth = -1;
|
|
m_reinitCrewTag = false;
|
|
|
|
memset(m_playerName, 0, RL_MAX_DISPLAY_NAME_BUF_SIZE);
|
|
memset(m_refName, 0, MAX_REF_NAME_SIZE);
|
|
memset(m_bigtext, 0, MAX_BIG_TEXT_SIZE);
|
|
|
|
memset(m_crewTag, 0, NetworkClan::FORMATTED_CLAN_TAG_LEN);
|
|
NetworkClan::GetUIFormattedClanTag(false, true, "", -1, CHudColour::GetRGBA(HUD_COLOUR_WHITE), m_crewTag, NetworkClan::FORMATTED_CLAN_TAG_LEN);
|
|
|
|
m_gamerTagWidth = 0.0f;
|
|
|
|
m_utPhysical = NULL;
|
|
m_reinitPositions = true;
|
|
m_reinitPosDueToAlpha = false;
|
|
m_reinitBigText = false;
|
|
m_useVehicleHealth = false;
|
|
BANK_ONLY(m_debugCloneTagFromPedForVehicle = false;)
|
|
m_initPending = false;
|
|
m_isActive = false;
|
|
m_needsPositionUpdate = true;
|
|
m_activeReinit.GetWriteBuf() = false;
|
|
m_removeGfxValuePending = false;
|
|
m_destroyPending = false;
|
|
m_renderWhenPaused = false;
|
|
m_hiddenDueToBigVehicle = false;
|
|
m_showEvenInBigVehicles = false;
|
|
|
|
m_bUsePointHealth = false;
|
|
m_iPoints = -1;
|
|
m_iMaxPoints = -1;
|
|
|
|
m_TagReinitFlags.GetWriteBuf().Reset();
|
|
|
|
for (s32 j = 0; j < MAX_MP_TAGS; j++)
|
|
{
|
|
m_updateAlpha[j] = false;
|
|
m_visibleFlag[j] = false;
|
|
m_value[j] = -1;
|
|
m_colour[j] = HUD_COLOUR_INVALID;
|
|
m_alpha[j] = 0;
|
|
}
|
|
|
|
m_healthBarColourDirty.GetWriteBuf() = true;
|
|
m_healthBarColour = HUD_COLOUR_WHITE;
|
|
|
|
m_visible.GetWriteBuf() = false;
|
|
m_scale.GetWriteBuf() = 1.0f;
|
|
m_screenPos.GetWriteBuf() = Vector2(-1.0f,-1.0f);
|
|
m_playerPos.GetWriteBuf() = Vector3(-1.0f,-1.0f,-1.0f);
|
|
|
|
m_healthInfo.GetWriteBuf().Reset();
|
|
m_previousHealthInfo.Reset();
|
|
|
|
if (m_asGamerTagContainerMc.IsDefined())
|
|
{
|
|
m_asGamerTagContainerMc.Invoke("removeMovieClip");
|
|
m_asGamerTagContainerMc.SetUndefined();
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// __BANK - all debug stuff shown appear under here
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
#if __BANK
|
|
static s32 iDebugGamerIndex = MAX_NUM_PHYSICAL_PLAYERS;
|
|
static s32 iDebugTagId = -1;
|
|
static s32 iDebugTagValue = 0;
|
|
static int iDebugHealthPercent = -1;
|
|
static int iDebugArmorPercent = -1;
|
|
static int iDebugCurrentPoints = -1;
|
|
static int iDebugMaxPoints = -1;
|
|
static s32 iDebugTagAlpha = 255;
|
|
static u16 uDebugCurrentFakePassengerSeatIndex = 0;
|
|
static u16 uDebugNumFakeVehiclePassengers = 0;
|
|
static bool bDebugFillVehicleWithGamerTags = false;
|
|
static bool bDebugUseVehicleHealth = false;
|
|
static bool bDebugUsePointHealth = false;
|
|
static bool bDebugIsCrewTagPrivate = true;
|
|
static bool bDebugCrewTagContainsRockstar = true;
|
|
static bool bDebugAddToPeds = false;
|
|
static s32 iDebugCrewRank = 0;
|
|
static u8 uDebugCrewR = 255;
|
|
static u8 uDebugCrewG = 255;
|
|
static u8 uDebugCrewB = 255;
|
|
static char cDebugGamerTag[RL_MAX_DISPLAY_NAME_BUF_SIZE] = {0};
|
|
static char cDebugClanTag[RL_CLAN_TAG_MAX_CHARS] = {0};
|
|
static char cDebugBigText[MAX_BIG_TEXT_SIZE] = {0};
|
|
static char cDebugTagName[100] = {0};
|
|
static s32 iDebugVehicleUsageCount = -1;
|
|
static float fDebugVerticalOffset = 0.0f;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::InitWidgets()
|
|
// PURPOSE: inits the ui bank widget and "Create" button
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::InitWidgets()
|
|
{
|
|
bkBank *pBank = BANKMGR.FindBank(UI_DEBUG_BANK_NAME);
|
|
|
|
formatf(cDebugGamerTag, RL_MAX_DISPLAY_NAME_BUF_SIZE, "xxx xxx C xxx xx");
|
|
formatf(cDebugClanTag, RL_CLAN_TAG_MAX_CHARS, "Test");
|
|
|
|
if (!pBank) // create the bank if not found
|
|
{
|
|
pBank = &BANKMGR.CreateBank(UI_DEBUG_BANK_NAME);
|
|
}
|
|
|
|
if (pBank)
|
|
{
|
|
pBank->AddButton("Create MP Gamer Tag widgets", &CMultiplayerGamerTagHud::CreateBankWidgets);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::CreateBankWidgets()
|
|
// PURPOSE: creates the bank widget
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::CreateBankWidgets()
|
|
{
|
|
static bool bBankCreated = false;
|
|
|
|
bkBank *bank = BANKMGR.FindBank(UI_DEBUG_BANK_NAME);
|
|
|
|
if ((!bBankCreated) && (bank))
|
|
{
|
|
UpdateDebugTagSelected();
|
|
|
|
bank->PushGroup("MP Gamer Tags");
|
|
|
|
bank->AddToggle("Give Random peds tags", &bDebugAddToPeds);
|
|
bank->AddToggle("Tag Widths Inited", &sm_staticDataInited);
|
|
bank->AddSlider("Max Visible Distance", &CMultiplayerGamerTagHud::sm_maxVisibleDistance, 0.0f, 100000.0f, 0.1f);
|
|
bank->AddSlider("Max Spectating Visible Distance", &CMultiplayerGamerTagHud::sm_maxVisibleSpectatingDistance, 0.0f, 100000.0f, 0.1f);
|
|
bank->AddSlider("Near Scaling Distance", &CMultiplayerGamerTagHud::sm_nearScalingDistance, 0.0f, 200.0f, 0.1f);
|
|
bank->AddSlider("Far Scaling Distance", &CMultiplayerGamerTagHud::sm_farScalingDistance, 0.0f, 200.0f, 0.1f);
|
|
bank->AddSlider("Min Scale Size", &CMultiplayerGamerTagHud::sm_minScaleSize, 0.0f, 2.0f, 0.01f);
|
|
bank->AddSlider("Max Scale Size", &CMultiplayerGamerTagHud::sm_maxScaleSize, 0.0f, 2.0f, 0.01f);
|
|
bank->AddSlider("Left Icons X Offset", &CMultiplayerGamerTagHud::sm_leftIconXOffset, -100.0f, 100.0f, 1.0f);
|
|
bank->AddSlider("4x3 Scaler", &CMultiplayerGamerTagHud::sm_4x3Scaler, 0.0f, 1000.0f, 1.0f);
|
|
bank->AddSlider("Default Vehicle Offset", &CMultiplayerGamerTagHud::sm_defaultVehicleOffset, -1.0f, 1.0f, 0.001f);
|
|
bank->AddSlider("Bike Offset", &CMultiplayerGamerTagHud::sm_bikeOffset, -1.0f, 1.0f, 0.001f);
|
|
bank->AddSlider("Min Seat Count To Grid Names", &CMultiplayerGamerTagHud::sm_minSeatCountToGridNames, 1, 10, 1);
|
|
bank->AddSlider("Vehicle X Spacing", &CMultiplayerGamerTagHud::sm_vehicleXSpacing, -1.0f, 1.0f, 0.001f);
|
|
bank->AddSlider("Vehicle Y Spacing", &CMultiplayerGamerTagHud::sm_vehicleYSpacing, -1.0f, 1.0f, 0.001f);
|
|
bank->AddSlider("Vehicle Usage Count", &iDebugVehicleUsageCount, -1, MAX_PLAYERS_WITH_GAMER_TAGS-1, 1);
|
|
bank->AddSlider("Icon Spacing", &CMultiplayerGamerTagHud::sm_iconSpacing, -50.0f, 50.0f, 0.01f);
|
|
bank->AddSlider("After Gamer Name Spacing", &CMultiplayerGamerTagHud::sm_afterGamerNameSpacing, -50.0f, 50.0f, 0.01f);
|
|
bank->AddSlider("Above Gamer Name Spacing", &CMultiplayerGamerTagHud::sm_aboveGamerNameSpacing, -50.0f, 50.0f, 0.01f);
|
|
|
|
bank->AddSeparator();
|
|
|
|
bank->AddButton("Create Tag for player", &CMultiplayerGamerTagHud::CreateDebugTagForPlayer);
|
|
bank->AddButton("Remove Tag for player", &CMultiplayerGamerTagHud::RemoveDebugTagForPlayer);
|
|
bank->AddButton("Create Tag for vehicle", &CMultiplayerGamerTagHud::CreateDebugTagForVehicle);
|
|
bank->AddButton("Update Crew Tag", &CMultiplayerGamerTagHud::UpdateDebugCrewTag);
|
|
bank->AddToggle("Clone Player Tag for All Vehicle Seats", &bDebugFillVehicleWithGamerTags);
|
|
bank->AddSlider("Gamer Index", &iDebugGamerIndex, 0, MAX_PLAYERS_WITH_GAMER_TAGS-1, 1, &CMultiplayerGamerTagHud::UpdateDebugTagSelected);
|
|
bank->AddToggle("Crew Tag Private", &bDebugIsCrewTagPrivate);
|
|
bank->AddToggle("Crew Tag Contains R*", &bDebugCrewTagContainsRockstar);
|
|
bank->AddSlider("Crew Hierarchy", &iDebugCrewRank, 0, 5, 1);
|
|
bank->AddSlider("Crew Color R", &uDebugCrewR, 0, 255, 1);
|
|
bank->AddSlider("Crew Color G", &uDebugCrewG, 0, 255, 1);
|
|
bank->AddSlider("Crew Color B", &uDebugCrewB, 0, 255, 1);
|
|
bank->AddText("Gamer Tag", cDebugGamerTag, RL_MAX_DISPLAY_NAME_BUF_SIZE);
|
|
bank->AddText("Clan Tag", cDebugClanTag, RL_CLAN_TAG_MAX_CHARS);
|
|
|
|
bank->AddSeparator();
|
|
|
|
bank->AddSlider("Tag ID", &iDebugTagId, -1, (s32)MAX_MP_TAGS-1, 1, &CMultiplayerGamerTagHud::UpdateDebugTagName);
|
|
bank->AddText("Tag Info", cDebugTagName, sizeof(cDebugTagName));
|
|
bank->AddToggle("Use Vehicle Health", &bDebugUseVehicleHealth, &CMultiplayerGamerTagHud::UpdateDebugTagUseVehicleHealth);
|
|
bank->AddToggle("Use Point Health", &bDebugUsePointHealth, &CMultiplayerGamerTagHud::UpdateDebugTagUsePointHealth);
|
|
|
|
bank->AddButton("Set Tag Visibility ON", &CMultiplayerGamerTagHud::ToggleDebugTagVisiblityOn);
|
|
bank->AddButton("Set Tag Visibility OFF", &CMultiplayerGamerTagHud::ToggleDebugTagVisiblityOff);
|
|
|
|
bank->AddSlider("Set Tag Alpha", &iDebugTagAlpha, 0, 255, 1, &CMultiplayerGamerTagHud::SetDebugTagAlpha);
|
|
bank->AddSlider("Tag Value", &iDebugTagValue, 0, 10, 1);
|
|
bank->AddSlider("Health Percent", &iDebugHealthPercent, -1, 100, 1);
|
|
bank->AddSlider("Armor Percent", &iDebugArmorPercent, -1, 100, 1);
|
|
bank->AddSlider("Current Points", &iDebugCurrentPoints, -1, 500, 1);
|
|
bank->AddSlider("Max Points", &iDebugMaxPoints, -1, 500, 1);
|
|
|
|
bank->AddButton("Set Tag Value", &CMultiplayerGamerTagHud::SetDebugTagValue);
|
|
|
|
bank->AddText("Big Text", cDebugBigText, MAX_BIG_TEXT_SIZE);
|
|
bank->AddButton("Update Big Text", &CMultiplayerGamerTagHud::SetDebugBigText);
|
|
|
|
bank->AddText("Vertical Screen Offset", &fDebugVerticalOffset, false);
|
|
bank->AddButton("Set Screen Offset", &CMultiplayerGamerTagHud::UpdateDebugTagVerticalOffset);
|
|
|
|
bank->PopGroup();
|
|
|
|
bBankCreated = true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::ShutdownWidgets()
|
|
// PURPOSE: removes the bank widget
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::ShutdownWidgets()
|
|
{
|
|
bkBank *pBank = BANKMGR.FindBank(UI_DEBUG_BANK_NAME);
|
|
|
|
if (pBank)
|
|
{
|
|
pBank->Destroy();
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UpdateDebugFakePassengerTags()
|
|
{
|
|
uDebugCurrentFakePassengerSeatIndex = 0;
|
|
|
|
int localIndex = UT_GetLocalPlayerTag();
|
|
if(localIndex != GAMER_TAG_INVALID_INDEX)
|
|
{
|
|
// Create new tag and clone from local player
|
|
CPhysical* pLocalPhys = UT_GetPhysical(localIndex);
|
|
if(pLocalPhys)
|
|
{
|
|
const CPed *pLocalPed = pLocalPhys->GetIsTypePed() ? reinterpret_cast<const CPed*>(pLocalPhys) : NULL;
|
|
|
|
if(pLocalPed && pLocalPed->GetIsInVehicle())
|
|
{
|
|
if(bDebugFillVehicleWithGamerTags)
|
|
{
|
|
CVehicle* pVehicle = pLocalPed->GetMyVehicle();
|
|
const CSeatManager* pSeatManager = pVehicle->GetSeatManager();
|
|
if(pSeatManager)
|
|
{
|
|
uDebugNumFakeVehiclePassengers = (u16)pSeatManager->GetMaxSeats()-1;
|
|
for(int i = 0; i < uDebugNumFakeVehiclePassengers; ++i)
|
|
{
|
|
char fakeName[128];
|
|
sprintf(fakeName, "%s%i", m_gamerTags[localIndex].m_playerName, i);
|
|
int cloneIndex = UT_CreateFakePlayerTag(pLocalPhys, fakeName, m_gamerTags[localIndex].m_crewTag, true);
|
|
UT_SetGamerTagVisibility(cloneIndex, MP_TAG_GAMER_NAME, true);
|
|
|
|
if(cloneIndex != GAMER_TAG_INVALID_INDEX)
|
|
{
|
|
m_gamerTags[cloneIndex].m_debugCloneTagFromPedForVehicle = true;
|
|
}
|
|
}
|
|
|
|
// Force show the local player's name
|
|
UT_SetGamerTagVisibility(localIndex, MP_TAG_GAMER_NAME, true);
|
|
}
|
|
|
|
// Clear flag so this only happens once
|
|
bDebugFillVehicleWithGamerTags = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for(int i = 0; i < MAX_PLAYERS_WITH_GAMER_TAGS; ++i)
|
|
{
|
|
if(m_gamerTags[i].m_debugCloneTagFromPedForVehicle && !m_gamerTags[i].IsStateShuttingDown())
|
|
{
|
|
UT_RemovePlayerTag(i);
|
|
}
|
|
}
|
|
|
|
uDebugNumFakeVehiclePassengers = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::CreateDebugTagForPlayer()
|
|
{
|
|
CMultiplayerGamerTagHud::Init(INIT_SESSION);
|
|
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
char crewTagBuffer[NetworkClan::FORMATTED_CLAN_TAG_LEN] = {0};
|
|
NetworkClan::GetUIFormattedClanTag(!bDebugIsCrewTagPrivate, bDebugCrewTagContainsRockstar, cDebugClanTag, iDebugCrewRank, CRGBA(uDebugCrewR, uDebugCrewG, uDebugCrewB), crewTagBuffer, NetworkClan::FORMATTED_CLAN_TAG_LEN);
|
|
|
|
SMultiplayerGamerTagHud::GetInstance().UT_CreateFakePlayerTag(CGameWorld::FindLocalPlayer(), cDebugGamerTag, crewTagBuffer);
|
|
}
|
|
|
|
UpdateDebugTagName();
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::RemoveDebugTagForPlayer()
|
|
{
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().UT_RemovePlayerTag(DEBUG_GAMER_TAG);
|
|
}
|
|
|
|
CMultiplayerGamerTagHud::Shutdown(SHUTDOWN_SESSION);
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::CreateDebugTagForVehicle()
|
|
{
|
|
CMultiplayerGamerTagHud::Init(INIT_SESSION);
|
|
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
CPed* pPlayerPed = CGameWorld::FindLocalPlayer();
|
|
CVehicle* pVehicle = pPlayerPed ? pPlayerPed->GetVehiclePedInside() : NULL;
|
|
|
|
if(pVehicle)
|
|
{
|
|
s32 tagId = SMultiplayerGamerTagHud::GetInstance().UT_CreateFakePlayerTag(pVehicle, "", "");
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetGamerTagVisibility(tagId, MP_TAG_GAMER_NAME, true);
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetGamerTagVisibility(tagId, MP_TAG_HEALTH_BAR, true);
|
|
}
|
|
}
|
|
|
|
UpdateDebugTagName();
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UpdateDebugTagName()
|
|
{
|
|
if (iDebugTagId == -1)
|
|
{
|
|
formatf(cDebugTagName, sizeof(cDebugTagName), "INVALID");
|
|
}
|
|
else
|
|
{
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
CMultiplayerGamerTagHud& rMPGamerTagHud = SMultiplayerGamerTagHud::GetInstance();
|
|
|
|
bool isVisible=false;
|
|
eTAG_FLAGS tagFlags = TF_NONE;
|
|
if(rMPGamerTagHud.m_movie.IsActive())
|
|
{
|
|
const sGamerTag* pTag = rMPGamerTagHud.UT_GetActiveGamerTag(iDebugGamerIndex);
|
|
if(pTag)
|
|
{
|
|
isVisible = pTag->m_visibleFlag[iDebugTagId];
|
|
float alpha = static_cast<float>(pTag->m_alpha[iDebugTagId]);
|
|
iDebugTagAlpha = static_cast<int>(alpha*255.0f/100.0f);
|
|
}
|
|
|
|
tagFlags = rMPGamerTagHud.m_rtTagFlags[iDebugTagId];
|
|
}
|
|
|
|
formatf(cDebugTagName, sizeof(cDebugTagName), "%s(valid=%d, vis=%d, flags=%d)", rMPGamerTagHud.m_GamerTagNames[iDebugTagId], (tagFlags & TF_LOCATION_MASK)?1:0, isVisible, tagFlags);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UpdateDebugTagSelected()
|
|
{
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
CMultiplayerGamerTagHud& rMPGamerTagHud = SMultiplayerGamerTagHud::GetInstance();
|
|
if(rMPGamerTagHud.m_movie.IsActive())
|
|
{
|
|
const sGamerTag* pTag = rMPGamerTagHud.UT_GetActiveGamerTag(iDebugGamerIndex);
|
|
if(pTag)
|
|
{
|
|
bDebugUseVehicleHealth = pTag->m_useVehicleHealth;
|
|
iDebugHealthPercent = pTag->m_previousHealthInfo.m_iHealthPercentageValue;
|
|
iDebugArmorPercent = pTag->m_previousHealthInfo.m_iArmourPercentageValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
UpdateDebugTagName();
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UpdateDebugCrewTag()
|
|
{
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
char crewTagBuffer[NetworkClan::FORMATTED_CLAN_TAG_LEN] = {0};
|
|
NetworkClan::GetUIFormattedClanTag(!bDebugIsCrewTagPrivate, bDebugCrewTagContainsRockstar, cDebugClanTag, iDebugCrewRank, CRGBA(uDebugCrewR, uDebugCrewG, uDebugCrewB), crewTagBuffer, NetworkClan::FORMATTED_CLAN_TAG_LEN);
|
|
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetGamerTagCrewDetails(iDebugGamerIndex, crewTagBuffer);
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UpdateDebugTagVerticalOffset()
|
|
{
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetGamerTagVerticalOffset(fDebugVerticalOffset);
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UpdateDebugTagUseVehicleHealth()
|
|
{
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetGamerTagsShouldUseVehicleHealth(iDebugGamerIndex, bDebugUseVehicleHealth);
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UpdateDebugTagUsePointHealth()
|
|
{
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetGamerTagsShouldUsePointHealth(iDebugGamerIndex, bDebugUsePointHealth);
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::ToggleDebugTagVisiblityOn()
|
|
{
|
|
if (iDebugTagId == -1)
|
|
return;
|
|
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetGamerTagVisibility(iDebugGamerIndex, (eMP_TAG)iDebugTagId, true);
|
|
}
|
|
|
|
UpdateDebugTagName();
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::ToggleDebugTagVisiblityOff()
|
|
{
|
|
if (iDebugTagId == -1)
|
|
return;
|
|
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetGamerTagVisibility(iDebugGamerIndex, (eMP_TAG)iDebugTagId, false);
|
|
}
|
|
|
|
UpdateDebugTagName();
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::SetDebugTagAlpha()
|
|
{
|
|
if (iDebugTagId == -1)
|
|
return;
|
|
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetGamerTagValueHudAlpha(iDebugGamerIndex, (eMP_TAG)iDebugTagId, iDebugTagAlpha);
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::SetDebugTagValue()
|
|
{
|
|
if (iDebugTagId == -1)
|
|
return;
|
|
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetGamerTagValueInt(iDebugGamerIndex, (eMP_TAG)iDebugTagId, iDebugTagValue);
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::SetDebugBigText()
|
|
{
|
|
if (iDebugTagId == -1)
|
|
return;
|
|
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().UT_SetBigText(iDebugGamerIndex, cDebugBigText);
|
|
}
|
|
}
|
|
|
|
#endif // __BANK
|
|
|
|
CMultiplayerGamerTagHud::CMultiplayerGamerTagHud() :
|
|
m_rootCreated(false),
|
|
m_deletePending(false)
|
|
{
|
|
m_movie.CreateMovie(SF_BASE_CLASS_HUD, GAMER_INFO_FILENAME, Vector2(0.0f, 0.0f), Vector2(1.0f, 1.0f));
|
|
|
|
#if !__NO_OUTPUT
|
|
#define GAMER_TAG_OBJ(val, asName, defaultTags) m_GamerTagNames[val] = #val;
|
|
GAMER_TAG_LIST
|
|
#undef GAMER_TAG_OBJ
|
|
#endif //!__NO_OUTPUT
|
|
|
|
#define GAMER_TAG_OBJ(val, asName, defaultTags) m_GamerTagASNames[val] = #asName;
|
|
GAMER_TAG_LIST
|
|
#undef GAMER_TAG_OBJ
|
|
|
|
#define GAMER_TAG_OBJ(val, asName, defaultTags) m_rtTagFlags[val] = defaultTags;
|
|
GAMER_TAG_LIST
|
|
#undef GAMER_TAG_OBJ
|
|
|
|
|
|
for (s16 i = 0; i < MAX_PLAYERS_WITH_GAMER_TAGS; i++)
|
|
{
|
|
m_gamerTags[i].Reset();
|
|
|
|
m_gamerTags[i].m_rtDepth = i;
|
|
}
|
|
}
|
|
|
|
CMultiplayerGamerTagHud::~CMultiplayerGamerTagHud()
|
|
{
|
|
m_renderingSection.Lock();
|
|
|
|
{ // scope for autolock
|
|
CScaleformMgr::AutoLock lock(m_movie.GetMovieID());
|
|
|
|
|
|
for (s32 i = 0; i < MAX_PLAYERS_WITH_GAMER_TAGS; i++)
|
|
{
|
|
if (!m_gamerTags[i].IsStateUndefined())
|
|
{
|
|
m_gamerTags[i].Reset();
|
|
}
|
|
}
|
|
|
|
UT_RemoveRoot();
|
|
|
|
}
|
|
m_movie.RemoveMovie();
|
|
|
|
m_renderingSection.Unlock();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::Init
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::Init(unsigned initMode)
|
|
{
|
|
if (initMode == INIT_SESSION)
|
|
{
|
|
if(!SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::Instantiate();
|
|
}
|
|
|
|
uiDebugf1("Gamertag system active and ready");
|
|
}
|
|
}
|
|
|
|
bool CMultiplayerGamerTagHud::IsMovieActive() const
|
|
{
|
|
return m_rootCreated && m_asGamerTagLayerContainer.IsDefined() && m_asRootContainer.IsDefined() && m_movie.IsActive();
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::Shutdown
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::Shutdown(unsigned shutdownMode)
|
|
{
|
|
if (shutdownMode == SHUTDOWN_SESSION)
|
|
{
|
|
if (SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
gRenderThreadInterface.Flush(); // flush the RT
|
|
|
|
SMultiplayerGamerTagHud::Destroy();
|
|
}
|
|
|
|
uiDebugf1("Gamertag system fully shutdown");
|
|
}
|
|
}
|
|
|
|
|
|
void CMultiplayerGamerTagHud::UpdateAtEndOfFrame()
|
|
{
|
|
if (SMultiplayerGamerTagHud::IsInstantiated() && SMultiplayerGamerTagHud::GetInstance().IsDeletePending())
|
|
{
|
|
uiDebugf1("CMultiplayerGamerTagHud::UpdateAtEndOfFrame - Start Shutdown");
|
|
SMultiplayerGamerTagHud::Destroy();
|
|
uiDebugf1("CMultiplayerGamerTagHud::UpdateAtEndOfFrame - Finished Shutdown");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::CreatePlayerTagForPed
|
|
// PURPOSE: creates the tag for the ped passed in into the iplayernum in the array
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_CreatePlayerTagHelper(s32 iPlayerNum, CPhysical *pPhys, const char *pPlayerName, const char* pFormattedCrewTag)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)) && uiVerify(m_movie.IsActive()))
|
|
{
|
|
#if __BANK
|
|
bool bDebugTag = false;
|
|
|
|
if (iPlayerNum == DEBUG_GAMER_TAG)
|
|
{
|
|
bDebugTag = true;
|
|
|
|
iPlayerNum = MAX_NUM_PHYSICAL_PLAYERS;
|
|
}
|
|
#endif
|
|
|
|
if (BANK_ONLY(bDebugTag ||) uiVerify(NetworkInterface::IsGameInProgress()))
|
|
{
|
|
uiDisplayf("CMultiplayerGamerTagHud::UT_CreatePlayerTagHelper - Gamertag for player %d has been requested to be set up", iPlayerNum);
|
|
|
|
if (uiVerifyf(0 <= iPlayerNum && iPlayerNum < MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_CreatePlayerTagHelper - iPlayerNum=%d, MAX_PLAYERS_WITH_GAMER_TAGS=%d", iPlayerNum, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
sGamerTag& rGamerTag = m_gamerTags[iPlayerNum];
|
|
if (uiVerifyf(rGamerTag.IsStateUndefined(), "CMultiplayerGamerTagHud::UT_CreatePlayerTagHelper - Gamer Tag %s(%d) already in use. initPending=%d, active=%d, removePending=%d, destroyPending=%d. Local Gamer is %s",
|
|
pPlayerName, iPlayerNum, rGamerTag.IsStateInitPending(), rGamerTag.IsStateActive(), rGamerTag.IsStateRemovePending(), rGamerTag.IsStateDestroyPending(), NetworkInterface::GetActiveGamerInfo()->GetName()))
|
|
{
|
|
rGamerTag.m_utPhysical = pPhys;
|
|
rGamerTag.m_visible.GetWriteBuf() = false;
|
|
rGamerTag.m_scale.GetWriteBuf() = 1.0f;
|
|
rGamerTag.m_playerPos.GetWriteBuf() = Vector3(-1.0f,-1.0f,-1.0f);
|
|
rGamerTag.m_screenPos.GetWriteBuf() = Vector2(-1.0f,-1.0f);
|
|
rGamerTag.m_reinitPositions = true;
|
|
|
|
formatf(rGamerTag.m_playerName, RL_MAX_DISPLAY_NAME_BUF_SIZE, "%s", pPlayerName);
|
|
formatf(rGamerTag.m_refName, MAX_REF_NAME_SIZE, "MP_GAMER_INFO_%d", iPlayerNum);
|
|
|
|
UT_SetGamerTagCrewDetails(iPlayerNum, pFormattedCrewTag);
|
|
|
|
m_renderingSection.Lock();
|
|
rGamerTag.SetStateInitPending();
|
|
m_renderingSection.Unlock();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::UT_CreatePlayerTagHelper - GamerTag: Too many players with gamer tags so couldn't make one for %s(%d) - total possible %d (%d MP chars, %d fake)", pPlayerName, iPlayerNum, MAX_PLAYERS_WITH_GAMER_TAGS, MAX_NUM_PHYSICAL_PLAYERS, MAX_FAKE_GAMER_TAG_PLAYERS);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::CreatePlayerTag
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_CreatePlayerTag(s32 iPlayerNum, const char *pPlayerName, const char* pFormattedCrewTag)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)) && uiVerify(m_movie.IsActive()))
|
|
{
|
|
#if __BANK
|
|
bool bDebugTag = false;
|
|
|
|
if (iPlayerNum == DEBUG_GAMER_TAG)
|
|
{
|
|
bDebugTag = true;
|
|
}
|
|
|
|
if (bDebugTag)
|
|
{
|
|
UT_CreatePlayerTagHelper(iPlayerNum, CGameWorld::FindLocalPlayer(), pPlayerName, pFormattedCrewTag);
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
// ensure we have a net player to create it on
|
|
CNetGamePlayer* pNetPlayer = NetworkInterface::GetPhysicalPlayerFromIndex(static_cast<PhysicalPlayerIndex>(iPlayerNum));
|
|
|
|
if (pNetPlayer)
|
|
{
|
|
UT_CreatePlayerTagHelper(iPlayerNum, NULL, pPlayerName, pFormattedCrewTag);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::CreateFakePlayerTag
|
|
// PURPOSE: creates a tag for a fake player
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
s32 CMultiplayerGamerTagHud::UT_CreateFakePlayerTag(CPhysical *pPhys, const char *pPlayerName, const char* pFormattedCrewTag, bool bIgnoreDuplicates)
|
|
{
|
|
#if __ASSERT
|
|
int numActive = 0;
|
|
int numRemovePending = 0;
|
|
int numDeletePending = 0;
|
|
#endif
|
|
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)) && uiVerify(m_movie.IsActive()) && uiVerify(pPhys))
|
|
{
|
|
if(!bIgnoreDuplicates)
|
|
{
|
|
for (s32 i = MAX_NUM_PHYSICAL_PLAYERS; i < MAX_PLAYERS_WITH_GAMER_TAGS; i++)
|
|
{
|
|
if (!m_gamerTags[i].IsStateUndefined())
|
|
{
|
|
if(!uiVerifyf(pPhys != m_gamerTags[i].m_utPhysical.Get(), "CMultiplayerGamerTagHud::UT_CreateFakePlayerTag - Trying to create a FakePlayerTag for a Entity that already has one."))
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for (s32 j = MAX_NUM_PHYSICAL_PLAYERS; j < MAX_PLAYERS_WITH_GAMER_TAGS; j++)
|
|
{
|
|
if (m_gamerTags[j].IsStateUndefined())
|
|
{
|
|
UT_CreatePlayerTagHelper(j, pPhys, pPlayerName, pFormattedCrewTag);
|
|
UT_SetGamerTagVisibility( j, MP_TAG_GAMER_NAME, true );
|
|
|
|
return j;
|
|
}
|
|
#if __ASSERT
|
|
else if (m_gamerTags[j].IsStateActive())
|
|
{
|
|
++numActive;
|
|
}
|
|
else if (m_gamerTags[j].IsStateRemovePending())
|
|
{
|
|
++numRemovePending;
|
|
}
|
|
else if (m_gamerTags[j].IsStateDestroyPending())
|
|
{
|
|
++numDeletePending;
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::UT_CreateFakePlayerTag - GamerTag: Too many fake players added - invalid=%d, max=%d, numActive=%d, numRemoving=%d, numDeletePending=%d", GAMER_TAG_INVALID_INDEX, MAX_FAKE_GAMER_TAG_PLAYERS, numActive, numRemovePending, numDeletePending);
|
|
return GAMER_TAG_INVALID_INDEX;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::RemovePlayerTag
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_RemovePlayerTag(s32 iPlayerNum)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)) && uiVerify(m_movie.IsActive()))
|
|
{
|
|
#if __BANK
|
|
bool bDebugTag = false;
|
|
|
|
if (iPlayerNum == DEBUG_GAMER_TAG)
|
|
{
|
|
bDebugTag = true;
|
|
|
|
iPlayerNum = MAX_NUM_PHYSICAL_PLAYERS;
|
|
}
|
|
#endif
|
|
|
|
if (BANK_ONLY(bDebugTag ||) uiVerify(NetworkInterface::IsGameInProgress()))
|
|
{
|
|
if (uiVerifyf(0 <= iPlayerNum && iPlayerNum < MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_RemovePlayerTag - iPlayerNum(%d) is out of range, MAX_PLAYERS_WITH_GAMER_TAGS=%d", iPlayerNum, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
sGamerTag& rGamerTag = m_gamerTags[iPlayerNum];
|
|
|
|
if (uiVerifyf(!rGamerTag.IsStateUndefined(), "CMultiplayerGamerTagHud::UT_RemovePlayerTag - iPlayerNum(%d) doesn't have a gamer tag setup. Local Player is %s", iPlayerNum, NetworkInterface::GetActiveGamerInfo()->GetName()) &&
|
|
uiVerifyf(!rGamerTag.IsStateShuttingDown(), "CMultiplayerGamerTagHud::UT_RemovePlayerTag - iPlayerNum(%d) already has his gamertag shutting down. removePending=%d, destroyPending=%d. Local Player is %s",
|
|
iPlayerNum, rGamerTag.IsStateRemovePending(), rGamerTag.IsStateDestroyPending(), NetworkInterface::GetActiveGamerInfo()->GetName()))
|
|
{
|
|
m_renderingSection.Lock();
|
|
rGamerTag.SetStateRemovePending();
|
|
m_renderingSection.Unlock();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::UT_IsGamerTagActive
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
bool CMultiplayerGamerTagHud::UT_IsGamerTagActive(s32 iPlayerNum)
|
|
{
|
|
bool isActive = false;
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)) && SMultiplayerGamerTagHud::IsInstantiated()) // only on UT
|
|
{
|
|
CMultiplayerGamerTagHud& rHud = SMultiplayerGamerTagHud::GetInstance();
|
|
if (rHud.m_movie.IsActive())
|
|
{
|
|
if (uiVerifyf(0 <= iPlayerNum && iPlayerNum < MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_IsGamerTagActive - iPlayerNum(%d) is out of range, MAX_PLAYERS_WITH_GAMER_TAGS=%d", iPlayerNum, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
isActive = rHud.m_gamerTags[iPlayerNum].IsStateActive() || rHud.m_gamerTags[iPlayerNum].IsStateInitPending();
|
|
}
|
|
}
|
|
}
|
|
|
|
return isActive;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::UT_IsGamerTagFree
|
|
// PURPOSE: Returns true if a gamer tag can be added to this slot.
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
bool CMultiplayerGamerTagHud::UT_IsGamerTagFree(s32 iPlayerNum)
|
|
{
|
|
bool isFree = false;
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)) && SMultiplayerGamerTagHud::IsInstantiated()) // only on UT
|
|
{
|
|
CMultiplayerGamerTagHud& rHud = SMultiplayerGamerTagHud::GetInstance();
|
|
if (uiVerify(rHud.m_movie.IsActive()))
|
|
{
|
|
if (uiVerifyf(0 <= iPlayerNum && iPlayerNum < MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_IsGamerTagActive - iPlayerNum(%d) is out of range, MAX_PLAYERS_WITH_GAMER_TAGS=%d", iPlayerNum, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
isFree = rHud.m_gamerTags[iPlayerNum].IsStateUndefined();
|
|
}
|
|
}
|
|
}
|
|
|
|
return isFree;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::SetColourToGfxvalue
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::RT_SetColourToGfxvalue(GFxValue *pDisplayObject, Color32 col)
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on RT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_SetColourToGfxvalue can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
if (pDisplayObject)
|
|
{
|
|
GFxValue::DisplayInfo oldDisplayInfo;
|
|
pDisplayObject->GetDisplayInfo(&oldDisplayInfo);
|
|
Double alpha = oldDisplayInfo.GetAlpha();
|
|
|
|
pDisplayObject->SetColorTransform(col);
|
|
|
|
GFxValue::DisplayInfo newDisplayInfo;
|
|
newDisplayInfo.SetAlpha(alpha);
|
|
pDisplayObject->SetDisplayInfo(newDisplayInfo);
|
|
|
|
// Displayf("r = %d g = %d b = %d a = %d", col.GetRed(), col.GetGreen(), col.GetBlue(), col.GetAlpha());
|
|
}
|
|
}
|
|
|
|
|
|
bool CMultiplayerGamerTagHud::RT_InitAndVerifyAllComponentGfxValues(s32 iPlayerId, GFxValue& centerIcons, GFxValue& leftIcons)
|
|
{
|
|
bool isValid = false;
|
|
uiDebugf1("CMultiplayerGamerTagHud::RT_InitAndVerifyAllComponentGfxValues - Begin");
|
|
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on RT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_InitAndVerifyAllComponentGfxValues - can only be called on the RenderThread!");
|
|
return isValid;
|
|
}
|
|
|
|
if (!uiVerify(m_movie.IsActive()))
|
|
return isValid;
|
|
|
|
ASSERT_ONLY(sGamerTag& rGamerTag = m_gamerTags[iPlayerId]);
|
|
uiAssertf(rGamerTag.m_asGamerTagContainerMc.IsDefined(), "CMultiplayerGamerTagHud::RT_InitAndVerifyAllComponentGfxValues - Gamertag movied failed to be created for player %d", iPlayerId);
|
|
uiAssertf(rGamerTag.m_asGamerTagContainerMc.HasMember("healthArmour"), "CMultiplayerGamerTagHud::RT_InitAndVerifyAllComponentGfxValues - Gamertag value healthArmour is invalid for player %d!", iPlayerId);
|
|
uiAssertf(rGamerTag.m_asGamerTagContainerMc.HasMember("BIG_TEXT"), "CMultiplayerGamerTagHud::RT_InitAndVerifyAllComponentGfxValues - Gamertag value BIG_TEXT is invalid for player %d!", iPlayerId);
|
|
{
|
|
isValid = true;
|
|
|
|
for (s32 iTag = 0; iTag < MAX_MP_TAGS; iTag++)
|
|
{
|
|
eTAG_FLAGS flags = m_rtTagFlags[iTag];
|
|
|
|
if((flags & TF_LOCATION_MASK) == 0)
|
|
{
|
|
uiDebugf1("CMultiplayerGamerTagHud::RT_InitAndVerifyAllComponentGfxValues - Initing Tag %s.", m_GamerTagNames[iTag]);
|
|
RT_InitComponentGfxValue(iPlayerId, (eMP_TAG)iTag, centerIcons, leftIcons);
|
|
}
|
|
#if __DEV
|
|
else
|
|
{
|
|
uiDebugf1("CMultiplayerGamerTagHud::RT_InitAndVerifyAllComponentGfxValues - Tag %s already inited, shouldExist=%d, left=%d, center=%d, baseLevel=%d, locMask=%d, TF_LOCATION_MASK=%d.",
|
|
m_GamerTagNames[iTag], (flags&TF_SHOULD_EXIST)?1:0, (flags&TF_LEFT_ROW)?1:0, (flags&TF_CENTER_ROW)?1:0, (flags&TF_BASE_LEVEL)?1:0, flags&TF_LOCATION_MASK, TF_LOCATION_MASK);
|
|
|
|
if(flags & TF_SHOULD_EXIST)
|
|
{
|
|
GFxValue componentGfxValue;
|
|
RT_GetComponentGfxValue(&componentGfxValue, iPlayerId, static_cast<eMP_TAG>(iTag), centerIcons, leftIcons);
|
|
uiAssertf(componentGfxValue.IsDefined(), "CMultiplayerGamerTagHud::RT_InitAndVerifyAllComponentGfxValues - Gamertag invalid! Code/Script Name=%s(%d), AS Name=%s", m_GamerTagNames[iTag], iTag, m_GamerTagASNames[iTag]);
|
|
}
|
|
}
|
|
#endif //__DEV
|
|
}
|
|
}
|
|
|
|
uiDebugf1("CMultiplayerGamerTagHud::RT_InitAndVerifyAllComponentGfxValues - Gamertag: VerifyAllComponentGfxValues - Complete");
|
|
return isValid;
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::RT_InitComponentGfxValue(s32 iPlayerId, eMP_TAG iTag, GFxValue& centerIcons, GFxValue& leftIcons)
|
|
{
|
|
const char* asName = m_GamerTagASNames[iTag];
|
|
|
|
if(centerIcons.HasMember(asName))
|
|
{
|
|
m_rtTagFlags[iTag] = static_cast<eTAG_FLAGS>(m_rtTagFlags[iTag] | TF_CENTER_ROW);
|
|
}
|
|
else if(leftIcons.HasMember(asName))
|
|
{
|
|
m_rtTagFlags[iTag] = static_cast<eTAG_FLAGS>(m_rtTagFlags[iTag] | TF_LEFT_ROW);
|
|
}
|
|
else if(m_gamerTags[iPlayerId].m_asGamerTagContainerMc.HasMember(asName))
|
|
{
|
|
m_rtTagFlags[iTag] = static_cast<eTAG_FLAGS>(m_rtTagFlags[iTag] | TF_BASE_LEVEL);
|
|
}
|
|
#if __ASSERT
|
|
else
|
|
{
|
|
if(m_rtTagFlags[iTag] & TF_SHOULD_EXIST)
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_InitComponentGfxValue - Gamertag invalid! Code/Script Name=%s(%d), AS Name=%s", m_GamerTagNames[iTag], iTag, asName);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::RT_GetComponentGfxValue(GFxValue *pComponentGfxValue, s32 iPlayerId, eMP_TAG iTag, GFxValue& centerIcons, GFxValue& leftIcons, bool ASSERT_ONLY(bHasToExist) /*= true*/)
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on RT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_GetComponentGfxValue - can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
if (!uiVerify(m_movie.IsActive()))
|
|
return;
|
|
|
|
if(!uiVerify(0 <= iTag && iTag < MAX_MP_TAGS))
|
|
return;
|
|
|
|
sGamerTag& rGamerTag = m_gamerTags[iPlayerId];
|
|
if (rGamerTag.m_asGamerTagContainerMc.IsDefined())
|
|
{
|
|
bool bSuccess = false;
|
|
const char* asName = m_GamerTagASNames[iTag];
|
|
eTAG_FLAGS flags = m_rtTagFlags[iTag];
|
|
|
|
|
|
if((flags & TF_LOCATION_MASK) == 0)
|
|
{
|
|
RT_InitComponentGfxValue(iPlayerId, (eMP_TAG)iTag, centerIcons, leftIcons);
|
|
flags = m_rtTagFlags[iTag];
|
|
}
|
|
|
|
if(flags & TF_CENTER_ROW)
|
|
{
|
|
if(uiVerifyf(centerIcons.IsDefined(), "CMultiplayerGamerTagHud::RT_GetComponentGfxValue - Failed to get the Above Icons for player %d", iPlayerId))
|
|
{
|
|
bSuccess = centerIcons.GetMember(asName, pComponentGfxValue);
|
|
}
|
|
}
|
|
else if(flags & TF_LEFT_ROW)
|
|
{
|
|
if(uiVerifyf(leftIcons.IsDefined(), "CMultiplayerGamerTagHud::RT_GetComponentGfxValue - Failed to get the Left Icons for player %d", iPlayerId))
|
|
{
|
|
bSuccess = leftIcons.GetMember(asName, pComponentGfxValue);
|
|
}
|
|
}
|
|
else if(flags & TF_BASE_LEVEL)
|
|
{
|
|
bSuccess = rGamerTag.m_asGamerTagContainerMc.GetMember(asName, pComponentGfxValue);
|
|
}
|
|
|
|
#if __ASSERT
|
|
if(bHasToExist || ((flags & TF_SHOULD_EXIST) != 0))
|
|
{
|
|
uiAssertf(bSuccess, "CMultiplayerGamerTagHud::RT_GetComponentGfxValue - Gamertag invalid! Code/Script Name=%s(%d), AS Name=%s", m_GamerTagNames[iTag], iTag, asName);
|
|
}
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_GetComponentGfxValue - Gamertag Value asGamerTagContainerMc is undefined for player %d.", iPlayerId);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::GetGamerTagVisibility
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
bool CMultiplayerGamerTagHud::RT_GetGamerTagVisibility(s32 iPlayerId, eMP_TAG iTag)
|
|
{
|
|
if (!uiVerify(m_movie.IsActive()))
|
|
return false;
|
|
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on RT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_GetGamerTagVisibility - can only be called on the RenderThread!");
|
|
return false;
|
|
}
|
|
|
|
if (iPlayerId < MAX_PLAYERS_WITH_GAMER_TAGS)
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].m_asGamerTagContainerMc.HasMember(GAMERTAG_CENTER_OBJECT), "CMultiplayerGamerTagHud::RT_InitComponentGfxValue - Gamertag value " GAMERTAG_CENTER_OBJECT " is invalid for player %d!", iPlayerId) &&
|
|
uiVerifyf(m_gamerTags[iPlayerId].m_asGamerTagContainerMc.HasMember(GAMERTAG_LEFT_OBJECT), "CMultiplayerGamerTagHud::RT_InitComponentGfxValue - Gamertag value " GAMERTAG_LEFT_OBJECT " is invalid for player %d!", iPlayerId))
|
|
{
|
|
GFxValue centerIcons, leftIcons;
|
|
m_gamerTags[iPlayerId].m_asGamerTagContainerMc.GetMember(GAMERTAG_CENTER_OBJECT, ¢erIcons);
|
|
m_gamerTags[iPlayerId].m_asGamerTagContainerMc.GetMember(GAMERTAG_LEFT_OBJECT, &leftIcons);
|
|
|
|
GFxValue componentGfxValue;
|
|
|
|
RT_GetComponentGfxValue(&componentGfxValue, iPlayerId, iTag, centerIcons, leftIcons);
|
|
|
|
if (componentGfxValue.IsDefined())
|
|
{
|
|
GFxValue::DisplayInfo theDisplayInfo;
|
|
componentGfxValue.GetDisplayInfo(&theDisplayInfo);
|
|
|
|
return theDisplayInfo.GetVisible();
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::SetGamerTagVisibility
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagVisibility(s32 iPlayerId, eMP_TAG iTag, bool bSetVisible, bool bEvenInBigVehicles)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagValueInt - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS) &&
|
|
uiVerifyf(iTag < MAX_MP_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagVisibility - iTag=%d, max=%d", iTag, MAX_MP_TAGS))
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetGamerTagVisibility - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()))
|
|
{
|
|
// If the crew tag is empty, don't show it, even if script says to.
|
|
if(iTag == MP_TAG_CREW_TAG && m_gamerTags[iPlayerId].m_crewTag[0] == '\0')
|
|
{
|
|
bSetVisible = false;
|
|
}
|
|
|
|
m_gamerTags[iPlayerId].m_showEvenInBigVehicles = bEvenInBigVehicles;
|
|
|
|
if (m_gamerTags[iPlayerId].m_visibleFlag[iTag] != bSetVisible)
|
|
{
|
|
uiDebugf2("CMultiplayerGamerTagHud::UT_SetGamerTagVisibility - iPlayerId=%d, bSetVisible=%d, tag=%s(%d)", iPlayerId, bSetVisible, m_GamerTagNames[iTag], iTag);
|
|
|
|
m_gamerTags[iPlayerId].m_visibleFlag[iTag] = bSetVisible;
|
|
m_gamerTags[iPlayerId].m_TagReinitFlags.GetWriteBuf().Set(iTag);
|
|
m_gamerTags[iPlayerId].SetStateReinit();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UT_SetBigText(s32 iPlayerId, const char* text)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetBigText - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetBigText - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()) &&
|
|
!m_gamerTags[iPlayerId].m_reinitBigText)
|
|
{
|
|
m_gamerTags[iPlayerId].m_reinitBigText = true;
|
|
formatf(m_gamerTags[iPlayerId].m_bigtext, MAX_BIG_TEXT_SIZE, "%s", text);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
const sGamerTag* CMultiplayerGamerTagHud::UT_GetActiveGamerTag(s32 iPlayerId)
|
|
{
|
|
const sGamerTag* pRetTag = NULL;
|
|
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if ( uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_GetActiveGamerTag - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS ))
|
|
{
|
|
if (m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending())
|
|
{
|
|
pRetTag = &m_gamerTags[iPlayerId];
|
|
}
|
|
}
|
|
}
|
|
|
|
return pRetTag;
|
|
}
|
|
|
|
bool CMultiplayerGamerTagHud::UT_IsReinitingGamerNameAndCrewTag(s32 iPlayerId)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_IsReinitingGamerNameAndCrewTag - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
return m_gamerTags[iPlayerId].m_reinitCrewTag;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UT_SetGamerName(s32 iPlayerId, const char *pPlayerName)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerify(pPlayerName) &&
|
|
uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerName - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
sGamerTag& rGamerTag = m_gamerTags[iPlayerId];
|
|
|
|
if(stricmp(rGamerTag.m_playerName, pPlayerName) != 0 &&
|
|
uiVerifyf(!rGamerTag.m_reinitCrewTag, "CMultiplayerGamerTagHud::UT_SetGamerName - iPlayerId=%d is already adjusting his player name and crew info.", iPlayerId))
|
|
{
|
|
formatf(rGamerTag.m_playerName, RL_MAX_DISPLAY_NAME_BUF_SIZE, "%s", pPlayerName);
|
|
rGamerTag.m_reinitCrewTag = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagVerticalOffset(float fVerticalOffset)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
sm_fVerticalOffset = fVerticalOffset;
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagCrewDetails(s32 iPlayerId, const char* pFormattedCrewTag)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagCrewDetails - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
sGamerTag& rGamerTag = m_gamerTags[iPlayerId];
|
|
|
|
if(uiVerifyf(!rGamerTag.m_reinitCrewTag, "CMultiplayerGamerTagHud::UT_SetGamerTagCrewDetails - iPlayerId=%d is already adjusting his player name and crew info.", iPlayerId))
|
|
{
|
|
formatf(rGamerTag.m_crewTag, NetworkClan::FORMATTED_CLAN_TAG_LEN, "%s", pFormattedCrewTag);
|
|
rGamerTag.m_reinitCrewTag = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::RT_ReinitGamerTagCrewDetails(s32 iPlayerId)
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_ReinitGamerTagCrewDetails - can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
if (!uiVerify(m_movie.IsActive()))
|
|
return;
|
|
|
|
sGamerTag& rGamerTag = m_gamerTags[iPlayerId];
|
|
|
|
GFxValue args[2];
|
|
args[0].SetString(rGamerTag.m_playerName);
|
|
args[1].SetString(rGamerTag.m_crewTag);
|
|
|
|
GFxValue result;
|
|
rGamerTag.m_asGamerTagContainerMc.Invoke("SET_GAMERNAME_AND_PACKED_CREW_TAG", &result, args, COUNTOF(args));
|
|
rGamerTag.m_reinitCrewTag = false;
|
|
|
|
|
|
GFxValue centerIcons, leftIcons;
|
|
rGamerTag.m_asGamerTagContainerMc.GetMember(GAMERTAG_CENTER_OBJECT, ¢erIcons);
|
|
rGamerTag.m_asGamerTagContainerMc.GetMember(GAMERTAG_LEFT_OBJECT, &leftIcons);
|
|
|
|
GFxValue componentGfxValue;
|
|
RT_GetComponentGfxValue(&componentGfxValue, iPlayerId, MP_TAG_GAMER_NAME, centerIcons, leftIcons, false);
|
|
if (!componentGfxValue.IsUndefined())
|
|
{
|
|
GFxValue gamerNameWidth;
|
|
componentGfxValue.GetMember("textWidth", &gamerNameWidth);
|
|
|
|
rGamerTag.m_gamerTagWidth = static_cast<float>(gamerNameWidth.GetNumber());
|
|
}
|
|
|
|
uiDisplayf("CMultiplayerGamerTagHud::RT_ReinitGamerTagCrewDetails - iPlayerId=%d, GamerTag='%s', ClanTag='%s'", iPlayerId, rGamerTag.m_playerName, rGamerTag.m_crewTag);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::UT_SetAllGamerTagsVisibility
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_SetAllGamerTagsVisibility(s32 iPlayerId, bool bSetVisible)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetAllGamerTagsVisibility - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetAllGamerTagsVisibility - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()))
|
|
{
|
|
uiDebugf2("CMultiplayerGamerTagHud::UT_SetAllGamerTagsVisibility - iPlayerId=%d, bSetVisible=%d", iPlayerId, bSetVisible);
|
|
for(int iTag=0; iTag<MAX_MP_TAGS; ++iTag)
|
|
{
|
|
if (m_gamerTags[iPlayerId].m_visibleFlag[iTag] != bSetVisible)
|
|
{
|
|
m_gamerTags[iPlayerId].m_visibleFlag[iTag] = bSetVisible;
|
|
m_gamerTags[iPlayerId].m_TagReinitFlags.GetWriteBuf().Set(iTag);
|
|
m_gamerTags[iPlayerId].SetStateReinit();
|
|
}
|
|
}
|
|
|
|
// If the crew tag is empty, don't show it, even if script says to.
|
|
if(m_gamerTags[iPlayerId].m_crewTag[0] == '\0')
|
|
{
|
|
m_gamerTags[iPlayerId].m_visibleFlag[MP_TAG_CREW_TAG] = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::UT_SetGamerTagsCanRenderWhenPaused
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagsCanRenderWhenPaused(s32 iPlayerId, bool bCanRenderWhenPaused)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagsCanRenderWhenPaused - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetGamerTagsCanRenderWhenPaused - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()))
|
|
{
|
|
uiDebugf2("CMultiplayerGamerTagHud::UT_SetGamerTagsCanRenderWhenPaused - iPlayerId=%d, bCanRenderWhenPaused=%d", iPlayerId, bCanRenderWhenPaused);
|
|
m_gamerTags[iPlayerId].m_renderWhenPaused = bCanRenderWhenPaused;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::UT_SetGamerTagsCanRenderWhenPaused
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagsShouldUseVehicleHealth(s32 iPlayerId, bool bUseVehicleHealth)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagsShouldUseVehicleHealth - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetGamerTagsShouldUseVehicleHealth - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()))
|
|
{
|
|
if(m_gamerTags[iPlayerId].m_useVehicleHealth != bUseVehicleHealth)
|
|
{
|
|
uiDebugf2("CMultiplayerGamerTagHud::UT_SetGamerTagsShouldUseVehicleHealth - iPlayerId=%d, bUseVehicleHealth=%d", iPlayerId, bUseVehicleHealth);
|
|
m_gamerTags[iPlayerId].m_useVehicleHealth = bUseVehicleHealth;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagsShouldUsePointHealth(s32 iPlayerId, bool bUsePointHealth)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagsShouldUsePointHealth - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetGamerTagsShouldUsePointHealth - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()))
|
|
{
|
|
if(m_gamerTags[iPlayerId].m_bUsePointHealth != bUsePointHealth)
|
|
{
|
|
uiDebugf2("CMultiplayerGamerTagHud::UT_SetGamerTagsShouldUsePointHealth - iPlayerId=%d, bUsePointHealth=%d", iPlayerId, bUsePointHealth);
|
|
m_gamerTags[iPlayerId].m_bUsePointHealth = bUsePointHealth;
|
|
|
|
if(!bUsePointHealth)
|
|
{
|
|
m_gamerTags[iPlayerId].m_iPoints = -1;
|
|
m_gamerTags[iPlayerId].m_iMaxPoints = -1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagsPointHealth(s32 iPlayerId, int iPoints, int iMaxPoints)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagsPointHealth - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetGamerTagsPointHealth - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()))
|
|
{
|
|
if(m_gamerTags[iPlayerId].m_bUsePointHealth)
|
|
{
|
|
uiDebugf2("CMultiplayerGamerTagHud::UT_SetGamerTagsPointHealth - iPlayerId=%d, iPoints=%d, iMaxPoints=%d", iPlayerId, iPoints, iMaxPoints);
|
|
|
|
m_gamerTags[iPlayerId].m_iPoints = iPoints;
|
|
m_gamerTags[iPlayerId].m_iMaxPoints = iMaxPoints;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::UT_SetGamerTagValueInt
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagValueInt(s32 iPlayerId, eMP_TAG iTag, s32 iValue)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagValueInt - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS) &&
|
|
uiVerifyf(iTag < MAX_MP_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagValueInt - iTag=%d, max=%d", iTag, MAX_MP_TAGS))
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetGamerTagValueInt - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()))
|
|
{
|
|
if (m_gamerTags[iPlayerId].m_value[iTag] != iValue)
|
|
{
|
|
m_gamerTags[iPlayerId].m_value[iTag] = iValue;
|
|
m_gamerTags[iPlayerId].m_TagReinitFlags.GetWriteBuf().Set(iTag);
|
|
m_gamerTags[iPlayerId].SetStateReinit();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::SetGamerTagValueHudColourOnGfxValue
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagValueHudColour(s32 iPlayerId, eMP_TAG iTag, eHUD_COLOURS iHudColour)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
// Don't mess with the color of these.
|
|
switch(iTag)
|
|
{
|
|
case MP_TAG_HEALTH_BAR:
|
|
case MP_TAG_CREW_TAG:
|
|
uiDebugf2("CMultiplayerGamerTagHud::UT_SetGamerTagValueHudColour - Ignoring color change for iPlayerId=%d, iHudColour=%d, tag=%s(%d)", iPlayerId, iHudColour, m_GamerTagNames[iTag], iTag);
|
|
break;
|
|
|
|
default:
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagValueHudColour - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS) &&
|
|
uiVerifyf(iTag < MAX_MP_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagValueHudColour - iTag=%d, max=%d", iTag, MAX_MP_TAGS))
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetGamerTagValueHudColour - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()) &&
|
|
m_gamerTags[iPlayerId].m_colour[iTag] != iHudColour)
|
|
{
|
|
m_gamerTags[iPlayerId].m_colour[iTag] = iHudColour;
|
|
m_gamerTags[iPlayerId].m_TagReinitFlags.GetWriteBuf().Set(iTag);
|
|
m_gamerTags[iPlayerId].SetStateReinit();
|
|
}
|
|
}
|
|
|
|
break;
|
|
};
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagHealthBarColour(s32 iPlayerId, eHUD_COLOURS iHudColour)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagHealthBarColour - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS))
|
|
{
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetGamerTagValueHudColour - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()))
|
|
{
|
|
m_gamerTags[iPlayerId].m_healthBarColour = iHudColour;
|
|
m_gamerTags[iPlayerId].m_healthBarColourDirty.GetWriteBuf() = true;
|
|
m_gamerTags[iPlayerId].SetStateReinit();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::SetGamerTagValueHudAlpha
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_SetGamerTagValueHudAlpha(s32 iPlayerId, eMP_TAG iTag, s32 iAlpha)
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE) && uiVerify(m_movie.IsActive())))
|
|
{
|
|
if (uiVerifyf(0<=iPlayerId && iPlayerId<MAX_PLAYERS_WITH_GAMER_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagValueHudAlpha - iPlayerId=%d, max=%d", iPlayerId, MAX_PLAYERS_WITH_GAMER_TAGS) &&
|
|
uiVerifyf(iTag < MAX_MP_TAGS, "CMultiplayerGamerTagHud::UT_SetGamerTagValueHudAlpha - iTag=%d, max=%d", iTag, MAX_MP_TAGS))
|
|
{
|
|
float fAlpha = (float)iAlpha;
|
|
fAlpha *= 100.0f / 255.0f;
|
|
uiAssertf(0.0f <= fAlpha && fAlpha <= 100.0f, "CMultiplayerGamerTagHud::UT_SetGamerTagValueHudAlpha - fAlpha is out of range for iPlayerId=%d, fAlpha=%f, tag=%s(%d)", iPlayerId, fAlpha, m_GamerTagNames[iTag], iTag);
|
|
fAlpha = MIN(fAlpha, 100.0f);
|
|
fAlpha = MAX(fAlpha, 0.0f);
|
|
|
|
u8 uAlpha = (u8)fAlpha;
|
|
|
|
if(uiVerifyf(m_gamerTags[iPlayerId].IsStateActive() || m_gamerTags[iPlayerId].IsStateInitPending(), "CMultiplayerGamerTagHud::UT_SetGamerTagValueHudAlpha - Gametag for player %d isn't active yet. removePending=%d, destroyPending=%d", iPlayerId, m_gamerTags[iPlayerId].IsStateRemovePending(), m_gamerTags[iPlayerId].IsStateDestroyPending()) &&
|
|
m_gamerTags[iPlayerId].m_alpha[iTag] != uAlpha)
|
|
{
|
|
uiDebugf2("CMultiplayerGamerTagHud::UT_SetGamerTagValueHudAlpha - iPlayerId=%d, uAlpha=%u, tag=%s(%d)", iPlayerId, uAlpha, m_GamerTagNames[iTag], iTag);
|
|
|
|
if(uAlpha == 0 || m_gamerTags[iPlayerId].m_alpha[iTag] == 0)
|
|
{
|
|
m_gamerTags[iPlayerId].m_reinitPosDueToAlpha = true;
|
|
}
|
|
|
|
m_gamerTags[iPlayerId].m_updateAlpha[iTag] = true;
|
|
m_gamerTags[iPlayerId].m_alpha[iTag] = uAlpha;
|
|
m_gamerTags[iPlayerId].m_TagReinitFlags.GetWriteBuf().Set(iTag);
|
|
m_gamerTags[iPlayerId].SetStateReinit();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::SetGamerTagValue
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::RT_SetGamerTagValueIntOnGfxValue(s32 iPlayerId, eMP_TAG iTag, s32 iValue, GFxValue& centerIcons, GFxValue& leftIcons)
|
|
{
|
|
if (!uiVerify(m_movie.IsActive()))
|
|
return;
|
|
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on RT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_SetGamerTagValueIntOnGfxValue - can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
if (iPlayerId < MAX_PLAYERS_WITH_GAMER_TAGS &&
|
|
iTag < MAX_MP_TAGS &&
|
|
(m_rtTagFlags[iTag] & TF_SHOULD_EXIST) != 0)
|
|
{
|
|
GFxValue componentGfxValue;
|
|
|
|
RT_GetComponentGfxValue(&componentGfxValue, iPlayerId, iTag, centerIcons, leftIcons);
|
|
RT_SetGamerTagValueIntOnGfxValue(componentGfxValue, iTag, iValue);
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::RT_SetGamerTagValueIntOnGfxValue(GFxValue& componentGfxValue, eMP_TAG iTag, s32 iValue)
|
|
{
|
|
if (!uiVerify(m_movie.IsActive()))
|
|
return;
|
|
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on RT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_SetGamerTagValueIntOnGfxValue - can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
if (!componentGfxValue.IsUndefined() &&
|
|
iTag < MAX_MP_TAGS &&
|
|
(m_rtTagFlags[iTag] & TF_SHOULD_EXIST) != 0)
|
|
{
|
|
switch (iTag)
|
|
{
|
|
case MP_TAG_WANTED_LEVEL:
|
|
{
|
|
componentGfxValue.GotoAndStop(iValue+1);
|
|
break;
|
|
}
|
|
case MP_TAG_PACKAGE_LARGE:
|
|
{
|
|
// Get TextField child of parent MovieClip
|
|
GFxValue textChildGfxValue;
|
|
if(uiVerify(componentGfxValue.GetMember("BAG_NUMBER", &textChildGfxValue)))
|
|
{
|
|
// Format int as string
|
|
char finalString[16];
|
|
formatf(finalString, "%d", iValue);
|
|
|
|
// Push string to TextField
|
|
textChildGfxValue.SetText(finalString);
|
|
}
|
|
break;
|
|
}
|
|
//case MP_TAG_ROLE:
|
|
//{
|
|
// componentGfxValue.GotoAndStop(iValue+1); // starts on frame 2
|
|
// break;
|
|
//}
|
|
//case MP_TAG_RANK_ICON:
|
|
//{
|
|
// if(sfVerifyf(iValue > 0 && iValue < 4, "Rank icon type value is not between 1 and 3"))
|
|
// {
|
|
// componentGfxValue.GotoAndStop(iValue);
|
|
// }
|
|
// break;
|
|
//}
|
|
case MP_TAG_RANK:
|
|
{
|
|
if(sfVerifyf(iValue >= 0, "Rank value %d is invalid", iValue))
|
|
{
|
|
char finalString[32];
|
|
CNumberWithinMessage pArrayOfNumbers[1];
|
|
pArrayOfNumbers[0].Set(iValue);
|
|
CMessages::InsertNumbersAndSubStringsIntoString(TheText.Get("TR_RANKNUM"), pArrayOfNumbers, 1, NULL, 0, finalString, sizeof(finalString));
|
|
componentGfxValue.SetText(finalString);
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
uiAssertf(0, "GamerTag: Component %d not valid", (s32)iTag);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::SetGamerTagValueHudColourOnGfxValue
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::RT_SetGamerTagValueHudColourOnGfxValue(GFxValue& componentGfxValue, s32 OUTPUT_ONLY(iPlayerId), eMP_TAG OUTPUT_ONLY(iTag), eHUD_COLOURS iHudColour)
|
|
{
|
|
if (!uiVerify(m_movie.IsActive()))
|
|
return;
|
|
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on RT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_SetGamerTagValueHudColourOnGfxValue - can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
uiDebugf2("CMultiplayerGamerTagHud::RT_SetGamerTagValueHudColourOnGfxValue - iPlayerId=%d, HudColor=%d, tag=%s(%d)", iPlayerId, iHudColour, m_GamerTagNames[iTag], iTag);
|
|
CRGBA hudColour = CHudColour::GetRGB(iHudColour, 100);
|
|
Color32 iColour(hudColour.GetColor());
|
|
RT_SetColourToGfxvalue(&componentGfxValue, iColour);
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::SetGamerTagValueHudAlphaOnGfxValue
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::RT_SetGamerTagValueHudAlphaOnGfxValue(GFxValue& componentGfxValue, s32 OUTPUT_ONLY(iPlayerId), eMP_TAG OUTPUT_ONLY(iTag), s32 iAlpha)
|
|
{
|
|
if (!uiVerify(m_movie.IsActive()))
|
|
return;
|
|
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on RT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_SetGamerTagValueHudAlphaOnGfxValue - can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
uiDebugf2("CMultiplayerGamerTagHud::RT_SetGamerTagValueHudAlphaOnGfxValue - iPlayerId=%d, iAlpha=%d, tag=%s(%d)", iPlayerId, iAlpha, m_GamerTagNames[iTag], iTag);
|
|
|
|
GFxValue::DisplayInfo newDisplayInfo;
|
|
newDisplayInfo.SetAlpha(iAlpha);
|
|
componentGfxValue.SetDisplayInfo(newDisplayInfo);
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::Update
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::Update()
|
|
{
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().UT_UpdateHelper();
|
|
}
|
|
}
|
|
|
|
|
|
s32 CMultiplayerGamerTagHud::UT_GetLocalPlayerTag()
|
|
{
|
|
CPhysical *pLocalPlayer = CGameWorld::FindLocalPlayer();
|
|
|
|
CMultiplayerGamerTagHud& rHud = SMultiplayerGamerTagHud::GetInstance();
|
|
if (rHud.m_movie.IsActive())
|
|
{
|
|
for (s32 i = 0; i < MAX_PLAYERS_WITH_GAMER_TAGS; i++)
|
|
{
|
|
sGamerTag& rGamerTag = rHud.m_gamerTags[i];
|
|
|
|
if (rGamerTag.IsStateActive() || rGamerTag.IsStateInitPending())
|
|
{
|
|
if (rHud.UT_GetPhysical(i) == pLocalPlayer)
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return GAMER_TAG_INVALID_INDEX;
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::UT_UpdateHelper()
|
|
{
|
|
if (CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::UT_UpdateHelper - can only be called on the UpdateThread!");
|
|
return;
|
|
}
|
|
|
|
if(!m_rootCreated)
|
|
{
|
|
if (m_movie.IsActive())
|
|
{
|
|
CScaleformMgr::AutoLock lock(m_movie.GetMovieID());
|
|
|
|
UT_CreateRoot();
|
|
}
|
|
|
|
if(!m_rootCreated)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
#if __BANK
|
|
UpdateDebugFakePassengerTags();
|
|
|
|
if(bDebugAddToPeds)
|
|
{
|
|
CPed* pNewPed = CPedFactory::GetLastCreatedPed();
|
|
if(pNewPed)
|
|
{
|
|
bool bFound = false;
|
|
s32 emptyIndex = -1;
|
|
s32 tagsUsed = 0;
|
|
static s32 maxTagsUsed = 0;
|
|
for (s32 i = 0; i < MAX_PLAYERS_WITH_GAMER_TAGS; i++)
|
|
{
|
|
CPhysical* pCurr = UT_GetPhysical(i);
|
|
if(pCurr)
|
|
{
|
|
tagsUsed++;
|
|
if(pNewPed == pCurr)
|
|
{
|
|
bFound = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
emptyIndex = i;
|
|
}
|
|
}
|
|
|
|
if(!bFound && emptyIndex != -1 && tagsUsed < 16)
|
|
{
|
|
char crewTagBuffer[NetworkClan::FORMATTED_CLAN_TAG_LEN] = {0};
|
|
NetworkClan::GetUIFormattedClanTag(!bDebugIsCrewTagPrivate, bDebugCrewTagContainsRockstar, cDebugClanTag, iDebugCrewRank, CRGBA(uDebugCrewR, uDebugCrewG, uDebugCrewB), crewTagBuffer, NetworkClan::FORMATTED_CLAN_TAG_LEN);
|
|
|
|
UT_CreatePlayerTagHelper( emptyIndex, pNewPed, cDebugGamerTag, crewTagBuffer );
|
|
UT_SetGamerTagVisibility( emptyIndex, MP_TAG_GAMER_NAME, true );
|
|
}
|
|
|
|
maxTagsUsed = MAX(maxTagsUsed, tagsUsed);
|
|
uiDisplayf("CMultiplayerGamerTagHud::UT_UpdateHelper - bDebugAddToPeds=true, tagsUsed=%d, maxTagsUsed=%d", tagsUsed, maxTagsUsed);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
bool showAtFarDistance = NetworkInterface::IsInSpectatorMode();
|
|
if(!showAtFarDistance)
|
|
{
|
|
CPed *pPlayerPed = CGameWorld::FindLocalPlayer();
|
|
|
|
if(pPlayerPed && pPlayerPed->GetIsInVehicle() && pPlayerPed->GetMyVehicle()->GetIsAircraft())
|
|
{
|
|
showAtFarDistance = true;
|
|
}
|
|
|
|
if(!showAtFarDistance && camInterface::GetGameplayDirector().IsFirstPersonAiming())
|
|
{
|
|
if(pPlayerPed->GetWeaponManager() && pPlayerPed->GetWeaponManager()->GetEquippedWeaponHasFirstPersonScope())
|
|
{
|
|
showAtFarDistance = true;
|
|
}
|
|
}
|
|
|
|
if(CScriptHud::ms_bFakeSpectatorMode)
|
|
{
|
|
showAtFarDistance = true;
|
|
}
|
|
|
|
if(CNewHud::GetDisplayMode() == CNewHud::DM_ARCADE_CNC)
|
|
{
|
|
showAtFarDistance = true;
|
|
}
|
|
}
|
|
|
|
bool const bIsPaused = CPauseMenu::IsActive();
|
|
bool const c_isFpCam = camInterface::IsDominantRenderedCameraAnyFirstPersonCamera();
|
|
|
|
CPed const* playerPed = CPedFactory::GetFactory()->GetLocalPlayer();
|
|
CVehicle const * playerVehicle = playerPed ? playerPed->GetMyVehicle() : NULL;
|
|
bool const c_isPlayerInAircraft = playerVehicle ? playerVehicle->GetIsAircraft() : false;
|
|
|
|
for (s32 i = 0; i < MAX_PLAYERS_WITH_GAMER_TAGS; i++)
|
|
{
|
|
sGamerTag& rGamerTag = m_gamerTags[i];
|
|
|
|
if (rGamerTag.IsStateDestroyPending())
|
|
{
|
|
CScaleformMgr::AutoLock lock(m_movie.GetMovieID());
|
|
rGamerTag.Reset();
|
|
|
|
m_movie.ForceCollectGarbage();// perform garbage collection once the gamertag has been removed
|
|
|
|
uiDisplayf("CMultiplayerGamerTagHud::UT_UpdateHelper - Gamertag for player %d has been removed", i);
|
|
}
|
|
else if (rGamerTag.IsStateActive() || rGamerTag.IsStateInitPending())
|
|
{
|
|
if(!bIsPaused || rGamerTag.m_renderWhenPaused)
|
|
{
|
|
rGamerTag.m_visible.GetWriteBuf() = false;
|
|
|
|
CPhysical const* pThisPhys = UT_GetPhysical(i);
|
|
if (pThisPhys) // if we have a ped to get the position from
|
|
{
|
|
if(c_isFpCam && i == UT_GetLocalPlayerTag()) // if in 1st Person, and this is the local player tag, then we do not render it (fixes 2706081).
|
|
{
|
|
continue;
|
|
}
|
|
|
|
int seatIndex = 0;
|
|
bool isHiddenDueToBigVehicle = false;
|
|
|
|
CPed const * pThisPed = pThisPhys->GetIsTypePed() ? reinterpret_cast<const CPed*>(pThisPhys) : NULL;
|
|
CEntity const * pEnt = pThisPhys;
|
|
CVehicle const * pVehicle = pThisPhys ? pThisPed->GetMyVehicle() : NULL;
|
|
|
|
bool const c_isPlayerInVehicle = pThisPed ? pThisPed->GetIsInVehicle() : false;
|
|
bool const c_isPedInAircraft = pVehicle ? pVehicle->GetIsAircraft() : false;
|
|
bool const c_isPedOnBike = pVehicle ? pVehicle->InheritsFromBike() : false;
|
|
|
|
bool const c_adjustForBike = c_isPedOnBike && !c_isFpCam;
|
|
bool const c_adjustForAircraft = c_isPedInAircraft && !c_isFpCam;
|
|
|
|
//! If we are in FP, an aircraft and this ped is in the same vehicle as us then adjust the tag based on camera rotation
|
|
bool const c_adjustForEntityRotation = ( c_isFpCam && c_isPlayerInAircraft && pVehicle == playerVehicle );
|
|
|
|
// If we're in First-Person in a vehicle, don't do vehicle gamer info adjustments
|
|
if( pThisPed && pThisPed->GetIsInVehicle() && !c_isFpCam )
|
|
{
|
|
if(sm_minSeatCountToGridNames <= pVehicle->GetSeatManager()->CountPedsInSeats(true) BANK_ONLY(|| sm_minSeatCountToGridNames <= uDebugNumFakeVehiclePassengers+1))
|
|
{
|
|
pEnt = pVehicle;
|
|
isHiddenDueToBigVehicle = true;
|
|
|
|
const CSeatManager* pSeatManager = pVehicle->GetSeatManager();
|
|
if(pSeatManager)
|
|
{
|
|
seatIndex = pSeatManager->GetPedsSeatIndex(pThisPed);
|
|
}
|
|
}
|
|
|
|
#if __BANK
|
|
if(iDebugVehicleUsageCount != -1)
|
|
{
|
|
pEnt = pVehicle;
|
|
}
|
|
|
|
// Each gamer tag's ped is the player, so the current seatIndex is the local player's seat index. Let's fake the seat index
|
|
if(rGamerTag.m_debugCloneTagFromPedForVehicle)
|
|
{
|
|
seatIndex = uDebugCurrentFakePassengerSeatIndex;
|
|
}
|
|
uDebugCurrentFakePassengerSeatIndex++;
|
|
#endif
|
|
}
|
|
|
|
#if __BANK
|
|
if(iDebugVehicleUsageCount != -1)
|
|
{
|
|
isHiddenDueToBigVehicle = true;
|
|
seatIndex = iDebugVehicleUsageCount;
|
|
}
|
|
#endif
|
|
|
|
if( isHiddenDueToBigVehicle != rGamerTag.m_hiddenDueToBigVehicle
|
|
&& !rGamerTag.m_showEvenInBigVehicles)
|
|
{
|
|
rGamerTag.m_hiddenDueToBigVehicle = isHiddenDueToBigVehicle;
|
|
bool bUsingSpecialHealth = rGamerTag.m_bUsePointHealth || rGamerTag.m_useVehicleHealth;
|
|
|
|
for(int visIndex=0; visIndex<MAX_MP_TAGS; ++visIndex)
|
|
{
|
|
if( rGamerTag.m_visibleFlag[visIndex] &&
|
|
visIndex != MP_TAG_GAMER_NAME)
|
|
{
|
|
if(bUsingSpecialHealth && visIndex == MP_TAG_HEALTH_BAR)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
rGamerTag.SetStateReinit();
|
|
rGamerTag.m_TagReinitFlags.GetWriteBuf().Set(visIndex);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
float viewableDistance = ( showAtFarDistance || c_adjustForAircraft ) ? sm_maxVisibleSpectatingDistance : sm_maxVisibleDistance;
|
|
#if !__FINAL
|
|
if(PARAM_enableFarGamerTagDistance.Get())
|
|
{
|
|
viewableDistance = (sm_maxVisibleDistance < sm_maxVisibleSpectatingDistance) ? sm_maxVisibleSpectatingDistance : sm_maxVisibleDistance;
|
|
}
|
|
#endif
|
|
|
|
Vector3 offsetPosition = Vector3( 0, 0, pEnt->GetBaseModelInfo() ? pEnt->GetBaseModelInfo()->GetBoundingBoxMax().z : 0.82f );
|
|
offsetPosition.z += GetGameWorldOffset( rGamerTag.m_hiddenDueToBigVehicle, c_adjustForBike );
|
|
|
|
rGamerTag.m_playerPos.GetWriteBuf() = VEC3V_TO_VECTOR3(pEnt->GetTransform().GetPosition());
|
|
|
|
u32 uVehicleHash = pVehicle ? pVehicle->GetModelNameHash() : 0;
|
|
|
|
// Hack to fix the height of the gamer tags when people are in the turret limo (LIMO2)
|
|
const u32 DLC_LIMO_HASH = 4180339789;
|
|
const float fLimoOffset = -0.35f;
|
|
if(rGamerTag.m_hiddenDueToBigVehicle && uVehicleHash == DLC_LIMO_HASH)
|
|
{
|
|
offsetPosition.z += fLimoOffset;
|
|
}
|
|
|
|
// Vehciles that requires extra width spacing
|
|
float fExtraVehicleSpacing = 0.0f;
|
|
if(c_isPlayerInVehicle)
|
|
{
|
|
const u32 DLC_DUNE_FAV = 1897744184;
|
|
const u32 RAMP_DUNE = 3467805257;
|
|
const u32 RAMP_DUNE_2 = 3982671785;
|
|
const u32 DUNE_SCIFI = 534258863;
|
|
const u32 REG_DUNE = 2633113103;
|
|
const float fDuneFAVOffset = 0.015f;
|
|
if( uVehicleHash == DLC_DUNE_FAV ||
|
|
uVehicleHash == RAMP_DUNE ||
|
|
uVehicleHash == RAMP_DUNE_2 ||
|
|
uVehicleHash == DUNE_SCIFI ||
|
|
uVehicleHash == REG_DUNE )
|
|
{
|
|
fExtraVehicleSpacing = fDuneFAVOffset;
|
|
}
|
|
}
|
|
|
|
if( c_adjustForEntityRotation )
|
|
{
|
|
Matrix34 mat;
|
|
pEnt->GetMatrixCopy(mat);
|
|
mat.Transform3x3( offsetPosition );
|
|
}
|
|
|
|
rGamerTag.m_visible.GetWriteBuf() = NetworkUtils::GetScreenCoordinatesForOHD( rGamerTag.m_playerPos.GetWriteBuf(), rGamerTag.m_screenPos.GetWriteBuf(), rGamerTag.m_scale.GetWriteBuf(),
|
|
offsetPosition,
|
|
viewableDistance,
|
|
sm_nearScalingDistance, sm_farScalingDistance, sm_maxScaleSize, sm_minScaleSize );
|
|
|
|
rGamerTag.m_screenPos.GetWriteBuf() += GetScreenOffset( rGamerTag.m_hiddenDueToBigVehicle, seatIndex, c_adjustForBike, fExtraVehicleSpacing );
|
|
rGamerTag.m_screenPos.GetWriteBuf().x = CHudTools::CovertToCenterAtAspectRatio(rGamerTag.m_screenPos.GetWriteBuf().x, true);
|
|
|
|
if(rGamerTag.m_bUsePointHealth)
|
|
{
|
|
int iCurrentPoints = rGamerTag.m_iPoints;
|
|
int iMaxPoints = rGamerTag.m_iMaxPoints;
|
|
|
|
#if __BANK
|
|
if(iDebugCurrentPoints >= 0 &&
|
|
iDebugMaxPoints >= 0)
|
|
{
|
|
iCurrentPoints = iDebugCurrentPoints;
|
|
iMaxPoints = iDebugMaxPoints;
|
|
}
|
|
#endif // __BANK
|
|
|
|
if( iCurrentPoints >= 0 &&
|
|
iMaxPoints >= 0 && iMaxPoints >= iCurrentPoints)
|
|
{
|
|
int iTeam = int(pThisPed->GetPlayerInfo()->GetArcadeInformation().GetTeam());
|
|
rGamerTag.m_healthInfo.GetWriteBuf().Set(iCurrentPoints, iMaxPoints, 0, 0, 0, 0, iMaxPoints, 0, 0, iTeam, NULL, true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(pVehicle && rGamerTag.m_useVehicleHealth)
|
|
{
|
|
CNewHud::GetHealthInfo(pVehicle, rGamerTag.m_healthInfo.GetWriteBuf());
|
|
}
|
|
else
|
|
{
|
|
CNewHud::GetHealthInfo(pThisPhys, rGamerTag.m_healthInfo.GetWriteBuf());
|
|
}
|
|
}
|
|
|
|
rGamerTag.ClearNeedsPositionUpdate();
|
|
}
|
|
else
|
|
{
|
|
UT_RemovePlayerTag(i);
|
|
uiDebugf1("CMultiplayerGamerTagHud::UT_UpdateHelper - MP Tag %d deleted as attached ped no longer exists", i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
float CMultiplayerGamerTagHud::GetGameWorldOffset(bool bHiddenDueToBigVehicle, bool bIsPedOnBike)
|
|
{
|
|
float heightOffset = 0.f;
|
|
|
|
if(bHiddenDueToBigVehicle)
|
|
{
|
|
heightOffset += sm_defaultVehicleOffset;
|
|
if(bIsPedOnBike)
|
|
{
|
|
heightOffset += sm_bikeOffset;
|
|
}
|
|
}
|
|
|
|
return heightOffset;
|
|
}
|
|
|
|
Vector2 CMultiplayerGamerTagHud::GetScreenOffset(bool bHiddenDueToBigVehicle, int seatIndex, bool bIsPedOnBike, float fExtraVehicleSpacing)
|
|
{
|
|
Vector2 vOffset(0.0f, 0.0f);
|
|
|
|
if(bHiddenDueToBigVehicle)
|
|
{
|
|
if(bIsPedOnBike)
|
|
{
|
|
vOffset.y += seatIndex * sm_vehicleYSpacing;
|
|
}
|
|
else
|
|
{
|
|
float fAspect = CHudTools::GetAspectRatio();
|
|
float fExtraAspectSpace = fAspect < (16.0f/9.0f) ? 0.02f : 0.0f;
|
|
float fXSpacing = sm_vehicleXSpacing + fExtraAspectSpace + fExtraVehicleSpacing;
|
|
|
|
vOffset.x += (seatIndex%2 == 0) ? -fXSpacing : fXSpacing;
|
|
vOffset.y += (int)(seatIndex/2) * sm_vehicleYSpacing;
|
|
}
|
|
}
|
|
|
|
vOffset.y += sm_fVerticalOffset;
|
|
|
|
return vOffset;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::GetPed
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
CPhysical* CMultiplayerGamerTagHud::UT_GetPhysical(int iPlayerId)
|
|
{
|
|
CPhysical *pPhys = NULL;
|
|
|
|
if(uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)))
|
|
{
|
|
if (iPlayerId < MAX_NUM_PHYSICAL_PLAYERS)
|
|
{
|
|
// ensure the ped we are going to use is still valid in MP code/script
|
|
CNetGamePlayer* pNetPlayer = NetworkInterface::GetPhysicalPlayerFromIndex(static_cast<PhysicalPlayerIndex>(iPlayerId));
|
|
|
|
if (pNetPlayer && pNetPlayer->GetPlayerPed() && pNetPlayer->IsPhysical() && pNetPlayer->IsValid() && (!pNetPlayer->IsLeaving()))
|
|
{
|
|
pPhys = pNetPlayer->GetPlayerPed();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pPhys = m_gamerTags[iPlayerId].m_utPhysical; // if a NPC then use the ped pointer stored
|
|
}
|
|
}
|
|
|
|
return pPhys;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::Render
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::Render()
|
|
{
|
|
if(SMultiplayerGamerTagHud::IsInstantiated())
|
|
{
|
|
SMultiplayerGamerTagHud::GetInstance().RT_RenderHelper();
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::RT_RenderHelper()
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on RT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_RenderHelper - can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
m_renderingSection.Lock();
|
|
|
|
if (!IsMovieActive())
|
|
{
|
|
m_renderingSection.Unlock();
|
|
return;
|
|
}
|
|
|
|
PF_PUSH_TIMEBAR("CMultiplayerGamerTagHud::RT_RenderHelper");
|
|
|
|
bool bAnyMPHudTagsInUse = false;
|
|
|
|
bool bIsPaused = CPauseMenu::IsActive() || PAUSEMENUPOSTFXMGR.IsFading();
|
|
|
|
RT_SortGamerTags();
|
|
|
|
for (s32 i = 0; i < MAX_PLAYERS_WITH_GAMER_TAGS; i++)
|
|
{
|
|
if(m_gamerTags[i].IsStateRemovePending())
|
|
{
|
|
RT_RemoveGfxValueForGamerTag(i);
|
|
}
|
|
else if (m_gamerTags[i].IsStateInitPending())
|
|
{
|
|
if (CNewHud::GetDisplayMode() == CNewHud::DM_ARCADE_CNC)
|
|
{
|
|
#if ARCHIVED_SUMMER_CONTENT_ENABLED
|
|
RT_SetupGfxValueForGamerTag(i, GAMER_INFO_FILENAME_CNC);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
RT_SetupGfxValueForGamerTag(i, GAMER_INFO_FILENAME);
|
|
}
|
|
}
|
|
|
|
if (m_gamerTags[i].IsStateActive())
|
|
{
|
|
if(uiVerifyf(m_gamerTags[i].m_asGamerTagContainerMc.HasMember(GAMERTAG_CENTER_OBJECT), "CMultiplayerGamerTagHud::RT_InitComponentGfxValue - Gamertag value " GAMERTAG_CENTER_OBJECT " is invalid for player %d!", i) &&
|
|
uiVerifyf(m_gamerTags[i].m_asGamerTagContainerMc.HasMember(GAMERTAG_LEFT_OBJECT), "CMultiplayerGamerTagHud::RT_InitComponentGfxValue - Gamertag value " GAMERTAG_LEFT_OBJECT " is invalid for player %d!", i))
|
|
{
|
|
GFxValue centerIcons, leftIcons;
|
|
m_gamerTags[i].m_asGamerTagContainerMc.GetMember(GAMERTAG_CENTER_OBJECT, ¢erIcons);
|
|
m_gamerTags[i].m_asGamerTagContainerMc.GetMember(GAMERTAG_LEFT_OBJECT, &leftIcons);
|
|
|
|
if (m_gamerTags[i].IsStateReinit())
|
|
{
|
|
RT_ReinitGamerTag(i, centerIcons, leftIcons);
|
|
}
|
|
|
|
if(!bIsPaused || m_gamerTags[i].m_renderWhenPaused)
|
|
{
|
|
bAnyMPHudTagsInUse = true;
|
|
RT_UpdateActiveGamerTag(i, centerIcons, leftIcons);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
PF_POP_TIMEBAR();
|
|
|
|
PF_PUSH_TIMEBAR("CMultiplayerGamerTagHud - RenderMovie");
|
|
if (bAnyMPHudTagsInUse && CVfxHelper::ShouldRenderInGameUI())
|
|
{
|
|
m_movie.Render();
|
|
}
|
|
PF_POP_TIMEBAR();
|
|
|
|
m_renderingSection.Unlock();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::SortGamerTags
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::RT_SortGamerTags()
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_SortGamerTags - can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
const Vector3 camPos = camInterface::GetPos();
|
|
const Vector3 camDir = camInterface::GetFront();
|
|
|
|
atFixedArray<GamerDepthInfo, MAX_PLAYERS_WITH_GAMER_TAGS> aDepthInfos;
|
|
|
|
// Building an array of all of the existing gamertags with their distances for sorting.
|
|
for (s16 i = 0; i < MAX_PLAYERS_WITH_GAMER_TAGS; i++)
|
|
{
|
|
if(m_gamerTags[i].IsStateActive())
|
|
{
|
|
float fDepth = (m_gamerTags[i].m_playerPos.GetReadBuf() - camPos).Dot(camDir);
|
|
|
|
GamerDepthInfo temp(fDepth, i);
|
|
aDepthInfos.Push(temp);
|
|
}
|
|
}
|
|
|
|
aDepthInfos.QSort(0, -1, GamerDepthInfo::DepthCompare);
|
|
|
|
// Now that the gamer tags have an order, lets move them to where they belong.
|
|
for (s16 depth = 0; depth < aDepthInfos.size(); depth++)
|
|
{
|
|
s32 indexAtDepth = aDepthInfos[depth].m_playerIndex;
|
|
if(m_gamerTags[indexAtDepth].m_rtDepth != depth)
|
|
{
|
|
uiDebugf1("CMultiplayerGamerTagHud::RT_SortGamerTags - %s was at %d, now at %d", m_gamerTags[indexAtDepth].m_refName, m_gamerTags[indexAtDepth].m_rtDepth, depth);
|
|
|
|
m_gamerTags[indexAtDepth].m_rtDepth = depth;
|
|
if (!m_gamerTags[indexAtDepth].m_asGamerTagContainerMc.IsUndefined())
|
|
{
|
|
GFxValue args[1];
|
|
args[0].SetNumber(depth);
|
|
|
|
GFxValue result;
|
|
m_gamerTags[indexAtDepth].m_asGamerTagContainerMc.Invoke("swapDepths", &result, args, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag(int iPlayerId, const char *cGamerInfoFilename)
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag - can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
sGamerTag& rGamerTag = m_gamerTags[iPlayerId];
|
|
|
|
if (uiVerifyf(rGamerTag.m_asGamerTagContainerMc.IsUndefined(), "CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag - Gamertag Value already attached for player %d at setup", iPlayerId))
|
|
{
|
|
// Need to set this to an unique depth so it doesn't delete existing movies
|
|
rGamerTag.m_rtDepth = static_cast<s16>(MAX_PLAYERS_WITH_GAMER_TAGS+iPlayerId);
|
|
|
|
if (uiVerifyf(m_asGamerTagLayerContainer.GFxValue::AttachMovie(&rGamerTag.m_asGamerTagContainerMc, cGamerInfoFilename, rGamerTag.m_refName, rGamerTag.m_rtDepth),
|
|
"CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag - Failed to add a gamertag for player %d", iPlayerId))
|
|
{
|
|
bool wasCreated = false;
|
|
|
|
if(uiVerifyf(rGamerTag.m_asGamerTagContainerMc.IsDefined(), "CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag - Failed to add a gamertag for player %d", iPlayerId))
|
|
{
|
|
if(uiVerifyf(rGamerTag.m_asGamerTagContainerMc.HasMember(GAMERTAG_CENTER_OBJECT), "CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag - Failed to find " GAMERTAG_CENTER_OBJECT " when adding gamer tag for player %d", iPlayerId) &&
|
|
uiVerifyf(rGamerTag.m_asGamerTagContainerMc.HasMember(GAMERTAG_LEFT_OBJECT), "CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag - Failed to find " GAMERTAG_LEFT_OBJECT " when adding gamer tag for player %d", iPlayerId))
|
|
{
|
|
GFxValue centerIcons, leftIcons;
|
|
rGamerTag.m_asGamerTagContainerMc.GetMember(GAMERTAG_CENTER_OBJECT, ¢erIcons);
|
|
rGamerTag.m_asGamerTagContainerMc.GetMember(GAMERTAG_LEFT_OBJECT, &leftIcons);
|
|
|
|
if(RT_InitAndVerifyAllComponentGfxValues(iPlayerId, centerIcons, leftIcons))
|
|
{
|
|
RT_ReinitGamerTagCrewDetails(iPlayerId);
|
|
|
|
RT_SetGamerTagValueIntOnGfxValue(iPlayerId, MP_TAG_WANTED_LEVEL, 0, centerIcons, leftIcons);
|
|
RT_SetGamerTagValueIntOnGfxValue(iPlayerId, MP_TAG_RANK, 0, centerIcons, leftIcons);
|
|
RT_SetGamerTagValueIntOnGfxValue(iPlayerId, MP_TAG_PACKAGE_LARGE, 0, centerIcons, leftIcons);
|
|
|
|
atFixedArray<GamerDepthInfo, MAX_MP_TAGS> aDepthInfos;
|
|
|
|
for (s32 j = 0; j < MAX_MP_TAGS; j++)
|
|
{
|
|
GFxValue componentGfxValue;
|
|
|
|
RT_GetComponentGfxValue(&componentGfxValue, iPlayerId, (eMP_TAG)j, centerIcons, leftIcons, false);
|
|
|
|
if( componentGfxValue.IsDisplayObject() )
|
|
{
|
|
GFxValue::DisplayInfo newDisplayInfo;
|
|
newDisplayInfo.SetVisible(false);
|
|
componentGfxValue.SetDisplayInfo(newDisplayInfo);
|
|
|
|
if(!sm_staticDataInited)
|
|
{
|
|
GFxValue iconWidth;
|
|
componentGfxValue.GetMember("_width", &iconWidth);
|
|
if(iconWidth.IsDefined())
|
|
{
|
|
sm_tagWidths[j] = static_cast<float>(iconWidth.GetNumber());
|
|
}
|
|
|
|
float depth = 0.0f;
|
|
GFxValue result;
|
|
componentGfxValue.Invoke("getDepth", &result);
|
|
|
|
if(result.IsDefined())
|
|
{
|
|
depth = (float)result.GetNumber();
|
|
}
|
|
|
|
GamerDepthInfo temp(depth, (s16)j);
|
|
aDepthInfos.Push(temp);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
uiWarningf("CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag - eMP_TAG %d is not a display object", j );
|
|
}
|
|
}
|
|
uiDisplayf("CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag - Adding Gamertag for iPlayerId=%d", iPlayerId);
|
|
|
|
if(!sm_staticDataInited)
|
|
{
|
|
aDepthInfos.QSort(0, -1, GamerDepthInfo::DepthCompare);
|
|
|
|
for(int i=0; i<aDepthInfos.size(); ++i)
|
|
{
|
|
sm_tagOrder[i] = static_cast<eMP_TAG>(aDepthInfos[i].m_playerIndex);
|
|
}
|
|
}
|
|
|
|
rGamerTag.SetStateActive();
|
|
wasCreated = true;
|
|
|
|
sm_staticDataInited = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!wasCreated)
|
|
{
|
|
uiDisplayf("CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag - Gamertag for iPlayerId=%d failed to be properly created, will try again.", iPlayerId);
|
|
|
|
if (uiVerifyf(rGamerTag.m_asGamerTagContainerMc.IsDefined(), "CMultiplayerGamerTagHud::RT_SetupGfxValueForGamerTag - GamerTag movie for player %d was attached, but not defined.", iPlayerId))
|
|
{
|
|
rGamerTag.m_asGamerTagContainerMc.Invoke("removeMovieClip");
|
|
rGamerTag.m_asGamerTagContainerMc.SetUndefined();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::RemoveGfxValueForGamerTag
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::RT_RemoveGfxValueForGamerTag(int iPlayerId)
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_RemoveGfxValueForGamerTag can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
sGamerTag& rGamerTag = m_gamerTags[iPlayerId];
|
|
|
|
if (rGamerTag.m_asGamerTagContainerMc.IsDefined())
|
|
{
|
|
uiDebugf1("CMultiplayerGamerTagHud::RT_RemoveGfxValueForGamerTag - Removing for iPlayerId=%d", iPlayerId);
|
|
rGamerTag.m_asGamerTagContainerMc.Invoke("removeMovieClip");
|
|
rGamerTag.m_asGamerTagContainerMc.SetUndefined();
|
|
}
|
|
|
|
rGamerTag.SetStateDestroyPending();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::ReinitGamerTag
|
|
// PURPOSE:
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::RT_ReinitGamerTag(int iPlayerId, GFxValue& centerIcons, GFxValue& leftIcons)
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_ReinitGamerTag can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
sGamerTag& rGamerTag = m_gamerTags[iPlayerId];
|
|
rGamerTag.ClearStateReinit();
|
|
|
|
for (s32 j = 0; j < MAX_MP_TAGS; j++)
|
|
{
|
|
if(!rGamerTag.m_TagReinitFlags.GetReadBuf().IsSet(j))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
GFxValue componentGfxValue;
|
|
|
|
RT_GetComponentGfxValue(&componentGfxValue, iPlayerId, (eMP_TAG)j, centerIcons, leftIcons, false);
|
|
|
|
if (!componentGfxValue.IsDisplayObject())
|
|
{
|
|
// Not all tags need to exist all the time.
|
|
//uiAssertf(0, "Gamertag Value componentGfxValue is undefined for player %d, tag %d", iPlayerId, (eMP_TAG)j);
|
|
|
|
continue;
|
|
}
|
|
|
|
GFxValue::DisplayInfo currentDisplayInfo;
|
|
componentGfxValue.GetDisplayInfo(¤tDisplayInfo);
|
|
|
|
bool bCurrentVisibleFlag = rGamerTag.m_visibleFlag[j];
|
|
if(rGamerTag.m_hiddenDueToBigVehicle &&
|
|
j!=MP_TAG_GAMER_NAME &&
|
|
j!=MP_TAG_GAMER_NAME_NEARBY &&
|
|
j!=MP_TAG_PASSIVE_MODE)
|
|
{
|
|
bCurrentVisibleFlag = false;
|
|
}
|
|
|
|
if (bCurrentVisibleFlag != currentDisplayInfo.GetVisible())
|
|
{
|
|
GFxValue::DisplayInfo newDisplayInfo;
|
|
newDisplayInfo.SetVisible(bCurrentVisibleFlag);
|
|
componentGfxValue.SetDisplayInfo(newDisplayInfo);
|
|
rGamerTag.m_reinitPositions = true;
|
|
}
|
|
|
|
s32 iCurrentValue = rGamerTag.m_value[j];
|
|
if (iCurrentValue != -1)
|
|
{
|
|
rGamerTag.m_value[j] = -1;
|
|
|
|
RT_SetGamerTagValueIntOnGfxValue(componentGfxValue, (eMP_TAG)j, iCurrentValue);
|
|
rGamerTag.m_reinitPositions = true;
|
|
}
|
|
|
|
eHUD_COLOURS CurrentColour = rGamerTag.m_colour[j];
|
|
if (CurrentColour != HUD_COLOUR_INVALID)
|
|
{
|
|
rGamerTag.m_colour[j] = HUD_COLOUR_INVALID;
|
|
RT_SetGamerTagValueHudColourOnGfxValue(componentGfxValue, iPlayerId, (eMP_TAG)j, CurrentColour);
|
|
}
|
|
|
|
if (rGamerTag.m_updateAlpha[j])
|
|
{
|
|
rGamerTag.m_updateAlpha[j] = false;
|
|
|
|
RT_SetGamerTagValueHudAlphaOnGfxValue(componentGfxValue, iPlayerId, (eMP_TAG)j, (s32)rGamerTag.m_alpha[j]);
|
|
|
|
if (rGamerTag.m_reinitPosDueToAlpha)
|
|
{
|
|
rGamerTag.m_reinitPosDueToAlpha = false;
|
|
rGamerTag.m_reinitPositions = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(rGamerTag.m_healthBarColourDirty.GetReadBuf() && rGamerTag.m_healthBarColour != HUD_COLOUR_INVALID)
|
|
{
|
|
GFxValue componentGfxValue;
|
|
RT_GetComponentGfxValue(&componentGfxValue, iPlayerId, MP_TAG_HEALTH_BAR, centerIcons, leftIcons);
|
|
RT_UpdateHealthColorHelper(componentGfxValue, HEALTH_ARMOUR_NAME, rGamerTag.m_healthBarColour);
|
|
RT_UpdateHealthColorHelper(componentGfxValue, HEALTH_NO_ARMOUR_NAME, rGamerTag.m_healthBarColour);
|
|
#if ARCHIVED_SUMMER_CONTENT_ENABLED
|
|
RT_UpdateHealthColorHelper(componentGfxValue, HEALTH_CNC_NO_ARMOUR_NAME, rGamerTag.m_healthBarColour);
|
|
RT_UpdateHealthColorHelper(componentGfxValue, HEALTH_CNC_NO_ARMOUR_NO_ENDURANCE_NAME, rGamerTag.m_healthBarColour);
|
|
#endif
|
|
rGamerTag.m_healthBarColour = HUD_COLOUR_INVALID;
|
|
rGamerTag.m_healthBarColourDirty.GetRenderBuf() = false;
|
|
}
|
|
|
|
rGamerTag.m_TagReinitFlags.GetRenderBuf().Reset();
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::RT_UpdateActiveGamerTag(int iPlayerId, GFxValue& centerIcons, GFxValue& leftIcons)
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::Rt_UpdateActiveGamerTag can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
sGamerTag& rGamerTag = m_gamerTags[iPlayerId];
|
|
if(rGamerTag.IsStateNeedsPositionUpdate())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!uiVerifyf(rGamerTag.m_asGamerTagContainerMc.IsDefined(), "CMultiplayerGamerTagHud::RT_UpdateActiveGamerTag - - GamerTag movie for player %d was attached, but not defined.", iPlayerId))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(rGamerTag.m_reinitCrewTag)
|
|
{
|
|
RT_ReinitGamerTagCrewDetails(iPlayerId);
|
|
rGamerTag.m_reinitPositions = true;
|
|
}
|
|
|
|
if(rGamerTag.m_reinitBigText)
|
|
{
|
|
GFxValue bigText;
|
|
RT_GetComponentGfxValue(&bigText, iPlayerId, MP_TAG_BIG_TEXT, centerIcons, leftIcons, true);
|
|
if(bigText.IsDefined() && uiVerifyf(bigText.IsDisplayObject(), "CMultiplayerGamerTagHud::RT_UpdateActiveGamerTag - The BigText object isn't a display object. Type=%d", bigText.GetType()))
|
|
{
|
|
bigText.SetText(rGamerTag.m_bigtext);
|
|
}
|
|
rGamerTag.m_reinitBigText = false;
|
|
}
|
|
|
|
GFxValue::DisplayInfo newDisplayInfo, currentDisplayInfo;
|
|
rGamerTag.m_asGamerTagContainerMc.GetDisplayInfo(¤tDisplayInfo);
|
|
|
|
if(rGamerTag.m_visible.GetReadBuf())
|
|
{
|
|
if ((!currentDisplayInfo.GetVisible()) || currentDisplayInfo.GetX() != rGamerTag.m_screenPos.GetReadBuf().x || currentDisplayInfo.GetY() != rGamerTag.m_screenPos.GetReadBuf().y)
|
|
{
|
|
|
|
#if RSG_PC || RSG_DURANGO || RSG_ORBIS
|
|
float fUIWidth = 1280.f;
|
|
float fUIHeight = 720.f;
|
|
#else
|
|
float fUIWidth = SCREEN_WIDTH;
|
|
float fUIHeight = SCREEN_HEIGHT;
|
|
#endif
|
|
|
|
newDisplayInfo.SetX((rGamerTag.m_screenPos.GetReadBuf().x) * fUIWidth);
|
|
newDisplayInfo.SetY((rGamerTag.m_screenPos.GetReadBuf().y) * fUIHeight);
|
|
|
|
float scaler = (CHudTools::GetAspectRatioMultiplier() < 1.0f) ? sm_4x3Scaler : 100.0f;
|
|
newDisplayInfo.SetScale(rGamerTag.m_scale.GetReadBuf() * scaler, rGamerTag.m_scale.GetReadBuf() * scaler);
|
|
|
|
if (!currentDisplayInfo.GetVisible())
|
|
newDisplayInfo.SetVisible(true);
|
|
|
|
rGamerTag.m_asGamerTagContainerMc.SetDisplayInfo(newDisplayInfo);
|
|
|
|
// readjust positions if required:
|
|
if (rGamerTag.m_reinitPositions)
|
|
{
|
|
rGamerTag.m_reinitPositions = false;
|
|
|
|
bool bVisibilities[MAX_MP_TAGS] = {false};
|
|
GFxValue gfxValues[MAX_MP_TAGS]; // If bVisibilities[x] is true, then gfxValues[x] will be defined and visible.
|
|
|
|
s32 iNumberVisibleCenter = 0;
|
|
s32 iNumberVisibleLeft = 0;
|
|
float fCenterWidth = 0.0f;
|
|
float fLeftWidth = 0.0f;
|
|
|
|
float gamerTagY = 0.0f;
|
|
float aboveSpacer = 0.0f;
|
|
|
|
for (s32 lookupIndex = 0; lookupIndex < MAX_MP_TAGS; ++lookupIndex)
|
|
{
|
|
s32 iCurrTag = sm_tagOrder[lookupIndex];
|
|
RT_GetComponentGfxValue(&gfxValues[iCurrTag], iPlayerId, (eMP_TAG)iCurrTag, centerIcons, leftIcons, false);
|
|
|
|
if (gfxValues[iCurrTag].IsDefined())
|
|
{
|
|
GFxValue::DisplayInfo dInfo;
|
|
gfxValues[iCurrTag].GetDisplayInfo(&dInfo);
|
|
|
|
if(iCurrTag == MP_TAG_GAMER_NAME)
|
|
{
|
|
gamerTagY = (float)dInfo.GetY();
|
|
}
|
|
|
|
if (dInfo.GetVisible())
|
|
{
|
|
bVisibilities[iCurrTag] = true;
|
|
|
|
float width = sm_tagWidths[iCurrTag];
|
|
float spacer = sm_iconSpacing;
|
|
|
|
if(iCurrTag == MP_TAG_GAMER_NAME || iCurrTag == MP_TAG_GAMER_NAME_NEARBY)
|
|
{
|
|
width = rGamerTag.m_gamerTagWidth;
|
|
spacer = sm_afterGamerNameSpacing;
|
|
aboveSpacer = sm_aboveGamerNameSpacing;
|
|
}
|
|
else if (iCurrTag == MP_TAG_ARROW)
|
|
{
|
|
aboveSpacer = sm_aboveGamerNameSpacing;
|
|
}
|
|
|
|
if (m_rtTagFlags[iCurrTag] & TF_CENTER_ROW)
|
|
{
|
|
if(iNumberVisibleCenter)
|
|
{
|
|
width += spacer;
|
|
}
|
|
|
|
iNumberVisibleCenter++;
|
|
fCenterWidth += width;
|
|
}
|
|
else if (m_rtTagFlags[iCurrTag] & TF_LEFT_ROW)
|
|
{
|
|
if(iNumberVisibleLeft)
|
|
{
|
|
width += spacer;
|
|
}
|
|
|
|
iNumberVisibleLeft++;
|
|
fLeftWidth += width;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
float fStartingPosCenter = -fCenterWidth*0.5f; // starting here will center it all
|
|
float fStartingPosLeft = fStartingPosCenter - fLeftWidth; //We'll start on the left and move right, so the Voice chat won't shift other icons when people talk.
|
|
|
|
for (s32 lookupIndex = 0; lookupIndex < MAX_MP_TAGS; ++lookupIndex)
|
|
{
|
|
s32 iCurrTag = sm_tagOrder[lookupIndex];
|
|
|
|
if (bVisibilities[iCurrTag])
|
|
{
|
|
float width = sm_tagWidths[iCurrTag] + sm_iconSpacing;
|
|
float offset = width*0.5f;
|
|
|
|
if(iCurrTag == MP_TAG_GAMER_NAME || iCurrTag == MP_TAG_GAMER_NAME_NEARBY)
|
|
{
|
|
width = rGamerTag.m_gamerTagWidth + sm_afterGamerNameSpacing;
|
|
offset = 0.0f;
|
|
}
|
|
else if(iCurrTag == MP_TAG_PACKAGES)
|
|
{
|
|
GFxValue::DisplayInfo iconDisplayInfo;
|
|
iconDisplayInfo.SetY(gamerTagY + aboveSpacer);
|
|
|
|
gfxValues[iCurrTag].SetDisplayInfo(iconDisplayInfo);
|
|
}
|
|
|
|
if(m_rtTagFlags[iCurrTag] & TF_CENTER_ROW)
|
|
{
|
|
GFxValue::DisplayInfo iconDisplayInfo;
|
|
iconDisplayInfo.SetX(fStartingPosCenter + offset);
|
|
|
|
gfxValues[iCurrTag].SetDisplayInfo(iconDisplayInfo);
|
|
fStartingPosCenter += width;
|
|
}
|
|
else if(m_rtTagFlags[iCurrTag] & TF_LEFT_ROW)
|
|
{
|
|
GFxValue::DisplayInfo iconDisplayInfo;
|
|
iconDisplayInfo.SetX(fStartingPosLeft + offset);
|
|
|
|
gfxValues[iCurrTag].SetDisplayInfo(iconDisplayInfo);
|
|
fStartingPosLeft += width;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Update the health bar.
|
|
GFxValue healthArmour;
|
|
RT_GetComponentGfxValue(&healthArmour, iPlayerId, MP_TAG_HEALTH_BAR, centerIcons, leftIcons, true);
|
|
if (healthArmour.IsDefined() && rGamerTag.m_alpha[MP_TAG_HEALTH_BAR] > 0)
|
|
{
|
|
uiDebugf1("Updating health bar");
|
|
const CNewHud::sHealthInfo& rHealthInfo = rGamerTag.m_healthInfo.GetReadBuf();
|
|
bool bHealthChanged = false;
|
|
bool bArmourChanged = false;
|
|
bool bEnduranceChanged = false;
|
|
int iHealthPercentageValue = rHealthInfo.m_iHealthPercentageValue;
|
|
int iEndurancePercentageValue = rHealthInfo.m_iEndurancePercentageValue;
|
|
int iArmorPercentageValue = rHealthInfo.m_iArmourPercentageValue;
|
|
|
|
{
|
|
#if __BANK
|
|
if (!bDebugUsePointHealth)
|
|
{
|
|
if (iDebugHealthPercent != -1)
|
|
{
|
|
iHealthPercentageValue = iDebugHealthPercent;
|
|
}
|
|
}
|
|
#endif
|
|
if (iHealthPercentageValue != rGamerTag.m_previousHealthInfo.m_iHealthPercentageValue ||
|
|
rHealthInfo.m_iHealthPercentageCapacity != rGamerTag.m_previousHealthInfo.m_iHealthPercentageCapacity)
|
|
{
|
|
RT_UpdateHealthArmourHelper(healthArmour, iHealthPercentageValue, rHealthInfo.m_iHealthPercentageCapacity, HEALTH_ARMOUR_NAME, "healthBar");
|
|
RT_UpdateHealthArmourHelper(healthArmour, iHealthPercentageValue, rHealthInfo.m_iHealthPercentageCapacity, HEALTH_NO_ARMOUR_NAME, "healthBar");
|
|
#if ARCHIVED_SUMMER_CONTENT_ENABLED
|
|
RT_UpdateHealthArmourHelper(healthArmour, iHealthPercentageValue, rHealthInfo.m_iHealthPercentageCapacity, HEALTH_CNC_NO_ARMOUR_NAME, "healthBar");
|
|
RT_UpdateHealthArmourHelper(healthArmour, iHealthPercentageValue, rHealthInfo.m_iHealthPercentageCapacity, HEALTH_CNC_NO_ARMOUR_NO_ENDURANCE_NAME, "healthBar");
|
|
#endif
|
|
|
|
rGamerTag.m_previousHealthInfo.m_iHealthPercentageValue = iHealthPercentageValue;
|
|
rGamerTag.m_previousHealthInfo.m_iHealthPercentageCapacity = rHealthInfo.m_iHealthPercentageCapacity;
|
|
bHealthChanged = true;
|
|
}
|
|
}
|
|
|
|
{
|
|
if (iEndurancePercentageValue != rGamerTag.m_previousHealthInfo.m_iEndurancePercentageValue ||
|
|
rHealthInfo.m_iEndurancePercentageCapacity != rGamerTag.m_previousHealthInfo.m_iEndurancePercentageCapacity)
|
|
{
|
|
#if ARCHIVED_SUMMER_CONTENT_ENABLED
|
|
RT_UpdateHealthArmourHelper(healthArmour, iEndurancePercentageValue, rHealthInfo.m_iEndurancePercentageCapacity, HEALTH_CNC_NO_ARMOUR_NAME, "EnduranceBar");
|
|
#endif
|
|
rGamerTag.m_previousHealthInfo.m_iEndurancePercentageValue = iEndurancePercentageValue;
|
|
rGamerTag.m_previousHealthInfo.m_iEndurancePercentageCapacity = rHealthInfo.m_iEndurancePercentageCapacity;
|
|
bEnduranceChanged = true;
|
|
}
|
|
}
|
|
|
|
{
|
|
#if __BANK
|
|
if (!bDebugUsePointHealth)
|
|
{
|
|
if (iDebugArmorPercent != -1)
|
|
{
|
|
iArmorPercentageValue = iDebugArmorPercent;
|
|
}
|
|
}
|
|
#endif
|
|
if (iArmorPercentageValue != rGamerTag.m_previousHealthInfo.m_iArmourPercentageValue ||
|
|
rHealthInfo.m_iArmourPercentageCapacity != rGamerTag.m_previousHealthInfo.m_iArmourPercentageCapacity)
|
|
{
|
|
RT_UpdateHealthArmourHelper(healthArmour, iArmorPercentageValue, rHealthInfo.m_iArmourPercentageCapacity, HEALTH_ARMOUR_NAME, "armourBar");
|
|
|
|
rGamerTag.m_previousHealthInfo.m_iArmourPercentageValue = iArmorPercentageValue;
|
|
rGamerTag.m_previousHealthInfo.m_iArmourPercentageCapacity = rHealthInfo.m_iArmourPercentageCapacity;
|
|
bArmourChanged = true;
|
|
}
|
|
|
|
if ((bHealthChanged || (bEnduranceChanged && iEndurancePercentageValue >= 0) || rGamerTag.m_previousHealthInfo.m_iTeam != rHealthInfo.m_iTeam) && (CNewHud::GetDisplayMode() == CNewHud::DM_ARCADE_CNC ))
|
|
{
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_ARMOUR_NAME, false);
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_NO_ARMOUR_NAME, false);
|
|
#if ARCHIVED_SUMMER_CONTENT_ENABLED
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_CNC_NO_ARMOUR_NAME, rHealthInfo.m_iTeam == (int)eArcadeTeam::AT_CNC_CROOK);
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_CNC_NO_ARMOUR_NO_ENDURANCE_NAME, rHealthInfo.m_iTeam == (int)eArcadeTeam::AT_CNC_COP);
|
|
#endif
|
|
}
|
|
else if ((bHealthChanged || bArmourChanged) && (iArmorPercentageValue > 0))
|
|
{
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_ARMOUR_NAME, true);
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_NO_ARMOUR_NAME, false);
|
|
#if ARCHIVED_SUMMER_CONTENT_ENABLED
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_CNC_NO_ARMOUR_NAME, false);
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_CNC_NO_ARMOUR_NO_ENDURANCE_NAME, false);
|
|
#endif
|
|
}
|
|
else if (bHealthChanged)
|
|
{
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_ARMOUR_NAME, false);
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_NO_ARMOUR_NAME, true);
|
|
#if ARCHIVED_SUMMER_CONTENT_ENABLED
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_CNC_NO_ARMOUR_NAME, false);
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_CNC_NO_ARMOUR_NO_ENDURANCE_NAME, false);
|
|
#endif
|
|
}
|
|
|
|
}
|
|
}
|
|
else if(healthArmour.IsDefined() && rGamerTag.m_alpha[MP_TAG_HEALTH_BAR] <= 0)
|
|
{
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_ARMOUR_NAME, false);
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_NO_ARMOUR_NAME, false);
|
|
#if ARCHIVED_SUMMER_CONTENT_ENABLED
|
|
RT_UpdateHealthArmourVisibilityHelper(healthArmour, HEALTH_CNC_NO_ARMOUR_NAME, false);
|
|
#endif
|
|
}
|
|
}
|
|
else
|
|
{
|
|
newDisplayInfo.SetVisible(false);
|
|
rGamerTag.m_asGamerTagContainerMc.SetDisplayInfo(newDisplayInfo);
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::RT_UpdateHealthArmourHelper(GFxValue& parent, int percentageValue, int capacity, const char* pBarContainerName, const char* pBarName)
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_UpdateHealthArmourHelper can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
if(!uiVerify(parent.IsDefined()) || !uiVerify(pBarName) || !uiVerify(pBarContainerName))
|
|
{
|
|
return;
|
|
}
|
|
|
|
const double barScale = 100.0;
|
|
|
|
double val = ((double)percentageValue) * (barScale/((double)capacity));
|
|
|
|
GFxValue barContainer;
|
|
GFxValue::DisplayInfo healthBarLeftInfo;
|
|
parent.GetMember(pBarContainerName, &barContainer);
|
|
|
|
if(uiVerify(barContainer.IsDefined()))
|
|
{
|
|
GFxValue healthBar;
|
|
GFxValue::DisplayInfo healthBarLeftInfo;
|
|
barContainer.GetMember(pBarName, &healthBar);
|
|
healthBar.GetDisplayInfo(&healthBarLeftInfo);
|
|
if ((val >= 0))
|
|
{
|
|
healthBarLeftInfo.SetXScale(MIN(val, 100));
|
|
}
|
|
else
|
|
{
|
|
healthBarLeftInfo.SetXScale(0);
|
|
}
|
|
healthBar.SetDisplayInfo(healthBarLeftInfo);
|
|
}
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::RT_UpdateHealthArmourVisibilityHelper(GFxValue& parent, const char* pBar, bool isVisible)
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_UpdateHealthArmourVisibilityHelper can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
if(!uiVerify(parent.IsDefined()) || !uiVerify(pBar))
|
|
{
|
|
return;
|
|
}
|
|
|
|
GFxValue healthBar;
|
|
GFxValue::DisplayInfo healthBarLeftInfo;
|
|
parent.GetMember(pBar, &healthBar);
|
|
healthBar.GetDisplayInfo(&healthBarLeftInfo);
|
|
healthBarLeftInfo.SetVisible(isVisible);
|
|
healthBar.SetDisplayInfo(healthBarLeftInfo);
|
|
}
|
|
|
|
void CMultiplayerGamerTagHud::RT_UpdateHealthColorHelper(GFxValue& parent, const char* pBar, eHUD_COLOURS healthBarColour)
|
|
{
|
|
if (!CSystem::IsThisThreadId(SYS_THREAD_RENDER)) // only on UT
|
|
{
|
|
uiAssertf(0, "CMultiplayerGamerTagHud::RT_UpdateHealthColorHelper can only be called on the RenderThread!");
|
|
return;
|
|
}
|
|
|
|
if(!uiVerify(parent.IsDefined()) || !uiVerify(pBar))
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
GFxValue healthBarContainer;
|
|
parent.GetMember(pBar, &healthBarContainer);
|
|
|
|
if (uiVerify(healthBarContainer.IsDefined()))
|
|
{
|
|
CRGBA hudColour = CHudColour::GetRGB(healthBarColour, 100);
|
|
Color32 iColour(hudColour.GetColor());
|
|
|
|
GFxValue healthBar;
|
|
healthBarContainer.GetMember("healthBar", &healthBar);
|
|
if(uiVerify(healthBar.IsDefined()))
|
|
{
|
|
RT_SetColourToGfxvalue(&healthBar, iColour);
|
|
}
|
|
|
|
GFxValue healthBarTrough;
|
|
healthBarContainer.GetMember("healthBarTrough", &healthBarTrough);
|
|
if(uiVerify(healthBarTrough.IsDefined()))
|
|
{
|
|
Color32 iColourTrough(iColour.GetRedf()*0.6f, iColour.GetGreenf()*0.6f, iColour.GetBluef()*0.6f, iColour.GetAlphaf());
|
|
RT_SetColourToGfxvalue(&healthBarTrough, iColourTrough);
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::CreateRoot()
|
|
// PURPOSE: sets up the main root layer
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_CreateRoot()
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)))
|
|
{
|
|
m_renderingSection.Lock();
|
|
{ // scope for AutoLock
|
|
CScaleformMgr::AutoLock lock(m_movie.GetMovieID());
|
|
|
|
GFxValue asMovieObject = CScaleformMgr::GetActionScriptObjectFromRoot(m_movie.GetMovieID());
|
|
if(uiVerify(asMovieObject.IsDefined()) && !m_asRootContainer.IsDefined())
|
|
{
|
|
asMovieObject.CreateEmptyMovieClip(&m_asRootContainer, "asRootContainer", MOVIE_DEPTH_ROOT);
|
|
}
|
|
|
|
if(uiVerify(m_asRootContainer.IsDefined()) && !m_asGamerTagLayerContainer.IsDefined())
|
|
{
|
|
if(uiVerify(m_asRootContainer.CreateEmptyMovieClip(&m_asGamerTagLayerContainer, "asGamerTagLayerContainer", 100)))
|
|
{
|
|
m_rootCreated = true;
|
|
}
|
|
}
|
|
}
|
|
m_renderingSection.Unlock();
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME: CMultiplayerGamerTagHud::RemoveRoot()
|
|
// PURPOSE: removes the main root layer
|
|
/////////////////////////////////////////////////////////////////////////////////////
|
|
void CMultiplayerGamerTagHud::UT_RemoveRoot()
|
|
{
|
|
if (uiVerify(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)))
|
|
{
|
|
m_renderingSection.Lock();
|
|
{ // scope for AutoLock
|
|
CScaleformMgr::AutoLock lock(m_movie.GetMovieID());
|
|
if(m_rootCreated)
|
|
{
|
|
m_rootCreated = false;
|
|
|
|
if(m_asGamerTagLayerContainer.IsDefined())
|
|
{
|
|
m_asGamerTagLayerContainer.Invoke("removeMovieClip"); // remove the mask movie
|
|
m_asGamerTagLayerContainer.SetUndefined();
|
|
}
|
|
|
|
if(m_asRootContainer.IsDefined())
|
|
{
|
|
m_asRootContainer.Invoke("removeMovieClip"); // remove the mask movie
|
|
m_asRootContainer.SetUndefined();
|
|
}
|
|
}
|
|
}
|
|
m_renderingSection.Unlock();
|
|
}
|
|
}
|
|
|
|
// eof
|