Skip to content

Commit caf94d2

Browse files
author
FirstGearGames
committed
4.6.16R Pre-release 1
- Fixed SyncType values not resetting on client when using pooled objects. - Fixed despawned nested NetworkObjects serializing incorrectly (#950). - Fixed pooled objects sometimes having the incorrect position upon spawning after the first time. (#949). - Improved renamed several files related to code generation to prevent conflicts with NGO. - Fixed rollback time calculation for client-only when user-logic incorrectly identified as host. - Fixed StatisticsManager and BandwidthDisplay reporting incorrectly.
1 parent ae81b59 commit caf94d2

File tree

80 files changed

+1441
-464
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+1441
-464
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
using MonoFN.Cecil;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using System.Linq;
6+
using System.Threading;
7+
using Unity.CompilationPipeline.Common.ILPostProcessing;
8+
9+
namespace FishNet.CodeGenerating
10+
{
11+
internal class FNPostProcessorAssemblyResolver : IAssemblyResolver
12+
{
13+
private readonly string[] m_AssemblyReferences;
14+
private readonly Dictionary<string, AssemblyDefinition> m_AssemblyCache = new();
15+
private readonly ICompiledAssembly m_CompiledAssembly;
16+
private AssemblyDefinition m_SelfAssembly;
17+
18+
public FNPostProcessorAssemblyResolver(ICompiledAssembly compiledAssembly)
19+
{
20+
m_CompiledAssembly = compiledAssembly;
21+
m_AssemblyReferences = compiledAssembly.References;
22+
}
23+
24+
public void Dispose() { }
25+
public AssemblyDefinition Resolve(AssemblyNameReference name) => Resolve(name, new(ReadingMode.Deferred));
26+
27+
public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters)
28+
{
29+
lock (m_AssemblyCache)
30+
{
31+
if (name.Name == m_CompiledAssembly.Name)
32+
{
33+
return m_SelfAssembly;
34+
}
35+
36+
var fileName = FindFile(name);
37+
if (fileName == null)
38+
{
39+
return null;
40+
}
41+
42+
var lastWriteTime = File.GetLastWriteTime(fileName);
43+
var cacheKey = $"{fileName}{lastWriteTime}";
44+
if (m_AssemblyCache.TryGetValue(cacheKey, out var result))
45+
{
46+
return result;
47+
}
48+
49+
parameters.AssemblyResolver = this;
50+
51+
var ms = MemoryStreamFor(fileName);
52+
var pdb = $"{fileName}.pdb";
53+
if (File.Exists(pdb))
54+
{
55+
parameters.SymbolStream = MemoryStreamFor(pdb);
56+
}
57+
58+
var assemblyDefinition = AssemblyDefinition.ReadAssembly(ms, parameters);
59+
m_AssemblyCache.Add(cacheKey, assemblyDefinition);
60+
61+
return assemblyDefinition;
62+
}
63+
}
64+
65+
private string FindFile(AssemblyNameReference name)
66+
{
67+
var fileName = m_AssemblyReferences.FirstOrDefault(r => Path.GetFileName(r) == $"{name.Name}.dll");
68+
if (fileName != null)
69+
{
70+
return fileName;
71+
}
72+
73+
// perhaps the type comes from an exe instead
74+
fileName = m_AssemblyReferences.FirstOrDefault(r => Path.GetFileName(r) == $"{name.Name}.exe");
75+
if (fileName != null)
76+
{
77+
return fileName;
78+
}
79+
80+
// Unfortunately the current ICompiledAssembly API only provides direct references.
81+
// It is very much possible that a postprocessor ends up investigating a type in a directly
82+
//referenced assembly, that contains a field that is not in a directly referenced assembly.
83+
//if we don't do anything special for that situation, it will fail to resolve. We should fix this
84+
//in the ILPostProcessing API. As a workaround, we rely on the fact here that the indirect references
85+
//are always located next to direct references, so we search in all directories of direct references we
86+
//got passed, and if we find the file in there, we resolve to it.
87+
return m_AssemblyReferences.Select(Path.GetDirectoryName).Distinct().Select(parentDir => Path.Combine(parentDir, $"{name.Name}.dll")).FirstOrDefault(File.Exists);
88+
}
89+
90+
private static MemoryStream MemoryStreamFor(string fileName)
91+
{
92+
return Retry(10, TimeSpan.FromSeconds(1), () =>
93+
{
94+
byte[] byteArray;
95+
using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
96+
{
97+
byteArray = new byte[fs.Length];
98+
var readLength = fs.Read(byteArray, 0, (int)fs.Length);
99+
if (readLength != fs.Length)
100+
{
101+
throw new InvalidOperationException("File read length is not full length of file.");
102+
}
103+
}
104+
105+
return new(byteArray);
106+
});
107+
}
108+
109+
private static MemoryStream Retry(int retryCount, TimeSpan waitTime, Func<MemoryStream> func)
110+
{
111+
try
112+
{
113+
return func();
114+
}
115+
catch (IOException)
116+
{
117+
if (retryCount == 0)
118+
{
119+
throw;
120+
}
121+
122+
Console.WriteLine($"Caught IO Exception, trying {retryCount} more times");
123+
Thread.Sleep(waitTime);
124+
125+
return Retry(retryCount - 1, waitTime, func);
126+
}
127+
}
128+
129+
public void AddAssemblyDefinitionBeingOperatedOn(AssemblyDefinition assemblyDefinition)
130+
{
131+
m_SelfAssembly = assemblyDefinition;
132+
}
133+
}
134+
}

