Răsfoiți Sursa

每帧发送LSWorld的hash到服务端校验

tanghai 2 ani în urmă
părinte
comite
0219c71f1d
26 a modificat fișierele cu 552 adăugiri și 135 ștergeri
  1. 3 0
      DotNet/Hotfix/DotNet.Hotfix.csproj
  2. 13 0
      Unity/Assets/Config/Proto/LockStepOuter_C_11001.proto
  3. 1 1
      Unity/Assets/Resources/GlobalConfig.asset
  4. 18 0
      Unity/Assets/Scripts/Core/Helper/ByteHelper.cs
  5. 25 0
      Unity/Assets/Scripts/Hotfix/Client/LockStep/LSClientUpdaterSystem.cs
  6. 21 17
      Unity/Assets/Scripts/Hotfix/Client/LockStep/OneFrameInputsHandler.cs
  7. 22 0
      Unity/Assets/Scripts/Hotfix/Client/LockStep/Room2C_CheckHashFailHandler.cs
  8. 11 0
      Unity/Assets/Scripts/Hotfix/Client/LockStep/Room2C_CheckHashFailHandler.cs.meta
  9. 1 0
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/RoomManagerComponentSystem.cs
  10. 18 0
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/C2Room_CheckHashHandler.cs
  11. 11 0
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/C2Room_CheckHashHandler.cs.meta
  12. 4 0
      Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/LSServerUpdaterSystem.cs
  13. 4 2
      Unity/Assets/Scripts/Hotfix/Share/LockStep/LSHelper.cs
  14. 15 13
      Unity/Assets/Scripts/Hotfix/Share/LockStep/RoomSystem.cs
  15. 6 6
      Unity/Assets/Scripts/HotfixView/Client/LockStep/LSUnitViewSystem.cs
  16. 186 92
      Unity/Assets/Scripts/Loader/Plugins/HybridCLR/Generated/AOTGenericReferences.cs
  17. 68 1
      Unity/Assets/Scripts/Loader/Plugins/HybridCLR/Generated/link.xml
  18. 29 0
      Unity/Assets/Scripts/Model/Generate/Client/Message/LockStepOuter_C_11001.cs
  19. 29 0
      Unity/Assets/Scripts/Model/Generate/ClientServer/Message/LockStepOuter_C_11001.cs
  20. 29 0
      Unity/Assets/Scripts/Model/Generate/Server/Message/LockStepOuter_C_11001.cs
  21. 31 0
      Unity/Assets/Scripts/Model/Share/LockStep/FrameBuffer.cs
  22. 1 1
      Unity/Assets/Scripts/Model/Share/LockStep/LSConstValue.cs
  23. 3 1
      Unity/Assets/Scripts/Model/Share/LockStep/LSInputComponent.cs
  24. 1 0
      Unity/Assets/Scripts/Model/Share/LockStep/LSWorld.cs
  25. 1 0
      Unity/Assets/Scripts/Model/Share/Module/Message/OpcodeHelper.cs
  26. 1 1
      Unity/ProjectSettings/ProjectSettings.asset

+ 3 - 0
DotNet/Hotfix/DotNet.Hotfix.csproj

@@ -40,5 +40,8 @@
         <ProjectReference Include="..\Loader\DotNet.Loader.csproj" />
         <ProjectReference Include="..\Model\DotNet.Model.csproj" />
     </ItemGroup>
+    <ItemGroup>
+      <Folder Include="Client\LockStep\" />
+    </ItemGroup>
 
 </Project>

+ 13 - 0
Unity/Assets/Config/Proto/LockStepOuter_C_11001.proto

@@ -59,3 +59,16 @@ message Room2C_AdjustUpdateTime // IActorMessage
 	int32 DiffTime = 1;
 }
 
+message C2Room_CheckHash // IActorRoom
+{
+	int64 PlayerId = 1;
+	int32 Frame = 2;
+	int64 Hash = 3;
+}
+
+message Room2C_CheckHashFail // IActorMessage
+{
+	int32 Frame = 1;
+	bytes LSWorldBytes = 2;
+}
+

+ 1 - 1
Unity/Assets/Resources/GlobalConfig.asset

@@ -12,6 +12,6 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 36527db572638af47b03c805671cba75, type: 3}
   m_Name: GlobalConfig
   m_EditorClassIdentifier: 
-  CodeMode: 3
+  CodeMode: 1
   BuildType: 1
   SceneType: LockStep

+ 18 - 0
Unity/Assets/Scripts/Core/Helper/ByteHelper.cs

@@ -100,5 +100,23 @@ namespace ET
 				bytes[offset + i] = bPoint[i];
 			}
 		}
+		
+		public static long Hash(this byte[] data, int index, int length)
+		{
+			const int p = 16777619;
+			long hash = 2166136261L;
+
+			for (int i = index; i < index + length; i++)
+			{
+				hash = (hash ^ data[i]) * p;
+			}
+
+			hash += hash << 13;
+			hash ^= hash >> 7;
+			hash += hash << 3;
+			hash ^= hash >> 17;
+			hash += hash << 5;
+			return hash;
+		}
 	}
 }

+ 25 - 0
Unity/Assets/Scripts/Hotfix/Client/LockStep/LSClientUpdaterSystem.cs

@@ -45,6 +45,15 @@ namespace ET.Client
 
                 ++room.PredictionFrame;
                 OneFrameInputs oneFrameInputs = self.GetOneFrameMessages(room.PredictionFrame);
+                
+                // 保存当前帧场景数据
+                room.SaveLSWorld(room.PredictionFrame);
+
+                if (room.PredictionFrame <= room.AuthorityFrame) // 只有AuthorityFrame帧才保存录像数据
+                {
+                    self.Record(room.PredictionFrame);
+                }
+                
                 room.Update(oneFrameInputs, room.PredictionFrame);
                 room.SpeedMultiply = ++i;
 
@@ -85,5 +94,21 @@ namespace ET.Client
             
             return predictionFrame;
         }
+
+        public static void Record(this LSClientUpdater self, int frame)
+        {
+            Room room = self.Room();
+            //if (frame < room.AuthorityFrame)
+            //{
+            //    return;
+            //}
+            Log.Debug($"{self.Room().Name} Record: {frame}");
+            long hash = room.FrameBuffer.GetHash(frame);
+            C2Room_CheckHash c2RoomCheckHash = NetServices.Instance.FetchMessage<C2Room_CheckHash>();
+            c2RoomCheckHash.Frame = frame;
+            c2RoomCheckHash.Hash = hash;
+            room.GetParent<Scene>().GetComponent<SessionComponent>().Session.Send(c2RoomCheckHash);
+            room.Record(frame);
+        }
     }
 }

+ 21 - 17
Unity/Assets/Scripts/Hotfix/Client/LockStep/OneFrameInputsHandler.cs

