using Fantasy; using Fantasy.Async; using Fantasy.Platform.Net; namespace NB.Chat; public static class SocialSceneHelper { #region 消息发送 /// /// 发送一条私聊 /// /// /// /// /// public static void PrivateMessage(Scene scene, long selfId, long targetId, ChatMessageInfo message) { var chatUnitManage = scene.GetComponent(); if (chatUnitManage == null) return; var chatUnit = chatUnitManage.Get(targetId); message.Type = 1; message.Source = selfId; if (chatUnit != null) { //对方在线 BroadcastAll(scene, message, [targetId]); } else { //对方不在线,存入待领取列表,等待玩家下次登录领取 chatUnitManage.SaveOfflineMessage(targetId, message); } } /// /// 发送一条地图消息 /// /// /// /// public static void BroadcastMap(Scene scene, long mapId, ChatMessageInfo message) { var chatUnitManage = scene.GetComponent(); if (chatUnitManage == null) return; HashSet targets = new HashSet(); foreach (var (_, chatUnit) in chatUnitManage.Units) { if (chatUnit.MapId == mapId) { targets.Add(chatUnit.Id); } } if (targets.Count < 1) { Log.Info("地图在线人数为0,群发取消"); return; } BroadcastAll(scene, message, targets); } /// /// 发送一条频道消息 /// /// /// /// public static void BroadcastChannel(Scene scene, long channelId, ChatMessageInfo message) { var chatUnitManage = scene.GetComponent(); if (chatUnitManage == null) return; HashSet targets = new HashSet(); foreach (var (_, chatUnit) in chatUnitManage.Units) { if (chatUnit.CurrentChannel == channelId) { targets.Add(chatUnit.Id); } } if (targets.Count < 1) { Log.Info("频道在线人数为0,群发取消"); return; } BroadcastAll(scene, message, targets); } /// /// 广播消息给所有人 /// /// /// /// public static void BroadcastAll(Scene scene, ChatMessageInfo message, HashSet? targets = null) { //发送给所有Gate服务器,让Gate转发给其他客户端 var gateConfigs = SceneConfigData.Instance.GetSceneBySceneType(SceneType.Gate); var sendMessage = new S2G_ChatMessage() { Message = message, }; if (targets != null && targets.Count > 0) { sendMessage.IdList.AddRange(targets); } var networkMessagingComponent = scene.NetworkMessagingComponent; foreach (var config in gateConfigs) { //发送给Gate服务器转发消息 networkMessagingComponent.SendInnerRoute(config.RouteId, sendMessage); } } #endregion #region 上线下线 public static async FTask<(long, long)> Online(Scene scene, RoleSimpleInfo roleSimple, long gateRuntimeId) { var gameSceneConfig = GetSceneConfig(); var gameRouteId = gameSceneConfig.RouteId; //连接到游戏中心服 var gameResponse = (S2G_EnterResponse)await scene.NetworkMessagingComponent.CallInnerRoute( gameRouteId, new G2S_EnterRequest() { Role = roleSimple, GateRouteId = gateRuntimeId }); if (gameResponse.ErrorCode != 0) { return (0, 0); } return (gameResponse.RoleRouteId, gameRouteId); // return gameRouteId; } public static async FTask Offline(Scene scene, long accountId, long gateRuntimeId, long sceneRouteId) { for (int i = 0; i < 10; i++) { var gameResponse = (S2G_ExitResponse)await scene.NetworkMessagingComponent.CallInnerRoute( sceneRouteId, new G2S_ExitRequest() { AccountId = accountId, GateRouteId = gateRuntimeId }); if (gameResponse.ErrorCode == 0) { return; } } Log.Error("重试多次还是退出失败,需检查"); } private static SceneConfig GetSceneConfig() { var gameSceneConfigs = SceneConfigData.Instance.GetSceneBySceneType(SceneType.Social); return gameSceneConfigs.First(); } #endregion }