using Games.AI_Logic; using Games.Events; using Games.GlobeDefine; using Games.ImpactModle; using Games.Item; using Games.LogicObj; using Games.SkillModle; using GCGame.Table; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; [System.Serializable] public class UseItemInfo { public GameObject _ItemCountBG; public bool isUseItem; public Button m_ItemButton; public Image m_ItemCDImage; public Text m_ItemCountText; public Image m_ItemIcon; //public int m_ItemCDTime { get; set; } //public void CleanUP() //{ // m_ItemButton = null; // m_ItemCDImage = null; // m_ItemCDTime = 0; // //isSetItem = false; // m_ItemCountText.text = ""; // m_ItemIcon.gameObject.SetActive(false); // _ItemCountBG.SetActive(false); //} } public class SkillBarLogic : UIControllerBase { private float itemCdRemainTime; private float itemTotalCdTime; public UseItemInfo m_ItemInfo; //public GameObject _AutoPanel; //public GameObject m_BtnAutoBegin; //public GameObject m_BtnAutoStop; public RectTransform[] skillButtonRoots; public SkillButton[] SkillButtons { get; private set; } public PetSkillButton PetSkillMW; public PetSkillButton PetSkillGY; public void FightPetChange(object obj) { Games.Fellow.Fellow fellow = GameManager.gameManager.PlayerDataPool.FellowContainer.GetRealFightPet(); if (fellow == null) { PetSkillMW.Clear(); PetSkillGY.Clear(); return; } FightPetSkill(); } public void FightPetSkill() { //Games.Fellow.Fellow fellow = GameManager.gameManager.PlayerDataPool.FellowContainer.GetRealFightPet(); //if (fellow.GetSkillData(0) != null && fellow.GetSkillData(0).IsValid()) // PetSkillMW.SetSkillIndex(0); //else if (fellow.GetSkillData(1) != null && fellow.GetSkillData(1).IsValid()) // PetSkillMW.SetSkillIndex(1); PetSkillMW.SetSkillIndex(0); PetSkillGY.SetSkillIndex(1); } // Use this for initialization private void Start() { UserConfigData._CurSkillPage = null; if (GameManager.gameManager != null && GameManager.gameManager.PlayerDataPool != null && GameManager.gameManager.PlayerDataPool.HasInitOwnSkill) RefreshSkillBarInfo(); //UpdateAutoFightBtnState(); SetSimpleAttackIcon(); //设置之前先同步Item的CD状态 ReqMyItemCDInfo(); //同步item的cd时间 if (GlobalData._IsRefreshShortcutItem) { GlobalData._IsRefreshShortcutItem = false; SetUseItem(); } FightPetChange(null); UpdateComboTarget(null); EventDispatcher.Instance.Add(EventId.LockSkillInput, UpdateComboTarget); } public void SetSimpleAttackIcon() { _SimpleAttackIcon.overrideSprite = _SimpleAttackIconLists[GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession]; } public List _SimpleAttackIconLists; public Image _SimpleAttackIcon; private void Awake() { SetInstance(this); SkillButtons = new SkillButton[skillButtonRoots.Length]; // 由Source文件复制技能按钮到各位置 var source = skillButtonRoots[0].parent.Find("Source"); for (var i = 0; i < skillButtonRoots.Length; i++) { var skillButtonTrans = Instantiate(source); skillButtonTrans.SetParent(skillButtonRoots[i], false); SkillButtons[i] = skillButtonTrans.GetComponent(); SkillButtons[i].SkillBarIndex = i; } Destroy(source.gameObject); RefreshShortCutItem(); Games.Events.EventDispatcher.Instance.Add(Games.Events.EventId.UPDATA_PET_CALLFIGHTINFO, FightPetChange); } private void OnDestroy() { Games.Events.EventDispatcher.Instance.Remove(Games.Events.EventId.UPDATA_PET_CALLFIGHTINFO, FightPetChange); EventDispatcher.Instance.Remove(EventId.LockSkillInput, UpdateComboTarget); StopAllCoroutines(); } public void RefreshSkillBarInfo() { var _mainPlayer = Singleton.GetInstance().MainPlayer; if (_mainPlayer == null) return; var skillActives = TableManager.GetSkillActive().Values; var skillCount = 0; foreach (var skill in skillActives) if (skill.Profession == _mainPlayer.Profession) skillCount++; if (skillCount < 0) return; //清理无效技能 var hasSet = false; //UserConfigData.LoadAllSkillPage(_mainPlayer.GUID.ToString()); //if (UserConfigData._CurSkillPage != null) //{ // //_mainPlayer.ClearAutoSelSkillID(); // for (var i = 0; i < SkillButtons.Length; i++) // SkillButtons[i].Clear(); // var _skillBarSetInfo = UserConfigData._CurSkillPage.SkillIdxs; // Debug.LogError("_skillBarSetInfo.Length : " + _skillBarSetInfo.Length); // for (var skillBarIndex = 0; skillBarIndex < _skillBarSetInfo.Length; skillBarIndex++) // { // if (skillBarIndex == 4)// || skillBarIndex == 5 // continue; // var nSkillIndex = _skillBarSetInfo[skillBarIndex]; // if (nSkillIndex >= 0 && nSkillIndex < skillCount - 4) //排除两个绝技 // { // if (_mainPlayer.OwnSkillInfo[nSkillIndex].SkillId != -1) // { // SetSkillBarInfo(skillBarIndex, nSkillIndex); // //Singleton.Instance.MainPlayer.SetAutoSelSkillID(nSkillIndex); // hasSet = true; // } // else // 保存的技能不存在 清掉 // { // _skillBarSetInfo[skillBarIndex] = -1; // // 保存配置 // //UserConfigData.SaveSkillPages(); // } // } // else // { // SetSkillBarInfo(skillBarIndex, -1); // hasSet = true; // } // } //} if (hasSet == false) { for (var i = 0; i < SkillButtons.Length; i++) SkillButtons[i].Clear(); for (var _skillIndex = 0; _skillIndex < skillCount - 4; _skillIndex++) { var ownSkill = _mainPlayer.OwnSkillInfo[_skillIndex]; if (ownSkill.SkillExTable == null) continue; if ((ownSkill.SkillBaseTable.SkillClass & (int)SKILLCLASS.SIMPLEATTACK) != 0) continue; if ((ownSkill.SkillBaseTable.SkillClass & (int)SKILLCLASS.AUTOREPEAT) == 0 && (ownSkill.SkillBaseTable.SkillClass & (int)SKILLCLASS.XP) == 0) for (var _skillBarIndex = 0; _skillBarIndex < SkillButtons.Length; _skillBarIndex++) if (SkillButtons != null && SkillButtons[_skillBarIndex].SkillIndex < 0 && _skillBarIndex != 4 && _skillBarIndex != 5) { SetSkillBarInfo(_skillBarIndex, _skillIndex); break; } } } if (skillCount < 2) return; //潜规则:索引12是90绝技,14是90绝技试用,13是120绝技,15是120绝技试用 if (GameManager.gameManager.PlayerDataPool.OwnSkillInfo[skillCount - 4].SkillId != -1) SetSkillBarInfo(4, skillCount - 4); else if (GameManager.gameManager.PlayerDataPool.OwnSkillInfo[skillCount - 2].SkillId != -1) SetSkillBarInfo(4, skillCount - 2); else SetSkillBarInfo(4, -1); if (GameManager.gameManager.PlayerDataPool.OwnSkillInfo[skillCount - 3].SkillId != -1) SetSkillBarInfo(5, skillCount - 3); else if (GameManager.gameManager.PlayerDataPool.OwnSkillInfo[skillCount - 1].SkillId != -1) SetSkillBarInfo(5, skillCount - 1); else SetSkillBarInfo(5, -1); } public bool IsIndexHasSet(int index) { if (index == -1) return false; for (var i = 0; i < SkillButtons.Length; i++) if (SkillButtons[i].SkillIndex == index) return true; return false; } public void SetSkillBarInfo(int _skillBarIndex, int _skillIndex) { if (IsIndexHasSet(_skillIndex)) return; var _mainPlayer = Singleton.GetInstance().MainPlayer; if (_mainPlayer == null) return; if (_skillBarIndex >= 0 && _skillBarIndex < SkillButtons.Length) { if (_skillIndex >= 0 && _skillIndex < _mainPlayer.OwnSkillInfo.Length) { var _skillBase = _mainPlayer.OwnSkillInfo[_skillIndex].SkillBaseTable; if (_skillBase != null) SkillButtons[_skillBarIndex].SetSkillBarInfo(_skillIndex); } else { SkillButtons[_skillBarIndex].SetSkillBarInfo(-1); } } } public void GetItemCDInfo() { var _mainPlayer = Singleton.GetInstance().MainPlayer; if (_mainPlayer == null) return; var itemId = PlayerPreferenceData.ShortCutItemId; itemCdRemainTime = ItemCDInfoCtr.GetItemCDRemainTime(itemId); var usableItem = TableManager.GetUsableItemByID(itemId, 0); if (usableItem == null) return; var coolDownTime = TableManager.GetCoolDownTimeByID(usableItem.CoolDownId, 0); if (coolDownTime != null) itemTotalCdTime = coolDownTime.CDTime / 1000; } private void UpdateComboTarget(object args) { StopCoroutine(SetSkillComboTarget()); StartCoroutine(SetSkillComboTarget()); } /// /// 指定连击技能对应的按钮 /// /// IEnumerator SetSkillComboTarget() { yield return new WaitForEndOfFrame(); //等待全局数据更新 while (Singleton.GetInstance().MainPlayer == null || !GameManager.gameManager.PlayerDataPool.HasInitOwnSkill) yield return new WaitForEndOfFrame(); if (Singleton.GetInstance().MainPlayer != null) { var skillDatas = new Dictionary(); for (int i = 0; i < SkillButtons.Length; i++) { var skillData = SkillButtons[i].SkillData; skillDatas.Add(i, skillData); } for (int i = 0; i < skillDatas.Count; i++) { if (skillDatas[i] != null) { var comboSkill = skillDatas[i].GetComboSkill(); if (comboSkill != null) { var combo = from data in skillDatas where data.Value != null && data.Value.SkillId == comboSkill.SkillId select data; foreach (var item in combo) { SkillButtons[i].ComboTarget = SkillButtons[item.Key]; SkillButtons[item.Key].gameObject.SetActive(false); } } } } } } // Update is called once per frame private void Update() { if (itemCdRemainTime > 0) { if (!m_ItemInfo.m_ItemCDImage.gameObject.activeInHierarchy) m_ItemInfo.m_ItemCDImage.gameObject.SetActive(true); if (!m_ItemInfo.isUseItem) m_ItemInfo.isUseItem = true; itemCdRemainTime -= Time.deltaTime; m_ItemInfo.m_ItemCDImage.fillAmount = itemCdRemainTime / itemTotalCdTime; } else { if (m_ItemInfo.m_ItemCDImage.gameObject.activeInHierarchy) m_ItemInfo.m_ItemCDImage.gameObject.SetActive(false); if (m_ItemInfo.isUseItem) m_ItemInfo.isUseItem = false; } // if (GameManager.gameManager.RunningScene == (int)GameDefine_Globe.SCENE_DEFINE.SCENE_GUANNING) // { // if (_AutoPanel.activeSelf) // _AutoPanel.SetActive(false); // } // else // { // if (!_AutoPanel.activeSelf) // _AutoPanel.SetActive(true); // } } public void RefreshShortCutItem() { var itemId = PlayerPreferenceData.ShortCutItemId; GameItem item = null; if (itemId >= 0) { var backpack = GameManager.gameManager.PlayerDataPool.BackPack; var itemList = ItemTool.ItemFilter(backpack, 0); item = itemList.Find(a => a.DataID == itemId); } if (item == null) { m_ItemInfo._ItemCountBG.SetActive(false); m_ItemInfo.m_ItemButton.gameObject.SetActive(false); } else { m_ItemInfo._ItemCountBG.gameObject.SetActive(true); m_ItemInfo.m_ItemButton.gameObject.SetActive(true); m_ItemInfo.m_ItemCountText.text = item.StackCount.ToString(); } } public void SetUseItem() { //判断初始化ID var itemId = PlayerPreferenceData.ShortCutItemId; if (itemId == -1) { //点击的时候打开选择药品的界面 //m_ItemInfo.isSetItem = false; m_ItemInfo.m_ItemButton.gameObject.SetActive(false); m_ItemInfo.m_ItemIcon.gameObject.SetActive(false); m_ItemInfo._ItemCountBG.gameObject.SetActive(false); if (m_ItemInfo.m_ItemCDImage.gameObject.activeInHierarchy) m_ItemInfo.m_ItemCDImage.gameObject.SetActive(false); } else { var BackPack = GameManager.gameManager.PlayerDataPool.BackPack; if (BackPack.GetItemCountByDataId(itemId) > 0) { m_ItemInfo._ItemCountBG.gameObject.SetActive(true); m_ItemInfo.m_ItemCountText.text = BackPack.GetItemCountByDataId(itemId).ToString(); var commonItem = TableManager.GetCommonItemByID(itemId, 0); if (commonItem != null) { m_ItemInfo.m_ItemButton.gameObject.SetActive(true); m_ItemInfo.m_ItemIcon.gameObject.SetActive(true); LoadAssetBundle.Instance.SetImageSprite(m_ItemInfo.m_ItemIcon, commonItem.Icon); if (commonItem.QualityEffect > 0) { CommonItemContainerItem.ShowQualityEffect(true, commonItem.QualityEffect, m_ItemInfo.m_ItemIcon.transform); } else { CommonItemContainerItem.ShowQualityEffect(false, commonItem.QualityEffect, m_ItemInfo.m_ItemIcon.transform); } } } else { m_ItemInfo._ItemCountBG.gameObject.SetActive(false); m_ItemInfo.m_ItemButton.gameObject.SetActive(false); //m_ItemInfo.isSetItem = false; PlayerPreferenceData.ShortCutItemId = -1; } } //设置CD正在旋转的item到快捷使用栏的时候要刷新CD状态 ReqMyItemCDInfo(); } public void ReqMyItemCDInfo() { //同步item的cd时间 var askPacket = (CG_REQ_SEND_PACKET)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_SEND_PACKET); askPacket.SetReqType(3); //3.请求物品CD askPacket.SendPacket(); } public void SyncMyItemInfo() { if (ItemCDInfoCtr.GetItemCDRemainTime(PlayerPreferenceData.ShortCutItemId) > 0) m_ItemInfo.isUseItem = true; GetItemCDInfo(); //获取总CD时间 剩余时间 开始计时 } public void UseShortCutItem() { if (m_ItemInfo.isUseItem) { //正在使用物品 物品处于CD状态 GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{30001}")); return; } if (!GlobalData.CanUseMedicItem(PlayerPreferenceData.ShortCutItemId)) return; var m_itemId = PlayerPreferenceData.ShortCutItemId; var BackPack = GameManager.gameManager.PlayerDataPool.BackPack; var itemList = ItemTool.ItemFilter(BackPack, 0); for (var index = 0; index < itemList.Count; index++) if (itemList[index].DataID == m_itemId) if (null != Singleton.Instance.MainPlayer && Singleton.Instance.MainPlayer.CheckUseItem(itemList[index])) { Singleton.Instance.MainPlayer.UseItem(itemList[index]); if (!m_ItemInfo.m_ItemCDImage.gameObject.activeInHierarchy) m_ItemInfo.m_ItemCDImage.gameObject.SetActive(true); ReqMyItemCDInfo(); break; } } public void ShowItemList() { var m_PlayerLevel = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level; var m_ShowList = new List(); var m_AllItemDic = TableManager.GetUseDrugItem(); foreach (var item in m_AllItemDic) { var useDrugItem = TableManager.GetUseDrugItemByID(item.Key, 0); if (useDrugItem != null) if (m_PlayerLevel >= useDrugItem.NeedLevel) m_ShowList.Add(item.Key); } UIManager.ShowUI(UIInfo.PopCanSelectItemPanel, delegate (bool bSucess, object param) { if (bSucess) PopCanSelectItemPanelCtr.Instance.SetMyShowList(m_ShowList, 2); }); } //切换目标 //public void SwitchTarget() //{ // if (null != Singleton.GetInstance().MainPlayer) // { // Singleton.GetInstance().MainPlayer.SwitchTarget(); // } //} #region auto fight // 直接调用自动战斗 public void OnDoAutoFightClick() { //组队跟随,不响应技能 if (GameManager.gameManager.PlayerDataPool.IsFollowTeam) { GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{5128}")); return; } var mainPalyer = Singleton.Instance.MainPlayer; if (null == mainPalyer) return; var sceneInfo = TableManager.GetSceneClassByID(GameManager.gameManager.RunningScene, 0); if (sceneInfo == null) return; if (sceneInfo.IsAutoFight == 0) { if (mainPalyer.isAutoCombat == false) GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{9006}")); return; } //if(mainPalyer.AdcaneMountId>0) //{ // mainPalyer.AskUnMount(); // return; //} mainPalyer.EnterAutoCombat(); } //public void OnDoAutoStopFightClick() //{ // Obj_MainPlayer mainPalyer = Singleton.Instance.MainPlayer; // if (null == mainPalyer) // { // return; // } // // mainPalyer.LeveAutoCombat(); //} //public void UpdateAutoFightBtnState() //{ // Obj_MainPlayer mainPalyer = Singleton.Instance.MainPlayer; // if (null == mainPalyer) // { // return; // } // // m_BtnAutoStop.SetActive(mainPalyer.IsOpenAutoCombat); // m_BtnAutoBegin.SetActive(!mainPalyer.IsOpenAutoCombat); //} #endregion #region skill tooltips public void ShowSkillTooltips(int skillBarIdx) { if (SkillButtons.Length > skillBarIdx) SkillTooltipsLogic.ShowSkillToolTips(SkillButtons[skillBarIdx].SkillIndex, new Vector3(0, 0, 0)); } public void HideSkillTooltips() { UIManager.CloseUI(UIInfo.SkillTooltipsRoot); } #endregion #region 切换怪物相关功能 private readonly List _targetList = new List(); private const float _scanDistance = 8f; private const float _scanResetDistance = 4f; private Vector3? _lastPostion; public void SwitchTarget() { var mainPlayer = ObjManager.Instance.MainPlayer; if (mainPlayer == null) return; var aiPlayerCombat = mainPlayer.GetComponent(); if (aiPlayerCombat == null) return; if (_lastPostion == null || (_lastPostion.Value - mainPlayer.Position).sqrMagnitude > _scanResetDistance.ToSquare()) { _lastPostion = mainPlayer.Position; _targetList.Clear(); } else { // Trim Target List for (var i = _targetList.Count - 1; i >= 0; i--) if (_targetList[i] == null) _targetList.RemoveAt(i); } var currentTarget = mainPlayer.enemyTarget; if (!Reputation.CanAttack(currentTarget)) currentTarget = null; // If there's no preset target, recalculate target selector if (currentTarget == null) _targetList.Clear(); // If the player has manually selected a target else if (_targetList.Count > 0 && _targetList[_targetList.Count - 1] != currentTarget) { _targetList.Clear(); _targetList.Add(currentTarget); } var target = GetMostThreatingTargetInList(mainPlayer, aiPlayerCombat, currentTarget); // Completed one Cycle if (target == null && _targetList.Count > 0) { _targetList.Clear(); target = GetMostThreatingTargetInList(mainPlayer, aiPlayerCombat, currentTarget); } // Current Target will be filtered if (target != null) { _targetList.Add(target); mainPlayer.SetSelectTarget(target); } } private Obj_Character GetMostThreatingTargetInList(Obj_MainPlayer mainPlayer, AI_PlayerCombat aiPlayerCombat, Obj_Character currentTarget) { Obj_Character result = null; var lastPriority = int.MinValue; var targets = ObjManager.Instance.ObjPools.Values; foreach (var obj in targets) { var character = obj as Obj_Character; if (character != null && !character.IsDisableState(DISABLESTATE.Disable_BeSelect) && Reputation.CanAttack(character) && character != currentTarget) { if (character.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_FELLOW) { if (currentTarget != null && currentTarget.ObjType == GameDefine_Globe.OBJ_TYPE.OBJ_OTHER_PLAYER) { var fellow = character as Obj_Fellow; if (fellow != null && fellow.OwnerObjId == currentTarget.ServerID) { result = fellow; break; } } } else { if (!_targetList.Contains(character) && mainPlayer.DistanceToAnotherEdge(character) < _scanDistance) { var priority = aiPlayerCombat.GetAttackPriority(character); if (priority > 0) { var newTarget = false; if (result == null || priority > lastPriority) newTarget = true; else if ((character.Position - mainPlayer.Position).RemoveY().sqrMagnitude < (result.Position - mainPlayer.Position).RemoveY().sqrMagnitude) newTarget = true; if (newTarget) { result = character; lastPriority = priority; } } } } } } return result; } #endregion #region UIShowAnim public Animator _ShowAnimator; public void ShowSkillBar() { _ShowAnimator.Play("Show"); } public void HideSkillBar() { _ShowAnimator.Play("Hide"); } #endregion }