@@ -8,34 +8,38 @@ namespace ET.Client
         protected override async ETTask Run(Session session, OneFrameInputs input)
         {
             Room room = session.DomainScene().GetComponent<Room>();
+            
+            Log.Debug($"OneFrameInputs: {room.AuthorityFrame + 1} {input.ToJson()}");
+            
             FrameBuffer frameBuffer = room.FrameBuffer;
 
-            int frame = room.AuthorityFrame + 1;
-
             ++room.AuthorityFrame;
             // 服务端返回的消息比预测的还早
             if (room.AuthorityFrame > room.PredictionFrame)
             {
                 OneFrameInputs authorityFrame = frameBuffer.FrameInputs(room.AuthorityFrame);
                 input.CopyTo(authorityFrame);
-                return;
-            }
-            
-            // 服务端返回来的消息,跟预测消息对比
-            OneFrameInputs predictionInput = frameBuffer.FrameInputs(frame);
-            // 对比失败有两种可能,
-            // 1是别人的输入预测失败,这种很正常,
-            // 2 自己的输入对比失败,这种情况是自己发送的消息比服务器晚到了,服务器使用了你的上一次输入
-            // 回滚重新预测的时候,自己的输入不用变化
-            if (input != predictionInput)
-            {
-                input.CopyTo(predictionInput);
-                // 回滚到frameBuffer.AuthorityFrame
-                LSHelper.Rollback(room, room.AuthorityFrame);
             }
             else
             {
-                room.Record(frame);
+
+                // 服务端返回来的消息,跟预测消息对比
+                OneFrameInputs predictionInput = frameBuffer.FrameInputs(room.AuthorityFrame);
+                // 对比失败有两种可能,
+                // 1是别人的输入预测失败,这种很正常,
+                // 2 自己的输入对比失败,这种情况是自己发送的消息比服务器晚到了,服务器使用了你的上一次输入
+                // 回滚重新预测的时候,自己的输入不用变化
+                if (input != predictionInput)
+                {
+                    input.CopyTo(predictionInput);
+                    // 回滚到frameBuffer.AuthorityFrame
+                    LSHelper.Rollback(room, room.AuthorityFrame);
+                }
+                else
+                {
+                    LSClientUpdater clientUpdater = room.GetComponent<LSClientUpdater>();
+                    clientUpdater.Record(room.AuthorityFrame);
+                }
             }
 
             // 回收消息,减少GC

+ 22 - 0
Unity/Assets/Scripts/Hotfix/Client/LockStep/Room2C_CheckHashFailHandler.cs

@@ -0,0 +1,22 @@
+namespace ET.Client
+{
+    [MessageHandler(SceneType.LockStep)]
+    public class Room2C_CheckHashFailHandler: AMHandler<Room2C_CheckHashFail>
+    {
+        protected override async ETTask Run(Session session, Room2C_CheckHashFail message)
+        {
+            LSWorld serverWorld = MongoHelper.Deserialize(typeof(LSWorld), message.LSWorldBytes, 0, message.LSWorldBytes.Length) as LSWorld;
+            using (session.ClientScene().AddChild(serverWorld))
+            {
+                Log.Debug($"check hash fail, server: {message.Frame} {serverWorld.ToJson()}");
+            }
+
+            LSWorld clientWorld = session.ClientScene().GetComponent<Room>().GetLSWorld(SceneType.LockStepClient, message.Frame);
+            using (session.ClientScene().AddChild(clientWorld))
+            {
+                Log.Debug($"check hash fail, client: {message.Frame} {clientWorld.ToJson()}");
+            }
+            await ETTask.CompletedTask;
+        }
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Hotfix/Client/LockStep/Room2C_CheckHashFailHandler.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bd750474e6e5d437e8f1ac8279a7489d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 1 - 0
Unity/Assets/Scripts/Hotfix/Server/LockStep/Map/RoomManagerComponentSystem.cs

@@ -10,6 +10,7 @@ namespace ET.Server
             await ETTask.CompletedTask;
             
             Room room = self.AddChild<Room>();
+            room.Name = "Server";
             
             room.AddComponent<RoomServerComponent, Match2Map_GetRoom>(request);
 

+ 18 - 0
Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/C2Room_CheckHashHandler.cs

@@ -0,0 +1,18 @@
+namespace ET.Server
+{
+    [ActorMessageHandler(SceneType.Room)]
+    public class C2Room_CheckHashHandler: AMActorHandler<Room, C2Room_CheckHash>
+    {
+        protected override async ETTask Run(Room room, C2Room_CheckHash message)
+        {
+            long hash = room.FrameBuffer.GetHash(message.Frame);
+            if (message.Hash != hash)
+            {
+                byte[] bytes = room.FrameBuffer.Snapshot(message.Frame).ToArray();
+                Room2C_CheckHashFail room2CCheckHashFail = new() { Frame = message.Frame, LSWorldBytes = bytes };
+                ActorLocationSenderComponent.Instance.Get(LocationType.GateSession).Send(message.PlayerId, room2CCheckHashFail);
+            }
+            await ETTask.CompletedTask;
+        }
+    }
+}

+ 11 - 0
Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/C2Room_CheckHashHandler.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8f87c1aa12fde40b5afda6ea778cfdf4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 4 - 0
Unity/Assets/Scripts/Hotfix/Server/LockStep/Room/LSServerUpdaterSystem.cs

@@ -35,6 +35,10 @@ namespace ET.Server
 
             RoomMessageHelper.BroadCast(room, sendInput);
             
+            // 保存当前帧场景数据
+            room.SaveLSWorld(room.AuthorityFrame);
+            room.Record(room.AuthorityFrame);
+            
             room.Update(oneFrameInputs, frame);
         }
 

+ 4 - 2
Unity/Assets/Scripts/Hotfix/Share/LockStep/LSHelper.cs

@@ -39,17 +39,19 @@ namespace ET
             FrameBuffer frameBuffer = room.FrameBuffer;
             
             // 回滚
-            room.LSWorld = room.GetLSWorld(frame);
+            room.LSWorld = room.GetLSWorld(SceneType.LockStepClient, frame);
             OneFrameInputs authorityFrameInput = frameBuffer.FrameInputs(frame);
-            // 执行RealFrame
+            // 执行AuthorityFrame
             room.Update(authorityFrameInput, frame);
 
             
             // 重新执行预测的帧
             for (int i = room.AuthorityFrame + 1; i <= room.PredictionFrame; ++i)
             {
+                Log.Debug($"roll back predict {i}");
                 OneFrameInputs oneFrameInputs = frameBuffer.FrameInputs(i);
                 LSHelper.CopyOtherInputsTo(room, authorityFrameInput, oneFrameInputs); // 重新预测消息
+                room.Update(authorityFrameInput, i);
             }
             
             RunRollbackSystem(room);

+ 15 - 13
Unity/Assets/Scripts/Hotfix/Share/LockStep/RoomSystem.cs

@@ -33,17 +33,6 @@ namespace ET
         {
             LSWorld lsWorld = self.LSWorld;
 
-            if (!self.IsReplay)
-            {
-                // 保存当前帧场景数据
-                self.SaveLSWorld(frame);
-
-                if (frame <= self.AuthorityFrame) // 只有AuthorityFrame帧才保存录像数据
-                {
-                    self.Record(frame);
-                }
-            }
-
             // 设置输入到每个LSUnit身上
             LSUnitComponent unitComponent = lsWorld.GetComponent<LSUnitComponent>();
             foreach (var kv in oneFrameInputs.Inputs)
@@ -56,10 +45,14 @@ namespace ET
             lsWorld.Update();
         }
         
-        public static LSWorld GetLSWorld(this Room self, int frame)
+        public static LSWorld GetLSWorld(this Room self, SceneType sceneType, int frame)
         {
             MemoryBuffer memoryBuffer = self.FrameBuffer.Snapshot(frame);
-            return MongoHelper.Deserialize(typeof (LSWorld), memoryBuffer) as LSWorld;
+            memoryBuffer.Seek(0, SeekOrigin.Begin);
+            LSWorld lsWorld = MongoHelper.Deserialize(typeof (LSWorld), memoryBuffer) as LSWorld;
+            lsWorld.SceneType = sceneType;
+            memoryBuffer.Seek(0, SeekOrigin.Begin);
+            return lsWorld;
         }
 
         public static void SaveLSWorld(this Room self, int frame)
@@ -67,9 +60,18 @@ namespace ET
             MemoryBuffer memoryBuffer = self.FrameBuffer.Snapshot(frame);
             memoryBuffer.Seek(0, SeekOrigin.Begin);
             memoryBuffer.SetLength(0);
+
+            if (frame != self.LSWorld.Frame)
+            {
+                Log.Error($"lsworld frame diff: {frame} {self.LSWorld.Frame}");
+            }
             
             MongoHelper.Serialize(self.LSWorld, memoryBuffer);
             memoryBuffer.Seek(0, SeekOrigin.Begin);
+
+            long hash = memoryBuffer.GetBuffer().Hash(0, (int) memoryBuffer.Length);
+            
+            self.FrameBuffer.SetHash(frame, hash);
         }
 
         // 记录需要存档的数据

+ 6 - 6
Unity/Assets/Scripts/HotfixView/Client/LockStep/LSUnitViewSystem.cs

@@ -19,11 +19,11 @@ namespace ET.Client
         {
             protected override void Rollback(LSUnitView self)
             {
-                LSUnit unit = self.GetUnit();
-                self.Transform.position = unit.Position.ToVector();
-                self.Transform.rotation = unit.Rotation.ToQuaternion();
-                self.t = 0;
-                self.totalTime = 0;
+                //LSUnit unit = self.GetUnit();
+                //self.Transform.position = unit.Position.ToVector();
+                //self.Transform.rotation = unit.Rotation.ToQuaternion();
+                //self.t = 0;
+                //self.totalTime = 0;
             }
         }
         
@@ -41,7 +41,7 @@ namespace ET.Client
 
             Vector3 unitPos = unit.Position.ToVector();
             const float speed = 6f;
-            float speed2 = speed * self.Room().SpeedMultiply;
+            float speed2 = speed;// * self.Room().SpeedMultiply;
             
             if (unitPos != self.Position)
             {

+ 186 - 92
Unity/Assets/Scripts/Loader/Plugins/HybridCLR/Generated/AOTGenericReferences.cs

@@ -2,7 +2,10 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
 {
 
 	// {{ AOT assemblies
+	// CommandLine.dll
 	// MemoryPack.dll
+	// MongoDB.Driver.Core.dll
+	// MongoDB.Driver.dll
 	// System.Core.dll
 	// System.Runtime.CompilerServices.Unsafe.dll
 	// System.dll
@@ -18,118 +21,166 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
 	// }} 
 
 	// {{ AOT generic types
-	// ET.AEvent<object,ET.EventType.LoginFinish>
-	// ET.AEvent<object,ET.EventType.EntryEvent3>
+	// ET.AEvent<object,ET.Server.EventType.UnitEnterSightRange>
 	// ET.AEvent<object,ET.EventType.AfterCreateClientScene>
 	// ET.AEvent<object,ET.EventType.AfterCreateCurrentScene>
-	// ET.AEvent<object,ET.EventType.NumbericChange>
 	// ET.AEvent<object,ET.EventType.SceneChangeStart>
-	// ET.AEvent<object,ET.EventType.SceneChangeFinish>
 	// ET.AEvent<object,ET.Client.NetClientComponentOnRead>
-	// ET.AEvent<object,ET.EventType.EntryEvent1>
+	// ET.AEvent<object,ET.EventType.SceneChangeFinish>
+	// ET.AEvent<object,ET.EventType.LoginFinish>
+	// ET.AEvent<object,ET.EventType.AppStartInitFinish>
+	// ET.AEvent<object,ET.EventType.NumbericChange>
+	// ET.AEvent<object,ET.EventType.EntryEvent2>
 	// ET.AEvent<object,ET.EventType.AfterUnitCreate>
-	// ET.AEvent<object,ET.EventType.ChangePosition>
+	// ET.AEvent<object,ET.EventType.EntryEvent1>
 	// ET.AEvent<object,ET.EventType.ChangeRotation>
+	// ET.AEvent<object,ET.Server.NetServerComponentOnRead>
 	// ET.AEvent<object,ET.EventType.LSAfterUnitCreate>
-	// ET.AEvent<object,ET.EventType.LockStepSceneChangeStart>
-	// ET.AEvent<object,ET.EventType.LockStepSceneInitFinish>
-	// ET.AEvent<object,ET.EventType.AppStartInitFinish>
-	// ET.AInvokeHandler<ET.ConfigComponent.GetAllConfigBytes,object>
+	// ET.AEvent<object,ET.EventType.LSSceneChangeStart>
+	// ET.AEvent<object,ET.EventType.LSSceneInitFinish>
+	// ET.AEvent<object,ET.Server.NetInnerComponentOnRead>
+	// ET.AEvent<object,ET.Server.EventType.UnitLeaveSightRange>
+	// ET.AEvent<object,ET.EventType.ChangePosition>
+	// ET.AEvent<object,ET.EventType.EntryEvent3>
 	// ET.AInvokeHandler<ET.ConfigComponent.GetOneConfigBytes,object>
+	// ET.AInvokeHandler<ET.ConfigComponent.GetAllConfigBytes,object>
+	// ET.AInvokeHandler<ET.Server.RobotInvokeArgs,object>
+	// ET.AInvokeHandler<ET.NavmeshComponent.RecastFileLoader,object>
 	// ET.AMHandler<object>
 	// ET.ATimer<object>
 	// ET.AwakeSystem<object>
 	// ET.AwakeSystem<object,object>
-	// ET.AwakeSystem<object,System.Net.Sockets.AddressFamily>
 	// ET.AwakeSystem<object,int>
-	// ET.AwakeSystem<object,object,object>
+	// ET.AwakeSystem<object,System.Net.Sockets.AddressFamily>
+	// ET.AwakeSystem<object,ET.Server.MailboxType>
 	// ET.AwakeSystem<object,object,int>
+	// ET.AwakeSystem<object,long,object>
+	// ET.AwakeSystem<object,object,object>
+	// ET.AwakeSystem<object,int,Unity.Mathematics.float3>
+	// ET.AwakeSystem<object,object,object,int>
 	// ET.ConfigSingleton<object>
 	// ET.DestroySystem<object>
 	// ET.EntityRef<object>
+	// ET.ETAsyncTaskMethodBuilder<int>
 	// ET.ETAsyncTaskMethodBuilder<System.ValueTuple<uint,object>>
 	// ET.ETAsyncTaskMethodBuilder<byte>
-	// ET.ETAsyncTaskMethodBuilder<int>
 	// ET.ETAsyncTaskMethodBuilder<uint>
 	// ET.ETAsyncTaskMethodBuilder<object>
-	// ET.ETTask<byte>
-	// ET.ETTask<ET.Client.Wait_UnitStop>
+	// ET.ETAsyncTaskMethodBuilder<long>
+	// ET.ETTask<ET.WaitType.Wait_Room2C_Start>
+	// ET.ETTask<ET.Client.Wait_CreateMyUnit>
+	// ET.ETTask<object>
 	// ET.ETTask<int>
-	// ET.ETTask<ET.Client.Wait_SceneChangeFinish>
+	// ET.ETTask<long>
 	// ET.ETTask<System.ValueTuple<uint,object>>
-	// ET.ETTask<object>
+	// ET.ETTask<ET.Client.Wait_UnitStop>
+	// ET.ETTask<ET.Client.Wait_SceneChangeFinish>
+	// ET.ETTask<byte>
 	// ET.ETTask<uint>
-	// ET.ETTask<ET.Client.Wait_CreateMyUnit>
-	// ET.ETTask<ET.WaitType.Wait_Room2C_Start>
-	// ET.IAwake<System.Net.Sockets.AddressFamily>
-	// ET.IAwake<object>
+	// ET.ETTask<ET.RobotCase_SecondCaseWait>
+	// ET.IAwake<ET.Server.MailboxType>
 	// ET.IAwake<int>
-	// ET.IAwake<object,object>
+	// ET.IAwake<object>
+	// ET.IAwake<System.Net.Sockets.AddressFamily>
 	// ET.IAwake<object,int>
+	// ET.IAwake<long,object>
+	// ET.IAwake<object,object>
+	// ET.IAwake<int,Unity.Mathematics.float3>
+	// ET.IAwake<object,object,int>
 	// ET.LateUpdateSystem<object>
-	// ET.ListComponent<Unity.Mathematics.float3>
 	// ET.ListComponent<object>
+	// ET.ListComponent<long>
+	// ET.ListComponent<Unity.Mathematics.float3>
 	// ET.LoadSystem<object>
 	// ET.LSUpdateSystem<object>
+	// ET.MultiMap<int,object>
+	// ET.RollbackSystem<object>
+	// ET.Server.AMActorHandler<object,object>
+	// ET.Server.AMActorLocationHandler<object,object>
+	// ET.Server.AMActorLocationRpcHandler<object,object,object>
+	// ET.Server.AMActorRpcHandler<object,object,object>
+	// ET.Server.AMRpcHandler<object,object>
 	// ET.Singleton<object>
 	// ET.UnOrderMultiMap<object,object>
 	// ET.UpdateSystem<object>
-	// MemoryPack.Formatters.ArrayFormatter<byte>
 	// MemoryPack.Formatters.ArrayFormatter<ET.LSInput>
 	// MemoryPack.Formatters.ArrayFormatter<object>
+	// MemoryPack.Formatters.ArrayFormatter<byte>
 	// MemoryPack.Formatters.DictionaryFormatter<long,ET.LSInput>
 	// MemoryPack.Formatters.DictionaryFormatter<int,long>
-	// MemoryPack.Formatters.ListFormatter<object>
 	// MemoryPack.Formatters.ListFormatter<long>
+	// MemoryPack.Formatters.ListFormatter<object>
 	// MemoryPack.Formatters.ListFormatter<Unity.Mathematics.float3>
-	// MemoryPack.IMemoryPackable<ET.LSInput>
 	// MemoryPack.IMemoryPackable<object>
+	// MemoryPack.IMemoryPackable<ET.LSInput>
 	// MemoryPack.MemoryPackFormatter<object>
 	// MemoryPack.MemoryPackFormatter<ET.LSInput>
+	// MongoDB.Driver.IMongoCollection<object>
+	// System.Action<object>
+	// System.Action<long,object>
 	// System.Action<long,int>
 	// System.Action<long,long,object>
+	// System.Collections.Generic.Dictionary<int,long>
+	// System.Collections.Generic.Dictionary<object,object>
 	// System.Collections.Generic.Dictionary<ushort,object>
-	// System.Collections.Generic.Dictionary<object,int>
 	// System.Collections.Generic.Dictionary<long,ET.EntityRef<object>>
-	// System.Collections.Generic.Dictionary<long,ET.LSInput>
-	// System.Collections.Generic.Dictionary<int,object>
+	// System.Collections.Generic.Dictionary<object,int>
 	// System.Collections.Generic.Dictionary<object,long>
+	// System.Collections.Generic.Dictionary<int,object>
+	// System.Collections.Generic.Dictionary<long,long>
+	// System.Collections.Generic.Dictionary<long,ET.LSInput>
+	// System.Collections.Generic.Dictionary<uint,object>
 	// System.Collections.Generic.Dictionary<int,ET.RpcInfo>
-	// System.Collections.Generic.Dictionary<int,long>
-	// System.Collections.Generic.Dictionary<object,object>
+	// System.Collections.Generic.Dictionary<long,object>
 	// System.Collections.Generic.Dictionary.Enumerator<int,long>
+	// System.Collections.Generic.Dictionary.Enumerator<long,object>
 	// System.Collections.Generic.Dictionary.Enumerator<int,object>
-	// System.Collections.Generic.Dictionary.Enumerator<object,object>
 	// System.Collections.Generic.Dictionary.Enumerator<long,ET.LSInput>
+	// System.Collections.Generic.Dictionary.Enumerator<object,object>
+	// System.Collections.Generic.Dictionary.Enumerator<uint,object>
 	// System.Collections.Generic.Dictionary.ValueCollection<int,object>
+	// System.Collections.Generic.Dictionary.ValueCollection<long,object>
 	// System.Collections.Generic.Dictionary.ValueCollection<object,object>
-	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,object>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<long,object>
 	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<object,object>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,object>
+	// System.Collections.Generic.HashSet<long>
 	// System.Collections.Generic.HashSet<ushort>
 	// System.Collections.Generic.HashSet<object>
+	// System.Collections.Generic.HashSet.Enumerator<long>
 	// System.Collections.Generic.HashSet.Enumerator<object>
-	// System.Collections.Generic.KeyValuePair<int,object>
+	// System.Collections.Generic.KeyValuePair<long,ET.LSInput>
 	// System.Collections.Generic.KeyValuePair<object,int>
+	// System.Collections.Generic.KeyValuePair<uint,object>
+	// System.Collections.Generic.KeyValuePair<int,ET.Server.ActorMessageSender>
+	// System.Collections.Generic.KeyValuePair<int,object>
 	// System.Collections.Generic.KeyValuePair<int,long>
-	// System.Collections.Generic.KeyValuePair<long,ET.LSInput>
 	// System.Collections.Generic.KeyValuePair<object,object>
 	// System.Collections.Generic.KeyValuePair<long,object>
+	// System.Collections.Generic.List<int>
 	// System.Collections.Generic.List<long>
 	// System.Collections.Generic.List<Unity.Mathematics.float3>
 	// System.Collections.Generic.List<object>
 	// System.Collections.Generic.List.Enumerator<object>
-	// System.Collections.Generic.List.Enumerator<Unity.Mathematics.float3>
+	// System.Collections.Generic.List.Enumerator<int>
 	// System.Collections.Generic.List.Enumerator<long>
+	// System.Collections.Generic.List.Enumerator<Unity.Mathematics.float3>
 	// System.Collections.Generic.SortedDictionary<long,object>
-	// System.Collections.Generic.SortedDictionary<int,object>
 	// System.Collections.Generic.SortedDictionary<object,object>
+	// System.Collections.Generic.SortedDictionary<int,object>
+	// System.Collections.Generic.SortedDictionary<int,ET.Server.ActorMessageSender>
 	// System.Collections.Generic.SortedDictionary.Enumerator<long,object>
+	// System.Collections.Generic.SortedDictionary.Enumerator<int,ET.Server.ActorMessageSender>
 	// System.Collections.Generic.SortedDictionary.Enumerator<object,object>
 	// System.Collections.Generic.SortedDictionary.ValueCollection<int,object>
+	// System.Collections.Generic.SortedDictionary.ValueCollection<object,object>
+	// System.Collections.Generic.SortedDictionary.ValueCollection<long,object>
+	// System.Collections.Generic.SortedDictionary.ValueCollection.Enumerator<object,object>
+	// System.Collections.Generic.SortedDictionary.ValueCollection.Enumerator<long,object>
 	// System.Collections.Generic.SortedDictionary.ValueCollection.Enumerator<int,object>
 	// System.Func<object>
-	// System.Func<System.Collections.Generic.KeyValuePair<object,int>,object>
 	// System.Func<System.Collections.Generic.KeyValuePair<object,int>,int>
+	// System.Func<System.Collections.Generic.KeyValuePair<object,int>,object>
 	// System.Runtime.CompilerServices.TaskAwaiter<System.ValueTuple<uint,uint>>
 	// System.Runtime.CompilerServices.TaskAwaiter<object>
 	// System.Threading.Tasks.Task<object>
@@ -140,14 +191,28 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
 
 	public void RefMethods()
 	{
+		// CommandLine.ParserResult<object> CommandLine.Parser.ParseArguments<object>(System.Collections.Generic.IEnumerable<string>)
+		// CommandLine.ParserResult<object> CommandLine.ParserResultExtensions.WithNotParsed<object>(CommandLine.ParserResult<object>,System.Action<System.Collections.Generic.IEnumerable<CommandLine.Error>>)
+		// CommandLine.ParserResult<object> CommandLine.ParserResultExtensions.WithParsed<object>(CommandLine.ParserResult<object>,System.Action<object>)
 		// object ET.Client.GameObjectHelper.Get<object>(UnityEngine.GameObject,string)
+		// object ET.Entity.AddChild<object,long,object>(long,object,bool)
+		// object ET.Entity.AddChild<object>(bool)
+		// object ET.Entity.AddChild<object,object,object,int>(object,object,int,bool)
+		// object ET.Entity.AddChild<object,int>(int,bool)
 		// object ET.Entity.AddChild<object,object,object>(object,object,bool)
-		// object ET.Entity.AddChildWithId<object,object>(long,object,bool)
+		// object ET.Entity.AddChild<object,object>(object,bool)
 		// object ET.Entity.AddChildWithId<object>(long,bool)
 		// object ET.Entity.AddChildWithId<object,int>(long,int,bool)
-		// object ET.Entity.AddComponent<object,System.Net.Sockets.AddressFamily>(System.Net.Sockets.AddressFamily,bool)
-		// object ET.Entity.AddComponent<object,object,int>(object,int,bool)
+		// object ET.Entity.AddChildWithId<object,object>(long,object,bool)
+		// object ET.Entity.AddComponent<object,int,Unity.Mathematics.float3>(int,Unity.Mathematics.float3,bool)
 		// object ET.Entity.AddComponent<object>(bool)
+		// object ET.Entity.AddComponent<object,object>(object,bool)
+		// object ET.Entity.AddComponent<object,ET.Server.MailboxType>(ET.Server.MailboxType,bool)
+		// object ET.Entity.AddComponent<object,object,object>(object,object,bool)
+		// object ET.Entity.AddComponent<object,object,int>(object,int,bool)
+		// object ET.Entity.AddComponent<object,int>(int,bool)
+		// object ET.Entity.AddComponent<object,System.Net.Sockets.AddressFamily>(System.Net.Sockets.AddressFamily,bool)
+		// object ET.Entity.AddComponentWithId<object>(long,bool)
 		// object ET.Entity.GetChild<object>(long)
 		// object ET.Entity.GetComponent<object>()
 		// object ET.Entity.GetParent<object>()
@@ -160,122 +225,151 @@ public class AOTGenericReferences : UnityEngine.MonoBehaviour
 		// System.Void ET.ETAsyncTaskMethodBuilder.Start<object>(object&)
 		// System.Void ET.ETAsyncTaskMethodBuilder<object>.AwaitUnsafeOnCompleted<ET.ETTaskCompleted,object>(ET.ETTaskCompleted&,object&)
 		// System.Void ET.ETAsyncTaskMethodBuilder<object>.AwaitUnsafeOnCompleted<System.Runtime.CompilerServices.TaskAwaiter<object>,object>(System.Runtime.CompilerServices.TaskAwaiter<object>&,object&)
-		// System.Void ET.ETAsyncTaskMethodBuilder<int>.AwaitUnsafeOnCompleted<object,object>(object&,object&)
-		// System.Void ET.ETAsyncTaskMethodBuilder<object>.AwaitUnsafeOnCompleted<object,object>(object&,object&)
 		// System.Void ET.ETAsyncTaskMethodBuilder<byte>.AwaitUnsafeOnCompleted<object,object>(object&,object&)
 		// System.Void ET.ETAsyncTaskMethodBuilder<System.ValueTuple<uint,object>>.AwaitUnsafeOnCompleted<object,object>(object&,object&)
 		// System.Void ET.ETAsyncTaskMethodBuilder<uint>.AwaitUnsafeOnCompleted<object,object>(object&,object&)
+		// System.Void ET.ETAsyncTaskMethodBuilder<long>.AwaitUnsafeOnCompleted<object,object>(object&,object&)
+		// System.Void ET.ETAsyncTaskMethodBuilder<object>.AwaitUnsafeOnCompleted<object,object>(object&,object&)
+		// System.Void ET.ETAsyncTaskMethodBuilder<int>.AwaitUnsafeOnCompleted<object,object>(object&,object&)
+		// System.Void ET.ETAsyncTaskMethodBuilder<long>.Start<object>(object&)
+		// System.Void ET.ETAsyncTaskMethodBuilder<uint>.Start<object>(object&)
 		// System.Void ET.ETAsyncTaskMethodBuilder<byte>.Start<object>(object&)
-		// System.Void ET.ETAsyncTaskMethodBuilder<int>.Start<object>(object&)
 		// System.Void ET.ETAsyncTaskMethodBuilder<System.ValueTuple<uint,object>>.Start<object>(object&)
-		// System.Void ET.ETAsyncTaskMethodBuilder<uint>.Start<object>(object&)
+		// System.Void ET.ETAsyncTaskMethodBuilder<int>.Start<object>(object&)
 		// System.Void ET.ETAsyncTaskMethodBuilder<object>.Start<object>(object&)
 		// object ET.EventSystem.Invoke<ET.NavmeshComponent.RecastFileLoader,object>(ET.NavmeshComponent.RecastFileLoader)
-		// System.Void ET.EventSystem.Publish<object,ET.EventType.MoveStop>(object,ET.EventType.MoveStop)
+		// object ET.EventSystem.Invoke<ET.Server.RobotInvokeArgs,object>(int,ET.Server.RobotInvokeArgs)
+		// System.Void ET.EventSystem.Publish<object,ET.EventType.AfterCreateClientScene>(object,ET.EventType.AfterCreateClientScene)
 		// System.Void ET.EventSystem.Publish<object,ET.Client.NetClientComponentOnRead>(object,ET.Client.NetClientComponentOnRead)
+		// System.Void ET.EventSystem.Publish<object,ET.Server.EventType.UnitEnterSightRange>(object,ET.Server.EventType.UnitEnterSightRange)
+		// System.Void ET.EventSystem.Publish<object,ET.Server.EventType.UnitLeaveSightRange>(object,ET.Server.EventType.UnitLeaveSightRange)
 		// System.Void ET.EventSystem.Publish<object,ET.EventType.AfterUnitCreate>(object,ET.EventType.AfterUnitCreate)
-		// System.Void ET.EventSystem.Publish<object,ET.EventType.MoveStart>(object,ET.EventType.MoveStart)
-		// System.Void ET.EventSystem.Publish<object,ET.EventType.AfterCreateCurrentScene>(object,ET.EventType.AfterCreateCurrentScene)
-		// System.Void ET.EventSystem.Publish<object,ET.EventType.LSAfterUnitCreate>(object,ET.EventType.LSAfterUnitCreate)
-		// System.Void ET.EventSystem.Publish<object,ET.EventType.ChangeRotation>(object,ET.EventType.ChangeRotation)
-		// System.Void ET.EventSystem.Publish<object,ET.EventType.ChangePosition>(object,ET.EventType.ChangePosition)
+		// System.Void ET.EventSystem.Publish<object,ET.Server.NetInnerComponentOnRead>(object,ET.Server.NetInnerComponentOnRead)
+		// System.Void ET.EventSystem.Publish<object,ET.Server.NetServerComponentOnRead>(object,ET.Server.NetServerComponentOnRead)
 		// System.Void ET.EventSystem.Publish<object,ET.EventType.NumbericChange>(object,ET.EventType.NumbericChange)
-		// System.Void ET.EventSystem.Publish<object,ET.EventType.SceneChangeStart>(object,ET.EventType.SceneChangeStart)
+		// System.Void ET.EventSystem.Publish<object,ET.EventType.ChangePosition>(object,ET.EventType.ChangePosition)
+		// System.Void ET.EventSystem.Publish<object,ET.EventType.LSSceneInitFinish>(object,ET.EventType.LSSceneInitFinish)
+		// System.Void ET.EventSystem.Publish<object,ET.EventType.AfterCreateCurrentScene>(object,ET.EventType.AfterCreateCurrentScene)
 		// System.Void ET.EventSystem.Publish<object,ET.EventType.SceneChangeFinish>(object,ET.EventType.SceneChangeFinish)
-		// System.Void ET.EventSystem.Publish<object,ET.EventType.AfterCreateClientScene>(object,ET.EventType.AfterCreateClientScene)
-		// System.Void ET.EventSystem.Publish<object,ET.EventType.LockStepSceneInitFinish>(object,ET.EventType.LockStepSceneInitFinish)
+		// System.Void ET.EventSystem.Publish<object,ET.EventType.MoveStart>(object,ET.EventType.MoveStart)
+		// System.Void ET.EventSystem.Publish<object,ET.EventType.LSAfterUnitCreate>(object,ET.EventType.LSAfterUnitCreate)
+		// System.Void ET.EventSystem.Publish<object,ET.EventType.MoveStop>(object,ET.EventType.MoveStop)
 		// System.Void ET.EventSystem.Publish<object,ET.EventType.EnterMapFinish>(object,ET.EventType.EnterMapFinish)
-		// ET.ETTask ET.EventSystem.PublishAsync<object,ET.EventType.EntryEvent3>(object,ET.EventType.EntryEvent3)
+		// System.Void ET.EventSystem.Publish<object,ET.EventType.SceneChangeStart>(object,ET.EventType.SceneChangeStart)
+		// System.Void ET.EventSystem.Publish<object,ET.EventType.ChangeRotation>(object,ET.EventType.ChangeRotation)
+		// ET.ETTask ET.EventSystem.PublishAsync<object,ET.EventType.LSSceneChangeStart>(object,ET.EventType.LSSceneChangeStart)
 		// ET.ETTask ET.EventSystem.PublishAsync<object,ET.EventType.EntryEvent2>(object,ET.EventType.EntryEvent2)
 		// ET.ETTask ET.EventSystem.PublishAsync<object,ET.EventType.EntryEvent1>(object,ET.EventType.EntryEvent1)
-		// ET.ETTask ET.EventSystem.PublishAsync<object,ET.EventType.LockStepSceneChangeStart>(object,ET.EventType.LockStepSceneChangeStart)
 		// ET.ETTask ET.EventSystem.PublishAsync<object,ET.EventType.AppStartInitFinish>(object,ET.EventType.AppStartInitFinish)
 		// ET.ETTask ET.EventSystem.PublishAsync<object,ET.EventType.LoginFinish>(object,ET.EventType.LoginFinish)
+		// ET.ETTask ET.EventSystem.PublishAsync<object,ET.EventType.EntryEvent3>(object,ET.EventType.EntryEvent3)
 		// object ET.Game.AddSingleton<object>()
 		// object ET.JsonHelper.FromJson<object>(string)
 		// object ET.LSEntity.AddComponent<object>(bool)
+		// object ET.MongoHelper.Deserialize<object>(byte[])
 		// System.Void ET.MongoHelper.RegisterStruct<ET.LSInput>()
 		// object ET.NetServices.FetchMessage<object>()
 		// System.Void ET.ObjectHelper.Swap<object>(object&,object&)
 		// System.Void ET.ObjectWaitSystem.Notify<ET.WaitType.Wait_Room2C_Start>(ET.ObjectWait,ET.WaitType.Wait_Room2C_Start)
+		// System.Void ET.ObjectWaitSystem.Notify<ET.RobotCase_SecondCaseWait>(ET.ObjectWait,ET.RobotCase_SecondCaseWait)
 		// System.Void ET.ObjectWaitSystem.Notify<ET.Client.Wait_UnitStop>(ET.ObjectWait,ET.Client.Wait_UnitStop)
 		// System.Void ET.ObjectWaitSystem.Notify<ET.Client.Wait_CreateMyUnit>(ET.ObjectWait,ET.Client.Wait_CreateMyUnit)
 		// System.Void ET.ObjectWaitSystem.Notify<ET.Client.Wait_SceneChangeFinish>(ET.ObjectWait,ET.Client.Wait_SceneChangeFinish)
-		// ET.ETTask<ET.Client.Wait_SceneChangeFinish> ET.ObjectWaitSystem.Wait<ET.Client.Wait_SceneChangeFinish>(ET.ObjectWait,ET.ETCancellationToken)
-		// ET.ETTask<ET.Client.Wait_CreateMyUnit> ET.ObjectWaitSystem.Wait<ET.Client.Wait_CreateMyUnit>(ET.ObjectWait,ET.ETCancellationToken)
-		// ET.ETTask<ET.Client.Wait_UnitStop> ET.ObjectWaitSystem.Wait<ET.Client.Wait_UnitStop>(ET.ObjectWait,ET.ETCancellationToken)
 		// ET.ETTask<ET.WaitType.Wait_Room2C_Start> ET.ObjectWaitSystem.Wait<ET.WaitType.Wait_Room2C_Start>(ET.ObjectWait,ET.ETCancellationToken)
+		// ET.ETTask<ET.Client.Wait_UnitStop> ET.ObjectWaitSystem.Wait<ET.Client.Wait_UnitStop>(ET.ObjectWait,ET.ETCancellationToken)
+		// ET.ETTask<ET.Client.Wait_CreateMyUnit> ET.ObjectWaitSystem.Wait<ET.Client.Wait_CreateMyUnit>(ET.ObjectWait,ET.ETCancellationToken)
+		// ET.ETTask<ET.Client.Wait_SceneChangeFinish> ET.ObjectWaitSystem.Wait<ET.Client.Wait_SceneChangeFinish>(ET.ObjectWait,ET.ETCancellationToken)
+		// ET.ETTask<ET.RobotCase_SecondCaseWait> ET.ObjectWaitSystem.Wait<ET.RobotCase_SecondCaseWait>(ET.ObjectWait,ET.ETCancellationToken)
 		// System.Void ET.RandomGenerator.BreakRank<object>(System.Collections.Generic.List<object>)
+		// object ET.RandomGenerator.RandomArray<object>(System.Collections.Generic.List<object>)
 		// string ET.StringHelper.ArrayToString<float>(float[])
 		// System.Void MemoryPack.Formatters.ListFormatter.DeserializePackable<object>(MemoryPack.MemoryPackReader&,System.Collections.Generic.List<object>&)
 		// System.Collections.Generic.List<object> MemoryPack.Formatters.ListFormatter.DeserializePackable<object>(MemoryPack.MemoryPackReader&)
 		// System.Void MemoryPack.Formatters.ListFormatter.SerializePackable<object>(MemoryPack.MemoryPackWriter&,System.Collections.Generic.List<object>&)
-		// bool MemoryPack.MemoryPackFormatterProvider.IsRegistered<ET.LSInput>()
 		// bool MemoryPack.MemoryPackFormatterProvider.IsRegistered<object>()
-		// System.Void MemoryPack.MemoryPackFormatterProvider.Register<object>(MemoryPack.MemoryPackFormatter<object>)
+		// bool MemoryPack.MemoryPackFormatterProvider.IsRegistered<ET.LSInput>()
 		// System.Void MemoryPack.MemoryPackFormatterProvider.Register<ET.LSInput>(MemoryPack.MemoryPackFormatter<ET.LSInput>)
+		// System.Void MemoryPack.MemoryPackFormatterProvider.Register<object>(MemoryPack.MemoryPackFormatter<object>)
 		// System.Void MemoryPack.MemoryPackReader.ReadPackable<object>(object&)
 		// object MemoryPack.MemoryPackReader.ReadPackable<object>()
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<uint>(uint&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<int,int>(int&,int&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<int>(int&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<TrueSync.TSVector>(TrueSync.TSVector&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,long,TrueSync.TSVector,TrueSync.TSQuaternion>(byte&,long&,TrueSync.TSVector&,TrueSync.TSQuaternion&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,long>(byte&,long&)
 		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,int>(byte&,int&,int&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<long,long>(long&,long&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<int,long>(int&,long&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,int,long,long,long>(byte&,int&,int&,long&,long&,long&)
 		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<long>(long&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,long,TrueSync.TSVector,TrueSync.TSQuaternion>(byte&,long&,TrueSync.TSVector&,TrueSync.TSQuaternion&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<TrueSync.TSVector>(TrueSync.TSVector&)
 		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<TrueSync.TSQuaternion>(TrueSync.TSQuaternion&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<ET.LSInput>(ET.LSInput&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int>(byte&,int&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<Unity.Mathematics.float3>(Unity.Mathematics.float3&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,uint>(byte&,uint&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,int,long,long,int>(byte&,int&,int&,long&,long&,int&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,int,long,long>(byte&,int&,int&,long&,long&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<int,int>(int&,int&)
 		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,long>(byte&,int&,long&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<int>(int&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,long,ET.LSInput>(byte&,int&,long&,ET.LSInput&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,long>(byte&,long&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,Unity.Mathematics.float3>(byte&,int&,Unity.Mathematics.float3&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,long,Unity.Mathematics.float3>(byte&,long&,Unity.Mathematics.float3&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,long,Unity.Mathematics.float3,Unity.Mathematics.quaternion>(byte&,int&,long&,Unity.Mathematics.float3&,Unity.Mathematics.quaternion&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<long,long>(long&,long&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,int,long>(byte&,int&,int&,long&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int>(byte&,int&)
 		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,long,long>(byte&,int&,long&,long&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,Unity.Mathematics.float3>(byte&,int&,Unity.Mathematics.float3&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<Unity.Mathematics.float3>(Unity.Mathematics.float3&)
 		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,long,int,int,Unity.Mathematics.float3,Unity.Mathematics.float3>(byte&,long&,int&,int&,Unity.Mathematics.float3&,Unity.Mathematics.float3&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,long,ET.LSInput>(byte&,int&,long&,ET.LSInput&)
 		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<Unity.Mathematics.quaternion>(Unity.Mathematics.quaternion&)
-		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<Unity.Mathematics.quaternion,int>(Unity.Mathematics.quaternion&,int&)
 		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte>(byte&)
-		// System.Void MemoryPack.MemoryPackReader.ReadValue<object>(object&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<ET.LSInput>(ET.LSInput&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,long,Unity.Mathematics.float3>(byte&,long&,Unity.Mathematics.float3&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<Unity.Mathematics.quaternion,int>(Unity.Mathematics.quaternion&,int&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,int,long,Unity.Mathematics.float3,Unity.Mathematics.quaternion>(byte&,int&,long&,Unity.Mathematics.float3&,Unity.Mathematics.quaternion&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<uint>(uint&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanaged<byte,uint>(byte&,uint&)
+		// System.Void MemoryPack.MemoryPackReader.ReadUnmanagedArray<byte>(byte[]&)
+		// byte[] MemoryPack.MemoryPackReader.ReadUnmanagedArray<byte>()
 		// object MemoryPack.MemoryPackReader.ReadValue<object>()
+		// System.Void MemoryPack.MemoryPackReader.ReadValue<object>(object&)
 		// System.Void MemoryPack.MemoryPackWriter.WritePackable<object>(object&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<ET.LSInput>(ET.LSInput&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<int,long>(int&,long&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<int>(int&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<long,long>(long&,long&)
 		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<long>(long&)
 		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<Unity.Mathematics.quaternion,int>(Unity.Mathematics.quaternion&,int&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<long,long>(long&,long&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<int>(int&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanaged<ET.LSInput>(ET.LSInput&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,Unity.Mathematics.float3>(byte,byte&,int&,Unity.Mathematics.float3&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,long,Unity.Mathematics.float3>(byte,byte&,long&,Unity.Mathematics.float3&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,long,Unity.Mathematics.float3,Unity.Mathematics.quaternion>(byte,byte&,int&,long&,Unity.Mathematics.float3&,Unity.Mathematics.quaternion&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<int,int>(byte,int&,int&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,uint>(byte,byte&,uint&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedArray<byte>(byte[])
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte>(byte,byte&)
 		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,long,long>(byte,byte&,int&,long&,long&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int>(byte,byte&,int&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<int,int>(byte,int&,int&)
 		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,long>(byte,byte&,long&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte>(byte,byte&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,int,long,long,long>(byte,byte&,int&,int&,long&,long&,long&)
 		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,int>(byte,byte&,int&,int&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,long,Unity.Mathematics.float3,Unity.Mathematics.quaternion>(byte,byte&,int&,long&,Unity.Mathematics.float3&,Unity.Mathematics.quaternion&)
 		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,long>(byte,byte&,int&,long&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,long,ET.LSInput>(byte,byte&,int&,long&,ET.LSInput&)
-		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,long,int,int,Unity.Mathematics.float3,Unity.Mathematics.float3>(byte,byte&,long&,int&,int&,Unity.Mathematics.float3&,Unity.Mathematics.float3&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,int,long,long>(byte,byte&,int&,int&,long&,long&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,int,long,long,int>(byte,byte&,int&,int&,long&,long&,int&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,int,long>(byte,byte&,int&,int&,long&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,long,Unity.Mathematics.float3>(byte,byte&,long&,Unity.Mathematics.float3&)
 		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,long,TrueSync.TSVector,TrueSync.TSQuaternion>(byte,byte&,long&,TrueSync.TSVector&,TrueSync.TSQuaternion&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,Unity.Mathematics.float3>(byte,byte&,int&,Unity.Mathematics.float3&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,long,int,int,Unity.Mathematics.float3,Unity.Mathematics.float3>(byte,byte&,long&,int&,int&,Unity.Mathematics.float3&,Unity.Mathematics.float3&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int,long,ET.LSInput>(byte,byte&,int&,long&,ET.LSInput&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,int>(byte,byte&,int&)
+		// System.Void MemoryPack.MemoryPackWriter.WriteUnmanagedWithObjectHeader<byte,uint>(byte,byte&,uint&)
 		// System.Void MemoryPack.MemoryPackWriter.WriteValue<object>(object&)
+		// System.Threading.Tasks.Task<object> MongoDB.Driver.IAsyncCursorExtensions.FirstOrDefaultAsync<object>(MongoDB.Driver.IAsyncCursor<object>,System.Threading.CancellationToken)
+		// System.Threading.Tasks.Task<MongoDB.Driver.IAsyncCursor<object>> MongoDB.Driver.IMongoCollectionExtensions.FindAsync<object>(MongoDB.Driver.IMongoCollection<object>,System.Linq.Expressions.Expression<System.Func<object,bool>>,MongoDB.Driver.FindOptions<object,object>,System.Threading.CancellationToken)
+		// System.Threading.Tasks.Task<MongoDB.Driver.ReplaceOneResult> MongoDB.Driver.IMongoCollectionExtensions.ReplaceOneAsync<object>(MongoDB.Driver.IMongoCollection<object>,System.Linq.Expressions.Expression<System.Func<object,bool>>,object,MongoDB.Driver.ReplaceOptions,System.Threading.CancellationToken)
+		// MongoDB.Driver.IMongoCollection<object> MongoDB.Driver.IMongoDatabase.GetCollection<object>(string,MongoDB.Driver.MongoCollectionSettings)
 		// object ReferenceCollector.Get<object>(string)
 		// object[] System.Array.Empty<object>()
-		// int System.HashCode.Combine<TrueSync.TSVector2,int>(TrueSync.TSVector2,int)
 		// int System.HashCode.Combine<object>(object)
+		// int System.HashCode.Combine<TrueSync.TSVector2,int>(TrueSync.TSVector2,int)
 		// System.Linq.IOrderedEnumerable<System.Collections.Generic.KeyValuePair<object,int>> System.Linq.Enumerable.OrderBy<System.Collections.Generic.KeyValuePair<object,int>,int>(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,int>>,System.Func<System.Collections.Generic.KeyValuePair<object,int>,int>)
 		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Select<System.Collections.Generic.KeyValuePair<object,int>,object>(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,int>>,System.Func<System.Collections.Generic.KeyValuePair<object,int>,object>)
 		// ET.RpcInfo[] System.Linq.Enumerable.ToArray<ET.RpcInfo>(System.Collections.Generic.IEnumerable<ET.RpcInfo>)
 		// object[] System.Linq.Enumerable.ToArray<object>(System.Collections.Generic.IEnumerable<object>)
+		// System.Linq.Expressions.Expression<object> System.Linq.Expressions.Expression.Lambda<object>(System.Linq.Expressions.Expression,System.Linq.Expressions.ParameterExpression[])
 		// object& System.Runtime.CompilerServices.Unsafe.AsRef<object>(object&)
 		// System.Threading.Tasks.Task<object> System.Threading.Tasks.TaskFactory.StartNew<object>(System.Func<object>,System.Threading.CancellationToken)
 		// object UnityEngine.GameObject.GetComponent<object>()
-		// object UnityEngine.Object.Instantiate<object>(object,UnityEngine.Transform)
 		// object UnityEngine.Object.Instantiate<object>(object,UnityEngine.Transform,bool)
+		// object UnityEngine.Object.Instantiate<object>(object,UnityEngine.Transform)
 		// object UnityEngine.Resources.Load<object>(string)
 	}
 }

+ 68 - 1
Unity/Assets/Scripts/Loader/Plugins/HybridCLR/Generated/link.xml

@@ -1,5 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <linker>
+  <assembly fullname="CommandLine">
+    <type fullname="CommandLine.Error" preserve="all" />
+    <type fullname="CommandLine.OptionAttribute" preserve="all" />
+    <type fullname="CommandLine.Parser" preserve="all" />
+    <type fullname="CommandLine.ParserResult`1" preserve="all" />
+    <type fullname="CommandLine.ParserResultExtensions" preserve="all" />
+  </assembly>
   <assembly fullname="MemoryPack">
     <type fullname="MemoryPack.Formatters.ArrayFormatter`1" preserve="all" />
     <type fullname="MemoryPack.Formatters.DictionaryFormatter`2" preserve="all" />
@@ -23,8 +30,29 @@
     <type fullname="MongoDB.Bson.Serialization.Attributes.BsonIgnoreAttribute" preserve="all" />
     <type fullname="MongoDB.Bson.Serialization.Options.DictionaryRepresentation" preserve="all" />
   </assembly>
+  <assembly fullname="MongoDB.Driver">
+    <type fullname="MongoDB.Driver.DeleteResult" preserve="all" />
+    <type fullname="MongoDB.Driver.FilterDefinition`1" preserve="all" />
+    <type fullname="MongoDB.Driver.FindOptions`2" preserve="all" />
+    <type fullname="MongoDB.Driver.IMongoCollection`1" preserve="all" />
+    <type fullname="MongoDB.Driver.IMongoCollectionExtensions" preserve="all" />
+    <type fullname="MongoDB.Driver.IMongoDatabase" preserve="all" />
+    <type fullname="MongoDB.Driver.InsertManyOptions" preserve="all" />
+    <type fullname="MongoDB.Driver.JsonFilterDefinition`1" preserve="all" />
+    <type fullname="MongoDB.Driver.MongoClient" preserve="all" />
+    <type fullname="MongoDB.Driver.MongoClientBase" preserve="all" />
+    <type fullname="MongoDB.Driver.MongoCollectionSettings" preserve="all" />
+    <type fullname="MongoDB.Driver.MongoDatabaseSettings" preserve="all" />
+    <type fullname="MongoDB.Driver.ReplaceOneResult" preserve="all" />
+    <type fullname="MongoDB.Driver.ReplaceOptions" preserve="all" />
+  </assembly>
+  <assembly fullname="MongoDB.Driver.Core">
+    <type fullname="MongoDB.Driver.IAsyncCursor`1" preserve="all" />
+    <type fullname="MongoDB.Driver.IAsyncCursorExtensions" preserve="all" />
+  </assembly>
   <assembly fullname="mscorlib">
     <type fullname="System.Action" preserve="all" />
+    <type fullname="System.Action`1" preserve="all" />
     <type fullname="System.Action`2" preserve="all" />
     <type fullname="System.Action`3" preserve="all" />
     <type fullname="System.Activator" preserve="all" />
@@ -43,6 +71,7 @@
     <type fullname="System.Collections.Generic.KeyValuePair`2" preserve="all" />
     <type fullname="System.Collections.Generic.List`1" preserve="all" />
     <type fullname="System.Collections.Generic.List`1/Enumerator" preserve="all" />
+    <type fullname="System.Collections.IList" preserve="all" />
     <type fullname="System.Console" preserve="all" />
     <type fullname="System.Diagnostics.ConditionalAttribute" preserve="all" />
     <type fullname="System.Diagnostics.DebuggableAttribute" preserve="all" />
@@ -69,8 +98,12 @@
     <type fullname="System.Math" preserve="all" />
     <type fullname="System.NotImplementedException" preserve="all" />
     <type fullname="System.Object" preserve="all" />
+    <type fullname="System.ObjectDisposedException" preserve="all" />
     <type fullname="System.Reflection.DefaultMemberAttribute" preserve="all" />
+    <type fullname="System.Reflection.FieldInfo" preserve="all" />
     <type fullname="System.Reflection.MemberInfo" preserve="all" />
+    <type fullname="System.Reflection.MethodBase" preserve="all" />
+    <type fullname="System.Reflection.MethodInfo" preserve="all" />
     <type fullname="System.Runtime.CompilerServices.AsyncStateMachineAttribute" preserve="all" />
     <type fullname="System.Runtime.CompilerServices.CompilationRelaxationsAttribute" preserve="all" />
     <type fullname="System.Runtime.CompilerServices.CompilerGeneratedAttribute" preserve="all" />
@@ -79,9 +112,13 @@
     <type fullname="System.Runtime.CompilerServices.IsReadOnlyAttribute" preserve="all" />
     <type fullname="System.Runtime.CompilerServices.RuntimeCompatibilityAttribute" preserve="all" />
     <type fullname="System.Runtime.CompilerServices.RuntimeHelpers" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.TaskAwaiter" preserve="all" />
     <type fullname="System.Runtime.CompilerServices.TaskAwaiter`1" preserve="all" />
+    <type fullname="System.Runtime.InteropServices.OSPlatform" preserve="all" />
+    <type fullname="System.Runtime.InteropServices.RuntimeInformation" preserve="all" />
     <type fullname="System.Runtime.Versioning.TargetFrameworkAttribute" preserve="all" />
     <type fullname="System.RuntimeFieldHandle" preserve="all" />
+    <type fullname="System.RuntimeMethodHandle" preserve="all" />
     <type fullname="System.RuntimeTypeHandle" preserve="all" />
     <type fullname="System.Security.Permissions.SecurityAction" preserve="all" />
     <type fullname="System.Security.Permissions.SecurityPermissionAttribute" preserve="all" />
@@ -89,6 +126,7 @@
     <type fullname="System.Single" preserve="all" />
     <type fullname="System.String" preserve="all" />
     <type fullname="System.StringSplitOptions" preserve="all" />
+    <type fullname="System.Text.Encoding" preserve="all" />
     <type fullname="System.Text.StringBuilder" preserve="all" />
     <type fullname="System.Threading.CancellationToken" preserve="all" />
     <type fullname="System.Threading.CancellationTokenSource" preserve="all" />
@@ -106,7 +144,15 @@
     <type fullname="System.Collections.Generic.SortedDictionary`2/Enumerator" preserve="all" />
     <type fullname="System.Collections.Generic.SortedDictionary`2/ValueCollection" preserve="all" />
     <type fullname="System.Collections.Generic.SortedDictionary`2/ValueCollection/Enumerator" preserve="all" />
+    <type fullname="System.ComponentModel.ISupportInitialize" preserve="all" />
+    <type fullname="System.Diagnostics.Process" preserve="all" />
     <type fullname="System.Net.EndPoint" preserve="all" />
+    <type fullname="System.Net.HttpListener" preserve="all" />
+    <type fullname="System.Net.HttpListenerContext" preserve="all" />
+    <type fullname="System.Net.HttpListenerException" preserve="all" />
+    <type fullname="System.Net.HttpListenerPrefixCollection" preserve="all" />
+    <type fullname="System.Net.HttpListenerRequest" preserve="all" />
+    <type fullname="System.Net.HttpListenerResponse" preserve="all" />
     <type fullname="System.Net.IPAddress" preserve="all" />
     <type fullname="System.Net.IPEndPoint" preserve="all" />
     <type fullname="System.Net.Sockets.AddressFamily" preserve="all" />
@@ -114,11 +160,18 @@
     <type fullname="System.Net.Sockets.Socket" preserve="all" />
     <type fullname="System.Net.Sockets.SocketFlags" preserve="all" />
     <type fullname="System.Net.Sockets.SocketType" preserve="all" />
+    <type fullname="System.Uri" preserve="all" />
   </assembly>
   <assembly fullname="System.Core">
     <type fullname="System.Collections.Generic.HashSet`1" preserve="all" />
     <type fullname="System.Collections.Generic.HashSet`1/Enumerator" preserve="all" />
     <type fullname="System.Linq.Enumerable" preserve="all" />
+    <type fullname="System.Linq.Expressions.BinaryExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.ConstantExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.Expression" preserve="all" />
+    <type fullname="System.Linq.Expressions.Expression`1" preserve="all" />
+    <type fullname="System.Linq.Expressions.MemberExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.ParameterExpression" preserve="all" />
     <type fullname="System.Linq.IOrderedEnumerable`1" preserve="all" />
   </assembly>
   <assembly fullname="System.Net.Http">
@@ -132,11 +185,13 @@
   <assembly fullname="Unity.Core">
     <type fullname="ET.AEvent`2" preserve="all" />
     <type fullname="ET.AInvokeHandler`2" preserve="all" />
+    <type fullname="ET.AppType" preserve="all" />
     <type fullname="ET.AService" preserve="all" />
     <type fullname="ET.ATimer`1" preserve="all" />
     <type fullname="ET.AwakeSystem`1" preserve="all" />
     <type fullname="ET.AwakeSystem`2" preserve="all" />
     <type fullname="ET.AwakeSystem`3" preserve="all" />
+    <type fullname="ET.AwakeSystem`4" preserve="all" />
     <type fullname="ET.BaseAttribute" preserve="all" />
     <type fullname="ET.ByteHelper" preserve="all" />
     <type fullname="ET.ChildOfAttribute" preserve="all" />
@@ -150,10 +205,14 @@
     <type fullname="ET.CoroutineLockComponent" preserve="all" />
     <type fullname="ET.DestroySystem`1" preserve="all" />
     <type fullname="ET.DisposeObject" preserve="all" />
+    <type fullname="ET.EnableAccessEntiyChildAttribute" preserve="all" />
+    <type fullname="ET.EnableClassAttribute" preserve="all" />
     <type fullname="ET.EnableMethodAttribute" preserve="all" />
     <type fullname="ET.Entity" preserve="all" />
     <type fullname="ET.EntityRef`1" preserve="all" />
     <type fullname="ET.EntitySceneFactory" preserve="all" />
+    <type fullname="ET.EntitySystemAttribute" preserve="all" />
+    <type fullname="ET.EntitySystemSingleton" preserve="all" />
     <type fullname="ET.EnumHelper" preserve="all" />
     <type fullname="ET.ErrorCore" preserve="all" />
     <type fullname="ET.EventAttribute" preserve="all" />
@@ -170,10 +229,12 @@
     <type fullname="ET.ILateUpdate" preserve="all" />
     <type fullname="ET.ILoad" preserve="all" />
     <type fullname="ET.IMerge" preserve="all" />
+    <type fullname="ET.InstanceIdStruct" preserve="all" />
     <type fullname="ET.InvokeAttribute" preserve="all" />
     <type fullname="ET.IScene" preserve="all" />
     <type fullname="ET.ISerializeToEntity" preserve="all" />
     <type fullname="ET.ISingletonAwake" preserve="all" />
+    <type fullname="ET.ISingletonLoad" preserve="all" />
     <type fullname="ET.ISystemType" preserve="all" />
     <type fullname="ET.ITransfer" preserve="all" />
     <type fullname="ET.IUpdate" preserve="all" />
@@ -185,14 +246,18 @@
     <type fullname="ET.Log" preserve="all" />
     <type fullname="ET.Logger" preserve="all" />
     <type fullname="ET.MemoryBuffer" preserve="all" />
+    <type fullname="ET.MemoryPackHelper" preserve="all" />
     <type fullname="ET.MessageAttribute" preserve="all" />
     <type fullname="ET.MessageObject" preserve="all" />
     <type fullname="ET.MongoHelper" preserve="all" />
+    <type fullname="ET.MultiMap`2" preserve="all" />
     <type fullname="ET.NetServices" preserve="all" />
     <type fullname="ET.NetworkHelper" preserve="all" />
+    <type fullname="ET.NetworkProtocol" preserve="all" />
+    <type fullname="ET.Object" preserve="all" />
     <type fullname="ET.ObjectHelper" preserve="all" />
-    <type fullname="ET.ObjectSystemAttribute" preserve="all" />
     <type fullname="ET.Options" preserve="all" />
+    <type fullname="ET.ProcessHelper" preserve="all" />
     <type fullname="ET.ProtoObject" preserve="all" />
     <type fullname="ET.RandomGenerator" preserve="all" />
     <type fullname="ET.Root" preserve="all" />
@@ -206,9 +271,11 @@
     <type fullname="ET.StaticFieldAttribute" preserve="all" />
     <type fullname="ET.StringHashHelper" preserve="all" />
     <type fullname="ET.StringHelper" preserve="all" />
+    <type fullname="ET.SystemAttribute" preserve="all" />
     <type fullname="ET.TimeHelper" preserve="all" />
     <type fullname="ET.TimeInfo" preserve="all" />
     <type fullname="ET.TimerComponent" preserve="all" />
+    <type fullname="ET.TService" preserve="all" />
     <type fullname="ET.TypeSystems" preserve="all" />
     <type fullname="ET.TypeSystems/OneTypeSystems" preserve="all" />
     <type fullname="ET.UniqueIdAttribute" preserve="all" />

+ 29 - 0
Unity/Assets/Scripts/Model/Generate/Client/Message/LockStepOuter_C_11001.cs

@@ -113,6 +113,33 @@ namespace ET
 
 	}
 
+	[Message(LockStepOuter.C2Room_CheckHash)]
+	[MemoryPackable]
+	public partial class C2Room_CheckHash: MessageObject, IActorRoom
+	{
+		[MemoryPackOrder(0)]
+		public long PlayerId { get; set; }
+
+		[MemoryPackOrder(1)]
+		public int Frame { get; set; }
+
+		[MemoryPackOrder(2)]
+		public long Hash { get; set; }
+
+	}
+
+	[Message(LockStepOuter.Room2C_CheckHashFail)]
+	[MemoryPackable]
+	public partial class Room2C_CheckHashFail: MessageObject, IActorMessage
+	{
+		[MemoryPackOrder(0)]
+		public int Frame { get; set; }
+
+		[MemoryPackOrder(1)]
+		public byte[] LSWorldBytes { get; set; }
+
+	}
+
 	public static class LockStepOuter
 	{
 		 public const ushort C2G_Match = 11002;
@@ -124,5 +151,7 @@ namespace ET
 		 public const ushort FrameMessage = 11008;
 		 public const ushort OneFrameInputs = 11009;
 		 public const ushort Room2C_AdjustUpdateTime = 11010;
+		 public const ushort C2Room_CheckHash = 11011;
+		 public const ushort Room2C_CheckHashFail = 11012;
 	}
 }

+ 29 - 0
Unity/Assets/Scripts/Model/Generate/ClientServer/Message/LockStepOuter_C_11001.cs

@@ -113,6 +113,33 @@ namespace ET
 
 	}
 
+	[Message(LockStepOuter.C2Room_CheckHash)]
+	[MemoryPackable]
+	public partial class C2Room_CheckHash: MessageObject, IActorRoom
+	{
+		[MemoryPackOrder(0)]
+		public long PlayerId { get; set; }
+
+		[MemoryPackOrder(1)]
+		public int Frame { get; set; }
+
+		[MemoryPackOrder(2)]
+		public long Hash { get; set; }
+
+	}
+
+	[Message(LockStepOuter.Room2C_CheckHashFail)]
+	[MemoryPackable]
+	public partial class Room2C_CheckHashFail: MessageObject, IActorMessage
+	{
+		[MemoryPackOrder(0)]
+		public int Frame { get; set; }
+
+		[MemoryPackOrder(1)]
+		public byte[] LSWorldBytes { get; set; }
+
+	}
+
 	public static class LockStepOuter
 	{
 		 public const ushort C2G_Match = 11002;
@@ -124,5 +151,7 @@ namespace ET
 		 public const ushort FrameMessage = 11008;
 		 public const ushort OneFrameInputs = 11009;
 		 public const ushort Room2C_AdjustUpdateTime = 11010;
+		 public const ushort C2Room_CheckHash = 11011;
+		 public const ushort Room2C_CheckHashFail = 11012;
 	}
 }

+ 29 - 0
Unity/Assets/Scripts/Model/Generate/Server/Message/LockStepOuter_C_11001.cs

@@ -113,6 +113,33 @@ namespace ET
 
 	}
 
+	[Message(LockStepOuter.C2Room_CheckHash)]
+	[MemoryPackable]
+	public partial class C2Room_CheckHash: MessageObject, IActorRoom
+	{
+		[MemoryPackOrder(0)]
+		public long PlayerId { get; set; }
+
+		[MemoryPackOrder(1)]
+		public int Frame { get; set; }
+
+		[MemoryPackOrder(2)]
+		public long Hash { get; set; }
+
+	}
+
+	[Message(LockStepOuter.Room2C_CheckHashFail)]
+	[MemoryPackable]
+	public partial class Room2C_CheckHashFail: MessageObject, IActorMessage
+	{
+		[MemoryPackOrder(0)]
+		public int Frame { get; set; }
+
+		[MemoryPackOrder(1)]
+		public byte[] LSWorldBytes { get; set; }
+
+	}
+
 	public static class LockStepOuter
 	{
 		 public const ushort C2G_Match = 11002;
@@ -124,5 +151,7 @@ namespace ET
 		 public const ushort FrameMessage = 11008;
 		 public const ushort OneFrameInputs = 11009;
 		 public const ushort Room2C_AdjustUpdateTime = 11010;
+		 public const ushort C2Room_CheckHash = 11011;
+		 public const ushort Room2C_CheckHashFail = 11012;
 	}
 }

+ 31 - 0
Unity/Assets/Scripts/Model/Share/LockStep/FrameBuffer.cs

@@ -9,15 +9,18 @@ namespace ET
         public int MaxFrame { get; private set; }
         private readonly List<OneFrameInputs> frameInputs;
         private readonly List<MemoryBuffer> snapshots;
+        private readonly List<long> hashs;
 
         public FrameBuffer(int capacity = LSConstValue.FrameCountPerSecond * 10)
         {
             this.MaxFrame = capacity - 1;
             this.frameInputs = new List<OneFrameInputs>(capacity);
             this.snapshots = new List<MemoryBuffer>(capacity);
+            this.hashs = new List<long>(capacity);
             
             for (int i = 0; i < this.snapshots.Capacity; ++i)
             {
+                this.hashs.Add(0);
                 this.frameInputs.Add(new OneFrameInputs());
                 MemoryBuffer memoryBuffer = new(10240);
                 memoryBuffer.SetLength(0);
@@ -25,6 +28,34 @@ namespace ET
                 this.snapshots.Add(memoryBuffer);
             }
         }
+
+        public void SetHash(int frame, long hash)
+        {
+            if (frame < 0)
+            {
+                return;
+            }
+
+            if (frame > this.MaxFrame)
+            {
+                return;
+            }
+            this.hashs[frame % this.frameInputs.Capacity] = hash;
+        }
+        
+        public long GetHash(int frame)
+        {
+            if (frame < 0)
+            {
+                return 0;
+            }
+
+            if (frame > this.MaxFrame)
+            {
+                return 0;
+            }
+            return this.hashs[frame % this.frameInputs.Capacity];
+        }
         
         public OneFrameInputs FrameInputs(int frame)
         {

+ 1 - 1
Unity/Assets/Scripts/Model/Share/LockStep/LSConstValue.cs

@@ -2,7 +2,7 @@ namespace ET
 {
     public static class LSConstValue
     {
-        public const int MatchCount = 1;
+        public const int MatchCount = 2;
         public const int UpdateInterval = 50;
         public const int FrameCountPerSecond = 1000 / UpdateInterval;
         public const int SaveLSWorldFrameCount = 60 * FrameCountPerSecond;

+ 3 - 1
Unity/Assets/Scripts/Model/Share/LockStep/LSInputComponent.cs

@@ -1,8 +1,10 @@
+using MongoDB.Bson.Serialization.Attributes;
+
 namespace ET
 {
     public class LSInputComponent: LSEntity, ILSUpdate, IAwake, ISerializeToEntity
     {
+        [BsonIgnore]
         public LSInput LSInput { get; set; } = new LSInput();
-
     }
 }

+ 1 - 0
Unity/Assets/Scripts/Model/Share/LockStep/LSWorld.cs

@@ -53,6 +53,7 @@ namespace ET
 
         public TSRandom Random { get; set; }
         
+        [BsonIgnore]
         public SceneType SceneType { get; set; }
         
         public int Frame { get; set; }

+ 1 - 0
Unity/Assets/Scripts/Model/Share/Module/Message/OpcodeHelper.cs

@@ -14,6 +14,7 @@ namespace ET
             OuterMessage.G2C_Benchmark,
             LockStepOuter.OneFrameInputs,
             LockStepOuter.FrameMessage,
+            LockStepOuter.C2Room_CheckHash,
             ushort.MaxValue, // ActorResponse
         };
 

+ 1 - 1
Unity/ProjectSettings/ProjectSettings.asset

@@ -841,7 +841,7 @@ PlayerSettings:
   scriptingDefineSymbols:
     Android: UNITY;SINGLE_THREAD
     Server: UNITY
-    Standalone: UNITY;SINGLE_THREAD;ENABLE_VIEW
+    Standalone: UNITY;SINGLE_THREAD;ENABLE_VIEW;ENABLE_CODES
     WebGL: UNITY
     iPhone: UNITY;SINGLE_THREAD;ENABLE_CODES
   additionalCompilerArguments: {}