using asap.core;
// using Assets.Scripts.UI.OfferSweep;
using cfg;
using game;
using LitJson;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace GameCore
{
public class PlayerData
{
private cfg.Tables _tables;
public PlayerData(cfg.Tables tables)
{
this._tables = tables;
// _MMService = mmService;
}
public const string Gold = "Gold";
///
/// "Diamond"==>"Pearl"(不改名是因为数据已经通过Diamond键存储到云端了)
///
public const string Pearl = "Diamond";
public const string RodLevel = "RodLevel";
public const string WeightScore = "WeightScore";
public const string Diamond = "DiamondTrue";
Dictionary NewPlayerDataDic = new Dictionary();
public IReadOnlyDictionary PlayerDataDic => NewPlayerDataDic;
public int lv { get; set; }
public int vip { get; private set; }
public int vipAllScore { get; private set; }
public int vipLastScore { get; private set; }
Dictionary vipScoreDic = new Dictionary();
#region 付费积分
public int PriceLv { get; private set; }
public VipLevel priceLevel;
#endregion 付费积分
private int energy;
int energyRM;
public ulong gold { get; private set; }
ulong goldRM;
public int pearl { get; private set; }
public int diamond { get; private set; }
public int equipRodID = 10001;
public int magnification;
public int seasonId = 0;
public int rewardNewMap = 0;
bool IsOpenAppraise = false;
int _currentMapId = 0;
public string InfiniteBuildingData = "0";
public string InfiniteBuildingLevel => InfiniteBuildingData.Split(',')[0];
public int currentMapId
{
set { _currentMapId = value; }
get
{
if (_currentMapId == 0 || !_tables.TbMapData.DataMap.ContainsKey(_currentMapId))
{
_currentMapId = _tables.TbMapData.DataList[0].ID;
}
//if (_TestService.TestMapIDs != null)
//{
// var ab = _TestService.TestMapIDs.FirstOrDefault(a => a.OldID == _currentMapId);
// return ab != null ? ab.NewID : _currentMapId;
//}
return _currentMapId;
}
}
//膨胀系数
public float InflationRate { get; private set; }
int _lastMapId = 0;
public int lastMapId
{
set { _lastMapId = value; }
get
{
if (_lastMapId == 0)
{
_lastMapId = _tables.TbMapData.DataList[0].ID;
}
//if (_TestService.TestMapIDs != null)
//{
// var ab = _TestService.TestMapIDs.FirstOrDefault(a => a.OldID == _lastMapId);
// return ab != null ? ab.NewID : _lastMapId;
//}
return _lastMapId;
}
}
public int _fishingFrequency = 0;
public int _allFishingFrequency = 0;
public List newRodList = new List();
public List showNewRodList = new List();
bool addShowNewRod = true;
public float benefitsCashMag { get; private set; }
public float benefitsCashMagLimited { get; private set; }
public int benefitsEnergyLimit { get; private set; }
public int benefitsEnergyRecover { get; private set; }
public float benefitsEventFishCashMag { get; private set; }
public float benefitsEventFishDamage { get; private set; }
public int benefitsAquariumLimit { get; private set; }
public float benefitsAquariumCashMag { get; private set; }
public List benefitsLevel;
public int OpenGradeID = 0;
public bool OpenGrade = false;
public int MagnificationCount
{
get
{
List DataList = _tables.TbEnergyDef.DataList;
var buffTimeData = GContext.container.Resolve().GetWeelyBuffTimeData();
bool isSuperEnergy = buffTimeData != null;
for (int i = 0; i < DataList.Count; i++)
{
int demandEnergy = DataList[i].Energy;
if (isSuperEnergy)
{
demandEnergy = DataList[i].FishBuffEnergy;
}
if (demandEnergy < 0 || Energy < demandEnergy)
{
return i;
}
}
return DataList.Count;
}
}
public Account nextAccountData;
public bool IsOpenMagnification = false;
public int GetCurMaxMagnification()
{
var buffTimeData = GContext.container.Resolve().GetWeelyBuffTimeData();
bool isSuperEnergy = buffTimeData != null;
List DataList = _tables.TbEnergyDef.DataList;
for (int i = DataList.Count - 1; i >= 0; i--)
{
int demandEnergy = DataList[i].Energy;
if (isSuperEnergy)
{
demandEnergy = DataList[i].FishBuffEnergy;
}
if (demandEnergy >= 0)
{
if (Energy >= demandEnergy)
{
return i;
}
}
}
return 0;
}
public void SaveFishingFrequency()
{
_fishingFrequency++;
GContext.Publish(new ExchangeFishCount(_fishingFrequency));
_allFishingFrequency += GContext.container.Resolve().GetMagnification();
GContext.Publish(new ConditionTypeEvent(ConditionType.GetFishCount, 1));
SavePlayerData();
}
///
/// buff 过期
///
public void CheckSuperEnergyBuff()
{
List DataList = _tables.TbEnergyDef.DataList;
for (int i = DataList.Count - 1; i >= 0; i--)
{
if (DataList[i].Energy >= 0)
{
if (i < magnification)
{
magnification = i;
SetMagnification();
}
return;
}
}
}
public int Energy
{
get => energy;
private set { SetEnergy(value); }
}
int RecoverNotificationID = 1002;
public int MaxEnergy => benefitsEnergyLimit;
public int EnergyRecover => benefitsEnergyRecover;
DateTime _lastEnergyRecoveryTime = ZZTimeHelper.UtcNow();
public void SetEnergy(int count, bool remote = true)
{
if (count < 0)
{
count = 0;
}
if (count < energy)
{
energyRM += energy - count;
}
energy = count;
if (energy >= MaxEnergy)
{
GContext.container.Resolve().ClearNotification(RecoverNotificationID);
}
SavePlayerData(remote);
}
public int GetEnergyRM()
{
return energyRM;
}
public void AddGold(ulong count)
{
SetGold(gold + count);
}
public void SetGold(ulong count)
{
if (count < gold)
{
goldRM += gold - count;
}
gold = count;
SavePlayerData();
}
public void SetPearl(int count)
{
if (count < 0)
{
count = 0;
}
pearl = count;
SavePlayerData();
GContext.container.Resolve().CheckAllRodUpLevel();
}
public void AddDiamond(int count)
{
var newCount = diamond + count;
if (newCount < 0)
{
newCount = 0;
}
diamond = newCount;
if (count < 0)
{
GContext.Publish(new ConditionTypeEvent { type = ConditionType.ConsumeDiamondCount, count = -count });
GContext.Publish(new ResAddEvent(1005));
}
SavePlayerData();
}
public void SetEquipRodID(int ID)
{
equipRodID = ID;
GContext.container.Resolve().SetRedPoint();
SavePlayerData();
}
public void SetMagnification()
{
SavePlayerData();
}
public void AddNewMap(int index)
{
rewardNewMap |= 1 << index;
}
public void RewardNewMap(int index)
{
int newMap = 1 << index;
rewardNewMap &= ~newMap;
SavePlayerData();
}
public bool IsNewMap(int index)
{
int newMap = 1 << index;
return (rewardNewMap & newMap) == newMap;
}
public void AddNewRod(int id)
{
if (!newRodList.Contains(id))
{
newRodList.Add(id);
PlayFabMgr.Instance.UpdateUserDataValue("NewRodList", JsonMapper.ToJson(newRodList));
if (addShowNewRod)
{
showNewRodList.Add(id);
}
}
}
public void StartAddNewRod()
{
addShowNewRod = true;
}
public void ShowNewRod()
{
//addShowNewRod = false;
if (showNewRodList.Count > 0)
{
List itemDatas = new List();
for (int i = 0; i < showNewRodList.Count; i++)
{
itemDatas.Add(new ItemData { id = showNewRodList[i], count = 1 });
}
GContext.Publish(new ShowData(itemDatas, RewardType.NewRod));
showNewRodList.Clear();
}
}
public void RewardNewRod(int id)
{
newRodList.Remove(id);
PlayFabMgr.Instance.UpdateUserDataValue("NewRodList", JsonMapper.ToJson(newRodList));
GContext.container.Resolve().SetRedPoint();
}
public bool IsNewRod(int id)
{
return newRodList.Contains(id);
}
public void SetLv(int count)
{
int addLevel = count - lv;
lv = count;
#if AGG
GEvent.SetProp("building_times", count);
GEvent.SetUserProp("building_times", count);
#endif
GContext.Publish(new ConditionTypeEvent(ConditionType.AccountLevel, addLevel));
GContext.Publish(new ConditionTypeEvent(ConditionType.ConstructionCount, addLevel));
OnLvChange();
SavePlayerData();
GContext.container.Resolve().AwaitSetLvData();
}
//等级改变的时候
public void OnLvChange()
{
var account = _tables.TbAccount.DataList;
nextAccountData = account[^1];
Account curAccountData = null;
for (int i = 0; i < account.Count; i++)
{
if (lv < account[i].ID)
{
nextAccountData = account[i];
break;
}
else
{
curAccountData = account[i];
}
}
SetBenefits(curAccountData);
//解锁地图
int unLockIndex = 0;
var dataList = _tables.TbMapData.DataList;
var mapData = dataList[^1];
int count = dataList.Count;
InflationRate = 0;
for (int i = 0; i < count; i++)
{
if (lv < dataList[i].LevelRequired)
{
unLockIndex = i;
mapData = dataList[i];
break;
}
//计算膨胀系数
InflationRate = dataList[i].LureScalePercent / 100;
}
int newMapId = mapData.ID;
if (lastMapId != newMapId)
{
lastMapId = newMapId;
LoadNewMap();
#if AGG
using (var e = GEvent.GameEvent("open_new"))
{
e.AddContent("open_type", 1)
.AddContent("map_id", lastMapId);
}
#endif
if (unLockIndex > 0)
{
AddNewMap(unLockIndex);
}
}
GContext.Publish(new OnLvChangeEvent() { lvl = lv });
if (lv >= _tables.TbGlobalConfig.NotPopUpUnlockLevel
&& GContext.container.Resolve().CheckRequestPermission())
{
GContext.container.Resolve().AddFaceCustomUIData(new UIType("SettingNotificationsGradePopupPanel"));
}
}
void SetBenefits(Account curAccountData)
{
int levelCashMag = 0;
int levelCashMagLimited = 0;
int levelEnergyLimit = 0;
int levelEnergyRecover = 0;
int levelEventFishCashMag = 0;
int levelEventFishDamage = 0;
int levelAquariumLimit = 0;
int levelAquariumCashMag = 0;
if (curAccountData != null)
{
levelCashMag = curAccountData.CashMag;
levelCashMagLimited = curAccountData.CashMagLimited;
levelEnergyLimit = curAccountData.EnergyLimit;
levelEnergyRecover = curAccountData.EnergyRecover;
levelEventFishCashMag = curAccountData.EventFishCashMag;
levelEventFishDamage = curAccountData.EventFishDamage;
levelAquariumLimit = curAccountData.AquariumLimit;
levelAquariumCashMag = curAccountData.AquariumCashMag;
}
benefitsLevel = new List
{
levelCashMag,
levelCashMagLimited,
levelEnergyLimit,
levelEnergyRecover,
levelEventFishCashMag,
levelEventFishDamage,
levelAquariumLimit,
levelAquariumCashMag,
};
var TbBenefits = _tables.TbBenefits;
benefitsCashMag = TbBenefits.GetOrDefault(1).BenefitsValue[levelCashMag];
benefitsCashMagLimited = TbBenefits.GetOrDefault(2).BenefitsValue[levelCashMagLimited];
benefitsEnergyLimit = Mathf.RoundToInt(TbBenefits.GetOrDefault(3).BenefitsValue[levelEnergyLimit]);
benefitsEnergyRecover = Mathf.RoundToInt(TbBenefits.GetOrDefault(4).BenefitsValue[levelEnergyRecover]);
benefitsEventFishCashMag = TbBenefits.GetOrDefault(5).BenefitsValue[levelEventFishCashMag];
benefitsEventFishDamage = TbBenefits.GetOrDefault(6).BenefitsValue[levelEventFishDamage];
benefitsAquariumLimit = Mathf.RoundToInt(TbBenefits.GetOrDefault(7).BenefitsValue[levelAquariumLimit]);
benefitsAquariumCashMag = TbBenefits.GetOrDefault(8).BenefitsValue[levelAquariumCashMag];
}
public void LoadNewMap()
{
ILoadResourceService loadResourceService = GContext.container.Resolve();
var mapData = _tables.TbMapData.GetOrDefault(lastMapId);
if (mapData != null && mapData.DownloadPkg != null && mapData.DownloadPkg.Count > 0)
{
var fishList = _tables.TbAquariumConfig.AquariumSpFishList;
List strings = new List();
foreach (var fish in fishList)
{
var item = _tables.TbItem.GetOrDefault(fish);
var fishData = _tables.TbFishData.GetOrDefault(item.RedirectID);
if (item != null && !string.IsNullOrEmpty(fishData.Fbx))
{
strings.Add(fishData.Fbx);
}
}
strings.AddRange(mapData.DownloadPkg);
strings.Add("entermap");
loadResourceService.EnqueueBundleSilently(strings);
}
}
public MapData GetCurrentMapData()
{
return _tables.TbMapData.GetOrDefault(currentMapId);
}
public bool MapIsUnlock(List Param)
{
return Param.Contains(lastMapId.ToString());
}
public void SetCurrentMapId(int id)
{
currentMapId = id;
SavePlayerData();
}
public void AddVIPScore(int count, bool isBuy = false)
{
UpdateVIPScoreDic();
vipAllScore += count;
if (vipScoreDic.ContainsKey(0))
{
vipScoreDic[0] += count;
}
else
{
vipScoreDic[0] = count;
}
#if AGG
using (var e = GEvent.GameEvent("getpoint_vip"))
{
e.AddContent("add_count", count).AddContent("all_count", vipAllScore);
}
#endif
VipChange();
SavePlayerData();
}
void VipChange()
{
vipLastScore = vipScoreDic.Where(_ => _.Key >= 0 && _.Key < 10).Select(_ => _.Value).Sum();
SetVIP();
}
public void SetPriceLevel(int level)
{
priceLevel = _tables.TbVipLevel.GetOrDefault(level);
var dynamicVipParam = _tables.TbGlobalConfig.DynamicVipParam;
vipAllScore = 0;
vipScoreDic.Clear();
vipScoreDic[0] = level == 0 ? 0 : (int)(priceLevel.LevelScore / dynamicVipParam[1]) + 1;
VipChange();
}
void SetVIP()
{
int LevelScore = 0;
//设置vip等级
var vipData = _tables.TbVipLevel.DataList;
PriceLv = vip = vipData.Count - 1;
//付费等级=f1(vip积分,地区积分)+f2(活跃积分)
var dynamicVipParam = _tables.TbGlobalConfig.DynamicVipParam;
int allPackPoints = (int)(vipAllScore * dynamicVipParam[0] + vipLastScore * dynamicVipParam[1]);
for (int i = 0; i < vipData.Count; i++)
{
LevelScore += vipData[i].LevelScore;
if (i < vip && vipAllScore < LevelScore)
{
vip = i;
}
if (i < PriceLv && allPackPoints < LevelScore)
{
PriceLv = i;
}
}
int dynamicVipLifeTime = _tables.TbGlobalConfig.DynamicVipLifeTime;
var userService = GContext.container.Resolve();
//注册时间
var register_days = (ZZTimeHelper.UtcNow() - userService.CreateTime).TotalSeconds;
if (register_days < dynamicVipLifeTime)
{
PriceLv = vip;
}
priceLevel = vipData[PriceLv];
#if AGG
GEvent.SetProp("Dynamic_Vip_Level", PriceLv);
GEvent.SetUserProp("Dynamic_Vip_Level", PriceLv);
GEvent.SetProp("vip_level", vip);
GEvent.SetUserProp("vip_level", vip);
#endif
}
public void LoadPlayerData(Dictionary userDatas)
{
lv = 1;
gold = (ulong)_tables.TbGlobalConfig.InitCash;
vipAllScore = 0;
vipLastScore = 0;
energy = _tables.TbGlobalConfig.InitEnergy;
pearl = _tables.TbGlobalConfig.InitResin;
magnification = 0;
equipRodID = _tables.TbGlobalConfig.InitRodID;
_lastEnergyRecoveryTime = ZZTimeHelper.UtcNow();
rewardNewMap = 0b1;
GContext.container.Resolve().InitData(userDatas);
if (userDatas == null || userDatas.Count < 1)
{
GameDebug.Log(
"[PlayerData]LoadPlayerData: No player data in User Data, initializing with default values");
}
else
{
GameDebug.Log("[PlayerData]LoadPlayerData: Load Player data from User Data");
GContext.container.Resolve().InitData(userDatas);
GContext.container.Resolve().InitData(userDatas);
GContext.container.Resolve().InitData(userDatas);
GContext.container.Resolve().InitData(userDatas);
var etor = userDatas.GetEnumerator();
while (etor.MoveNext())
{
var data_key = etor.Current.Key;
var data_value = etor.Current.Value;
switch (data_key)
{
#region 旧数据兼容
case "Lv":
lv = GlobalUtils.TryParseInt(data_value);
break;
case "Energy":
energy = GlobalUtils.TryParseInt(data_value, _tables.TbGlobalConfig.InitEnergy);
if (energy < 0)
{
energy = 0;
}
break;
case "EnergyRM":
energyRM = GlobalUtils.TryParseInt(data_value, 0);
break;
case "Gold":
gold = GlobalUtils.TryParseUlong(data_value, (ulong)_tables.TbGlobalConfig.InitCash);
break;
case "GoldRM":
goldRM = GlobalUtils.TryParseUlong(data_value, 0);
break;
case Pearl:
pearl = GlobalUtils.TryParseInt(data_value, 0);
break;
case Diamond:
diamond = GlobalUtils.TryParseInt(data_value, 0);
break;
case "Magnification":
magnification = GlobalUtils.TryParseInt(data_value);
break;
case "EquipRodID":
equipRodID = GlobalUtils.TryParseInt(data_value);
if (!_tables.TbRodData.DataMap.ContainsKey(equipRodID))
{
equipRodID = _tables.TbGlobalConfig.InitRodID;
}
break;
case "LastEnergyRecoveryTime":
_lastEnergyRecoveryTime = GlobalUtils.TryParseDateTime(data_value, ZZTimeHelper.UtcNow());
break;
case "RewardNewMap":
rewardNewMap = GlobalUtils.TryParseInt(data_value);
break;
case "vipAllScore":
vipAllScore = GlobalUtils.TryParseInt(data_value);
break;
case "CurrentMapId":
currentMapId = GlobalUtils.TryParseInt(data_value);
break;
case "LastMapId":
lastMapId = GlobalUtils.TryParseInt(data_value);
break;
case "FishingFrequency":
_fishingFrequency = GlobalUtils.TryParseInt(data_value);
break;
case "AllFishingFrequency":
_allFishingFrequency = GlobalUtils.TryParseInt(data_value);
break;
case "HeistGameCount":
GContext.container.Resolve().SetHeistGameCount(GlobalUtils.TryParseInt(data_value));
break;
case "BombGameCount":
GContext.container.Resolve().SetBombGameCount(GlobalUtils.TryParseInt(data_value));
break;
case "FishHuntGameCount":
GContext.container.Resolve().SetFishHuntGameCount(GlobalUtils.TryParseInt(data_value));
break;
case "LuckDataDic":
GContext.container.Resolve().LuckDataDic = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value);
break;
case "AchievementData":
GContext.container.Resolve().LoadAchievementData(data_value);
break;
case "FishingBoxData":
GContext.container.Resolve().InitData(data_value);
break;
case "GuideSaveData":
try
{
var guideSaveData = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value);
if (guideSaveData != null)
{
GContext.container.Resolve().GuideSaveDataDic = guideSaveData;
}
}
catch (Exception)
{
GameDebug.LogWarning($"[PlayerData]LoadPlayerData: Fail to parse GuideSaveData {data_value}!");
}
break;
#endregion 旧数据兼容
case "NewRodList":
newRodList = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value);
break;
case "SeasonId":
GContext.container.Resolve().seasonId = GlobalUtils.TryParseInt(data_value);
break;
case "MonthlySignEvent":
GContext.container.Resolve().monthlySignEvent = Newtonsoft.Json.JsonConvert.DeserializeObject(data_value);
break;
case "TriggerPackDataList":
GContext.container.Resolve().triggerPackList = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value);
break;
case "GiftVIPDData":
var giftVIPDData = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value);
GContext.container.Resolve().giftVIPDData = giftVIPDData;
break;
case "FixedTimeShopDic":
var FixedTimeshopDic = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value);
GContext.container.Resolve().SetFixedTimeShopDic(FixedTimeshopDic);
break;
case "ClubSignin":
break;
case "LureDonateData":
break;
case "IsOpenAppraise":
IsOpenAppraise = true;
break;
//case "MonthCardData":
// GContext.container.Resolve().InitMonthCardData(data_value);
// break;
// case "ChallengeData":
// break;
// case "FishingChallengeData":
// break;
// break;
// break;
// break;
// break;
//case "TargetEventPackData":
// GContext.container.Resolve().InitTargetEventData(data_value);
// break;
case "IsOpenClubRed":
break;
//case "PokerScoreData":
// GContext.container.Resolve().InitPockerScore(data_value);
// break;
case "EventPackData":
GContext.container.Resolve().LoadEventPackData(data_value);
break;
case "PiggyBankPackData":
break;
case "GeneralEventPackData":
var tempData = JsonConvert.DeserializeObject(data_value);
int packType = _tables.TbEventPackManager[tempData.redirectID].PackType;
switch (packType)
{
case 3:
GContext.container.Resolve().LoadData(tempData);
break;
}
break;
case "InfiniteBuildingData":
InfiniteBuildingData = data_value;
break;
/* case "EventPartnerData":
GContext.container.Resolve().LoadPlayfabData(data_value);
break; */
case "FootPrint":
GContext.container.Resolve().LoadData(data_value);
break;
// if (data == null)
// {
// }
// data.LoadData(data_value);
// break;
// break;
// break;
// break;
// break;
// break;
// break;
// break;
// case nameof(EventPinataPackData):
// break;
default:
break;
}
}
}
LoadPlayerDataNew(userDatas);
}
// 新版玩家数据加载
public void LoadPlayerDataNew(Dictionary userDatas)
{
if (userDatas.TryGetValue("NewPlayerDataDic", out string newPlayerDataDic))
{
NewPlayerDataDic = Newtonsoft.Json.JsonConvert.DeserializeObject>(newPlayerDataDic);
SetPlayerData();
}
GContext.container.Resolve().InitData(userDatas);
if (userDatas.TryGetValue("GuideSaveDataNew", out string data_value))
{
try
{
GContext.container.Resolve().SetData(data_value);
}
catch (Exception)
{
GameDebug.LogWarning($"[PlayerData]LoadPlayerData: Fail to parse GuideSaveData {data_value}!");
}
}
}
void SetPlayerDataOld()
{
string data_value;
//========================兼容=========================
if (NewPlayerDataDic.TryGetValue("lv", out data_value))
{
lv = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("lv");
}
if (NewPlayerDataDic.TryGetValue("gold", out data_value))
{
gold = GlobalUtils.TryParseUlong(data_value, (ulong)_tables.TbGlobalConfig.InitCash);
NewPlayerDataDic.Remove("gold");
}
if (NewPlayerDataDic.TryGetValue("vipS", out data_value))
{
vipAllScore = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("vipS");
}
if (NewPlayerDataDic.TryGetValue("energy", out data_value))
{
energy = GlobalUtils.TryParseInt(data_value);
if (energy < 0)
{
energy = 0;
}
NewPlayerDataDic.Remove("energy");
}
if (NewPlayerDataDic.TryGetValue("pearl", out data_value))
{
pearl = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("pearl");
}
if (NewPlayerDataDic.TryGetValue("mag", out data_value))
{
magnification = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("mag");
}
if (NewPlayerDataDic.TryGetValue("rodID", out data_value))
{
equipRodID = GlobalUtils.TryParseInt(data_value);
if (!_tables.TbRodData.DataMap.ContainsKey(equipRodID))
{
equipRodID = _tables.TbGlobalConfig.InitRodID;
}
NewPlayerDataDic.Remove("rodID");
}
if (NewPlayerDataDic.TryGetValue("EnergyTime", out data_value))
{
_lastEnergyRecoveryTime = GlobalUtils.TryParseDateTime(data_value, ZZTimeHelper.UtcNow());
NewPlayerDataDic.Remove("EnergyTime");
}
if (NewPlayerDataDic.TryGetValue("rewardNewMap", out data_value))
{
rewardNewMap = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("rewardNewMap");
}
if (NewPlayerDataDic.TryGetValue("energyRM", out data_value))
{
energyRM = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("energyRM");
}
if (NewPlayerDataDic.TryGetValue("goldRM", out data_value))
{
goldRM = GlobalUtils.TryParseUlong(data_value);
NewPlayerDataDic.Remove("goldRM");
}
if (NewPlayerDataDic.TryGetValue("diamond", out data_value))
{
diamond = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("diamond");
}
if (NewPlayerDataDic.TryGetValue("cMapID", out data_value))
{
currentMapId = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("cMapID");
}
if (NewPlayerDataDic.TryGetValue("lMapID", out data_value))
{
lastMapId = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("lMapID");
}
if (NewPlayerDataDic.TryGetValue("FF", out data_value))
{
_fishingFrequency = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("FF");
}
if (NewPlayerDataDic.TryGetValue("AFF", out data_value))
{
_allFishingFrequency = GlobalUtils.TryParseInt(data_value);
NewPlayerDataDic.Remove("AFF");
}
SmallGameData smallGameData = GContext.container.Resolve();
if (NewPlayerDataDic.TryGetValue("HGC", out data_value))
{
smallGameData.SetHeistGameCount(GlobalUtils.TryParseInt(data_value));
NewPlayerDataDic.Remove("HGC");
}
if (NewPlayerDataDic.TryGetValue("BGC", out data_value))
{
smallGameData.SetBombGameCount(GlobalUtils.TryParseInt(data_value));
NewPlayerDataDic.Remove("BGC");
}
if (NewPlayerDataDic.TryGetValue("FHGC", out data_value))
{
smallGameData.SetFishHuntGameCount(GlobalUtils.TryParseInt(data_value));
NewPlayerDataDic.Remove("FHGC");
}
if (NewPlayerDataDic.TryGetValue("LDD", out data_value))
{
GContext.container.Resolve().LuckDataDic = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value);
NewPlayerDataDic.Remove("LDD");
}
if (NewPlayerDataDic.TryGetValue("AD", out data_value))
{
GContext.container.Resolve().LoadAchievementDataToObject(data_value);
NewPlayerDataDic.Remove("AD");
}
//========================兼容=========================
}
void SetPlayerData()
{
SetPlayerDataOld();
string data_value;
if (NewPlayerDataDic.TryGetValue("newData", out data_value))
{
string[] strings = data_value.Split(',');
if (strings.Length > 18)
{
lv = GlobalUtils.TryParseInt(strings[0]);
gold = GlobalUtils.TryParseUlong(strings[1], (ulong)_tables.TbGlobalConfig.InitCash);
vipAllScore = GlobalUtils.TryParseInt(strings[2]);
energy = GlobalUtils.TryParseInt(strings[3]);
if (energy < 0)
{
energy = 0;
}
pearl = GlobalUtils.TryParseInt(strings[4]);
magnification = GlobalUtils.TryParseInt(strings[5]);
equipRodID = GlobalUtils.TryParseInt(strings[6]);
if (!_tables.TbRodData.DataMap.ContainsKey(equipRodID))
{
equipRodID = _tables.TbGlobalConfig.InitRodID;
}
_lastEnergyRecoveryTime = GlobalUtils.TryParseDateTime(strings[7], ZZTimeHelper.UtcNow());
rewardNewMap = GlobalUtils.TryParseInt(strings[8]);
energyRM = GlobalUtils.TryParseInt(strings[9]);
goldRM = GlobalUtils.TryParseUlong(strings[10]);
diamond = GlobalUtils.TryParseInt(strings[11]);
currentMapId = GlobalUtils.TryParseInt(strings[12]);
lastMapId = GlobalUtils.TryParseInt(strings[13]);
_fishingFrequency = GlobalUtils.TryParseInt(strings[14]);
_allFishingFrequency = GlobalUtils.TryParseInt(strings[15]);
SmallGameData smallGameData = GContext.container.Resolve();
smallGameData.SetHeistGameCount(GlobalUtils.TryParseInt(strings[16]));
smallGameData.SetBombGameCount(GlobalUtils.TryParseInt(strings[17]));
smallGameData.SetFishHuntGameCount(GlobalUtils.TryParseInt(strings[18]));
}
}
if (NewPlayerDataDic.TryGetValue("vipL", out data_value))
{
vipScoreDic = data_value.Split('|').Select(part => part.Split(','))
.ToDictionary(arr => int.Parse(arr[0]), arr => int.Parse(arr[1]));
}
if (NewPlayerDataDic.TryGetValue("ld", out data_value))
{
string[] luckDataDic = data_value.Split('|');
var LuckDataDic = new Dictionary();
if (luckDataDic.Length == 3)
{
LuckDataDic["InitFishLuck"] = float.Parse(luckDataDic[0]);
LuckDataDic["InitBotLuck"] = float.Parse(luckDataDic[1]);
LuckDataDic["BotCount"] = float.Parse(luckDataDic[2]);
}
GContext.container.Resolve().LuckDataDic = LuckDataDic;
}
if (NewPlayerDataDic.TryGetValue("ad", out data_value))
{
GContext.container.Resolve().LoadAchievementDataToObjectNew(data_value);
}
if (NewPlayerDataDic.TryGetValue("bd", out data_value))
{
GContext.container.Resolve().InitDataNew(data_value);
}
if (NewPlayerDataDic.TryGetValue("ct", out data_value))
{
GContext.container.Resolve().CTDeserialize(data_value);
}
if (NewPlayerDataDic.TryGetValue("rt", out data_value))
{
GContext.container.Resolve().RTDeserialize(data_value);
}
}
public void UpdateVIPScoreDic()
{
int currentDayOfYear = (int)(ZZTimeHelper.UtcNow() - new DateTime(2025, 10, 20)).TotalDays;
if (!vipScoreDic.ContainsKey(-1))
{
vipScoreDic[-1] = currentDayOfYear;
}
if (currentDayOfYear > vipScoreDic[-1])
{
int offsetDays = currentDayOfYear - vipScoreDic[-1];
var scoreDic = new Dictionary();
foreach (var kvp in vipScoreDic)
{
if (kvp.Key >= 0 && kvp.Key < 14 - offsetDays)
{
scoreDic[kvp.Key + offsetDays] = kvp.Value;
}
}
scoreDic[-1] = currentDayOfYear;
scoreDic[0] = 0;
vipScoreDic = scoreDic;
}
else if (currentDayOfYear < vipScoreDic[-1])
{
vipScoreDic[-1] = currentDayOfYear;
}
}
public void SavePlayerData(bool remote = true)
{
GContext.Publish(this);
StringBuilder sb = new StringBuilder();
sb.Append(lv).Append(",");
sb.Append(gold).Append(",");
sb.Append(vipAllScore).Append(",");
sb.Append(energy).Append(",");
sb.Append(pearl).Append(",");
sb.Append(magnification).Append(",");
sb.Append(equipRodID).Append(",");
sb.Append(_lastEnergyRecoveryTime.ToString()).Append(",");
sb.Append(rewardNewMap).Append(",");
sb.Append(energyRM).Append(",");
sb.Append(goldRM).Append(",");
sb.Append(diamond).Append(",");
sb.Append(currentMapId).Append(",");
sb.Append(lastMapId).Append(",");
sb.Append(_fishingFrequency).Append(",");
sb.Append(_allFishingFrequency).Append(",");
SmallGameData smallGameData = GContext.container.Resolve();
sb.Append(smallGameData.HeistGameCount).Append(",");
sb.Append(smallGameData.BombGameCount).Append(",");
sb.Append(smallGameData.FishHuntGameCount);
NewPlayerDataDic["newData"] = sb.ToString();
string vipl = vipScoreDic.Select(kvp => $"{kvp.Key},{kvp.Value}").Aggregate((a, b) => $"{a}|{b}");
//GameDebug.Log($"[PlayerData]SavePlayerData: vipScoreDic string = {vipl}");
NewPlayerDataDic["vipL"] = vipl;
string luckDataDic = "";
var LuckDataDic = GContext.container.Resolve().LuckDataDic;
luckDataDic += LuckDataDic.GetValueOrDefault("InitFishLuck") + "|";
luckDataDic += LuckDataDic.GetValueOrDefault("InitBotLuck") + "|";
luckDataDic += LuckDataDic.GetValueOrDefault("BotCount");
NewPlayerDataDic["ld"] = luckDataDic;
NewPlayerDataDic["ad"] = GContext.container.Resolve().AchievementDataToJson();
NewPlayerDataDic["bd"] = GContext.container.Resolve().GetString();
NewPlayerDataDic["ct"] = GContext.container.Resolve().CTSerialize();
NewPlayerDataDic["rt"] = GContext.container.Resolve().RTSerialize(); ;
PlayFabMgr.Instance.UpdateUserDataValue("NewPlayerDataDic", Newtonsoft.Json.JsonConvert.SerializeObject(NewPlayerDataDic), remote);
}
public void Init()
{
OnLvChange();
UpdateVIPScoreDic();
VipChange();
RecoveryEnergy();
}
void InitEnergy()
{
List DataList = _tables.TbEnergyDef.DataList;
if (magnification >= DataList.Count)
{
magnification = 0;
}
EnergyDef energyDef = DataList[magnification];
if (energyDef.Energy >= 0)
{
return;
}
var buffTimeData = GContext.container.Resolve().GetWeelyBuffTimeData();
bool isSuperEnergy = buffTimeData != null;
if (isSuperEnergy)
{
return;
}
for (int i = DataList.Count - 1; i >= 0; i--)
{
if (DataList[i].Energy >= 0)
{
if (i < magnification)
{
magnification = i;
}
return;
}
}
}
public bool ContainsOrGreaterRatio(int ratio)
{
List DataList = _tables.TbEnergyDef.DataList;
var buffTimeData = GContext.container.Resolve().GetWeelyBuffTimeData();
bool isSuperEnergy = buffTimeData != null;
for (int i = 0; i < DataList.Count; i++)
{
int demandEnergy = DataList[i].Energy;
if (isSuperEnergy)
{
demandEnergy = DataList[i].FishBuffEnergy;
}
if (demandEnergy >= 0 && Energy > demandEnergy)
{
if (ratio <= DataList[i].Mag)
{
return true;
}
}
else
{
return false;
}
}
return false;
}
public int GetMagnification()
{
if (magnification >= _tables.TbEnergyDef.DataList.Count)
{
magnification = _tables.TbEnergyDef.DataList.Count - 1;
}
return _tables.TbEnergyDef.DataList[magnification].Mag;
}
public string GetMagnificationIcon()
{
if (magnification >= _tables.TbEnergyDef.DataList.Count)
{
magnification = _tables.TbEnergyDef.DataList.Count - 1;
}
return _tables.TbEnergyDef.DataList[magnification].Icon;
}
public int SetLittleMagnification()
{
List DataList = _tables.TbEnergyDef.DataList;
for (int i = 3; i >= 0; i--)
{
int demandEnergy = DataList[i].Mag;
if (demandEnergy >= 0)
{
if (Energy >= demandEnergy)
{
return i;
}
}
}
return 0;
}
public float GetLuckMultipier()
{
if (magnification >= _tables.TbEnergyDef.DataList.Count)
{
magnification = _tables.TbEnergyDef.DataList.Count - 1;
}
return _tables.TbEnergyDef.DataList[magnification].LuckMultipier;
}
public bool GetCanMagnification()
{
return GetMagnification() <= Energy;
}
public bool GetCanRetryCost()
{
if (magnification >= _tables.TbEnergyDef.DataList.Count)
{
magnification = _tables.TbEnergyDef.DataList.Count - 1;
}
return _tables.TbEnergyDef.DataList[magnification].RetryCost <= Energy;
}
public bool IsShowEffectBeilvLoop()
{
return _tables.TbEnergyDef.DataList[magnification + 1].Mag <= Energy;
}
public bool IsMaxMagnification()
{
return magnification >= MagnificationCount - 1;
}
bool _isRecoveryEnergy;
public void RecoveryEnergy(int time)
{
_lastEnergyRecoveryTime = ZZTimeHelper.UtcNow();
SavePlayerData();
if (!_isRecoveryEnergy)
{
CoRecoveryEnergy(time);
if (Energy < MaxEnergy)
{
SetRecoverNotification();
}
}
}
private System.Threading.CancellationTokenSource tokenSource;
public void RecoveryEnergy()
{
InitEnergy();
CoRecoveryEnergy((int)((ZZTimeHelper.UtcNow() - _lastEnergyRecoveryTime).TotalSeconds));
if (Energy < MaxEnergy)
{
SetRecoverNotification();
}
}
public void StopRecoveryEnergy()
{
tokenSource?.Cancel();
tokenSource = null;
}
public async void CoRecoveryEnergy(int energyRecoveryTime)
{
tokenSource?.Cancel();
tokenSource = new System.Threading.CancellationTokenSource();
var token = tokenSource.Token;
_isRecoveryEnergy = true;
int initEnergyRestorationSpeed = _tables.TbGlobalConfig.InitEnergyRestorationSpeed * 60;
while (Energy < MaxEnergy && !token.IsCancellationRequested)
{
if (energyRecoveryTime >= initEnergyRestorationSpeed)
{
int count = energyRecoveryTime / initEnergyRestorationSpeed * EnergyRecover;
int curEnergy = Energy;
Energy += count;
energyRecoveryTime %= initEnergyRestorationSpeed;
GameDebug.Log($"回复Energy:{Energy}");
if (Energy > MaxEnergy)
{
Energy = MaxEnergy;
}
int addEnergy = Energy - curEnergy;
#if AGG
using (var e = GEvent.GameEvent("auto_hook_revitalized"))
{
e.AddContent("map_id", lastMapId)
.AddContent("change_num", addEnergy);
}
using (var e = GEvent.GameEvent("item_change", gaSend: true))
{
e.AddContent("item_id", 1001)
.AddContent("state_info", "get")
.AddContent("change_num", addEnergy);
}
#endif
GContext.Publish(new ResAddEvent(1001));
_lastEnergyRecoveryTime = ZZTimeHelper.UtcNow().AddSeconds(-energyRecoveryTime);
SavePlayerData();
}
await Awaiters.Seconds(1);
if (token.IsCancellationRequested)
{
return;
}
energyRecoveryTime = (int)(ZZTimeHelper.UtcNow() - _lastEnergyRecoveryTime).TotalSeconds;
}
_isRecoveryEnergy = false;
}
public void ReduceEnergy(int reEnergy, bool remote = true)
{
if (reEnergy == 0)
{
reEnergy = GetMagnification();
}
int lastEnergy = Energy;
if (remote)
{
Energy = Mathf.Max(Energy - reEnergy, 0);
}
else
{
SetEnergy(Energy - reEnergy, false);
}
if (lastEnergy >= MaxEnergy && Energy < MaxEnergy)
{
RecoveryEnergy(0);
}
}
public void RecoverEnergy()
{
Energy += GetMagnification();
}
void SetRecoverNotification()
{
var item = _tables.TbNotification.GetOrDefault(RecoverNotificationID);
if (item != null)
{
int en = MaxEnergy - Energy - 1;
int count = (en / EnergyRecover) + 1;
DateTime dateTime = _lastEnergyRecoveryTime + TimeSpan.FromMinutes(count * _tables.TbGlobalConfig.InitEnergyRestorationSpeed);
GContext.container.Resolve().
ScheduleOneTimeNotification(item.ID, dateTime, LocalizationMgr.GetText(item.Title_l10n_key), LocalizationMgr.GetText(item.Content_l10n_key));
}
else
{
Debug.LogError($"TbNotification Not {RecoverNotificationID}");
}
}
public TimeSpan GetEnergyRecoveryTimeMAndS()
{
return _lastEnergyRecoveryTime + TimeSpan.FromMinutes(_tables.TbGlobalConfig.InitEnergyRestorationSpeed) - ZZTimeHelper.UtcNow();
}
public float GrtEscapeDistanceMag()
{
float ExtraPoint = 1;
//地图加成
MapData data = _tables.TbMapData.GetOrDefault(lastMapId);
if (data != null)
{
ExtraPoint = data.EscapeDistanceMag;
}
return ExtraPoint;
}
public async void OpenAppraisePopupPanel(int fishId)
{
if (lastMapId != _tables.TbMapData.DataList[0].ID && !IsOpenAppraise)
{
var fishData = _tables.TbFishData.GetOrDefault(fishId);
if (fishData != null && fishData.Quality >= 5)
{
await UIManager.Instance.ShowUI(UITypes.AppraisePopupPanel);
IsOpenAppraise = true;
PlayFabMgr.Instance.UpdateUserDataValue("IsOpenAppraise", "true");
}
}
}
#region GM相关
public int SupplyDropIndex = -1;
#endregion
}
}