Assets/FishNet/CodeGenerating/ILCore/FNPostProcessorAssemblyResolver.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using MonoFN.Cecil;
2+
using System.Linq;
3+
using System.Reflection;
4+
5+
namespace FishNet.CodeGenerating.ILCore
6+
{
7+
internal class FNPostProcessorReflectionImporter : DefaultReflectionImporter
8+
{
9+
private const string k_SystemPrivateCoreLib = "System.Private.CoreLib";
10+
private readonly AssemblyNameReference m_CorrectCorlib;
11+
12+
public FNPostProcessorReflectionImporter(ModuleDefinition module) : base(module)
13+
{
14+
m_CorrectCorlib = module.AssemblyReferences.FirstOrDefault(a => a.Name == "mscorlib" || a.Name == "netstandard" || a.Name == k_SystemPrivateCoreLib);
15+
}
16+
17+
public override AssemblyNameReference ImportReference(AssemblyName reference)
18+
{
19+
return m_CorrectCorlib != null && reference.Name == k_SystemPrivateCoreLib ? m_CorrectCorlib : base.ImportReference(reference);
20+
}
21+
}
22+
}

Assets/FishNet/CodeGenerating/ILCore/FNPostProcessorReflectionImporter.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using MonoFN.Cecil;
2+
3+
namespace FishNet.CodeGenerating.ILCore
4+
{
5+
internal class FNPostProcessorReflectionImporterProvider : IReflectionImporterProvider
6+
{
7+
public IReflectionImporter GetReflectionImporter(ModuleDefinition moduleDef)
8+
{
9+
return new FNPostProcessorReflectionImporter(moduleDef);
10+
}
11+
}
12+
}

