//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Saturday, January 20, 2018 //-------------------------------------------------------- using UnityEngine; using System.Collections; using System.Collections.Generic; using System; namespace vnxbqy.UI { public class BetterEquipGetModel : Model, IBeforePlayerDataInitialize, ISwitchAccount { PackModel playerPack { get { return ModelCenter.Instance.GetModel(); } } DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } public string currentEquipGuid { get; private set; } Dictionary betterEquipModels = new Dictionary(); public event Action showEquipRefreshEvent; public override void Init() { ItemLogicUtility.Instance.GetBetterEquipEvent += OnGetBetterEquip; playerPack.refrechPackEvent += OnPackageRefresh; playerPack.refreshItemCountEvent += OnPackageItemRefresh; KnapsackTimeCDMgr.Instance.RefresCoolTimeAct += UpdateCoolTime; ParseConfig(); } public override void UnInit() { ItemLogicUtility.Instance.GetBetterEquipEvent -= OnGetBetterEquip; playerPack.refrechPackEvent -= OnPackageRefresh; playerPack.refreshItemCountEvent -= OnPackageItemRefresh; KnapsackTimeCDMgr.Instance.RefresCoolTimeAct -= UpdateCoolTime; } public void OnBeforePlayerDataInitialize() { } public void OnSwitchAccount() { currentEquipGuid = string.Empty; } #region 解析本地表 public int autoEquipLvLimit { get; private set; } public int autoEquipCoolTime { get; private set; } public void ParseConfig() { FuncConfigConfig equipAutoEquip = FuncConfigConfig.Get("EquipAutoEquip"); autoEquipLvLimit = int.Parse(equipAutoEquip.Numerical1); autoEquipCoolTime = int.Parse(equipAutoEquip.Numerical2); } #endregion private void UpdateCoolTime(string guid) { ItemModel _equip = null; if (TryGetBetterEquip(guid, out _equip)) { var coolData = KnapsackTimeCDMgr.Instance.GetItemCoolById(guid); bool isCoolEnd = coolData == null || coolData.GetRemainTime() <= 0 ? true : false; if (isCoolEnd) { DebugEx.Log("UpdateCoolTime:" + _equip.itemId); ItemOperateUtility.Instance.PutOnItem(guid); ReportConfirmBetterEquip(guid); } } } public bool TryGetBetterEquip(string _guid, out ItemModel _equip) { return betterEquipModels.TryGetValue(_guid, out _equip); } public void ReportConfirmBetterEquip(string _guid) { betterEquipModels.Remove(_guid); var tempGuid = GetOneEquip(); if (tempGuid != currentEquipGuid) { currentEquipGuid = tempGuid; if (showEquipRefreshEvent != null) { showEquipRefreshEvent(); } } } public int GetShowItemQuality() { if (string.IsNullOrEmpty(currentEquipGuid)) { return 0; } else { ItemModel item; if (TryGetBetterEquip(currentEquipGuid, out item)) { return item.config.ItemColor; } else { return 0; } } } public int GetShowEquipPlace() { if (string.IsNullOrEmpty(currentEquipGuid)) { return 0; } else { ItemModel item; if (TryGetBetterEquip(currentEquipGuid, out item)) { return item.config.EquipPlace; } else { return 0; } } } private void OnGetBetterEquip(string guid) { var betterModel = playerPack.GetItemByGuid(guid); ItemModel oldBetterEquip = null; if (TryGetEquipByPlace(betterModel.config.EquipPlace, out oldBetterEquip)) { var oldGrade = oldBetterEquip != null ? oldBetterEquip.score : 0; if (betterModel.score >= oldGrade) { RemoveItemByEquipPlace(betterModel.config.EquipPlace); } } betterEquipModels[guid] = betterModel; if (guid != currentEquipGuid) { if (!string.IsNullOrEmpty(guid)) { var sourcelist = betterModel.GetUseData((int)ItemUseDataKey.source); if (sourcelist != null && sourcelist[0] == 4) { SnxxzGame.Instance.StartCoroutine(Co_DelayRefreshBetterEquip(guid)); } else { currentEquipGuid = guid; if (showEquipRefreshEvent != null) { showEquipRefreshEvent(); } } } else { currentEquipGuid = guid; if (showEquipRefreshEvent != null) { showEquipRefreshEvent(); } } } } public bool CheckIsAutoEquip(ItemModel itemModel) { if (itemModel == null || itemModel.config.EquipPlace > 12 || itemModel.config.EquipPlace == (int)RoleEquipType.Wing || itemModel.config.EquipPlace == (int)RoleEquipType.Guard) return false; int playerLv = PlayerDatas.Instance.baseData.LV; if (playerLv > autoEquipLvLimit) return false; if (itemModel.config.ItemColor < 3) { return true; } return false; } IEnumerator Co_DelayRefreshBetterEquip(string _guid) { yield return WaitingForSecondConst.WaitMS2000; currentEquipGuid = _guid; if (showEquipRefreshEvent != null) { showEquipRefreshEvent(); } var betterModel = playerPack.GetItemByGuid(_guid); } private void OnPackageRefresh(PackType _packType) { var keys = new List(betterEquipModels.Keys); for (int i = keys.Count - 1; i >= 0; i--) { var guid = keys[i]; var itemModel = playerPack.GetItemByGuid(guid); if (itemModel == null || (itemModel.packType != PackType.Item)) { betterEquipModels.Remove(guid); } } var tempGuid = GetOneEquip(); if (tempGuid != currentEquipGuid) { if (!string.IsNullOrEmpty(tempGuid)) { var itemModel = playerPack.GetItemByGuid(tempGuid); var sourcelist = itemModel.GetUseData((int)ItemUseDataKey.source); if (sourcelist != null && sourcelist[0] == 4) { SnxxzGame.Instance.StartCoroutine(Co_DelayRefreshBetterEquip(tempGuid)); } else { currentEquipGuid = tempGuid; if (showEquipRefreshEvent != null) { showEquipRefreshEvent(); } } } else { currentEquipGuid = tempGuid; if (showEquipRefreshEvent != null) { showEquipRefreshEvent(); } } } } private void OnPackageItemRefresh(PackType _packType, int _index, int _itemId) { switch (_packType) { case PackType.Equip: var item = playerPack.GetItemByIndex(_packType, _index); if (item != null) { RemoveLowGradeItemByEquipPlace(item.config.EquipPlace, item.score); } break; default: var itemConfig = ItemConfig.Get(_itemId); var packType = GeneralDefine.GetPackTypeByItemType(itemConfig.Type); var itemModel = playerPack.GetItemByIndex(packType, _index); if (itemModel == null) { OnPackageRefresh(_packType); } break; } } private string GetOneEquip() { var guid = string.Empty; foreach (var key in betterEquipModels.Keys) { guid = key; break; } return guid; } private void RemoveItemByEquipPlace(int place) { var keys = new List(betterEquipModels.Keys); for (int i = keys.Count - 1; i >= 0; i--) { var item = betterEquipModels[keys[i]]; if (item != null && item.config.EquipPlace == place) { betterEquipModels.Remove(keys[i]); } } } private void RemoveLowGradeItemByEquipPlace(int _place, int _score) { var keys = new List(betterEquipModels.Keys); for (int i = keys.Count - 1; i >= 0; i--) { var item = betterEquipModels[keys[i]]; if (item != null && item.config.EquipPlace == _place && item.score <= _score) { betterEquipModels.Remove(keys[i]); } } } private bool TryGetEquipByPlace(int place, out ItemModel _itemModel) { var keys = new List(betterEquipModels.Keys); for (int i = keys.Count - 1; i >= 0; i--) { var item = betterEquipModels[keys[i]]; if (item != null && item.config.EquipPlace == place) { _itemModel = item; return true; } } _itemModel = null; return false; } public bool ShowBetterEquipAble() { var mapId = PlayerDatas.Instance.baseData.MapID; var lineId = PlayerDatas.Instance.baseData.dungeonLineId; var dungeonId = dungeonModel.GetDungeonId(dungeonModel.GetDataMapIdByMapId(mapId), lineId); if (dungeonId == 0) { return true; } else { var config = DungeonConfig.Get(dungeonId); return config.ShowNewItemTip == 1; } } } }