| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817 | using System;using System.Collections;using System.Collections.Generic;using System.IO;using System.Linq;using Core.Utility;using Excel2Json;using Fort23.Core;using Fort23.UTool;using GameLogic.Bag;using GameLogic.Hero;using UnityEngine;using UnityEngine.Serialization;using Utility;#if UNITY_WEIXINMINIGAMEusing WeChatWASM;#endifpublic class AccountFileInfo : Singleton<AccountFileInfo>{    public string persistentDataPath = Application.persistentDataPath + "/playerData.txt";    public PlayerData playerData = new PlayerData();    /// <summary>    /// 索引,用于快速查找    /// </summary>    private Dictionary<string, int> itemIndexMap = new Dictionary<string, int>();    public string fileName = "/playerData.txt";    [System.Serializable]    public class PlayerData    {        /// <summary>        /// 神识等级        /// </summary>        public int divineSenseLevel = 1;        /// <summary>        /// 神识点        /// </summary>        public float divineSensePoint = 0;        /// <summary>        /// 今天回复的神识值        /// </summary>        public float todayDivineSensePoint = 0;        /// <summary>        /// 神识经验        /// </summary>        public int divineSenseexp = 0;        //每天刷新时间        public long nextRefence;        /// <summary>        /// 洞府经验丹使用数量        /// </summary>        public int todayUseExpElixrPanelCount = 0;                public string playerName = "";        /// <summary>        /// 英雄信息        /// </summary>        public HeroData heroData;        public HeroData yindaoHeroData;        public int CurrentZuiZhongEventListId;        public List<DaoYouData> daoYouDatas = new List<DaoYouData>();        public List<DaoYouGuaiJiData> daoYouGuaiJiDatas = new List<DaoYouGuaiJiData>();        /// <summary>        /// 道具信息        /// </summary>        public List<ItemData> ItemListData = new List<ItemData>();        //地图区域数据        public List<PlacesData> placesDatas = new List<PlacesData>();        //小地图数据        public List<SmallPlacesData> smallPlacesDatas = new List<SmallPlacesData>();        /// <summary>        /// 商店数据        /// </summary>        public List<ShopData> shopDatas = new List<ShopData>();        /// <summary>        /// 功法数据        /// </summary>        public List<SkillData> AllSkillDatas = new List<SkillData>();        /// <summary>        /// 法宝数据        /// </summary>        public List<FaBaoData> AllFaBaoDatas = new List<FaBaoData>();        /// <summary>        /// 完成的事件        /// </summary>        public List<EventList> completeEvents = new List<EventList>();        /// <summary>        /// 背包里的事件        ///         /// </summary>        public List<EventList> eventList = new List<EventList>();        public List<SentimentData> SentimentDatas = new List<SentimentData>();        //塔数据        public List<TowerData> TowerDatas = new List<TowerData>();        //掉落数据        public List<QiankundaiData> QiankundaiDatas = new List<QiankundaiData>();        public List<ItemData> QiankundaiItemDatas = new List<ItemData>();        //招募数据        public List<SummonData> SummonDatas = new List<SummonData>();                public List<RedDot> RedDotDatas = new List<RedDot>();        /// <summary>        /// 挂机掉落了多少时间        /// </summary>        public int QiankundaiDropTimer;        /// <summary>        /// 领取挂机每日掉落时间        /// </summary>        public long QiankundaiLingQuDailyDropTime;                /// <summary>        /// 乾坤袋领取时间        /// </summary>        public long QiankundaiLingQuAwardTime;        public long ExitTime;        public bool boxFree;        public bool isTiggerPlot;        public int curPhase;        public int curStep;        public bool isForceDone = false;        public bool isTriggerDone = false;        public List<int> phaseKey = new List<int>();        public List<int> phaseValue = new List<int>();    }    [System.Serializable]    public class RedDot    {        public int id;        public List<string> Params = new List<string>();    }    [System.Serializable]    public class QiankundaiData    {        public int id;        public long refenceTime;        public int dropCount;        public int dropTime;    }    /// <summary>    /// 塔数据    /// </summary>    [System.Serializable]    public class TowerData    {        public int id;        public List<TowerLevelData> towerLevelDatas = new List<TowerLevelData>();        public int GetMaxUlockid()        {            int id = 0;            TowerConfig towerConfig = ConfigComponent.Instance.Get<TowerConfig>(this.id);            List<TowerInfoConfig> towerInfoConfigs = ConfigComponent.Instance.GetAll<TowerInfoConfig>().ToList();            var configs = towerInfoConfigs.Where(c => c.groupId == towerConfig.towerinfoIdGroup).ToList();            foreach (var towerInfoConfig in configs)            {                var lastTowerLevelData = towerLevelDatas.FirstOrDefault(td => td.id == towerInfoConfig.ID - 1);                if ((lastTowerLevelData != null &&                     lastTowerLevelData.finish) ||                    towerInfoConfig.level == 1)                {                    if (towerInfoConfig.ID > id)                    {                        id = towerInfoConfig.ID;                    }                }            }            return id;        }    }    /// <summary>    /// 塔层数据    /// </summary>    [System.Serializable]    public class TowerLevelData    {        public int id;        public bool finish;        public bool reward;    }    /// <summary>    /// 心境数据    /// </summary>    [System.Serializable]    public class SentimentData    {        public int id;        //主属性        public SentimentProperty mainSentiment;        public List<SentimentProperty> sentimentProperties = new List<SentimentProperty>();    }    /// <summary>    /// 心境属性    /// </summary>    [System.Serializable]    public class SentimentProperty    {        // 属性类别        public int groupId;        // 词条档位        public int level = 0;    }    [System.Serializable]    public class DaoYouGuaiJiData    {        public long leaveTime;        public long guajiTime;        public bool isLeave;        public List<ItemData> items = new List<ItemData>();        public int daoyouDataID;    }    /// <summary>    ///  道友数据    /// </summary>    [System.Serializable]    public class DaoYouData    {        public int id;        /// <summary>        /// 喜爱礼物        /// </summary>        public List<int> loveIds = new List<int>();        /// <summary>        /// 好感等级        /// </summary>        public int favorabilityLv;        /// <summary>        /// 经验        /// </summary>        public int exp;        /// <summary>        /// 已经领取奖励的好感等级        /// </summary>        public List<int> awardLevels = new List<int>();        /// <summary>        /// 心情        /// </summary>        public int emotion;        /// <summary>        /// 心情刷新时间        /// </summary>        public long emotionTime;        //心情值        public int emotionValue;    }    //地图区域数据    [System.Serializable]    public class PlacesData    {        //区域Id        public int id;        //地图进度        public int progress;    }    /// <summary>    /// 小地图数据    /// </summary>    [System.Serializable]    public class SmallPlacesData    {        public int id;        public int completionEventCount;    }    /// <summary>    /// 商店数据    /// </summary>    [System.Serializable]    public class ShopData    {        public int id;        public List<ShopItem> shopItemList = new List<ShopItem>();        // 商店刷新时间        public long refreshTime = 0;    }    [System.Serializable]    public class ShopItem    {        // 商品ID        public int id;        // 商品购买次数        public int buyCount = 0;        // 商品结束时间        public long endTime = -1;    }    [System.Serializable]    public class FaBaoData    {        public int id;        public int level;        public int useIndex;    }    [System.Serializable]    public class SkillData    {        public int id;        public int level;        public int star;        public int useIndex;    }    [System.Serializable]    public class EventData    {        public int eventID;        //完成cishu        public int completeCount = 0;    }    /// <summary>    /// 刷出来的事件列表    /// </summary>    [System.Serializable]    public class EventLinkData    {        public int eventLinkId;        public int eventId;        /// <summary>        /// 事件监听列表        /// </summary>        public List<EventConditionData> eventConditions = new List<EventConditionData>();    }    /// <summary>    /// 刷出来的事件列表    /// </summary>    [System.Serializable]    public class EventConditionData    {        public int eventId;        public int eventCondition;        public int fishCount;    }    /// <summary>    /// 刷出来的事件列表    /// </summary>    [System.Serializable]    public class EventList    {        public int guid;        public int eventID;        public int heroLevel;        public List<ItemData> itemInfos = new List<ItemData>();        public List<EventLinkData> eventLinks = new List<EventLinkData>();        public List<int> selectEventLinkIds = new List<int>();        public int curStep;        public bool isCompleted;                public bool isCompleted1;    }    [System.Serializable]    public class SummonData    {        // 招募ID        public int id;        //免费招募次数        public int oneFreeCount;        //下一次免费招募时间        public long nextOneFreeTime;        //十连招募次数        public int tenFreeCount;        //下一次十连招募时间        public long nextTenFreeTime;        public int onePayCount;        public int tenPayCount;        //保底次数        public int baodiCount1;        public int baodiCount2;        // 存储最近几次十连抽的结果        public List<IntList> drawHistory = new List<IntList>();        public int score;        public List<SummonSocreData> summonSocreData = new List<SummonSocreData>();                public bool isSummonSocre;    }        [System.Serializable]    public class IntList    {        public List<int> list;    }    [System.Serializable]    public class SummonSocreData    {        public int id;        public int currentCount;        public int count;    }    /// <summary>    /// 重建索引表    /// 主要给道具用,比较多,调用频繁    /// </summary>    private void RestoreIndexMap()    {        itemIndexMap.Clear();        for (int i = 0; i < playerData.ItemListData.Count; i++)        {            itemIndexMap[playerData.ItemListData[i].guid] = i;        }    }    /// <summary>    /// 加载玩家数据,一切数据:从这里开始    /// </summary>    public void LoadPlayerData()    {#if UNITY_WEIXINMINIGAME && !UNITY_EDITOR        persistentDataPath = WX.env.USER_DATA_PATH + fileName;        WXFileSystemManager wxFileSystemManager = WX.GetFileSystemManager();        if (wxFileSystemManager.AccessSync(persistentDataPath).Equals("access:ok"))        {            string data = wxFileSystemManager.ReadFileSync(persistentDataPath, "utf8");            playerData = new PlayerData();            JsonUtility.FromJsonOverwrite(data, playerData);        }        else        {            ClearInitPlayerData();            SavePlayerData();        }#else        if (!File.Exists(persistentDataPath))        {            LogTool.Log("没有文件: " + persistentDataPath);            ClearInitPlayerData();            // File.Create(persistentDataPath).Close();        }        LogTool.Log("读取=文件: " + persistentDataPath);        StreamReader sr = File.OpenText(persistentDataPath);        string data = sr.ReadToEnd();        sr.Close();        playerData = new PlayerData();        JsonUtility.FromJsonOverwrite(data, playerData);#endif        //初始化索引        RestoreIndexMap();    }    private int lastHeroIdx = 0;    private int lastItemIdx = 0;    /// <summary>    /// 保存item数据    /// </summary>    /// <param name="itemInfo"></param>    /// <param name="now">是否立即保存</param>    /// <param name="zeroDel">count为0时,是否删除</param>    public void SaveItemData(ItemInfo itemInfo, bool now = true)    {        if (itemIndexMap.TryGetValue(itemInfo.guid, out int index))        {            //count为零且需要立即删除时,移除Data并移除索引(也有count为0,不删除的情况,就走else的逻辑)            // if (itemInfo.count.Value == 0 && zeroDel)            // {            //     playerData.ItemListData.RemoveAt(index);            //     itemIndexMap.Remove(itemInfo.guid);            // }            // else            // {            //     // 快速找到索引,直接修改            //     playerData.ItemListData[index] = itemInfo.ToItemData();            // }            // 快速找到索引,直接修改            playerData.ItemListData[index] = itemInfo.ToItemData();        }        else        {            foreach (ItemData itemData in playerData.ItemListData)            {                if (itemData.guid == itemInfo.guid)                {                    LogTool.Error("??? guid重复了" + itemInfo.itemID + "-" + itemData.guid);                }            }            // 添加新数据并更新索引表            playerData.ItemListData.Add(itemInfo.ToItemData());            itemIndexMap[itemInfo.guid] = playerData.ItemListData.Count - 1;        }        if (now)        {            SavePlayerData();        }    }    // public void SaveEqGUID()    // {    //     SavePlayerData();    // }    /// <summary>    /// 清除空数据,重建索引    /// </summary>    private void CleanEmptyData()    {        // 从后往前遍历,这样删除元素,可以边循环,边删除        for (int i = playerData.ItemListData.Count - 1; i >= 0; i--)        {            // string ss = "";            ItemData itemData = playerData.ItemListData[i];            if (itemData.itemCount == 0)            {                //不是装备,删除                if (itemData.eqData == null || itemData.eqData.zyEqId == 0)                {                    playerData.ItemListData.RemoveAt(i);                    // ss = "删除道具:" + itemData.guid;                }                else if (itemData.eqData != null && itemData.eqData.zyEqId != 0 && !itemData.eqData.isEquip)                {                    // ss = "删除装备:" + itemData.guid;                    playerData.ItemListData.RemoveAt(i);                }                // LogTool.Log(ss);            }        }        RestoreIndexMap();    }    public void SavePlayerData(bool clean = false)    {        if (clean)        {            CleanEmptyData();        }        if (!string.IsNullOrEmpty(persistentDataPath))        {            string playerSettingJson = JsonManager.ToJson(playerData);#if UNITY_WEIXINMINIGAME&& !UNITY_EDITOR            WXFileSystemManager wxFileSystemManager = WX.GetFileSystemManager();            wxFileSystemManager.WriteFileSync(persistentDataPath, playerSettingJson, "utf8");#else            File.WriteAllText(persistentDataPath, playerSettingJson);#endif        }    }    public void DeleteFile(string filePath)    {#if UNITY_WEIXINMINIGAME&& !UNITY_EDITOR        playerData = new PlayerData();        SavePlayerData();        ClearInitPlayerData();#else        if (File.Exists(filePath))        {            File.Delete(filePath); // 删除文件            LogTool.Log($"文件已删除:{filePath}");        }        else        {            LogTool.Log($"文件不存在:{filePath}");        }#endif    }    /// <summary>    /// 不要服务器的话,这里初始化玩家的起始数据    /// </summary>    public void ClearInitPlayerData()    {        //初始化道具        InitialPlayerConfig initialPlayerConfig = ConfigComponent.Instance.Get<InitialPlayerConfig>(1);        for (var i = 0; i < initialPlayerConfig.itemId.Length; i++)        {            ItemData coin = new ItemData(initialPlayerConfig.itemId[i], initialPlayerConfig.itemAmount[i]);            playerData.ItemListData.Add(coin);        }        //初始化法宝        for (var i = 0; i < initialPlayerConfig.fabaoId.Length; i++)        {            FaBaoData faaData = new FaBaoData();            faaData.id = initialPlayerConfig.fabaoId[i];            faaData.level = 1;            faaData.useIndex = i;            playerData.AllFaBaoDatas.Add(faaData);        }        //初始化功法        for (var i = 0; i < initialPlayerConfig.gongfaId.Length; i++)        {            SkillData skillData = new SkillData();            skillData.id = initialPlayerConfig.gongfaId[i];            skillData.star = 1;            skillData.level = 1;            if (i <= 0)            {                skillData.useIndex = i;            }                      playerData.AllSkillDatas.Add(skillData);        }        playerData.divineSensePoint = initialPlayerConfig.shenshiPoint;        //添加英雄数据        HeroData heroData = new HeroData();        playerData.heroData = heroData;        heroData.heroModelId = 101;        heroData.heroPowerId = 1;        heroData.upTime = TimeHelper.ClientNow();        HeroData yindaoHeroData = new HeroData();        playerData.yindaoHeroData = yindaoHeroData;        yindaoHeroData.heroModelId = 101;        yindaoHeroData.heroPowerId = 200;        yindaoHeroData.upTime = TimeHelper.ClientNow();        //添加第一关地图数据        PlacesData placesData = new PlacesData();        placesData.id = 1;        playerData.placesDatas.Add(placesData);        SmallPlacesData smallPlacesData = new SmallPlacesData();        smallPlacesData.id = 1;        playerData.smallPlacesDatas.Add(smallPlacesData);        SavePlayerData();    }    [System.Serializable]    public class HeroData    {        /// <summary>        /// 英雄基础信息        /// </summary>        public int heroModelId;        /// <summary>        /// 英雄等级        /// </summary>        public int heroPowerId;        public float exp;        public long upTime;        public bool isCombat;        public int TaoismSkillId;        public List<int> ImmortalBond = new List<int>();    }    [System.Serializable]    public class ItemData    {        public int itemId;        public long itemCount;        public string guid;        public EqData eqData;        public ItemData(int itemId, long itemCount = 0, string guid = "")        {            this.itemId = itemId;            this.itemCount = itemCount;            if (string.IsNullOrEmpty(guid))            {                this.guid = itemId.ToString();            }            else            {                this.guid = guid;            }            // eqData = null;        }    }    /// <summary>    /// 装备数据    /// </summary>    [System.Serializable]    public class EqData    {        // public string guid;        // public int count;        /// <summary>        /// HeroBasicEquipConfig ID        /// </summary>        public int zyEqId;        // public int dropLv;        public int quality;        /// <summary>        /// 是否穿了(职业装备)        /// </summary>        public bool isEquip;        // /// <summary>        // /// 穿在哪个职业身上        // /// </summary>        // public int zy;    }}
 |