This commit is contained in:
Tleety
2016-03-03 12:58:35 +01:00
parent ff6e2167d4
commit c8aeae2c96
4 changed files with 636 additions and 585 deletions
+2 -2
View File
@@ -30,12 +30,12 @@ private:
struct PlayerData { struct PlayerData {
int ID = -1; int ID = -1;
std::string Name = ""; std::string Name = "";
int Team = -1; int Team = 1;
EntityWrapper Player = EntityWrapper::Invalid; EntityWrapper Player = EntityWrapper::Invalid;
}; };
int m_PlayerCounter = 0; int m_PlayerCounter = 0;
std::unordered_map<std::string, PlayerData> m_PlayerIdentities; std::unordered_map<int, PlayerData> m_PlayerIdentities;
}; };
#endif #endif
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -9,7 +9,7 @@ CapturePointHUDSystem::CapturePointHUDSystem(SystemParams params)
void CapturePointHUDSystem::Update(double dt) void CapturePointHUDSystem::Update(double dt)
{ {
bool LoadCheck = true; bool loadCheck = true;
int redTeam; int redTeam;
int blueTeam; int blueTeam;
int spectatorTeam; int spectatorTeam;
@@ -35,11 +35,11 @@ void CapturePointHUDSystem::Update(double dt)
//Check if the HUD corresponds to the Capture Point Number //Check if the HUD corresponds to the Capture Point Number
if (HUD_ID == (int)entityCP["CapturePoint"]["CapturePointNumber"]) { if (HUD_ID == (int)entityCP["CapturePoint"]["CapturePointNumber"]) {
ComponentWrapper& teamComponent = entityCP["Team"]; ComponentWrapper& teamComponent = entityCP["Team"];
if (LoadCheck) { if (loadCheck) {
redTeam = (int)teamComponent["Team"].Enum("Red"); redTeam = (int)teamComponent["Team"].Enum("Red");
blueTeam = (int)teamComponent["Team"].Enum("Blue"); blueTeam = (int)teamComponent["Team"].Enum("Blue");
spectatorTeam = (int)teamComponent["Team"].Enum("Spectator"); spectatorTeam = (int)teamComponent["Team"].Enum("Spectator");
LoadCheck = false; loadCheck = false;
} }
//Color hud with team color //Color hud with team color
auto capturePointTeam = (int)teamComponent["Team"]; auto capturePointTeam = (int)teamComponent["Team"];
+45 -25
View File
@@ -18,32 +18,53 @@ void ScoreScreenSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper&
return; return;
} }
int redTeamEnum;
int blueTeamEnum;
int spectatorTeamEnum;
int currentTeam = 0;
if(entity.HasComponent("Team")) {
auto cTeam = entity["Team"];
redTeamEnum = (int)cTeam["Team"].Enum("Red");
blueTeamEnum = (int)cTeam["Team"].Enum("Blue");
spectatorTeamEnum = (int)cTeam["Team"].Enum("Spectator");
currentTeam = (int)cTeam["Team"];
}
auto children = entity.ChildrenWithComponent("ScoreIdentity"); auto children = entity.ChildrenWithComponent("ScoreIdentity");
for (auto it = m_PlayerIdentities.begin(); it != m_PlayerIdentities.end(); ++it) { for (auto it = m_PlayerIdentities.begin(); it != m_PlayerIdentities.end(); ++it) {
bool found = false; bool found = false;
for (auto child : children) { for (auto child : children) {
std::string name = (std::string)child["ScoreIdentity"]["Name"]; int ID = (int)child["ScoreIdentity"]["ID"];
if (it->first == name) { if (it->first == ID) {
if (it->second.Team != currentTeam) {
m_World->DeleteEntity(child.ID);
break;
}
found = true; found = true;
break; break;
} }
} }
if(found == false) { if(found == false) {
if(it->second.Team != currentTeam) {
//This player is not the same team as this scoreboard should show.
break;
}
//There is no entry for this player, create one. //There is no entry for this player, create one.
auto entityFile = ResourceManager::Load<EntityFile>("Schema/Entities/ScoreIdentity.xml"); auto entityFile = ResourceManager::Load<EntityFile>("Schema/Entities/ScoreIdentity.xml");
EntityWrapper scoreIdentity = entityFile->MergeInto(m_World); EntityWrapper scoreIdentity = entityFile->MergeInto(m_World);
auto cScoreIdentity = scoreIdentity["ScoreIdentity"]; auto cScoreIdentity = scoreIdentity["ScoreIdentity"];
auto data = it->second; auto data = it->second;
std::printf("\n\n");
std::printf(data.Name.c_str());
std::printf("\n\n");
(std::string&)cScoreIdentity["Name"] = data.Name; (std::string&)cScoreIdentity["Name"] = data.Name;
(int&)cScoreIdentity["ID"] = data.ID; (int&)cScoreIdentity["ID"] = data.ID;
(int&)cScoreIdentity["Ping"] = 1337; (int&)cScoreIdentity["Ping"] = 1337;
m_World->SetName(scoreIdentity.ID, data.Name); std::string IdentityName = "#" + std::to_string(data.ID) + ": " + data.Name;
m_World->SetName(scoreIdentity.ID, IdentityName);
m_World->SetParent(scoreIdentity.ID, entity.ID); m_World->SetParent(scoreIdentity.ID, entity.ID);
} }
} }
@@ -61,37 +82,36 @@ bool ScoreScreenSystem::OnPlayerDeath(const Events::PlayerDeath& e)
bool ScoreScreenSystem::OnPlayerSpawn(const Events::PlayerSpawned& e) bool ScoreScreenSystem::OnPlayerSpawn(const Events::PlayerSpawned& e)
{ {
//When a player spawn, add a new entry to the score screen. //When a player spawn, add data to the list entry with the same ID.
if(!e.Player.Valid()) {
std::unordered_map<int, PlayerData>::iterator got;
got = m_PlayerIdentities.find(e.PlayerID);
if(got == m_PlayerIdentities.end()) {
LOG_ERROR("Player spawned without having an entry on score screen");
return 0; return 0;
} }
EntityWrapper entity = e.Player; auto& data = got->second;
data.Player = e.Player;
data.Team = (int)data.Player["Team"]["Team"];
std::unordered_map<std::string, PlayerData>::const_iterator got;
got = m_PlayerIdentities.find(e.PlayerName);
if (got == m_PlayerIdentities.end()) {
PlayerData data;
data.ID = m_PlayerCounter;
data.Name = e.PlayerName;
data.Player = e.Player;
if(!entity.HasComponent("Team")) {
return 0;
}
data.Team = (int)entity["Team"]["Team"];
std::pair<std::string, PlayerData> list (data.Name, data);
m_PlayerIdentities.insert(list);
m_PlayerCounter++;
}
return 0; return 0;
} }
bool ScoreScreenSystem::OnPlayerConnected(const Events::PlayerConnected& e) bool ScoreScreenSystem::OnPlayerConnected(const Events::PlayerConnected& e)
{ {
//player has connected, add his data to the list of ScoreIdentities
PlayerData data;
data.ID = e.PlayerID;
data.Name = e.PlayerName;
m_PlayerIdentities.insert( {data.ID, data} );
return 0; return 0;
} }
bool ScoreScreenSystem::OnPlayerDisconnected(const Events::PlayerDisconnected& e) bool ScoreScreenSystem::OnPlayerDisconnected(const Events::PlayerDisconnected& e)
{ {
//player has disconnected, remove him from list of ScoreIdentities
m_PlayerIdentities.erase(e.PlayerID);
return 0; return 0;
} }