Skip to content

Commit de8a6dd

Browse files
committed
insert_or_assign instead of [] because nanoseconds matter.
1 parent 152ecdb commit de8a6dd

2 files changed

Lines changed: 40 additions & 41 deletions

File tree

src/SquadMgr/SquadMgr.cpp

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,6 +1003,7 @@ void CSquadMgr::OnGroupMemberUpdate(RTAPI::GroupMember* aGroupMember)
10031003
const std::lock_guard<std::mutex> lock(this->Mutex);
10041004

10051005
auto& player = this->Players[aGroupMember->AccountName];
1006+
10061007
player.Member = *aGroupMember;
10071008
player.HasLeft = 0; /* Reset in case the player rejoined without removal. */
10081009

@@ -1015,36 +1016,36 @@ void CSquadMgr::OnAgentJoin(AgentUpdate* aAgentUpdate)
10151016

10161017
const std::lock_guard<std::mutex> lock(this->CacheMutex);
10171018

1018-
this->CachedAgentsArc[&aAgentUpdate->AccountName[1]] = *aAgentUpdate;
1019+
auto [agIt, inserted] = this->CachedAgents.insert_or_assign(&aAgentUpdate->AccountName[1], *aAgentUpdate);
10191020

10201021
/* Is in party according to arc, else it'd give the display sub. */
10211022
if (aAgentUpdate->Subgroup == 0)
10221023
{
1023-
this->CachedAgentsArc[&aAgentUpdate->AccountName[1]].Subgroup++;
1024+
agIt->second.Subgroup++;
10241025
}
10251026

10261027
RTAPI::GroupMember member{};
1027-
strcpy_s(&member.AccountName[0], sizeof(member.AccountName), &aAgentUpdate->AccountName[1]);
1028-
strcpy_s(&member.CharacterName[0], sizeof(member.CharacterName), &aAgentUpdate->CharacterName[0]);
1029-
member.Profession = aAgentUpdate->Prof;
1028+
strcpy_s(&member.AccountName[0], sizeof(aAgentUpdate->AccountName) - 1, &aAgentUpdate->AccountName[1]);
1029+
strcpy_s(&member.CharacterName[0], sizeof(aAgentUpdate->CharacterName) - 1, &aAgentUpdate->CharacterName[0]);
1030+
member.Profession = aAgentUpdate->Prof;
10301031
member.EliteSpecialization = aAgentUpdate->Elite;
1031-
member.IsSelf = aAgentUpdate->Self;
1032-
member.IsInInstance = true; // arc only reports in instance players
1032+
member.IsSelf = aAgentUpdate->Self;
1033+
member.IsInInstance = true; // arc only reports in instance players
10331034

1034-
auto ue = this->CachedAgentsUE.find(member.AccountName);
1035+
auto ue = this->CachedUsers.find(member.AccountName);
10351036

1036-
if (ue != this->CachedAgentsUE.end())
1037+
if (ue != this->CachedUsers.end())
10371038
{
1038-
member.Subgroup = ue->second.Subgroup;
1039-
member.IsCommander = ue->second.Role == UserRole::SquadLeader;
1039+
member.Subgroup = ue->second.Subgroup;
1040+
member.IsCommander = ue->second.Role == UserRole::SquadLeader;
10401041
member.IsLieutenant = ue->second.Role == UserRole::Lieutenant;
10411042
}
10421043
else
10431044
{
10441045
member.Subgroup = aAgentUpdate->Subgroup;
10451046
}
10461047

1047-
if (G::RTAPI) { return; }
1048+
if (G::RTAPI) { return; } /* Do not process. */
10481049
this->OnGroupMemberUpdate(&member);
10491050
}
10501051
void CSquadMgr::OnAgentLeave(AgentUpdate* aAgentUpdate)
@@ -1055,58 +1056,56 @@ void CSquadMgr::OnAgentLeave(AgentUpdate* aAgentUpdate)
10551056
RTAPI::GroupMember member{};
10561057

10571058
/* Minimal data needed here. */
1058-
strcpy_s(&member.AccountName[0], sizeof(member.AccountName), &aAgentUpdate->AccountName[1]);
1059+
strcpy_s(&member.AccountName[0], sizeof(aAgentUpdate->AccountName) - 1, &aAgentUpdate->AccountName[1]);
10591060
member.IsSelf = aAgentUpdate->Self;
10601061

1061-
if (G::RTAPI) { return; }
1062+
if (G::RTAPI) { return; } /* Do not process. */
10621063
this->OnGroupMemberLeave(&member);
10631064
}
10641065
void CSquadMgr::OnSquadUpdate(SquadUpdate* aSquadUpdate)
10651066
{
10661067
G::IsUEEnabled = true;
10671068

1068-
if (G::RTAPI) { return; } /* Prefer RTAPI updates over UE. */
1069-
10701069
for (size_t i = 0; i < aSquadUpdate->UsersCount; i++)
10711070
{
10721071
const std::lock_guard<std::mutex> lock(this->CacheMutex);
10731072

1074-
UserInfo& user = aSquadUpdate->UserInfo[i];
10751073
RTAPI::GroupMember member{};
1076-
AgentUpdate& agent = this->CachedAgentsArc[&user.AccountName[1]];
10771074

1078-
this->CachedAgentsUE[&user.AccountName[1]] = user;
1079-
this->CachedAgentsUE[&user.AccountName[1]].Subgroup++;
1075+
auto [usrIt, inserted] = this->CachedUsers.insert_or_assign(&aSquadUpdate->UserInfo[i].AccountName[1], aSquadUpdate->UserInfo[i]);
10801076

1081-
strcpy_s(&member.AccountName[0], sizeof(member.AccountName), &user.AccountName[1]);
1082-
strcpy_s(&member.CharacterName[0], sizeof(member.CharacterName), &agent.CharacterName[0]);
1083-
member.Subgroup = user.Subgroup;
1084-
/* UE reports 0 based subgroup instead of display value. */
1085-
if (user.Role != UserRole::Invited && user.Role != UserRole::Applied)
1077+
strcpy_s(&member.AccountName[0], sizeof(member.AccountName) - 1, usrIt->first.c_str());
1078+
member.Subgroup = usrIt->second.Subgroup;
1079+
/* UE reports 0 based subgroup instead of display value. So we increment it manually. */
1080+
member.Subgroup += (usrIt->second.Role != UserRole::Invited && usrIt->second.Role != UserRole::Applied) ? 1 : 0;
1081+
member.IsCommander = usrIt->second.Role == UserRole::SquadLeader;
1082+
member.IsLieutenant = usrIt->second.Role == UserRole::Lieutenant;
1083+
1084+
auto agIt = this->CachedAgents.find(usrIt->first);
1085+
1086+
if (agIt != this->CachedAgents.end())
10861087
{
1087-
member.Subgroup++;
1088+
strcpy_s(&member.CharacterName[0], sizeof(member.CharacterName) - 1, agIt->first.c_str());
1089+
member.Profession = agIt->second.Prof;
1090+
member.EliteSpecialization = agIt->second.Elite;
1091+
member.IsInInstance = agIt->second.ID > 0;
1092+
member.IsSelf = agIt->second.Self;
10881093
}
1089-
member.Profession = agent.Prof;
1090-
member.EliteSpecialization = agent.Elite;
1091-
member.IsInInstance = agent.ID > 0;
1092-
member.IsSelf = agent.Self;
1093-
member.IsCommander = user.Role == UserRole::SquadLeader;
1094-
member.IsLieutenant = user.Role == UserRole::Lieutenant;
1095-
1096-
if (user.Role == UserRole::None)
1094+
1095+
if (usrIt->second.Role == UserRole::None)
10971096
{
1098-
this->CachedAgentsUE.erase(&user.AccountName[1]);
1099-
if (!this->CachedAgentsArc[&user.AccountName[1]].Self)
1097+
this->CachedUsers.erase(usrIt);
1098+
if (agIt != this->CachedAgents.end() && !agIt->second.Self)
11001099
{
1101-
this->CachedAgentsArc.erase(&user.AccountName[1]);
1100+
this->CachedAgents.erase(agIt);
11021101
}
11031102

1104-
if (G::RTAPI) { return; }
1103+
if (G::RTAPI) { continue; } /* Do not process. */
11051104
this->OnGroupMemberLeave(&member);
11061105
}
11071106
else
11081107
{
1109-
if (G::RTAPI) { return; }
1108+
if (G::RTAPI) { continue; } /* Do not process. */
11101109
this->OnGroupMemberUpdate(&member);
11111110
}
11121111
}

src/SquadMgr/SquadMgr.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ class CSquadMgr
6060
std::unordered_map<std::string, PlayerInfo_t> Players;
6161

6262
std::mutex CacheMutex;
63-
std::unordered_map<std::string, AgentUpdate> CachedAgentsArc;
64-
std::unordered_map<std::string, UserInfo> CachedAgentsUE;
63+
std::unordered_map<std::string, AgentUpdate> CachedAgents; /* From Arc */
64+
std::unordered_map<std::string, UserInfo> CachedUsers; /* From UE */
6565

6666
std::mutex KPMutex;
6767
std::unordered_map<std::string, KPMEInfo_t*> KPData;

0 commit comments

Comments
 (0)