Merge pull request #72276 from dalexeev/gds-rpc-annot
GDScript: Better handling of `@rpc` annotation and autocompletion
This commit is contained in:
commit
9ad098f653
@ -666,7 +666,7 @@
|
||||
channel = 0,
|
||||
}
|
||||
[/codeblock]
|
||||
See [enum MultiplayerAPI.RPCMode] and [enum MultiplayerPeer.TransferMode]. An alternative is annotating methods and properties with the corresponding [annotation @GDScript.@rpc] annotation ([code]@rpc(any_peer)[/code], [code]@rpc(authority)[/code]). By default, methods are not exposed to networking (and RPCs).
|
||||
See [enum MultiplayerAPI.RPCMode] and [enum MultiplayerPeer.TransferMode]. An alternative is annotating methods and properties with the corresponding [annotation @GDScript.@rpc] annotation ([code]@rpc("any_peer")[/code], [code]@rpc("authority")[/code]). By default, methods are not exposed to networking (and RPCs).
|
||||
</description>
|
||||
</method>
|
||||
<method name="rpc_id" qualifiers="vararg">
|
||||
|
@ -576,10 +576,10 @@
|
||||
@rpc
|
||||
func fn(): pass
|
||||
|
||||
@rpc(any_peer, unreliable_ordered)
|
||||
@rpc("any_peer", "unreliable_ordered")
|
||||
func fn_update_pos(): pass
|
||||
|
||||
@rpc(authority, call_remote, unreliable, 0) # Equivalent to @rpc
|
||||
@rpc("authority", "call_remote", "unreliable", 0) # Equivalent to @rpc
|
||||
func fn_default(): pass
|
||||
[/codeblock]
|
||||
</description>
|
||||
|
@ -800,6 +800,15 @@ static void _find_annotation_arguments(const GDScriptParser::AnnotationNode *p_a
|
||||
warning.insert_text = warning.display.quote(p_quote_style);
|
||||
r_result.insert(warning.display, warning);
|
||||
}
|
||||
} else if (p_annotation->name == SNAME("@rpc")) {
|
||||
if (p_argument == 0 || p_argument == 1 || p_argument == 2) {
|
||||
static const char *options[7] = { "call_local", "call_remote", "any_peer", "authority", "reliable", "unreliable", "unreliable_ordered" };
|
||||
for (int i = 0; i < 7; i++) {
|
||||
ScriptLanguage::CodeCompletionOption option(options[i], ScriptLanguage::CODE_COMPLETION_KIND_PLAIN_TEXT);
|
||||
option.insert_text = option.display.quote(p_quote_style);
|
||||
r_result.insert(option.display, option);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3902,26 +3902,46 @@ bool GDScriptParser::rpc_annotation(const AnnotationNode *p_annotation, Node *p_
|
||||
push_error(R"(Invalid RPC arguments. At most 4 arguments are allowed, where only the last argument can be an integer to specify the channel.')", p_annotation);
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned char locality_args = 0;
|
||||
unsigned char permission_args = 0;
|
||||
unsigned char transfer_mode_args = 0;
|
||||
|
||||
for (int i = last; i >= 0; i--) {
|
||||
String mode = p_annotation->resolved_arguments[i].operator String();
|
||||
if (mode == "any_peer") {
|
||||
rpc_config["rpc_mode"] = MultiplayerAPI::RPC_MODE_ANY_PEER;
|
||||
} else if (mode == "authority") {
|
||||
rpc_config["rpc_mode"] = MultiplayerAPI::RPC_MODE_AUTHORITY;
|
||||
} else if (mode == "call_local") {
|
||||
String arg = p_annotation->resolved_arguments[i].operator String();
|
||||
if (arg == "call_local") {
|
||||
locality_args++;
|
||||
rpc_config["call_local"] = true;
|
||||
} else if (mode == "call_remote") {
|
||||
} else if (arg == "call_remote") {
|
||||
locality_args++;
|
||||
rpc_config["call_local"] = false;
|
||||
} else if (mode == "reliable") {
|
||||
} else if (arg == "any_peer") {
|
||||
permission_args++;
|
||||
rpc_config["rpc_mode"] = MultiplayerAPI::RPC_MODE_ANY_PEER;
|
||||
} else if (arg == "authority") {
|
||||
permission_args++;
|
||||
rpc_config["rpc_mode"] = MultiplayerAPI::RPC_MODE_AUTHORITY;
|
||||
} else if (arg == "reliable") {
|
||||
transfer_mode_args++;
|
||||
rpc_config["transfer_mode"] = MultiplayerPeer::TRANSFER_MODE_RELIABLE;
|
||||
} else if (mode == "unreliable") {
|
||||
} else if (arg == "unreliable") {
|
||||
transfer_mode_args++;
|
||||
rpc_config["transfer_mode"] = MultiplayerPeer::TRANSFER_MODE_UNRELIABLE;
|
||||
} else if (mode == "unreliable_ordered") {
|
||||
} else if (arg == "unreliable_ordered") {
|
||||
transfer_mode_args++;
|
||||
rpc_config["transfer_mode"] = MultiplayerPeer::TRANSFER_MODE_UNRELIABLE_ORDERED;
|
||||
} else {
|
||||
push_error(R"(Invalid RPC argument. Must be one of: 'call_local'/'call_remote' (local calls), 'any_peer'/'authority' (permission), 'reliable'/'unreliable'/'unreliable_ordered' (transfer mode).)", p_annotation);
|
||||
push_error(R"(Invalid RPC argument. Must be one of: "call_local"/"call_remote" (local calls), "any_peer"/"authority" (permission), "reliable"/"unreliable"/"unreliable_ordered" (transfer mode).)", p_annotation);
|
||||
}
|
||||
}
|
||||
|
||||
if (locality_args > 1) {
|
||||
push_error(R"(Invalid RPC config. The locality ("call_local"/"call_remote") must be specified no more than once.)", p_annotation);
|
||||
} else if (permission_args > 1) {
|
||||
push_error(R"(Invalid RPC config. The permission ("any_peer"/"authority") must be specified no more than once.)", p_annotation);
|
||||
} else if (transfer_mode_args > 1) {
|
||||
push_error(R"(Invalid RPC config. The transfer mode ("reliable"/"unreliable"/"unreliable_ordered") must be specified no more than once.)", p_annotation);
|
||||
}
|
||||
}
|
||||
function->rpc_config = rpc_config;
|
||||
return true;
|
||||
|
Loading…
Reference in New Issue
Block a user