265 lines
9.3 KiB
C#
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);
|
|
}
|
|
}
|
|
} |