mirror of
https://github.com/godotengine/godot.git
synced 2025-10-25 02:43:29 +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:
parent
0aabfb341a
commit
d779b5aa3e
23 changed files with 251 additions and 1545 deletions
|
|
@ -415,245 +415,11 @@ void NativeScript::get_script_property_list(List<PropertyInfo> *p_list) const {
|
|||
}
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> NativeScript::get_rpc_methods() const {
|
||||
Vector<ScriptNetData> v;
|
||||
|
||||
const Vector<MultiplayerAPI::RPCConfig> NativeScript::get_rpc_methods() const {
|
||||
NativeScriptDesc *script_data = get_script_desc();
|
||||
ERR_FAIL_COND_V(!script_data, Vector<MultiplayerAPI::RPCConfig>());
|
||||
|
||||
while (script_data) {
|
||||
for (Map<StringName, NativeScriptDesc::Method>::Element *E = script_data->methods.front(); E; E = E->next()) {
|
||||
if (E->get().rpc_mode != GODOT_METHOD_RPC_MODE_DISABLED) {
|
||||
ScriptNetData nd;
|
||||
nd.name = E->key();
|
||||
nd.mode = MultiplayerAPI::RPCMode(E->get().rpc_mode);
|
||||
v.push_back(nd);
|
||||
}
|
||||
}
|
||||
|
||||
script_data = script_data->base_data;
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
uint16_t NativeScript::get_rpc_method_id(const StringName &p_method) const {
|
||||
NativeScriptDesc *script_data = get_script_desc();
|
||||
|
||||
while (script_data) {
|
||||
Map<StringName, NativeScriptDesc::Method>::Element *E = script_data->methods.find(p_method);
|
||||
if (E) {
|
||||
return E->get().rpc_method_id;
|
||||
}
|
||||
|
||||
script_data = script_data->base_data;
|
||||
}
|
||||
|
||||
return UINT16_MAX;
|
||||
}
|
||||
|
||||
StringName NativeScript::get_rpc_method(uint16_t p_id) const {
|
||||
ERR_FAIL_COND_V(p_id == UINT16_MAX, StringName());
|
||||
|
||||
NativeScriptDesc *script_data = get_script_desc();
|
||||
|
||||
while (script_data) {
|
||||
for (Map<StringName, NativeScriptDesc::Method>::Element *E = script_data->methods.front(); E; E = E->next()) {
|
||||
if (E->get().rpc_method_id == p_id) {
|
||||
return E->key();
|
||||
}
|
||||
}
|
||||
|
||||
script_data = script_data->base_data;
|
||||
}
|
||||
|
||||
return StringName();
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode NativeScript::get_rpc_mode_by_id(uint16_t p_id) const {
|
||||
ERR_FAIL_COND_V(p_id == UINT16_MAX, MultiplayerAPI::RPC_MODE_DISABLED);
|
||||
|
||||
NativeScriptDesc *script_data = get_script_desc();
|
||||
|
||||
while (script_data) {
|
||||
for (Map<StringName, NativeScriptDesc::Method>::Element *E = script_data->methods.front(); E; E = E->next()) {
|
||||
if (E->get().rpc_method_id == p_id) {
|
||||
switch (E->get().rpc_mode) {
|
||||
case GODOT_METHOD_RPC_MODE_DISABLED:
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
case GODOT_METHOD_RPC_MODE_REMOTE:
|
||||
return MultiplayerAPI::RPC_MODE_REMOTE;
|
||||
case GODOT_METHOD_RPC_MODE_MASTER:
|
||||
return MultiplayerAPI::RPC_MODE_MASTER;
|
||||
case GODOT_METHOD_RPC_MODE_PUPPET:
|
||||
return MultiplayerAPI::RPC_MODE_PUPPET;
|
||||
case GODOT_METHOD_RPC_MODE_REMOTESYNC:
|
||||
return MultiplayerAPI::RPC_MODE_REMOTESYNC;
|
||||
case GODOT_METHOD_RPC_MODE_MASTERSYNC:
|
||||
return MultiplayerAPI::RPC_MODE_MASTERSYNC;
|
||||
case GODOT_METHOD_RPC_MODE_PUPPETSYNC:
|
||||
return MultiplayerAPI::RPC_MODE_PUPPETSYNC;
|
||||
default:
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
script_data = script_data->base_data;
|
||||
}
|
||||
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode NativeScript::get_rpc_mode(const StringName &p_method) const {
|
||||
NativeScriptDesc *script_data = get_script_desc();
|
||||
|
||||
while (script_data) {
|
||||
Map<StringName, NativeScriptDesc::Method>::Element *E = script_data->methods.find(p_method);
|
||||
if (E) {
|
||||
switch (E->get().rpc_mode) {
|
||||
case GODOT_METHOD_RPC_MODE_DISABLED:
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
case GODOT_METHOD_RPC_MODE_REMOTE:
|
||||
return MultiplayerAPI::RPC_MODE_REMOTE;
|
||||
case GODOT_METHOD_RPC_MODE_MASTER:
|
||||
return MultiplayerAPI::RPC_MODE_MASTER;
|
||||
case GODOT_METHOD_RPC_MODE_PUPPET:
|
||||
return MultiplayerAPI::RPC_MODE_PUPPET;
|
||||
case GODOT_METHOD_RPC_MODE_REMOTESYNC:
|
||||
return MultiplayerAPI::RPC_MODE_REMOTESYNC;
|
||||
case GODOT_METHOD_RPC_MODE_MASTERSYNC:
|
||||
return MultiplayerAPI::RPC_MODE_MASTERSYNC;
|
||||
case GODOT_METHOD_RPC_MODE_PUPPETSYNC:
|
||||
return MultiplayerAPI::RPC_MODE_PUPPETSYNC;
|
||||
default:
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
}
|
||||
}
|
||||
|
||||
script_data = script_data->base_data;
|
||||
}
|
||||
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> NativeScript::get_rset_properties() const {
|
||||
Vector<ScriptNetData> v;
|
||||
|
||||
NativeScriptDesc *script_data = get_script_desc();
|
||||
|
||||
while (script_data) {
|
||||
for (OrderedHashMap<StringName, NativeScriptDesc::Property>::Element E = script_data->properties.front(); E; E = E.next()) {
|
||||
if (E.get().rset_mode != GODOT_METHOD_RPC_MODE_DISABLED) {
|
||||
ScriptNetData nd;
|
||||
nd.name = E.key();
|
||||
nd.mode = MultiplayerAPI::RPCMode(E.get().rset_mode);
|
||||
v.push_back(nd);
|
||||
}
|
||||
}
|
||||
script_data = script_data->base_data;
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
uint16_t NativeScript::get_rset_property_id(const StringName &p_variable) const {
|
||||
NativeScriptDesc *script_data = get_script_desc();
|
||||
|
||||
while (script_data) {
|
||||
OrderedHashMap<StringName, NativeScriptDesc::Property>::Element E = script_data->properties.find(p_variable);
|
||||
if (E) {
|
||||
return E.get().rset_property_id;
|
||||
}
|
||||
|
||||
script_data = script_data->base_data;
|
||||
}
|
||||
|
||||
return UINT16_MAX;
|
||||
}
|
||||
|
||||
StringName NativeScript::get_rset_property(uint16_t p_id) const {
|
||||
ERR_FAIL_COND_V(p_id == UINT16_MAX, StringName());
|
||||
|
||||
NativeScriptDesc *script_data = get_script_desc();
|
||||
|
||||
while (script_data) {
|
||||
for (OrderedHashMap<StringName, NativeScriptDesc::Property>::Element E = script_data->properties.front(); E; E = E.next()) {
|
||||
if (E.get().rset_property_id == p_id) {
|
||||
return E.key();
|
||||
}
|
||||
}
|
||||
|
||||
script_data = script_data->base_data;
|
||||
}
|
||||
|
||||
return StringName();
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode NativeScript::get_rset_mode_by_id(uint16_t p_id) const {
|
||||
ERR_FAIL_COND_V(p_id == UINT16_MAX, MultiplayerAPI::RPC_MODE_DISABLED);
|
||||
|
||||
NativeScriptDesc *script_data = get_script_desc();
|
||||
|
||||
while (script_data) {
|
||||
for (OrderedHashMap<StringName, NativeScriptDesc::Property>::Element E = script_data->properties.front(); E; E = E.next()) {
|
||||
if (E.get().rset_property_id == p_id) {
|
||||
switch (E.get().rset_mode) {
|
||||
case GODOT_METHOD_RPC_MODE_DISABLED:
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
case GODOT_METHOD_RPC_MODE_REMOTE:
|
||||
return MultiplayerAPI::RPC_MODE_REMOTE;
|
||||
case GODOT_METHOD_RPC_MODE_MASTER:
|
||||
return MultiplayerAPI::RPC_MODE_MASTER;
|
||||
case GODOT_METHOD_RPC_MODE_PUPPET:
|
||||
return MultiplayerAPI::RPC_MODE_PUPPET;
|
||||
case GODOT_METHOD_RPC_MODE_REMOTESYNC:
|
||||
return MultiplayerAPI::RPC_MODE_REMOTESYNC;
|
||||
case GODOT_METHOD_RPC_MODE_MASTERSYNC:
|
||||
return MultiplayerAPI::RPC_MODE_MASTERSYNC;
|
||||
case GODOT_METHOD_RPC_MODE_PUPPETSYNC:
|
||||
return MultiplayerAPI::RPC_MODE_PUPPETSYNC;
|
||||
default:
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
script_data = script_data->base_data;
|
||||
}
|
||||
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode NativeScript::get_rset_mode(const StringName &p_variable) const {
|
||||
NativeScriptDesc *script_data = get_script_desc();
|
||||
|
||||
while (script_data) {
|
||||
OrderedHashMap<StringName, NativeScriptDesc::Property>::Element E = script_data->properties.find(p_variable);
|
||||
if (E) {
|
||||
switch (E.get().rset_mode) {
|
||||
case GODOT_METHOD_RPC_MODE_DISABLED:
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
case GODOT_METHOD_RPC_MODE_REMOTE:
|
||||
return MultiplayerAPI::RPC_MODE_REMOTE;
|
||||
case GODOT_METHOD_RPC_MODE_MASTER:
|
||||
return MultiplayerAPI::RPC_MODE_MASTER;
|
||||
case GODOT_METHOD_RPC_MODE_PUPPET:
|
||||
return MultiplayerAPI::RPC_MODE_PUPPET;
|
||||
case GODOT_METHOD_RPC_MODE_REMOTESYNC:
|
||||
return MultiplayerAPI::RPC_MODE_REMOTESYNC;
|
||||
case GODOT_METHOD_RPC_MODE_MASTERSYNC:
|
||||
return MultiplayerAPI::RPC_MODE_MASTERSYNC;
|
||||
case GODOT_METHOD_RPC_MODE_PUPPETSYNC:
|
||||
return MultiplayerAPI::RPC_MODE_PUPPETSYNC;
|
||||
default:
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
}
|
||||
}
|
||||
|
||||
script_data = script_data->base_data;
|
||||
}
|
||||
|
||||
return MultiplayerAPI::RPC_MODE_DISABLED;
|
||||
return script_data->rpc_methods;
|
||||
}
|
||||
|
||||
String NativeScript::get_class_documentation() const {
|
||||
|
|
@ -1046,46 +812,10 @@ Ref<Script> NativeScriptInstance::get_script() const {
|
|||
return script;
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> NativeScriptInstance::get_rpc_methods() const {
|
||||
const Vector<MultiplayerAPI::RPCConfig> NativeScriptInstance::get_rpc_methods() const {
|
||||
return script->get_rpc_methods();
|
||||
}
|
||||
|
||||
uint16_t NativeScriptInstance::get_rpc_method_id(const StringName &p_method) const {
|
||||
return script->get_rpc_method_id(p_method);
|
||||
}
|
||||
|
||||
StringName NativeScriptInstance::get_rpc_method(uint16_t p_id) const {
|
||||
return script->get_rpc_method(p_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode NativeScriptInstance::get_rpc_mode_by_id(uint16_t p_id) const {
|
||||
return script->get_rpc_mode_by_id(p_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode NativeScriptInstance::get_rpc_mode(const StringName &p_method) const {
|
||||
return script->get_rpc_mode(p_method);
|
||||
}
|
||||
|
||||
Vector<ScriptNetData> NativeScriptInstance::get_rset_properties() const {
|
||||
return script->get_rset_properties();
|
||||
}
|
||||
|
||||
uint16_t NativeScriptInstance::get_rset_property_id(const StringName &p_variable) const {
|
||||
return script->get_rset_property_id(p_variable);
|
||||
}
|
||||
|
||||
StringName NativeScriptInstance::get_rset_property(uint16_t p_id) const {
|
||||
return script->get_rset_property(p_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode NativeScriptInstance::get_rset_mode_by_id(uint16_t p_id) const {
|
||||
return script->get_rset_mode_by_id(p_id);
|
||||
}
|
||||
|
||||
MultiplayerAPI::RPCMode NativeScriptInstance::get_rset_mode(const StringName &p_variable) const {
|
||||
return script->get_rset_mode(p_variable);
|
||||
}
|
||||
|
||||
ScriptLanguage *NativeScriptInstance::get_language() {
|
||||
return NativeScriptLanguage::get_singleton();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue