Files
TEngine/Assets/GameScripts/DotNet/Hotfix/Server/Demo/Gate/C2G_LoginGateHandler.cs
ALEXTANG 336d4b2eb9 [+] 接入ET8服务端
[+] 接入ET8服务端
2023-07-13 12:23:48 +08:00

73 lines
3.1 KiB
C#

using System;
namespace ET.Server
{
[MessageHandler(SceneType.Gate)]
public class C2G_LoginGateHandler : MessageHandler<C2G_LoginGate, G2C_LoginGate>
{
protected override async ETTask Run(Session session, C2G_LoginGate request, G2C_LoginGate response)
{
Scene root = session.Root();
string account = root.GetComponent<GateSessionKeyComponent>().Get(request.Key);
if (account == null)
{
response.Error = ErrorCore.ERR_ConnectGateKeyError;
response.Message = "Gate key验证失败!";
return;
}
session.RemoveComponent<SessionAcceptTimeoutComponent>();
PlayerComponent playerComponent = root.GetComponent<PlayerComponent>();
Player player = playerComponent.GetByAccount(account);
if (player == null)
{
player = playerComponent.AddChild<Player, string>(account);
playerComponent.Add(player);
PlayerSessionComponent playerSessionComponent = player.AddComponent<PlayerSessionComponent>();
playerSessionComponent.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.GateSession);
await playerSessionComponent.AddLocation(LocationType.GateSession);
player.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
await player.AddLocation(LocationType.Player);
session.AddComponent<SessionPlayerComponent>().Player = player;
playerSessionComponent.Session = session;
}
else
{
// 判断是否在战斗
PlayerRoomComponent playerRoomComponent = player.GetComponent<PlayerRoomComponent>();
if (playerRoomComponent.RoomActorId != default)
{
CheckRoom(player, session).Coroutine();
}
else
{
PlayerSessionComponent playerSessionComponent = player.GetComponent<PlayerSessionComponent>();
playerSessionComponent.Session = session;
}
}
response.PlayerId = player.Id;
await ETTask.CompletedTask;
}
private static async ETTask CheckRoom(Player player, Session session)
{
Fiber fiber = player.Fiber();
await fiber.WaitFrameFinish();
using Room2G_Reconnect room2GateReconnect = await fiber.Root.GetComponent<ActorSenderComponent>().Call(
player.GetComponent<PlayerRoomComponent>().RoomActorId,
new G2Room_Reconnect() { PlayerId = player.Id }) as Room2G_Reconnect;
G2C_Reconnect g2CReconnect = new() { StartTime = room2GateReconnect.StartTime, Frame = room2GateReconnect.Frame };
g2CReconnect.UnitInfos.AddRange(room2GateReconnect.UnitInfos);
session.Send(g2CReconnect);
session.AddComponent<SessionPlayerComponent>().Player = player;
player.GetComponent<PlayerSessionComponent>().Session = session;
}
}
}