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.

134 lines
6.0 KiB

using System;
using NLog;
using NLog.LayoutRenderers;
namespace ET
{
[FriendClass(typeof(SessionStateComponent))]
[FriendClass(typeof(SessionPlayerComponent))]
[FriendClass(typeof(GateMapComponent))]
public class C2G_EnterGameHandler: AMRpcHandler<C2G_EnterGame, G2C_EnterGame>
{
protected override async ETTask Run(Session session, C2G_EnterGame request, G2C_EnterGame response, Action reply)
{
Scene domainScene = session.DomainScene();
if (domainScene.SceneType != SceneType.Gate)
{
Log.Error($"请求的Scene错误,当前场景为:{session.DomainScene().SceneType}");
session.Dispose();
return;
}
if (session.GetComponent<SessionLockingComponent>() != null)
{
response.Error = ErrorCode.ERR_RequestRepeadtedly;
reply();
return;
}
var sessionPlayerComponent = session.GetComponent<SessionPlayerComponent>();
if (null == sessionPlayerComponent)
{
response.Error = ErrorCode.ERR_SessionPlayerError;
reply();
return;
}
Player player = Game.EventSystem.Get(sessionPlayerComponent.PlayerInstanceId) as Player;
if (player == null || player.IsDisposed)
{
response.Error = ErrorCode.ERR_NonePlayerError;
reply();
return;
}
long instanceId = session.InstanceId;
using (session.AddComponent<SessionLockingComponent>())
{
using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.LoginGate, player.AccountId.GetHashCode()))
{
if (instanceId != session.InstanceId || player.IsDisposed)
{
response.Error = ErrorCode.ERR_SessionPlayerError;
reply();
return;
}
var sessionStateComp = session.GetComponent<SessionStateComponent>();
if (sessionStateComp != null && sessionStateComp.State == SessionState.Game)
{
response.Error = ErrorCode.ERR_SessionStateError;
reply();
return;
}
if (player.PlayerState == PlayerState.Game)
{
try
{
IActorResponse reqEnter = await MessageHelper.CallLocationActor(player.UnitId, new G2M_RequestEnterGameState());
if (reqEnter.Error == ErrorCode.ERR_Success)
{
reply();
return;
}
Log.Error("二次登入失败 " + reqEnter.Error + "|" + reqEnter.Message);
response.Error = ErrorCode.ERR_ReEnterGameError;
await DisconnectHelper.KickPlayer(player, true);
reply();
session?.Disconnect().Coroutine();
}
catch (Exception e)
{
Log.Error("二次登入失败 " + e.ToString());
response.Error = ErrorCode.ERR_ReEnterGameError;
await DisconnectHelper.KickPlayer(player, true);
reply();
session?.Disconnect().Coroutine();
throw;
}
return;
}
try
{
GateMapComponent gateMapComponent = player.AddComponent<GateMapComponent>();
gateMapComponent.Scene = await SceneFactory.Create(gateMapComponent, "GateMap", SceneType.Map);
// 从数据库或者缓存中加载出Unit实体及相关组件
Unit unit = await UnitFactory.Create(gateMapComponent.Scene, player.UnitId);
//unit.AddComponent<UnitGateComponent, long>(session.InstanceId);
// 顶号操作时,session可能发生变化,所以要使用不变的player.InstanceId
// 相应的消息分发方法也要有修改,在SessionStreamDispatcherSeverInner.cs的Dispatch方法中
unit.AddComponent<UnitGateComponent, long>(player.InstanceId);
long unitId = unit.Id;
response.UnitId = unitId;
reply();
var index = 2;//RandomHelper.RandomNumber(1, 5);
StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(session.DomainZone(), "Game_"+index);
Log.Debug("========================================index======{0}","Game_"+index);
await TransferHelper.Transfer(unit, startSceneConfig.InstanceId, startSceneConfig.Name);
player.UnitId = unitId;
SessionStateComponent sessionStateComponent = session.GetComponent<SessionStateComponent>();
sessionStateComponent.State = SessionState.Game;
player.PlayerState = PlayerState.Game;
}
catch (Exception e)
{
Log.Error($"角色进入游戏逻辑服出现问题 账号Id:{player.AccountId} 角色Id:{player.Id} 异常信息:{e.ToString()}");
response.Error = ErrorCode.ERR_EnterGameError;
reply();
await DisconnectHelper.KickPlayer(player, true);
session.Disconnect().Coroutine();
}
}
}
}
}
}