|
@@ -3399,41 +3399,35 @@ bool GDScriptParser::network_annotations(const AnnotationNode *p_annotation, Nod
|
|
|
|
|
|
MultiplayerAPI::RPCConfig rpc_config;
|
|
|
rpc_config.rpc_mode = t_mode;
|
|
|
- for (int i = 0; i < p_annotation->resolved_arguments.size(); i++) {
|
|
|
- if (i == 0) {
|
|
|
+ if (p_annotation->resolved_arguments.size()) {
|
|
|
+ int last = p_annotation->resolved_arguments.size() - 1;
|
|
|
+ if (p_annotation->resolved_arguments[last].get_type() == Variant::INT) {
|
|
|
+ rpc_config.channel = p_annotation->resolved_arguments[last].operator int();
|
|
|
+ last -= 1;
|
|
|
+ }
|
|
|
+ if (last > 3) {
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ for (int i = last; i >= 0; i--) {
|
|
|
String mode = p_annotation->resolved_arguments[i].operator String();
|
|
|
if (mode == "any") {
|
|
|
rpc_config.rpc_mode = MultiplayerAPI::RPC_MODE_ANY;
|
|
|
} else if (mode == "auth") {
|
|
|
rpc_config.rpc_mode = MultiplayerAPI::RPC_MODE_AUTHORITY;
|
|
|
- } else {
|
|
|
- push_error(R"(Invalid RPC mode. Must be one of: 'any' or 'auth')", p_annotation);
|
|
|
- return false;
|
|
|
- }
|
|
|
- } else if (i == 1) {
|
|
|
- String sync = p_annotation->resolved_arguments[i].operator String();
|
|
|
- if (sync == "sync") {
|
|
|
+ } else if (mode == "sync") {
|
|
|
rpc_config.sync = true;
|
|
|
- } else if (sync == "nosync") {
|
|
|
+ } else if (mode == "nosync") {
|
|
|
rpc_config.sync = false;
|
|
|
- } else {
|
|
|
- push_error(R"(Invalid RPC sync mode. Must be one of: 'sync' or 'nosync')", p_annotation);
|
|
|
- return false;
|
|
|
- }
|
|
|
- } else if (i == 2) {
|
|
|
- String mode = p_annotation->resolved_arguments[i].operator String();
|
|
|
- if (mode == "reliable") {
|
|
|
+ } else if (mode == "reliable") {
|
|
|
rpc_config.transfer_mode = MultiplayerPeer::TRANSFER_MODE_RELIABLE;
|
|
|
} else if (mode == "unreliable") {
|
|
|
rpc_config.transfer_mode = MultiplayerPeer::TRANSFER_MODE_UNRELIABLE;
|
|
|
} else if (mode == "ordered") {
|
|
|
rpc_config.transfer_mode = MultiplayerPeer::TRANSFER_MODE_UNRELIABLE_ORDERED;
|
|
|
} else {
|
|
|
- push_error(R"(Invalid RPC transfer mode. Must be one of: 'reliable', 'unreliable', 'ordered')", p_annotation);
|
|
|
- return false;
|
|
|
+ push_error(R"(Invalid RPC argument. Must be one of: 'sync'/'nosync' (local calls), 'any'/'auth' (permission), 'reliable'/'unreliable'/'ordered' (transfer mode).)", p_annotation);
|
|
|
}
|
|
|
- } else if (i == 3) {
|
|
|
- rpc_config.channel = p_annotation->resolved_arguments[i].operator int();
|
|
|
}
|
|
|
}
|
|
|
switch (p_node->type) {
|