using UnityEngine; using System.Collections; using GCGame.Table; using System.Collections.Generic; using UnityEngine.UI; using Games.Item; using Module.Log; public class StroyCopySceneRootCtrl : MonoBehaviour { private static StroyCopySceneRootCtrl Instance; public static StroyCopySceneRootCtrl GteInstance() { return Instance; } private void Awake() { Instance = this; } IEnumerator RefreshBossInfoItemState() { yield return new WaitForEndOfFrame(); for (int index = 0; index < _ItemPrefabList.Count; index++) { _ItemPrefabList[index].GetComponent().SetItemState(); yield return null; } ReqRemainTimes(); yield break; } private void OnDestroy() { Instance = null; } public enum CopySceneType { INVALID = -1, NORMAL = 0, //普通模式 HERO = 1, //英雄模式 } //全部的剧情副本 public Dictionary> m_AllStoryCopy = new Dictionary>(); //选择的副本类型 public CopySceneType m_SelectedCopySceneType = CopySceneType.HERO; //人物最高可以参加的副本等级 public int m_CanJoinLevel; //记录父类位置 public Transform m_Parent; public Transform m_ReawrdItemParent; //副本Item预设体 public GameObject m_BossInfoItem; //副本剩余次数 public Text m_CopySceneReaminText; //奖励物品 public GameObject m_RewardItem; public List m_RewardList; //副本限制信息 //public Text m_LimitInfoText; //帮助信息 public Text m_HelpText; //等级预设 public GameObject levelItemPrefab; public Text selectButtonDesc; //当前等级描述 private bool IsShowLevelItemPanel = false; public Transform levelItemParent; public GameObject selectButtonMarkBGoBJ; //public Button joinButton; //public Text _perfectCombatValue; public DiffcultySelect _Select; public GameObject _SingleBtn; public GameObject _TeamBtn; //设置副本剩余次数 服务器同步 private int remainChallengeTimes = 0; public void SetMyCopySceneRemainCount(int count) { remainChallengeTimes = count; m_CopySceneReaminText.text = count.ToString(); for (int index = 0; index < _ItemPrefabList.Count; index++) { _ItemPrefabList[index].GetComponent().SetRemainChallengeTimes(count); if (_ItemPrefabList[index].GetComponent()._CopySceneId == m_SelectedCopySceneId) { _ItemPrefabList[index].GetComponent().OnItemClick(); } } } private int lastIndex = 1; public void SetSelectedType(int m_Index) { if (lastIndex == m_Index) { return; } lastIndex = m_Index; switch (m_Index) { case (int)CopySceneType.NORMAL: m_SelectedCopySceneType = CopySceneType.NORMAL; break; case (int)CopySceneType.HERO: m_SelectedCopySceneType = CopySceneType.HERO; break; default: m_SelectedCopySceneType = CopySceneType.INVALID; break; } RefreshBossItemInfo(m_SelectedCopySceneType); SwitchDropDesc(); } private void RefreshChallengeBtnState() { Tab_StroyCopy stroyCopy = TableManager.GetStroyCopyByID(m_SelectedCopySceneId, 0); if (stroyCopy == null) { return; } var mainPlayerLevel = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level;//人物等级 var _IsLock = true; if (mainPlayerLevel >= stroyCopy.Level && GameManager.gameManager.MissionManager.IsMissionHaveDone(stroyCopy.LimitMissionId)) { _IsLock = false; } if (_IsLock) { _TeamBtn.SetActive(false); _SingleBtn.SetActive(false); GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{42504}")); //m_LimitInfoText.text = string.Format("{0}", StrDictionary.GetClientDictionaryString("#{42504}")); //joinButton.interactable = false; } //else //{ // m_LimitInfoText.text = string.Format("{0}", StrDictionary.GetClientDictionaryString("#{42503}")); // joinButton.interactable = true; //} } private int m_SelectedCopySceneId = -1; private CopySceneType lastHardType = CopySceneType.INVALID; public void InitMyBossInfo(int m_Id, bool _IsLock) { StartCoroutine(CreateRew(m_Id)); } IEnumerator CreateRew(int m_Id) { yield return null; if (m_SelectedCopySceneId == m_Id) { yield break; } m_SelectedCopySceneId = m_Id; lastHardType = m_SelectedCopySceneType; Tab_StroyCopy stroyCopy = TableManager.GetStroyCopyByID(m_Id, 0); string[] m_itemId = null; if (stroyCopy == null) { yield break; } _SingleBtn.SetActive(stroyCopy.CanSingle == 1); _TeamBtn.SetActive(stroyCopy.CanTeam == 1); m_itemId = stroyCopy.GetHeroDropbyIndex(GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession).Split('|'); //_perfectCombatValue.text = stroyCopy.HeroPower.ToString(); var needCreateCount = m_itemId.Length - m_RewardList.Count; if (needCreateCount >= 0) { for (int index = 0; index < needCreateCount; index++) { GameObject m_ItemPrefab = GameObject.Instantiate(m_RewardItem); m_ItemPrefab.transform.SetParent(m_ReawrdItemParent); m_ItemPrefab.transform.localScale = Vector3.one; m_ItemPrefab.transform.localRotation = Quaternion.Euler(Vector3.zero); m_ItemPrefab.transform.localPosition = Vector3.zero; m_RewardList.Add(m_ItemPrefab); } //活动奖励 for (int index = 0; index < m_itemId.Length; index++) { m_RewardList[index].SetActive(true); m_RewardList[index].GetComponent().InitItem(int.Parse(m_itemId[index]), -1); } } else { for (int index = m_RewardList.Count - Mathf.Abs(needCreateCount); index < m_RewardList.Count; index++) { m_RewardList[index].SetActive(false); } //活动奖励 for (int index = 0; index < m_itemId.Length; index++) { m_RewardList[index].GetComponent().InitItem(int.Parse(m_itemId[index]), -1); } } //活动奖励 for (int index = 0; index < m_itemId.Length; index++) { m_RewardList[index].GetComponent().InitItem(int.Parse(m_itemId[index]), -1); } //这边重新加一次判断 RefreshChallengeBtnState(); SetItemMarkIcon(m_Id); yield break; } public void MyHelpButtonClick() { MessageHelpLogic.ShowHelpMessage(16); } public bool JudgeMyTeamInfo(int minCount) { if (GameManager.gameManager.PlayerDataPool.IsHaveTeam() && GameManager.gameManager.PlayerDataPool.TeamInfo.GetTeamMemberCount() >= minCount) { if (!GameManager.gameManager.PlayerDataPool.TeamInfo.IsCaptain()) { GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{9004}")); return false; } else { return true; } } else { if(GameManager.gameManager.PlayerDataPool.IsHaveTeam()) { if (!GameManager.gameManager.PlayerDataPool.TeamInfo.IsCaptain()) { GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{9004}")); return false; }else { MessageBoxLogic.OpenOKCancelBox(StrDictionary.GetClientDictionaryString("#{65200}"), null, delegate () { UIManager.ShowUI(UIInfo.TeamInfoRoot); UIManager.CloseUI(UIInfo.MessageBox); }, delegate () { UIManager.CloseUI(UIInfo.MessageBox); }); return false; } }else { if (minCount == 1) return true; MessageBoxLogic.OpenOKCancelBox(StrDictionary.GetClientDictionaryString("#{65200}"), null, delegate () { UIManager.ShowUI(UIInfo.TeamCreateRoot, delegate (bool bSucess, object param) { if (bSucess) { var hash = new Hashtable(); var copyTab = TableManager.GetStroyCopyByID(m_SelectedCopySceneId, 0); if (copyTab == null) { return; } hash["index"] = copyTab.HeroTeamTargetId; Games.Events.EventDispatcher.Instance.SendMessage(Games.Events.EventId.SELECTTEAMCREATEWNDITEM, hash); } }); UIManager.CloseUI(UIInfo.MessageBox); }, delegate () { UIManager.CloseUI(UIInfo.MessageBox); }); } return false; } } public void MyJoinButtonClick() { Tab_StroyCopy stroyCopy = TableManager.GetStroyCopyByID(m_SelectedCopySceneId, 0); if (stroyCopy == null) { return; } int copySceneId = -1; var fuben = TableManager.GetFubenByID(stroyCopy.HeroFubenId, 0); if(fuben == null) { return; } if (JudgeMyTeamInfo(fuben.PlayerDemandMin)) //符合客户端的参加条件 { copySceneId = stroyCopy.HeroFubenId; } else { copySceneId = -1; } if (copySceneId != -1) { MessageBoxLogic.ShowEnterCopySceneEnsureMessageBox(copySceneId, 1, (int)m_SelectedCopySceneType); } } public void OnSingleBtn() { var stroyCopy = TableManager.GetStroyCopyByID(m_SelectedCopySceneId, 0); if (stroyCopy == null) return; var copySceneId = stroyCopy.HeroFubenId; MessageBoxLogic.ShowEnterCopySceneEnsureMessageBox(copySceneId, 1, (int)m_SelectedCopySceneType, false); } public void OnTeamBtn() { var stroyCopy = TableManager.GetStroyCopyByID(m_SelectedCopySceneId, 0); if (stroyCopy == null) return; var copySceneId = stroyCopy.HeroFubenId; var fuben = TableManager.GetFubenByID(stroyCopy.HeroFubenId, 0); if (fuben == null) { return; } if (!JudgeMyTeamInfo(fuben.PlayerDemandMin)) return; MessageBoxLogic.ShowEnterCopySceneEnsureMessageBox(copySceneId, 1, (int)m_SelectedCopySceneType, true); } private void OnEnable() { SortLevelList(); HideLevelPanel(); StartCoroutine(CreateItemPrefab()); InitAddTimeItem(); RefreshItemCount(); RefreshChallengeBtnState(); } void HideLevelPanel() { selectButtonMarkBGoBJ.gameObject.SetActive(IsShowLevelItemPanel); } public enum LevelType { Invalid = -1, level0, level1, level2, level3, level4, level5, level6, } LevelType canJoinType = LevelType.Invalid; IEnumerator InitSelectButtonDesc() { yield return new WaitForEndOfFrame(); int mainPlayerLevel = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level; bool hasUnLockType = false; int maxLevel = -1; foreach (var info in TableManager.GetStroyCopy().Values) { if (info.Level <= mainPlayerLevel && GameManager.gameManager.MissionManager.IsMissionHaveDone(info.LimitMissionId)) { hasUnLockType = true; maxLevel = info.Level; } } if (!hasUnLockType) { canJoinType = LevelType.level0; selectButtonDesc.text = StrDictionary.GetClientDictionaryString("#{42616}"); } else { foreach(var tab in TableManager.GetStroyCopy().Values) { if(GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level >= tab.MinLevel && GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level <= tab.MaxLevel) { canJoinType = (LevelType)tab.EnumType; } } } yield return StartCoroutine(SetSelectedType(canJoinType)); yield break; } private List _ItemPrefabList = new List(); //全部预设 private Dictionary _EveryTypeFirstItemDic = new Dictionary(); IEnumerator CreateItemPrefab() { yield return new WaitForEndOfFrame(); if (_ItemPrefabList.Count <= 0) { foreach (var info in TableManager.GetStroyCopy()) { var infoItemPrefab = Instantiate(m_BossInfoItem); infoItemPrefab.transform.SetParent(m_Parent); infoItemPrefab.transform.localPosition = Vector3.zero; infoItemPrefab.transform.localRotation = Quaternion.Euler(Vector3.zero); infoItemPrefab.transform.localScale = Vector3.one; infoItemPrefab.GetComponent().InitMyItem(info.Key, m_SelectedCopySceneType); _ItemPrefabList.Add(infoItemPrefab); if (!_EveryTypeFirstItemDic.ContainsKey(info.Value.EnumType)) { _EveryTypeFirstItemDic.Add(info.Value.EnumType, infoItemPrefab.GetComponent()); } } } //if (m_SelectedCopySceneType == CopySceneType.INVALID) // SetSelectedType(0); //else // SetSelectedType((int)m_SelectedCopySceneType); SetSelectedType(1); //初始化当前可以进行的分段描述 yield return StartCoroutine(InitSelectButtonDesc()); yield return StartCoroutine(RefreshBossInfoItemState()); //获取每个等级分段对应的区域 GetAnchoredPosAreaDis(); ShowLeftOrRightIcon(); yield break; } private bool _sorted; List typeList = new List(); private List levelItemPrefabList = new List(); public void SortLevelList() { if (_sorted) return; _sorted = true; var copySceneDic = TableManager.GetStroyCopy().Values; foreach (var tab in copySceneDic) { if (!typeList.Contains(tab.EnumType)) { typeList.Add(tab.EnumType); } } } public void OnSelectButtonClick() { selectButtonMarkBGoBJ.gameObject.SetActive(!IsShowLevelItemPanel); IsShowLevelItemPanel = !IsShowLevelItemPanel; if (!IsShowLevelItemPanel) { return; } if (levelItemPrefabList.Count == 0) { for (int index = 0; index < typeList.Count; index++) { GameObject levelItem = GameObject.Instantiate(levelItemPrefab); levelItem.transform.SetParent(levelItemParent); levelItem.transform.localPosition = Vector3.zero; levelItem.transform.localRotation = Quaternion.Euler(Vector3.zero); levelItem.transform.localScale = Vector3.one; levelItem.GetComponent().InitItem((LevelType)typeList[index]); levelItemPrefabList.Add(levelItem); } } if (_CurType != LevelType.Invalid) { for (int index = 0; index < levelItemPrefabList.Count; index++) { levelItemPrefabList[index].GetComponent().markIcon.gameObject.SetActive( _CurType == levelItemPrefabList[index].GetComponent().type ? true : false); } } else { for (int index = 0; index < levelItemPrefabList.Count; index++) { levelItemPrefabList[index].GetComponent().markIcon.gameObject.SetActive( canJoinType == levelItemPrefabList[index].GetComponent().type ? true : false); } } } private LevelType _CurShowType = LevelType.Invalid; private void SetSelectButtonDesc(LevelType type) { //if(_CurShowType == type) //{ // return; //} _CurShowType = type; if (_CurShowType == LevelType.level0) { selectButtonDesc.text = StrDictionary.GetClientDictionaryString("#{42616}");// "等级:30-49"; } else if (_CurShowType == LevelType.level1) { selectButtonDesc.text = StrDictionary.GetClientDictionaryString("#{42617}");// "等级:50-69"; } else if (_CurShowType == LevelType.level2) { selectButtonDesc.text = StrDictionary.GetClientDictionaryString("#{42618}");// "等级:70-89"; } else if (_CurShowType == LevelType.level3) { selectButtonDesc.text = StrDictionary.GetClientDictionaryString("#{42619}");// "等级:90-109"; } else if (_CurShowType == LevelType.level4) { selectButtonDesc.text = StrDictionary.GetClientDictionaryString("#{42620}");// "等级:110-129"; } else if (_CurShowType == LevelType.level5) { selectButtonDesc.text = StrDictionary.GetClientDictionaryString("#{42621}");// "等级:130-150"; } } public void OnLevelItemClick(LevelType type) { StartCoroutine(SetSelectedType(type)); } private LevelType _CurType = LevelType.Invalid; IEnumerator SetSelectedType(LevelType type) { yield return new WaitForEndOfFrame(); _CurType = type; IsShowLevelItemPanel = false; HideLevelPanel(); yield return StartCoroutine(ShowCurTypeFirstBossInfo()); SetLevelItemMarkIcon(); SetSelectButtonDesc(_CurType); ReqRemainTimes(); yield break; } private void ReqRemainTimes() { //向服务器请求剧情副本的次数 CG_REQ_SEND_PACKET Packet = (CG_REQ_SEND_PACKET)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_SEND_PACKET); Packet.SetReqType((int)CG_REQ_SEND_PACKET.REQ_TYPE.REQ_TYPE_STORY_FB_INFO); Packet.SendPacket(); } private GameObject _CurNeedShowItemObj = null; IEnumerator ShowCurTypeFirstBossInfo() { yield return new WaitForEndOfFrame(); if (_outSetFubenId != -1) { for (int index = 0; index < _ItemPrefabList.Count; index++) { var bossInfoItem = _ItemPrefabList[index].GetComponent(); var stroyTab = TableManager.GetStroyCopyByID(bossInfoItem._CopySceneId, 0); if (stroyTab != null) { if (_outSetFubenId == (_type == 0 ? stroyTab.EasyFubenId : stroyTab.HeroFubenId)) { bossInfoItem.OnItemClick(); _CurNeedShowItemObj = bossInfoItem.gameObject; _outSetFubenId = -1; _type = -1; } } } } else if (_EveryTypeFirstItemDic.ContainsKey((int)_CurType)) { _EveryTypeFirstItemDic[(int)_CurType].gameObject.GetComponent().OnItemClick(); _CurNeedShowItemObj = _EveryTypeFirstItemDic[(int)_CurType].gameObject; } if(_CurNeedShowItemObj == null) { _EveryTypeFirstItemDic[(int)LevelType.level0].gameObject.GetComponent().OnItemClick(); _CurNeedShowItemObj = _EveryTypeFirstItemDic[(int)LevelType.level0].gameObject; } if (_CurNeedShowItemObj == null) { LogModule.ErrorLog("副本不足!副本不足!副本不足!让你们加几次了!"); } yield return StartCoroutine(PositionItem()); yield break; } public RectTransform _ScorllRectTransform; public RectTransform _ContainerObjTransform; IEnumerator PositionItem() { yield return new WaitForEndOfFrame(); { float _ContainerMinX = -_ContainerObjTransform.sizeDelta.x; float _ContainerFixX = -_CurNeedShowItemObj.GetComponent().anchoredPosition.x + _ContainerObjTransform.GetComponent().padding.left; float _ContanierPosX = Mathf.Clamp(_ContainerFixX, _ContainerMinX, 0); _ContainerObjTransform.anchoredPosition = new Vector2(_ContanierPosX, 0); } yield break; } private int _outSetFubenId = -1; private int _type = -1; public void SetOutSetFubenId(int _fubenId, int type) { _outSetFubenId = _fubenId; _type = type; } public void RefreshBossItemInfo(CopySceneType type) { for (int index = 0; index < _ItemPrefabList.Count; index++) { var bossInfoItem = _ItemPrefabList[index].GetComponent(); bossInfoItem.RefreshBossItemInfo(type); if (bossInfoItem._CopySceneId == m_SelectedCopySceneId) { bossInfoItem.OnItemClick(); //刷新奖励 } } } public void SetItemMarkIcon(int _CopyId) { for (int index = 0; index < _ItemPrefabList.Count; index++) { _ItemPrefabList[index].gameObject.GetComponent().markIcon.gameObject.SetActive( _ItemPrefabList[index].gameObject.GetComponent()._CopySceneId == _CopyId ? true : false); } } public void SetLevelItemMarkIcon() { for (int index = 0; index < levelItemPrefabList.Count; index++) { levelItemPrefabList[index].GetComponent().markIcon.gameObject.SetActive( levelItemPrefabList[index].GetComponent().type == _CurType ? true : false); } } private void OnDisable() { IsShowLevelItemPanel = false; lastIndex = -1; } private LevelType _CurDragLevelType = LevelType.level0; // 极值 类型 private Dictionary _DisToLevelTypeDic = new Dictionary(); public void GetAnchoredPosAreaDis() { //获取最大类型枚举值 int _MaxLevel = 0; foreach (var info in _EveryTypeFirstItemDic) { if (info.Key > _MaxLevel) { _MaxLevel = info.Key; } } foreach (var item in _EveryTypeFirstItemDic) { if (item.Key < _MaxLevel) { if (!_DisToLevelTypeDic.ContainsKey(item.Key)) { float _maxDis = _EveryTypeFirstItemDic[item.Key + 1].anchoredPosition.x - _ScorllRectTransform.rect.width / 2; _DisToLevelTypeDic.Add(item.Key, _maxDis); } } else { float _maxDis = _ContainerObjTransform.rect.width; if (!_DisToLevelTypeDic.ContainsKey(_MaxLevel)) _DisToLevelTypeDic.Add(_MaxLevel, _maxDis); } } } public void SetNeedShowLevelDesc() { float _CurDis = Mathf.Abs(_ContainerObjTransform.localPosition.x); foreach (var info in _DisToLevelTypeDic) { if (_CurDis < info.Value) { _CurType = (LevelType)info.Key; break; } } SetSelectButtonDesc(_CurType); } public void OnScrollDrag() { SetNeedShowLevelDesc(); ShowLeftOrRightIcon(); } private float? _ItemPrefabWidth = null; private float? _ItemPaddingWidth = null; private float? _MarkIconHideOrShowDis = null; private float? _ContainerWidth = null; public void GetItemWodthAndPaddingWidth() { _ItemPrefabWidth = _ContainerObjTransform.gameObject.GetComponent().cellSize.x; _ItemPaddingWidth = _ContainerObjTransform.gameObject.GetComponent().spacing.x; _MarkIconHideOrShowDis = _ItemPrefabWidth +_ItemPaddingWidth; _ContainerWidth = _ContainerObjTransform.rect.width; } public GameObject _LeftIcon; public GameObject _RightIcon; private void ShowLeftOrRightIcon() { if (_MarkIconHideOrShowDis == null || _ContainerWidth == null || _MarkIconHideOrShowDis == 0 || _ContainerWidth == 0) { GetItemWodthAndPaddingWidth(); } //left if (Mathf.Abs(_ContainerObjTransform.localPosition.x) > _MarkIconHideOrShowDis) { if (!_LeftIcon.activeInHierarchy) _LeftIcon.SetActive(true); } else { if (_LeftIcon.activeInHierarchy) _LeftIcon.SetActive(false); } //right if (_ContainerWidth - Mathf.Abs(_ContainerObjTransform.localPosition.x) - _ScorllRectTransform.rect.width > _MarkIconHideOrShowDis) { if (!_RightIcon.activeInHierarchy) _RightIcon.SetActive(true); } else { if (_RightIcon.activeInHierarchy) _RightIcon.SetActive(false); } } public Image _ItemIcon; public Image _ItemQuality; public Text _ItemCount; public GameObject _ItemGetBtn; private const int _ItemId = 860; //固定 public void InitAddTimeItem() { var commonItem = TableManager.GetCommonItemByID(_ItemId, 0); if (commonItem == null) { LogModule.ErrorLog("commonitem 860 is null"); return; } LoadAssetBundle.Instance.SetImageSprite(_ItemIcon, commonItem.Icon); LoadAssetBundle.Instance.SetImageSprite(_ItemQuality, GCGame.Utils.GetItemQualityFrame(commonItem.Quality)); if (commonItem.QualityEffect > 0) { CommonItemContainerItem.ShowQualityEffect(true, commonItem.QualityEffect, _ItemIcon.transform); } else { CommonItemContainerItem.ShowQualityEffect(false, commonItem.QualityEffect, _ItemIcon.transform); } RefreshItemCount(); } public void OnItemGetBtn() { ItemTooltipsLogic.ShowItemTooltip(_ItemId, ItemTooltipsLogic.ShowType.GetPath, _ItemIcon.gameObject.transform.position); } public void RefreshItemCount() { var _BackPack = GameManager.gameManager.PlayerDataPool.BackPack; if(_BackPack != null) { var count = _BackPack.GetItemCountByDataId(_ItemId); _ItemGetBtn.SetActive(count <= 0); if (count > 0) _ItemCount.text = "" + count.ToString() + ""; else _ItemCount.text = "" + count.ToString() + ""; } } public GameObject _NormalDesc; public GameObject _HeroDesc; public void SwitchDropDesc() { _NormalDesc.SetActive(lastIndex == (int)CopySceneType.NORMAL); _HeroDesc.SetActive(lastIndex == (int)CopySceneType.HERO); } public void OnItemIconClick() { var _BackPack = GameManager.gameManager.PlayerDataPool.BackPack; if (_BackPack.GetItemCountByDataId(_ItemId) > 0) ItemTooltipsLogic.ShowItemTooltip(_ItemId, ItemTooltipsLogic.ShowType.Info, _ItemIcon.transform.position); else ItemTooltipsLogic.ShowItemTooltip(_ItemId, ItemTooltipsLogic.ShowType.GetPath, transform.position); } }