// Port of C++ EC_Team.h/cpp CECTeam - one party/team. using System.Collections.Generic; using BrewMonster; using CSNetwork.GPDataType; using UnityEngine; namespace BrewMonster { public class CECTeam { protected int m_idLeader; protected ushort m_wPickFlag; protected List m_aMembers = new List(); protected List m_aUnknownIDs = new List(); public CECTeam(int idLeader) { m_idLeader = idLeader; m_wPickFlag = 0; } public void AddMember(int idMember) { if (GetMemberByID(idMember) != null) return; var pMember = new CECTeamMember(this, idMember); m_aMembers.Add(pMember); } public void RemoveMember(int idMember) { int idx = -1; var p = GetMemberByID(idMember, ref idx); if (p != null && idx >= 0) { m_aMembers.RemoveAt(idx); } } public int GetMemberNum() { return m_aMembers.Count; } public CECTeamMember GetMemberByID(int id, ref int piIndex) { piIndex = -1; for (int i = 0; i < m_aMembers.Count; i++) { if (m_aMembers[i].GetCharacterID() == id) { piIndex = i; return m_aMembers[i]; } } return null; } public CECTeamMember GetMemberByID(int id) { int dummy = -1; return GetMemberByID(id, ref dummy); } public CECTeamMember GetMemberByIndex(int n) { if (n >= 0 && n < m_aMembers.Count) return m_aMembers[n]; return null; } /// Update team from S2C cmd_team_member_data (parsed as header + data array). public void UpdateTeamData(cmd_team_member_data_header header, cmd_team_member_data_MEMBER[] data) { int idHost = CECGameRun.Instance?.GetHostPlayer()?.GetCharacterID() ?? 0; if (header.member_count == header.data_count) { // Full sync: rebuild member list var aNewMembers = new List(header.data_count); for (int i = 0; i < header.data_count; i++) { var Member = data[i]; int iIndex = -1; var pMember = GetMemberByID(Member.idMember, ref iIndex); if (pMember == null) { pMember = new CECTeamMember(this, Member.idMember); } ApplyMemberData(pMember, Member); aNewMembers.Add(pMember); } // Remove members not in new list for (int i = m_aMembers.Count - 1; i >= 0; i--) { if (!aNewMembers.Contains(m_aMembers[i])) m_aMembers.RemoveAt(i); } m_aMembers.Clear(); m_aMembers.AddRange(aNewMembers); } else { // Incremental update for (int i = 0; i < header.data_count; i++) { var Member = data[i]; int iIndex = -1; var pMember = GetMemberByID(Member.idMember, ref iIndex); if (pMember == null) { pMember = new CECTeamMember(this, Member.idMember); m_aMembers.Add(pMember); } ApplyMemberData(pMember, Member); } } } static void ApplyMemberData(CECTeamMember pMember, cmd_team_member_data_MEMBER m) { pMember.SetCurHP(m.hp); pMember.SetCurMP(m.mp); pMember.SetLevel(m.level); pMember.SetLevel2(m.level2); pMember.SetWallowLevel(m.wallow_level); pMember.SetMaxHP(m.max_hp); pMember.SetMaxMP(m.max_mp); pMember.SetFightFlag(m.state != 0); pMember.SetForce(m.force_id); pMember.SetProfitLevel(m.profit_level); pMember.SetReincarnationCount(m.reincarnation_times); } public int GetLeaderID() { return m_idLeader; } public void ChangeTeamLeader(int idLeader) { m_idLeader = idLeader; var pLeader = GetMemberByID(idLeader); if (pLeader != null) { var newOrder = new List { pLeader }; foreach (var m in m_aMembers) { if (m.GetCharacterID() != idLeader) newOrder.Add(m); } m_aMembers.Clear(); m_aMembers.AddRange(newOrder); } } public CECTeamMember GetLeader() { if (m_aMembers.Count == 0) return null; var p = m_aMembers[0]; if (p != null && m_idLeader == p.GetCharacterID()) return p; return null; } public void SetPickupFlag(ushort wFlag) { m_wPickFlag = wFlag; } public ushort GetPickupFlag() { return m_wPickFlag; } public void AddUnknownID(int id) { if (!m_aUnknownIDs.Contains(id)) m_aUnknownIDs.Add(id); } } }