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
134 lines
6.0 KiB
3 years ago
|
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();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|