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.
 
 
 
 
 
 

156 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 WorldGlobalDataHandler
{
//临时数据
static Dictionary<string, List<long>> playerUid_map = new Dictionary<string, List<long>>();
//来自gameserver
public static void OnWorldglobaldataDbOpReq(uint remoteAppID, StructPacket packet)
{
// playeruid == packet.ObjectID
PlayerInfoWorld player = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(packet.ObjectID);
if (player == null)
{
TraceLog.Error("WorldGlobalDataHandler.OnWorldglobaldataDbOpReq no player uid {0}", packet.ObjectID);
return;
}
ref SSWorldGlobalDataDBOpReq req = ref packet.GetMessage<SSWorldGlobalDataDBOpReq>();
switch (req.OpType)
{
case WorldGlobalDataDBOpType.Query:
PlayerQueryWorldglobaldata(player,ref req);
break;
case WorldGlobalDataDBOpType.Update:
PlayerUpdateWorldglobaldata(player, ref req);
break;
}
}
public static void OnWorldglobaldataDbOpNewReq(uint remoteAppID, StructPacket packet)
{
ref SSWorldGlobalDataDBOpNewReq req = ref packet.GetMessage<SSWorldGlobalDataDBOpNewReq>();
switch (req.OpType)
{
case WorldGlobalDataDBOpType.Query:
//PlayerQueryWorldglobaldataNew(ref req);
break;
case WorldGlobalDataDBOpType.Update:
//PlayerUpdateWorldglobaldata(player, ref req);
break;
}
}
//来自gamedbserver
public static void OnWorldglobaldataDbOpRes(uint remoteAppID, StructPacket packet)
{
ref SSWorldGlobalDataDBOpRes res = ref packet.GetMessage<SSWorldGlobalDataDBOpRes>();
if(res.Ret != CSErrCode.None)
{
return;//操作失败
}
WorldGlobalDataOne one = WorldGlobalDataUtils.GetWorldGlobalData((int)res.DataType, res.GlobalId, res.DataVer);
string key = WorldGlobalDataUtils.GetDataKey((int)res.DataType, res.GlobalId, res.DataVer);
if (one == null)
{
one = new WorldGlobalDataOne();
one.dataType = res.DataType;
one.globalId = res.GlobalId;
one.dataVer = res.DataVer;
one.needSaveDB = true;
var succ = WorldGlobalDataUtils.ParseFrom(res.DataType,ref one.protoData, WorldGlobalDataUtils.StructToByteArry(ref res.Data));
if(!succ)
{
return;
}
WorldGlobalData gd = WorldServerUtils.GetWorldGlobalData();
gd.allData.Add(key, one);
}
switch (res.OpType)
{
case WorldGlobalDataDBOpType.Query:
//通知玩家
if (playerUid_map.ContainsKey(key))
{
CSWorldGlobalDataNotify notify = new CSWorldGlobalDataNotify();
notify.DataType = res.DataType;
notify.GlobalId = res.GlobalId;
notify.DataVer = res.DataVer;
WorldGlobalDataUtils.CopyToNotify(ref notify, ref one.protoData);
foreach (var playerUid in playerUid_map[key])
{
PlayerInfoWorld player = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(playerUid);
if (player != null)
{
WorldServerUtils.GetPacketSender().SendToServerByID(player.GameServerID, (int)CSGameMsgID.WorldglobaldataNotify, ref notify, playerUid);
}
}
playerUid_map[key].Clear();
}
break;
case WorldGlobalDataDBOpType.Update:
//更新数据
byte[] bty = WorldGlobalDataUtils.ToByteArray(res.DataType, ref one.protoData);
if (WorldGlobalDataUtils.BytesArryEquals(bty, res.Data))
{
one.needSaveDB = false;
}
break;
}
}
private static void PlayerQueryWorldglobaldata(PlayerInfoWorld player, ref SSWorldGlobalDataDBOpReq req)
{
WorldGlobalDataOne one = WorldGlobalDataUtils.GetWorldGlobalData((int)req.DataType, req.GlobalId,req.DataVer);
if (one == null)
{
string key = WorldGlobalDataUtils.GetDataKey((int)req.DataType, req.GlobalId, req.DataVer);
if (!playerUid_map.ContainsKey(key))
{
playerUid_map.Add(key, new List<long>());
}
//没有数据,直接查询(如果超过10个还没返回结果,继续查询)
if (playerUid_map[key].Count == 0 || playerUid_map[key].Count > 10)
{
WorldGlobalDataUtils.QueryWorldGlobalData((int)req.DataType, req.GlobalId, req.DataVer);
}
if(!playerUid_map[key].Contains(player.UserID))
{
playerUid_map[key].Add(player.UserID);
}
}
else
{
//已经有数据了,直接通知玩家
CSWorldGlobalDataNotify res = new CSWorldGlobalDataNotify();
res.DataType = req.DataType;
res.GlobalId = req.GlobalId;
res.DataVer = req.DataVer;
WorldGlobalDataUtils.CopyToNotify(ref res, ref one.protoData);
WorldServerUtils.GetPacketSender().SendToServerByID(player.GameServerID, (int)CSGameMsgID.WorldglobaldataNotify, ref res, player.UserID);
}
}
private static void PlayerQueryWorldglobaldataNew(ref SSWorldGlobalDataDBOpReq req)
{
}
private static void PlayerUpdateWorldglobaldata(PlayerInfoWorld player, ref SSWorldGlobalDataDBOpReq req)
{
WorldGlobalDataUtils.UpdateWorldGlobalData(ref req);
}
}
}