Files
2026-02-02 09:14:41 +07:00

163 lines
5.4 KiB
C#

// 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); }
}
}