Files
2024-08-23 15:49:34 +08:00

626 lines
22 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************************
* 文件名: 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;
}