diff options
-rw-r--r-- | Client/Assembly-CSharp/AmongUsClient.cs | 13 | ||||
-rw-r--r-- | Client/Assembly-CSharp/GameData.cs | 11 | ||||
-rw-r--r-- | Client/Assembly-CSharp/InnerNet/InnerNetClient.cs | 3 | ||||
-rw-r--r-- | Client/Assembly-CSharp/InnerNet/InnerNetServer.cs | 10 | ||||
-rw-r--r-- | Client/Assembly-CSharp/Msg.cs | 5 | ||||
-rw-r--r-- | Client/Assembly-CSharp/ShipStatus.cs | 9 |
6 files changed, 32 insertions, 19 deletions
diff --git a/Client/Assembly-CSharp/AmongUsClient.cs b/Client/Assembly-CSharp/AmongUsClient.cs index 433144e..12f7d36 100644 --- a/Client/Assembly-CSharp/AmongUsClient.cs +++ b/Client/Assembly-CSharp/AmongUsClient.cs @@ -240,6 +240,7 @@ public class AmongUsClient : InnerNetClient goto IL_324; } + // protected override void OnBecomeHost() { ClientData clientData = base.FindClientById(this.ClientId); @@ -293,16 +294,16 @@ public class AmongUsClient : InnerNetClient yield break; } - // 加入游戏回调 + // 一个玩家加入游戏后,会创建gameObject并将它的数据加入GameData.AllPlayers列表 protected override void OnPlayerJoined(ClientData data) { if (DestroyableSingleton<GameStartManager>.InstanceExists) { DestroyableSingleton<GameStartManager>.Instance.ResetStartState(); } - if (base.AmHost && data.InScene) // 如果本机是Local host + if (base.AmHost && data.InScene) // 如果本机是host,才会创建player { - this.CreatePlayer(data); + this.CreatePlayer(data); // } } @@ -314,6 +315,7 @@ public class AmongUsClient : InnerNetClient } if (!string.IsNullOrWhiteSpace(this.OnlineScene)) { + // 切换场景 SceneManager.LoadScene(this.OnlineScene); } } @@ -436,6 +438,7 @@ public class AmongUsClient : InnerNetClient } } + // 创建角色gameObject,并加入GameData.AllPlayers列表 private void CreatePlayer(ClientData clientData) { if (clientData.Character) @@ -474,8 +477,8 @@ public class AmongUsClient : InnerNetClient playerControl.PlayerId = (byte)availableId; clientData.Character = playerControl; base.Spawn(playerControl, clientData.Id, SpawnFlags.IsClientCharacter); - GameData.Instance.AddPlayer(playerControl); - if (PlayerControl.GameOptions.isDefaults) + GameData.Instance.AddPlayer(playerControl); // 添加到GameData的AllPlayers里
+ if (PlayerControl.GameOptions.isDefaults) { PlayerControl.GameOptions.SetRecommendations(GameData.Instance.PlayerCount, AmongUsClient.Instance.GameMode); } diff --git a/Client/Assembly-CSharp/GameData.cs b/Client/Assembly-CSharp/GameData.cs index 5069a13..b67158b 100644 --- a/Client/Assembly-CSharp/GameData.cs +++ b/Client/Assembly-CSharp/GameData.cs @@ -6,9 +6,14 @@ using Hazel; using InnerNet; using UnityEngine; -//c 单局游戏数据,同步频率比较小 +//c 单局游戏数据,同步频率比较小。是由host玩家管理的结构。 +// 单局游戏内只有一个这个结构,且clientId是host玩家的id,由host玩家所有,所以只有host玩家会序列化,其他玩家的机器deserialize +// 这样做能够保证客户端不会冲突,不会出现某台机器上某个任务完成了,但另一台机器没有完成的情况 +// 所有的全局数据全部由host玩家管理。 +// 类似的还有ship status public class GameData : InnerNetObject, IDisconnectHandler { + // 玩家个数 public int PlayerCount { get @@ -22,8 +27,10 @@ public class GameData : InnerNetObject, IDisconnectHandler // 所有角色数据,包括外观、装饰、是否是imposter、是否死亡 public List<GameData.PlayerInfo> AllPlayers = new List<GameData.PlayerInfo>(); + // 全部任务数 public int TotalTasks; + // 完成了的任务数 public int CompletedTasks; public const byte InvalidPlayerId = 255; @@ -197,7 +204,7 @@ public class GameData : InnerNetObject, IDisconnectHandler { sbyte i; sbyte j; - for (i = 0; i < 10; i = j + 1) + for (i = 0; i < 10; i = (sbyte)(j + 1)) { if (!this.AllPlayers.Any((GameData.PlayerInfo p) => p.PlayerId == (byte)i)) { diff --git a/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs b/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs index e2198e2..28b6379 100644 --- a/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs +++ b/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs @@ -832,10 +832,11 @@ namespace InnerNet this.OnPlayerJoined(client);
});
}
- if (!this.AmHost || amHost)
+ if (!this.AmHost || amHost) // 非主机就处理到这里
{
return;
}
+ // 下面是主机玩家的操作,收到这个协议的时候切换场景
obj = this.Dispatcher;
lock (obj)
{
diff --git a/Client/Assembly-CSharp/InnerNet/InnerNetServer.cs b/Client/Assembly-CSharp/InnerNet/InnerNetServer.cs index f0b37a1..56f048b 100644 --- a/Client/Assembly-CSharp/InnerNet/InnerNetServer.cs +++ b/Client/Assembly-CSharp/InnerNet/InnerNetServer.cs @@ -396,13 +396,13 @@ namespace InnerNet switch (this.GameState) { case GameStates.NotStarted: - this.HandleNewGameJoin(client); + this.HandleNewGameJoin(client); //host向其他玩家分发所有玩家的连接数据 break; default: { MessageWriter messageWriter2 = MessageWriter.Get(SendOption.Reliable); - messageWriter2.StartMessage(1); - messageWriter2.Write(2); + messageWriter2.StartMessage(1); // JoinGame
+ messageWriter2.Write(2); messageWriter2.EndMessage(); client.Connection.Send(messageWriter2); messageWriter2.Recycle(); @@ -507,8 +507,8 @@ namespace InnerNet try { this.WriteJoinedMessage(client, messageWriter2, true); - client.Connection.Send(messageWriter2); - this.BroadcastJoinMessage(client, messageWriter2); + client.Connection.Send(messageWriter2); // ->client + this.BroadcastJoinMessage(client, messageWriter2); // 所有玩家 } catch { diff --git a/Client/Assembly-CSharp/Msg.cs b/Client/Assembly-CSharp/Msg.cs index aa7106c..58b3576 100644 --- a/Client/Assembly-CSharp/Msg.cs +++ b/Client/Assembly-CSharp/Msg.cs @@ -8,10 +8,11 @@ HostGame // 作为Host建房间 gameSettings // 单局配置 } -JoinGame // 加入游戏 +JoinGame // 某个玩家加入游戏 { - JoinGame + JoinGame // 1 gameId // 如果加入失败,gameId存失败原因 + clientId } StartGame // host玩家开始游戏 diff --git a/Client/Assembly-CSharp/ShipStatus.cs b/Client/Assembly-CSharp/ShipStatus.cs index e83100f..e51a3d3 100644 --- a/Client/Assembly-CSharp/ShipStatus.cs +++ b/Client/Assembly-CSharp/ShipStatus.cs @@ -7,7 +7,8 @@ using InnerNet; using PowerTools; using UnityEngine; -//场景中的物件,包含门的开启等,在这里同步 +//c 场景中的物件,包含门的开启等,在这里同步 +// 这个结构由host玩家管理,所有者是host玩家,类似GameData public class ShipStatus : InnerNetObject { public ShipRoom[] AllRooms { get; private set; } @@ -699,7 +700,7 @@ public class ShipStatus : InnerNetObject // 关门
public void RpcCloseDoorsOfType(SystemTypes type) { - if (AmongUsClient.Instance.AmHost) + if (AmongUsClient.Instance.AmHost) { this.CloseDoorsOfType(type); return; @@ -712,8 +713,8 @@ public class ShipStatus : InnerNetObject // 修复 public void RpcRepairSystem(SystemTypes systemType, int amount) { - if (AmongUsClient.Instance.AmHost) - { + if (AmongUsClient.Instance.AmHost)
+ { this.RepairSystem(systemType, PlayerControl.LocalPlayer, (byte)amount); return; } |