|
@@ -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;
|