You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-10 13:00:37 +00: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:
@@ -100,46 +100,10 @@ String PluginScriptInstance::to_string(bool *r_valid) {
|
||||
return str_ret;
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> PluginScriptInstance::get_rpc_methods() const {
|
||||
const Vector<MultiplayerAPI::RPCConfig> PluginScriptInstance::get_rpc_methods() const {
|
||||
return _script->get_rpc_methods();
|
||||
}
|
||||
|
||||
uint16_t PluginScriptInstance::get_rpc_method_id(const StringName &p_variable) const {
|
||||
return _script->get_rpc_method_id(p_variable);
|
||||
}
|
||||
|
||||
StringName PluginScriptInstance::get_rpc_method(uint16_t p_id) const {
|
||||
return _script->get_rpc_method(p_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode PluginScriptInstance::get_rpc_mode_by_id(uint16_t p_id) const {
|
||||
return _script->get_rpc_mode_by_id(p_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode PluginScriptInstance::get_rpc_mode(const StringName &p_method) const {
|
||||
return _script->get_rpc_mode(p_method);
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> PluginScriptInstance::get_rset_properties() const {
|
||||
return _script->get_rset_properties();
|
||||
}
|
||||
|
||||
uint16_t PluginScriptInstance::get_rset_property_id(const StringName &p_variable) const {
|
||||
return _script->get_rset_property_id(p_variable);
|
||||
}
|
||||
|
||||
StringName PluginScriptInstance::get_rset_property(uint16_t p_id) const {
|
||||
return _script->get_rset_property(p_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode PluginScriptInstance::get_rset_mode_by_id(uint16_t p_id) const {
|
||||
return _script->get_rset_mode_by_id(p_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode PluginScriptInstance::get_rset_mode(const StringName &p_variable) const {
|
||||
return _script->get_rset_mode(p_variable);
|
||||
}
|
||||
|
||||
void PluginScriptInstance::refcount_incremented() {
|
||||
if (_desc->refcount_decremented) {
|
||||
_desc->refcount_incremented(_data);
|
||||
|
||||
@@ -71,17 +71,7 @@ public:
|
||||
|
||||
void set_path(const String &p_path);
|
||||
|
||||
virtual Vector<ScriptNetData> get_rpc_methods() const;
|
||||
virtual uint16_t get_rpc_method_id(const StringName &p_method) const;
|
||||
virtual StringName get_rpc_method(uint16_t p_id) const;
|
||||
virtual MultiplayerAPI::RPCMode get_rpc_mode_by_id(uint16_t p_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_variable) const;
|
||||
virtual StringName get_rset_property(uint16_t p_id) const;
|
||||
virtual MultiplayerAPI::RPCMode get_rset_mode_by_id(uint16_t p_id) const;
|
||||
virtual MultiplayerAPI::RPCMode get_rset_mode(const StringName &p_variable) const;
|
||||
virtual const Vector<MultiplayerAPI::RPCConfig> get_rpc_methods() const;
|
||||
|
||||
virtual void refcount_incremented();
|
||||
virtual bool refcount_decremented();
|
||||
|
||||
@@ -312,10 +312,9 @@ Error PluginScript::reload(bool p_keep_state) {
|
||||
}
|
||||
Array *methods = (Array *)&manifest.methods;
|
||||
_rpc_methods.clear();
|
||||
_rpc_variables.clear();
|
||||
if (_ref_base_parent.is_valid()) {
|
||||
/// XXX TODO Should this be _rpc_methods.append_array(...)
|
||||
_rpc_methods = _ref_base_parent->get_rpc_methods();
|
||||
_rpc_variables = _ref_base_parent->get_rset_properties();
|
||||
}
|
||||
for (int i = 0; i < methods->size(); ++i) {
|
||||
Dictionary v = (*methods)[i];
|
||||
@@ -324,9 +323,10 @@ Error PluginScript::reload(bool p_keep_state) {
|
||||
// rpc_mode is passed as an optional field and is not part of MethodInfo
|
||||
Variant var = v["rpc_mode"];
|
||||
if (var != Variant()) {
|
||||
ScriptNetData nd;
|
||||
MultiplayerAPI::RPCConfig nd;
|
||||
nd.name = mi.name;
|
||||
nd.mode = MultiplayerAPI::RPCMode(int(var));
|
||||
nd.rpc_mode = MultiplayerAPI::RPCMode(int(var));
|
||||
// TODO Transfer Channel
|
||||
if (_rpc_methods.find(nd) == -1) {
|
||||
_rpc_methods.push_back(nd);
|
||||
}
|
||||
@@ -334,7 +334,7 @@ Error PluginScript::reload(bool p_keep_state) {
|
||||
}
|
||||
|
||||
// Sort so we are 100% that they are always the same.
|
||||
_rpc_methods.sort_custom<SortNetData>();
|
||||
_rpc_methods.sort_custom<MultiplayerAPI::SortRPCConfig>();
|
||||
|
||||
Array *signals = (Array *)&manifest.signals;
|
||||
for (int i = 0; i < signals->size(); ++i) {
|
||||
@@ -348,21 +348,8 @@ Error PluginScript::reload(bool p_keep_state) {
|
||||
PropertyInfo pi = PropertyInfo::from_dict(v);
|
||||
_properties_info[pi.name] = pi;
|
||||
_properties_default_values[pi.name] = v["default_value"];
|
||||
// rset_mode is passed as an optional field and is not part of PropertyInfo
|
||||
Variant var = v["rset_mode"];
|
||||
if (var != Variant()) {
|
||||
ScriptNetData nd;
|
||||
nd.name = pi.name;
|
||||
nd.mode = MultiplayerAPI::RPCMode(int(var));
|
||||
if (_rpc_variables.find(nd) == -1) {
|
||||
_rpc_variables.push_back(nd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sort so we are 100% that they are always the same.
|
||||
_rpc_variables.sort_custom<SortNetData>();
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
/*for (Set<PlaceHolderScriptInstance*>::Element *E=placeholders.front();E;E=E->next()) {
|
||||
|
||||
@@ -486,76 +473,10 @@ int PluginScript::get_member_line(const StringName &p_member) const {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> PluginScript::get_rpc_methods() const {
|
||||
const Vector<MultiplayerAPI::RPCConfig> PluginScript::get_rpc_methods() const {
|
||||
return _rpc_methods;
|
||||
}
|
||||
|
||||
uint16_t PluginScript::get_rpc_method_id(const StringName &p_method) const {
|
||||
ASSERT_SCRIPT_VALID_V(UINT16_MAX);
|
||||
for (int i = 0; i < _rpc_methods.size(); i++) {
|
||||
if (_rpc_methods[i].name == p_method) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return UINT16_MAX;
|
||||
}
|
||||
|
||||
StringName PluginScript::get_rpc_method(const uint16_t p_rpc_method_id) const {
|
||||
ASSERT_SCRIPT_VALID_V(StringName());
|
||||
if (p_rpc_method_id >= _rpc_methods.size()) {
|
||||
return StringName();
|
||||
}
|
||||
return _rpc_methods[p_rpc_method_id].name;
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode PluginScript::get_rpc_mode_by_id(const uint16_t p_rpc_method_id) const {
|
||||
ASSERT_SCRIPT_VALID_V(MultiplayerAPI::RPC_MODE_DISABLED);
|
||||
if (p_rpc_method_id >= _rpc_methods.size()) {
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
}
|
||||
return _rpc_methods[p_rpc_method_id].mode;
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode PluginScript::get_rpc_mode(const StringName &p_method) const {
|
||||
ASSERT_SCRIPT_VALID_V(MultiplayerAPI::RPC_MODE_DISABLED);
|
||||
return get_rpc_mode_by_id(get_rpc_method_id(p_method));
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> PluginScript::get_rset_properties() const {
|
||||
return _rpc_variables;
|
||||
}
|
||||
|
||||
uint16_t PluginScript::get_rset_property_id(const StringName &p_property) const {
|
||||
ASSERT_SCRIPT_VALID_V(UINT16_MAX);
|
||||
for (int i = 0; i < _rpc_variables.size(); i++) {
|
||||
if (_rpc_variables[i].name == p_property) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return UINT16_MAX;
|
||||
}
|
||||
|
||||
StringName PluginScript::get_rset_property(const uint16_t p_rset_property_id) const {
|
||||
ASSERT_SCRIPT_VALID_V(StringName());
|
||||
if (p_rset_property_id >= _rpc_variables.size()) {
|
||||
return StringName();
|
||||
}
|
||||
return _rpc_variables[p_rset_property_id].name;
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode PluginScript::get_rset_mode_by_id(const uint16_t p_rset_property_id) const {
|
||||
ASSERT_SCRIPT_VALID_V(MultiplayerAPI::RPC_MODE_DISABLED);
|
||||
if (p_rset_property_id >= _rpc_variables.size()) {
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
}
|
||||
return _rpc_variables[p_rset_property_id].mode;
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode PluginScript::get_rset_mode(const StringName &p_variable) const {
|
||||
ASSERT_SCRIPT_VALID_V(MultiplayerAPI::RPC_MODE_DISABLED);
|
||||
return get_rset_mode_by_id(get_rset_property_id(p_variable));
|
||||
}
|
||||
|
||||
PluginScript::PluginScript() :
|
||||
_script_list(this) {
|
||||
}
|
||||
|
||||
@@ -61,8 +61,7 @@ private:
|
||||
Map<StringName, PropertyInfo> _properties_info;
|
||||
Map<StringName, MethodInfo> _signals_info;
|
||||
Map<StringName, MethodInfo> _methods_info;
|
||||
Vector<ScriptNetData> _rpc_methods;
|
||||
Vector<ScriptNetData> _rpc_variables;
|
||||
Vector<MultiplayerAPI::RPCConfig> _rpc_methods;
|
||||
|
||||
Set<Object *> _instances;
|
||||
//exported members
|
||||
@@ -137,17 +136,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;
|
||||
|
||||
PluginScript();
|
||||
void init(PluginScriptLanguage *language);
|
||||
|
||||
Reference in New Issue
Block a user