Files
JJBB/Assets/Project/Script/GUI/CaptainWelfare/CaptainWelfareRoot.cs

507 lines
16 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using GCGame.Table;
using Module.Log;
public class CaptainWelfareRoot : MonoBehaviour {
public static CaptainWelfareRoot Instance;
private void Awake()
{
Instance = this;
}
private void OnDestroy()
{
Instance = null;
}
public UIContainerBase _missionListContainer;
public UIContainerBase _rewItemContainer;
public UIContainerBase _valRewItemContainer;
public Slider _captainerLevelSlider;
public Text _curLevelExpValText;
public Slider _weekProgressSlider;
public Text _curLevelTypeDesc;
public GameObject _mask;
public Text _costValText;
public Image _captainIcon;
//周奖励
public GameObject _weekRewItemPrefab;
public RectTransform _weekSliderBGRect;
//刮刮乐
public ScratchTicket _scratchRawImage;
public Text _curVal;
public Transform _captainWelfareWeekRewItemParant;
//特效
public GameObject _particalPanel;
private ParticleSystem _particle;
private int _costVal = -1; //刮一次需要的值
public GameObject captainWelfareRewPreviewPanel;
private void OnEnable()
{
_scratchRawImage.onCleanRatioUpdate += OnCleanDataChanged;
InitPanel();
//ResetScratchRawImage(); //遮挡初始化
}
private void OnDisable()
{
_scratchRawImage.onCleanRatioUpdate -= OnCleanDataChanged;
}
private void InitPanel()
{
//任务ListItem
if (_animItemList.Count <= 0 ||
_teamLeaderTabIdList.Count <= 0 ||
_animItemList.Count < _teamLeaderTabIdList.Count)
StartCoroutine(InitAnimItem());
else
ReqInfo();
InitWeekRewContainer();
}
private void ResetScratchRawImage()
{
_scratchRawImage.Reset();
}
private List<CaptainWelfareRewItemInfo> _rewDataIdList = new List<CaptainWelfareRewItemInfo>();
private Dictionary<int, int> _rewIdAndCountDic = new Dictionary<int, int>();
public struct CaptainWelfareRewItemInfo
{
public int _itemId;
public int _itemCout;
public CaptainWelfareRewItemInfo(int itemId, int itemCount)
{
_itemId = itemId;
_itemCout = itemCount;
}
}
private void InitWeekRewContainer()
{
if(_rewDataIdList.Count == 0)
{
foreach (var info in TableManager.GetTeamLeaderAwardItem().Values)
{
CaptainWelfareRewItemInfo _itemInfo = new CaptainWelfareRewItemInfo(info.AwardSubId, info.AwardCount);
_rewDataIdList.Add(_itemInfo);
}
}
if(_rewDataIdList.Count > 0)
_rewItemContainer.InitContentItem(_rewDataIdList);
}
private void ReqInfo()
{
ReqGetTeamLeaderAwardInfo req = new ReqGetTeamLeaderAwardInfo();
req.flag = 1;
req.SendMsg();
}
private List<int> _teamLeaderTabIdList = new List<int>();
IEnumerator InitAnimItem()
{
yield return new WaitForEndOfFrame();
_teamLeaderTabIdList.Clear();
foreach (var info in TableManager.GetTeamLeaderAwardActivity().Values)
{
_teamLeaderTabIdList.Add(info.GetId());
}
if (_teamLeaderTabIdList.Count > 0)
_missionListContainer.InitContentItem(_teamLeaderTabIdList);
ReqInfo();
yield break;
}
private List<CaptainWelfareAimItem> _animItemList = new List<CaptainWelfareAimItem>();
private int _CurSelectMissionType = -1;
public void OnAimItemClick(int missionType)
{
_CurSelectMissionType = missionType;
ShowMarkIcon();
}
public void ShowMarkIcon()
{
for(int index = 0; index < _animItemList.Count; index++)
{
_animItemList[index].ShowMarkIcon(_animItemList[index].MissionType == _CurSelectMissionType);
}
}
public RespGetTeamLeaderAwardInfo _packet = null;
private bool _canRefresh = false;
public void OnPacket(RespGetTeamLeaderAwardInfo packet)
{
_packet = packet;
RefreshMissionItemListState(); //刷新预设状态
InitSliderValAndDesc(); //刷新Slider
RefreshWeekRewState(); //周进度奖励
InitScratchState();
InitMaskState(); //队长值不够不能刮
InitCurVal();
StartCoroutine(CreateValRew());
}
private void InitCurVal()
{
_curVal.text = _packet.point.ToString();
}
private void InitMaskState()
{
var teamLeaderAwardLevelTab = TableManager.GetTeamLeaderAwardLevelByID(_packet.level, 0);
if(teamLeaderAwardLevelTab == null)
{
LogModule.ErrorLog("teamLeaderAwardLevelTab is null, level : " + _packet.level);
return;
}
//设置队长图标
LoadAssetBundle.Instance.SetImageSprite(_captainIcon, teamLeaderAwardLevelTab.IconPath);
_costVal = teamLeaderAwardLevelTab.PointCost;
_costValText.text = teamLeaderAwardLevelTab.PointCost.ToString();
_mask.SetActive(_packet.point < _costVal);
}
//创建活力奖励
IEnumerator CreateValRew()
{
yield return new WaitForEndOfFrame();
List<CaptainWelfareRewItemInfo> _rewIdList = new List<CaptainWelfareRewItemInfo>();
for (int index = 0; index < _packet.awardList.Count; index++)
{
_rewIdList.Add(new CaptainWelfareRewItemInfo(_packet.awardList[index].subId, _packet.awardList[index].count));
}
if (_rewIdList.Count > 0)
_valRewItemContainer.InitContentItem(_rewIdList);
yield break;
}
private void InitScratchState()
{
if (_scratchRawImage.gameObject.activeInHierarchy)
//没有奖励 清除区域为0
_canRefresh = _packet.awardList.Count <= 0 && _scratchRawImage.cleanRatio == 0 && _packet.exp_week >= _costVal;
else
_canRefresh = true;
}
public void OnCleanDataChanged(float _cleanData)
{
if(_cleanData > 0 && _packet.awardList.Count == 0) //生成一次奖励
{
ReqCreateTeamLeaderAward req = new ReqCreateTeamLeaderAward();
req.flag = 1;
req.SendMsg();
}
if (!_canRefresh)
{
InitScratchState(); //刷新当前能否刷新奖励的状态
}
if (_cleanData >= 0.5f)
{
_scratchRawImage.gameObject.SetActive(false);
InitScratchState();
//播放特效
if (_particle == null)
_particle = _particalPanel.GetComponentInChildren<ParticleSystem>();
if (_particle != null)
{
_particle.Stop();
_particle.Play();
}
//申请领奖
ReqCetTeamLeaderAward req = new ReqCetTeamLeaderAward();
req.flag = 1;
req.SendMsg();
}
}
private Dictionary<int, int> _weekRewStateDic;
private void RefreshWeekRewState()
{
if(_isInitWeekRewOver)
{
for(int index = 0; index < _packet.awardWeek.Count; index++)
{
for (int rewIndex = 0; rewIndex < _weekRewItemList.Count; rewIndex++)
{
if(_weekRewItemList[rewIndex]._curItemIndex == _packet.awardWeek[index].index)
{
_weekRewItemList[rewIndex].RefreshItemState(_packet.awardWeek[index].state);
}
}
}
}else
{
if (_weekRewStateDic == null)
_weekRewStateDic = new Dictionary<int, int>();
for(int index = 0; index < _packet.awardWeek.Count; index++)
{
if(_weekRewStateDic.ContainsKey(_packet.awardWeek[index].index))
{
_weekRewStateDic[_packet.awardWeek[index].index] = _packet.awardWeek[index].state;
}
else
{
_weekRewStateDic.Add(_packet.awardWeek[index].index, _packet.awardWeek[index].state);
}
}
}
}
private enum CAPTAINLEVELTYPE
{
LEVEL_0 = 1, //小白 对应ID是1
LEVEL_1,
LEVEL_2,
LEVEL_3,
LEVEL_4,
LEVEL_5,
}
//等级 经验
private Dictionary<int, int> _captainLevelExpDic = new Dictionary<int, int>();
private void InitSliderValAndDesc()
{
_curLevelTypeDesc.text = GetCurCaptainLevelDesc();
InitCurLevelExpAndVal();
InitWeekSliderVal();
}
private int _weekMaxExp = -1;
private void InitWeekSliderVal()
{
if(_weekMaxExp == -1)
{
foreach(var weekInfo in TableManager.GetTeamLeaderAwardWeek().Values)
{
if (weekInfo.WeekNeedExp > _weekMaxExp)
_weekMaxExp = weekInfo.WeekNeedExp;
}
}
//初始化进度值
_weekProgressSlider.value = Mathf.Clamp((float)_packet.exp_week / (float)_weekMaxExp, 0, 1);
//计算奖励应该出现的位置
StartCoroutine(CreateWeekRewAndSetPos());
}
private bool _isInitWeekRewOver = false;
private List<CaptainWelfareWeekRewItem> _weekRewItemList = new List<CaptainWelfareWeekRewItem>();
IEnumerator CreateWeekRewAndSetPos()
{
yield return new WaitForEndOfFrame();
if (_weekRewItemList.Count < TableManager.GetTeamLeaderAwardWeek().Count)
{
var _startIndex = _weekRewItemList.Count;
for (int index = _startIndex; _weekRewItemList.Count < TableManager.GetTeamLeaderAwardWeek().Count; index++)
{
var obj = GameObject.Instantiate(_weekRewItemPrefab);
obj.transform.SetParent(_captainWelfareWeekRewItemParant);
obj.transform.localScale = Vector3.one;
obj.transform.localRotation = Quaternion.Euler(Vector3.zero);
var teamWeekAwardTab = TableManager.GetTeamLeaderAwardWeekByID(index + 1, 0);
if(teamWeekAwardTab == null)
{
LogModule.ErrorLog("teamWeekAwardTab is null, id : " + index + 1);
yield break;
}
//pos cueExp / maxExp * rect.width
obj.transform.localPosition = new Vector3(
Mathf.Clamp((float)teamWeekAwardTab.WeekNeedExp / (float)_weekMaxExp * _weekSliderBGRect.rect.width, 0, _weekSliderBGRect.rect.width), 0, 0);
obj.GetComponent<CaptainWelfareWeekRewItem>().InitItem(index + 1);
_weekRewItemList.Add(obj.GetComponent<CaptainWelfareWeekRewItem>());
}
_isInitWeekRewOver = true;
}
if(_weekRewStateDic != null && _weekRewStateDic.Count > 0)
{
for (int index = 0; index < _packet.awardWeek.Count; index++)
{
for (int rewIndex = 0; rewIndex < _weekRewItemList.Count; rewIndex++)
{
if (_weekRewItemList[rewIndex]._curItemIndex == _packet.awardWeek[index].index)
{
_weekRewItemList[rewIndex].RefreshItemState(_packet.awardWeek[index].state);
}
}
}
}
yield break;
}
public void InitCurLevelExpAndVal()
{
var _nextLevel = -1; //初始化 后面判断用
_nextLevel = Mathf.Clamp(_packet.level + 1, 2, _maxLevel); //ID从1开始的话下个等级最低是2默认的是1
var _curLevelTotalExp = 0;
_curLevelTotalExp = _captainLevelExpDic[_nextLevel] - _captainLevelExpDic[_packet.level];
_captainerLevelSlider.value = Mathf.Clamp((float)_packet.exp / (float)_captainLevelExpDic[_nextLevel], 0, 1);
_curLevelExpValText.text = Mathf.Clamp(_packet.exp, 0, _captainLevelExpDic[_nextLevel]) + "/" + _captainLevelExpDic[_nextLevel];
}
public string GetCurCaptainLevelDesc()
{
if (_captainLevelExpDic.Count <= 0)
GetCaptainLevelExpDic();
Tab_TeamLeaderAwardLevel teamLevelTab = null;
if (_packet.exp == 0)
{
teamLevelTab = TableManager.GetTeamLeaderAwardLevelByID(1, 0); //最小
if (teamLevelTab != null)
return teamLevelTab.Name;
}
else
{
if(_packet.level == _maxLevel)
{
teamLevelTab = TableManager.GetTeamLeaderAwardLevelByID(_maxLevel, 0); //最大
if (teamLevelTab != null)
return teamLevelTab.Name;
}
foreach (var exp in _captainLevelExpDic)
{
if (_packet.exp < exp.Value)
{
teamLevelTab = TableManager.GetTeamLeaderAwardLevelByID(exp.Key - 1, 0);
if (teamLevelTab != null)
return teamLevelTab.Name;
}
}
}
return "WRONG";
}
private int _maxLevel = -1;
private int _maxExp = -1;
private void GetCaptainLevelExpDic()
{
var teamTab = TableManager.GetTeamLeaderAwardLevel().Values;
foreach(var info in teamTab)
{
if (!_captainLevelExpDic.ContainsKey(info.Level))
_captainLevelExpDic.Add(info.Level, info.Exp);
if (info.Level >= _maxLevel)
_maxLevel = info.Level;
if (info.Exp >= _maxExp)
_maxExp = info.Exp;
}
}
private void RefreshMissionItemListState()
{
//刷新当前次数
if (_packet.activityList.Count == 0)
{
List<int> _missiontypeList = new List<int>();
var missionDic = TableManager.GetTeamLeaderAwardActivity();
foreach (var mission in missionDic)
{
_missiontypeList.Add(mission.Key);
}
_missionListContainer.ForeachActiveItem<CaptainWelfareAimItem>((item) => {
for (int index = 0; index < _missiontypeList.Count; index++)
{
item.RefreshItemState(0);
}
});
}
else
{
_missionListContainer.ForeachActiveItem<CaptainWelfareAimItem>((item) => {
for (int index = 0; index < _packet.activityList.Count; index++)
{
if(item.MissionType == _packet.activityList[index].type)
{
item.RefreshItemState(_packet.activityList[index].count);
}
}
});
}
}
public void OnRefreshRewBtnClick()
{
if(!_canRefresh)
{
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{68002}")); //未完成当前刮奖
return;
}
_scratchRawImage.gameObject.SetActive(true);
_scratchRawImage.Reset();
ReqCreateTeamLeaderAward req = new ReqCreateTeamLeaderAward();
req.flag = 1;
req.SendMsg();
}
public void OnHelpBtnClick()
{
MessageHelpLogic.ShowHelpMessage(41);
}
public void OnMaskBtnClick()
{
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{68001}"));
return;
}
public void OnCloseBtnClick()
{
UIManager.CloseUI(UIInfo.CaptainWelfare);
}
public void OnCaptainNameClick()
{
MessageHelpLogic.ShowHelpMessage(42);
}
public void OnWeekItemClick(int weekId, int state)
{
captainWelfareRewPreviewPanel.SetActive(true);
if (CaptainWelfareRewPreviewCtr.Instance)
CaptainWelfareRewPreviewCtr.Instance.InitWelfareRewPreview(weekId, state);
}
}