Files
JJBB/Assets/Project/Script/Player/UserData/ClientCustomData.cs
2024-08-23 15:49:34 +08:00

353 lines
11 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GCGame.Table;
using System;
public class ClientCustomData {
// 是否已经同步过一次服务器上的数据
private bool hasRestoreSkillData = false; // 技能是否已经同步过
public bool HasRestoreSkillData
{
get { return hasRestoreSkillData; }
}
[Serializable]
public class CustomData
{
// 技能页 <技能页索引(一二三四), 技能页>
[Serializable]
public class SkillListStruct
{
public int key;
[SerializeField]
public UserConfigData.SkillSavePage value;
}
[SerializeField]
public List<SkillListStruct> skillDic = new List<SkillListStruct>();
//public bool ContainsKey(int key)
//{
// if(skillDic == null)
// {
// return false;
// }
// for(int i = 0; i < skillDic.Count; ++i)
// {
// if(skillDic[i].key == key)
// {
// return true;
// }
// }
// return false;
//}
//public Dictionary<int, UserConfigData.SkillSavePage> skillDic = new Dictionary<int, UserConfigData.SkillSavePage>();
// 自动吃药
[SerializeField]
public AutoMedicInfoStruct autoMedicInfo = new AutoMedicInfoStruct();
}
// 自动吃药数据
// 实时变化,还是走引用吧
[Serializable]
public class AutoMedicInfoStruct
{
public int isAutoHpOn;
public int isAutoMpOn;
public float hpPercent;
public float mpPercent;
public List<int> autoHpIdList;
public List<int> autoMpIdList;
public AutoMedicInfoStruct()
{
isAutoHpOn = 1;
isAutoMpOn = 1;
hpPercent = 0.911f;
mpPercent = 0.911f;
autoHpIdList = new List<int> { -1 };
autoMpIdList = new List<int> { -1 };
}
public AutoMedicInfoStruct(int isHpOn, int isMpOn, float hpPer, float mpPer, List<int> hpIdList, List<int> mpIdList)
{
isAutoHpOn = isHpOn;
isAutoMpOn = isMpOn;
hpPercent = hpPer;
mpPercent = mpPer;
if (hpIdList != null)
{
autoHpIdList = new List<int>();
autoHpIdList.AddRange(hpIdList);
}
else
autoHpIdList = null;
if (mpIdList != null)
{
autoMpIdList = new List<int>();
autoMpIdList.AddRange(mpIdList);
}
else
autoMpIdList = null;
}
}
private CustomData playerCustomData;
public CustomData PlayerCustomData
{
get { return playerCustomData; }
private set { }
}
private string jsonStr = "";
public ClientCustomData()
{
playerCustomData = new CustomData();
}
// 请求以保存的数据
public void ReqClienCustomData()
{
ReqClientCustomData req = new ReqClientCustomData();
req.nilparam = 1;
req.SendMsg();
}
// 存数据与服务器
public void SaveDataToServer()
{
if (playerCustomData != null)
{
jsonStr = JsonUtility.ToJson(playerCustomData);
ReqSaveClientCustomData req = new ReqSaveClientCustomData();
req.data = jsonStr;
req.SendMsg();
}
RefreshAutoMedicInfo();
}
// 保存技能页数据
public void SaveSkillPageData()
{
if (playerCustomData.skillDic == null)
{
playerCustomData.skillDic = new List<CustomData.SkillListStruct>();
}
playerCustomData.skillDic.Clear();
foreach (var skillPage in UserConfigData._SkillPages)
{
if(skillPage.RoleGuid != GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid)
{
continue;
}
CustomData.SkillListStruct newOne = new CustomData.SkillListStruct();
newOne.key = skillPage.PageIdx;
newOne.value = skillPage;
playerCustomData.skillDic.Add(newOne);
}
SaveDataToServer();
}
// 重装服务器返回的数据到到本地
// 该函数最好只触发一次。
public void RestoreData(RetClientCustomData packet)
{
// 解析json
CustomData packetData = JsonUtility.FromJson<CustomData>(packet.data);
if(packetData == null)
{
//证明第一次加载,需要默认勾选全部药品
UpdateAutoMedicInfo(null);
}else
{
UpdateAutoMedicInfo(packetData.autoMedicInfo);
SaveAndUpdateSkillPage(packetData.skillDic);
}
}
public void UpdateAutoMedicInfo(AutoMedicInfoStruct autoMedicInfo)
{
// 药品
playerCustomData.autoMedicInfo = autoMedicInfo;
if (playerCustomData.autoMedicInfo == null)
{
playerCustomData.autoMedicInfo = new AutoMedicInfoStruct();
playerCustomData.autoMedicInfo.isAutoHpOn = 1;
playerCustomData.autoMedicInfo.isAutoMpOn = 1;
playerCustomData.autoMedicInfo.hpPercent = 0.501f;
playerCustomData.autoMedicInfo.mpPercent = 0.501f;
playerCustomData.autoMedicInfo.autoHpIdList = new List<int>();
//第一次加载
var autoUseItemTab = TableManager.GetAutoUseItem();
playerCustomData.autoMedicInfo.autoMpIdList = new List<int>();
foreach (var item in autoUseItemTab)
{
if (item.Value.SubClassID == 4 && !playerCustomData.autoMedicInfo.autoHpIdList.Contains(item.Key))
{
playerCustomData.autoMedicInfo.autoHpIdList.Add(item.Key);
}
if (item.Value.SubClassID == 5 && !playerCustomData.autoMedicInfo.autoMpIdList.Contains(item.Key))
{
playerCustomData.autoMedicInfo.autoMpIdList.Add(item.Key);
}
}
}
else
{
if (playerCustomData.autoMedicInfo.autoHpIdList == null)
playerCustomData.autoMedicInfo.autoHpIdList = new List<int> { -1 };
if (playerCustomData.autoMedicInfo.autoMpIdList == null)
playerCustomData.autoMedicInfo.autoMpIdList = new List<int> { -1 };
}
}
public void RefreshAutoMedicInfo()
{
if (AutoUseMedicPanelCtrl.Instance)
AutoUseMedicPanelCtrl.Instance.LoadMySetting();
}
// 更新数据
private void SaveAndUpdateSkillPage(List<CustomData.SkillListStruct> data)
{
// 确保仅同步一次
if(hasRestoreSkillData == true)
{
return;
}
if(data == null || data.Count == 0)
{
return;
}
int pageIndex;
if(UserConfigData._SkillPages == null)
{
UserConfigData._SkillPages = new List<UserConfigData.SkillSavePage>();
foreach (var kv in data)
{
UserConfigData._SkillPages.Add(kv.value);
if (kv.value.IsUsing > 0)
{
UserConfigData._CurSkillPage = kv.value;
}
}
}
else
{
// 用服务器的数据全部替换本地的数据(如果有的话)
for (int i = 0; i < UserConfigData._SkillPages.Count; ++i)
{
pageIndex = UserConfigData._SkillPages[i].PageIdx;
for(int j = 0; j < data.Count; ++j)
{
if(data[j].key == pageIndex && data[j].value.RoleGuid == UserConfigData._SkillPages[i].RoleGuid)
{
UserConfigData._SkillPages[i].PageName = data[j].value.PageName;
UserConfigData._SkillPages[i].IsUsing = data[j].value.IsUsing;
UserConfigData._SkillPages[i].SkillIdxs = data[j].value.SkillIdxs;
if (UserConfigData._SkillPages[i].IsUsing > 0)
{
UserConfigData._CurSkillPage = UserConfigData._SkillPages[i];
}
data.RemoveAt(j);
break;
}
}
//if (data.ContainsKey(pageIndex) && data[pageIndex].RoleGuid == UserConfigData._SkillPages[i].RoleGuid)
//{
// UserConfigData._SkillPages[i].PageName = data[pageIndex].PageName;
// UserConfigData._SkillPages[i].IsUsing = data[pageIndex].IsUsing;
// UserConfigData._SkillPages[i].SkillIdxs = data[pageIndex].SkillIdxs;
// if (UserConfigData._SkillPages[i].IsUsing > 0)
// {
// UserConfigData._CurSkillPage = UserConfigData._SkillPages[i];
// }
// data.Remove(pageIndex);
//}
}
// 如果有比本地多的数据,继续添加
foreach (var kv in data)
{
UserConfigData._SkillPages.Add(kv.value);
if (kv.value.IsUsing > 0)
{
UserConfigData._CurSkillPage = kv.value;
}
}
}
if (SkillBarLogic.Instance() != null)
{
hasRestoreSkillData = true;
SkillBarLogic.Instance().RefreshSkillBarInfo();
}
}
public void SortAutoItemDataList()
{
playerCustomData.autoMedicInfo.autoHpIdList.Sort(SortItemIdListByLevel);
playerCustomData.autoMedicInfo.autoMpIdList.Sort(SortItemIdListByLevel);
}
//药品数量变化刷新
public static int SortItemIdListByLevel(int itemA, int itemB)
{
if (itemA == itemB)
return 0;
var autoUseItemTabA = TableManager.GetAutoUseItemByID(itemA, 0);
var autoUseItemTabB = TableManager.GetAutoUseItemByID(itemB, 0);
var backPack = GameManager.gameManager.PlayerDataPool.BackPack;
if (autoUseItemTabA == null || autoUseItemTabB == null)
return itemA < itemB ? -1 : 1;
var itemACount = backPack.GetItemCountByDataId(itemA);
var itemBCount = backPack.GetItemCountByDataId(itemB);
if (itemACount > 0 && itemBCount <= 0)
{
return -1;
}
else if (itemACount <= 0 && itemBCount > 0)
{
return 1;
}
else
{
return autoUseItemTabA.NeedLevel > autoUseItemTabB.NeedLevel ? 1 : -1;
}
}
}