Skip to content

Commit

Permalink
fix: invoke client rpc only once in host mode (#744)
Browse files Browse the repository at this point in the history
  • Loading branch information
paulpach committed Mar 27, 2021
1 parent 867b4d5 commit ee6e55e
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 19 deletions.
13 changes: 3 additions & 10 deletions Assets/Mirage/Runtime/ClientObjectManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,14 @@ void OnClientSceneChanged(string scenePath, SceneOperation sceneOperation)

internal void RegisterHostHandlers()
{
Client.Player.RegisterHandler<ObjectDestroyMessage>(OnHostClientObjectDestroy);
Client.Player.RegisterHandler<ObjectDestroyMessage>(msg => { });
Client.Player.RegisterHandler<ObjectHideMessage>(msg => { });
Client.Player.RegisterHandler<SpawnMessage>(OnHostClientSpawn);
Client.Player.RegisterHandler<ServerRpcReply>(OnServerRpcReply);
Client.Player.RegisterHandler<ServerRpcReply>(msg => { });
// host mode reuses objects in the server
// so we don't need to spawn them
Client.Player.RegisterHandler<UpdateVarsMessage>(msg => { });
Client.Player.RegisterHandler<RpcMessage>(OnRpcMessage);
Client.Player.RegisterHandler<RpcMessage>(msg => { });
}

internal void RegisterMessageHandlers()
Expand Down Expand Up @@ -514,13 +514,6 @@ void DestroyObject(uint netId)
}
}

internal void OnHostClientObjectDestroy(ObjectDestroyMessage msg)
{
if (logger.LogEnabled()) logger.Log("ClientScene.OnLocalObjectObjDestroy netId:" + msg.netId);

SpawnedObjects.Remove(msg.netId);
}

internal void OnHostClientSpawn(SpawnMessage msg)
{
if (SpawnedObjects.TryGetValue(msg.netId, out NetworkIdentity localObject) && localObject != null)
Expand Down
24 changes: 24 additions & 0 deletions Assets/Mirage/Weaver/Processors/ClientRpcProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,30 @@ private void CallBody(ILProcessor worker, MethodDefinition rpc)
});
}

protected void InvokeBody(ILProcessor worker, MethodDefinition rpc)
{
worker.Append(worker.Create(OpCodes.Ldarg_0));

for (int i = 0; i < rpc.Parameters.Count; i++)
{
ParameterDefinition parameter = rpc.Parameters[i];
if (parameter.ParameterType.Is<INetworkPlayer>())
{
// when a client rpc is invoked in host mode
// and it receives a INetworkPlayer, we
// need to change the value we pass to the
// local connection to the server
worker.Append(worker.Create(OpCodes.Ldarg_0));
worker.Append(worker.Create(OpCodes.Call, (NetworkBehaviour nb) => nb.Client));
worker.Append(worker.Create(OpCodes.Call, (NetworkClient nc) => nc.Player));
}
else
{
worker.Append(worker.Create(OpCodes.Ldarg, i + 1));
}
}
worker.Append(worker.Create(OpCodes.Call, rpc));
}
bool Validate(MethodDefinition md, CustomAttribute clientRpcAttr)
{
if (!md.ReturnType.Is(typeof(void)))
Expand Down
9 changes: 0 additions & 9 deletions Assets/Mirage/Weaver/Processors/RpcProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -374,14 +374,5 @@ static bool IsCallToMethod(Instruction instruction, out MethodDefinition calledM
}
}

protected void InvokeBody(ILProcessor worker, MethodDefinition rpc)
{
for (int i = 0; i <= rpc.Parameters.Count; i++)
{
worker.Append(worker.Create(OpCodes.Ldarg, i));
}
worker.Append(worker.Create(OpCodes.Call, rpc));
}

}
}
9 changes: 9 additions & 0 deletions Assets/Mirage/Weaver/Processors/ServerRpcProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -291,5 +291,14 @@ public void ProcessServerRpc(MethodDefinition md, CustomAttribute serverRpcAttr)
skeleton = skeletonFunc
});
}

protected void InvokeBody(ILProcessor worker, MethodDefinition rpc)
{
for (int i = 0; i <= rpc.Parameters.Count; i++)
{
worker.Append(worker.Create(OpCodes.Ldarg, i));
}
worker.Append(worker.Create(OpCodes.Call, rpc));
}
}
}

0 comments on commit ee6e55e

Please sign in to comment.