Port logic of based team data, logic

This commit is contained in:
HungDK
2026-02-02 09:14:41 +07:00
parent ecc3a888ca
commit 0aa4d00c2a
7 changed files with 330 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1f6daaf5c160f5141b886c794bf757ae
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+162
View File
@@ -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<CECTeamMember> m_aMembers = new List<CECTeamMember>();
protected List<int> m_aUnknownIDs = new List<int>();
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;
}
/// <summary>Update team from S2C cmd_team_member_data (parsed as header + data array).</summary>
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<CECTeamMember>(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<CECTeamMember> { 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); }
}
}
+2
View File
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: cce4f351bbbf2794ebb234bafd24949c
+47
View File
@@ -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<int, CECTeam> m_TeamTab = new Dictionary<int, CECTeam>();
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;
}
}
}
}
+2
View File
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: d41d002e4393d4a42b3731c60309fb5c
+107
View File
@@ -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;
}
/// <summary>Resolve display name from EC_ManPlayer (else player name set when PLAYER_BASE_INFO received).</summary>
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; }
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 83654bda305aadd41afcc626c74b12d4