From 0aa4d00c2abdce6e48bfde891f768597c0738e3c Mon Sep 17 00:00:00 2001 From: HungDK <> Date: Mon, 2 Feb 2026 09:14:41 +0700 Subject: [PATCH] Port logic of based team data, logic --- Assets/Scripts/Team.meta | 8 ++ Assets/Scripts/Team/CECTeam.cs | 162 ++++++++++++++++++++++ Assets/Scripts/Team/CECTeam.cs.meta | 2 + Assets/Scripts/Team/CECTeamMan.cs | 47 +++++++ Assets/Scripts/Team/CECTeamMan.cs.meta | 2 + Assets/Scripts/Team/CECTeamMember.cs | 107 ++++++++++++++ Assets/Scripts/Team/CECTeamMember.cs.meta | 2 + 7 files changed, 330 insertions(+) create mode 100644 Assets/Scripts/Team.meta create mode 100644 Assets/Scripts/Team/CECTeam.cs create mode 100644 Assets/Scripts/Team/CECTeam.cs.meta create mode 100644 Assets/Scripts/Team/CECTeamMan.cs create mode 100644 Assets/Scripts/Team/CECTeamMan.cs.meta create mode 100644 Assets/Scripts/Team/CECTeamMember.cs create mode 100644 Assets/Scripts/Team/CECTeamMember.cs.meta diff --git a/Assets/Scripts/Team.meta b/Assets/Scripts/Team.meta new file mode 100644 index 0000000000..dd892eaf7d --- /dev/null +++ b/Assets/Scripts/Team.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f6daaf5c160f5141b886c794bf757ae +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Team/CECTeam.cs b/Assets/Scripts/Team/CECTeam.cs new file mode 100644 index 0000000000..c66d1977e7 --- /dev/null +++ b/Assets/Scripts/Team/CECTeam.cs @@ -0,0 +1,162 @@ +// 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); } + } +} diff --git a/Assets/Scripts/Team/CECTeam.cs.meta b/Assets/Scripts/Team/CECTeam.cs.meta new file mode 100644 index 0000000000..8d4aa54356 --- /dev/null +++ b/Assets/Scripts/Team/CECTeam.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cce4f351bbbf2794ebb234bafd24949c \ No newline at end of file diff --git a/Assets/Scripts/Team/CECTeamMan.cs b/Assets/Scripts/Team/CECTeamMan.cs new file mode 100644 index 0000000000..17907b2330 --- /dev/null +++ b/Assets/Scripts/Team/CECTeamMan.cs @@ -0,0 +1,47 @@ +// Port of C++ EC_TeamMan.h/cpp - team manager (one team per leader). + +using System.Collections.Generic; +using BrewMonster; +using UnityEngine; + +namespace BrewMonster +{ + public class CECTeamMan + { + private Dictionary m_TeamTab = new Dictionary(); + + public void Release() + { + m_TeamTab.Clear(); + } + + public CECTeam CreateTeam(int idLeader) + { + var pTeam = new CECTeam(idLeader); + m_TeamTab[idLeader] = pTeam; + return pTeam; + } + + public void ReleaseTeam(int idLeader) + { + if (m_TeamTab.Remove(idLeader)) + { } + } + + public CECTeam GetTeam(int idLeader) + { + return m_TeamTab.TryGetValue(idLeader, out var t) ? t : null; + } + + public void ChangeTeamLeader(int idOldLeader, int idNewLeader) + { + var pTeam = GetTeam(idOldLeader); + if (pTeam != null) + { + pTeam.ChangeTeamLeader(idNewLeader); + m_TeamTab.Remove(idOldLeader); + m_TeamTab[idNewLeader] = pTeam; + } + } + } +} diff --git a/Assets/Scripts/Team/CECTeamMan.cs.meta b/Assets/Scripts/Team/CECTeamMan.cs.meta new file mode 100644 index 0000000000..a4c24ea021 --- /dev/null +++ b/Assets/Scripts/Team/CECTeamMan.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d41d002e4393d4a42b3731c60309fb5c \ No newline at end of file diff --git a/Assets/Scripts/Team/CECTeamMember.cs b/Assets/Scripts/Team/CECTeamMember.cs new file mode 100644 index 0000000000..3a55442a94 --- /dev/null +++ b/Assets/Scripts/Team/CECTeamMember.cs @@ -0,0 +1,107 @@ +// Port of C++ EC_Team.h/cpp CECTeamMember - one teammate in a party. + +using BrewMonster; +using BrewMonster.Managers; +using CSNetwork.GPDataType; +using UnityEngine; + +namespace BrewMonster +{ + public class CECTeamMember + { + protected bool m_bInfoReady; + protected CECTeam m_pTeam; + protected int m_cid; + protected int m_iLevel; + protected int m_iLevel2; + protected int m_iWallowLevel; + protected int m_iCurHP; + protected int m_iCurMP; + protected int m_iMaxHP; + protected int m_iMaxMP; + protected bool m_bFight; + protected int m_idInst; + protected A3DVECTOR3 m_vPos; + protected bool m_bSameInstance; + protected int m_iProfession; + protected int m_iGender; + protected int m_iForce; + protected int m_iProfitLevel; + protected int m_iReincarnationCount; + + public CECTeamMember(CECTeam pTeam, int cid) + { + m_bInfoReady = false; + m_pTeam = pTeam; + m_cid = cid; + m_iLevel = 0; + m_iLevel2 = 0; + m_iWallowLevel = 0; + m_iCurHP = 0; + m_iCurMP = 0; + m_iMaxHP = 0; + m_iMaxMP = 0; + m_bFight = false; + m_idInst = 0; + m_vPos = new A3DVECTOR3(0, 0, 0); + m_bSameInstance = false; + m_iProfession = 0; // PROF_WARRIOR + m_iGender = 0; // GENDER_MALE + m_iForce = 0; + m_iProfitLevel = -1; + m_iReincarnationCount = 0; + } + + /// Resolve display name from EC_ManPlayer (else player name set when PLAYER_BASE_INFO received). + public string GetName() + { + var pm = EC_ManMessageMono.Instance?.GetECManPlayer; + if (pm != null) + { + var p = pm.GetPlayer(m_cid, 0); + if (p != null) + { + string name = p.GetName(); + if (!string.IsNullOrEmpty(name)) return name; + if (p.gameObject != null && !string.IsNullOrEmpty(p.gameObject.name)) + return p.gameObject.name; + } + } + return "Player_" + m_cid; + } + + public bool IsInfoReady() { return m_bInfoReady; } + public void SetInfoReadyFlag(bool b) { m_bInfoReady = b; } + public int GetCharacterID() { return m_cid; } + public void SetLevel(int i) { m_iLevel = i; } + public int GetLevel() { return m_iLevel; } + public void SetLevel2(int i) { m_iLevel2 = i; } + public int GetLevel2() { return m_iLevel2; } + public void SetWallowLevel(int i) { m_iWallowLevel = i; } + public int GetWallowLevel() { return m_iWallowLevel; } + public void SetCurHP(int i) { m_iCurHP = i; } + public int GetCurHP() { return m_iCurHP; } + public void SetCurMP(int i) { m_iCurMP = i; } + public int GetCurMP() { return m_iCurMP; } + public void SetMaxHP(int i) { m_iMaxHP = i; } + public int GetMaxHP() { return m_iMaxHP; } + public void SetMaxMP(int i) { m_iMaxMP = i; } + public int GetMaxMP() { return m_iMaxMP; } + public void SetPos(int idInst, A3DVECTOR3 vPos, bool bSameInstance) { m_idInst = idInst; m_vPos = vPos; m_bSameInstance = bSameInstance; } + public A3DVECTOR3 GetPos() { return m_vPos; } + public int GetInstanceID() { return m_idInst; } + public bool GetSameInstance() { return m_bSameInstance; } + public void SetProfession(int i) { m_iProfession = i; } + public int GetProfession() { return m_iProfession; } + public bool IsFighting() { return m_bFight; } + public void SetFightFlag(bool b) { m_bFight = b; } + public void SetGender(int i) { m_iGender = i; } + public int GetGender() { return m_iGender; } + public void SetForce(int i) { m_iForce = i; } + public int GetForce() { return m_iForce; } + public void SetProfitLevel(int i) { m_iProfitLevel = i; } + public int GetProfitLevel() { return m_iProfitLevel; } + public void SetReincarnationCount(int count) { m_iReincarnationCount = count; } + public int GetReincarnationCount() { return m_iReincarnationCount; } + } +} diff --git a/Assets/Scripts/Team/CECTeamMember.cs.meta b/Assets/Scripts/Team/CECTeamMember.cs.meta new file mode 100644 index 0000000000..cace46a9c3 --- /dev/null +++ b/Assets/Scripts/Team/CECTeamMember.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 83654bda305aadd41afcc626c74b12d4 \ No newline at end of file