完成离线消息发送和上线获取离线消息

This commit is contained in:
2025-08-13 23:44:59 +08:00
parent f8b876ca2f
commit 022cc1ac3e
39 changed files with 499 additions and 85 deletions

View File

@@ -15,14 +15,34 @@ public class Chat2G_ChatMessageHandler : Route<Scene, Chat2G_ChatMessage>
{
Message = message.Message,
};
var idList = message.IdList;
bool isAll = !(idList != null && idList.Count > 0);
var gateUnitManage = scene.GetComponent<GateUnitManageComponent>();
foreach (var session in gateUnitManage.ForEachUnitSession())
if (isAll)
{
session.Send(chatMessage);
foreach (var session in gateUnitManage.ForEachUnitSession())
{
session.Send(chatMessage);
}
}
else
{
if (idList == null) return;
foreach (var (_, gateUnit) in gateUnitManage.Units)
{
if (gateUnit.AccountID > 0 && idList.Contains(gateUnit.AccountID))
{
Session session = gateUnit.Session;
if (session != null)
{
session.Send(chatMessage);
}
}
}
}
await FTask.CompletedTask;
}

View File

@@ -29,10 +29,8 @@ public sealed class C2G_LoginRequestHandler : MessageRPC<C2G_LoginRequest, G2C_L
// 在缓存中检查该账号是否存在
var gateUnitManageComponent = scene.GetComponent<GateUnitManageComponent>();
if (!gateUnitManageComponent.TryGet(accountId, out var gateUnit))
{
gateUnit = gateUnitManageComponent.Add(session, accountId);
}
var gateUnit = gateUnitManageComponent.Online(session, accountId);
if (gateUnit == null)
{
@@ -40,11 +38,11 @@ public sealed class C2G_LoginRequestHandler : MessageRPC<C2G_LoginRequest, G2C_L
session.Dispose();
return;
}
response.ErrorCode = await GateLoginHelper.Online(gateUnit);
Log.Debug($"当前的Gate服务器:{session.Scene.SceneConfigId} accountId:{accountId}");
// var gameSceneConfig = GameSceneHelper.GetSceneConfig(session);
//
// // 通过chatSceneConfig拿到这个Scene的RouteId
@@ -71,6 +69,5 @@ public sealed class C2G_LoginRequestHandler : MessageRPC<C2G_LoginRequest, G2C_L
// // 给当前Session添加一个组件当Session销毁的时候会销毁这个组件。
// var accountFlagComponent = session.AddComponent<SessionPlayerComponent>();
// accountFlagComponent.AccountID = accountId;
}
}

View File

@@ -40,6 +40,7 @@ public static class GateLoginHelper
}
gateUnitSessionComponent.AccountID = gateUnit.AccountID;
gateUnitSessionComponent.SessionId = session.RuntimeId;
//安排游戏服务器,并通知进入
@@ -56,14 +57,15 @@ public static class GateLoginHelper
//安排进入的聊天服
var chatRouteId = await ChatSceneHelper.Online(session.Scene, roleSimpleInfo, session.RuntimeId);
var (chatRouteId, sceneRouteId) =
await ChatSceneHelper.Online(session.Scene, roleSimpleInfo, session.RuntimeId);
if (chatRouteId <= 0)
{
return ErrorCode.OnlineSceneFailed;
}
routeComponent.AddAddress(RouteType.ChatRoute, chatRouteId);
gateUnit.ChatSceneRouteId = chatRouteId;
gateUnit.ChatSceneRouteId = sceneRouteId;
Log.Info($"连接聊天服成功gameRouteId:{gameRouteId}");
return ErrorCode.Successful;
}
@@ -75,12 +77,15 @@ public static class GateLoginHelper
/// <summary>
/// 网关通知其他服务器下线
/// </summary>
/// <param name="self"></param>
/// <param name="gateUnit"></param>
public static async FTask<uint> Offline(GateUnit gateUnit)
/// <param name="sessionId"></param>
public static async FTask<uint> Offline(GateUnit gateUnit, long sessionId)
{
await FTask.CompletedTask;
//通知服务器下线
Log.Info($"断线的session id={sessionId} ChatSceneRouteId={gateUnit.ChatSceneRouteId}");
await GameSceneHelper.Offline(gateUnit.Scene, gateUnit.AccountID, sessionId);
await ChatSceneHelper.Offline(gateUnit.Scene, gateUnit.AccountID, sessionId,
gateUnit.ChatSceneRouteId);
return ErrorCode.Successful;
}

View File

@@ -9,7 +9,7 @@ namespace NB.Gate;
public static class GateUnitManageComponentSystem
{
public static GateUnit Add(this GateUnitManageComponent self, Session session, long accountId)
public static GateUnit Online(this GateUnitManageComponent self, Session session, long accountId)
{
if (self.Units.TryGetValue(accountId, out var unit))
{
@@ -34,11 +34,12 @@ public static class GateUnitManageComponentSystem
return self.Units.TryGetValue(accountId, out unit);
}
public static async FTask Remove(this GateUnitManageComponent self, long accountId, bool isDispose = true)
public static async FTask Offline(this GateUnitManageComponent self, long accountId, long sessionId,
bool isDispose = true)
{
if (!self.Units.TryGetValue(accountId, out var unit)) return;
//通知其他服务器下线
var result = await GateLoginHelper.Offline(unit);
var result = await GateLoginHelper.Offline(unit, sessionId);
if (result != 0)
{
Log.Error($"通知其他服务器下线失败,错误码:{result}");
@@ -52,9 +53,10 @@ public static class GateUnitManageComponentSystem
unit.Dispose();
}
}
/// <summary>
/// 话迭代器
/// 话迭代器
/// </summary>
/// <param name="self"></param>
/// <returns></returns>

View File

@@ -9,7 +9,7 @@ public class GateUnitSessionComponentSystem : DestroySystem<GateUnitSessionCompo
var gateUnitManageComponent = self.Scene.GetComponent<GateUnitManageComponent>();
if (gateUnitManageComponent != null)
{
_ = gateUnitManageComponent.Remove(self.AccountID);
_ = gateUnitManageComponent.Offline(self.AccountID, self.SessionId);
}
self.AccountID = 0;