You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
6.6 KiB
196 lines
6.6 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
using Sog;
|
|
using ProtoCSStruct;
|
|
|
|
namespace World
|
|
{
|
|
public static class WorldGlobalDataUtils
|
|
{
|
|
public static string GetDataKey(int dataType, int globalId,int dataVer)
|
|
{
|
|
return dataType.ToString() + "|" + globalId + "|" + dataVer;
|
|
}
|
|
public static bool UpdateWorldGlobalData(ref SSWorldGlobalDataDBOpReq req)
|
|
{
|
|
|
|
WorldGlobalData gd = WorldServerUtils.GetWorldGlobalData();
|
|
var AllData = gd.allData;
|
|
|
|
string key = GetDataKey((int)req.DataType, req.GlobalId,req.DataVer);
|
|
|
|
if (!AllData.ContainsKey(key))
|
|
{
|
|
//出错了,数据还没加载出来
|
|
TraceLog.Error("WorldGlobalDataUtils.UpdateWorldGlobalData not load data key {0} form db",key);
|
|
return false;
|
|
}
|
|
AllData[key].needSaveDB = true;
|
|
AllData[key].needBroadcast = true;
|
|
|
|
return true;
|
|
}
|
|
|
|
public static WorldGlobalDataOne GetWorldGlobalData(int dataType, int globalId, int dataVer)
|
|
{
|
|
WorldGlobalData gd = WorldServerUtils.GetWorldGlobalData();
|
|
var AllData = gd.allData;
|
|
string key = GetDataKey(dataType, globalId, dataVer);
|
|
if (AllData.ContainsKey(key))
|
|
{
|
|
return AllData[key];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
//停止时判断数据是否都保存了
|
|
public static bool IsAllDataSave()
|
|
{
|
|
WorldGlobalData gd = WorldServerUtils.GetWorldGlobalData();
|
|
foreach (var item in gd.allData.Values)
|
|
{
|
|
if(item.needSaveDB)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//查询数据
|
|
public static void QueryWorldGlobalData(int dataType, int globalId, int dataVer)
|
|
{
|
|
SSWorldGlobalDataDBOpReq req = new SSWorldGlobalDataDBOpReq();
|
|
req.OpType = WorldGlobalDataDBOpType.Query;
|
|
req.DataType = (WorldGlobalDataType)dataType;
|
|
req.GlobalId = globalId;
|
|
req.DataVer = dataVer;
|
|
uint dbServerID = DBServerIDUtils.GetGameDBServerID(0);
|
|
WorldServerUtils.GetPacketSender().SendToServerByID(dbServerID, (int)SSGameMsgID.WorldglobaldataDbOpReq, ref req,0);
|
|
}
|
|
|
|
//保存数据
|
|
public static void SaveAllWorldGlobalData()
|
|
{
|
|
uint dbServerID = DBServerIDUtils.GetGameDBServerID(0);
|
|
SSWorldGlobalDataDBOpReq req = new SSWorldGlobalDataDBOpReq();
|
|
req.OpType = WorldGlobalDataDBOpType.Update;
|
|
|
|
WorldGlobalData gd = WorldServerUtils.GetWorldGlobalData();
|
|
foreach (var item in gd.allData.Values)
|
|
{
|
|
if (item.needSaveDB)
|
|
{
|
|
req.DataType = item.dataType;
|
|
req.GlobalId = item.globalId;
|
|
req.DataVer = item.dataVer;
|
|
bool needSend = ByteArryToStruct(ref req.Data, ToByteArray(req.DataType,ref item.protoData));
|
|
//存储数据
|
|
if (needSend)
|
|
{
|
|
WorldServerUtils.GetPacketSender().SendToServerByID(dbServerID, (int)SSGameMsgID.WorldglobaldataDbOpReq, ref req, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void BroadcastAllWorldGlobalData(bool onlyGame = false)
|
|
{
|
|
CSWorldGlobalDataNotify notify = new CSWorldGlobalDataNotify();
|
|
|
|
WorldGlobalData gd = WorldServerUtils.GetWorldGlobalData();
|
|
foreach (var item in gd.allData.Values)
|
|
{
|
|
if (item.needBroadcast)
|
|
{
|
|
if(onlyGame)
|
|
{
|
|
continue;
|
|
}
|
|
item.needBroadcast = false;
|
|
notify.DataType = item.dataType;
|
|
notify.GlobalId = item.globalId;
|
|
notify.DataVer = item.dataVer;
|
|
|
|
bool needSend = CopyToNotify(ref notify,ref item.protoData);
|
|
//广播数据
|
|
if (needSend)
|
|
{
|
|
WorldServerUtils.GetPacketSender().Broadcast((int)ServerType.Game, (int)CSGameMsgID.WorldglobaldataNotify, ref notify, 0,0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//struct 和 byte 转换
|
|
private static bool ByteArryToStruct(ref RepeatedByte_1024 data,byte[] buffer)
|
|
{
|
|
if (buffer == null)
|
|
{
|
|
return false;
|
|
}
|
|
for (int i = 0; i < buffer.Length && i < data.GetMaxCount(); i++)
|
|
{
|
|
data.Add(buffer[i]);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static byte[] StructToByteArry(ref RepeatedByte_1024 data)
|
|
{
|
|
byte[] buffer = new byte[data.Count];
|
|
for (int i = 0; i < data.Count; i++)
|
|
{
|
|
buffer[i] = data[i];
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
//协议 数据 之间的转换
|
|
public static bool BytesArryEquals(byte[] b1, RepeatedByte_1024 b2)
|
|
{
|
|
if (b1 == null) return false;
|
|
if (b1.Length != b2.Count) return false;
|
|
for (int i = 0; i < b1.Length; i++)
|
|
if (b1[i] != b2[i])
|
|
return false;
|
|
return true;
|
|
}
|
|
public static bool ParseFrom(WorldGlobalDataType dataType, ref IStructMessage protoData,byte[] buffer)
|
|
{
|
|
if (buffer == null)
|
|
{
|
|
return false;
|
|
}
|
|
switch (dataType)
|
|
{
|
|
default:
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static byte[] ToByteArray(WorldGlobalDataType dataType, ref IStructMessage protoData)
|
|
{
|
|
switch (dataType)
|
|
{
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
public static bool CopyToNotify(ref CSWorldGlobalDataNotify notify, ref IStructMessage protoData)
|
|
{
|
|
switch (notify.DataType)
|
|
{
|
|
default:
|
|
TraceLog.Trace("WorldGlobalDataUtils.CopyToNotify type {0} error", notify.DataType);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|