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.
 
 
 
 
 
 

154 lines
6.6 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Sog;
using Sog.Service;
using ProtoCSStruct;
namespace GameDB
{
public class GameDBMsgHandler : BaseReloadableService
{
public override int GetServiceType()
{
return GameDBServiceType.GameDBMsgHandler;
}
//销毁的时候置空
public override void Dispose()
{
}
public void HandlerMessage(uint remoteAppID, MessageData message)
{
StructPacket packet;
bool bSuccess = GameDBServerUtils.GetProtoPacker().UnpackMessage(message, out packet);
if (bSuccess == false)
{
TraceLog.Error("GameDBMsgHandler.HandlerMessage ,unpack msg failed {0}, remoteAppID {1}", message.Header.Type, remoteAppID);
return;
}
packet = packet.Clone();
//预先判断,提高效率
if (TraceLog.GetLogLevel() <= (int)Sog.Log.LogLevel.TraceDetail
&& TraceLog.IsSkipLogMsgID(packet.MsgID) == false)
{
TraceLog.TraceDetail("GameDBMsgHandler recv message from server {0}, message type {1} length {2} : {3}->{4}"
, ServerIDUtils.IDToString(remoteAppID)
, message.Header.Type
, message.Header.Length
, packet.MessageName()
, packet.ToString());
}
long uid = GetUidFromPacket(packet);
//long reamId = AccountUtils.GetGameIdFromUserId(uid);
int iTaskIndex = 0;
switch (packet.MsgID)
{
case (int)SSGameMsgID.AddServerTimeSync:
OnAddServerTimeSync(remoteAppID, packet);
//不往后走了,直接return
return;
case (int)SSGameMsgID.QueryMailReq://已废弃走此路线,通过MailServer处理
case (int)SSGameMsgID.MailOpReq:
TraceLog.Error("GameDBMsgHandler.HandlerMessage error mail MsgID {0}", packet.MsgID);
return;
default:
TraceLog.Debug("GameDBMsgHandler.HandlerMessage GetUidFromPacket MsgID {0} uid {1}", packet.MsgID, uid);
iTaskIndex = (int)(uid % MessageTaskHandler.GameDBWorkThreadCount);
break;
}
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private long GetUidFromPacket(StructPacket packet)
{
switch (packet.MsgID)
{
case (int)SSGameMsgID.QueryRoleDbReq:
ref SSQueryRoleDbReq queryRoleReq = ref packet.GetMessage<SSQueryRoleDbReq>();
return queryRoleReq.Uid;
case (int)SSGameMsgID.SaveRoleReq:
ref SSSaveRoleReq saveRoleReq = ref packet.GetMessage<SSSaveRoleReq>();
return saveRoleReq.RoleBase.Uid;
case (int)SSGameMsgID.FirebaseidSaveDbReq:
return packet.ObjectID;
case (int)SSGameMsgID.FirebaseidQueryDbReq:
return packet.ObjectID;
case (int)SSGameMsgID.GmSetFreezeTime:
return packet.ObjectID;
case (int)SSGameMsgID.GmQueryUserPayRecordReq:
return packet.ObjectID;
case (int)SSGameMsgID.EnableSendMsgReq:
ref SSEnableSendMsgReq enableMsgReq = ref packet.GetMessage<SSEnableSendMsgReq>();
return enableMsgReq.Uid;
//friend
case (int)SSGameMsgID.QueryFriendListReq:
ref SSQueryFriendListReq queryFriendListReq = ref packet.GetMessage<SSQueryFriendListReq>();
return queryFriendListReq.Uid;
case (int)SSGameMsgID.QueryFriendInfoCacheReq:
ref SSQueryFriendInfoCacheReq queryFriendInfoCacheReq = ref packet.GetMessage<SSQueryFriendInfoCacheReq>();
return queryFriendInfoCacheReq.Uid;
case (int)SSGameMsgID.SaveFriendListReq:
ref SSSaveFriendListReq saveFriendListReq = ref packet.GetMessage<SSSaveFriendListReq>();
return saveFriendListReq.Uid;
//rank
case (int)SSGameMsgID.QueryRankDbReq:
return packet.ObjectID;
case (int)SSGameMsgID.SaveRankDbReq:
return packet.ObjectID;
case (int)SSGameMsgID.QueryActRankDbReq:
return packet.ObjectID;
case (int)SSGameMsgID.SaveActRankDataReq:
return packet.ObjectID;
case (int)SSGameMsgID.PlayerQueryOfflineRoleReq:
return packet.ObjectID;
case (int)SSGameMsgID.PlayerSearchRoledbBynameReq:
return packet.ObjectID;
case (int)SSGameMsgID.GmQueryUserRoleReq:
case (int)SSGameMsgID.OperationCostItemReq:
//case (int)SSGameMsgID.QueryArenaRankReq:
case (int)SSGameMsgID.QueryBattleReplayDbReq:
case (int)SSGameMsgID.SaveBattleReplayDbReq:
case (int)SSGameMsgID.DeleteBattleReplayDbReq:
case (int)SSGameMsgID.AddServerTimeSync:
case (int)SSGameMsgID.OperationUpdateTaskReq:
case (int)SSGameMsgID.GmUpdateUserRoleReq:
case (int)SSGameMsgID.GmImportUserRoleReq:
return packet.ObjectID;
case (int)SSGameMsgID.WorldglobaldataDbOpReq:
return packet.ObjectID;
default:
TraceLog.Error("GameDBMsgHandler.GetUidFromPacket unknow MsgID {0}", packet.MsgID);
break;
}
//其他情况一律返回0
return 0;
}
public void OnAddServerTimeSync(uint remoteAppID, StructPacket packet)
{
ref SSAddServerTimeSync sync = ref packet.GetMessage<SSAddServerTimeSync>();
TraceLog.Debug("GameDBMsgHandler.OnAddServerTimeSync serverid {0} offset {1}"
, ServerIDUtils.IDToString(remoteAppID), sync.Offset);
GameDBServerUtils.GetApp().Time.SetOffset(sync.Offset);
GameDBServerUtils.GetApp().Time.UpdateTime();
TraceLog.Debug("GameDBMsgHandler.OnAddServerTimeSync serverid {0} offset {1} set time success"
, ServerIDUtils.IDToString(remoteAppID), sync.Offset);
}
}
}