mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-01-11 21:31:10 +01:00
Removed rsets.
This commit is contained in:
parent
98e649489f
commit
44948a6f7a
@ -194,8 +194,7 @@ void MultiplayerAPI::_process_packet(int p_from, const uint8_t *p_packet, int p_
|
||||
_process_confirm_path(p_from, p_packet, p_packet_len);
|
||||
} break;
|
||||
|
||||
case NETWORK_COMMAND_REMOTE_CALL:
|
||||
case NETWORK_COMMAND_REMOTE_SET: {
|
||||
case NETWORK_COMMAND_REMOTE_CALL: {
|
||||
ERR_FAIL_COND_MSG(p_packet_len < 6, "Invalid packet received. Size too small.");
|
||||
|
||||
Node *node = _process_get_node(p_from, p_packet, p_packet_len);
|
||||
@ -214,13 +213,7 @@ void MultiplayerAPI::_process_packet(int p_from, const uint8_t *p_packet, int p_
|
||||
|
||||
StringName name = String::utf8((const char *)&p_packet[5]);
|
||||
|
||||
if (packet_type == NETWORK_COMMAND_REMOTE_CALL) {
|
||||
_process_rpc(node, name, p_from, p_packet, p_packet_len, len_end + 1);
|
||||
|
||||
} else {
|
||||
_process_rset(node, name, p_from, p_packet, p_packet_len, len_end + 1);
|
||||
}
|
||||
|
||||
_process_rpc(node, name, p_from, p_packet, p_packet_len, len_end + 1);
|
||||
} break;
|
||||
|
||||
case NETWORK_COMMAND_RAW: {
|
||||
@ -321,43 +314,6 @@ void MultiplayerAPI::_process_rpc(Node *p_node, const StringName &p_name, int p_
|
||||
}
|
||||
}
|
||||
|
||||
void MultiplayerAPI::_process_rset(Node *p_node, const StringName &p_name, int p_from, const uint8_t *p_packet, int p_packet_len, int p_offset) {
|
||||
ERR_FAIL_COND_MSG(p_offset >= p_packet_len, "Invalid packet received. Size too small.");
|
||||
|
||||
// Check that remote can call the RSET on this node.
|
||||
RPCMode rset_mode = RPC_MODE_DISABLED;
|
||||
const Map<StringName, RPCMode>::Element *E = p_node->get_node_rset_mode(p_name);
|
||||
if (E) {
|
||||
rset_mode = E->get();
|
||||
} else if (p_node->get_script_instance()) {
|
||||
rset_mode = p_node->get_script_instance()->get_rset_mode(p_name);
|
||||
}
|
||||
|
||||
bool can_call = _can_call_mode(p_node, rset_mode, p_from);
|
||||
ERR_FAIL_COND_MSG(!can_call, "RSET '" + String(p_name) + "' is not allowed on node " + p_node->get_path() + " from: " + itos(p_from) + ". Mode is " + itos((int)rset_mode) + ", master is " + itos(p_node->get_network_master()) + ".");
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (profiling) {
|
||||
ObjectID id = p_node->get_instance_id();
|
||||
_init_node_profile(id);
|
||||
profiler_frame_data[id].incoming_rset += 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
Variant value;
|
||||
Error err = decode_variant(value, &p_packet[p_offset], p_packet_len - p_offset, nullptr, allow_object_decoding || network_peer->is_object_decoding_allowed());
|
||||
|
||||
ERR_FAIL_COND_MSG(err != OK, "Invalid packet received. Unable to decode RSET value.");
|
||||
|
||||
bool valid;
|
||||
|
||||
p_node->set(p_name, value, &valid);
|
||||
if (!valid) {
|
||||
String error = "Error setting remote property '" + String(p_name) + "', not found in object of type " + p_node->get_class() + ".";
|
||||
ERR_PRINT(error);
|
||||
}
|
||||
}
|
||||
|
||||
void MultiplayerAPI::_process_simplify_path(int p_from, const uint8_t *p_packet, int p_packet_len) {
|
||||
ERR_FAIL_COND_MSG(p_packet_len < 5, "Invalid packet received. Size too small.");
|
||||
int id = decode_uint32(&p_packet[1]);
|
||||
@ -458,7 +414,7 @@ bool MultiplayerAPI::_send_confirm_path(NodePath p_path, PathSentCache *psc, int
|
||||
return has_all_peers;
|
||||
}
|
||||
|
||||
void MultiplayerAPI::_send_rpc(Node *p_from, int p_to, bool p_unreliable, bool p_set, const StringName &p_name, const Variant **p_arg, int p_argcount) {
|
||||
void MultiplayerAPI::_send_rpc(Node *p_from, int p_to, bool p_unreliable, const StringName &p_name, const Variant **p_arg, int p_argcount) {
|
||||
ERR_FAIL_COND_MSG(network_peer.is_null(), "Attempt to remote call/set when networking is not active in SceneTree.");
|
||||
|
||||
ERR_FAIL_COND_MSG(network_peer->get_connection_status() == NetworkedMultiplayerPeer::CONNECTION_CONNECTING, "Attempt to remote call/set when networking is not connected yet in SceneTree.");
|
||||
@ -495,7 +451,7 @@ void MultiplayerAPI::_send_rpc(Node *p_from, int p_to, bool p_unreliable, bool p
|
||||
|
||||
// Encode type.
|
||||
MAKE_ROOM(1);
|
||||
packet_cache.write[0] = p_set ? NETWORK_COMMAND_REMOTE_SET : NETWORK_COMMAND_REMOTE_CALL;
|
||||
packet_cache.write[0] = NETWORK_COMMAND_REMOTE_CALL;
|
||||
ofs += 1;
|
||||
|
||||
// Encode ID.
|
||||
@ -510,26 +466,16 @@ void MultiplayerAPI::_send_rpc(Node *p_from, int p_to, bool p_unreliable, bool p
|
||||
encode_cstring(name.get_data(), &(packet_cache.write[ofs]));
|
||||
ofs += len;
|
||||
|
||||
if (p_set) {
|
||||
// Set argument.
|
||||
Error err = encode_variant(*p_arg[0], nullptr, len, allow_object_decoding || network_peer->is_object_decoding_allowed());
|
||||
ERR_FAIL_COND_MSG(err != OK, "Unable to encode RSET value. THIS IS LIKELY A BUG IN THE ENGINE!");
|
||||
// Call arguments.
|
||||
MAKE_ROOM(ofs + 1);
|
||||
packet_cache.write[ofs] = p_argcount;
|
||||
ofs += 1;
|
||||
for (int i = 0; i < p_argcount; i++) {
|
||||
Error err = encode_variant(*p_arg[i], nullptr, len, allow_object_decoding || network_peer->is_object_decoding_allowed());
|
||||
ERR_FAIL_COND_MSG(err != OK, "Unable to encode RPC argument. THIS IS LIKELY A BUG IN THE ENGINE!");
|
||||
MAKE_ROOM(ofs + len);
|
||||
encode_variant(*p_arg[0], &(packet_cache.write[ofs]), len, allow_object_decoding || network_peer->is_object_decoding_allowed());
|
||||
encode_variant(*p_arg[i], &(packet_cache.write[ofs]), len, allow_object_decoding || network_peer->is_object_decoding_allowed());
|
||||
ofs += len;
|
||||
|
||||
} else {
|
||||
// Call arguments.
|
||||
MAKE_ROOM(ofs + 1);
|
||||
packet_cache.write[ofs] = p_argcount;
|
||||
ofs += 1;
|
||||
for (int i = 0; i < p_argcount; i++) {
|
||||
Error err = encode_variant(*p_arg[i], nullptr, len, allow_object_decoding || network_peer->is_object_decoding_allowed());
|
||||
ERR_FAIL_COND_MSG(err != OK, "Unable to encode RPC argument. THIS IS LIKELY A BUG IN THE ENGINE!");
|
||||
MAKE_ROOM(ofs + len);
|
||||
encode_variant(*p_arg[i], &(packet_cache.write[ofs]), len, allow_object_decoding || network_peer->is_object_decoding_allowed());
|
||||
ofs += len;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
@ -656,7 +602,7 @@ void MultiplayerAPI::rpcp(Node *p_node, int p_peer_id, bool p_unreliable, const
|
||||
}
|
||||
#endif
|
||||
|
||||
_send_rpc(p_node, p_peer_id, p_unreliable, false, p_method, p_arg, p_argcount);
|
||||
_send_rpc(p_node, p_peer_id, p_unreliable, p_method, p_arg, p_argcount);
|
||||
}
|
||||
|
||||
if (call_local_native) {
|
||||
@ -691,76 +637,6 @@ void MultiplayerAPI::rpcp(Node *p_node, int p_peer_id, bool p_unreliable, const
|
||||
ERR_FAIL_COND_MSG(skip_rpc && !(call_local_native || call_local_script), "RPC '" + p_method + "' on yourself is not allowed by selected mode.");
|
||||
}
|
||||
|
||||
void MultiplayerAPI::rsetp(Node *p_node, int p_peer_id, bool p_unreliable, const StringName &p_property, const Variant &p_value) {
|
||||
ERR_FAIL_COND_MSG(!network_peer.is_valid(), "Trying to RSET while no network peer is active.");
|
||||
ERR_FAIL_COND_MSG(!p_node->is_inside_tree(), "Trying to RSET on a node which is not inside SceneTree.");
|
||||
ERR_FAIL_COND_MSG(network_peer->get_connection_status() != NetworkedMultiplayerPeer::CONNECTION_CONNECTED, "Trying to send an RSET via a network peer which is not connected.");
|
||||
|
||||
int node_id = network_peer->get_unique_id();
|
||||
bool is_master = p_node->is_network_master();
|
||||
bool skip_rset = node_id == p_peer_id;
|
||||
bool set_local = false;
|
||||
|
||||
if (p_peer_id == 0 || p_peer_id == node_id || (p_peer_id < 0 && p_peer_id != -node_id)) {
|
||||
// Check that send mode can use local call.
|
||||
const Map<StringName, RPCMode>::Element *E = p_node->get_node_rset_mode(p_property);
|
||||
if (E) {
|
||||
set_local = _should_call_local(E->get(), is_master, skip_rset);
|
||||
}
|
||||
|
||||
if (set_local) {
|
||||
bool valid;
|
||||
int temp_id = rpc_sender_id;
|
||||
|
||||
rpc_sender_id = get_network_unique_id();
|
||||
p_node->set(p_property, p_value, &valid);
|
||||
rpc_sender_id = temp_id;
|
||||
|
||||
if (!valid) {
|
||||
String error = "rset() aborted in local set, property not found: - " + String(p_property) + ".";
|
||||
ERR_PRINT(error);
|
||||
return;
|
||||
}
|
||||
} else if (p_node->get_script_instance()) {
|
||||
// Attempt with script.
|
||||
RPCMode rpc_mode = p_node->get_script_instance()->get_rset_mode(p_property);
|
||||
|
||||
set_local = _should_call_local(rpc_mode, is_master, skip_rset);
|
||||
|
||||
if (set_local) {
|
||||
int temp_id = rpc_sender_id;
|
||||
|
||||
rpc_sender_id = get_network_unique_id();
|
||||
bool valid = p_node->get_script_instance()->set(p_property, p_value);
|
||||
rpc_sender_id = temp_id;
|
||||
|
||||
if (!valid) {
|
||||
String error = "rset() aborted in local script set, property not found: - " + String(p_property) + ".";
|
||||
ERR_PRINT(error);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (skip_rset) {
|
||||
ERR_FAIL_COND_MSG(!set_local, "RSET for '" + p_property + "' on yourself is not allowed by selected mode.");
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (profiling) {
|
||||
ObjectID id = p_node->get_instance_id();
|
||||
_init_node_profile(id);
|
||||
profiler_frame_data[id].outgoing_rset += 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
const Variant *vptr = &p_value;
|
||||
|
||||
_send_rpc(p_node, p_peer_id, p_unreliable, true, p_property, &vptr, 1);
|
||||
}
|
||||
|
||||
Error MultiplayerAPI::send_bytes(PoolVector<uint8_t> p_data, int p_to, NetworkedMultiplayerPeer::TransferMode p_mode) {
|
||||
ERR_FAIL_COND_V_MSG(p_data.size() < 1, ERR_INVALID_DATA, "Trying to send an empty raw packet.");
|
||||
ERR_FAIL_COND_V_MSG(!network_peer.is_valid(), ERR_UNCONFIGURED, "Trying to send a raw packet while no network peer is active.");
|
||||
|
@ -98,23 +98,20 @@ protected:
|
||||
void _process_confirm_path(int p_from, const uint8_t *p_packet, int p_packet_len);
|
||||
Node *_process_get_node(int p_from, const uint8_t *p_packet, int p_packet_len);
|
||||
void _process_rpc(Node *p_node, const StringName &p_name, int p_from, const uint8_t *p_packet, int p_packet_len, int p_offset);
|
||||
void _process_rset(Node *p_node, const StringName &p_name, int p_from, const uint8_t *p_packet, int p_packet_len, int p_offset);
|
||||
void _process_raw(int p_from, const uint8_t *p_packet, int p_packet_len);
|
||||
|
||||
void _send_rpc(Node *p_from, int p_to, bool p_unreliable, bool p_set, const StringName &p_name, const Variant **p_arg, int p_argcount);
|
||||
void _send_rpc(Node *p_from, int p_to, bool p_unreliable, const StringName &p_name, const Variant **p_arg, int p_argcount);
|
||||
bool _send_confirm_path(NodePath p_path, PathSentCache *psc, int p_target);
|
||||
|
||||
public:
|
||||
enum NetworkCommands {
|
||||
NETWORK_COMMAND_REMOTE_CALL,
|
||||
NETWORK_COMMAND_REMOTE_SET,
|
||||
NETWORK_COMMAND_SIMPLIFY_PATH,
|
||||
NETWORK_COMMAND_CONFIRM_PATH,
|
||||
NETWORK_COMMAND_RAW,
|
||||
};
|
||||
|
||||
enum RPCMode {
|
||||
|
||||
RPC_MODE_DISABLED, // No rpc for this method, calls to this will be blocked (default)
|
||||
RPC_MODE_REMOTE, // Using rpc() on it will call method / set property in all remote peers
|
||||
RPC_MODE_MASTER, // Using rpc() on it will call method on wherever the master is, be it local or remote
|
||||
@ -136,8 +133,6 @@ public:
|
||||
|
||||
// Called by Node.rpc
|
||||
void rpcp(Node *p_node, int p_peer_id, bool p_unreliable, const StringName &p_method, const Variant **p_arg, int p_argcount);
|
||||
// Called by Node.rset
|
||||
void rsetp(Node *p_node, int p_peer_id, bool p_unreliable, const StringName &p_property, const Variant &p_value);
|
||||
|
||||
void _add_peer(int p_id);
|
||||
void _del_peer(int p_id);
|
||||
|
@ -587,14 +587,6 @@ void Node::rpc_config(const StringName &p_method, MultiplayerAPI::RPCMode p_mode
|
||||
};
|
||||
}
|
||||
|
||||
void Node::rset_config(const StringName &p_property, MultiplayerAPI::RPCMode p_mode) {
|
||||
if (p_mode == MultiplayerAPI::RPC_MODE_DISABLED) {
|
||||
data.rpc_properties.erase(p_property);
|
||||
} else {
|
||||
data.rpc_properties[p_property] = p_mode;
|
||||
};
|
||||
}
|
||||
|
||||
/***** RPC FUNCTIONS ********/
|
||||
|
||||
void Node::rpc(const StringName &p_method, VARIANT_ARG_DECLARE) {
|
||||
@ -762,28 +754,6 @@ void Node::rpcp(int p_peer_id, bool p_unreliable, const StringName &p_method, co
|
||||
get_multiplayer()->rpcp(this, p_peer_id, p_unreliable, p_method, p_arg, p_argcount);
|
||||
}
|
||||
|
||||
void Node::rsetp(int p_peer_id, bool p_unreliable, const StringName &p_property, const Variant &p_value) {
|
||||
ERR_FAIL_COND(!is_inside_tree());
|
||||
get_multiplayer()->rsetp(this, p_peer_id, p_unreliable, p_property, p_value);
|
||||
}
|
||||
|
||||
/******** RSET *********/
|
||||
void Node::rset(const StringName &p_property, const Variant &p_value) {
|
||||
rsetp(0, false, p_property, p_value);
|
||||
}
|
||||
|
||||
void Node::rset_id(int p_peer_id, const StringName &p_property, const Variant &p_value) {
|
||||
rsetp(p_peer_id, false, p_property, p_value);
|
||||
}
|
||||
|
||||
void Node::rset_unreliable(const StringName &p_property, const Variant &p_value) {
|
||||
rsetp(0, true, p_property, p_value);
|
||||
}
|
||||
|
||||
void Node::rset_unreliable_id(int p_peer_id, const StringName &p_property, const Variant &p_value) {
|
||||
rsetp(p_peer_id, true, p_property, p_value);
|
||||
}
|
||||
|
||||
//////////// end of rpc
|
||||
Ref<MultiplayerAPI> Node::get_multiplayer() const {
|
||||
if (multiplayer.is_valid()) {
|
||||
@ -807,10 +777,6 @@ const Map<StringName, MultiplayerAPI::RPCMode>::Element *Node::get_node_rpc_mode
|
||||
return data.rpc_methods.find(p_method);
|
||||
}
|
||||
|
||||
const Map<StringName, MultiplayerAPI::RPCMode>::Element *Node::get_node_rset_mode(const StringName &p_property) {
|
||||
return data.rpc_properties.find(p_property);
|
||||
}
|
||||
|
||||
bool Node::can_process_notification(int p_what) const {
|
||||
switch (p_what) {
|
||||
case NOTIFICATION_PHYSICS_PROCESS:
|
||||
@ -3083,7 +3049,6 @@ void Node::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("get_custom_multiplayer"), &Node::get_custom_multiplayer);
|
||||
ClassDB::bind_method(D_METHOD("set_custom_multiplayer", "api"), &Node::set_custom_multiplayer);
|
||||
ClassDB::bind_method(D_METHOD("rpc_config", "method", "mode"), &Node::rpc_config);
|
||||
ClassDB::bind_method(D_METHOD("rset_config", "property", "mode"), &Node::rset_config);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("_set_editor_description", "editor_description"), &Node::set_editor_description);
|
||||
ClassDB::bind_method(D_METHOD("_get_editor_description"), &Node::get_editor_description);
|
||||
@ -3118,11 +3083,6 @@ void Node::_bind_methods() {
|
||||
ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "rpc_unreliable_id", &Node::_rpc_unreliable_id_bind, mi);
|
||||
}
|
||||
|
||||
ClassDB::bind_method(D_METHOD("rset", "property", "value"), &Node::rset);
|
||||
ClassDB::bind_method(D_METHOD("rset_id", "peer_id", "property", "value"), &Node::rset_id);
|
||||
ClassDB::bind_method(D_METHOD("rset_unreliable", "property", "value"), &Node::rset_unreliable);
|
||||
ClassDB::bind_method(D_METHOD("rset_unreliable_id", "peer_id", "property", "value"), &Node::rset_unreliable_id);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("update_configuration_warning"), &Node::update_configuration_warning);
|
||||
|
||||
BIND_CONSTANT(NOTIFICATION_ENTER_TREE);
|
||||
|
@ -120,7 +120,6 @@ private:
|
||||
|
||||
int network_master;
|
||||
Map<StringName, MultiplayerAPI::RPCMode> rpc_methods;
|
||||
Map<StringName, MultiplayerAPI::RPCMode> rpc_properties;
|
||||
|
||||
int process_priority;
|
||||
|
||||
@ -512,26 +511,18 @@ public:
|
||||
bool is_network_master() const;
|
||||
|
||||
void rpc_config(const StringName &p_method, MultiplayerAPI::RPCMode p_mode); // config a local method for RPC
|
||||
void rset_config(const StringName &p_property, MultiplayerAPI::RPCMode p_mode); // config a local property for RPC
|
||||
|
||||
void rpc(const StringName &p_method, VARIANT_ARG_LIST); //rpc call, honors RPCMode
|
||||
void rpc_unreliable(const StringName &p_method, VARIANT_ARG_LIST); //rpc call, honors RPCMode
|
||||
void rpc_id(int p_peer_id, const StringName &p_method, VARIANT_ARG_LIST); //rpc call, honors RPCMode
|
||||
void rpc_unreliable_id(int p_peer_id, const StringName &p_method, VARIANT_ARG_LIST); //rpc call, honors RPCMode
|
||||
|
||||
void rset(const StringName &p_property, const Variant &p_value); //remote set call, honors RPCMode
|
||||
void rset_unreliable(const StringName &p_property, const Variant &p_value); //remote set call, honors RPCMode
|
||||
void rset_id(int p_peer_id, const StringName &p_property, const Variant &p_value); //remote set call, honors RPCMode
|
||||
void rset_unreliable_id(int p_peer_id, const StringName &p_property, const Variant &p_value); //remote set call, honors RPCMode
|
||||
|
||||
void rpcp(int p_peer_id, bool p_unreliable, const StringName &p_method, const Variant **p_arg, int p_argcount);
|
||||
void rsetp(int p_peer_id, bool p_unreliable, const StringName &p_property, const Variant &p_value);
|
||||
|
||||
Ref<MultiplayerAPI> get_multiplayer() const;
|
||||
Ref<MultiplayerAPI> get_custom_multiplayer() const;
|
||||
void set_custom_multiplayer(Ref<MultiplayerAPI> p_multiplayer);
|
||||
const Map<StringName, MultiplayerAPI::RPCMode>::Element *get_node_rpc_mode(const StringName &p_method);
|
||||
const Map<StringName, MultiplayerAPI::RPCMode>::Element *get_node_rset_mode(const StringName &p_property);
|
||||
|
||||
Node();
|
||||
~Node();
|
||||
|
Loading…
Reference in New Issue
Block a user