diff options
author | chai <chaifix@163.com> | 2021-01-02 15:19:37 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-01-02 15:19:37 +0800 |
commit | 89d302af2b9f84befd7497e52f1d72162721cd70 (patch) | |
tree | 09d3c7b55dbe8c9722cf8f9273ebbc9e9ed3ecd1 | |
parent | 59755580acab0de7bfc88482b6a515b546d45cd7 (diff) |
*网络
-rw-r--r-- | Client/Assembly-CSharp/AmongUsClient.cs | 2 | ||||
-rw-r--r-- | Client/Assembly-CSharp/Assembly-CSharp.csproj | 1 | ||||
-rw-r--r-- | Client/Assembly-CSharp/CustomNetworkTransform.cs | 2 | ||||
-rw-r--r-- | Client/Assembly-CSharp/GameOptionsMenu.cs | 2 | ||||
-rw-r--r-- | Client/Assembly-CSharp/InnerNet/InnerNetClient.cs | 140 | ||||
-rw-r--r-- | Client/Assembly-CSharp/InnerNet/InnerNetObject.cs | 3 | ||||
-rw-r--r-- | Client/Assembly-CSharp/InnerNet/Tags.cs | 9 | ||||
-rw-r--r-- | Client/Assembly-CSharp/Msg.cs | 64 | ||||
-rw-r--r-- | Client/Assembly-CSharp/PlayerControl.cs | 2 | ||||
-rw-r--r-- | Client/Assembly-CSharp/obj/Debug/Assembly-CSharp.csproj.CoreCompileInputs.cache | 2 | ||||
-rw-r--r-- | Client/Assembly-CSharp/obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache | bin | 265232 -> 307687 bytes |
11 files changed, 160 insertions, 67 deletions
diff --git a/Client/Assembly-CSharp/AmongUsClient.cs b/Client/Assembly-CSharp/AmongUsClient.cs index 41f110e..5a83263 100644 --- a/Client/Assembly-CSharp/AmongUsClient.cs +++ b/Client/Assembly-CSharp/AmongUsClient.cs @@ -373,7 +373,7 @@ public class AmongUsClient : InnerNetClient SceneManager.LoadScene(this.MainMenuScene); } - //c 切换场景时的回调 + //c 场景加载完成的回调 protected override void OnPlayerChangedScene(ClientData client, string currentScene) { client.InScene = true; diff --git a/Client/Assembly-CSharp/Assembly-CSharp.csproj b/Client/Assembly-CSharp/Assembly-CSharp.csproj index a97f617..a860eab 100644 --- a/Client/Assembly-CSharp/Assembly-CSharp.csproj +++ b/Client/Assembly-CSharp/Assembly-CSharp.csproj @@ -296,6 +296,7 @@ <Compile Include="Minigame.cs" /> <Compile Include="MMOnlineManager.cs" /> <Compile Include="MonoPInvokeCallbackAttribute.cs" /> + <Compile Include="Msg.cs" /> <Compile Include="NameTextBehaviour.cs" /> <Compile Include="NavigationMinigame.cs" /> <Compile Include="NoOxyTask.cs" /> diff --git a/Client/Assembly-CSharp/CustomNetworkTransform.cs b/Client/Assembly-CSharp/CustomNetworkTransform.cs index 98a1969..56113b1 100644 --- a/Client/Assembly-CSharp/CustomNetworkTransform.cs +++ b/Client/Assembly-CSharp/CustomNetworkTransform.cs @@ -197,7 +197,7 @@ public class CustomNetworkTransform : InnerNetObject return true; } - //c 反序列化角色数据 + //c 反序列化角色数据,用来更新数据 public override void Deserialize(MessageReader reader, bool initialState) { if (initialState) diff --git a/Client/Assembly-CSharp/GameOptionsMenu.cs b/Client/Assembly-CSharp/GameOptionsMenu.cs index b7d9d70..d6355a7 100644 --- a/Client/Assembly-CSharp/GameOptionsMenu.cs +++ b/Client/Assembly-CSharp/GameOptionsMenu.cs @@ -128,7 +128,7 @@ public class GameOptionsMenu : MonoBehaviour { return; } - //c + //c 同步游戏配置 localPlayer.RpcSyncSettings(PlayerControl.GameOptions); } } diff --git a/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs b/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs index 3336804..4a68332 100644 --- a/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs +++ b/Client/Assembly-CSharp/InnerNet/InnerNetClient.cs @@ -135,7 +135,7 @@ namespace InnerNet internal const byte ReadyFlag = 7; - internal const byte ChangeSettingsFlag = 8; + internal const byte ChangeSettingsFlag = 8; // 没用这个类型的消息,采用Rpc实现的 // 每次发送数据的间隔,每过0.1s发送一次 public float MinSendInterval = 0.1f; @@ -155,6 +155,7 @@ namespace InnerNet private Dictionary<uint, InnerNetObject> allObjectsFast = new Dictionary<uint, InnerNetObject>(); + // 2个 private MessageWriter[] Streams; public enum GameStates @@ -175,6 +176,7 @@ namespace InnerNet // 初始化 public virtual void Start() { + // 场景切换,包含很多场景,EndGame、MainMenuScene、MMOline等场景 SceneManager.activeSceneChanged += delegate(Scene oldScene, Scene scene) { this.SendSceneChange(scene.name); @@ -636,7 +638,7 @@ namespace InnerNet public MessageWriter StartEndGame() { MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable); - messageWriter.StartMessage(8); + messageWriter.StartMessage(8); // endGame messageWriter.Write(this.GameId); return messageWriter; } @@ -660,6 +662,7 @@ namespace InnerNet messageWriter.Recycle(); } + // 发送已经准备好的消息 protected void SendClientReady() { if (!this.AmHost) @@ -767,7 +770,8 @@ namespace InnerNet HostGame = 0, // 创建 StartGame = 2, // 开始游戏 Disconnect = 3, // 断开 - SubMessage = 6, // + GameData = 5, + GameDataTo = 6, // JoinGame = 7, // 加入游戏 Gameover = 8, // 游戏结束 } @@ -817,11 +821,11 @@ namespace InnerNet } case 4: break; - case 5: - case (int)TagAlias.SubMessage: // 把这类消息存在队列里,主线程后续调用 + case (int)TagAlias.GameData: + case (int)TagAlias.GameDataTo: // 把这类消息存在队列里,主线程后续调用 { - int num = reader.ReadInt32(); - if (this.GameId == num) + int gameId = reader.ReadInt32(); + if (this.GameId == gameId) { if (reader.Tag == 6) { @@ -1178,7 +1182,7 @@ namespace InnerNet protected void SendInitialData(int clientId) { MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable); - messageWriter.StartMessage(6); + messageWriter.StartMessage(6); // 6 = scene change flag messageWriter.Write(this.GameId); messageWriter.WritePacked(clientId); List<InnerNetObject> obj = this.allObjects; @@ -1190,6 +1194,7 @@ namespace InnerNet InnerNetObject innerNetObject = this.allObjects[i]; if (innerNetObject && hashSet.Add(innerNetObject.gameObject)) { + // 将innerNetObject对象的children都序列化为消息 this.WriteSpawnMessage(innerNetObject, innerNetObject.OwnerId, innerNetObject.SpawnFlags, messageWriter); } } @@ -1273,10 +1278,10 @@ namespace InnerNet return (int)(gameId[0] | (int)gameId[1] << 8 | (int)gameId[2] << 16 | (int)gameId[3] << 24); } + // 每隔MinSendInterval的时间同步一次标记为脏的数据 private void FixedUpdate() { - // 每隔MinSendInterval的时间同步一次标记为脏的数据 - if (this.mode == MatchMakerModes.None || this.Streams == null) + if (this.mode == MatchMakerModes.None || this.Streams == null) { this.timer = 0f; return; @@ -1300,8 +1305,9 @@ namespace InnerNet && innerNetObject.DirtyBits != 0U && (innerNetObject.AmOwner || (innerNetObject.OwnerId == /*-2*/InvalidClient && this.AmHost))) { + // MsgWrite:SyncNetObject MessageWriter messageWriter = this.Streams[(int)innerNetObject.sendMode]; // 根据是否是可靠UDP,选择对应的writer - messageWriter.StartMessage(1); + messageWriter.StartMessage(1); // 1=DataFlag messageWriter.WritePacked(innerNetObject.NetId); if (innerNetObject.Serialize(messageWriter, false)) { @@ -1356,6 +1362,8 @@ namespace InnerNet return default(T); } + // MsgWrite:Rpc 下面是有关Rpc的写入函数 + //c 发送RPC public void SendRpcImmediately(uint targetNetId, byte callId, SendOption option) { @@ -1392,6 +1400,7 @@ namespace InnerNet return messageWriter; } + // 立即发送Rpc public void FinishRpcImmediately(MessageWriter msg) { msg.EndMessage(); @@ -1407,6 +1416,7 @@ namespace InnerNet .EndMessage(); } + // 准备好Rpc通用数据,包含RpcFlag, netId和callId public MessageWriter StartRpc(uint targetNetId, byte callId, SendOption option = SendOption.Reliable) { MessageWriter messageWriter = this.Streams[(int)option]; // 拿到对应的发送流 @@ -1428,6 +1438,7 @@ namespace InnerNet base.StartCoroutine(this.CoSendSceneChange(sceneName)); } + // private IEnumerator CoSendSceneChange(string sceneName) { List<InnerNetObject> obj = this.allObjects; @@ -1453,7 +1464,8 @@ namespace InnerNet { yield break; } - if (!this.AmHost && this.connection.State == ConnectionState.Connected) + // MsgWrite:SceneChange + if (!this.AmHost && this.connection.State == ConnectionState.Connected)//如果是非主机玩家,广播加载完场景的消息 { MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable); messageWriter.StartMessage(5); @@ -1500,19 +1512,21 @@ namespace InnerNet Debug.LogError("Tried to spawn while not host:" + netObjParent); } + // 将netObjParent下的所有InnerNetObject类型都序列化为消息,后续会广播给其他玩家 + // MsgWrite:SpawnMsg private void WriteSpawnMessage(InnerNetObject netObjParent, int ownerId, SpawnFlags flags, MessageWriter msg) { - msg.StartMessage(4); - msg.WritePacked(netObjParent.SpawnId); - msg.WritePacked(ownerId); - msg.Write((byte)flags); + msg.StartMessage(4); // 4 = SpawnFlag + msg.WritePacked(netObjParent.SpawnId); // spawnId用来指代某个派生类的类型 + msg.WritePacked(ownerId); // ownerId是对应玩家的clientId + msg.Write((byte)flags); // flags有两种,none 和 IsClientCharacter InnerNetObject[] componentsInChildren = netObjParent.GetComponentsInChildren<InnerNetObject>(); msg.WritePacked(componentsInChildren.Length); foreach (InnerNetObject innerNetObject in componentsInChildren) { innerNetObject.OwnerId = ownerId; innerNetObject.SpawnFlags = flags; - if (innerNetObject.NetId == 0U) + if (innerNetObject.NetId == 0U) // 如果没有netId,分配一个新的 { InnerNetObject innerNetObject2 = innerNetObject; uint netIdCnt = this.NetIdCnt; @@ -1522,13 +1536,14 @@ namespace InnerNet this.allObjectsFast.Add(innerNetObject.NetId, innerNetObject); } msg.WritePacked(innerNetObject.NetId); - msg.StartMessage(1); + msg.StartMessage(1); // 1=DataFlag innerNetObject.Serialize(msg, true); msg.EndMessage(); } msg.EndMessage(); } + // MsgWrite:DespawnMsg public void Despawn(InnerNetObject objToDespawn) { if (objToDespawn.NetId < 1U) @@ -1537,7 +1552,7 @@ namespace InnerNet return; } MessageWriter messageWriter = this.Streams[1]; - messageWriter.StartMessage(5); + messageWriter.StartMessage(5); // DespawnFlag messageWriter.WritePacked(objToDespawn.NetId); messageWriter.EndMessage(); this.RemoveNetObject(objToDespawn); @@ -1646,23 +1661,23 @@ namespace InnerNet { switch (reader.Tag) { - case (int)SubTagAlias.Normal: + case DataFlag: // MsgRead:SyncNetObject 隔一段时间同步一次netObject的数据 { - uint num = reader.ReadPackedUInt32(); + uint netId = reader.ReadPackedUInt32(); InnerNetObject innerNetObject; - if (this.allObjectsFast.TryGetValue(num, out innerNetObject)) + if (this.allObjectsFast.TryGetValue(netId, out innerNetObject)) { innerNetObject.Deserialize(reader, false); return; } - if (!this.DestroyedObjects.Contains(num)) + if (!this.DestroyedObjects.Contains(netId)) { - this.DeferMessage(cnt, reader, "Stored data for " + num); + this.DeferMessage(cnt, reader, "Stored data for " + netId); return; } return; } - case (int)SubTagAlias.Rpc: + case RpcFlag: // MsgRead:Rpc , Rpc调用,别的机器发过来的Rpc调用,发给对应的innnerNetObject调用 { // 根据编号找到对应的同步数据 uint netId = reader.ReadPackedUInt32(); @@ -1681,72 +1696,73 @@ namespace InnerNet } return; } - case (int)SubTagAlias.SpawnCharacter: + case SpawnFlag: // MsgRead:SpawnMsg ,收到spawn消息后,实例化这个对象并设置netObjects的参数 { - uint num3 = reader.ReadPackedUInt32(); - if ((ulong)num3 >= (ulong)((long)this.SpawnableObjects.Length)) + uint spawnId = reader.ReadPackedUInt32(); + if ((ulong)spawnId >= (ulong)((long)this.SpawnableObjects.Length)) { - Debug.LogError("Couldn't find spawnable prefab: " + num3); + Debug.LogError("Couldn't find spawnable prefab: " + spawnId); return; } - int num4 = reader.ReadPackedInt32(); - ClientData clientData = this.FindClientById(num4); - if (num4 > 0 && clientData == null) + int clientId = reader.ReadPackedInt32(); + ClientData clientData = this.FindClientById(clientId); + if (clientId > 0 && clientData == null) { - this.DeferMessage(cnt, reader, "Delay spawn for unowned " + num3); + this.DeferMessage(cnt, reader, "Delay spawn for unowned " + spawnId); return; } // 创建角色对象并设置参数 - InnerNetObject innerNetObject3 = UnityEngine.Object.Instantiate<InnerNetObject>(this.SpawnableObjects[(int)num3]); - innerNetObject3.SpawnFlags = (SpawnFlags)reader.ReadByte(); - if ((innerNetObject3.SpawnFlags & SpawnFlags.IsClientCharacter) != SpawnFlags.None) + // parentNetObject是父物体 + InnerNetObject parentNetObject = UnityEngine.Object.Instantiate<InnerNetObject>(this.SpawnableObjects[(int)spawnId]); + parentNetObject.SpawnFlags = (SpawnFlags)reader.ReadByte(); + if ((parentNetObject.SpawnFlags & SpawnFlags.IsClientCharacter) != SpawnFlags.None) // 如果是角色的话,parentNetObject一定是playerControl { if (!clientData.Character) { clientData.InScene = true; - clientData.Character = (innerNetObject3 as PlayerControl); + clientData.Character = (parentNetObject as PlayerControl); } - else if (innerNetObject3) + else if (parentNetObject) { Debug.LogWarning(string.Format("Double spawn character: {0} already has {1}", clientData.Id, clientData.Character.NetId)); - UnityEngine.Object.Destroy(innerNetObject3.gameObject); + UnityEngine.Object.Destroy(parentNetObject.gameObject); return; } } - int num5 = reader.ReadPackedInt32(); - InnerNetObject[] componentsInChildren = innerNetObject3.GetComponentsInChildren<InnerNetObject>(); - if (num5 != componentsInChildren.Length) + int numOfNetObjs = reader.ReadPackedInt32(); + InnerNetObject[] componentsInChildren = parentNetObject.GetComponentsInChildren<InnerNetObject>(); + if (numOfNetObjs != componentsInChildren.Length) { - Debug.LogError("Children didn't match for spawnable " + num3); - UnityEngine.Object.Destroy(innerNetObject3.gameObject); + Debug.LogError("Children didn't match for spawnable " + spawnId); + UnityEngine.Object.Destroy(parentNetObject.gameObject); return; } - for (int i = 0; i < num5; i++) + for (int i = 0; i < numOfNetObjs; i++) { - InnerNetObject innerNetObject4 = componentsInChildren[i]; - innerNetObject4.NetId = reader.ReadPackedUInt32(); // 设置netid - innerNetObject4.OwnerId = num4; - if (this.DestroyedObjects.Contains(innerNetObject4.NetId)) + InnerNetObject childNetObject = componentsInChildren[i]; + childNetObject.NetId = reader.ReadPackedUInt32(); + childNetObject.OwnerId = clientId; + if (this.DestroyedObjects.Contains(childNetObject.NetId)) // 如果这个netId已经被标记了销毁,表明这是一个错误的生成消息 { - innerNetObject3.NetId = uint.MaxValue; - UnityEngine.Object.Destroy(innerNetObject3.gameObject); + parentNetObject.NetId = uint.MaxValue; + UnityEngine.Object.Destroy(parentNetObject.gameObject); return; } - if (!this.AddNetObject(innerNetObject4)) + if (!this.AddNetObject(childNetObject)) { - innerNetObject3.NetId = uint.MaxValue; - UnityEngine.Object.Destroy(innerNetObject3.gameObject); + parentNetObject.NetId = uint.MaxValue; + UnityEngine.Object.Destroy(parentNetObject.gameObject); return; } - MessageReader messageReader = reader.ReadMessage(); + MessageReader messageReader = reader.ReadMessage(); // netObject的序列化数据 if (messageReader.Length > 0) { - innerNetObject4.Deserialize(messageReader, true); + childNetObject.Deserialize(messageReader, true); // 反序列化重建出来结构 } } return; } - case (int)SubTagAlias.RemoveNetObjectByNetId: + case DespawnFlag: // MsgRead:DespawnMsg,收到消息后,销毁对应的netObject { uint netId = reader.ReadPackedUInt32(); this.DestroyedObjects.Add(netId); @@ -1754,14 +1770,14 @@ namespace InnerNet if (innerNetObject5) { this.RemoveNetObject(innerNetObject5); - UnityEngine.Object.Destroy(innerNetObject5.gameObject); + UnityEngine.Object.Destroy(innerNetObject5.gameObject); // 销毁 return; } return; } - case (int)SubTagAlias.ChangeScene: + case SceneChangeFlag: // MsgRead:SceneChange , 收到某个玩家加载完成场景的消息 { - int id = reader.ReadPackedInt32(); + int id = reader.ReadPackedInt32(); // clientId ClientData client = this.FindClientById(id); // 找到对应的玩家 string targetScene = reader.ReadString(); if (client != null && !string.IsNullOrWhiteSpace(targetScene)) @@ -1781,7 +1797,7 @@ namespace InnerNet Debug.Log(string.Format("Couldn't find client {0} to change scene to {1}", id, targetScene)); return; } - case (int)SubTagAlias.PlayerReady: + case ReadyFlag: // MsgRead:PlayerReady , 某个玩家已经准备好了 { ClientData clientData2 = this.FindClientById(reader.ReadPackedInt32()); if (clientData2 != null) @@ -1803,7 +1819,7 @@ namespace InnerNet }) + string.Join<byte>(" ", reader.Buffer)); } - // 延迟发送消息 + // 延迟到下一帧调用回调? private void DeferMessage(int cnt, MessageReader reader, string logMsg) { if (cnt > 10) diff --git a/Client/Assembly-CSharp/InnerNet/InnerNetObject.cs b/Client/Assembly-CSharp/InnerNet/InnerNetObject.cs index 129bf06..cb50b40 100644 --- a/Client/Assembly-CSharp/InnerNet/InnerNetObject.cs +++ b/Client/Assembly-CSharp/InnerNet/InnerNetObject.cs @@ -16,6 +16,7 @@ namespace InnerNet } // 这个字段用处未知,应该是用来标记此类的派生类 + // (后来知道了,在InnerNetClient.WriteSpawnMessage中用来标记某个派生类的生成) public uint SpawnId; // 每一个此类数据(及派生数据)都会在创建的时候分配一个netId @@ -43,7 +44,7 @@ namespace InnerNet */ public SendOption sendMode = SendOption.Reliable; - // 数据对应的玩家ID,对于本玩家自己的数据会有特殊处理 + // 数据对应的玩家ClientID,对于本玩家自己的数据会有特殊处理 public int OwnerId; protected bool DespawnOnDestroy = true; diff --git a/Client/Assembly-CSharp/InnerNet/Tags.cs b/Client/Assembly-CSharp/InnerNet/Tags.cs index aa48fc3..08d6bec 100644 --- a/Client/Assembly-CSharp/InnerNet/Tags.cs +++ b/Client/Assembly-CSharp/InnerNet/Tags.cs @@ -32,4 +32,13 @@ namespace InnerNet public const byte Redirect = 13; } + /* 当类型是GameData或GameDataTo时的subtag + internal const byte DataFlag = 1; + internal const byte RpcFlag = 2; + internal const byte SpawnFlag = 4; + internal const byte DespawnFlag = 5; + internal const byte SceneChangeFlag = 6; + internal const byte ReadyFlag = 7; + internal const byte ChangeSettingsFlag = 8; + */ } diff --git a/Client/Assembly-CSharp/Msg.cs b/Client/Assembly-CSharp/Msg.cs new file mode 100644 index 0000000..bb99f82 --- /dev/null +++ b/Client/Assembly-CSharp/Msg.cs @@ -0,0 +1,64 @@ +/* +所有网络消息 + +GameData // 所有在游戏内的广播消息的通用结构,可以包含Rpc、SpawnMsg等等 +{ + flag // GameData 或 GameDataTo + gameId + msgData // 具体的网络消息 +} + +SyncNetObject // 定时同步innnerNetObject的数据 +{ + DataFlag // 1 + netId // 这个innerNetObject的id + data // netObject的序列化数据 +} + +Rpc // 远程调用(Remote Procedure Call)的通用结构 +{ + RpcFlag // 2 + netId // 调用的网络对象 + callId // 函数id + data // 函数参数(可选) +} + +SpawnMsg // 生成\创建innerNetObject的消息,包括角色、场景中的物件比如门等 +{ + SpawnFlag // 4 + spawnId // 父InnerNetObject的SpawnId + clientId // ownerId + SpawnFlag + numOfNetObjs // innerNetObject的个数 + lenOfMsg + netId // 这个innerNetObject分配的netId + DataFlag + data // 单个innerNetObject的序列化数据 + ... + lenOfMsg + netId + DataFlag + data // 单个innerNetObject的序列化数据 + ... +} + +DespawnMsg // 销毁单个netObject +{ + DespawnFlag // 5 + netId +} + +SceneChange // 场景加载完毕的消息,用来同步 +{ + SceneChangeFlag // 6 + clientId + sceneName +} + +PlayerReady // 某个玩家已经准备好 +{ + ReadyFlag // 7 + clientId +} + +*/
\ No newline at end of file diff --git a/Client/Assembly-CSharp/PlayerControl.cs b/Client/Assembly-CSharp/PlayerControl.cs index 961f169..753e127 100644 --- a/Client/Assembly-CSharp/PlayerControl.cs +++ b/Client/Assembly-CSharp/PlayerControl.cs @@ -160,6 +160,7 @@ public class PlayerControl : InnerNetObject } } + //c 角色相关的所有的Rpc调用 public enum RpcCalls : byte { PlayAnimation, @@ -1375,6 +1376,7 @@ public class PlayerControl : InnerNetObject AmongUsClient.Instance.FinishRpcImmediately(messageWriter); } + //c 对应的角色执行对应发过来的Rpc调用 public override void HandleRpc(byte callId, MessageReader reader) { switch (callId) diff --git a/Client/Assembly-CSharp/obj/Debug/Assembly-CSharp.csproj.CoreCompileInputs.cache b/Client/Assembly-CSharp/obj/Debug/Assembly-CSharp.csproj.CoreCompileInputs.cache index 95f2453..e0b3b5f 100644 --- a/Client/Assembly-CSharp/obj/Debug/Assembly-CSharp.csproj.CoreCompileInputs.cache +++ b/Client/Assembly-CSharp/obj/Debug/Assembly-CSharp.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -c8cdd6287dc035531ab112e580f5671867da3c45 +36a668f4a9e0f3bfc026d9ff7da5880a4afbe3aa diff --git a/Client/Assembly-CSharp/obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache b/Client/Assembly-CSharp/obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache Binary files differindex 7587316..60cbbd2 100644 --- a/Client/Assembly-CSharp/obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache +++ b/Client/Assembly-CSharp/obj/Debug/Assembly-CSharp.csprojAssemblyReference.cache |