summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-01-06 18:58:27 +0800
committerchai <chaifix@163.com>2021-01-06 18:58:27 +0800
commitd653a7a8b6ec4efb40d39a455805880bf494e785 (patch)
treef76c75dc8b1bd7a140ed5a1603814cec057dc443
parentaf50160ef5c9a55506157d7d94e20c17cd28ed42 (diff)
*网络
-rw-r--r--Client/Assembly-CSharp/AmongUsClient.cs13
-rw-r--r--Client/Assembly-CSharp/GameData.cs11
-rw-r--r--Client/Assembly-CSharp/InnerNet/InnerNetClient.cs3
-rw-r--r--Client/Assembly-CSharp/InnerNet/InnerNetServer.cs10
-rw-r--r--Client/Assembly-CSharp/Msg.cs5
-rw-r--r--Client/Assembly-CSharp/ShipStatus.cs9
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;
}