|
|
(34 intermediate revisions by 6 users not shown) |
Line 1: |
Line 1: |
| {{GameCategory|arma3| Remote Execution}}
| |
| {{GameCategory|arma3|Scripting Commands}}
| |
| {{GameCategory|arma3|New Scripting Commands}}
| |
|
| |
|
| |
| {{RV|type=command | | {{RV|type=command |
|
| |
|
| | arma3 | | |game1= arma3 |
| |1.50 | | |version1= 1.50 |
| |gr1 = Multiplayer
| |
| | |
| |descr= Asks the server to execute the given function or script command on the given target machine(s). Execution always takes place in the [[Scheduler#Unscheduled_Environment|unscheduled environment]]; suspension is not allowed.<br>
| |
| Read [[Arma 3: Remote Execution]] for more information about remote execution, security features and JIP techniques.
| |
| | |
| {{Feature|Informative|Just like [[remoteExec]], [[remoteExecCall]] can be used in SP; the behaviour is the same as in MP.}}
| |
| | |
| {{Feature|important|The "Call" in [[remoteExecCall]] does not mean that the execution of the remote executed function / command will happen right away, it just means that the execution of the function / command will take place in the [[Scheduler#Unscheduled_Environment|unscheduled environment]]:
| |
| <div><code>[[remoteExecCall]] ["fnc1"]; [[call]] fnc2; {{cc|It is possible that fnc1 is executed after fnc2.}}
| |
| [[call]] fnc1; [[call]] fnc2; {{cc|fnc2 will always be executed after fnc1.}}</code></div>}}
| |
| | |
| {{Feature|Informative|The direct execution of [[call]] or [[spawn]] via [[remoteExecCall]] (or [[remoteExec]]) should be avoided to prevent issues in cases where the remote execution of [[call]] or [[spawn]] is blocked by [[Arma_3:_CfgRemoteExec|CfgRemoteExec]]. Instead it is recommended to create a function which is then excecuted by [[remoteExecCall]] (or [[remoteExec]]).}}
| |
|
| |
|
| |s1= params [[remoteExecCall]] [functionName, targets, JIP] | | |gr1= Multiplayer |
|
| |
|
| |p1= '''params''': [[Anything]] - The parameter(s) for the function / command specified in the '''functionName''' parameter. | | |descr= [[Scheduler|Unscheduled]] version of [[remoteExec]]. The only difference between [[remoteExec]] and [[remoteExecCall]] is that [[remoteExecCall]] will run '''functions''' in [[Scheduler#Unscheduled Environment|unscheduled environment]]. |
| | {{Feature|important| |
| | The "Call" in [[remoteExecCall]] only means that the remote execution will take place in [[Scheduler#Unscheduled Environment|unscheduled environment]] and does '''not''' mean it will happen right away (see {{Link|#Example 3}}).}} |
|
| |
|
| |p2= '''functionName''': [[String]] - Function or command name.<br> | | |s1= see [[remoteExec]] |
| While any function or command can be used here, only those defined in [[Arma_3:_CfgRemoteExec|CfgRemoteExec]] will actually be executed.
| |
|
| |
|
| |p3= '''targets''' (Optional, default: 0): | | |p1= see [[remoteExec]] |
| * [[Number]] (See also [[Multiplayer_Scripting#Machine_network_ID|Machine network ID]]) -
| |
| ** '''0:''' The function / command will be executed globally, i.e. on the server and every connected client, including the machine where [[remoteExecCall]] originated.
| |
| ** '''2:''' The function / command will only be executed on the server.
| |
| ** '''Other number:''' The function / command will be executed on the machine where [[clientOwner]] matches the given number.
| |
| ** '''Negative number:''' The effect is inverted: -2 means every client but not the server, -12 means the server and every client, except for the client where [[clientOwner]] returns 12.
| |
| * [[Object]] - The function / command will be executed where the given object is [[local]].
| |
| * [[String]] - Interpreted as an [[Identifier]] (variable name). The function / command will be executed where the object or group identified by the variable with the provided name is [[local]].
| |
| * [[Side]] - The function / command will be executed on machines where the player is on the specified side.
| |
| * [[Group]] - The function / command will be executed on machines where the player is in the specified group.
| |
| * [[Array]] - Array of any combination of the types listed above.
| |
|
| |
|
| |p4= '''JIP''' (Optional, default: [[false]]): | | |r1= see [[remoteExec]] |
| <br> <!-- KEEP ALL <br> TAGS IN THIS SECTION WHERE THEY ARE OR THE FORMATTING BREAKS -->
| |
| * [[Boolean]] - If [[true]], a unique JIP ID is generated and the [[remoteExecCall]] statement is added to the JIP queue from which it will be executed for every JIP.
| |
| * [[String]] -
| |
| ** If the string is empty, it is interpreted as [[false]].
| |
| ** If the string is in format "[[Number]]:[[Number]]" (e.g. "0:0"), it is interpreted as a [[netId]] (see below).
| |
| ** Else the string is treated as a custom JIP ID and the [[remoteExecCall]] statement is added to the JIP queue, replacing statements that have the same JIP ID.
| |
| * [[Object]], [[Group]] or [[netId]] - The persistent execution of the [[remoteExecCall]] statement is attached to the given object or group.<br>When the object / group is deleted, the [[remoteExecCall]] statement is automatically removed from the JIP queue.
| |
|
| |
|
| The '''JIP''' parameter can only be used if the '''targets''' parameter is 0 or a negative number.<br>See also [[#Examples|Example 3]] on how to remove statements from the JIP queue.
| | |x1= <sqf> |
| | ["hello"] remoteExec ["hint"]; // runs unscheduled |
| | ["hello"] remoteExecCall ["hint"]; // no difference at all |
| | </sqf> |
|
| |
|
| |r1= <div> | | |x2= <sqf> |
| * [[nil]] - In case of error.
| | ["my message"] remoteExec ["BIS_fnc_infoText"]; // correct |
| * [[String]] - In case of success.
| | ["my message"] remoteExecCall ["BIS_fnc_infoText"]; // wrong - BIS_fnc_infoText needs a scheduled environment, see its spawn need |
| ** If the '''JIP''' parameter was [[false]] or an empty string, the return value is "".
| | </sqf> |
| ** If the '''JIP''' parameter was [[true]] or a custom JIP ID, the JIP ID is returned.
| |
| ** If the '''JIP''' parameter was an [[Object]], a [[Group]] or a [[netId]], the (corresponding) [[netId]] is returned.</div>
| |
|
| |
|
| |s2= [[remoteExecCall]] [functionName, targets, JIP] | | |x3= <sqf> |
| | remoteExecCall ["fnc1"]; |
| | call fnc2; // fnc1 may or may not be executed after fnc2 |
|
| |
|
| |p21= '''functionName''': [[String]] - See the main syntax above for more details.
| | call fnc1; |
| | call fnc2; // fnc2 will be executed after fnc1 |
| | </sqf> |
|
| |
|
| | | |seealso= [[remoteExec]] [[remoteExecutedOwner]] [[isRemoteExecuted]] [[isRemoteExecutedJIP]] [[Arma 3: Remote Execution]] [[canSuspend]] [[BIS_fnc_MP]] [[remoteExecutedJIPID]] |
| |p22= '''targets''' (Optional, default: 0): [[Number]], [[Object]], [[String]], [[Side]], [[Group]] or [[Array]] - See the main syntax above for more details.
| |
| | |
| | |
| |p23= '''JIP''' (Optional, default: [[false]]): [[Boolean]], [[String]], [[Object]], [[Group]] or [[netId]] - See the main syntax above for more details.
| |
| | |
| | |
| |r2= [[nil]] or [[String]] - See the main syntax above for more details.
| |
| | |
| <!-- Please try to avoid placing links within strings in these examples. -->
| |
| |x1= Execute {{Inline code|[[hint]] "Example 1";}} on various machines:
| |
| <code>"Example 1" [[remoteExecCall]] ["hint"]; {{cc|Executed on all machines.}}
| |
| "Example 1" [[remoteExecCall]] ["hint", 3]; {{cc|Executed only on the first connected client.}}
| |
| "Example 1" [[remoteExecCall]] ["hint", -2]; {{cc|Executed everywhere except on the server.}}</code>
| |
| | |
| |x2= Execute {{Inline code|[[hint]] "Example 2";}} on various machines and add it to the JIP queue:
| |
| <code>_result = "Example 2" [[remoteExecCall]] ["hint", -2, [[true]]]; {{cc|_result is a unique JIP ID, e.g. "3_1".}}
| |
| _result = "Example 2" [[remoteExecCall]] ["hint", -2, "My_JIP_ID"]; {{cc|_result is "My_JIP_ID".}}
| |
| _result = "Example 2" [[remoteExecCall]] ["hint", 0, MyObject]; {{cc|_result is the unique [[netId]] of MyObject, e.g. "2:3".}}</code>
| |
| Note that if there already was a statement with the JIP ID "My_JIP_ID" in the JIP queue, that statement has now been overwritten.
| |
| | |
| |x3= <!-- This example is referenced in the Syntax section! -->
| |
| Remove statements from the JIP queue:
| |
| <code>[[remoteExecCall]] ["", "My_JIP_ID"]; {{cc|The persistent statement with the JIP ID "My_JIP_ID" is removed from the JIP queue.}}
| |
| [[remoteExecCall]] ["", MyObject]; {{cc|The persistent statement attached to MyObject is removed from the JIP queue.}}</code>
| |
| | |
| |x4= Some more complex examples:
| |
| <code>["Open", [[true]]] [[remoteExecCall]] ["BIS_fnc_arsenal", MyTargetPlayer];
| |
| [MyCurator, [[MyObject1, MyObject2], [[false]]]] [[remoteExecCall]] ["addCuratorEditableObjects", 2];</code>
| |
| | |
| |x5= A tricky example: Trying to execute {{Inline code|[[player]] [[setAmmo]] [<nowiki/>[[primaryWeapon]] [[player]], 1];}} (on machines where the player is in MyGroup). Consider the following statements:
| |
| <code>{[[player]] [[setAmmo]] [<nowiki/>[[primaryWeapon]] [[player]], 1];} [[remoteExecCall]] ["call", MyGroup]; {{cc|Statement 1}}
| |
| <nowiki>[</nowiki>[[player]], [<nowiki/>[[primaryWeapon]] [[player]], 1]] [[remoteExecCall]] ["setAmmo", MyGroup]; {{cc|Statement 2}}</code>
| |
| Both statements look very similar, but only Statement 1 has the intended effect. This is because in Statement 2, the arguments {{Inline code|[[player]]}} and {{Inline code|[[primaryWeapon]] [[player]]}} are not resolved on the target machine(s), but on the machine executing [[remoteExecCall]].
| |
| | |
| |seealso= | |
| [[remoteExec]] [[remoteExecutedOwner]] [[isRemoteExecuted]] [[isRemoteExecutedJIP]] [[Arma 3: Remote Execution]] [[canSuspend]] [[BIS_fnc_MP]] | |
| }} | | }} |
|
| |
|
| <!-- CONTINUE Notes -->
| |
| <dl class="command_description">
| |
| <dd class="notedate">Posted on July 16, 2015 - 09:17 (UTC)</dd>
| |
| <dt class="note">[[User:Killzone Kid|Killzone Kid]]</dt>
| |
| <dd class="note">
| |
| Removal of persistent call must be in the following format <no argument> [[remoteExecCall]] [<empty string>, <JIP id>]. For example:
| |
| <code>[[remoteExecCall]] ["", "5:8"];</code>
| |
| </dd>
| |
|
| |
| <dd class="notedate">Posted on December 29, 2015 - 20:31 (UTC)</dd>
| |
| <dt class="note">[[User:AgentRevolution|AgentRev]]</dt>
| |
| <dd class="note">
| |
| [[remoteExec]] and [[remoteExecCall]] are currently filtered by BattlEye's remoteexec.txt, the string analyzed by BE is formatted the same way as the following example's output:
| |
| <code>[[format]] ["%1 %2", functionName, [[str]] params]</code>
| |
| If [[CfgRemoteExec]] <tt>class Functions</tt> is set to <tt>mode = 1;</tt>, the following remoteexec.txt exclusion can be used to safely allow all whitelisted *_fnc_* functions taking an array as parameter to go through:
| |
| <code>!="\w+?_fnc_\w+? \[[\S\s]*\]"</code>
| |
| Any attempt to exploit this exclusion using other RE methods like [[createUnit]] will run into "Error Missing ;" without any malicious code being executed. Mod makers should refrain from remote-executing raw commands from clients, as they require individual exclusions, and instead use *_fnc_* functions taking an array as parameter, which are covered by the above exclusion.
| |
| </dd>
| |
|
| |
| <dd class="notedate">Posted on May 10, 2017 - 20:13 (UTC)</dd>
| |
| <dt class="note">[[User:Killzone Kid|Killzone Kid]]</dt>
| |
| <dd class="note">
| |
| To [[remoteExecCall]]:
| |
| <code>[[titleText]] ["Test Message", "PLAIN", 1];</code>
| |
| Use
| |
| <code><nowiki>[</nowiki>["Test Message", "PLAIN", 1]] [[remoteExecCall]] ["titleText"];</code>
| |
| </dd>
| |
|
| |
|
| <dd class="notedate">Posted on January 17, 2020 - 15:05 (UTC)</dd>
| | {{GameCategory|arma3|Remote Execution}} |
| <dt class="note">[[User:Dscha|Dscha]]</dt>
| |
| <dd class="note">
| |
| To send/execute custom functions and pass arguments (in this case to every connected Client, except the dedicated server):<br>
| |
| <code>[<br> [10,0],<br> {<br> [[player]] [[setAmmo]] [<nowiki/>[[primaryWeapon]] [[player]], (_this select 0)];<br> [[player]] [[setDamage]] (_this select 1)];<br> }<br>] [[remoteExecCall]] ["call", -2]; </code><br>
| |
| </dd>
| |
| </dl>
| |
| <!-- DISCONTINUE Notes -->
| |