Files
JJBB/Assets/Project/Script/GUI/Other/BuffersSelectCtr.cs

326 lines
8.6 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
using System.Collections;
using System.Collections.Generic;
using Module.Log;
using UnityEngine;
using UnityEngine.UI;
public class BuffersSelectCtr : MonoBehaviour {
#region Single
private static BuffersSelectCtr _instance;
public static BuffersSelectCtr Instance
{
get
{
if (_instance != null)
{
return _instance;
}
return null;
}
}
#endregion
public List<BufferItem> ownBuffers; // 拥有的Buffer
public List<BufferItem> newBuffers; // 可替换的新Buffer
public Button closeBtn; // 关闭按钮
public Text replaceTips; // 替换提示
public Text remainTimeObj; // 当前剩余时间(仅时间)
public Text remainTimeDesc; // 当前剩余时间描述
public UIBackRayBehind behindMask; // 空白点击面板
private BufferItem curSelectItem; // 当前选择的BufferItem;
private int selOwnIndex = -1; // 选中自身buff的槽位索引用于替换
private int selNewIndex = -1; // 选中新buff的槽位索引
private const float PreparaTime = 15.0f; // 剩余时间
private float remainTime;
private void Awake()
{
if(_instance == null)
{
_instance = this;
}
if (ownBuffers.Count != newBuffers.Count)
{
LogModule.ErrorLog("ownBuffers.Count != newBuffers.Count, please check !!!");
}
for(int i = 0; i < ownBuffers.Count; ++i)
{
ownBuffers[i]._PanelClickEvent += OnOwnBufferClick;
newBuffers[i]._PanelClickEvent += OnNewBufferClick;
}
closeBtn.onClick.AddListener(Close);
behindMask._BackClick.AddListener(CancelSelect);
}
// 仅在替换是可用
private void CancelSelect()
{
if(EmptyIndexOfOwn() == -1 && selNewIndex != -1 && selOwnIndex == -1)
{
selNewIndex = -1;
curSelectItem = null;
replaceTips.gameObject.SetActive(false);
SetMask();
}
}
private void OnEnable()
{
remainTime = PreparaTime;
curSelectItem = null;
selOwnIndex = -1;
selNewIndex = -1;
replaceTips.gameObject.SetActive(false);
remainTimeObj.gameObject.SetActive(false);
}
private void OnDestroy()
{
_instance = null;
}
// Use this for initialization
void Start () {
if(ownBuffers.Count != newBuffers.Count)
{
LogModule.ErrorLog("ownBuffers.Count != newBuffers.Count, please check !!!");
}
for(int i = 0; i < ownBuffers.Count; ++i)
{
ownBuffers[i].Show(null);
newBuffers[i].Show(null);
}
}
// 自身Buffer点击后的回调
private void OnOwnBufferClick(UIBase item)
{
// 仅当需要替换时对拥有的Buffer做出反应
if (curSelectItem != null && EmptyIndexOfOwn() == -1)
{
BufferItem replaceItem = item as BufferItem;
if(replaceItem == null)
{
LogModule.ErrorLog("Replace buffer is null, please check !!!");
return;
}
selOwnIndex = ownBuffers.IndexOf(replaceItem);
if (selOwnIndex == -1)
{
LogModule.ErrorLog("Can't find replace buffer Index, please check !!!");
return;
}
Hashtable info_newBuffer = new Hashtable();
info_newBuffer["Info"] = curSelectItem.BuffInfo.ImpactID;
ownBuffers[selOwnIndex].Show(info_newBuffer);
remainTime = 3.0f;
replaceTips.gameObject.SetActive(false);
SetMask();
}
}
// 新的可调换Buffer点击回调
private void OnNewBufferClick(UIBase item)
{
BufferItem tempSelect = item as BufferItem;
if(tempSelect == null)
{
return;
}
if(curSelectItem != null)
{
return;
}
selNewIndex = newBuffers.IndexOf(tempSelect);
curSelectItem = tempSelect;
int emptyIndex = EmptyIndexOfOwn();
if(emptyIndex != -1)
{
Hashtable hash = new Hashtable();
hash["Info"] = curSelectItem.BuffInfo.ImpactID;
ownBuffers[emptyIndex].Show(hash);
selOwnIndex = emptyIndex;
remainTime = 3.0f;
}
else
{
replaceTips.gameObject.SetActive(true);
}
SetMask();
}
#region
public void ReceiveNewBuffers(object packet)
{
ReqTestingOptionBuff info = packet as ReqTestingOptionBuff;
if(info == null)
{
return;
}
this.gameObject.SetActive(true);
for (int i = 0; i < ownBuffers.Count; ++i)
{
if (i < info._OwnBuffId.Count)
{
Hashtable hash = new Hashtable() { { "Info", info._OwnBuffId[i] } };
ownBuffers[i].Show(hash);
}
else
{
ownBuffers[i].Show(null);
}
}
for(int i = 0; i < info._OptionBuffId.Count; ++i)
{
Hashtable hash = new Hashtable() { { "Info", info._OptionBuffId[i] } };
newBuffers[i].Show(hash);
}
StartCoroutine("CountDown");
SetMask();
}
private IEnumerator CountDown()
{
remainTimeObj.gameObject.SetActive(true);
for(; remainTime > 0.0f; remainTime -= Time.deltaTime)
{
remainTimeDesc.text = ((int)remainTime).ToString();
yield return 0;
}
Close();
}
// 确认所选的Buff
public void ConfimBuffers()
{
if(curSelectItem == null)
{
// 拥有空槽位时,随机选取一个Buff
if(EmptyIndexOfOwn() != -1)
{
int r = Random.Range(0, newBuffers.Count - 1);
Hashtable hash = new Hashtable() { { "Info", newBuffers[r].BuffInfo.ImpactID } };
ownBuffers[EmptyIndexOfOwn()].Show(hash);
TestingCopyBuffInfoCtr.Instance.SetBuffer(newBuffers[r].BuffInfo.ImpactID);
}
}
else
{
if(EmptyIndexOfOwn() != -1)
{
TestingCopyBuffInfoCtr.Instance.SetBuffer(curSelectItem.BuffInfo.ImpactID);
}
else if(selOwnIndex != -1)
{
TestingCopyBuffInfoCtr.Instance.SetBuffer(curSelectItem.BuffInfo.ImpactID, selOwnIndex);
}
}
// 发送信息确认新buff
List<int> curBuffs = new List<int>();
for(int i = 0; i < ownBuffers.Count; ++i)
{
if(ownBuffers[i].BuffInfo != null)
{
curBuffs.Add(ownBuffers[i].BuffInfo.ImpactID);
}
}
RetTestingOptionBuff packet = new RetTestingOptionBuff();
packet._BuffId = curBuffs;
packet.SendMsg();
}
#endregion
/// <summary>
/// 获得自身Buffer槽中的空槽位索引
/// </summary>
/// <returns>空位索引,当为 -1 表示已满</returns>
private int EmptyIndexOfOwn()
{
for(int i = 0; i < ownBuffers.Count; ++i)
{
if(ownBuffers[i].BuffInfo == null)
{
return i;
}
}
return -1;
}
public void Close()
{
ConfimBuffers();
this.gameObject.SetActive(false);
}
private void SetMask()
{
//for(int i = 0; i < ownBuffers.Count; ++i)
//{
// ownBuffers[i].SetMask(ownBuffers[i].BuffInfo == null);
//}
if(selOwnIndex == -1)
{
if(selNewIndex == -1)
{
for (int i = 0; i < newBuffers.Count; ++i)
{
newBuffers[i].SetMask(false);
}
}
else
{
for (int i = 0; i < newBuffers.Count; ++i)
{
if(selNewIndex == i)
{
newBuffers[i].SetMask(false);
newBuffers[i].Selected();
}
else
{
newBuffers[i].SetMask(true);
}
}
}
}
else
{
for (int i = 0; i < newBuffers.Count; ++i)
{
newBuffers[i].SetMask(true);
}
}
}
}