Skip to content

Commit b8dbe89

Browse files
committed
Expose node network IDs to GDScript
1 parent a8598cd commit b8dbe89

File tree

5 files changed

+59
-0
lines changed

5 files changed

+59
-0
lines changed

modules/multiplayer/scene_cache_interface.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030

3131
#include "scene_cache_interface.h"
3232

33+
#include "core/error/error_macros.h"
34+
#include "core/object/object_id.h"
35+
#include "core/variant/variant.h"
3336
#include "scene_multiplayer.h"
3437

3538
#include "core/io/marshalls.h"
@@ -204,6 +207,29 @@ Error SceneCacheInterface::_send_confirm_path(Node *p_node, NodeCache &p_cache,
204207
return err;
205208
}
206209

210+
ObjectID SceneCacheInterface::resolve_object_id(int p_id) const {
211+
if (assigned_ids.has(p_id)) {
212+
return assigned_ids.get(p_id);
213+
}
214+
215+
return ObjectID{ (uint64_t)0 };
216+
}
217+
218+
int SceneCacheInterface::get_network_id(const Object* p_object, int p_peer_id) const {
219+
ERR_FAIL_NULL_V(p_object, 0);
220+
221+
ObjectID oid = p_object->get_instance_id();
222+
const NodeCache* nc = nodes_cache.getptr(oid);
223+
ERR_FAIL_NULL_V_MSG(nc, 0, vformat("No node cache found for ObjectID %d!", (uint64_t)oid));
224+
225+
// if (!nc->confirmed_peers.has(p_peer_id) || !nc->confirmed_peers.get(p_peer_id) || !nc->recv_ids.has(p_peer_id)) {
226+
// // Peer hasn't confirmed ID
227+
// return -1;
228+
// }
229+
230+
return nc->cache_id;
231+
}
232+
207233
bool SceneCacheInterface::is_cache_confirmed(Node *p_node, int p_peer) {
208234
ERR_FAIL_NULL_V(p_node, false);
209235
const ObjectID oid = p_node->get_instance_id();

modules/multiplayer/scene_cache_interface.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ class SceneCacheInterface : public RefCounted {
8080
void process_simplify_path(int p_from, const uint8_t *p_packet, int p_packet_len);
8181
void process_confirm_path(int p_from, const uint8_t *p_packet, int p_packet_len);
8282

83+
ObjectID resolve_object_id(int p_id) const;
84+
int get_network_id(const Object* p_object, int p_peer_id) const;
85+
8386
// Returns true if all peers have cached path.
8487
bool send_object_cache(Object *p_obj, int p_target, int &p_id);
8588
int make_object_cache(Object *p_obj);

modules/multiplayer/scene_multiplayer.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
#include "core/debugger/engine_debugger.h"
3434
#include "core/io/marshalls.h"
35+
#include "core/object/class_db.h"
36+
#include "core/object/object.h"
3537

3638
#ifdef DEBUG_ENABLED
3739
#include "core/os/os.h"
@@ -576,6 +578,21 @@ String SceneMultiplayer::get_rpc_md5(const Object *p_obj) {
576578
return rpc->get_rpc_md5(p_obj);
577579
}
578580

581+
int SceneMultiplayer::get_network_id(Object* p_object, int p_peer_id) const {
582+
Node *node = Object::cast_to<Node>(p_object);
583+
ERR_FAIL_COND_V_MSG(!node || !node->is_inside_tree(), 0, "The object must be a valid Node inside the SceneTree");
584+
585+
return cache->get_network_id(node, p_peer_id);
586+
}
587+
588+
Object* SceneMultiplayer::instance_from_network_id(int p_id) const {
589+
ObjectID oid = cache->resolve_object_id(p_id);
590+
if(oid.is_null()) {
591+
return nullptr;
592+
}
593+
return ObjectDB::get_instance(oid);
594+
}
595+
579596
Error SceneMultiplayer::rpcp(Object *p_obj, int p_peer_id, const StringName &p_method, const Variant **p_arg, int p_argcount) {
580597
return rpc->rpcp(p_obj, p_peer_id, p_method, p_arg, p_argcount);
581598
}
@@ -652,6 +669,9 @@ void SceneMultiplayer::_bind_methods() {
652669
ClassDB::bind_method(D_METHOD("set_auth_timeout", "timeout"), &SceneMultiplayer::set_auth_timeout);
653670
ClassDB::bind_method(D_METHOD("get_auth_timeout"), &SceneMultiplayer::get_auth_timeout);
654671

672+
ClassDB::bind_method(D_METHOD("get_network_id", "object", "peer_id"), &SceneMultiplayer::get_network_id);
673+
ClassDB::bind_method(D_METHOD("instance_from_network_id", "id"), &SceneMultiplayer::instance_from_network_id);
674+
655675
ClassDB::bind_method(D_METHOD("set_refuse_new_connections", "refuse"), &SceneMultiplayer::set_refuse_new_connections);
656676
ClassDB::bind_method(D_METHOD("is_refusing_new_connections"), &SceneMultiplayer::is_refusing_new_connections);
657677
ClassDB::bind_method(D_METHOD("set_allow_object_decoding", "enable"), &SceneMultiplayer::set_allow_object_decoding);

modules/multiplayer/scene_multiplayer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#pragma once
3232

33+
#include "core/object/object.h"
3334
#include "scene_cache_interface.h"
3435
#include "scene_replication_interface.h"
3536
#include "scene_rpc_interface.h"
@@ -184,6 +185,9 @@ class SceneMultiplayer : public MultiplayerAPI {
184185

185186
const HashSet<int> get_connected_peers() const { return connected_peers; }
186187

188+
int get_network_id(Object* p_object, int p_peer_id) const;
189+
Object* instance_from_network_id(int p_id) const;
190+
187191
void set_remote_sender_override(int p_id) { remote_sender_override = p_id; }
188192
void set_refuse_new_connections(bool p_refuse);
189193
bool is_refusing_new_connections() const;

modules/multiplayer/scene_rpc_interface.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
#include "scene_rpc_interface.h"
3232

33+
#include "core/string/print_string.h"
34+
#include "core/variant/variant.h"
3335
#include "scene_multiplayer.h"
3436

3537
#include "core/debugger/engine_debugger.h"
@@ -205,6 +207,8 @@ void SceneRPCInterface::process_rpc(int p_from, const uint8_t *p_packet, int p_p
205207
}
206208

207209
Node *node = _process_get_node(p_from, p_packet, node_target, p_packet_len);
210+
print_line(vformat("[core] Received RPC call on ID#%d, resolving to node %s", node_target, node)); // TODO: Remove
211+
208212
ERR_FAIL_NULL_MSG(node, "Invalid packet received. Requested node was not found.");
209213

210214
uint16_t name_id = 0;
@@ -378,6 +382,8 @@ void SceneRPCInterface::_send_rpc(Node *p_node, int p_to, uint16_t p_rpc_id, con
378382
ofs += 4;
379383
}
380384

385+
print_line(vformat("[core] Sending RPC to node %s with ID#%d", p_node, psc_id)); // TODO: Remove
386+
381387
// Encode method ID
382388
if (p_rpc_id <= UINT8_MAX) {
383389
// The ID fits in 1 byte

0 commit comments

Comments
 (0)