163 lines
5.4 KiB
C#
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); }
|
|
}
|
|
}
|