mirror of
https://github.com/godotengine/godot-visual-script.git
synced 2025-12-31 21:48:42 +03:00
[Net] Refactor RPCs, remove RSETs
In this PR: - Removed rset - rpc_config can now optionally configure transfer mode (reliable/unreliable/ordered) and channel (channels are not actually implemented yet.) - Refactor how the RPC id is computed to minimize the logic in Node and scripts that now only needs a single `get_rpc_methods` function.
This commit is contained in:
@@ -954,60 +954,10 @@ bool VisualScript::are_subnodes_edited() const {
|
||||
}
|
||||
#endif
|
||||
|
||||
Vector<ScriptNetData> VisualScript::get_rpc_methods() const {
|
||||
const Vector<MultiplayerAPI::RPCConfig> VisualScript::get_rpc_methods() const {
|
||||
return rpc_functions;
|
||||
}
|
||||
|
||||
uint16_t VisualScript::get_rpc_method_id(const StringName &p_method) const {
|
||||
for (int i = 0; i < rpc_functions.size(); i++) {
|
||||
if (rpc_functions[i].name == p_method) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return UINT16_MAX;
|
||||
}
|
||||
|
||||
StringName VisualScript::get_rpc_method(const uint16_t p_rpc_method_id) const {
|
||||
ERR_FAIL_COND_V(p_rpc_method_id >= rpc_functions.size(), StringName());
|
||||
return rpc_functions[p_rpc_method_id].name;
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode VisualScript::get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const {
|
||||
ERR_FAIL_COND_V(p_rpc_method_id >= rpc_functions.size(), MultiplayerAPI::RPC_MODE_DISABLED);
|
||||
return rpc_functions[p_rpc_method_id].mode;
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode VisualScript::get_rpc_mode(const StringName &p_method) const {
|
||||
return get_rpc_mode_by_id(get_rpc_method_id(p_method));
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> VisualScript::get_rset_properties() const {
|
||||
return rpc_variables;
|
||||
}
|
||||
|
||||
uint16_t VisualScript::get_rset_property_id(const StringName &p_variable) const {
|
||||
for (int i = 0; i < rpc_variables.size(); i++) {
|
||||
if (rpc_variables[i].name == p_variable) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return UINT16_MAX;
|
||||
}
|
||||
|
||||
StringName VisualScript::get_rset_property(const uint16_t p_rset_property_id) const {
|
||||
ERR_FAIL_COND_V(p_rset_property_id >= rpc_variables.size(), StringName());
|
||||
return rpc_variables[p_rset_property_id].name;
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode VisualScript::get_rset_mode_by_id(const uint16_t p_rset_variable_id) const {
|
||||
ERR_FAIL_COND_V(p_rset_variable_id >= rpc_variables.size(), MultiplayerAPI::RPC_MODE_DISABLED);
|
||||
return rpc_variables[p_rset_variable_id].mode;
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode VisualScript::get_rset_mode(const StringName &p_variable) const {
|
||||
return get_rset_mode_by_id(get_rset_property_id(p_variable));
|
||||
}
|
||||
|
||||
void VisualScript::_set_data(const Dictionary &p_data) {
|
||||
Dictionary d = p_data;
|
||||
if (d.has("base_type")) {
|
||||
@@ -1065,7 +1015,6 @@ void VisualScript::_set_data(const Dictionary &p_data) {
|
||||
|
||||
// Takes all the rpc methods.
|
||||
rpc_functions.clear();
|
||||
rpc_variables.clear();
|
||||
List<StringName> fns;
|
||||
functions.get_key_list(&fns);
|
||||
for (const List<StringName>::Element *E = fns.front(); E; E = E->next()) {
|
||||
@@ -1073,9 +1022,10 @@ void VisualScript::_set_data(const Dictionary &p_data) {
|
||||
Ref<VisualScriptFunction> vsf = nodes[functions[E->get()].func_id].node;
|
||||
if (vsf.is_valid()) {
|
||||
if (vsf->get_rpc_mode() != MultiplayerAPI::RPC_MODE_DISABLED) {
|
||||
ScriptNetData nd;
|
||||
MultiplayerAPI::RPCConfig nd;
|
||||
nd.name = E->get();
|
||||
nd.mode = vsf->get_rpc_mode();
|
||||
nd.rpc_mode = vsf->get_rpc_mode();
|
||||
nd.transfer_mode = NetworkedMultiplayerPeer::TRANSFER_MODE_RELIABLE; // TODO
|
||||
if (rpc_functions.find(nd) == -1) {
|
||||
rpc_functions.push_back(nd);
|
||||
}
|
||||
@@ -1085,7 +1035,7 @@ void VisualScript::_set_data(const Dictionary &p_data) {
|
||||
}
|
||||
|
||||
// Sort so we are 100% that they are always the same.
|
||||
rpc_functions.sort_custom<SortNetData>();
|
||||
rpc_functions.sort_custom<MultiplayerAPI::SortRPCConfig>();
|
||||
}
|
||||
|
||||
Dictionary VisualScript::_get_data() const {
|
||||
@@ -1882,46 +1832,10 @@ Ref<Script> VisualScriptInstance::get_script() const {
|
||||
return script;
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> VisualScriptInstance::get_rpc_methods() const {
|
||||
const Vector<MultiplayerAPI::RPCConfig> VisualScriptInstance::get_rpc_methods() const {
|
||||
return script->get_rpc_methods();
|
||||
}
|
||||
|
||||
uint16_t VisualScriptInstance::get_rpc_method_id(const StringName &p_method) const {
|
||||
return script->get_rpc_method_id(p_method);
|
||||
}
|
||||
|
||||
StringName VisualScriptInstance::get_rpc_method(const uint16_t p_rpc_method_id) const {
|
||||
return script->get_rpc_method(p_rpc_method_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode VisualScriptInstance::get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const {
|
||||
return script->get_rpc_mode_by_id(p_rpc_method_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode VisualScriptInstance::get_rpc_mode(const StringName &p_method) const {
|
||||
return script->get_rpc_mode(p_method);
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> VisualScriptInstance::get_rset_properties() const {
|
||||
return script->get_rset_properties();
|
||||
}
|
||||
|
||||
uint16_t VisualScriptInstance::get_rset_property_id(const StringName &p_variable) const {
|
||||
return script->get_rset_property_id(p_variable);
|
||||
}
|
||||
|
||||
StringName VisualScriptInstance::get_rset_property(const uint16_t p_rset_property_id) const {
|
||||
return script->get_rset_property(p_rset_property_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode VisualScriptInstance::get_rset_mode_by_id(const uint16_t p_rset_variable_id) const {
|
||||
return script->get_rset_mode_by_id(p_rset_variable_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode VisualScriptInstance::get_rset_mode(const StringName &p_variable) const {
|
||||
return script->get_rset_mode(p_variable);
|
||||
}
|
||||
|
||||
void VisualScriptInstance::create(const Ref<VisualScript> &p_script, Object *p_owner) {
|
||||
script = p_script;
|
||||
owner = p_owner;
|
||||
|
||||
@@ -234,8 +234,7 @@ private:
|
||||
HashMap<StringName, Function> functions;
|
||||
HashMap<StringName, Variable> variables;
|
||||
Map<StringName, Vector<Argument>> custom_signals;
|
||||
Vector<ScriptNetData> rpc_functions;
|
||||
Vector<ScriptNetData> rpc_variables;
|
||||
Vector<MultiplayerAPI::RPCConfig> rpc_functions;
|
||||
|
||||
Map<Object *, VisualScriptInstance *> instances;
|
||||
|
||||
@@ -363,17 +362,7 @@ public:
|
||||
|
||||
virtual int get_member_line(const StringName &p_member) const override;
|
||||
|
||||
virtual Vector<ScriptNetData> get_rpc_methods() const override;
|
||||
virtual uint16_t get_rpc_method_id(const StringName &p_method) const override;
|
||||
virtual StringName get_rpc_method(const uint16_t p_rpc_method_id) const override;
|
||||
virtual MultiplayerAPI::RPCMode get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const override;
|
||||
virtual MultiplayerAPI::RPCMode get_rpc_mode(const StringName &p_method) const override;
|
||||
|
||||
virtual Vector<ScriptNetData> get_rset_properties() const override;
|
||||
virtual uint16_t get_rset_property_id(const StringName &p_property) const override;
|
||||
virtual StringName get_rset_property(const uint16_t p_rset_property_id) const override;
|
||||
virtual MultiplayerAPI::RPCMode get_rset_mode_by_id(const uint16_t p_rpc_method_id) const override;
|
||||
virtual MultiplayerAPI::RPCMode get_rset_mode(const StringName &p_variable) const override;
|
||||
virtual const Vector<MultiplayerAPI::RPCConfig> get_rpc_methods() const override;
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
virtual bool are_subnodes_edited() const;
|
||||
@@ -454,17 +443,7 @@ public:
|
||||
|
||||
virtual ScriptLanguage *get_language();
|
||||
|
||||
virtual Vector<ScriptNetData> get_rpc_methods() const;
|
||||
virtual uint16_t get_rpc_method_id(const StringName &p_method) const;
|
||||
virtual StringName get_rpc_method(const uint16_t p_rpc_method_id) const;
|
||||
virtual MultiplayerAPI::RPCMode get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const;
|
||||
virtual MultiplayerAPI::RPCMode get_rpc_mode(const StringName &p_method) const;
|
||||
|
||||
virtual Vector<ScriptNetData> get_rset_properties() const;
|
||||
virtual uint16_t get_rset_property_id(const StringName &p_property) const;
|
||||
virtual StringName get_rset_property(const uint16_t p_rset_property_id) const;
|
||||
virtual MultiplayerAPI::RPCMode get_rset_mode_by_id(const uint16_t p_rpc_method_id) const;
|
||||
virtual MultiplayerAPI::RPCMode get_rset_mode(const StringName &p_variable) const;
|
||||
virtual const Vector<MultiplayerAPI::RPCConfig> get_rpc_methods() const;
|
||||
|
||||
VisualScriptInstance();
|
||||
~VisualScriptInstance();
|
||||
|
||||
@@ -737,20 +737,22 @@ public:
|
||||
}
|
||||
|
||||
int to_id = 0;
|
||||
bool reliable = true;
|
||||
//bool reliable = true;
|
||||
|
||||
if (rpc_mode >= VisualScriptFunctionCall::RPC_RELIABLE_TO_ID) {
|
||||
to_id = *p_args[0];
|
||||
p_args += 1;
|
||||
p_argcount -= 1;
|
||||
if (rpc_mode == VisualScriptFunctionCall::RPC_UNRELIABLE_TO_ID) {
|
||||
reliable = false;
|
||||
}
|
||||
} else if (rpc_mode == VisualScriptFunctionCall::RPC_UNRELIABLE) {
|
||||
reliable = false;
|
||||
//if (rpc_mode == VisualScriptFunctionCall::RPC_UNRELIABLE_TO_ID) {
|
||||
//reliable = false;
|
||||
//}
|
||||
}
|
||||
//else if (rpc_mode == VisualScriptFunctionCall::RPC_UNRELIABLE) {
|
||||
//reliable = false;
|
||||
//}
|
||||
|
||||
node->rpcp(to_id, !reliable, function, p_args, p_argcount);
|
||||
// TODO reliable?
|
||||
node->rpcp(to_id, function, p_args, p_argcount);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user