@@ -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}
10501051void 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}
10641065void 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 }
0 commit comments