Files

626 lines
22 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
/********************************************************************************
* Team.cs
* \Script\Player\Team\Team.cs
*
* 2014-01-09
*
*
*
*********************************************************************************/
using System.Collections;
using System.Collections.Generic;
using Games.ChatHistory;
using Games.Events;
using Games.GlobeDefine;
using Games.LogicObj;
using GCGame;
using GCGame.Table;
using UnityEngine;
public class Team
{
// 有效成员列表 - 现在已经不敢动teamMember那个玩意了实际有效成员列表可以从这个拿
private readonly List<TeamMember> _memberList;
public int AutoTeamTargetDest = -1;
public List<TeamInvater> InvaterList = new List<TeamInvater>();
public bool IsAutoTeam = false;
public int LastTeamDest = -1;
public int LastTeamLevelMax = -1;
public int LastTeamLevelMin = -1;
public bool IsCrossServerTeam = false; //是否是跨服队伍
public bool NewRequest = false;
public delegate void OnCreateTeamFinish();
private OnCreateTeamFinish CreateCB;
public List<TeamMember> RequestList = new List<TeamMember>();
public Team()
{
TeamID = GlobeVar.INVALID_ID;
teamMember = new TeamMember[GlobeVar.MAX_TEAM_MEMBER];
for (var i = 0; i < GlobeVar.MAX_TEAM_MEMBER; ++i)
teamMember[i] = new TeamMember();
_memberList = new List<TeamMember>(GlobeVar.MAX_TEAM_MEMBER);
}
public int _LastTeamID;
public int TeamID { get; set; }
public TeamMember[] teamMember { get; set; }
public void CleanUp()
{
TeamID = GlobeVar.INVALID_ID;
for (var i = 0; i < GlobeVar.MAX_TEAM_MEMBER; ++i)
{
//清理一遍名字面板
var objTeam = Singleton<ObjManager>.GetInstance().FindOtherPlayerInScene(teamMember[i].Guid);
if (objTeam != null)
objTeam.UpdateTeamInfo(false);
teamMember[i].CleanUp();
}
}
public void UpdateTeamHeadUI(bool state,int index)
{
if (index < 0 || index >= GlobeVar.MAX_TEAM_MEMBER)
return;
var objTeam = Singleton<ObjManager>.GetInstance().FindOtherPlayerInScene(teamMember[index].Guid);
if (objTeam != null)
objTeam.UpdateTeamInfo(state);
}
public void UpdateAllTeamHeadUI(bool state)
{
for (var i = 0; i < GlobeVar.MAX_TEAM_MEMBER; ++i)
{
UpdateTeamHeadUI(state, i);
}
}
public void CreaetTeam(int destId, int minLevel, int maxLevel, OnCreateTeamFinish createCallBack = null)
{
if (destId > 0)
{
LastTeamDest = destId;
}
else
{
LastTeamDest = -1;
}
if (minLevel > 0)
{
LastTeamLevelMin = Mathf.Min(minLevel, maxLevel);
}
else
{
LastTeamLevelMin = -1;
}
if (maxLevel > 0)
{
LastTeamLevelMax = Mathf.Max(minLevel, maxLevel);
}
else
{
LastTeamLevelMax = -1;
}
if (GameManager.gameManager.PlayerDataPool.IsHaveTeam())
{
MessageBoxLogic.OpenOKCancelBox(StrDictionary.GetClientDictionaryString("#{4605}"), "",
Singleton<ObjManager>.GetInstance().MainPlayer.ReqJoinLeaveOldOK,
Singleton<ObjManager>.GetInstance().MainPlayer.ReqJoinLeaveOldCancel);
return;
}
if (createCallBack != null)
CreateCB = createCallBack;
var packet = (CG_REQ_CREATE_TEAM)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_CREATE_TEAM);
packet.Desid = LastTeamDest;
packet.Minlvl = LastTeamLevelMin;
packet.Maxlvl = LastTeamLevelMax;
packet.SendPacket();
//IsAutoTeam = true;
//if (LastTeamDest > 0)
//{
// SetAutoTeam(true);
//}
}
public void ChangeTeamDest(int destId, int minLevel, int maxLevel)
{
if (destId > 0) LastTeamDest = destId;
if (minLevel > 0) LastTeamLevelMin = Mathf.Min(minLevel, maxLevel);
if (maxLevel > 0) LastTeamLevelMax = Mathf.Max(minLevel, maxLevel);
if (!Singleton<ObjManager>.GetInstance().MainPlayer.IsTeamLeader()) return;
var packet = (CG_REQ_FIX_TEAM_DES)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_FIX_TEAM_DES);
packet.Desid = LastTeamDest;
packet.Minlvl = LastTeamLevelMin;
packet.Maxlvl = LastTeamLevelMax;
packet.SendPacket();
//IsAutoTeam = true;
}
public void SetAutoTeam(bool isAuto)
{
if (isAuto)
{
if (LastTeamDest > 0)
{
var packet = (CG_ASK_AUTOTEAM)PacketDistributed.CreatePacket(MessageID.PACKET_CG_ASK_AUTOTEAM);
packet.Desid = LastTeamDest;
packet.SendPacket();
}
//IsAutoTeam = true;
}
else
{
if (LastTeamDest > 0)
{
var packet = (CG_ASK_UN_AUTOTEAM)PacketDistributed.CreatePacket(MessageID.PACKET_CG_ASK_UN_AUTOTEAM);
packet.None = 0;
packet.SendPacket();
}
//IsAutoTeam = false;
}
MissionDialogAndLeftTabsLogic.Instance().UpdateTeamInfo();
}
//更新全部队伍信息
public void UpdateTeamInfo(GC_TEAM_SYNC_TEAMINFO packet)
{
if (null == packet)
return;
IsCrossServerTeam = packet.IsCross == 1;
var bNeedUpdateNameBoardColor = false; //是否更新名字版颜色,加入队伍的时候调用
//如果收到最新的队伍信息,而玩家之前没有队伍的话,则进行提示“你进入了一个队伍,可获得更多收益”
if (GlobeVar.INVALID_ID == TeamID && GlobeVar.INVALID_ID != packet.TeamID)
{
if (null != Singleton<ObjManager>.GetInstance().MainPlayer)
Singleton<ObjManager>.GetInstance().MainPlayer.SendNoticMsg(false, "#{2229}");
if (MissionDialogAndLeftTabsLogic.Instance() != null)
{
MissionDialogAndLeftTabsLogic.Instance()._TagPanel.ShowPage(1);
MissionDialogAndLeftTabsLogic.Instance().OnTagPage(1);
}
bNeedUpdateNameBoardColor = true;
}
//更新数据
var newTeam = packet.TeamID != TeamID && TeamID == GlobeVar.INVALID_ID;
TeamID = packet.TeamID;
var mainPlayer = ObjManager.Instance.MainPlayer;
UpdateAllTeamHeadUI(false);
//如果队伍ID为-1则说明解散队伍清除信息即可
if (TeamID == GlobeVar.INVALID_ID)
{
//退出组队跟随状态
//if (null != Singleton<ObjManager>.GetInstance().MainPlayer)
// Singleton<ObjManager>.GetInstance().MainPlayer.LeaveTeamFollow();
if(MissionDialogAndLeftTabsLogic.Instance()!=null)
MissionDialogAndLeftTabsLogic.Instance().UpdateTeamInfo();
CleanUp();
}
else
{
var mainPlayerFollow = 0;
if (mainPlayer != null && mainPlayer.GUID != GlobeVar.INVALID_GUID)
{
var member = teamMember.Find(a => a.Guid == mainPlayer.GUID);
if (member != null)
mainPlayerFollow = member.FollowState;
}
_memberList.Clear();
for (var i = 0; i < packet.memberGuidList.Count; i++)
{
var guid = packet.memberGuidList[i];
var member = teamMember.Find(a => a.Guid == guid);
if (member == null)
member = new TeamMember { Guid = guid };
_memberList.Add(member);
if (i < packet.memberNameList.Count)
member.MemberName = packet.memberNameList[i];
if (i < packet.memberLevelList.Count)
member.Level = packet.memberLevelList[i];
if (i < packet.memberProfList.Count)
member.Profession = packet.memberProfList[i];
if (i < packet.memberHPList.Count)
member.HP = packet.memberHPList[i];
if (i < packet.memberMaxHPList.Count)
member.MaxHP = packet.memberMaxHPList[i];
if (i < packet.memberCombatList.Count)
member.CombatNum = packet.memberCombatList[i];
if (i < packet.sceneclassList.Count)
member.SceneClassID = packet.sceneclassList[i];
if (i < packet.sceneinstList.Count)
member.SceneInstID = packet.sceneinstList[i];
if (i < packet.modelvisualidList.Count)
member.ModelVisual = packet.modelvisualidList[i];
if (i < packet.weapondataidList.Count)
member.WeaponData = packet.weapondataidList[i];
if (i < packet.weaponeffectgemList.Count)
member.WeaponGemEffect = packet.weaponeffectgemList[i];
if (i < packet.weaponeffectgem2List.Count)
member.WeaponGemEffect2 = packet.weaponeffectgem2List[i];
if (i < packet.weaponeffectgem3List.Count)
member.WeaponGemEffect3 = packet.weaponeffectgem3List[i];
if (i < packet.AuraEffectList.Count)
{
member.WingAurId = packet.GetAuraEffect(0);
member.EffectAuraId = packet.GetAuraEffect(1);
}
if (i < packet.memberstateCount)
member.IsOnline = packet.memberstateList[i] == 0;
float fEnterPosX = 0;
if (i < packet.posXList.Count)
fEnterPosX = packet.posXList[i] * 0.01f;
float fEnterPosZ = 0;
if (i < packet.posZList.Count)
fEnterPosZ = packet.posZList[i] * 0.01f;
member.ScenePos = new Vector2(fEnterPosX, fEnterPosZ);
if (i < packet.movespeedCount)
member.MoveSpeed = packet.movespeedList[i] * 0.01f;
//更新队长队员,索引为0即队长
member.TeamJob = i == 0 ? 0 : 1;
if (i < packet.followstateCount)
member.FollowState = packet.followstateList[i];
}
// 更新teamMember数组
for (var i = 0; i < teamMember.Length; i++)
if (i < _memberList.Count)
teamMember[i] = _memberList[i];
// 如果不是空记录,则直接抛弃当前记录
else if (teamMember[i].IsValid())
teamMember[i] = new TeamMember();
// 释放外部事件 - 注:外部可能访问正在修改的数据,不应该允许在数据体中执行外部方法
if (bNeedUpdateNameBoardColor)
for (var i = 0; i < teamMember.Length; i++)
{
var member = teamMember[i];
if (member.IsValid())
{
var objTeam = Singleton<ObjManager>.GetInstance().FindOtherPlayerInScene(member.Guid);
if (objTeam != null)
objTeam.SetSpricelName();
}
}
if (mainPlayer != null && TeamID != GlobeVar.INVALID_ID)
{
var mainPlayerMember = teamMember.Find(a => a.Guid == mainPlayer.GUID);
if (mainPlayerMember != null)
{
if (newTeam)
{
if (teamMember[0].IsValid() &&
mainPlayer.GUID != teamMember[0].Guid &&
mainPlayerMember.FollowState == TeamFollowState.notFollow)
{
if (PlayerPreferenceData.SystemAutoTeamFollow)
mainPlayer.EnterTeamFollow();
else
{
var cache = GameManager.gameManager.PlayerDataPool.EnterSceneCache;
var fubenId = cache == null ? mainPlayerMember.SceneClassID : cache.EnterCopySceneID;
var fuben = TableManager.GetFubenByID(fubenId, 0);
// 不处于副本中时
if (fuben == null || fuben.Type < 2)
{
MessageBoxLogic.OpenOKCancelBox(8022, funcOKClicked: () =>
{
var current = ObjManager.Instance.MainPlayer;
if (current != null)
current.EnterTeamFollow();
});
}
}
}
}
else
{
if (mainPlayerMember.FollowState != mainPlayerFollow)
MainPlayerFollowStateUpdate(mainPlayer, mainPlayerMember, mainPlayerFollow);
}
}
}
}
UpdateAllTeamHeadUI(true);
if (CreateCB != null)
{
CreateCB();
CreateCB = null;
}
}
//根据索引更新某一个队员的信息
public void UpdateMember(int nIndex, GC_TEAM_SYNC_MEMBERINFO packet)
{
UpdateTeamHeadUI(false, nIndex);
if (nIndex < 0 || nIndex >= teamMember.Length) return;
if (packet.HasMemberGuid)
teamMember[nIndex].Guid = packet.MemberGuid;
if (packet.HasMemberName)
teamMember[nIndex].MemberName = packet.MemberName;
if (packet.HasMemberLevel)
teamMember[nIndex].Level = packet.MemberLevel;
if (packet.HasMemberProf)
teamMember[nIndex].Profession = packet.MemberProf;
if (packet.HasMemberHP)
teamMember[nIndex].HP = packet.MemberHP;
if (packet.HasMemberMaxHP)
teamMember[nIndex].MaxHP = packet.MemberMaxHP;
if (packet.HasMemberCombat)
teamMember[nIndex].CombatNum = packet.MemberCombat;
if (packet.HasSceneclass)
teamMember[nIndex].SceneClassID = packet.Sceneclass;
if (packet.HasSceneinst)
teamMember[nIndex].SceneInstID = packet.Sceneinst;
if (packet.HasPosX)
{
var posX = packet.PosX * 0.01f;
var posZ = packet.PosZ * 0.01f;
teamMember[nIndex].ScenePos = new Vector2(posX, posZ);
}
if (packet.HasModelvisualid)
teamMember[nIndex].ModelVisual = packet.Modelvisualid;
if (packet.HasWeapondataid)
teamMember[nIndex].WeaponData = packet.Weapondataid;
if (packet.HasWeaponeffectgem)
teamMember[nIndex].WeaponGemEffect = packet.Weaponeffectgem;
if (packet.HasWeaponeffectgem2)
teamMember[nIndex].WeaponGemEffect2 = packet.Weaponeffectgem2;
if (packet.HasWeaponeffectgem3)
teamMember[nIndex].WeaponGemEffect3 = packet.Weaponeffectgem3;
if (packet.HasMemberstate)
teamMember[nIndex].IsOnline = packet.Memberstate == 0;
try
{
teamMember[nIndex].WingAurId = packet.GetAuraEffect(0);
teamMember[nIndex].EffectAuraId = packet.GetAuraEffect(1);
}
catch
{
}
if (packet.HasMovespeed) teamMember[nIndex].MoveSpeed = packet.Movespeed * 0.01f;
var mainPlayer = Singleton<ObjManager>.GetInstance().MainPlayer;
var isMainPlayer = mainPlayer.GUID == teamMember[nIndex].Guid;
if (packet.HasFollowstate)
{
var oldValue = teamMember[nIndex].FollowState;
teamMember[nIndex].FollowState = packet.Followstate;
if (isMainPlayer &&
teamMember[nIndex].FollowState != oldValue)
MainPlayerFollowStateUpdate(mainPlayer, teamMember[nIndex], oldValue);
}
if (isMainPlayer && MissionDialogAndLeftTabsLogic.Instance() != null)
MissionDialogAndLeftTabsLogic.Instance().HandleSyncTeamInfo();
UpdateAllTeamHeadUI(true);
var tab = new Hashtable();
tab["index"] = nIndex;
tab["type"] = Obj_Fellow.FellowDialogType.EnemyInTeam;
EventDispatcher.Instance.SendMessage(Games.Events.EventId.FellowDialogEvent, tab);
}
private void MainPlayerFollowStateUpdate(Obj_MainPlayer mainPlayer, TeamMember mainPlayerMember, int oldState)
{
if (oldState == TeamFollowState.notFollow)
if (MissionDialogAndLeftTabsLogic.Instance() != null)
MissionDialogAndLeftTabsLogic.Instance().UpdateTeamInfo();
if (mainPlayerMember.Guid != teamMember[0].Guid)
{
switch (mainPlayerMember.FollowState)
{
case TeamFollowState.followMove:
{
mainPlayer.StopMove();
mainPlayer.LeveAutoCombat();
//// 如果距离队长太远,就试图进入骑乘状态
//if (mainPlayerMember.SceneClassID == teamMember[0].SceneClassID &&
// mainPlayerMember.SceneInstID == teamMember[0].SceneInstID &&
// (teamMember[0].ScenePos - mainPlayer.Position.RemoveY()).sqrMagnitude >
// _mountDistance.ToSquare())
//{
// mainPlayer.AskRideMount(false);
//}
}
break;
case TeamFollowState.followCombat:
{
if (mainPlayer.sceneAutoType != FubenAutoType.noFollow)
mainPlayer.EnterAutoCombat();
}
break;
}
}
}
public TeamMember GetTeamMemberByguiId(ulong guid)
{
for (var i = 0; i < GlobeVar.MAX_TEAM_MEMBER; i++)
if (guid == teamMember[i].Guid)
return teamMember[i];
return null;
}
//获得某个队员信息
public TeamMember GetTeamMember(int nIndex)
{
if (nIndex < 0 || nIndex >= GlobeVar.MAX_TEAM_MEMBER) return null;
return teamMember[nIndex];
}
//队伍是否已满
public bool IsFull()
{
return teamMember[GlobeVar.MAX_TEAM_MEMBER - 1].IsValid();
}
public bool IsCaptain(ulong guid = GlobeVar.INVALID_GUID)
{
if (guid == GlobeVar.INVALID_GUID)
{
var mainPlayer = ObjManager.Instance.MainPlayer;
return mainPlayer != null && teamMember[0].Guid == mainPlayer.GUID;
}
else
{
return teamMember[0].Guid == guid;
}
}
public int GetTeamMemberCount()
{
var count = 0;
for (var i = 0; i < GlobeVar.MAX_TEAM_MEMBER; i++)
if (teamMember[i].IsValid())
count += 1;
else
break;
return count;
}
public void SendTeamChat(GC_CHAT.CHATTYPE chatType) //聊天频道发布招募信息
{
var destIdx = LastTeamDest;
var targetTab = TableManager.GetTeamTargetByID(destIdx, 0);
if (targetTab != null)
{
switch(chatType)
{
case GC_CHAT.CHATTYPE.CHAT_TYPE_WORLD:
if (targetTab.TalkType == 2) //只能在帮派招募
{
GUIData.AddNotifyData("#{52002}");
return;
}
break;
case GC_CHAT.CHATTYPE.CHAT_TYPE_GUILD:
if (targetTab.TalkType == 1) //只能在世界招募
{
GUIData.AddNotifyData("#{52003}");
return;
}
break;
}
var teamTarget = targetTab.Name;
var teamLevel = LastTeamLevelMin + "-" + LastTeamLevelMax;
if (ChatInputLogic.IsCanChat((int)chatType,true,false))
{
var item = new ChatHistoryItem();
item.CleanUp();
item.EChannel = chatType;
var modifyText = StrDictionary.GetClientDictionaryString("#{5137}", teamTarget, teamLevel,
GameManager.gameManager.PlayerDataPool.TeamInfo.TeamID, Singleton<ObjManager>.GetInstance().MainPlayer.BaseAttr.RoleName);
modifyText = Utils.StrFilter_Chat(modifyText);
item.ChatInfo = modifyText;
Utils.SendCGChatPak(item.ChatInfo, item, chatType == GC_CHAT.CHATTYPE.CHAT_TYPE_GUILD);
}
}
}
public bool IsFollowTeam()
{
return GetFollowState() != TeamFollowState.notFollow;
// if (TeamID == GlobeVar.INVALID_ID)
// return false;
// else
// {
// var mainPlayer = GetMainPlayTeamData();
// return TeamID != GlobeVar.INVALID_ID && mainPlayer != null && mainPlayer.FollowLeader();
// }
}
public int GetFollowState()
{
if (TeamID == GlobeVar.INVALID_ID)
return TeamFollowState.notFollow;
// 额外屏蔽队长的情况,当前队长状态被服务器玩坏了
else
{
var mainPlayer = ObjManager.Instance.MainPlayer;
if (mainPlayer == null)
return TeamFollowState.notFollow;
else if (teamMember[0].Guid == mainPlayer.GUID)
return TeamFollowState.notFollow;
else
{
var member = GetTeamMemberByguiId(mainPlayer.GUID);
return member == null ? TeamFollowState.notFollow : member.FollowState;
}
}
}
public TeamMember GetMainPlayTeamData()
{
ulong? guid = null;
if (GameManager.gameManager.PlayerDataPool != null &&
GameManager.gameManager.PlayerDataPool.EnterSceneCache != null)
guid = GameManager.gameManager.PlayerDataPool.EnterSceneCache.Guid;
else if (ObjManager.Instance.MainPlayer != null)
guid = ObjManager.Instance.MainPlayer.GUID;
return guid == null ? null : GetTeamMemberByguiId(guid.Value);
}
}
public class TeamInvater
{
public ulong InvaterGuid;
public string InvaterName;
public int TeamID;
public string TeamLeaderName;
}