/// #pkgName FGUI包名
/// #panelName UIPanel名字
/// #UIName = $"{#pkgName}{#panelName}" UIKey名字
/// 该脚本由模板创建
/// created by cb 2024
using FairyGUI;
using FL.Data;
using FL.Data.Items;
using FL.Network;
using Spine.Unity;
using System.Collections.Generic;
using UnityEngine;
using XGame.Database;
using XGame.Framework.FGUI;
using XGame.Framework.Time;
using XGame.Framework.UI;
namespace FL.FGUI
{
///
/// UI逻辑处理类
///
///
public partial class DragonEggTreasurePanelCtrl : UIController
{
private bool _bFlyingAni; // 是否处于开龙宝藏飞行动画状态
private int _selectIndex; // 当前选择的龙索引
private int _useCount; // 使用的品质宝箱数量
private int _maxTreasureSocre; // 当前宝藏进度的最大积分值
private string _treasureChestName; // 当前宝藏宝箱名称
private ITimer _openBoxTimer;
private Vector3 _startPos;
private Vector3 _endPos;
private Vector3 _scoreEndPos;
private HashSet _flyingList;
private List _dragonBtnList;
private List _dropItemList;
private const int _costDragonEggNum = 10; // 每次消耗的龙蛋数量
protected override void OnEnable(object intent)
{
AddUIListenres();
AddEventListener();
Init(intent as int[]);
}
protected override void OnDisable()
{
RemoveUIListenres();
RemoveEventListener();
ClearOpenTimer();
if (_flyingList != null)
{
foreach (var flying in _flyingList)
{
Context.Asset.Recycle(flying);
}
_flyingList.Clear();
_flyingList = null;
}
if (_dropItemList != null) _dropItemList.Clear();
if (_dragonBtnList != null)
{
_dragonBtnList.Clear();
_dragonBtnList = null;
}
VM.DragonSpine.url = string.Empty;
}
#region UI事件
private void AddUIListenres()
{
VM.NextBtn.onClick.Add(OnClickNextBtn);
VM.PreviousBtn.onClick.Add(OnClickPreviousBtn);
VM.BagBtn.onClick.Add(OnClickBagBtn);
VM.BoxAwardBtn.onClick.Add(OnClickBoxAwardBtn);
VM.DragonSpineBtn.onClick.Add(OnclickDragonSpineBtn);
VM.LevelBtn.onClick.Add(OnClickLevelBtn);
VM.MenusBtnCtrl.onChanged.Add(OnMenusBtnCtrlChange);
}
private void RemoveUIListenres()
{
VM.NextBtn.onClick.Remove(OnClickNextBtn);
VM.PreviousBtn.onClick.Remove(OnClickPreviousBtn);
VM.BagBtn.onClick.Remove(OnClickBagBtn);
VM.BoxAwardBtn.onClick.Remove(OnClickBoxAwardBtn);
VM.DragonSpineBtn.onClick.Remove(OnclickDragonSpineBtn);
VM.LevelBtn.onClick.Remove(OnClickLevelBtn);
VM.MenusBtnCtrl.onChanged.Remove(OnMenusBtnCtrlChange);
}
///
/// 打开宝箱等级弹窗界面
///
///
private void OnClickLevelBtn(EventContext context)
{
Context.UI.OpenAsync(UIKeys.TreasureChestUpgradePanel);
}
private void OnClickNextBtn(EventContext context)
{
OnSelectDragon(VM.MenusBtnCtrl.selectedIndex + 1);
}
private void OnClickPreviousBtn(EventContext context)
{
OnSelectDragon(VM.MenusBtnCtrl.selectedIndex - 1);
}
///
/// 点击背包按钮
///
///
private void OnClickBagBtn(EventContext context)
{
DragonEggService.Instance.SendToOpenTemporaryEquipBag();
}
///
/// 积分进度条满值可领取对应的宝箱奖励
///
///
private void OnClickBoxAwardBtn(EventContext context)
{
DragonEggService.Instance.SendToOpenTreasureBoxAward();
}
private void OnclickDragonSpineBtn(EventContext context)
{
if (_bFlyingAni)
{
//XGame.Log.Info("处于开宝箱状态");
return;
}
if (IsEmptyBox()) return;
_bFlyingAni = true;
OpenDragonEggBoxAni();
OpenDragonTreasure();
}
#endregion
private void AddEventListener()
{
EventSingle.Instance.AddListener(EventDefine.RefreshTreasureProgressUI, RefreshTreasureProgressUI);
EventSingle.Instance.AddListener(EventDefine.RefreshTreasureUI, RefreshTreasureUI);
EventSingle.Instance.AddListener(EventDefine.OpenDragonTreasureSucess, OpenDragonTreasureSucess);
EventSingle.Instance.AddListener(EventDefine.OpenEquipBag, OpenEquipBag);
EventSingle.Instance.AddListener(EventDefine.RefreshTreasureChestUI, RefreshTreasureChestUI);
EventSingle.Instance.AddListener(EventDefine.UpdataItemData, UpdataItemData);
}
private void RemoveEventListener()
{
EventSingle.Instance.RemoveListener(EventDefine.RefreshTreasureProgressUI, RefreshTreasureProgressUI);
EventSingle.Instance.RemoveListener(EventDefine.RefreshTreasureUI, RefreshTreasureUI);
EventSingle.Instance.RemoveListener(EventDefine.OpenDragonTreasureSucess, OpenDragonTreasureSucess);
EventSingle.Instance.RemoveListener(EventDefine.OpenEquipBag, OpenEquipBag);
EventSingle.Instance.RemoveListener(EventDefine.RefreshTreasureChestUI, RefreshTreasureChestUI);
EventSingle.Instance.RemoveListener(EventDefine.UpdataItemData, UpdataItemData);
}
private void Init(int[] paramArray)
{
_selectIndex = paramArray?.Length > 0 ? paramArray[0] : -1;
_bFlyingAni = false;
var startPos = VM.DragonSpineBtn.displayObject.TransformPoint(new Vector2(VM.DragonSpineBtn.width / 3, VM.DragonSpineBtn.height / 2), VM.DragonSpineBtn.displayObject);
_startPos = new Vector3(startPos.x, startPos.y, 0);
var endPos = VM.BagBtn.displayObject.TransformPoint(new Vector3(VM.BagBtn.width/10, VM.BagBtn.height/8), VM.DragonSpine.displayObject);
_endPos = new Vector3(endPos.x, endPos.y, 0);
ShowUI();
DragonEggService.Instance.SendToTreasureInfo();
}
private void ShowUI()
{
InitDrangonBoxUI();
ShowDragonTreasureUI(null);
ShowDragonLv();
}
private void ShowDragonLv()
{
VM.LevelBtn.title = $"LV.{DragonEggData.Instance.Level}";
}
///
/// 加载龙的spine
///
///
private void LoadDragonSpine(string spineName)
{
VM.DragonSpine.LoadSpine(spineName, "box_idle", true);
}
///
/// 是否显示龙的spine模型
///
///
private void ShowDragonSpine(bool bShow)
{
VM.DragonSpine.visible = bShow;
VM.DragonIcon.visible = !bShow;
}
///
/// 龙蛋积分变化
///
///
///
private void ShowDragonEggScoreUI(bool bTweenValue)
{
VM.EggPointBar.max = _maxTreasureSocre;
if (bTweenValue)
VM.EggPointBar.TweenValue(DragonEggData.Instance.DragonTreasureSocre, 0.5f);
else
VM.EggPointBar.value = DragonEggData.Instance.DragonTreasureSocre;
OnchangeAwardState(DragonEggData.Instance.DragonTreasureSocre >= _maxTreasureSocre);
int subSocre = _maxTreasureSocre > DragonEggData.Instance.DragonTreasureSocre ? _maxTreasureSocre - DragonEggData.Instance.DragonTreasureSocre : 0;
VM.ScoreAwardLabel.text = string.Format(StringDefine.dragonTreasureScore, subSocre, _treasureChestName);
}
private void InitDrangonBoxUI()
{
if (_dragonBtnList == null) _dragonBtnList = new List() { VM.DragonBtn1, VM.DragonBtn2, VM.DragonBtn3, VM.DragonBtn4, VM.DragonBtn5 };
for (int i = 0; i < 5; i++)
{
long num = ItemData.Instance.GetItemNum(DragonEggData.Instance.GetTreasureChestId(i));
if (num > 0 && _selectIndex == -1)
{
_selectIndex = i;
ShowDragonBoxNum(num);
}
}
OnSelectDragon(_selectIndex == -1 ? 0 : _selectIndex);
}
///
/// 判断龙裔宝卵数量是否
///
///
private bool IsEmptyBox(bool bShowTip = true)
{
var boxNum = ItemData.Instance.GetItemNum(GetTreasureChestId());
if (boxNum == 0)
{
if (bShowTip)
{
Context.ShowTips(StringDefine.dragonEggsEmpty);
}
return true;
}
return false;
}
///
/// 龙蛋品质宝箱数量
///
///
///
private void ShowDragonBoxNum(long num)
{
VM.NumLabel.text = num.ToString();
}
private void ShowFlyIconView(int itemId, bool bScore)
{
var flyParam = new FlyingIconParam()
{
iconName = ItemTableRepo.Get(itemId).Icon,
startPos = _startPos,
bScore = bScore,
endPos = _endPos,
};
if (_flyingList == null) _flyingList = new HashSet();
var loadAsync = Context.Asset.LoadFguiNested(UINestedKeys.DragonEggFlyIcon, VM.DragonSpineBtn);
loadAsync.On(_ =>
{
var flyView = loadAsync.Result as DragonEggFlyIconView;
if (flyView != null)
{
flyParam.callback = (bScore) =>
{
FlyingCallback(flyView, bScore);
};
flyView.Ctrl.ShowUI(flyParam);
_flyingList.Add(flyView);
}
});
}
///
/// 物品全部飞入背包后的回调函数
///
///
///
private void FlyingCallback(DragonEggFlyIconView flyView, bool bScore)
{
_flyingList.Remove(flyView);
Context.Asset.Recycle(flyView);
if (_flyingList.Count == 0) OnchangBagState(false);
if (bScore)
{
ShowDragonEggScoreUI(true);
_bFlyingAni = false;
if (_dropItemList == null) _dropItemList = new List();
else _dropItemList.Clear();
_dropItemList.AddRange(DragonEggData.Instance.DropItems);
if (_dropItemList.Count > 1)
{
OnSortByEquipPower();
}
var obtainData = new ObtainItemsParam()
{
dropItems = _dropItemList,
bShowBtn = IsShowOneKeyBtn(DragonEggData.Instance.DropItems),
};
var loadAsync = Context.UI.OpenAsync(UIKeys.ItemGetItemPanel, obtainData);
loadAsync.On(_=>
{
DragonEggData.Instance.DropItems.Clear();
});
};
}
private void OnSortByEquipPower()
{
_dropItemList.Sort((aItem, bItem)=>
{
int aEquipFlag = aItem.count == 0 ? 1 : 0;
int bEquipFlag = bItem.count == 0 ? 1 : 0;
if (aEquipFlag == bEquipFlag)
{
if (aEquipFlag == 1)
{
var aEquipData = EquipData.Instance.GetTemporaryEquipItem(aItem.id);
var bEquipData = EquipData.Instance.GetTemporaryEquipItem(bItem.id);
var aHighPower = GetCompareValue(aEquipData);
var bHighPower = GetCompareValue(bEquipData);
if (aHighPower == bHighPower)
{
if (aEquipData.FightingPower == bEquipData.FightingPower)
{
return aEquipData.Id.CompareTo(bEquipData.Id); // 升序
}
return bEquipData.FightingPower.CompareTo(aEquipData.FightingPower); //降序
}
else
return bHighPower.CompareTo(aHighPower);
}
return aItem.count.CompareTo(bItem.count);
}
return bEquipFlag.CompareTo(aEquipFlag);//降序
});
}
private int GetCompareValue(EquipItem equipData)
{
int compareFlag = 0;
if (equipData?.Table?.Part > 0)
{
long compareFightingPower = equipData?.FightingPower ?? 0;
var equipItem = EquipData.Instance.GetWearEquipData(equipData.Table.Part);
long wearFightingPower = equipItem?.FightingPower ?? 0;
if (compareFightingPower > wearFightingPower)
compareFlag = 1;
}
return compareFlag;
}
///
/// 打开恭喜获得界面是否需要显示一键处理按钮
///
///
private bool IsShowOneKeyBtn(List dropItems)
{
bool bShowBtn = false;
if (dropItems.Count > 0)
{
for (int i = 0; i < dropItems.Count; i++)
{
if (dropItems[i].count == 0)
{
return true;
}
}
}
return bShowBtn;
}
private void OnchangBagState(bool bOpen)
{
VM.BagBtn.GetController("State").selectedIndex = bOpen ? 1 : 0;
}
///
/// 打开龙蛋宝藏
///
private void OpenDragonTreasure()
{
int itemId = GetTreasureChestId();
var boxNum = ItemData.Instance.GetItemNum(itemId);
_useCount = boxNum < _costDragonEggNum ? (int)boxNum : _costDragonEggNum;
DragonEggService.Instance.SendToOpenDragonTreasure(itemId, _useCount);
}
///
/// 开龙蛋宝箱的掉落动画
///
private void PlayDropAni()
{
OnchangBagState(true);
int count = DragonEggData.Instance.DropItems.Count - 1;
for (int i = 0; i < DragonEggData.Instance.DropItems.Count; i++)
{
var itemData = DragonEggData.Instance.DropItems[i];
if (itemData != null)
{
ShowFlyIconView(GetItemId(itemData), i == count);
}
}
}
///
/// 获取道具tableId
///
///
///
private int GetItemId(KindItem itemData)
{
if (itemData?.count == 0)
{
var equipData = EquipData.Instance.GetTemporaryEquipItem(itemData.id);
return equipData == null ? 0 : equipData.TableId;
}
else
{
// 非装备的物品道具
return itemData.id;
}
}
///
/// 宝箱按钮领取状态
///
///
private void OnchangeAwardState(bool bAward)
{
VM.AwardState.selectedIndex = bAward ? 1 : 0;
}
private void OnSelectDragon(int index)
{
VM.MenusBtnCtrl.selectedIndex = index;
ShowSelectDragonUI();
}
///
/// 获取当前选择的龙蛋道具id
///
///
private int GetTreasureChestId()
{
return DragonEggData.Instance.GetTreasureChestId(VM.MenusBtnCtrl.selectedIndex);
}
///
/// 当前选中的龙蛋
///
private void ShowSelectDragonUI()
{
int selectedIndex = VM.MenusBtnCtrl.selectedIndex;
ShowDragonName(selectedIndex);
int itemId = GetTreasureChestId();
var itemInfo = ItemTableRepo.Get(itemId);
if (itemInfo != null)
{
bool bShowDesc = itemInfo?.Desc.Length > 0;
VM.ProbalityLabel.visible = bShowDesc;
VM.DescBg.visible = bShowDesc;
if (bShowDesc)
VM.ProbalityLabel.text = itemInfo.Desc;
}
ShowDragonBoxNum(ItemData.Instance.GetItemNum(itemId));
// 获取龙的spine
LoadDragonSpine("box_skeletondata");
ShowDragonSpine(false);
}
///
/// 龙蛋按钮菜单栏变化
///
///
private void OnMenusBtnCtrlChange(EventContext context)
{
ShowSelectDragonUI();
}
private void ShowDragonName(int selectedIndex)
{
VM.PreviousBtn.visible = selectedIndex != 0;
VM.NextBtn.visible = selectedIndex != 4;
}
///
/// 领取龙蛋积分宝箱后龙蛋进度条积分变化
///
private void RefreshTreasureProgressUI(int eventId, object args)
{
var rewardItems = DragonEggData.Instance.DragonTreasureRewardItems;
if (rewardItems?.Count > 0)
{
var obtainData = new ObtainItemsParam()
{
dropItems = rewardItems,
bShowBtn = IsShowOneKeyBtn(rewardItems),
};
var loadAsync = Context.UI.OpenAsync(UIKeys.ItemGetItemPanel, obtainData);
loadAsync.On(_ =>
{
DragonEggData.Instance.DragonTreasureRewardItems.Clear();
});
}
var treasureInfo = treasureBonusTableRepo.Get(DragonEggData.Instance.DragonTreasureId);
if (treasureInfo != null)
{
ShowDragonTreasureUI(treasureInfo);
}
}
///
/// 宝藏积分UI
///
///
private void ShowDragonTreasureUI(treasureBonusTable treasureInfo)
{
if (treasureInfo == null)
{
treasureInfo = treasureBonusTableRepo.Get(DragonEggData.Instance.DragonTreasureId);
}
if (treasureInfo == null) return;
_maxTreasureSocre = treasureInfo.Progress;
var itemInfo = ItemTableRepo.Get(treasureInfo.Reward);
if (itemInfo != null)
{
_treasureChestName = itemInfo.Name;
//_treasureRewardId = itemInfo.Id;
}
ShowDragonEggScoreUI(false);
int index = DragonEggData.Instance.GetTreasureChestIndex(treasureInfo.Reward);
if (index > 0)
{
VM.BoxAwardBtn.GetController("c1").selectedIndex = index - 1;
}
}
///
/// 龙蛋开箱动画
///
private void OpenDragonEggBoxAni()
{
ShowDragonSpine(true);
if (VM.DragonSpine.Play("box_open", false))
{
ClearOpenTimer();
_openBoxTimer = Context.Time.AddDelayTimer(VM.DragonSpine.spineAnimation.GetDurationMS(), () =>
{
VM.DragonSpine.Play("box_idle", true);
ShowDragonSpine(false);
});
}
}
///
/// 请求宝箱消息返回,刷新UI信息
///
///
///
private void RefreshTreasureUI(int eventId, object args)
{
ShowUI();
}
///
/// 成功开启龙蛋
///
///
///
private void OpenDragonTreasureSucess(int eventId, object args)
{
if (DragonEggData.Instance.DropItems?.Count > 0)
{
PlayDropAni();
}
ShowDragonBoxNum(ItemData.Instance.GetItemNum(GetTreasureChestId()));
}
///
/// 宝箱等级变化
///
///
///
private void RefreshTreasureChestUI(int eventId, object args)
{
ShowDragonLv();
}
///
/// 道具变化
///
///
///
private void UpdataItemData(int eventId, object args)
{
var itemDataList = args as List;
if (itemDataList?.Count > 0)
{
int itemId = GetTreasureChestId();
for (int i = 0; i < itemDataList.Count; i++)
{
if (itemDataList[i].count > 0 && itemDataList[i].id == itemId)
{
ShowDragonBoxNum(ItemData.Instance.GetItemNum(itemId));
return;
}
}
}
}
private void ClearOpenTimer()
{
if (_openBoxTimer != null)
{
_openBoxTimer.Cancel();
_openBoxTimer = null;
}
}
///
/// 打开装备背包
///
///
///
private void OpenEquipBag(int eventId, object args)
{
Context.UI.OpenAsync(UIKeys.TemporaryEquipBagPanel);
}
}
}