Generates the rpc and rset info for exported GDScript.
Improved the send rpc log message when fail. This work has been kindly sponsored by IMVU.
This commit is contained in:
parent
ed0f1940cb
commit
33ae58710b
3 changed files with 55 additions and 47 deletions
|
@ -863,7 +863,8 @@ void MultiplayerAPI::_send_rpc(Node *p_from, int p_to, bool p_unreliable, bool p
|
|||
if (method_id == UINT16_MAX && p_from->get_script_instance()) {
|
||||
method_id = p_from->get_script_instance()->get_rpc_method_id(p_name);
|
||||
}
|
||||
ERR_FAIL_COND_MSG(method_id == UINT16_MAX, "Unable to take the `method_id` for the function:" + p_name + ". this can happen only if this method is not marked as `remote`.");
|
||||
ERR_FAIL_COND_MSG(method_id == UINT16_MAX,
|
||||
vformat("Unable to take the `method_id` for the function \"%s\" at path: \"%s\". This happens when the method is not marked as `remote`.", p_name, p_from->get_path()));
|
||||
|
||||
if (method_id <= UINT8_MAX) {
|
||||
// The ID fits in 1 byte
|
||||
|
|
|
@ -613,52 +613,7 @@ Error GDScript::reload(bool p_keep_state) {
|
|||
_set_subclass_path(E->get(), path);
|
||||
}
|
||||
|
||||
// Copy the base rpc methods so we don't mask their IDs.
|
||||
rpc_functions.clear();
|
||||
rpc_variables.clear();
|
||||
if (base.is_valid()) {
|
||||
rpc_functions = base->rpc_functions;
|
||||
rpc_variables = base->rpc_variables;
|
||||
}
|
||||
|
||||
GDScript *cscript = this;
|
||||
Map<StringName, Ref<GDScript> >::Element *sub_E = subclasses.front();
|
||||
while (cscript) {
|
||||
// RPC Methods
|
||||
for (Map<StringName, GDScriptFunction *>::Element *E = cscript->member_functions.front(); E; E = E->next()) {
|
||||
if (E->get()->get_rpc_mode() != MultiplayerAPI::RPC_MODE_DISABLED) {
|
||||
ScriptNetData nd;
|
||||
nd.name = E->key();
|
||||
nd.mode = E->get()->get_rpc_mode();
|
||||
if (-1 == rpc_functions.find(nd)) {
|
||||
rpc_functions.push_back(nd);
|
||||
}
|
||||
}
|
||||
}
|
||||
// RSet
|
||||
for (Map<StringName, MemberInfo>::Element *E = cscript->member_indices.front(); E; E = E->next()) {
|
||||
if (E->get().rpc_mode != MultiplayerAPI::RPC_MODE_DISABLED) {
|
||||
ScriptNetData nd;
|
||||
nd.name = E->key();
|
||||
nd.mode = E->get().rpc_mode;
|
||||
if (-1 == rpc_variables.find(nd)) {
|
||||
rpc_variables.push_back(nd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (cscript != this)
|
||||
sub_E = sub_E->next();
|
||||
|
||||
if (sub_E)
|
||||
cscript = sub_E->get().ptr();
|
||||
else
|
||||
cscript = NULL;
|
||||
}
|
||||
|
||||
// Sort so we are 100% that they are always the same.
|
||||
rpc_functions.sort_custom<SortNetData>();
|
||||
rpc_variables.sort_custom<SortNetData>();
|
||||
_init_rpc_methods_properties();
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
@ -897,6 +852,8 @@ Error GDScript::load_byte_code(const String &p_path) {
|
|||
_set_subclass_path(E->get(), path);
|
||||
}
|
||||
|
||||
_init_rpc_methods_properties();
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
@ -1049,6 +1006,55 @@ void GDScript::_save_orphaned_subclasses() {
|
|||
}
|
||||
}
|
||||
|
||||
void GDScript::_init_rpc_methods_properties() {
|
||||
// Copy the base rpc methods so we don't mask their IDs.
|
||||
rpc_functions.clear();
|
||||
rpc_variables.clear();
|
||||
if (base.is_valid()) {
|
||||
rpc_functions = base->rpc_functions;
|
||||
rpc_variables = base->rpc_variables;
|
||||
}
|
||||
|
||||
GDScript *cscript = this;
|
||||
Map<StringName, Ref<GDScript> >::Element *sub_E = subclasses.front();
|
||||
while (cscript) {
|
||||
// RPC Methods
|
||||
for (Map<StringName, GDScriptFunction *>::Element *E = cscript->member_functions.front(); E; E = E->next()) {
|
||||
if (E->get()->get_rpc_mode() != MultiplayerAPI::RPC_MODE_DISABLED) {
|
||||
ScriptNetData nd;
|
||||
nd.name = E->key();
|
||||
nd.mode = E->get()->get_rpc_mode();
|
||||
if (-1 == rpc_functions.find(nd)) {
|
||||
rpc_functions.push_back(nd);
|
||||
}
|
||||
}
|
||||
}
|
||||
// RSet
|
||||
for (Map<StringName, MemberInfo>::Element *E = cscript->member_indices.front(); E; E = E->next()) {
|
||||
if (E->get().rpc_mode != MultiplayerAPI::RPC_MODE_DISABLED) {
|
||||
ScriptNetData nd;
|
||||
nd.name = E->key();
|
||||
nd.mode = E->get().rpc_mode;
|
||||
if (-1 == rpc_variables.find(nd)) {
|
||||
rpc_variables.push_back(nd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (cscript != this)
|
||||
sub_E = sub_E->next();
|
||||
|
||||
if (sub_E)
|
||||
cscript = sub_E->get().ptr();
|
||||
else
|
||||
cscript = NULL;
|
||||
}
|
||||
|
||||
// Sort so we are 100% that they are always the same.
|
||||
rpc_functions.sort_custom<SortNetData>();
|
||||
rpc_variables.sort_custom<SortNetData>();
|
||||
}
|
||||
|
||||
GDScript::~GDScript() {
|
||||
for (Map<StringName, GDScriptFunction *>::Element *E = member_functions.front(); E; E = E->next()) {
|
||||
memdelete(E->get());
|
||||
|
|
|
@ -134,6 +134,7 @@ class GDScript : public Script {
|
|||
bool _update_exports();
|
||||
|
||||
void _save_orphaned_subclasses();
|
||||
void _init_rpc_methods_properties();
|
||||
|
||||
protected:
|
||||
bool _get(const StringName &p_name, Variant &r_ret) const;
|
||||
|
|
Loading…
Reference in a new issue