提交示例代码

This commit is contained in:
Bob.Song
2026-03-05 11:39:06 +08:00
commit 25958f58c3
2534 changed files with 209593 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
using Fantasy.Async;
using Fantasy.Network;
using Fantasy.Platform.Net;
namespace Fantasy;
public static class GateLoginHelper
{
private static readonly List<Func<Scene, GateUnit, long, FTask<(uint, long, int)>>> Scenes =
new List<Func<Scene, GateUnit, long, FTask<(uint, long, int)>>>()
{
// 聊天服务器上线
{ OnlineChat },
// 游戏服务器上线
{ OnlineGame }
};
/// <summary>
/// 上线到其他服务器
/// </summary>
/// <param name="session"></param>
/// <param name="gateUnit"></param>
/// <param name="gateRouteId"></param>
public static async FTask<uint> Online(Session session, GateUnit gateUnit, long gateRouteId)
{
var scene = session.Scene;
// 要实现自动Route转发协议必须要给Session添加一个RouteComponent然后通过它来转发消息。
var routeComponent = session.GetOrAddComponent<RouteComponent>();
// 这里是登录的总入口,在这里会陆续的登录其他服务器,如:聊天服务器、游戏服务器等
foreach (var sceneHandler in Scenes)
{
var (errorCode, routeId, routeType) = await sceneHandler(scene, gateUnit, gateRouteId);
if (errorCode != 0)
{
return errorCode;
}
// 保存上线过的RouteId用于下线时通知其他服务器下线
gateUnit.Routes[routeType] = routeId;
// 添加到路由地址中只有添加了这个路由映射地址才会自动的从Gate转发到Chat
routeComponent.AddAddress(routeType, routeId);
}
return 0;
}
/// <summary>
/// 通知其他服务器下线
/// </summary>
/// <param name="gateUnit"></param>
public static async FTask<uint> Offline(GateUnit gateUnit)
{
var networkMessagingComponent = gateUnit.Scene.NetworkMessagingComponent;
foreach (var (routeType, routeId) in gateUnit.Routes)
{
switch (routeType)
{
case RouteType.ChatRoute:
{
var response =
(Chat2G_OfflineResponse)await networkMessagingComponent.CallInnerRoute(routeId,
new G2Chat_OfflineRequest());
if (response.ErrorCode != 0)
{
return response.ErrorCode;
}
continue;
}
}
}
gateUnit.Routes.Clear();
return 0;
}
/// <summary>
/// 聊天服务器上线
/// </summary>
/// <param name="scene"></param>
/// <param name="gateUnit"></param>
/// <param name="gateRouteId"></param>
/// <returns></returns>
private static async FTask<(uint errorCode, long routeId, int routeType)> OnlineChat(Scene scene, GateUnit gateUnit, long gateRouteId)
{
// 登录聊天服务器
var chatConfig = SceneConfigData.Instance.GetSceneBySceneType(SceneType.Chat)[0];
// 咱们框架中如果要Scene和Scene之间通讯必须要用到NetworkMessagingComponent通过它来发送没有其他办法。
var response = (Chat2G_LoginResponse)await scene.NetworkMessagingComponent.CallInnerRoute(chatConfig.RouteId,
new G2Chat_LoginRequest()
{
UserName = gateUnit.UserName,
UnitId = gateUnit.Id,
GateRouteId = gateRouteId
});
return (response.ErrorCode, response.ChatRouteId, RouteType.ChatRoute);
}
/// <summary>
/// 游戏服务器上线
/// </summary>
/// <param name="scene"></param>
/// <param name="gateUnit"></param>
/// <param name="gateRouteId"></param>
/// <returns></returns>
private static async FTask<(uint errorCode, long routeId, int routeType)> OnlineGame(Scene scene, GateUnit gateUnit, long gateRouteId)
{
// 登录聊天服务器
var mapConfig = SceneConfigData.Instance.GetSceneBySceneType(SceneType.Map)[0];
var response = (M2G_LoginResponse)await scene.NetworkMessagingComponent.CallInnerRoute(mapConfig.RouteId,
new G2M_LoginRequest()
{
ChatUnitRouteId = gateUnit.Routes[RouteType.ChatRoute]
});
return (response.ErrorCode, response.MapRouteId, RouteType.GateRoute);
}
}

View File

@@ -0,0 +1,105 @@
using Fantasy.Async;
using Fantasy.Network;
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
#pragma warning disable CS8602 // Dereference of a possibly null reference.
namespace Fantasy;
public static class GateUnitHelper
{
/// <summary>
/// GateUnit上线
/// </summary>
/// <param name="scene"></param>
/// <param name="userName"></param>
/// <param name="session"></param>
/// <returns></returns>
public static GateUnit Online(Scene scene, string userName, Session session)
{
// 增加一个GateUnit到缓存中、如果缓存中已经存在直接返回缓存中的实体数据
return scene.GetComponent<GateUnitManageComponent>().Add(userName, session);
}
/// <summary>
/// GateUnit下线
/// </summary>
/// <param name="scene"></param>
/// <param name="gateUnitId"></param>
public static void Offline(Scene scene, long gateUnitId)
{
if (!scene.GetComponent<GateUnitManageComponent>().TryGet(gateUnitId, out var gateUnit))
{
return;
}
gateUnit.GetOrAddComponent<EntityTimeoutComponent>().SetTimeout(5000);
}
/// <summary>
/// 缓存中获取一个GateUnit
/// </summary>
/// <param name="scene"></param>
/// <param name="userName"></param>
/// <returns></returns>
public static GateUnit? Get(Scene scene, string userName)
{
return scene.GetComponent<GateUnitManageComponent>().Get(userName);
}
/// <summary>
/// 缓存中获取一个GateUnit
/// </summary>
/// <param name="scene"></param>
/// <param name="gateUnitId"></param>
/// <returns></returns>
public static GateUnit? Get(Scene scene, long gateUnitId)
{
return scene.GetComponent<GateUnitManageComponent>().Get(gateUnitId);
}
/// <summary>
/// 尝试获取一个GateUnit
/// </summary>
/// <param name="scene"></param>
/// <param name="userName"></param>
/// <param name="gateUnit"></param>
/// <returns></returns>
public static bool TryGet(Scene scene, string userName, out GateUnit? gateUnit)
{
return scene.GetComponent<GateUnitManageComponent>().TryGet(userName, out gateUnit);
}
/// <summary>
/// 尝试获取一个GateUnit
/// </summary>
/// <param name="scene"></param>
/// <param name="gateUnitId"></param>
/// <param name="gateUnit"></param>
/// <returns></returns>
public static bool TryGet(Scene scene, long gateUnitId, out GateUnit? gateUnit)
{
return scene.GetComponent<GateUnitManageComponent>().TryGet(gateUnitId, out gateUnit);
}
/// <summary>
/// 在缓存中移除一个GateUnit
/// </summary>
/// <param name="scene"></param>
/// <param name="userName"></param>
/// <param name="isDispose"></param>
public static FTask Remove(Scene scene, string userName, bool isDispose = true)
{
return scene.GetComponent<GateUnitManageComponent>().Remove(userName, isDispose);
}
/// <summary>
/// 在缓存中移除一个GateUnit
/// </summary>
/// <param name="scene"></param>
/// <param name="gateUnitId"></param>
/// <param name="isDispose"></param>
public static FTask Remove(Scene scene, long gateUnitId, bool isDispose = true)
{
return scene.GetComponent<GateUnitManageComponent>().Remove(gateUnitId, isDispose);
}
}