using System;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using vnxbqy.UI;
|
public class ChooseItems
|
{
|
public string guid;
|
public int useCnt;
|
public int extra;
|
}
|
|
public class ChooseItemsModel : Model
|
{
|
public int openBoxCount = 0; // 开启x个宝箱
|
public int boxChooseCount = 0; // 每个宝箱可以在列表中选择x个
|
public int totalItemCount = 0; // 总共能选x个材料
|
public int chooseKeyBoardItemId = 0; //当前键盘输入哪个ItemId的数量
|
public readonly int MaxBoxCount = 60000; //箱子单次使用上限,堆叠上限目前单次使用60000
|
//<物品ID,数量> 用户选中物品字典
|
public Dictionary<int, ChooseItems> userChooseItemDict = new Dictionary<int, ChooseItems>();
|
public Dictionary<int, int> showDict = new Dictionary<int, int>();
|
public Action countChangeAction; //数量发生变化
|
public Action openKeyBoardAction;
|
BoxGetItemModel boxModel { get { return ModelCenter.Instance.GetModel<BoxGetItemModel>(); } }
|
PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
|
public override void Init()
|
{
|
|
}
|
|
public override void UnInit()
|
{
|
|
}
|
|
public int GetAllOtherCount()
|
{
|
int count = 0;
|
List<int> list = new List<int>(userChooseItemDict.Keys);
|
for (int i = 0; i < list.Count; i++)
|
{
|
int itemId = list[i];
|
if (!ItemConfig.Has(itemId))
|
continue;
|
if (itemId == chooseKeyBoardItemId)
|
continue;
|
count += userChooseItemDict[itemId].useCnt;
|
}
|
return count;
|
}
|
|
public void TryKeyBoardWrite(int value)
|
{
|
ItemModel itemModel = packModel.GetItemByGuid(boxModel.guid);
|
if (itemModel == null)
|
return;
|
if (GetNowChooseItemCount() >= totalItemCount)
|
return;
|
if (GetAllOtherCount() + value > totalItemCount)
|
return;
|
UpdateUserChooseItemDict(boxModel.itemId, itemModel.guid, value, boxModel.itemId);
|
}
|
|
// isIncrease 为 true,useCnt +1
|
// isIncrease 为 false,useCnt -1
|
public void IncreaseUserChooseItemCount(int itemId, string guid, int extra, bool isIncrease)
|
{
|
if (userChooseItemDict.ContainsKey(itemId))
|
{
|
userChooseItemDict[itemId].guid = guid;
|
userChooseItemDict[itemId].useCnt = isIncrease ? userChooseItemDict[itemId].useCnt + 1 : userChooseItemDict[itemId].useCnt - 1;
|
userChooseItemDict[itemId].extra = extra;
|
}
|
else
|
{
|
userChooseItemDict[itemId] = new ChooseItems() { guid = guid, useCnt = 1, extra = extra };
|
}
|
countChangeAction?.Invoke();
|
}
|
|
public void UpdateUserChooseItemDict(int itemId, string guid, int useCnt, int extra)
|
{
|
if (userChooseItemDict.ContainsKey(itemId))
|
{
|
userChooseItemDict[itemId].guid = guid;
|
userChooseItemDict[itemId].useCnt = useCnt;
|
userChooseItemDict[itemId].extra = itemId;
|
}
|
else
|
{
|
userChooseItemDict[itemId] = new ChooseItems() { guid = guid, useCnt = useCnt, extra = extra };
|
}
|
countChangeAction?.Invoke();
|
}
|
|
|
//当前选择材料总数量
|
public int GetNowChooseItemCount()
|
{
|
int total = 0;
|
if (userChooseItemDict == null && userChooseItemDict.Count == 0)
|
return 0;
|
List<int> list = new List<int>(userChooseItemDict.Keys);
|
for (int i = 0; i < list.Count; i++)
|
total += userChooseItemDict[list[i]].useCnt;
|
return total;
|
}
|
|
public List<int> GetShowList()
|
{
|
List<int> showList = new List<int>(showDict.Keys);
|
showList.Sort(SortShowItem);
|
return showList;
|
}
|
|
int SortShowItem(int a, int b)
|
{
|
int quality1 = ItemConfig.Get(a).ItemColor;
|
int quality2 = ItemConfig.Get(b).ItemColor;
|
//品质高的排在前面
|
if (quality1 != quality2)
|
return quality2.CompareTo(quality1);
|
return 0;
|
}
|
|
public bool TrySendUse()
|
{
|
CA323_tagCMUseItems.tagCMUseItemsSelect[] chooseItemList = GetSendList(userChooseItemDict, out List<ChooseItems> resultChooseItemDict, out string guid, out int count);
|
//一个材料也没选
|
if (chooseItemList.Length < 1)
|
{
|
SysNotifyMgr.Instance.ShowTip("ChooseItems01");
|
return false;
|
}
|
|
var itemModel = packModel.GetItemByGuid(guid);
|
if (itemModel == null)
|
return false;
|
|
for (int i = 0; i < resultChooseItemDict.Count; i++)
|
{
|
var item = packModel.GetItemByGuid(resultChooseItemDict[i].guid);
|
if (item == null)
|
return false;
|
|
var error = 0;
|
if (!ItemOperateUtility.Instance.CanUseItem(resultChooseItemDict[i].guid, resultChooseItemDict[i].useCnt, out error))
|
{
|
switch (error)
|
{
|
case 1:
|
SysNotifyMgr.Instance.ShowTip("EverydayUseLimit");
|
break;
|
case 2:
|
SysNotifyMgr.Instance.ShowTip("UseCntLimit");
|
break;
|
case 3:
|
SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_749572");
|
break;
|
default:
|
break;
|
}
|
return false;
|
}
|
}
|
|
var useItem = new CA323_tagCMUseItems();
|
useItem.ItemIndex = (byte)itemModel.gridIndex;
|
useItem.UseCnt = (ushort)count;
|
useItem.ExData = (uint)0;
|
useItem.SelectCount = (byte)chooseItemList.Length;
|
useItem.SelectList = chooseItemList;
|
GameNetSystem.Instance.SendInfo(useItem);
|
return true;
|
}
|
|
void TryUseItem(string guid, int useCnt = 1, int extra = 0)
|
{
|
var item = packModel.GetItemByGuid(guid);
|
if (item == null)
|
return;
|
|
var error = 0;
|
if (!ItemOperateUtility.Instance.CanUseItem(guid, useCnt, out error))
|
{
|
switch (error)
|
{
|
case 1:
|
SysNotifyMgr.Instance.ShowTip("EverydayUseLimit");
|
break;
|
case 2:
|
SysNotifyMgr.Instance.ShowTip("UseCntLimit");
|
break;
|
case 3:
|
SysNotifyMgr.Instance.ShowTip("GeRen_chenxin_749572");
|
break;
|
default:
|
break;
|
}
|
return;
|
}
|
|
}
|
|
CA323_tagCMUseItems.tagCMUseItemsSelect[] GetSendList(Dictionary<int, ChooseItems> userChooseItemDict, out List<ChooseItems> resultChooseItemDict, out string guid, out int count)
|
{
|
guid = string.Empty;
|
count = 0;
|
resultChooseItemDict = new List<ChooseItems> { };
|
List<int> list = new List<int>(userChooseItemDict.Keys);
|
List<ChooseItems> result = new List<ChooseItems>();
|
for (int i = 0; i < list.Count; i++)
|
{
|
int itemId = list[i];
|
ChooseItems chooseItems = userChooseItemDict[itemId];
|
if (!ItemConfig.Has(itemId))
|
continue;
|
if (chooseItems == null || chooseItems.useCnt <= 0)
|
continue;
|
count += chooseItems.useCnt;
|
result.Add(chooseItems);
|
}
|
resultChooseItemDict = result;
|
if (!result.IsNullOrEmpty())
|
guid = result[0].guid;
|
|
List<CA323_tagCMUseItems.tagCMUseItemsSelect> tagCMUseItemsSelects = new List<CA323_tagCMUseItems.tagCMUseItemsSelect>();
|
for (int i = 0; i < result.Count; i++)
|
{
|
CA323_tagCMUseItems.tagCMUseItemsSelect temp = new CA323_tagCMUseItems.tagCMUseItemsSelect();
|
temp.SelectID = (uint)result[i].extra;
|
temp.SelectCnt = (ushort)result[i].useCnt;
|
tagCMUseItemsSelects.Add(temp);
|
}
|
|
return tagCMUseItemsSelects.ToArray();
|
}
|
|
void ClearAll()
|
{
|
openBoxCount = 0;
|
boxChooseCount = 0;
|
totalItemCount = 0;
|
userChooseItemDict.Clear();
|
showDict.Clear();
|
}
|
|
bool TryInitData()
|
{
|
ClearAll();
|
if (boxModel.selectDict == null)
|
return false;
|
List<int> selectList = new List<int>(boxModel.selectDict.Keys);
|
for (int i = 0; i < selectList.Count; i++)
|
{
|
int nowItemId = selectList[i];
|
if (!ItemConfig.Has(nowItemId))
|
continue;
|
ItemConfig config = ItemConfig.Get(nowItemId);
|
// 宝箱根据境界自选,如果展示的境界装备则全显示
|
if (config.LV == 1 && Math.Max(PlayerDatas.Instance.baseData.realmLevel + 4, 5) < config.RealmLimit)
|
continue;
|
showDict[nowItemId] = boxModel.selectDict[nowItemId];
|
}
|
return true;
|
}
|
|
public void OpenChooseItemsWin()
|
{
|
if (!TryInitData())
|
return;
|
this.openBoxCount = Mathf.Min(packModel.GetItemByGuid(boxModel.guid).count, MaxBoxCount);
|
if (this.openBoxCount < 1)
|
return;
|
this.boxChooseCount = 1;
|
totalItemCount = openBoxCount * boxChooseCount;
|
WindowCenter.Instance.Open<ChooseItemsWin>();
|
}
|
|
}
|
|