feature: remote call overloads are now allowed for [TargetRpc] too. they are possible now due to 0cdeccbe71 using .FullName instead of .Name

This commit is contained in:
vis2k 2022-01-19 18:41:35 +08:00
parent b6f4c641de
commit 30a7e1d576
4 changed files with 32 additions and 10 deletions

View File

@ -1161,12 +1161,6 @@ void ProcessTargetRpc(HashSet<string> names, MethodDefinition md, CustomAttribut
if (!ValidateRemoteCallAndParameters(md, RemoteCallType.TargetRpc, ref WeavingFailed)) if (!ValidateRemoteCallAndParameters(md, RemoteCallType.TargetRpc, ref WeavingFailed))
return; return;
if (names.Contains(md.Name))
{
Log.Error($"Duplicate Target Rpc name {md.Name}", md);
WeavingFailed = true;
return;
}
names.Add(md.Name); names.Add(md.Name);
targetRpcs.Add(md); targetRpcs.Add(md);

View File

@ -22,6 +22,18 @@ public void SendIntWithTarget(NetworkConnection target, int someInt)
} }
} }
class TargetRpcOverloads : NetworkBehaviour
{
public int firstCalled = 0;
public int secondCalled = 0;
[TargetRpc]
public void TargetRpcTest(int _) => ++firstCalled;
[TargetRpc]
public void TargetRpcTest(string _) => ++secondCalled;
}
public class TargetRpcTest : RemoteTestBase public class TargetRpcTest : RemoteTestBase
{ {
[Test] [Test]
@ -149,5 +161,21 @@ public void ErrorForTargetRpcWhenObjectNotSpawned()
LogAssert.Expect(LogType.Warning, $"TargetRpc System.Void Mirror.Tests.RemoteAttrributeTest.TargetRpcBehaviour::SendInt(System.Int32) called on {hostBehaviour.name} but that object has not been spawned or has been unspawned"); LogAssert.Expect(LogType.Warning, $"TargetRpc System.Void Mirror.Tests.RemoteAttrributeTest.TargetRpcBehaviour::SendInt(System.Int32) called on {hostBehaviour.name} but that object has not been spawned or has been unspawned");
hostBehaviour.SendInt(someInt); hostBehaviour.SendInt(someInt);
} }
// RemoteCalls uses md.FullName which gives us the full command/rpc name
// like "System.Void Mirror.Tests.RemoteAttrributeTest.AuthorityBehaviour::SendInt(System.Int32)"
// which means overloads with same name but different types should work.
[Test]
public void TargetRpcOverload()
{
// spawn with owner
CreateNetworkedAndSpawn(out GameObject _, out NetworkIdentity _, out TargetRpcOverloads hostBehaviour, NetworkServer.localConnection);
hostBehaviour.TargetRpcTest(42);
hostBehaviour.TargetRpcTest("A");
ProcessMessages();
Assert.That(hostBehaviour.firstCalled, Is.EqualTo(1));
Assert.That(hostBehaviour.secondCalled, Is.EqualTo(1));
}
} }
} }

View File

@ -124,8 +124,7 @@ public void NetworkBehaviourTargetRpcParamNetworkConnection()
[Test] [Test]
public void NetworkBehaviourTargetRpcDuplicateName() public void NetworkBehaviourTargetRpcDuplicateName()
{ {
HasError("Duplicate Target Rpc name TargetRpcCantHaveSameName", IsSuccess();
"System.Void WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcDuplicateName.NetworkBehaviourTargetRpcDuplicateName::TargetRpcCantHaveSameName(Mirror.NetworkConnection,System.Int32,System.Int32)");
} }
[Test] [Test]

View File

@ -4,10 +4,11 @@ namespace WeaverNetworkBehaviourTests.NetworkBehaviourTargetRpcDuplicateName
{ {
class NetworkBehaviourTargetRpcDuplicateName : NetworkBehaviour class NetworkBehaviourTargetRpcDuplicateName : NetworkBehaviour
{ {
// remote call overloads are now supported
[TargetRpc] [TargetRpc]
public void TargetRpcCantHaveSameName(NetworkConnection monkeyCon, int abc) { } public void TargetRpcWithSameName(NetworkConnection monkeyCon, int abc) { }
[TargetRpc] [TargetRpc]
public void TargetRpcCantHaveSameName(NetworkConnection monkeyCon, int abc, int def) { } public void TargetRpcWithSameName(NetworkConnection monkeyCon, int abc, int def) { }
} }
} }