| 1818 | } |
| 1819 | |
| 1820 | bool NetworkReplicator::EndInvokeRPC(ScriptingObject* obj, const ScriptingTypeHandle& type, const StringAnsiView& name, NetworkStream* argsStream, Span<uint32> targetIds) |
| 1821 | { |
| 1822 | if (targetIds.IsValid() && targetIds.Length() == 0) |
| 1823 | return true; // Target list is provided, but it's empty so nobody will get this RPC |
| 1824 | Scripting::ObjectsLookupIdMapping.Set(nullptr); |
| 1825 | const NetworkRpcInfo* info = NetworkRpcInfo::RPCsTable.TryGet(NetworkRpcName(type, name)); |
| 1826 | if (!info || !obj || NetworkManager::IsOffline()) |
| 1827 | return false; |
| 1828 | PROFILE_MEM(Networking); |
| 1829 | ObjectsLock.Lock(); |
| 1830 | auto& rpc = RpcQueue.AddOne(); |
| 1831 | rpc.Object = obj; |
| 1832 | rpc.Name.First = type; |
| 1833 | rpc.Name.Second = name; |
| 1834 | rpc.Info = *info; |
| 1835 | rpc.ArgsData.Copy(Span<byte>(argsStream->GetBuffer(), argsStream->GetPosition())); |
| 1836 | rpc.Targets.Copy(targetIds); |
| 1837 | ObjectsLock.Unlock(); |
| 1838 | |
| 1839 | // Check if skip local execution (eg. server rpc called from client or client rpc with specific targets) |
| 1840 | const NetworkManagerMode networkMode = NetworkManager::Mode; |
| 1841 | if (info->Server && networkMode == NetworkManagerMode::Client) |
| 1842 | return true; |
| 1843 | if (info->Client && networkMode == NetworkManagerMode::Server) |
| 1844 | return true; |
| 1845 | if (info->Client && networkMode == NetworkManagerMode::Host && targetIds.IsValid() && !SpanContains(targetIds, NetworkManager::LocalClientId)) |
| 1846 | return true; |
| 1847 | return false; |
| 1848 | } |
| 1849 | |
| 1850 | void NetworkInternal::NetworkReplicatorClientConnected(NetworkClient* client) |
| 1851 | { |
nothing calls this directly
no test coverage detected