using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TableConfig; using System.Linq; using UnityEngine.EventSystems; using Snxxz.UI; using System.Text; using System; public class InlaidPanel : MonoBehaviour { [SerializeField] ScrollRect btnScrollRect; [SerializeField] ItemCell presentItemCell; [SerializeField] GameObject sltGemTip; [SerializeField] ScrollerController m_Scroller; [SerializeField] Button _sltGemCloseBtn; [SerializeField] Button _strikeBtn; [SerializeField] List m_GemEquipPlates; [SerializeField] List m_GemHoles; [SerializeField] RectTransform m_ContainerNoEquip; [SerializeField, Header("选中偏移")] float m_SelectOffset = 50.0f; private List m_EquipSortList = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; private List m_GemItems = new List(); private bool m_Inlaying; private int m_PresentInlayHole = 0; private int m_CacheGotoShopId = 0; private static StringBuilder _textBuilder = new StringBuilder(); GemModel m_Model; GemModel model { get { return m_Model ?? (m_Model = ModelCenter.Instance.GetModel()); } } ItemTipsModel _itemTipsModel; ItemTipsModel itemTipsModel { get { return _itemTipsModel ?? (_itemTipsModel = ModelCenter.Instance.GetModel()); } } PlayerPackModel _playerPack; PlayerPackModel playerPack { get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel()); } } private void OnEnable() { PlayerStoneData.OnRefreshStoneData += OnUpdateGemEquip; PlayerDatas.Instance.PlayerDataRefreshInfoEvent += RefreshPlayerInfoEvent; model.updateEquipPlateEvent += OnSltBtnClick; sltGemTip.gameObject.SetActive(false); btnScrollRect.verticalNormalizedPosition = 1; OnEnter(); HandleAchievement(); } private void Awake() { for (int i = 0; i < m_GemHoles.Count; i++) { int _hole = i; m_GemHoles[i].m_GemBtn.onClick.AddListener(() => { OnHoleClick(_hole); }); } presentItemCell.cellBtn.onClick.AddListener(OnEquipClick); m_Scroller.OnRefreshCell += OnRefreshItem; _sltGemCloseBtn.onClick.AddListener(OnSltGemClose); _strikeBtn.onClick.AddListener(OnStrikeBtn); } void OnEnter() { m_EquipSortList.Sort(Compare); for (int i = 0; i < m_EquipSortList.Count; i++) { if (i < m_GemEquipPlates.Count) { m_GemEquipPlates[i].Refresh(m_EquipSortList[i]); } } if (m_CacheGotoShopId != 0) { model.presentGemEquip = m_CacheGotoShopId; m_CacheGotoShopId = 0; } else { model.presentGemEquip = CheckOpenSelect(); } var _index = m_EquipSortList.FindIndex((x) => { return x == model.presentGemEquip; }); if (_index != -1) { var _position = (10 - _index) * 104 + (10 - _index - 1) * 4; _position -= 444; btnScrollRect.verticalNormalizedPosition = Mathf.Clamp01(_position / (1076.0f - 444)); btnScrollRect.verticalNormalizedPosition = Mathf.Clamp01(btnScrollRect.verticalNormalizedPosition + (m_SelectOffset / (1076.0f - 444)));//偏移 } OnSltBtnClick(model.presentGemEquip); } int CheckOpenSelect() { for (int i = 0; i < m_EquipSortList.Count; i++) { if (model.GetRedpointState(m_EquipSortList[i]) == RedPointState.Simple) { return m_EquipSortList[i]; } } return m_EquipSortList[0]; } void HandleAchievement() { if (AchievementGoto.achievementType != AchievementGoto.LifeGemLevel && AchievementGoto.achievementType != AchievementGoto.AtkGemLevel) { return; } int _type = AchievementGoto.achievementType == AchievementGoto.LifeGemLevel ? 1 : 2; AchievementGoto.achievementType = 0; var _cfg = Config.Instance.Get(AchievementGoto.guideAchievementId); int _level = 1; _level = _cfg != null ? _cfg.Condition[0] : _level; int _place, _hole = 0; if (model.SatisfyCondition(_type, _level, out _place, out _hole)) { OnSltBtnClick(_place); if (_level != 1) { var _effect = AchievementGuideEffectPool.Require(2); _effect.transform.SetParentEx(m_GemHoles[_hole].m_GemIcon.transform, Vector3.zero, Vector3.zero, Vector3.one); } } else { SysNotifyMgr.Instance.ShowTip("Achievement_60"); } } private void RefreshPlayerInfoEvent(PlayerDataRefresh _refreshType) { if (_refreshType == PlayerDataRefresh.VIPLv) { for (int i = 0; i < m_GemEquipPlates.Count; i++) { m_GemEquipPlates[i].RefreshGem(); } } } void RefreshEquipGem(int _equipPos) { model.UpdateHoleRedpoint(_equipPos); ItemModel _itemModel = playerPack.GetItemModelByIndex(PackType.rptEquip, _equipPos); if (_itemModel != null) { presentItemCell.gameObject.SetActive(true); m_ContainerNoEquip.gameObject.SetActive(false); ItemConfig _itemCfg = Config.Instance.Get(_itemModel.itemInfo.ItemID); presentItemCell.Init(_itemModel); for (int i = 1; i < 5; i++) { UpdateHole(_itemModel, i); } } else { presentItemCell.gameObject.SetActive(false); m_ContainerNoEquip.gameObject.SetActive(true); for (int i = 1; i < 5; i++) { RefreshEquipHole(false, i, null); } } } void UpdateHole(ItemModel _itemModel, int _index) { ItemConfig _itemCfg = Config.Instance.Get(_itemModel.itemInfo.ItemID); bool openHole = false; if (_index < 4) { if (_itemCfg.LV >= model.gemOpenArray[_index - 1]) { openHole = true; } } else { if (PlayerDatas.Instance.baseData.VIPLv >= model.gemVipHoleLv && _itemCfg.LV >= model.gemOpenArray[0]) { openHole = true; } } RefreshEquipHole(openHole, _index, _itemModel); } void RefreshEquipHole(bool open, int _index, ItemModel _itemModel) { m_GemHoles[_index - 1].m_GemBtn.interactable = open; m_GemHoles[_index - 1].m_LockImg.gameObject.SetActive(!open); m_GemHoles[_index - 1].m_ContainerInlaied.gameObject.SetActive(false); m_GemHoles[_index - 1].m_ContainerInlay.gameObject.SetActive(false); m_GemHoles[_index - 1].m_ConditionTxt.gameObject.SetActive(!open); if (!open) { m_GemHoles[_index - 1].m_GemEffect.Stop(); if (_index < 4) { m_GemHoles[_index - 1].m_ConditionTxt.text = Language.Get("L1075", model.gemOpenArray[_index - 1]); } else if (_index == 4) { m_GemHoles[_index - 1].m_ConditionTxt.text = Language.Get("GemHole04Unlock", model.gemVipHoleLv); } } else { m_GemHoles[_index - 1].m_ContainerInlay.gameObject.SetActive(true); FuncConfigConfig _funcCfg = null; int _type = FuncConfigConfig.GetGemTypeByEquipPos(_itemModel.itemInfo.ItemPlace, out _funcCfg); if (_type != -1) { m_GemHoles[_index - 1].m_GemTypeTxt.text = _funcCfg.Numerical2; } uint[] stones = PlayerStoneData.Instance.GetStoneInfo(model.presentGemEquip); byte[] stonesBind= PlayerStoneData.Instance.GetStoneBindInfo(model.presentGemEquip); if (stones != null && stones.Length > 0) { if (_index > stones.Length) { return; } uint _gemId = stones[_index - 1]; if (_gemId != 0) { var _isBind = 0; if (stonesBind != null) { _isBind = (_index - 1) < stonesBind.Length ? stonesBind[_index - 1] : 0; } m_GemHoles[_index - 1].m_GemEffect.Stop(); if (m_Inlaying && m_PresentInlayHole == _index) { PlayUIEffect(_index, true); } var _itemCfg = Config.Instance.Get((int)_gemId); m_GemHoles[_index - 1].m_GemIcon.SetSprite(_itemCfg.IconKey); m_GemHoles[_index - 1].DisplayGemProperty(_itemCfg.ID, _isBind); m_GemHoles[_index - 1].m_ContainerInlaied.gameObject.SetActive(true); m_GemHoles[_index - 1].m_ContainerInlay.gameObject.SetActive(false); } else { PlayUIEffect(_index, false); } } else { PlayUIEffect(_index, false); } } } public static void ShowGemInfo(Text text, int id, bool _showItemName = true) { _textBuilder.Length = 0; ItemConfig _itemCfg = Config.Instance.Get(id); FuncConfigConfig _funcCfg = Config.Instance.Get("GemAttr"); if (_itemCfg == null && _funcCfg == null) { text.text = string.Empty; return; } if (_showItemName) { _textBuilder.Append(StringUtility.Contact("", _itemCfg.ItemName, "", "\n")); } PlayerPropertyConfig _playerAttrCfg = null; if (_itemCfg.Effect2 != 0) { _playerAttrCfg = Config.Instance.Get(_itemCfg.Effect2); _textBuilder.Append(string.Format(_funcCfg.Numerical1, _playerAttrCfg.Name, UIHelper.ReplacePercentage(_itemCfg.EffectValueA2, _playerAttrCfg.ISPercentage))); _textBuilder.Append(_playerAttrCfg.ISPercentage == 1 ? "%" : string.Empty); } if (_itemCfg.Effect3 != 0) { _playerAttrCfg = Config.Instance.Get(_itemCfg.Effect3); _textBuilder.Append("\n"); _textBuilder.Append(string.Format(_funcCfg.Numerical1, _playerAttrCfg.Name, UIHelper.ReplacePercentage(_itemCfg.EffectValueA3, _playerAttrCfg.ISPercentage))); _textBuilder.Append(_playerAttrCfg.ISPercentage == 1 ? "%" : string.Empty); } if (_itemCfg.Effect4 != 0) { _playerAttrCfg = Config.Instance.Get(_itemCfg.Effect4); _textBuilder.Append("\n"); _textBuilder.Append(string.Format(_funcCfg.Numerical1, _playerAttrCfg.Name, UIHelper.ReplacePercentage(_itemCfg.EffectValueA4, _playerAttrCfg.ISPercentage))); _textBuilder.Append(_playerAttrCfg.ISPercentage == 1 ? "%" : string.Empty); } text.text = _textBuilder.ToString(); } void OnHoleClick(int _hole) { if (model.presentGemEquip == 0) { return; } ItemModel _itemModel = playerPack.GetItemModelByIndex(PackType.rptEquip, model.presentGemEquip); bool hasStone = false; uint id = 0; uint[] stones = PlayerStoneData.Instance.GetStoneInfo(model.presentGemEquip); if (stones != null && stones.Length > 0) { id = stones[_hole]; hasStone = id != 0; } ShowGemSelectTip(hasStone, _hole + 1, id); } void ShowGemSelectTip(bool hasStone, int pos, uint id) { m_Inlaying = true; model.presentGemHole = pos; sltGemTip.gameObject.SetActive(true); ItemModel _itemModel = playerPack.GetItemModelByIndex(PackType.rptEquip, model.presentGemEquip); m_Scroller.Refresh(); _strikeBtn.gameObject.SetActive(hasStone); int _type = FuncConfigConfig.GetGemTypeByEquipPos(_itemModel.itemInfo.ItemPlace); if (_type == -1) { return; } SinglePackModel singlePack = playerPack.GetSinglePackModel(PackType.rptItem); List _list = null; singlePack.GetItemCountByType(GemModel.GEM_ITEMTABLE_TYPE, out _list); GetGemByEffectType(_list, _type); if (hasStone && !model.IsHightestLevelGem((int)id)) { CellInfo _cellInfo = CellInfo.Default; _cellInfo.infoInt1 = (int)id; m_Scroller.AddCell(ScrollerDataType.Header, 0, OnGemItemClick, _cellInfo); } if (hasStone && model.IsHightestLevelGem((int)id)) { CellInfo _cellInfo = CellInfo.Default; _cellInfo.infoInt1 = (int)id; var binds = PlayerStoneData.Instance.GetStoneBindInfo(model.presentGemEquip); if (binds != null && pos - 1 < binds.Length) { _cellInfo.infoInt2 = binds[pos - 1]; } m_Scroller.AddCell(ScrollerDataType.Extra1, 0, _cellInfo); } for (int i = 0; i < m_GemItems.Count; i++) { ItemModel _item = m_GemItems[i]; CellInfo _cellInfo = CellInfo.Default; _cellInfo.infoInt1 = _item.itemInfo.ItemID; _cellInfo.infoInt2 = _item.itemInfo.ItemPlace; _cellInfo.SetInfo(_item.itemInfo.IsBind); _cellInfo.infoStr1 = _item.itemInfo.ItemCount.ToString(); m_Scroller.AddCell(ScrollerDataType.Normal, i, OnGemItemClick, _cellInfo); } if (!hasStone) { CellInfo _cellInfo = CellInfo.Default; ItemConfig _itemCfg = ItemConfig.GetGemDataByLevelAndType(1, _type); _cellInfo.infoInt1 = _itemCfg.ID; m_Scroller.AddCell(ScrollerDataType.Tail, 0, OnGemItemClick, _cellInfo); } m_Scroller.Restart(); } void OnGemItemClick(CellView cell) { switch (cell.type) { case ScrollerDataType.Header: OnLevelUpGemBtn(); break; case ScrollerDataType.Normal: OnInlayGem(cell.info); break; case ScrollerDataType.Tail: m_CacheGotoShopId = model.presentGemEquip; WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.StoreFunc3); break; } } void OnRefreshItem(ScrollerDataType type, CellView cell) { switch (type) { case ScrollerDataType.Header: { if (!cell.info.HasValue) { return; } GemLevelUpCell _levelUpCell = cell as GemLevelUpCell; ItemConfig _itemCfg = Config.Instance.Get(cell.info.Value.infoInt1); ItemConfig _nextCfg = ItemConfig.GetGemDataByLevelAndType(_itemCfg.EffectValueB1, _itemCfg.EffectValueA1); if (_nextCfg != null && _itemCfg.Type == _nextCfg.Type && _itemCfg.EffectValueA1 == _nextCfg.EffectValueA1) { _levelUpCell.itemBG.SetItemBackGround(_nextCfg.ItemColor); _levelUpCell.itemIcon.SetSprite(_nextCfg.IconKey); } _levelUpCell.nameText.text = string.Empty; PlayerPropertyConfig _propertyCfg = null; for (int i = _itemCfg.EffectValueB1 + 1; i <= 9; i++) { _nextCfg = ItemConfig.GetGemDataByLevelAndType(i, _itemCfg.EffectValueA1); if (_nextCfg == null) { continue; } if (_itemCfg.Effect2 == 0 && _nextCfg.Effect2 != 0) { _propertyCfg = Config.Instance.Get(_nextCfg.Effect2); break; } else if (_itemCfg.Effect3 == 0 && _nextCfg.Effect3 != 0) { _propertyCfg = Config.Instance.Get(_nextCfg.Effect3); break; } else if (_itemCfg.Effect4 == 0 && _nextCfg.Effect4 != 0) { _propertyCfg = Config.Instance.Get(_nextCfg.Effect4); break; } } if (_propertyCfg != null) { _levelUpCell.nameText.text = Language.Get("GemNewAttr", _nextCfg.EffectValueB1, _propertyCfg.Name); } else { _levelUpCell.nameText.text = Language.Get("GemPropertyUpper"); } _levelUpCell.redpoint.redpointId = GemModel.GEM_REDPOINT * GemModel.REDPOINT_INTERVAL + 20 + model.presentGemHole; } break; case ScrollerDataType.Normal: { if (cell.info.HasValue) { GemEquipCell _gemEquipCell = cell as GemEquipCell; ItemConfig cfg = Config.Instance.Get(cell.info.Value.infoInt1); if (cfg != null) { _gemEquipCell.itemBG.SetItemBackGround(cfg.ItemColor); _gemEquipCell.itemIcon.SetSprite(cfg.IconKey); if (cell.info.HasValue) { ShowGemInfo(_gemEquipCell.property, cell.info.Value.infoInt1, false); } _gemEquipCell.count.text = cell.info.Value.infoStr1; _gemEquipCell.bind.gameObject.SetActive(cell.info.Value.infoInt3 == 1); _gemEquipCell.redpoint.gameObject.SetActive(model.GetHoleRedpoint(model.presentGemHole - 1) && model.CheckEquipHole(model.presentGemEquip, model.presentGemHole - 1, cfg.ID)); } } } break; case ScrollerDataType.Tail: { if (cell.info.HasValue) { var _gemShopCell = cell as GemShopCell; ItemConfig cfg = Config.Instance.Get(cell.info.Value.infoInt1); if (cfg != null) { _gemShopCell.itemBG.SetItemBackGround(cfg.ItemColor); _gemShopCell.itemIcon.SetSprite(cfg.IconKey); FuncConfigConfig func = Config.Instance.Get(string.Format("GemType{0}", cfg.EffectValueA1)); if (func != null) { _gemShopCell.nameText.text = func.Numerical2; } } } } break; case ScrollerDataType.Extra1: { if (cell.info.HasValue) { var _gemFlauntCell = cell as GemFlauntCell; _gemFlauntCell.Display(cell.info.Value.infoInt1, cell.info.Value.infoInt2 == 1); } } break; } } void OnSltBtnClick(int _pos) { if (m_Inlaying) { return; } GemEquipPlate _equipPlate = null; if (model.presentGemEquip > 0) { _equipPlate = GetEquipPlateByPos(model.presentGemEquip); _equipPlate.SetSelect(false); } model.presentGemEquip = _pos; _equipPlate = GetEquipPlateByPos(_pos); _equipPlate.SetSelect(true); RefreshEquipGem(model.presentGemEquip); } void OnSltGemClose() { if (sltGemTip.activeSelf) { sltGemTip.SetActive(false); } m_Inlaying = false; model.presentGemHole = 0; } void OnLevelUpGemBtn() { ItemModel _itemModel = playerPack.GetItemModelByIndex(PackType.rptEquip, model.presentGemEquip); if (_itemModel == null) { return; } uint[] stones = PlayerStoneData.Instance.GetStoneInfo(model.presentGemEquip); if (stones == null) { return; } uint id = stones[model.presentGemHole - 1]; ItemConfig _itemCfg = Config.Instance.Get((int)id); ItemConfig _nextCfg = ItemConfig.GetGemDataByLevelAndType(_itemCfg.EffectValueB1 + 1, _itemCfg.EffectValueA1); if (_nextCfg == null) { SysNotifyMgr.Instance.ShowTip("GemFullLevelError"); return; } int _hole = model.presentGemHole; OnSltGemClose(); model.presentGemHole = _hole; WindowCenter.Instance.Open(); } void OnInlayGem(CellInfo? info) { ItemModel _itemModel = playerPack.GetItemModelByIndex(PackType.rptEquip, model.presentGemEquip); if (_itemModel == null) { return; } if (model.presentGemHole != 0) { m_PresentInlayHole = model.presentGemHole; CA304_tagCMEquipEnchase _pak = new CA304_tagCMEquipEnchase(); _pak.HoleIndex = model.presentGemHole == 4 ? (byte)10 : (byte)(model.presentGemHole - 1); _pak.StoneIndex = (byte)info.Value.infoInt2; _pak.EquipIndex = (byte)model.presentGemEquip; GameNetSystem.Instance.SendInfo(_pak); } } void OnUpdateGemEquip() { ItemModel _itemModel = playerPack.GetItemModelByIndex(PackType.rptEquip, model.presentGemEquip); var _equipPlate = GetEquipPlateByPos(model.presentGemEquip); if (_equipPlate != null) { _equipPlate.RefreshGem(); } for (int i = 1; i < 5; i++) { UpdateHole(_itemModel, i); } int _hole = model.presentGemHole; OnSltGemClose(); model.presentGemHole = _hole; } void OnEquipClick() { int pos = model.presentGemEquip; ItemModel itemModel = playerPack.GetItemModelByIndex(PackType.rptEquip, pos); if (itemModel == null) { return; } itemTipsModel.SetItemTipsModel(PackType.rptEquip, itemModel.itemInfo.ItemGUID); } void OnStrikeBtn() { ItemModel _itemModel = playerPack.GetItemModelByIndex(PackType.rptEquip, model.presentGemEquip); if (_itemModel == null) { return; } uint[] stones = PlayerStoneData.Instance.GetStoneInfo(model.presentGemEquip); if (model.presentGemHole != 0 && stones != null && model.presentGemHole <= stones.Length) { m_PresentInlayHole = -1; CA305_tagCMEquipStonePick _pak = new CA305_tagCMEquipStonePick(); _pak.EquipIndex = (byte)model.presentGemEquip; _pak.HoleIndex = model.presentGemHole == 4 ? (byte)10 : (byte)(model.presentGemHole - 1); GameNetSystem.Instance.SendInfo(_pak); } } void GetGemByEffectType(List list, int type) { m_GemItems.Clear(); if (list == null || list.Count == 0) { return; } for (int i = 0; i < list.Count; i++) { ItemModel _itemModel = list[i]; ItemConfig _itemCfg = Config.Instance.Get(_itemModel.itemInfo.ItemID); if (_itemCfg.EffectValueA1 == type) { m_GemItems.Add(_itemModel); } } m_GemItems.Sort(Compare); } private int Compare(ItemModel x, ItemModel y) { ItemConfig cfgx = Config.Instance.Get((int)x.itemInfo.ItemID); ItemConfig cfgy = Config.Instance.Get((int)y.itemInfo.ItemID); if (cfgx.EffectValueB1.CompareTo(cfgy.EffectValueB1) != 0) { return -cfgx.EffectValueB1.CompareTo(cfgy.EffectValueB1); } return x.itemInfo.ItemPlace.CompareTo(y.itemInfo.ItemPlace); } private int Compare(int x, int y) { bool itemx = playerPack.GetItemModelByIndex(PackType.rptEquip, x) != null; bool itemy = playerPack.GetItemModelByIndex(PackType.rptEquip, y) != null; if (itemx.CompareTo(itemy) != 0) { return -itemx.CompareTo(itemy); } return x.CompareTo(y); } private void PlayUIEffect(int _index, bool _equip) { if (_equip) { m_GemHoles[_index - 1].m_GemEffect.Stop(); m_GemHoles[_index - 1].m_GemEquipEffect.Play(); } else { m_GemHoles[_index - 1].m_GemEquipEffect.Stop(); m_GemHoles[_index - 1].m_GemEffect.Play(); } } public GemEquipPlate GetEquipPlateByPos(int _pos) { return m_GemEquipPlates.Find((x) => { return x.EquipPos == _pos; }); } private void OnDisable() { PlayerStoneData.OnRefreshStoneData -= OnUpdateGemEquip; model.updateEquipPlateEvent -= OnSltBtnClick; PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= RefreshPlayerInfoEvent; OnSltGemClose(); if (model.presentGemEquip != 0) { var _equipPlate = GetEquipPlateByPos(model.presentGemEquip); _equipPlate.SetSelect(false); } } }