using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Sog; using ProtoCSStruct; namespace Operation { class SaveFileRoleInfo { public List uid_realmid = new List(); } public static class RoleInfoMap { private static SaveFileRoleInfo infoList; private static Dictionary infoMap = new Dictionary(); public static bool needSave = false; public static void OnSyncRoleinfoToOpsvr(uint serverID, StructPacket packet) { ref var sync = ref packet.GetMessage(); if(!infoMap.ContainsKey(sync.PlayerUid)) { infoMap.Add(sync.PlayerUid,sync.RealmId); needSave = true; } } private static string GetSaveFileName() { return "./OperationServerDb_RoleInfoMap_" + OperationServerUtils.GetApp().ServerID.ToString() + ".fdb"; } //保存到数据库,存本地文件 public static void SaveDataToFile() { DateTime begin = DateTime.Now; string filename = GetSaveFileName(); infoList.uid_realmid.Clear(); foreach (var item in infoMap) { IDValue32Class temp = new IDValue32Class(); temp.id = (int)item.Key; temp.value = (int)item.Value; infoList.uid_realmid.Add(temp); } int iRet = Sog.IO.FileDBSaveByBinSerialize.SaveToFile(infoList, filename); if (iRet != 0) { TraceLog.Error("RoleInfoMap.SaveDataToFile save file {0} error ,ret {1}", filename, iRet); return; } infoList.uid_realmid.Clear();//留着无用 needSave = false; TraceLog.Trace("RoleInfoMap.SaveDataToFile save file {0} success, count {1} ,costTime {2}(ms)", filename, infoList.uid_realmid.Count, DateTime.Now.Millisecond - begin.Millisecond); } public static void LoadDataFromFile() { string filename = GetSaveFileName(); infoList = Sog.IO.FileDBSaveByBinSerialize.ReadFromFile(filename); if (infoList == null) { infoList = new SaveFileRoleInfo(); TraceLog.Trace("RoleInfoMap.LoadDataFromFile no Data, new empty object"); //立即保存一下 SaveDataToFile(); } infoMap.Clear(); foreach (var item in infoList.uid_realmid) { infoMap.Add(item.id, item.value); } infoList.uid_realmid.Clear();//留着无用 TraceLog.Trace("RoleInfoMap.LoadDataFromFile end"); } //返回 > public static Dictionary> CheckMailUidList(string[] uids) { Dictionary tmp = new Dictionary(); Dictionary> dict = new Dictionary>(); string splitStr = string.Empty; foreach (var item in uids) { if(long.TryParse(item,out long uid) && uid > 0) { int realmid = 0; if(infoMap.ContainsKey(uid)) { realmid = infoMap[uid]; } if(dict.ContainsKey(realmid)) { dict[realmid].Add(uid); } else { dict.Add(realmid,new List() { uid}); } } } return dict; } } }