mirror of
				https://github.com/godotengine/godot.git
				synced 2025-11-03 23:21:15 +00:00 
			
		
		
		
	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
				
			
		| 
						 | 
				
			
			@ -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());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue