Port logic of based team data, logic
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1f6daaf5c160f5141b886c794bf757ae
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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); }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cce4f351bbbf2794ebb234bafd24949c
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d41d002e4393d4a42b3731c60309fb5c
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user