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 skillDic = new List(); //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 skillDic = new Dictionary(); // 自动吃药 [SerializeField] public AutoMedicInfoStruct autoMedicInfo = new AutoMedicInfoStruct(); } // 自动吃药数据 // 实时变化,还是走引用吧 [Serializable] public class AutoMedicInfoStruct { public int isAutoHpOn; public int isAutoMpOn; public float hpPercent; public float mpPercent; public List autoHpIdList; public List autoMpIdList; public AutoMedicInfoStruct() { isAutoHpOn = 1; isAutoMpOn = 1; hpPercent = 0.911f; mpPercent = 0.911f; autoHpIdList = new List { -1 }; autoMpIdList = new List { -1 }; } public AutoMedicInfoStruct(int isHpOn, int isMpOn, float hpPer, float mpPer, List hpIdList, List mpIdList) { isAutoHpOn = isHpOn; isAutoMpOn = isMpOn; hpPercent = hpPer; mpPercent = mpPer; if (hpIdList != null) { autoHpIdList = new List(); autoHpIdList.AddRange(hpIdList); } else autoHpIdList = null; if (mpIdList != null) { autoMpIdList = new List(); 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(); } 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(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(); //第一次加载 var autoUseItemTab = TableManager.GetAutoUseItem(); playerCustomData.autoMedicInfo.autoMpIdList = new List(); 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 { -1 }; if (playerCustomData.autoMedicInfo.autoMpIdList == null) playerCustomData.autoMedicInfo.autoMpIdList = new List { -1 }; } } public void RefreshAutoMedicInfo() { if (AutoUseMedicPanelCtrl.Instance) AutoUseMedicPanelCtrl.Instance.LoadMySetting(); } // 更新数据 private void SaveAndUpdateSkillPage(List data) { // 确保仅同步一次 if(hasRestoreSkillData == true) { return; } if(data == null || data.Count == 0) { return; } int pageIndex; if(UserConfigData._SkillPages == null) { UserConfigData._SkillPages = new List(); 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; } } }