You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
[Net] Modularize multiplayer, expose MultiplayerAPI to extensions.
- RPC configurations are now dictionaries. - Script.get_rpc_methods renamed to Script.get_rpc_config. - Node.rpc[_id] and Callable.rpc now return an Error. - Refactor MultiplayerAPI to allow extension. - New MultiplayerAPI.rpc method with Array argument (for scripts). - Move the default MultiplayerAPI implementation to a module.
This commit is contained in:
@@ -954,8 +954,8 @@ void GDScript::get_members(HashSet<StringName> *p_members) {
|
||||
}
|
||||
}
|
||||
|
||||
const Vector<Multiplayer::RPCConfig> GDScript::get_rpc_methods() const {
|
||||
return rpc_functions;
|
||||
const Variant GDScript::get_rpc_config() const {
|
||||
return rpc_config;
|
||||
}
|
||||
|
||||
Variant GDScript::callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
|
||||
@@ -1212,9 +1212,9 @@ 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_config.clear();
|
||||
if (base.is_valid()) {
|
||||
rpc_functions = base->rpc_functions;
|
||||
rpc_config = base->rpc_config.duplicate();
|
||||
}
|
||||
|
||||
GDScript *cscript = this;
|
||||
@@ -1222,12 +1222,9 @@ void GDScript::_init_rpc_methods_properties() {
|
||||
while (cscript) {
|
||||
// RPC Methods
|
||||
for (KeyValue<StringName, GDScriptFunction *> &E : cscript->member_functions) {
|
||||
Multiplayer::RPCConfig config = E.value->get_rpc_config();
|
||||
if (config.rpc_mode != Multiplayer::RPC_MODE_DISABLED) {
|
||||
config.name = E.value->get_name();
|
||||
if (rpc_functions.find(config) == -1) {
|
||||
rpc_functions.push_back(config);
|
||||
}
|
||||
Variant config = E.value->get_rpc_config();
|
||||
if (config.get_type() != Variant::NIL) {
|
||||
rpc_config[E.value->get_name()] = config;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1241,9 +1238,6 @@ void GDScript::_init_rpc_methods_properties() {
|
||||
cscript = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
// Sort so we are 100% that they are always the same.
|
||||
rpc_functions.sort_custom<Multiplayer::SortRPCConfig>();
|
||||
}
|
||||
|
||||
GDScript::~GDScript() {
|
||||
@@ -1408,9 +1402,7 @@ bool GDScriptInstance::get(const StringName &p_name, Variant &r_ret) const {
|
||||
while (sl) {
|
||||
HashMap<StringName, GDScriptFunction *>::ConstIterator E = sl->member_functions.find(p_name);
|
||||
if (E) {
|
||||
Multiplayer::RPCConfig config;
|
||||
config.name = p_name;
|
||||
if (sptr->rpc_functions.find(config) != -1) {
|
||||
if (sptr->rpc_config.has(p_name)) {
|
||||
r_ret = Callable(memnew(GDScriptRPCCallable(this->owner, E->key)));
|
||||
} else {
|
||||
r_ret = Callable(this->owner, E->key);
|
||||
@@ -1629,8 +1621,8 @@ ScriptLanguage *GDScriptInstance::get_language() {
|
||||
return GDScriptLanguage::get_singleton();
|
||||
}
|
||||
|
||||
const Vector<Multiplayer::RPCConfig> GDScriptInstance::get_rpc_methods() const {
|
||||
return script->get_rpc_methods();
|
||||
const Variant GDScriptInstance::get_rpc_config() const {
|
||||
return script->get_rpc_config();
|
||||
}
|
||||
|
||||
void GDScriptInstance::reload_members() {
|
||||
|
||||
Reference in New Issue
Block a user