mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 02:50:32 +00:00
* Fix issue #219 pass the invoker class from the weaver when invoking rpcs so that it can produce the same hash they registered
This commit is contained in:
parent
07b73dea26
commit
b5eb487c65
@ -77,7 +77,7 @@ protected void InitSyncObject(SyncObject syncObject)
|
|||||||
// ----------------------------- Commands --------------------------------
|
// ----------------------------- Commands --------------------------------
|
||||||
|
|
||||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||||
protected void SendCommandInternal(string cmdName, NetworkWriter writer, int channelId)
|
protected void SendCommandInternal(Type invokeClass, string cmdName, NetworkWriter writer, int channelId)
|
||||||
{
|
{
|
||||||
// local players can always send commands, regardless of authority, other objects must have authority.
|
// local players can always send commands, regardless of authority, other objects must have authority.
|
||||||
if (!(isLocalPlayer || hasAuthority))
|
if (!(isLocalPlayer || hasAuthority))
|
||||||
@ -96,7 +96,7 @@ protected void SendCommandInternal(string cmdName, NetworkWriter writer, int cha
|
|||||||
CommandMessage message = new CommandMessage();
|
CommandMessage message = new CommandMessage();
|
||||||
message.netId = netId;
|
message.netId = netId;
|
||||||
message.componentIndex = ComponentIndex;
|
message.componentIndex = ComponentIndex;
|
||||||
message.cmdHash = (GetType() + ":" + cmdName).GetStableHashCode(); // type+func so Inventory.RpcUse != Equipment.RpcUse
|
message.cmdHash = (invokeClass + ":" + cmdName).GetStableHashCode(); // type+func so Inventory.RpcUse != Equipment.RpcUse
|
||||||
message.payload = writer.ToArray();
|
message.payload = writer.ToArray();
|
||||||
|
|
||||||
ClientScene.readyConnection.Send((short)MsgType.Command, message, channelId);
|
ClientScene.readyConnection.Send((short)MsgType.Command, message, channelId);
|
||||||
@ -111,7 +111,7 @@ public virtual bool InvokeCommand(int cmdHash, NetworkReader reader)
|
|||||||
// ----------------------------- Client RPCs --------------------------------
|
// ----------------------------- Client RPCs --------------------------------
|
||||||
|
|
||||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||||
protected void SendRPCInternal(string rpcName, NetworkWriter writer, int channelId)
|
protected void SendRPCInternal(Type invokeClass, string rpcName, NetworkWriter writer, int channelId)
|
||||||
{
|
{
|
||||||
// This cannot use NetworkServer.active, as that is not specific to this object.
|
// This cannot use NetworkServer.active, as that is not specific to this object.
|
||||||
if (!isServer)
|
if (!isServer)
|
||||||
@ -124,14 +124,14 @@ protected void SendRPCInternal(string rpcName, NetworkWriter writer, int channel
|
|||||||
RpcMessage message = new RpcMessage();
|
RpcMessage message = new RpcMessage();
|
||||||
message.netId = netId;
|
message.netId = netId;
|
||||||
message.componentIndex = ComponentIndex;
|
message.componentIndex = ComponentIndex;
|
||||||
message.rpcHash = (GetType() + ":" + rpcName).GetStableHashCode(); // type+func so Inventory.RpcUse != Equipment.RpcUse
|
message.rpcHash = (invokeClass + ":" + rpcName).GetStableHashCode(); // type+func so Inventory.RpcUse != Equipment.RpcUse
|
||||||
message.payload = writer.ToArray();
|
message.payload = writer.ToArray();
|
||||||
|
|
||||||
NetworkServer.SendToReady(gameObject, (short)MsgType.Rpc, message, channelId);
|
NetworkServer.SendToReady(gameObject, (short)MsgType.Rpc, message, channelId);
|
||||||
}
|
}
|
||||||
|
|
||||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||||
protected void SendTargetRPCInternal(NetworkConnection conn, string rpcName, NetworkWriter writer, int channelId)
|
protected void SendTargetRPCInternal(NetworkConnection conn, Type invokeClass, string rpcName, NetworkWriter writer, int channelId)
|
||||||
{
|
{
|
||||||
// This cannot use NetworkServer.active, as that is not specific to this object.
|
// This cannot use NetworkServer.active, as that is not specific to this object.
|
||||||
if (!isServer)
|
if (!isServer)
|
||||||
@ -144,7 +144,7 @@ protected void SendTargetRPCInternal(NetworkConnection conn, string rpcName, Net
|
|||||||
RpcMessage message = new RpcMessage();
|
RpcMessage message = new RpcMessage();
|
||||||
message.netId = netId;
|
message.netId = netId;
|
||||||
message.componentIndex = ComponentIndex;
|
message.componentIndex = ComponentIndex;
|
||||||
message.rpcHash = (GetType() + ":" + rpcName).GetStableHashCode(); // type+func so Inventory.RpcUse != Equipment.RpcUse
|
message.rpcHash = (invokeClass + ":" + rpcName).GetStableHashCode(); // type+func so Inventory.RpcUse != Equipment.RpcUse
|
||||||
message.payload = writer.ToArray();
|
message.payload = writer.ToArray();
|
||||||
|
|
||||||
conn.Send((short)MsgType.Rpc, message, channelId);
|
conn.Send((short)MsgType.Rpc, message, channelId);
|
||||||
@ -159,7 +159,7 @@ public virtual bool InvokeRPC(int rpcHash, NetworkReader reader)
|
|||||||
// ----------------------------- Sync Events --------------------------------
|
// ----------------------------- Sync Events --------------------------------
|
||||||
|
|
||||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||||
protected void SendEventInternal(string eventName, NetworkWriter writer, int channelId)
|
protected void SendEventInternal(Type invokeClass, string eventName, NetworkWriter writer, int channelId)
|
||||||
{
|
{
|
||||||
if (!NetworkServer.active)
|
if (!NetworkServer.active)
|
||||||
{
|
{
|
||||||
@ -171,7 +171,7 @@ protected void SendEventInternal(string eventName, NetworkWriter writer, int cha
|
|||||||
SyncEventMessage message = new SyncEventMessage();
|
SyncEventMessage message = new SyncEventMessage();
|
||||||
message.netId = netId;
|
message.netId = netId;
|
||||||
message.componentIndex = ComponentIndex;
|
message.componentIndex = ComponentIndex;
|
||||||
message.eventHash = (GetType() + ":" + eventName).GetStableHashCode(); // type+func so Inventory.RpcUse != Equipment.RpcUse
|
message.eventHash = (invokeClass + ":" + eventName).GetStableHashCode(); // type+func so Inventory.RpcUse != Equipment.RpcUse
|
||||||
message.payload = writer.ToArray();
|
message.payload = writer.ToArray();
|
||||||
|
|
||||||
NetworkServer.SendToReady(gameObject, (short)MsgType.SyncEvent, message, channelId);
|
NetworkServer.SendToReady(gameObject, (short)MsgType.SyncEvent, message, channelId);
|
||||||
|
@ -32,7 +32,7 @@ public void CallCmdThrust(float thrusting, int spin)
|
|||||||
base.SendCommandInternal(cmdName, networkWriter, cmdName);
|
base.SendCommandInternal(cmdName, networkWriter, cmdName);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
public static MethodDefinition ProcessCommandCall(MethodDefinition md, CustomAttribute ca)
|
public static MethodDefinition ProcessCommandCall(TypeDefinition td, MethodDefinition md, CustomAttribute ca)
|
||||||
{
|
{
|
||||||
MethodDefinition cmd = new MethodDefinition("Call" + md.Name, MethodAttributes.Public |
|
MethodDefinition cmd = new MethodDefinition("Call" + md.Name, MethodAttributes.Public |
|
||||||
MethodAttributes.HideBySig,
|
MethodAttributes.HideBySig,
|
||||||
@ -89,6 +89,8 @@ public static MethodDefinition ProcessCommandCall(MethodDefinition md, CustomAtt
|
|||||||
|
|
||||||
// invoke interal send and return
|
// invoke interal send and return
|
||||||
cmdWorker.Append(cmdWorker.Create(OpCodes.Ldarg_0)); // load 'base.' to call the SendCommand function with
|
cmdWorker.Append(cmdWorker.Create(OpCodes.Ldarg_0)); // load 'base.' to call the SendCommand function with
|
||||||
|
cmdWorker.Append(cmdWorker.Create(OpCodes.Ldtoken, td));
|
||||||
|
cmdWorker.Append(cmdWorker.Create(OpCodes.Call, Weaver.getTypeFromHandleReference)); // invokerClass
|
||||||
cmdWorker.Append(cmdWorker.Create(OpCodes.Ldstr, cmdName));
|
cmdWorker.Append(cmdWorker.Create(OpCodes.Ldstr, cmdName));
|
||||||
cmdWorker.Append(cmdWorker.Create(OpCodes.Ldloc_0)); // writer
|
cmdWorker.Append(cmdWorker.Create(OpCodes.Ldloc_0)); // writer
|
||||||
cmdWorker.Append(cmdWorker.Create(OpCodes.Ldc_I4, NetworkBehaviourProcessor.GetChannelId(ca)));
|
cmdWorker.Append(cmdWorker.Create(OpCodes.Ldc_I4, NetworkBehaviourProcessor.GetChannelId(ca)));
|
||||||
|
@ -797,7 +797,7 @@ void ProcessMethods()
|
|||||||
m_CmdInvocationFuncs.Add(cmdFunc);
|
m_CmdInvocationFuncs.Add(cmdFunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
MethodDefinition cmdCallFunc = CommandProcessor.ProcessCommandCall(md, ca);
|
MethodDefinition cmdCallFunc = CommandProcessor.ProcessCommandCall(m_td, md, ca);
|
||||||
if (cmdCallFunc != null)
|
if (cmdCallFunc != null)
|
||||||
{
|
{
|
||||||
m_CmdCallFuncs.Add(cmdCallFunc);
|
m_CmdCallFuncs.Add(cmdCallFunc);
|
||||||
@ -827,7 +827,7 @@ void ProcessMethods()
|
|||||||
m_TargetRpcInvocationFuncs.Add(rpcFunc);
|
m_TargetRpcInvocationFuncs.Add(rpcFunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
MethodDefinition rpcCallFunc = TargetRpcProcessor.ProcessTargetRpcCall(md, ca);
|
MethodDefinition rpcCallFunc = TargetRpcProcessor.ProcessTargetRpcCall(m_td, md, ca);
|
||||||
if (rpcCallFunc != null)
|
if (rpcCallFunc != null)
|
||||||
{
|
{
|
||||||
m_TargetRpcCallFuncs.Add(rpcCallFunc);
|
m_TargetRpcCallFuncs.Add(rpcCallFunc);
|
||||||
@ -857,7 +857,7 @@ void ProcessMethods()
|
|||||||
m_RpcInvocationFuncs.Add(rpcFunc);
|
m_RpcInvocationFuncs.Add(rpcFunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
MethodDefinition rpcCallFunc = RpcProcessor.ProcessRpcCall(md, ca);
|
MethodDefinition rpcCallFunc = RpcProcessor.ProcessRpcCall(m_td, md, ca);
|
||||||
if (rpcCallFunc != null)
|
if (rpcCallFunc != null)
|
||||||
{
|
{
|
||||||
m_RpcCallFuncs.Add(rpcCallFunc);
|
m_RpcCallFuncs.Add(rpcCallFunc);
|
||||||
|
@ -43,11 +43,11 @@ public void CallRpcTest (int param)
|
|||||||
} else {
|
} else {
|
||||||
NetworkWriter writer = new NetworkWriter ();
|
NetworkWriter writer = new NetworkWriter ();
|
||||||
writer.WritePackedUInt32((uint)param);
|
writer.WritePackedUInt32((uint)param);
|
||||||
base.SendRPCInternal("RpcTest", writer, 0);
|
base.SendRPCInternal(typeof(class),"RpcTest", writer, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
public static MethodDefinition ProcessRpcCall(MethodDefinition md, CustomAttribute ca)
|
public static MethodDefinition ProcessRpcCall(TypeDefinition td, MethodDefinition md, CustomAttribute ca)
|
||||||
{
|
{
|
||||||
MethodDefinition rpc = new MethodDefinition("Call" + md.Name, MethodAttributes.Public |
|
MethodDefinition rpc = new MethodDefinition("Call" + md.Name, MethodAttributes.Public |
|
||||||
MethodAttributes.HideBySig,
|
MethodAttributes.HideBySig,
|
||||||
@ -81,6 +81,8 @@ public static MethodDefinition ProcessRpcCall(MethodDefinition md, CustomAttribu
|
|||||||
|
|
||||||
// invoke SendInternal and return
|
// invoke SendInternal and return
|
||||||
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldarg_0)); // this
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldarg_0)); // this
|
||||||
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldtoken, td));
|
||||||
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Call, Weaver.getTypeFromHandleReference)); // invokerClass
|
||||||
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldstr, rpcName));
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldstr, rpcName));
|
||||||
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldloc_0)); // writer
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldloc_0)); // writer
|
||||||
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldc_I4, NetworkBehaviourProcessor.GetChannelId(ca)));
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldc_I4, NetworkBehaviourProcessor.GetChannelId(ca)));
|
||||||
|
@ -64,7 +64,7 @@ public static MethodDefinition ProcessEventInvoke(TypeDefinition td, EventDefini
|
|||||||
return cmd;
|
return cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MethodDefinition ProcessEventCall(EventDefinition ed, CustomAttribute ca)
|
public static MethodDefinition ProcessEventCall(TypeDefinition td, EventDefinition ed, CustomAttribute ca)
|
||||||
{
|
{
|
||||||
MethodReference invoke = Weaver.ResolveMethod(ed.EventType, "Invoke");
|
MethodReference invoke = Weaver.ResolveMethod(ed.EventType, "Invoke");
|
||||||
MethodDefinition evt = new MethodDefinition("Call" + ed.Name, MethodAttributes.Public |
|
MethodDefinition evt = new MethodDefinition("Call" + ed.Name, MethodAttributes.Public |
|
||||||
@ -91,6 +91,8 @@ public static MethodDefinition ProcessEventCall(EventDefinition ed, CustomAttrib
|
|||||||
|
|
||||||
// invoke interal send and return
|
// invoke interal send and return
|
||||||
evtWorker.Append(evtWorker.Create(OpCodes.Ldarg_0)); // this
|
evtWorker.Append(evtWorker.Create(OpCodes.Ldarg_0)); // this
|
||||||
|
evtWorker.Append(evtWorker.Create(OpCodes.Ldtoken, td));
|
||||||
|
evtWorker.Append(evtWorker.Create(OpCodes.Call, Weaver.getTypeFromHandleReference)); // invokerClass
|
||||||
evtWorker.Append(evtWorker.Create(OpCodes.Ldstr, ed.Name));
|
evtWorker.Append(evtWorker.Create(OpCodes.Ldstr, ed.Name));
|
||||||
evtWorker.Append(evtWorker.Create(OpCodes.Ldloc_0)); // writer
|
evtWorker.Append(evtWorker.Create(OpCodes.Ldloc_0)); // writer
|
||||||
evtWorker.Append(evtWorker.Create(OpCodes.Ldc_I4, NetworkBehaviourProcessor.GetChannelId(ca)));
|
evtWorker.Append(evtWorker.Create(OpCodes.Ldc_I4, NetworkBehaviourProcessor.GetChannelId(ca)));
|
||||||
@ -136,7 +138,7 @@ public static void ProcessEvents(TypeDefinition td, List<EventDefinition> events
|
|||||||
|
|
||||||
Weaver.DLog(td, "ProcessEvent " + ed);
|
Weaver.DLog(td, "ProcessEvent " + ed);
|
||||||
|
|
||||||
MethodDefinition eventCallFunc = SyncEventProcessor.ProcessEventCall(ed, ca);
|
MethodDefinition eventCallFunc = SyncEventProcessor.ProcessEventCall(td, ed, ca);
|
||||||
td.Methods.Add(eventCallFunc);
|
td.Methods.Add(eventCallFunc);
|
||||||
|
|
||||||
Weaver.lists.replacedEvents.Add(ed);
|
Weaver.lists.replacedEvents.Add(ed);
|
||||||
|
@ -49,11 +49,11 @@ public void CallTargetTest (NetworkConnection conn, int param)
|
|||||||
} else {
|
} else {
|
||||||
NetworkWriter writer = new NetworkWriter ();
|
NetworkWriter writer = new NetworkWriter ();
|
||||||
writer.WritePackedUInt32 ((uint)param);
|
writer.WritePackedUInt32 ((uint)param);
|
||||||
base.SendTargetRPCInternal (conn, "TargetTest", val);
|
base.SendTargetRPCInternal (conn, typeof(class), "TargetTest", val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
public static MethodDefinition ProcessTargetRpcCall(MethodDefinition md, CustomAttribute ca)
|
public static MethodDefinition ProcessTargetRpcCall(TypeDefinition td, MethodDefinition md, CustomAttribute ca)
|
||||||
{
|
{
|
||||||
MethodDefinition rpc = new MethodDefinition("Call" + md.Name, MethodAttributes.Public |
|
MethodDefinition rpc = new MethodDefinition("Call" + md.Name, MethodAttributes.Public |
|
||||||
MethodAttributes.HideBySig,
|
MethodAttributes.HideBySig,
|
||||||
@ -100,6 +100,8 @@ public static MethodDefinition ProcessTargetRpcCall(MethodDefinition md, CustomA
|
|||||||
// invoke SendInternal and return
|
// invoke SendInternal and return
|
||||||
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldarg_0)); // this
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldarg_0)); // this
|
||||||
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldarg_1)); // connection
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldarg_1)); // connection
|
||||||
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldtoken, td));
|
||||||
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Call, Weaver.getTypeFromHandleReference)); // invokerClass
|
||||||
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldstr, rpcName));
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldstr, rpcName));
|
||||||
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldloc_0)); // writer
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldloc_0)); // writer
|
||||||
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldc_I4, NetworkBehaviourProcessor.GetChannelId(ca)));
|
rpcWorker.Append(rpcWorker.Create(OpCodes.Ldc_I4, NetworkBehaviourProcessor.GetChannelId(ca)));
|
||||||
|
Loading…
Reference in New Issue
Block a user