using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using asap.core;
using cfg;
using GameCore;
using Newtonsoft.Json;
using Script.RuntimeScript;
using Script.RuntimeScript.model.Data;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class DiggingGameModel
{
#region 协议Const区域
//工具个数
private const string DigCountKey = "DigCount";
//棋盘管卡数据
private const string DigGridDataKey = "DigGridData";
#endregion
#region 管卡json中原始数据
private DinggingSceneData _dinggingSceneData;
#endregion
#region 服务器数据
///
/// 沙滩寻宝基本数据
///
private SandDigServerData _serverData = null;
///
/// 沙滩寻宝棋盘网格数据
///
private List _allServerGridData = new List();
public int TempIndex = -1;
private int _serverDigCount = 0;
int redDot = 10;
//最新获取 道具个数 *** 已经废弃
public int NewAddDigCount = 0;
#endregion
///
/// 本期活动开放的所有管卡
///
private List _allClamps = new List();
public List AllClamps => _allClamps;
private int _curActivityId = 0;
public int CurActivityId
{
get => _curActivityId;
}
public DiggingActivityInit digActivityConfig;
public string ResourceTopic => digActivityConfig.ResourceTopic;
#region 数据初始化
///
/// 在线时候 活动开启
///
public void ActivityOpen(cfg.FishingEvent t)
{
if (_curActivityId == t.ID)
{
return;
}
_curActivityId = t.ID;
if (_curActivityId > 0)
{
digActivityConfig = GContext.container.Resolve().TbDiggingActivityInit.Get(t.RedirectID);
redDot = GContext.container.Resolve().GetRedDot(_curActivityId);
}
DiggingGameManager.LogError("沙滩寻宝开启");
string countJson = PlayFabMgr.Instance.GetLocalData(DigCountKey);
string digGridDataJson = PlayFabMgr.Instance.GetLocalData(DigGridDataKey);
if (string.IsNullOrEmpty(countJson))
{
SaveNull();
}
DoServerData(countJson, digGridDataJson);
}
///
/// 进入游戏初始化数据
///
///
public async System.Threading.Tasks.Task InitServerData()
{
_curActivityId = GContext.container.Resolve().GetActivityId();
DiggingGameManager.LogError("沙滩寻宝数据初始化");
if (_curActivityId > 0)
{
FishingEvent fishingEvent = GContext.container.Resolve().TbFishingEvent.GetOrDefault(_curActivityId);
digActivityConfig = GContext.container.Resolve().TbDiggingActivityInit.Get(fishingEvent.RedirectID);
}
string countJson = PlayFabMgr.Instance.GetLocalData(DigCountKey);
string digGridDataJson = PlayFabMgr.Instance.GetLocalData(DigGridDataKey);
DoServerData(countJson, digGridDataJson);
await InitClientData(ClientDataHandleEnum.Init);
}
private void DoServerData(string countJson, string digGridDataJson)
{
if (_curActivityId <= 0)
{
SaveNull();
return;
}
else
{
redDot = GContext.container.Resolve().GetRedDot(_curActivityId);
FishingEvent acInfo = GContext.container.Resolve().GetActivityConfig(_curActivityId);
int redirectID = acInfo.RedirectID;
DiggingActivityInit digActivityConfig = GContext.container.Resolve().TbDiggingActivityInit.Get(redirectID);
if (digActivityConfig == null)
{
SaveNull();
return;
}
_allClamps = digActivityConfig.StageList;
if (!string.IsNullOrEmpty(countJson))
{
try
{
SaveDigCountJson data = Newtonsoft.Json.JsonConvert.DeserializeObject(countJson);
if (data.ActivityId == _curActivityId)
{
_serverDigCount = data.DigCount;
DiggingGameManager.LogError("玩家铲子个数 :::" + _serverDigCount);
}
else
{
SaveNull();
}
}
catch (Exception e)
{
SaveNull();
Debug.LogError(e);
}
}
_serverData = null;
_allServerGridData.Clear();
if (!string.IsNullOrEmpty(digGridDataJson))
{
SaveDataJson data = Newtonsoft.Json.JsonConvert.DeserializeObject(digGridDataJson);
if (data.ActivityId == _curActivityId)
{
_serverData = data.GetSerializableData();
_allServerGridData = data.GetSerializableGridData().ToList();
TempIndex = data.TempIndex;
}
else
{
SaveNull();
}
}
if (_serverData == null || (!_allClamps.Contains(_serverData.ClampId) && _serverData.ClampId > 0))
{
_serverData = new SandDigServerData();
_serverData.ClampId = _allClamps[0];
_allServerGridData.Clear();
}
SetRedPoint();
//#if UNITY_EDITOR
// //测试
// _allServerGridData = new List();
// _allServerGridPropsData = new List();
// _serverData = new SandDigServerData();
// _serverData.ClampId = _allClamps[1];
//#endif
}
}
public void GMSetClamp(int index)
{
if (_curActivityId <= 0 || _serverData == null)
{
return;
}
if (index >= _allClamps.Count)
{
index = _allClamps.Count - 1;
}
if (index < 0)
{
_serverData.ClampId = -1;
}
else
{
_serverData.ClampId = _allClamps[index];
}
NewData();
}
public async Task InitClientData(ClientDataHandleEnum handleType)
{
if (_serverData == null || _serverData.ClampId <= 0)
return false;
DiggingGameManager.LogError("初始化客户端管卡数据");
string JsonPath = $"Clamp{_serverData.ClampId}";// $"Assets/ABPackage/SandDig/ClampJson/Clamp{_serverData.ClampId}";
GContext.container.Resolve().GameState = SandDigGameState.LoadJson;
AsyncOperationHandle handle = Addressables.LoadAssetAsync(JsonPath);
TaskCompletionSource taskCompletion = new TaskCompletionSource();
handle.Completed += (AsyncOperationHandle obj) =>
{
if (obj.Status == AsyncOperationStatus.Succeeded)
{
DiggingGameManager.LogError("新管卡数据加载完毕");
_dinggingSceneData = JsonConvert.DeserializeObject(obj.Result.ToString());
_dinggingSceneData.AnalysisData(_allServerGridData);
// 释放资源
Addressables.Release(handle);
if (handleType == ClientDataHandleEnum.PassClamp)
{
//可以切换了
GContext.container.Resolve().GameState = SandDigGameState.WaitPassLoading;
}
else if (handleType == ClientDataHandleEnum.EnterGame)
{
GContext.container.Resolve().GameState = SandDigGameState.LoadJsonOver;
}
else if (handleType == ClientDataHandleEnum.Init)
{
InitCheckClampPass();
}
taskCompletion.SetResult(true);
}
else
{
taskCompletion.SetResult(false);
DiggingGameManager.LogError("Failed to load asset: " + JsonPath);
}
};
return await taskCompletion.Task;
}
public void InitCheckClampPass()
{
List allHaveProps = new List(GetAllPassIds());
PropData[] allData = GetAllPropData();
bool allFinded = true;
for (int i = 0; i < allData.Length; i++)
{
var propData = allData[i];
if (!allHaveProps.Contains(propData.PropId))
{
allFinded = false;
break;
}
else
{
allHaveProps.Remove(propData.PropId);
}
}
if (!allFinded)
{
allFinded = true;
GridData[] gridDatas = GetAllGridData();
for (int i = 0; i < gridDatas.Length; i++)
{
GridData gridData = gridDatas[i];
if (gridData.IsBorder || gridData.IsOpen)
{
continue;
}
allFinded = false;
break;
}
}
if (allFinded)
{
DiggingStageReward config = GContext.container.Resolve().TbDiggingStageReward.Get(_serverData.ClampId);
_serverData.ClampId = config.NextTarget;
NewData();
}
}
#endregion
///
/// 通过当前管卡发奖
///
public void PassClamp()
{
GContext.container.Resolve().ClampIsPass = true;
DiggingStageReward config = GContext.container.Resolve().TbDiggingStageReward.Get(_serverData.ClampId);
var playerData = GContext.container.Resolve();
DiggingGameManager.LogError("获得的Drop奖励 :::" + config.DropID);
GContext.container.Resolve().itemDatas = playerData.AddItemByDrop(config.DropID, true);
_serverData.ClampId = config.NextTarget;
NewData();
}
///
/// 在线进入新关卡,数据初始化
///
public void NewData()
{
TempIndex = -1;
_serverData.ClickCount = 0;
_serverData.Reset();
_allServerGridData.Clear();
_dinggingSceneData?.Reset();
SaveAll();
}
public void NewClampInit()
{
GContext.Publish(new EventSandDigNewClamp(_serverData.ClampId));
if (_serverData.ClampId <= 0)
{
//通关所有关卡
DiggingGameManager.LogError("通关所有关卡!!!!!!!");
}
else
{
InitClientData(ClientDataHandleEnum.PassClamp);
}
}
#region 数据接口
///
/// 使用道具
///
public void UseDig()
{
_serverDigCount--;
_serverData.ClickCount++;
SaveDigCount();
GContext.Publish(new EventSandDigPropUpdate());
}
///
/// 增加道具
///
///
public void AddDigCount(int count)
{
_serverDigCount += count;
SaveDigCount();
}
///
/// 获得目标道具
///
///
public void AddProp(int id)
{
_serverData.PassPropIds.Add(id);
}
public List GetAllPassIds()
{
return _serverData.PassPropIds;
}
public DinggingSceneData GetBroadData()
{
return _dinggingSceneData;
}
public BroadData[] GetAllBroadData()
{
return _dinggingSceneData.GetAllBroadData();
}
public GridData[] GetAllGridData()
{
return _dinggingSceneData.GetAllGridData();
}
///
/// 获取一个格子数据
///
///
///
///
public GridData GetGridData(int row, int col)
{
return _dinggingSceneData.GetGridData(row, col);
}
public PropData[] GetAllPropData()
{
return _dinggingSceneData.GetAllPropData();
}
public List GetOnePropTempData()
{
if (TempIndex < 0)
{
TempIndex = _dinggingSceneData.GetOnePropTempDataIndex();
}
return _dinggingSceneData.GetAllPropTempData(TempIndex);
}
public Vector3 GetTaskPosPositon()
{
return _dinggingSceneData.GetTaskPosPositon();
}
///
/// 获取道具个数
///
///
public int GetDigCount()
{
return _serverDigCount;
}
public SandDigServerData GetServerData()
{
return _serverData;
}
public int GetCurClampId()
{
return _serverData.ClampId;
}
public int GetClickCount()
{
return _serverData.ClickCount;
}
#endregion
#region 数据存储
public void SaveDigCount()
{
SetRedPoint();
SaveDigCountJson dataJson = new SaveDigCountJson();
dataJson.ActivityId = _curActivityId;
dataJson.DigCount = _serverDigCount;
string json = JsonConvert.SerializeObject(dataJson);
PlayFabMgr.Instance.UpdateUserDataValue(DigCountKey, json);
GContext.container.Resolve().SaveTransitionData(dataJson.ActivityId, dataJson.DigCount);
}
void SetRedPoint()
{
RedPointManager.Instance.SetRedPointState("Home.Digging", _serverData != null && _serverData.ClampId > 0 && _serverDigCount >= redDot);
}
public void SaveData()
{
//通用数据 + 任务目标数据
SaveDataJson dataJson = new SaveDataJson();
dataJson.ActivityId = _curActivityId;
dataJson.SandDigServerData = _serverData.ToJson();
dataJson.TempIndex = TempIndex;
//网格数据
GridData[] allGridData = _dinggingSceneData?.GetAllGridData() ?? new GridData[0];
string allGridStr = allGridData.Length > 0 ? "[" : string.Empty;
for (int i = 0; i < allGridData.Length; i++)
{
if (i == allGridData.Length - 1)
{
allGridStr += allGridData[i].ToJson() + "]";
}
else
{
allGridStr += allGridData[i].ToJson() + ",";
}
}
dataJson.AllGridJson = allGridStr;
string json = JsonConvert.SerializeObject(dataJson);
//DiggingGameManager.LogError(json);
PlayFabMgr.Instance.UpdateUserDataValue(DigGridDataKey, json);
}
public void SaveAll()
{
this.SaveDigCount();
this.SaveData();
}
///
/// 清空上一期活动数据
///
private void SaveNull()
{
_serverDigCount = GContext.container.Resolve().GetInitWelcomeGift(_curActivityId);
SaveDigCount();
PlayFabMgr.Instance.UpdateUserDataValue(DigGridDataKey, string.Empty);
}
#endregion
}