166 lines
6.3 KiB
C#
166 lines
6.3 KiB
C#
using Logic.Action;
|
|
using Logic.CrashSight;
|
|
using RuntimeData;
|
|
using Steamworks;
|
|
using TH1_Logic.Core;
|
|
using TH1_Logic.Net;
|
|
|
|
namespace TH1_Logic.Steam
|
|
{
|
|
public class GameNetReceiver
|
|
{
|
|
public static GameNetReceiver Instance { get; } = new GameNetReceiver();
|
|
|
|
|
|
public void OnMessageReceived(byte[] data)
|
|
{
|
|
var message = MemoryPack.MemoryPackSerializer.Deserialize<BaseMessage>(data);
|
|
if (message == null) return;
|
|
|
|
if (message.MessageType == P2PMsgType.String) OnReceivedString((StringMessage)message);
|
|
if (message.MessageType == P2PMsgType.GameStart) OnReceivedGameStart((GameStartMessage)message);
|
|
if (message.MessageType == P2PMsgType.ActionConfirm) OnReceivedActionConfirm((ActionConfirmMessage)message);
|
|
if (message.MessageType == P2PMsgType.ActionExcute) OnReceivedActionExcute((ActionExcuteMessage)message);
|
|
if (message.MessageType == P2PMsgType.TurnEnd) OnReceivedTurnEnd((TurnEndMessage)message);
|
|
if (message.MessageType == P2PMsgType.MapConfirm) OnReceivedMapConfirm((MapConfirmMessage)message);
|
|
if (message.MessageType == P2PMsgType.ForceUpdate) OnReceivedForceUpdate((ForceUpdateMessage)message);
|
|
}
|
|
|
|
// 基础字符串消息
|
|
private void OnReceivedString(StringMessage message)
|
|
{
|
|
if (message == null)
|
|
{
|
|
LogSystem.LogError($"消息解析失败: OnReceivedString");
|
|
return;
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(message.Content)) return;
|
|
LogSystem.LogInfo($"收到消息 : {message.Content}");
|
|
}
|
|
|
|
// 只有玩家会收到
|
|
private void OnReceivedGameStart(GameStartMessage message)
|
|
{
|
|
if (message == null)
|
|
{
|
|
LogSystem.LogError($"消息解析失败: OnReceivedGameStart");
|
|
return;
|
|
}
|
|
|
|
if (message.MapData == null) return;
|
|
if (LobbyManager.Instance.Lobby.IsLobbyOwner()) return;
|
|
Main.Instance.NetStartGame(message.MapData);
|
|
}
|
|
|
|
// 只有房主会收到
|
|
private void OnReceivedActionConfirm(ActionConfirmMessage message)
|
|
{
|
|
if (message == null)
|
|
{
|
|
LogSystem.LogError($"消息解析失败: OnReceivedActionConfirm");
|
|
return;
|
|
}
|
|
|
|
if (!LobbyManager.Instance.Lobby.IsLobbyOwner()) return;
|
|
if (message.ActionData == null) return;
|
|
// if (message.ActionData.MapHash != Main.MapData.Net.MapHash)
|
|
// {
|
|
// LogSystem.LogError($"OnReceivedActionConfirm MapHash不一致");
|
|
// return;
|
|
// }
|
|
if (message.ActionData.Version != Main.MapData.Net.GetActionVersion())
|
|
{
|
|
LogSystem.LogError($"OnReceivedActionConfirm Version 不一致");
|
|
return;
|
|
}
|
|
message.ActionData.Param.MapData = Main.MapData;
|
|
message.ActionData.Param.RefreshParams();
|
|
var action = ActionLogicFactory.GetActionLogic(message.ActionData.ActionId);
|
|
if (action == null)
|
|
{
|
|
LogSystem.LogError($"OnReceivedActionConfirm 找不到对应 Action");
|
|
return;
|
|
}
|
|
action.CompleteExecute(message.ActionData.Param);
|
|
}
|
|
|
|
// 只有玩家会收到
|
|
private void OnReceivedActionExcute(ActionExcuteMessage message)
|
|
{
|
|
if (message == null)
|
|
{
|
|
LogSystem.LogError($"消息解析失败: OnReceivedActionExcute");
|
|
return;
|
|
}
|
|
if (LobbyManager.Instance.Lobby.IsLobbyOwner()) return;
|
|
if (message.ActionData == null) return;
|
|
// if (message.ActionData.MapHash != Main.MapData.Net.MapHash)
|
|
// {
|
|
// LogSystem.LogError($"OnReceivedActionConfirm MapHash不一致");
|
|
// return;
|
|
// }
|
|
if (message.ActionData.Version != Main.MapData.Net.GetActionVersion())
|
|
{
|
|
LogSystem.LogError($"OnReceivedActionConfirm Version 不一致");
|
|
return;
|
|
}
|
|
message.ActionData.Param.MapData = Main.MapData;
|
|
message.ActionData.Param.RefreshParams();
|
|
var action = ActionLogicFactory.GetActionLogic(message.ActionData.ActionId);
|
|
if (action == null)
|
|
{
|
|
LogSystem.LogError($"OnReceivedActionConfirm 找不到对应 Action");
|
|
return;
|
|
}
|
|
action.NetCompleteExecute(message.ActionData.Param);
|
|
}
|
|
|
|
// 只有房主会收到
|
|
private void OnReceivedTurnEnd(TurnEndMessage message)
|
|
{
|
|
if (message == null)
|
|
{
|
|
LogSystem.LogError($"消息解析失败: OnReceivedTurnEnd");
|
|
return;
|
|
}
|
|
if (!LobbyManager.Instance.Lobby.IsLobbyOwner()) return;
|
|
Main.PlayerLogic.EndPlayerTurn(Main.MapData, message.PlayerId);
|
|
}
|
|
|
|
// 只有房主会收到 心跳校验
|
|
private void OnReceivedMapConfirm(MapConfirmMessage message)
|
|
{
|
|
if (message == null)
|
|
{
|
|
LogSystem.LogError($"消息解析失败: OnReceivedMapConfirm");
|
|
return;
|
|
}
|
|
if (!LobbyManager.Instance.Lobby.IsLobbyOwner()) return;
|
|
if (Main.MapData.Net.Actions.Count == 0) return;
|
|
if (message.Index > Main.MapData.Net.Actions.Count)
|
|
{
|
|
GameNetSender.Instance.ForceUpdate(message.PlayerId);
|
|
return;
|
|
}
|
|
|
|
if (message.Index > 0 && !Main.MapData.Net.Actions[message.Index - 1].IsEqual(message.ActionData))
|
|
{
|
|
GameNetSender.Instance.ForceUpdate(message.PlayerId);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// 只有玩家会收到
|
|
private void OnReceivedForceUpdate(ForceUpdateMessage message)
|
|
{
|
|
if (message == null)
|
|
{
|
|
LogSystem.LogError($"消息解析失败: OnReceivedActionExcute");
|
|
return;
|
|
}
|
|
if (LobbyManager.Instance.Lobby.IsLobbyOwner()) return;
|
|
Main.MapData = message.MapData;
|
|
}
|
|
}
|
|
} |