Assets/FishNet/CodeGenerating/ILCore/FNPostProcessorReflectionImporterProvider.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/FishNet/CodeGenerating/ILCore/ILCoreHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ internal static class ILCoreHelper
1414
/// <returns></returns>
1515
internal static AssemblyDefinition GetAssemblyDefinition(ICompiledAssembly compiledAssembly)
1616
{
17-
PostProcessorAssemblyResolver assemblyResolver = new(compiledAssembly);
17+
FNPostProcessorAssemblyResolver assemblyResolver = new(compiledAssembly);
1818
ReaderParameters readerParameters = new()
1919
{
2020
SymbolStream = new MemoryStream(compiledAssembly.InMemoryAssembly.PdbData),
2121
SymbolReaderProvider = new PortablePdbReaderProvider(),
2222
AssemblyResolver = assemblyResolver,
23-
ReflectionImporterProvider = new PostProcessorReflectionImporterProvider(),
23+
ReflectionImporterProvider = new FNPostProcessorReflectionImporterProvider(),
2424
ReadingMode = ReadingMode.Immediate
2525
};
2626

Assets/FishNet/Demos/Benchmarks/NetworkTransform/Prefabs/NetworkTransform Benchmark 2D.prefab

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ MonoBehaviour:
151151
_initializeOrder: 0
152152
_preventDespawnOnDisconnect: 0
153153
_defaultDespawnType: 0
154+
_initializedTimestamp: -8584407652857706740
154155
NetworkObserver: {fileID: 0}
155156
_enablePrediction: 0
156157
_predictionType: 0
@@ -165,7 +166,7 @@ MonoBehaviour:
165166
_spectatorInterpolation: 2
166167
_enableTeleport: 0
167168
_teleportThreshold: 1
168-
<PrefabId>k__BackingField: 12
169+
<PrefabId>k__BackingField: 1
169170
<SpawnableCollectionId>k__BackingField: 0
170171
<AssetPathHash>k__BackingField: 4778360394554103146
171172
<SceneId>k__BackingField: 0
@@ -224,6 +225,7 @@ MonoBehaviour:
224225
Position: 1
225226
Rotation: 1
226227
Scale: 0
228+
_useScaledTime: 1
227229
_interpolation: 3
228230
_extrapolation: 2
229231
_enableTeleport: 0

Assets/FishNet/Demos/Benchmarks/NetworkTransform/Prefabs/NetworkTransform Benchmark 3D Normal.prefab

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ MonoBehaviour:
6666
_initializeOrder: 0
6767
_preventDespawnOnDisconnect: 0
6868
_defaultDespawnType: 0
69+
_initializedTimestamp: -8584407652857706740
6970
NetworkObserver: {fileID: 0}
7071
_enablePrediction: 0
7172
_predictionType: 0
@@ -80,7 +81,7 @@ MonoBehaviour:
8081
_spectatorInterpolation: 2
8182
_enableTeleport: 0
8283
_teleportThreshold: 1
83-
<PrefabId>k__BackingField: 31
84+
<PrefabId>k__BackingField: 0
8485
<SpawnableCollectionId>k__BackingField: 0
8586
<AssetPathHash>k__BackingField: 2903053101402871766
8687
<SceneId>k__BackingField: 0
@@ -110,7 +111,7 @@ MonoBehaviour:
110111
_axes: 3
111112
_chancePerAxes: 0.8
112113
_rotationChance: 0.33
113-
_delayBetweenMovements: 1.5
114+
_delayBetweenMovements: 0
114115
_yOffsetPerInstance: 0
115116
_randomMovement: 1
116117
_goalDatas: []
@@ -139,6 +140,7 @@ MonoBehaviour:
139140
Position: 1
140141
Rotation: 1
141142
Scale: 0
143+
_useScaledTime: 1
142144
_interpolation: 3
143145
_extrapolation: 2
144146
_enableTeleport: 0

Assets/FishNet/Demos/Benchmarks/NetworkTransform/Prefabs/NetworkTransform Benchmark 3D Rigidbodies.prefab

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ MonoBehaviour:
236236
_initializeOrder: 0
237237
_preventDespawnOnDisconnect: 0
238238
_defaultDespawnType: 0
239+
_initializedTimestamp: -8584407652857706740
239240
NetworkObserver: {fileID: 0}
240241
_enablePrediction: 0
241242
_predictionType: 0
@@ -250,7 +251,7 @@ MonoBehaviour:
250251
_spectatorInterpolation: 2
251252
_enableTeleport: 0
252253
_teleportThreshold: 1
253-
<PrefabId>k__BackingField: 17
254+
<PrefabId>k__BackingField: 4
254255
<SpawnableCollectionId>k__BackingField: 0
255256
<AssetPathHash>k__BackingField: 8265366384202762268
256257
<SceneId>k__BackingField: 0
@@ -301,6 +302,7 @@ MonoBehaviour:
301302
Position: 1
302303
Rotation: 1
303304
Scale: 0
305+
_useScaledTime: 1
304306
_interpolation: 2
305307
_extrapolation: 2
306308
_enableTeleport: 0

0 commit comments

Comments
 (0)