using System;
|
using LitJson;
|
|
using System.Collections.Generic;
|
using UnityEngine;
|
|
/// <summary>
|
/// 宝箱功能 + 获取奖励界面
|
/// </summary>
|
public class BoxGetItemModel : GameSystemManager<BoxGetItemModel>
|
{
|
|
List<string> commonShowAwardEvents = new List<string>(); //获取奖励的展示事件
|
|
public override void Init()
|
{
|
var config = FuncConfigConfig.Get("CommonShowAwards");
|
commonShowAwardEvents = JsonMapper.ToObject<List<string>>(config.Numerical1);
|
}
|
|
// void OnBeforePlayerDataInitialize()
|
// {
|
// getItems = null;
|
// getCoinsType = 0;
|
// getCoinsCnt = 0;
|
// }
|
|
#region 处理服务器数据
|
|
// public BoxGetItemInfo[] getItems { get; private set; }
|
// public int getCoinsType { get; private set; }
|
// public long getCoinsCnt { get; private set; }
|
// public event Action<int, int, BoxGetItemInfo[]> RefreshGetItemAct;
|
// public void SetGetBoxItemInfo(HA810_tagMCNotifyUseItemGetItem boxItemInfo)
|
// {
|
// getItems = JsonMapper.ToObject<BoxGetItemInfo[]>(boxItemInfo.GetItemData);
|
// getCoinsType = boxItemInfo.MoneyType;
|
// getCoinsCnt = boxItemInfo.MoneyCount;
|
// if (!NewBieCenter.Instance.inGuiding)
|
// {
|
// List<Item> items = new List<Item>();
|
// for (int i = 0; i < getItems.Length; i++)
|
// {
|
// BoxGetItemInfo info = getItems[i];
|
// Dictionary<int, List<int>> useDataDic = ConfigParse.Analysis(info.UserData);
|
// if (useDataDic != null && useDataDic.TryGetValue((int)ItemUseDataKey.itemCount, out List<int> list) && list != null && list.Count > 0)
|
// {
|
// int count = list[0];
|
// items.Add(new Item(info.ItemID, count));
|
// }
|
// else
|
// {
|
// items.Add(new Item(info.ItemID, info.Count));
|
// }
|
|
// }
|
// ItemLogicUtility.Instance.ShowGetItem(items, seconds: 0);
|
// }
|
|
// if (RefreshGetItemAct != null)
|
// {
|
// RefreshGetItemAct((int)boxItemInfo.UseItemID, (int)boxItemInfo.UseCount, getItems);
|
// }
|
|
|
// }
|
|
//获得奖励展示
|
public void ReceiveAwardNotify(HA801_tagMCGiveAwardInfo netPack)
|
{
|
var eventName = UIHelper.ServerStringTrim(netPack.EventName);
|
|
// 仙盟攻城战
|
// if (eventName == "FamilyGCZSQGrid" || eventName == "FamilyGCZSQPass" || eventName == "FamilyGCZSQPassAll" ||
|
// eventName == "FamilyGCZContiribution" || eventName == "FamilyGCZAtk")
|
// {
|
// ModelCenter.Instance.GetModel<FairySiegeActModel>()?.OnUpdateAwardInfoAction(netPack);
|
// return;
|
// }
|
// if (!commonShowAwardEvents.Contains(eventName))
|
// return;
|
if (string.IsNullOrEmpty(eventName))
|
{
|
Debug.Log("获得物品展示 无事件名");
|
return;
|
}
|
|
List<Item> showItems = new List<Item>();
|
|
if (netPack.Exp != 0 || netPack.ExpPoint != 0)
|
{
|
long expValue = netPack.Exp + netPack.ExpPoint * Constants.ExpPointValue;
|
showItems.Add(new Item(GeneralDefine.expDisplayId, expValue));
|
}
|
if (netPack.MoneyList.Length != 0)
|
{
|
for (int i = 0; i < netPack.MoneyLen; i++)
|
{
|
var moneyType = netPack.MoneyList[i].MoneyType;
|
if (GeneralDefine.moneyDisplayIds.ContainsKey(moneyType) && netPack.MoneyList[i].MoneyValue != 0)
|
{
|
showItems.Add(new Item(GeneralDefine.moneyDisplayIds[moneyType], netPack.MoneyList[i].MoneyValue));
|
}
|
|
}
|
}
|
|
if (netPack.ItemList.Length != 0)
|
{
|
for (int i = 0; i < netPack.ItemLen; i++)
|
{
|
showItems.Add(new Item((int)netPack.ItemList[i].ItemID,
|
netPack.ItemList[i].Count + netPack.ItemList[i].CountEx * Constants.ExpPointValue,
|
netPack.ItemList[i].IsBind));
|
}
|
}
|
|
|
string info = string.Empty;
|
if (LanguageConfig.HasKey("commonShowAwardEvents_" + eventName))
|
info = Language.Get("commonShowAwardEvents_" + eventName);
|
|
if (showItems.Count == 0)
|
return;
|
|
ItemLogicUtility.Instance.ShowGetItem(showItems, eventName);
|
}
|
|
// public int GetUseCntByID(int itemId)
|
// {
|
// return PackManager.Instance.GetItemUsedTimesToday(itemId);
|
// }
|
|
#endregion
|
|
// #region 消耗材料货币开启的宝箱
|
// public void SetModel(string guid, int itemId)
|
// {
|
// ChestsConfig chestsConfig = ChestsConfig.Get(itemId);
|
// this.guid = guid;
|
// this.itemId = itemId;
|
// if (guid == "" || chestsConfig == null) return;
|
|
// ItemConfig boxConfig = ItemConfig.Get(itemId);
|
// if (PlayerDatas.Instance.baseData.LV < boxConfig.UseLV)
|
// {
|
// ServerTipDetails.DisplayNormalTip(Language.Get("MakeUseItem101", boxConfig.UseLV));
|
// return;
|
// }
|
|
// CheckOpenBoxCondi(guid, itemId);
|
// }
|
|
// public void CheckOpenBoxCondi(string guid, int itemId, int useCnt = 1)
|
// {
|
// ChestsConfig chestsConfig = ChestsConfig.Get(itemId);
|
// if (chestsConfig == null) return;
|
|
// ItemConfig boxConfig = ItemConfig.Get(itemId);
|
|
// if (chestsConfig.ExpendItemID != 0)
|
// {
|
// ItemConfig itemConfig = ItemConfig.Get(chestsConfig.ExpendItemID);
|
// ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("OpenBoxTool", itemConfig.ItemName), (bool isOk) =>
|
// {
|
// if (isOk)
|
// {
|
// if (!IsEnoughTools(chestsConfig.ExpendItemID, chestsConfig.ExpendCount * useCnt))
|
// {
|
// SysNotifyMgr.Instance.ShowTip("OpenBoxToolNoEnough", itemConfig.ItemName);
|
// return;
|
// }
|
// else
|
// {
|
// CheckOpenMoney(chestsConfig, boxConfig, useCnt);
|
// }
|
// }
|
// });
|
// }
|
// else
|
// {
|
// CheckOpenMoney(chestsConfig, boxConfig, useCnt);
|
// }
|
// }
|
|
// public void CheckOpenMoney(ChestsConfig chestsConfig, ItemConfig boxConfig, int useCnt)
|
// {
|
// if (!IsEnoughMoney(chestsConfig.OpenMoney * useCnt))
|
// {
|
// SysNotifyMgr.Instance.ShowTip("BoxOpenCostMoney", 1);
|
// return;
|
// }
|
// else
|
// {
|
// if (chestsConfig.OpenMoney > 0)
|
// {
|
// ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("OpenBoxGold", chestsConfig.OpenMoney * useCnt), (bool isOk) =>
|
// {
|
// if (isOk)
|
// {
|
// CheckOtherCondi(chestsConfig, boxConfig, useCnt);
|
// }
|
// });
|
// }
|
// else
|
// {
|
// CheckOtherCondi(chestsConfig, boxConfig, useCnt);
|
// }
|
// }
|
// }
|
|
// public void CheckOtherCondi(ChestsConfig chestsConfig, ItemConfig boxConfig, int useCnt)
|
// {
|
|
// if (boxConfig.MaxSkillCnt > 0 && GetUseCntByID(itemId) >= boxConfig.MaxSkillCnt)
|
// {
|
// SysNotifyMgr.Instance.ShowTip("UseCntLimit");
|
// return;
|
// }
|
|
// if (IsSelectItemByID(itemId))
|
// {
|
// UIManager.Instance.OpenWindow<ChooseItemsWin>();
|
// return;
|
// }
|
|
// ItemLogicUtility.Instance.UseItem(guid, useCnt);
|
// }
|
|
// public bool CheckOpenBoxCondition(int itemId, out bool isBox)
|
// {
|
// isBox = false;
|
// ChestsConfig chestsConfig = ChestsConfig.Get(itemId);
|
// if (chestsConfig == null) return false;
|
|
// isBox = true;
|
// bool isCanOpen = true;
|
// ItemConfig boxConfig = ItemConfig.Get(itemId);
|
// if (PlayerDatas.Instance.baseData.LV < boxConfig.UseLV)
|
// {
|
// isCanOpen = false;
|
// return isCanOpen;
|
// }
|
|
// if (chestsConfig.ExpendItemID != 0)
|
// {
|
// ItemConfig itemConfig = ItemConfig.Get(chestsConfig.ExpendItemID);
|
// if (!IsEnoughTools(chestsConfig.ExpendItemID, chestsConfig.ExpendCount))
|
// {
|
// isCanOpen = false;
|
// return isCanOpen;
|
// }
|
// }
|
|
// if (!IsEnoughMoney(chestsConfig.OpenMoney))
|
// {
|
// isCanOpen = false;
|
// return isCanOpen;
|
// }
|
|
// if (boxConfig.MaxSkillCnt > 0 && GetUseCntByID(itemId) >= boxConfig.MaxSkillCnt)
|
// {
|
// isCanOpen = false;
|
// return isCanOpen;
|
// }
|
|
// return isCanOpen;
|
// }
|
|
// private bool IsEnoughMoney(int moneyCnt)
|
// {
|
// ulong haveMoney = UIHelper.GetMoneyCnt(1);
|
// if (haveMoney >= (ulong)moneyCnt)
|
// {
|
// return true;
|
// }
|
// else
|
// {
|
// return false;
|
// }
|
// }
|
|
// private bool IsEnoughTools(int itemId, int toolCnt)
|
// {
|
// int count = PackManager.Instance.GetItemCountByID(PackType.Item, itemId);
|
// if (count >= toolCnt)
|
// {
|
// return true;
|
// }
|
// else
|
// {
|
// return false;
|
// }
|
// }
|
// #endregion
|
|
//宝箱预览物品 (随机获得)
|
public List<Item> GetBoxItems(int boxID)
|
{
|
List<Item> itemIDs = new List<Item>();
|
|
if (ChestsAwardConfig.GetBoxType(boxID) == 0)
|
{
|
return itemIDs;
|
}
|
|
var config = ChestsAwardConfig.GetChestsAwardByID(boxID);
|
|
if (!string.IsNullOrEmpty(config.SelectList))
|
{
|
var selectlistDict = ConfigParse.GetDic<int, int>(config.SelectList);
|
foreach (var item in selectlistDict)
|
{
|
itemIDs.Add(new Item(item.Key, item.Value));
|
}
|
}
|
|
if (!string.IsNullOrEmpty(config.FixedItem))
|
{
|
var itemListDict = ConfigParse.GetDic<int, int>(config.FixedItem);
|
foreach (var item in itemListDict)
|
{
|
itemIDs.Add(new Item(item.Key, item.Value));
|
}
|
}
|
|
if (!string.IsNullOrEmpty(config.Probability1))
|
{
|
var arr = JsonMapper.ToObject(config.Probability1);
|
|
for (int i = 0; i < arr.Count; i++)
|
{
|
itemIDs.Add(new Item(int.Parse(arr[i][1][0].ToString()), long.Parse(arr[i][1][1].ToString())));
|
}
|
}
|
|
if (!string.IsNullOrEmpty(config.Probability2))
|
{
|
var arr = JsonMapper.ToObject(config.Probability2);
|
|
for (int i = 0; i < arr.Count; i++)
|
{
|
itemIDs.Add(new Item(int.Parse(arr[i][1][0].ToString()), long.Parse(arr[i][1][1].ToString())));
|
}
|
}
|
|
return itemIDs;
|
}
|
|
|
|
#region 自选物品宝箱
|
|
//<物品ID,数量> 用户选中物品字典
|
public Dictionary<int, ChooseItems> userChooseItemDict = new Dictionary<int, ChooseItems>();
|
public Action countChangeAction; //数量发生变化
|
|
public bool IsSelectItemByID(int boxId)
|
{
|
ChestsAwardConfig awardConfig = ChestsAwardConfig.GetChestsAwardByID(boxId);
|
if (string.IsNullOrEmpty(awardConfig.SelectList))
|
{
|
return false;
|
}
|
return true;
|
}
|
|
public int[][] GetSelectItemsByID(int boxId)
|
{
|
ChestsAwardConfig awardConfig = ChestsAwardConfig.GetChestsAwardByID(boxId);
|
if (string.IsNullOrEmpty(awardConfig.SelectList))
|
{
|
return null;
|
}
|
var arr = ConfigParse.GetArray2<int>(awardConfig.SelectList);
|
Array.Sort(arr, SortShowItem);
|
return arr;
|
}
|
|
int SortShowItem(int[] a, int[] b)
|
{
|
var itemConfig1 = ItemConfig.Get(a[0]);
|
var itemConfig2 = ItemConfig.Get(b[0]);
|
int quality1 = itemConfig1.ItemColor;
|
int quality2 = itemConfig2.ItemColor;
|
//品质高的排在前面
|
if (quality1 != quality2)
|
return quality2.CompareTo(quality1);
|
return itemConfig1.ID - itemConfig2.ID;
|
}
|
|
/// <summary>
|
/// 选择自选物品数量
|
/// </summary>
|
/// <param name="itemId">被选择物品的ID</param>
|
/// <param name="guid">宝箱的GUID</param>
|
/// <param name="extra"></param>
|
/// <param name="changeCnt">加减数量</param>
|
public void IncreaseUserChooseItemCount(int itemId, string guid, int extra, int changeCnt)
|
{
|
if (userChooseItemDict.ContainsKey(itemId))
|
{
|
userChooseItemDict[itemId].guid = guid;
|
userChooseItemDict[itemId].useCnt = userChooseItemDict[itemId].useCnt + changeCnt;
|
userChooseItemDict[itemId].extra = extra;
|
}
|
else
|
{
|
userChooseItemDict[itemId] = new ChooseItems() { guid = guid, useCnt = 1, 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 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 = PackManager.Instance.GetItemByGuid(guid);
|
if (itemModel == null)
|
return false;
|
|
for (int i = 0; i < resultChooseItemDict.Count; i++)
|
{
|
var item = PackManager.Instance.GetItemByGuid(resultChooseItemDict[i].guid);
|
if (item == null)
|
return false;
|
|
var error = 0;
|
if (!ItemLogicUtility.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;
|
}
|
|
|
|
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.HasKey(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();
|
}
|
|
public void ClearAll()
|
{
|
userChooseItemDict.Clear();
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
}
|
|
|
public class BoxGetItemInfo
|
{
|
public int ItemID;
|
public int Count;
|
public int IsBind;
|
public int IsSuite;
|
public string UserData;
|
}
|
|
public class ChooseItems
|
{
|
public string guid;
|
public int useCnt;
|
public int extra;
|
}
|