Skip to content

Commit 15cf2ca

Browse files
committed
fix: Compilation error when using an RpcAttribute with RequireOwnership
1 parent 6eb88aa commit 15cf2ca

File tree

3 files changed

+23
-15
lines changed

3 files changed

+23
-15
lines changed

com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,34 +1654,25 @@ private CustomAttribute CheckAndGetRpcAttribute(MethodDefinition methodDefinitio
16541654
return null;
16551655
}
16561656

1657-
var typeSystem = methodDefinition.Module.TypeSystem;
1658-
var hasInvokePermission = false;
1657+
bool hasInvokePermission = false, hasRequireOwnership = false;
16591658

1660-
CustomAttributeNamedArgument? invokePermissionAttribute = null;
16611659
foreach (var argument in rpcAttribute.Fields)
16621660
{
16631661
switch (argument.Name)
16641662
{
16651663
case k_ServerRpcAttribute_RequireOwnership:
1666-
var requireOwnership = argument.Argument.Type == typeSystem.Boolean && (bool)argument.Argument.Value;
1667-
var invokePermissionArg = new CustomAttributeArgument(m_RpcInvokePermissions_TypeRef, requireOwnership ? RpcInvokePermission.Owner : RpcInvokePermission.Everyone);
1668-
invokePermissionAttribute = new CustomAttributeNamedArgument(k_RpcAttribute_InvokePermission, invokePermissionArg);
1664+
hasRequireOwnership = true;
16691665
break;
16701666
case k_RpcAttribute_InvokePermission:
16711667
hasInvokePermission = true;
16721668
break;
16731669
}
16741670
}
16751671

1676-
if (invokePermissionAttribute != null)
1672+
if (hasInvokePermission && hasRequireOwnership)
16771673
{
1678-
if (hasInvokePermission)
1679-
{
1680-
m_Diagnostics.AddError($"{methodDefinition.Name} cannot declare both RequireOwnership and InvokePermission!");
1681-
return null;
1682-
}
1683-
1684-
rpcAttribute.Fields.Add(invokePermissionAttribute.Value);
1674+
m_Diagnostics.AddError($"{methodDefinition.Name} cannot declare both RequireOwnership and InvokePermission!");
1675+
return null;
16851676
}
16861677

16871678

com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,11 @@ internal FastBufferWriter __beginSendRpc(uint rpcMethodId, RpcParams rpcParams,
335335
throw new RpcException("This RPC can only be sent by the server.");
336336
}
337337

338-
if (attributeParams.InvokePermission == RpcInvokePermission.Owner && !IsOwner)
338+
#pragma warning disable CS0618 // Type or member is obsolete
339+
var requireOwnership = attributeParams.RequireOwnership;
340+
#pragma warning restore CS0618 // Type or member is obsolete
341+
342+
if ((requireOwnership || attributeParams.InvokePermission == RpcInvokePermission.Owner) && !IsOwner)
339343
{
340344
throw new RpcException("This RPC can only be sent by its owner.");
341345
}

com.unity.netcode.gameobjects/Tests/Runtime/Rpc/RpcInvocationTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,13 @@ public IEnumerator RpcInvokePermissionSendingTests()
9898
foreach (var (manager, instance) in m_InvokeInstances)
9999
{
100100
instance.ExpectedCallCounts[nameof(InvokePermissionBehaviour.OwnerInvokePermissionRpc)] = 1;
101+
instance.ExpectedCallCounts[nameof(InvokePermissionBehaviour.OwnerRequireOwnershipRpc)] = 1;
101102

102103
var threwException = false;
103104
try
104105
{
105106
instance.OwnerInvokePermissionRpc();
107+
instance.OwnerRequireOwnershipRpc();
106108
}
107109
catch (RpcException)
108110
{
@@ -167,8 +169,10 @@ public IEnumerator RpcInvokePermissionReceivingTests()
167169
foreach (var (manager, instance) in m_InvokeInstances)
168170
{
169171
instance.ExpectedCallCounts[nameof(InvokePermissionBehaviour.OwnerInvokePermissionRpc)] = 1;
172+
instance.ExpectedCallCounts[nameof(InvokePermissionBehaviour.OwnerRequireOwnershipRpc)] = 1;
170173

171174
SendUncheckedMessage(manager, instance, nameof(InvokePermissionBehaviour.OwnerInvokePermissionRpc));
175+
SendUncheckedMessage(manager, instance, nameof(InvokePermissionBehaviour.OwnerRequireOwnershipRpc));
172176
}
173177

174178
yield return WaitForConditionOrTimeOut(AllExpectedCallsReceived);
@@ -445,6 +449,15 @@ public void ServerInvokePermissionRpc()
445449
TrackRpcCalled(GetCaller());
446450
}
447451

452+
453+
#pragma warning disable CS0618 // Type or member is obsolete
454+
[Rpc(SendTo.Everyone, RequireOwnership = true)]
455+
#pragma warning restore CS0618 // Type or member is obsolete
456+
public void OwnerRequireOwnershipRpc()
457+
{
458+
TrackRpcCalled(GetCaller());
459+
}
460+
448461
[Rpc(SendTo.Everyone, InvokePermission = RpcInvokePermission.Owner)]
449462
public void OwnerInvokePermissionRpc()
450463
{

0 commit comments

Comments
 (0)