summaryrefslogtreecommitdiffstats
path: root/modules/multiplayer/scene_rpc_interface.cpp
diff options
context:
space:
mode:
authorFabio Alessandrelli <fabio.alessandrelli@gmail.com>2023-09-27 01:12:58 +0200
committerFabio Alessandrelli <fabio.alessandrelli@gmail.com>2023-10-10 14:42:54 +0200
commit9ce423914ec4a392e42dbf894dc7929befcc7e1d (patch)
tree6efcc40b5d6b9f8a922c8b2f0db554b387bc9103 /modules/multiplayer/scene_rpc_interface.cpp
parent61cf7d180cc6ac1be1f9cb1c7369b2cae5d99b25 (diff)
downloadredot-engine-9ce423914ec4a392e42dbf894dc7929befcc7e1d.tar.gz
[MP] Optimize internal authority checks
We already know which MultiplayerAPI a certain Node uses, so we don't need to retrieve it via SceneTree every time.
Diffstat (limited to 'modules/multiplayer/scene_rpc_interface.cpp')
-rw-r--r--modules/multiplayer/scene_rpc_interface.cpp30
1 files changed, 13 insertions, 17 deletions
diff --git a/modules/multiplayer/scene_rpc_interface.cpp b/modules/multiplayer/scene_rpc_interface.cpp
index bf0a261bd8..5301815c1e 100644
--- a/modules/multiplayer/scene_rpc_interface.cpp
+++ b/modules/multiplayer/scene_rpc_interface.cpp
@@ -116,22 +116,6 @@ const SceneRPCInterface::RPCConfigCache &SceneRPCInterface::_get_node_config(con
return rpc_cache[oid];
}
-_FORCE_INLINE_ bool _can_call_mode(Node *p_node, MultiplayerAPI::RPCMode mode, int p_remote_id) {
- switch (mode) {
- case MultiplayerAPI::RPC_MODE_DISABLED: {
- return false;
- } break;
- case MultiplayerAPI::RPC_MODE_ANY_PEER: {
- return true;
- } break;
- case MultiplayerAPI::RPC_MODE_AUTHORITY: {
- return !p_node->is_multiplayer_authority() && p_remote_id == p_node->get_multiplayer_authority();
- } break;
- }
-
- return false;
-}
-
String SceneRPCInterface::get_rpc_md5(const Object *p_obj) {
const Node *node = Object::cast_to<Node>(p_obj);
ERR_FAIL_NULL_V(node, "");
@@ -252,7 +236,19 @@ void SceneRPCInterface::_process_rpc(Node *p_node, const uint16_t p_rpc_method_i
ERR_FAIL_COND(!cache_config.configs.has(p_rpc_method_id));
const RPCConfig &config = cache_config.configs[p_rpc_method_id];
- bool can_call = _can_call_mode(p_node, config.rpc_mode, p_from);
+ bool can_call = false;
+ switch (config.rpc_mode) {
+ case MultiplayerAPI::RPC_MODE_DISABLED: {
+ can_call = false;
+ } break;
+ case MultiplayerAPI::RPC_MODE_ANY_PEER: {
+ can_call = true;
+ } break;
+ case MultiplayerAPI::RPC_MODE_AUTHORITY: {
+ can_call = p_from == p_node->get_multiplayer_authority();
+ } break;
+ }
+
ERR_FAIL_COND_MSG(!can_call, "RPC '" + String(config.name) + "' is not allowed on node " + p_node->get_path() + " from: " + itos(p_from) + ". Mode is " + itos((int)config.rpc_mode) + ", authority is " + itos(p_node->get_multiplayer_authority()) + ".");
int argc = 0;