/******************************************************************************** * 文件名: 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 _memberList; public int AutoTeamTargetDest = -1; public List InvaterList = new List(); 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 RequestList = new List(); 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(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.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.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.GetInstance().MainPlayer.ReqJoinLeaveOldOK, Singleton.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.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.GetInstance().MainPlayer) Singleton.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.GetInstance().MainPlayer) // Singleton.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.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.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.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; }