// ***********************************************************************
// Assembly : Unity
// Author : Kimch
// Created : 2019-05-20
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
using CodeStage.AntiCheat.ObscuredTypes;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace G
{
///
/// 背包系统
///
public partial class BagProxy : F.GameProxy
{
public enum BagPage
{
Bag = 0,
Equipment,
Props,
}
public const int CAPACITY_LIMIT = 100;
#region Fields
private readonly List _allEquipments = new List();
private readonly List _allProps = new List();
private readonly Dictionary> _props = new Dictionary>();
private readonly Dictionary> _gems = new Dictionary>();
private readonly Dictionary> _recastEquipments = new Dictionary>();
private ObscuredInt _bagCapacity = 80;
private bool _autoSell;
private bool[] _sellQualityFilters = new bool[Item.Quality.kMax + 1];
#endregion
#region Property
///
///
///
public bool autoSell
{
get { return _autoSell; }
set
{
if (_autoSell != value)
{
_autoSell = value;
SaveBag();
}
}
}
///
///
///
public bool[] sellQualityFilters
{
get => _sellQualityFilters;
set
{
if (value != null)
{
_sellQualityFilters = value;
SaveBag();
}
}
}
///
///
///
public int bagCapacity
{
get { return _bagCapacity; }
set
{
if (_bagCapacity != value)
{
_bagCapacity = Mathf.Min(value, CAPACITY_LIMIT);
SaveBag();
}
}
}
///
///
///
public bool isBagCapacityLimit
{
get { return _bagCapacity >= CAPACITY_LIMIT; }
}
#endregion
#region Method
///
///
///
///
public int GetRedPoint()
{
if (GetBagItemCount() >= GetBagItemCapacity() - 1)
{
return 1;
}
return 0;
}
///
///
///
///
///
public int GetBagItemCount(BagPage page = BagPage.Bag)
{
if (page == BagPage.Bag)
return ItemProxy.Instance.GetEquipmentCount() - PlayerProxy.Instance.GetValidEquipmentSlotCount();
else
return 0;
}
///
/// 背包容积
///
///
///
public int GetBagItemCapacity(BagPage page = BagPage.Bag)
{
if (page == BagPage.Bag)
return _bagCapacity;
else
return CAPACITY_LIMIT;
}
///
/// 背包已满
///
///
public bool BagIsFull()
{
AutoSell();
return GetBagItemCount() >= GetBagItemCapacity();
}
///
/// 无法创建装备
///
///
public bool BagIsFullLimit()
{
return GetBagItemCount() >= CAPACITY_LIMIT;
}
///
///
///
///
///
public List GetBagEquipments(int sortMode = 0)
{
_allEquipments.Clear();
var equipments = ItemProxy.Instance.GetEquipments();
foreach (var equipment in equipments)
{
if (!PlayerProxy.Instance.IsSetEquipment(equipment))
_allEquipments.Add(equipment);
}
if (sortMode == 2)
_allEquipments.Sort(EntityItemEquipment.SortByQuality);
else
_allEquipments.Sort(EntityItemEquipment.SortByGrade);
return _allEquipments;
}
///
///
///
///
public List GetRecastEquipments()
{
_allEquipments.Clear();
var equipments = ItemProxy.Instance.GetEquipments();
int quality = Item.Quality.kYellow;
foreach (var equipment in equipments)
{
if (equipment.quality >= quality && !equipment.isLock && !equipment.isEquip)
_allEquipments.Add(equipment);
}
_allEquipments.Sort(EntityItemEquipment.SortByGrade);
return _allEquipments;
}
///
/// 获取背包道具
///
///
public List GetBagProps()
{
_allProps.Clear();
var props = GetPropsByType();
foreach (var propList in props.Values)
{
for (int i = 0; i < propList.Count; i++)
{
if (propList[i].count > 0)
_allProps.Add(propList[i]);
}
}
var gems = GetGemsBySlot();
foreach (var gemList in gems.Values)
{
for (int i = gemList.Count - 1; i >= 0; i--)
{
if (gemList[i].count > 0)
_allProps.Add(gemList[i]);
}
}
return _allProps;
}
///
///
///
///
///
public EntityItemEquipment NewEquipment(int itemId)
{
if (ItemProxy.Instance.GetEquipmentCount() < 160)
return ItemProxy.Instance.NewEquipment(itemId);
return null;
}
///
///
///
public void AutoSell()
{
if (_autoSell)
OneKeySellEquipments(_sellQualityFilters, 0);
}
///
///
///
///
///
public bool Sell(EntityItem a)
{
if (a != null)
{
var price = a.propItem.sellPriceInfo;
int addMoneyAmout = (int)(price.count * (GlobalVar.PropSellAddition + 1f));
if (price.id > 0)
{
MoneyProxy.Instance.AddMoney(price.id, addMoneyAmout);
}
ItemProxy.Instance.RemoveEntityItem(a);
MissionProxy.Instance.OnEvent(MissionProxy.装备累计回收_数量, 1);
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
PostNotification(GlobalDefine.EVENT_EQUIPMENT_SELL, (price.id == Item.Id.kChip ? "晶石 x" : "晶珀石 x") + addMoneyAmout.ToString(), "sell");
return true;
}
return false;
}
///
///
///
///
///
public int OneKeySellEquipments(bool[] qualityFilters, int gradeFilter)
{
_allEquipments.Clear();
//int gradeScreen = PlayerProxy.Instance.grade + gradeFilter;
var equipments = ItemProxy.Instance.GetEquipments();
foreach (var equipment in equipments)
{
if (!equipment.isLock && !PlayerProxy.Instance.IsSetEquipment(equipment) && qualityFilters[equipment.quality] /*&& equipment.propLevel <= gradeScreen*/)
_allEquipments.Add(equipment);
}
//int addMoneyId = 0;
int addMoneyAmout = 0;
int addMoneyAmout2 = 0;
foreach (var equipment in _allEquipments)
{
var price = equipment.propItem.sellPriceInfo;
if (price.id > 0)
{
//addMoneyId = price.id;
if (price.id == Item.Id.kChip)
addMoneyAmout += price.count;
else
addMoneyAmout2 += price.count;
}
ItemProxy.Instance.RemoveEntityItem(equipment);
}
MissionProxy.Instance.OnEvent(MissionProxy.装备累计回收_数量, _allEquipments.Count);
_allEquipments.Clear();
if (addMoneyAmout > 0)
{
addMoneyAmout += (int)(addMoneyAmout * GlobalVar.PropSellAddition);
MoneyProxy.Instance.AddMoney(Item.Id.kChip, addMoneyAmout);
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
PostNotification(GlobalDefine.EVENT_EQUIPMENT_SELL, "晶石 x" + addMoneyAmout.ToString(), "onekeysell");
}
if (addMoneyAmout2 > 0)
{
addMoneyAmout2 += (int)(addMoneyAmout2 * GlobalVar.PropSellAddition);
MoneyProxy.Instance.AddMoney(Item.Id.kChip2, addMoneyAmout2);
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
PostNotification(GlobalDefine.EVENT_EQUIPMENT_SELL, "晶珀石 x" + addMoneyAmout2.ToString(), "onekeysell");
}
return addMoneyAmout + addMoneyAmout2;
}
///
///
///
///
public int OneKeySellEquipments()
{
_allEquipments.Clear();
var equipments = ItemProxy.Instance.GetEquipments();
foreach (var equipment in equipments)
{
if (!equipment.isLock && !PlayerProxy.Instance.IsSetEquipment(equipment))
_allEquipments.Add(equipment);
}
//int addMoneyId = 0;
int addMoneyAmout = 0;
int addMoneyAmout2 = 0;
foreach (var equipment in _allEquipments)
{
var price = equipment.propItem.sellPriceInfo;
if (price.id > 0)
{
//addMoneyId = price.id;
if (price.id == Item.Id.kChip)
addMoneyAmout += price.count;
else
addMoneyAmout2 += price.count;
}
ItemProxy.Instance.RemoveEntityItem(equipment);
}
MissionProxy.Instance.OnEvent(MissionProxy.装备累计回收_数量, _allEquipments.Count);
_allEquipments.Clear();
if (addMoneyAmout > 0)
{
addMoneyAmout += (int)(addMoneyAmout * GlobalVar.PropSellAddition);
MoneyProxy.Instance.AddMoney(Item.Id.kChip, addMoneyAmout);
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
PostNotification(GlobalDefine.EVENT_EQUIPMENT_SELL, "晶石 x" + addMoneyAmout.ToString(), "onekeysell");
}
if (addMoneyAmout2 > 0)
{
addMoneyAmout2 += (int)(addMoneyAmout2 * GlobalVar.PropSellAddition);
MoneyProxy.Instance.AddMoney(Item.Id.kChip2, addMoneyAmout2);
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
PostNotification(GlobalDefine.EVENT_EQUIPMENT_SELL, "晶珀 x" + addMoneyAmout2.ToString(), "onekeysell");
}
return addMoneyAmout + addMoneyAmout2;
}
///
///
///
public void OneKeySetEquipments()
{
var bagEquipments = GetBagEquipments();
//int pLv = PlayerProxy.Instance.grade;
var equipments = new EntityItemEquipment[(int)Item.EquipmentType.kMax];
for (int i = 0; i < equipments.Length; i++)
{
equipments[i] = PlayerProxy.Instance.GetCurEquipment(i);
}
//
foreach (var equipment in bagEquipments)
{
//if (pLv >= equipment.propLevel)
//{
var type = equipment.equipmentType;
if (equipments[type] == null || equipments[type].combatValue < equipment.combatValue)
equipments[type] = equipment;
//}
}
bool change = false;
for (int i = 0; i < equipments.Length; i++)
{
if (equipments[i] != PlayerProxy.Instance.GetCurEquipment(i))
{
change = true;
break;
}
}
if (change)
{
PlayerProxy.Instance.SetEquipments(equipments);
}
else
{
PostNotification(GlobalDefine.EVENT_SHOW_TOAST, "没有可穿戴装备");
}
}
///
///
///
///
public Dictionary> GetPropsByType()
{
if (_props.Count == 0)
{
var props = ItemProxy.Instance.GetProps();
foreach (var prop in props)
{
var propKey = prop.item.type;
if (_props.TryGetValue(propKey, out var list))
{
list.Add(prop);
}
else
{
_props.Add(propKey, new List { prop });
}
}
}
return _props;
}
///
///
///
/// 按等级顺序排列
public Dictionary> GetGemsBySlot()
{
if (_gems.Count == 0)
{
var gems = ItemProxy.Instance.GetGems();
foreach (var gem in gems)
{
int gemKey = gem.item.slot;
if (_gems.TryGetValue(gemKey, out var list))
{
list.Add(gem);
}
else
{
_gems.Add(gemKey, new List(10) { gem });
}
}
//foreach (var gemList in _gemHelper.Values)
//{
// gemList.Sort((a, b) =>
// {
// return a.level.CompareTo(b.level);
// });
//}
}
return _gems;
}
///
/// 宝石升级
///
///
public bool GemUpgrade(EntityItemGem gem)
{
if (gem != null)
{
return gem.Upgrade() != null;
}
return false;
}
///
///
///
///
///
public Item.ItemInfo CalcOneKeyGemUpgradeCost(bool[] typeFilters)
{
Item.ItemInfo result = default;
var gems = GetGemsBySlot();
foreach (var gemKV in gems)
{
if (typeFilters[gemKV.Key])
{
var gemList = gemKV.Value;
for (int i = 0; i < gemList.Count; i++)
{
var gem = gemList[i];
if (gem.count >= 2)
{
var cost = gem.GetUpdgradeCost();
if (cost.id > 0)
{
result.id = cost.id;
result.count += cost.count;
}
}
}
}
}
return result;
}
///
/// 宝石升级
///
///
public bool GemOneKeyUpgrade(bool[] typeFilters)
{
var upCost = CalcOneKeyGemUpgradeCost(typeFilters);
if (!MoneyProxy.Instance.CheckAndCostMoney(upCost, GlobalDefine.COST_MONEY_UPGRADE_GEM))
{
return false;
}
var resultList = F.ListPool.Get();
var gems = GetGemsBySlot();
foreach (var gemKV in gems)
{
if (typeFilters[gemKV.Key])
{
var gemList = gemKV.Value;
for (int i = 0; i < gemList.Count; i++)
{
var gem = gemList[i];
if (gem.count >= 2)
{
var upResult = gem.Upgrade();
if (upResult != null)
{
resultList.Add(upResult);
}
}
}
}
}
bool flag = false;
if (resultList.Count > 0)
{
flag = true;
var newGems = F.ListPool.Get();
for (int i = 0; i < resultList.Count; i++)
{
int gemCount = resultList[i].count;
if (gemCount > 0)
{
newGems.Add(new Item.ItemInfo
{
id = resultList[i].itemId,
count = 1,
});
}
}
UI.RewardWindow.ShowRewards(newGems, null);
F.ListPool.Release(newGems);
PostNotification(GlobalDefine.EVENT_GEM_CHANGED, null, "up_gem");
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED, null, "up_gem");
}
F.ListPool.Release(resultList);
return flag;
}
///
/// 一键镶嵌
///
///
///
public bool OneKeySetGems(int maxGemCount = 3)
{
var gems = GetGemsBySlot();
return PlayerProxy.Instance.SetGems(gems);
}
///
///
///
///
///
///
public EntityItemEquipment RacastEquipments(EntityItemEquipment a, EntityItemEquipment b)
{
if (_recastEquipments.Count == 0)
{
var props = ItemProxy.Instance.GetStaticItems();
foreach (var prop in props)
{
if (prop.quality == 6 && prop.isWeaponOrEquipment)
{
var item = ItemProxy.Instance.GetStaticItem(prop.id);
if (_recastEquipments.TryGetValue(prop.level, out var list))
{
list.Add(item);
}
else
{
_recastEquipments.Add(prop.level, new List { item });
}
}
}
}
EntityItemEquipment result = null;
if (a != null && b != null && a.propLevel == b.propLevel)
{
ItemProxy.Instance.RemoveEquipment(a);
ItemProxy.Instance.RemoveEquipment(b);
if (RandomProxy.Instance.GetRandom(RandomProxy.RACAST_RATE_ID + a.propLevel) && _recastEquipments.TryGetValue(a.propLevel, out var list))
{
var aType = a.item.type;
var bType = b.item.type;
int aId = 0;
int bId = 0;
for (int i = 0; i < list.Count; i++)
{
var item = list[i];
if (item.type == aType)
{
if (aId == 0 || (item.type == 0 && item.subType == a.item.subType))
aId = item.id;
}
else if (item.type == bType)
{
if (bId == 0 || (item.type == 0 && item.subType == b.item.subType))
bId = item.id;
}
}
if (aId > 0 && bId > 0)
result = ItemProxy.Instance.NewEquipment(Random.value < 0.5f ? aId : bId);
else if (aId > 0)
result = ItemProxy.Instance.NewEquipment(aId);
else if (bId > 0)
result = ItemProxy.Instance.NewEquipment(bId);
}
else
{
result = ItemProxy.Instance.NewEquipment(Random.value < 0.5f ? a.itemId : b.itemId);
}
if (result != null)
{
MissionProxy.Instance.OnEvent(MissionProxy.装备累计重铸_次数);
}
return result;
}
return result;
}
#endregion
#region Proxy
const string ARCHIVE_KEY_V1 = "bag_V1";
const string ARCHIVE_KEY_V2 = "bag_v2";
void InitBag()
{
_bagCapacity = GlobalProxy.Instance.GetInt("bag_max");
_autoSell = false;
for (int i = 0; i < _sellQualityFilters.Length; i++)
{
_sellQualityFilters[i] = i < 4;
}
}
void LoadBag()
{
var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V2);
if (dataList != null && dataList.Count > 0)
{
_bagCapacity = dataList[0];
_autoSell = dataList[1] != 0;
int filter = dataList[2];
for (int i = 0; i < _sellQualityFilters.Length; i++)
{
_sellQualityFilters[i] = (filter & (1 << i)) != 0;
}
return;
}
dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (dataList != null && dataList.Count > 0)
{
_autoSell = dataList[0] != 0;
int filter = dataList[1];
for (int i = 0; i < _sellQualityFilters.Length; i++)
{
_sellQualityFilters[i] = (filter & (1 << i)) != 0;
}
ArchiveProxy.Instance.RemoveIntList(ARCHIVE_KEY_V1);
}
}
///
///
///
void SaveBag()
{
var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V2);
if (dataList != null)
{
dataList.Clear();
dataList.Add(_bagCapacity);
dataList.Add(autoSell ? 1 : 0);
int sellFilter = 0;
for (int i = 0; i < _sellQualityFilters.Length; i++)
{
if (_sellQualityFilters[i])
sellFilter |= (1 << i);
}
dataList.Add(sellFilter);
ArchiveProxy.Instance.SetIntList(ARCHIVE_KEY_V2, dataList);
}
}
public static BagProxy Instance => GetInstance();
public override void ReadArchive()
{
InitBag();
LoadBag();
}
#endregion
}
}