TH1/Unity/Assets/Scripts/TH1_Logic/Steam/GameNetSender.cs
2026-02-28 19:30:56 +08:00

265 lines
9.3 KiB
C#

/*
* @Author: 白哉
* @Description:
* @Date: 2025年09月08日 星期一 17:09:18
* @Modify:
*/
using Logic;
using Logic.Action;
using Logic.AI;
using Logic.CrashSight;
using RuntimeData;
using TH1_Logic.Chat;
using TH1_Logic.Core;
using TH1_Logic.Net;
namespace TH1_Logic.Steam
{
public class GameNetSender
{
public static GameNetSender Instance { get; } = new GameNetSender();
private static float RecordTime;
// 发送消息给房主
public void SendMessage(BaseMessage message)
{
if (LobbyManager.Instance.Lobby.IsLobbyOwner()) return;
byte[] messageBytes = MemoryPack.MemoryPackSerializer.Serialize(message);
LobbyManager.Instance.Lobby.SendMessageToPeer(LobbyManager.Instance.Lobby.GetLobbyOwnerId(), messageBytes);
}
// 发送消息给指定人
public void SendMessageToPlayer(ulong memberId, BaseMessage message)
{
byte[] messageBytes = MemoryPack.MemoryPackSerializer.Serialize(message);
LobbyManager.Instance.Lobby.SendMessageToPeer(memberId, messageBytes);
}
// 房主广播消息给所有成员
public void BroadcastMessage(BaseMessage message)
{
if (!LobbyManager.Instance.Lobby.IsLobbyOwner()) return;
byte[] messageBytes = MemoryPack.MemoryPackSerializer.Serialize(message);
LobbyManager.Instance.Lobby.BroadcastMessage(messageBytes);
}
// 房主广播消息给所有成员
public void SendMessageToAllPlayer(BaseMessage message)
{
byte[] messageBytes = MemoryPack.MemoryPackSerializer.Serialize(message);
LobbyManager.Instance.Lobby.BroadcastMessage(messageBytes);
}
// 广播字符串
public void BroadcastString(string str)
{
var data = new StringMessage();
data.Content = str;
SendMessageToAllPlayer(data);
}
// 游戏开始
public void GameStart()
{
var data = new GameStartMessage();
data.MapData = Main.MapData;
BroadcastMessage(data);
}
// 请求行为 (成员 => 房主)
public void ActionConfirm(CommonActionId id, CommonActionParams param)
{
var actionData = new ActionNetData();
actionData.Version = Main.MapData.Net.GetActionVersion();
actionData.MapHash = NetData.GetMapDataHash(Main.MapData);
actionData.Param = param;
actionData.ActionId = id;
var data = new ActionConfirmMessage();
data.ActionData = actionData;
SendMessage(data);
}
// 行为执行 (房主 => 所有成员)
public void ActionExecute(CommonActionId id, CommonActionParams param)
{
var actionData = new ActionNetData();
actionData.Version = Main.MapData.Net.GetActionVersion();
actionData.MapHash = NetData.GetMapDataHash(Main.MapData);
actionData.Param = param;
actionData.ActionId = id;
var data = new ActionExcuteMessage();
data.ActionData = actionData;
// // TODO 这里是测试,每帧最多只发送一次
// if (RecordTime < Time.time)
// {
// data.Map = Main.MapData;
// RecordTime = Time.time + 0.2f;
// }
BroadcastMessage(data);
}
// 请求回合结束 (成员 => 房主)
public void TurnEndConfirm()
{
var data = new TurnEndMessage();
data.PlayerId = Main.MapData.PlayerMap.SelfPlayerId;
SendMessage(data);
}
// 游戏数据心跳校验 (成员 => 房主)
public void MapConfirm()
{
var data = new MapConfirmMessage();
data.MemberId = LobbyManager.Instance.Lobby.GetSelfMemberId();
data.PlayerId = Main.MapData.PlayerMap.SelfPlayerId;
data.Index = Main.MapData.Net.Actions.Count;
if (data.Index > 0) data.ActionData = Main.MapData.Net.Actions[^1];
SendMessage(data);
}
// 游戏数据心跳校验 (房主 => 所有成员)
public void BroadcastMapConfirm()
{
var data = new MapConfirmMessage();
data.MemberId = LobbyManager.Instance.Lobby.GetSelfMemberId();
data.PlayerId = Main.MapData.PlayerMap.SelfPlayerId;
data.Index = Main.MapData.Net.Actions.Count;
if (data.Index > 0) data.ActionData = Main.MapData.Net.Actions[^1];
BroadcastMessage(data);
}
// 强制更新 (房主 => 单成员)
public void ForceUpdate(ulong memberId)
{
if (memberId == 0) return;
var data = new ForceUpdateMessage();
data.MapData = Main.MapData;
SendMessageToPlayer(memberId, data);
}
// 强制更新 (房主 => 所有成员)
public void BroadcastForceUpdate()
{
var data = new ForceUpdateMessage();
data.MapData = Main.MapData;
BroadcastMessage(data);
}
// 修改阵营 (成员 => 房主)
public void ChangeCiv(MemberCiv memberCiv)
{
if (memberCiv == null)
{
LogSystem.LogError($"Get Self MemberCiv Error ");
return;
}
var data = new ChangeCivMessage();
data.Civ = memberCiv;
SendMessage(data);
}
// 更新房间配置 (房主 => 所有成员)
public void UpdateLobbyData(MapConfig config)
{
if (!LobbyManager.Instance.Lobby.IsLobbyOwner()) return;
var data = new UpdateLobbyDataMessage();
data.Config = config;
BroadcastMessage(data);
}
// 请求更新房间配置 (单成员 => 房主)
public void RequestLobbyData()
{
var data = new RequestLobbyDataMessage();
data.MemberId = LobbyManager.Instance.Lobby.GetSelfMemberId();
SendMessage(data);
}
// 更新房间配置 (房主 => 单成员)
public void SendLobbyData(MapConfig config, ulong memberId)
{
if (!LobbyManager.Instance.Lobby.IsLobbyOwner() || memberId == 0) return;
var data = new UpdateLobbyDataMessage();
data.Config = config;
SendMessageToPlayer(memberId, data);
}
// 心跳 (单成员 => 房主) 成员的心跳包
public void SendHeartbeat()
{
// 确认发送记录
var confirm = Main.Instance.ConfirmMap.GetPlayerConfirm(LobbyManager.Instance.Lobby.GetSelfMemberId());
confirm.OnSendHeartbeat();
// 发送
var data = new HeartbeatMessage();
data.MemberId = LobbyManager.Instance.Lobby.GetSelfMemberId();
data.State = Main.Instance.GameLogic.GetCurState();
SendMessage(data);
}
// 成员状态下发 (房主 => 成员) 房主的心跳包
public void SendMemberStateSync()
{
if (Main.MapData == null) return;
// 确认发送记录
var selfId = LobbyManager.Instance.Lobby.GetSelfMemberId();
foreach (var kv in Main.Instance.ConfirmMap.PlayerConfirm)
{
if (kv.Key == selfId) continue;
kv.Value.OnSendHeartbeat();
}
// 发送
var data = new MemberStateSyncMessage();
data.State = Main.Instance.GameLogic.GetCurState();
data.MemberId = LobbyManager.Instance.Lobby.GetSelfMemberId();
data.PlayerConfirm = Main.Instance.ConfirmMap.PlayerConfirm;
BroadcastMessage(data);
}
// 请求重连 (单成员 => 房主)
public void SendRequestForceUpdate()
{
if (Main.Instance.GameLogic.GetCurState() == GameState.ForceUpdating) return;
LogSystem.LogError($"客户端请求重连: SendRequestForceUpdate");
var data = new RequestForceUpdateMessage();
data.MemberId = LobbyManager.Instance.Lobby.GetSelfMemberId();
SendMessage(data);
Main.Instance.GameLogic.ChangeState(GameState.ForceUpdating);
}
// 心跳包回复 (任意成员 => 任意成员)
public void SendHeartbeatReply(ulong memberId)
{
var data = new HeartbeatReplyMessage();
data.MemberId = LobbyManager.Instance.Lobby.GetSelfMemberId();
SendMessageToPlayer(memberId, data);
}
// 发送聊天内容 (单成员 => 房主)
public void SendChatMessage(ChatItem item)
{
var data = new ChatMessage();
data.Item = item;
SendMessage(data);
}
// 发送聊天内容 (房主 => 所有成员)
public void BroadcastChatMessage(ChatItem item)
{
var data = new ChatMessage();
data.Item = item;
BroadcastMessage(data);
}
}
}