Skip to content

Commit

Permalink
fix: Fixing SyncVars not serializing when OnSerialize is overridden (…
Browse files Browse the repository at this point in the history
…#1671)

* Adding SyncVar methods

this will allow SyncVars to still work if user overrides
OnSerialize as long as they call base.OnSerialize

* Adding tests for NetworkBehaviour OnSerialize

These tests make sure that weaver correctly create code for syncvar

* Update Assets/Mirror/Runtime/NetworkBehaviour.cs

* Update Assets/Mirror/Runtime/NetworkBehaviour.cs

* Update Assets/Mirror/Runtime/NetworkBehaviour.cs

* Update Assets/Mirror/Runtime/NetworkBehaviour.cs

* Update Assets/Mirror/Runtime/NetworkBehaviour.cs

* Update Assets/Mirror/Runtime/NetworkBehaviour.cs

* Update Assets/Mirror/Runtime/NetworkBehaviour.cs

* Update Assets/Mirror/Runtime/NetworkBehaviour.cs

* Update Assets/Mirror/Runtime/NetworkBehaviour.cs

* adding extra test

Co-authored-by: Paul Pacheco <paulpach@gmail.com>
Co-authored-by: vis2k <info@noobtuts.com>
  • Loading branch information
3 people committed Apr 14, 2020
1 parent 0e1aa1b commit c66c5a6
Show file tree
Hide file tree
Showing 4 changed files with 391 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,8 @@ void GenerateSerialization()
{
Weaver.DLog(netBehaviourSubclass, " GenerateSerialization");

if (netBehaviourSubclass.GetMethod("OnSerialize") != null)
const string SerializeMethodName = "SerializeSyncVars";
if (netBehaviourSubclass.GetMethod(SerializeMethodName) != null)
return;

if (syncVars.Count == 0)
Expand All @@ -290,7 +291,7 @@ void GenerateSerialization()
return;
}

MethodDefinition serialize = new MethodDefinition("OnSerialize",
MethodDefinition serialize = new MethodDefinition(SerializeMethodName,
MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig,
Weaver.boolType);

Expand All @@ -304,7 +305,7 @@ void GenerateSerialization()
VariableDefinition dirtyLocal = new VariableDefinition(Weaver.boolType);
serialize.Body.Variables.Add(dirtyLocal);

MethodReference baseSerialize = Resolvers.ResolveMethodInParents(netBehaviourSubclass.BaseType, Weaver.CurrentAssembly, "OnSerialize");
MethodReference baseSerialize = Resolvers.ResolveMethodInParents(netBehaviourSubclass.BaseType, Weaver.CurrentAssembly, SerializeMethodName);
if (baseSerialize != null)
{
// base
Expand Down Expand Up @@ -619,7 +620,8 @@ void GenerateDeSerialization()
{
Weaver.DLog(netBehaviourSubclass, " GenerateDeSerialization");

if (netBehaviourSubclass.GetMethod("OnDeserialize") != null)
const string DeserializeMethodName = "DeserializeSyncVars";
if (netBehaviourSubclass.GetMethod(DeserializeMethodName) != null)
return;

if (syncVars.Count == 0)
Expand All @@ -628,7 +630,7 @@ void GenerateDeSerialization()
return;
}

MethodDefinition serialize = new MethodDefinition("OnDeserialize",
MethodDefinition serialize = new MethodDefinition(DeserializeMethodName,
MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig,
Weaver.voidType);

Expand All @@ -640,7 +642,7 @@ void GenerateDeSerialization()
VariableDefinition dirtyBitsLocal = new VariableDefinition(Weaver.int64Type);
serialize.Body.Variables.Add(dirtyBitsLocal);

MethodReference baseDeserialize = Resolvers.ResolveMethodInParents(netBehaviourSubclass.BaseType, Weaver.CurrentAssembly, "OnDeserialize");
MethodReference baseDeserialize = Resolvers.ResolveMethodInParents(netBehaviourSubclass.BaseType, Weaver.CurrentAssembly, DeserializeMethodName);
if (baseDeserialize != null)
{
// base
Expand Down
36 changes: 28 additions & 8 deletions Assets/Mirror/Runtime/NetworkBehaviour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -685,24 +685,24 @@ internal bool IsDirty()
/// <returns>True if data was written.</returns>
public virtual bool OnSerialize(NetworkWriter writer, bool initialState)
{
bool objectWritten = false;
// if initialState: write all SyncVars.
// otherwise write dirtyBits+dirty SyncVars
if (initialState)
{
return SerializeObjectsAll(writer);
objectWritten = SerializeObjectsAll(writer);
}
else
{
return SerializeObjectsDelta(writer);
objectWritten = SerializeObjectsDelta(writer);
}

// SyncVar are writen here in subclass
bool syncVarWritten = SerializeSyncVars(writer, initialState);

// if initialState
// write all SyncVars
// else
// write syncVarDirtyBits
// write dirty SyncVars
return objectWritten || syncVarWritten;
}


/// <summary>
/// Virtual function to override to receive custom serialization data. The corresponding function to send serialization data is OnSerialize().
/// </summary>
Expand All @@ -719,6 +719,26 @@ public virtual void OnDeserialize(NetworkReader reader, bool initialState)
DeSerializeObjectsDelta(reader);
}

DeserializeSyncVars(reader, initialState);
}

// Don't rename. Weaver uses this exact function name.
public virtual bool SerializeSyncVars(NetworkWriter writer, bool initialState)
{
return false;

// SyncVar are writen here in subclass

// if initialState
// write all SyncVars
// else
// write syncVarDirtyBits
// write dirty SyncVars
}

// Don't rename. Weaver uses this exact function name.
public virtual void DeserializeSyncVars(NetworkReader reader, bool initialState)
{
// SyncVars are read here in subclass

// if initialState
Expand Down

0 comments on commit c66c5a6

Please sign in to comment.