BIS fnc MP: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
No edit summary
m (Fix SQF)
 
(57 intermediate revisions by 5 users not shown)
Line 1: Line 1:
''Function syntax in [[Take On Helicopters]] differs, see [[BIS_fnc_MP (Take On Helicopters)]] for details.''
{{TabView
|selected= 2


{{Function|= Comments
|title1= {{TabView/GameTitle|tkoh}}
____________________________________________________________________________________________
|content1=
{{RV|type=function


| arma3 |= Game name
|game1= tkoh
|version1= 1.00


|0.50|= Game version
|gr1= Multiplayer
____________________________________________________________________________________________


| {{Feature arma3|this command was obsoleted since 1.52; use the engine based commands [[remoteExec]] or  [[remoteExecCall]] instead.}} Send function for remote execution (and executes locally if conditions are met) . |= Description
|descr= Send function for remote execution (and executes locally if conditions are met).
____________________________________________________________________________________________


| [params, functionName, target, isPersistent, isCall] call BIS_fnc_MP; |= Syntax
|s1= [params, functionName, target, isSpawn, isPersistent] call [[BIS_fnc_MP]]
 
|p1= '''params''': [[Anything]] - function params
 
|p2= '''functionName''': [[String]] - function name
 
|p3= '''target''': [[Object]] - (Optional, default everyone) function will be executed only where unit is local
 
|p4= '''isSpawn''': [[Boolean]] - (Optional, default [[false]]) true for calling function using 'spawn' command (otherwise 'call' is used)
 
|p5= '''isPersistent''': [[Boolean]] - (Optional, default [[false]]) true for persistent call (will be called now and for every JIP client)
 
|r1= [[Array]] - sent packet
 
|x1= Log a message for every connected player:
<sqf>["Imma spamming your log!", "BIS_fnc_log"] call BIS_fnc_MP;</sqf>
 
|x2= Send a message containing "Hello World" to every player, including the ones who joins later using JIP:
<sqf>[["Hello World"], "BIS_fnc_guiMessage", nil, true, true] call BIS_fnc_MP;</sqf>
 
|seealso= [[remoteExec]] [[remoteExecCall]] [[BIS_fnc_MPexec]]
}}
 
|title2= {{TabView/GameTitle|arma3}}
|content2=
{{RV|type=function
 
|game1= arma3
|version1= 0.50
 
|gr1= Multiplayer
 
|descr= Send function for remote execution (and executes locally if conditions are met).
{{Feature|warning|{{GVI|arma3|1.50}} This function has been replaced by [[remoteExec]] and [[remoteExecCall]]. While [[BIS_fnc_MP]] still works (to provide backwards compatibility), it is now deprecated and should no longer be used. See [[Arma 3: Remote Execution]] for more information.}}
 
|s1= [params, functionName, target, isPersistent, isCall] call [[BIS_fnc_MP]]
 
|p1= '''params''': [[Anything]] - function arguments. Variables can be local.
 
|p2= '''functionName''': [[String]] - [[:Category:Functions|function]] or [[:Category:Scripting_Commands|scripting command]] name.


|p1= '''params''': [[Anything]] - function arguments. Variables can be local. |=
|p2= '''functionName''': [[String]] - function name or [[:Category:Scripting_Commands|scripting command]] name. While any function can be used, only commands defined in ''[[CfgRemoteExecCommands]]'' are supported. |=
|p3= '''target''':
|p3= '''target''':
: [[Object]] - function will be executed only where unit is local [default: everyone]
* [[Object]] - the function will be executed only where unit is local [default: everyone]
: [[Array]] - array of objects
* [[String]] - the function will be executed only where object or group defined by the variable with passed name is local
: [[Boolean]] - [[true]] to execute on each machine (including the one where the function was called from), false to execute it on server only
* [[Boolean]] - [[true]] to execute on each machine (including the one where the function was called from), false to execute it on server only
: [[Number]] - function will be executed only on client with the given [[owner]] ID
* [[Number]] - function will be executed only on client with the given [[owner]] ID
: [[Side]] - function will be executed only on clients where the player is on the specified side
* [[Side]] - function will be executed only on clients where the player is on the specified side
: [[Group]] - function will be executed only on clients where the player is in the specified group
* [[Group]] - function will be executed only on clients where the player is in the specified group
|=
* [[Array]] - array of targets of types listed above
|p4= '''isPersistent''': [[Boolean]] - true for persistent call (will be called now and for every JIP client) [default: false] |=
 
|p5= '''isCall''': [[Boolean]] - (optional) true if function should be [[call|called]] on target machine, false to [[spawn]] it [default: false] |=
|p4= '''isPersistent''': [[Boolean]] - (Optional, default [[false]]) true for persistent call (will be called now and for every JIP client)


|p5= '''isCall''': [[Boolean]] - (Optional, default [[false]]) true if function should be [[call|called]] on target machine, false to [[spawn]] it


|r1= [[Array]] - sent packet


| [[Array]] - sent packet |= Return value
|x1= <sqf>
____________________________________________________________________________________________
// logs a message for every player on the server.
 
["Imma spamming your log!", "BIS_fnc_log"] call BIS_fnc_MP;
|x1= <code><nowiki>[</nowiki>"Imma spamming your log!","[[BIS_fnc_log]]"] [[call]] [[BIS_fnc_MP]];</code>
</sqf>
Logs a message for every player on the server.|=


|x2= <code><nowiki>[</nowiki>"Hello World","[[hint]]",[[true]],[[true]]] [[call]] [[BIS_fnc_MP]];</code>
|x2= <sqf>
Send a hint containing "Hello World" to every player, including the ones who joins later using JIP.|=
// send a hint containing "Hello World" to every player, including the ones who joins later using JIP.
["Hello World", "hint", true, true] call BIS_fnc_MP;
</sqf>


|x3= <code><nowiki>[[[]</nowiki>,"playerConnected.sqf"],"[[BIS_fnc_execVM]]",[[false]],[[true]]] [[call]] [[BIS_fnc_MP]];</code>
|x3= <sqf>
Executes ''playerConnected.sqf'' script on server every time a player joins the game. |=
// executes "playerConnected.sqf" script on server every time a player joins the game.
[[[], "playerConnected.sqf"], "BIS_fnc_execVM", false, true] call BIS_fnc_MP;</sqf>


|x4= <code><nowiki>[[</nowiki>[[player]], ["My Action Title","myAction.sqf", ...]],"[[addAction]]",[[true]],[[true]]] [[call]] [[BIS_fnc_MP]];</code>
|x4= <sqf>
Adds action to every player including JIP.  "..." = further optional arguments (see [[addAction]])|=
// adds action to every player including JIP. "..." = further optional arguments (see addAction)
____________________________________________________________________________________________
[[player], ["My Action Title", "myAction.sqf" /* etc */]], "addAction", true, true] call BIS_fnc_MP;
</sqf>


| [[BIS_fnc_MPexec]] [[Arma_3_Remote_Execution|Remote Execution]] |= See also
|seealso= [[BIS_fnc_MPexec]] [[Arma_3_Remote_Execution|Remote Execution]]
}}


}}
}}


<h3 style="display:none">Notes</h3>
{{Note
<dl class="command_description">
|user= Fireball
<!-- Note Section BEGIN -->
|timestamp= 20130402190200
<dd class="notedate">Posted on 2 April, 2013
|text= Note that the function you provide as argument is *not* transferred to the remote client or server.  
<dt class="note">[[User:Fireball|Fireball]]
<dd class="note">
Note that the function you provide as argument is *not* transferred to the remote client or server.  


You will have to use either
You will have to use either
Line 63: Line 104:


You can also execute scripts remotely like this:
You can also execute scripts remotely like this:
<code><nowiki>[</nowiki>"myScript.sqf","[[BIS_fnc_execVM]]",[[true]],[[true]] ] [[call]] [[BIS_fnc_MP]];</code>
<sqf>["myScript.sqf", "BIS_fnc_execVM", true, true] call BIS_fnc_MP;</sqf>


Or transfer code as parameter (not recommended) like that:
Or transfer code as parameter (not recommended) like that:
<code><nowiki>[</nowiki>{[[hint]] "Hello World!";},"[[BIS_fnc_spawn]]",[[true]],[[true]]] [[call]] [[BIS_fnc_MP]];</code>
<sqf>[{ hint "Hello World!"; }, "BIS_fnc_spawn", true, true] call BIS_fnc_MP;</sqf>
 
}}
<dd class="notedate">Posted on 5 July, 2013
<dt class="note">[[User:kylania|kylania]]
<dd class="note">
"One key note when designing a mission/script is to limit the amount of use you make of the isPersistent parameter. It is not recommended to use it often for vehicle creation, object creation, etc.
 
Each time you use the isPersistent parameter it adds to a BIS Logic which is used to sync all clients and new clients that join, excessive use of the command will make the logic build up and eventually you will cause the server to desync out because of the massive amount of data it has to send to all clients and JIP clients to try to keep them in sync.
 
It is highly recommended to make as little use as possible of the isPersistent option unless you have to for network performance sake."
-[http://forums.bistudio.com/member.php?75622-Tonic-_ Tonic]


{{Note
|user= kylania
|timestamp= 20130704212000
|text= {{Feature | quote | One key note when designing a mission/script is to limit the amount of use you make of the isPersistent parameter. It is not recommended to use it often for vehicle creation, object creation, etc.<br>Each time you use the isPersistent parameter it adds to a BIS Logic which is used to sync all clients and new clients that join, excessive use of the command will make the logic build up and eventually you will cause the server to desync out because of the massive amount of data it has to send to all clients and JIP clients to try to keep them in sync.<br><br>It is highly recommended to make as little use as possible of the isPersistent option unless you have to for network performance sake.|{{Link|http://forums.bistudio.com/member.php?75622-Tonic-_|Tonic}}}}
}}


<dd class="notedate">Posted on 10 December, 2013
{{Note
<dt class="note">[[User:Killzone_Kid|Killzone_Kid]]
|user= Killzone_Kid
<dd class="note">
|timestamp= 20131210133700
If you need to achieve a single global execution of an existing function on all PCs including your own, the syntax could not be any more simple than: [arguments, functionname] [[call]] [[BIS_fnc_MP]]; This is particularly useful with commands such as [[switchMove]] where the command effect is [[local]].  
|text= If you need to achieve a single global execution of an existing function on all PCs including your own, the syntax could not be any more simple than: [arguments, functionname] [[call]] [[BIS_fnc_MP]]; This is particularly useful with commands such as [[switchMove]] where the command effect is [[Multiplayer Scripting#Locality|local]].  


For example to make sure animation is played on every PC, first define a global function on every PC (maybe inside init.sqf):
For example to make sure animation is played on every PC, first define a global function on every PC (maybe inside init.sqf):


<code>switchMoveEverywhere = [[compileFinal]] "
<sqf>
_this [[select]] 0 [[switchMove]] (_this [[select]] 1);
switchMoveEverywhere = compileFinal "
";</code>
_this select 0 switchMove (_this select 1);
";
</sqf>
Then execute [[BIS_fnc_MP]] on only one PC which will in return execute ''switchMoveEverywhere'' function everywhere:
Then execute [[BIS_fnc_MP]] on only one PC which will in return execute ''switchMoveEverywhere'' function everywhere:


<code>[
<sqf>
[
[
[
[[player]],
player,
"AmovPercMstpSrasWrflDnon_AadjPpneMstpSrasWrflDleft"
"AmovPercMstpSrasWrflDnon_AadjPpneMstpSrasWrflDleft"
],
],
"switchMoveEverywhere"
"switchMoveEverywhere"
] [[call]] [[BIS_fnc_MP]];</code>
] call BIS_fnc_MP;
</sqf>
}}


{{Note
|user= Waffle SS.
|timestamp= 20150523214700
|text= Adding onto what Killzone_Kid said, a custom function isn't necessary when using only a single command.
<sqf>
[
[player, "AmovPercMstpSrasWrflDnon_AadjPpneMstpSrasWrflDleft"],
"switchMove"
] call BIS_fnc_MP;
</sqf>
}}


{{Note
|user= Warka
|timestamp= 20150608120800
|text= From version 1.50 the function [[BIS_fnc_MP]] will use the engine based remote execution.
* This will positively affect its performance, namely processing speed and amount of transferred data.
* The syntax and functionality of [[BIS_fnc_MP]] will remain same to retain the backward compatibility.
* To prevent abusing of the [[remoteExec]] and [[remoteExecCall]] commands the [[BIS_fnc_MP]] will use, the content authors will be able to define the operation modes as well as white-lists for commands/functions for clients and server separately.
* White-lists defined in ''[[CfgRemoteExecCommands]]'' and ''[[CfgRemoteExecFunctions]]'' won't be supported from 1.48 as they will be replaced by the new structure more powerful and detailed structure: [[CfgRemoteExec]].
|game= arma3
|version= 1.50
}}


<!-- Note Section END -->
{{Note
</dl>
|user= Waffle SS.
|timestamp= 20150720210700
|text= Pay close attention to where and when you call [[BIS_fnc_MP]]. If you use it on the server during init, it will probably run before the player is loaded into the server, and the player behaves more like a JIP. Either waiting for the briefing to end ([[time]] > 0), or using the JIP parameter in [[BIS_fnc_MP]] are two ways of getting around this issue.
}}


<h3 style="display:none">Bottom Section</h3>
[[Category:Function Group: MP|{{uc:MP}}]]
[[Category:Functions|{{uc:MP}}]]
[[Category:{{Name|tkoh}}: Functions|{{uc:MP}}]]
[[Category:{{Name|arma3}}: Functions|{{uc:MP}}]]
<!-- CONTINUE Notes -->
<!-- DISCONTINUE Notes -->
<!-- CONTINUE Notes -->
<dl class="command_description">
<dd class="notedate">Posted on April 12, 2015 - 10:41 (UTC)</dd>
<dt class="note">[[User:SilentSpike|SilentSpike]]</dt>
<dd class="note">
When using [[BIS_fnc_MP]] with a scripting command from [[CfgRemoteExecCommands]] the number of ''params'' given defines how it is executed.
<code>
case 0: ''functionName'';
case 1: ''functionName params'';
case 2: (''params'' select 0) ''functionName'' (''params'' select 1);
</code>
</dd>
</dl>
<!-- DISCONTINUE Notes -->
<!-- CONTINUE Notes -->
<dl class="command_description">
<dd class="notedate">Posted on May 23, 2015 - 21:47 (UTC)</dd>
<dt class="note">[[User:Waffle SS.|Waffle SS.]]</dt>
<dd class="note">
Adding onto what Killzone_Kid said, a custom function isn't necessary when using only a single command.
<code>[
[ [[player]],"AmovPercMstpSrasWrflDnon_AadjPpneMstpSrasWrflDleft"],
"[[switchMove]]"
] [[call]] [[BIS_fnc_MP]];</code>
Provided the command is whitelisted in [[CfgRemoteExecCommands]].</dd>
</dl>
<!-- DISCONTINUE Notes -->
<!-- CONTINUE Notes -->
<dl class="command_description">
<dd class="notedate">Posted on June 8, 2015 - 12:08 (UTC)</dd>
<dt class="note">[[User:Warka|Warka]]</dt>
<dd class="note">
{{GVI|arma3|1.50}}
* From version 1.50 the function bis_fnc_mp will use the engine based remote execution.
* This will positively affect its performance, namely processing speed and amount of transferred data.
* The syntax and functionality of bis_fnc_mp will remain same to retain the backward compatibility.
* To prevent abusing of the remoteExec and remoteExecCall commands the bis_fnc_mp will use, the content authors will be able to define the operation modes as well as white-lists for commands/functions for clients and server separately.
* White-lists defined in ''[[CfgRemoteExecCommands]]'' and ''[[CfgRemoteExecFunctions]]'' won't be supported from 1.48 as they will be replaced by the new structure more powerful and detailed structure: [[CfgRemoteExec]].
</dd>
</dl>
<!-- DISCONTINUE Notes -->


<!-- CONTINUE Notes -->
{{GameCategory|arma3|Remote Execution}}
<dl class="command_description">
<dd class="notedate">Posted on July 20, 2015 - 21:07 (UTC)</dd>
<dt class="note">[[User:Waffle SS.|Waffle SS.]]</dt>
<dd class="note">
Pay close attention to where and when you call '''BIS_fnc_MP'''.  If you use it on the server during init, it will probably run before the player is loaded into the server, and the player behaves more like a JIP.  Either waiting for the briefing to end ([[time]] > 0), or using the JIP parameter in '''BIS_fnc_MP''' are two ways of getting around this issue.
</dd>
</dl>
<!-- DISCONTINUE Notes -->

Latest revision as of 16:45, 1 November 2022

tkoh logo small.png Take On Helicopters
Arma 3 logo black.png Arma 3
Hover & click on the images for description

Description

Description:
Send function for remote execution (and executes locally if conditions are met).
Execution:
call
Groups:
Multiplayer

Syntax

Syntax:
[params, functionName, target, isSpawn, isPersistent] call BIS_fnc_MP
Parameters:
params: Anything - function params
functionName: String - function name
target: Object - (Optional, default everyone) function will be executed only where unit is local
isSpawn: Boolean - (Optional, default false) true for calling function using 'spawn' command (otherwise 'call' is used)
isPersistent: Boolean - (Optional, default false) true for persistent call (will be called now and for every JIP client)
Return Value:
Array - sent packet

Examples

Example 1:
Log a message for every connected player:
["Imma spamming your log!", "BIS_fnc_log"] call BIS_fnc_MP;
Example 2:
Send a message containing "Hello World" to every player, including the ones who joins later using JIP:
[["Hello World"], "BIS_fnc_guiMessage", nil, true, true] call BIS_fnc_MP;

Additional Information

See also:
remoteExec remoteExecCall BIS_fnc_MPexec

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
Hover & click on the images for description

Description

Description:
Send function for remote execution (and executes locally if conditions are met).
Arma 3 logo black.png1.50 This function has been replaced by remoteExec and remoteExecCall. While BIS_fnc_MP still works (to provide backwards compatibility), it is now deprecated and should no longer be used. See Arma 3: Remote Execution for more information.
Execution:
call
Groups:
Multiplayer

Syntax

Syntax:
[params, functionName, target, isPersistent, isCall] call BIS_fnc_MP
Parameters:
params: Anything - function arguments. Variables can be local.
functionName: String - function or scripting command name.
target:
  • Object - the function will be executed only where unit is local [default: everyone]
  • String - the function will be executed only where object or group defined by the variable with passed name is local
  • Boolean - true to execute on each machine (including the one where the function was called from), false to execute it on server only
  • Number - function will be executed only on client with the given owner ID
  • Side - function will be executed only on clients where the player is on the specified side
  • Group - function will be executed only on clients where the player is in the specified group
  • Array - array of targets of types listed above
isPersistent: Boolean - (Optional, default false) true for persistent call (will be called now and for every JIP client)
isCall: Boolean - (Optional, default false) true if function should be called on target machine, false to spawn it
Return Value:
Array - sent packet

Examples

Example 1:
// logs a message for every player on the server. ["Imma spamming your log!", "BIS_fnc_log"] call BIS_fnc_MP;
Example 2:
// send a hint containing "Hello World" to every player, including the ones who joins later using JIP. ["Hello World", "hint", true, true] call BIS_fnc_MP;
Example 3:
// executes "playerConnected.sqf" script on server every time a player joins the game. [[[], "playerConnected.sqf"], "BIS_fnc_execVM", false, true] call BIS_fnc_MP;
Example 4:
// adds action to every player including JIP. "..." = further optional arguments (see addAction) [[player], ["My Action Title", "myAction.sqf" /* etc */]], "addAction", true, true] call BIS_fnc_MP;

Additional Information

See also:
BIS_fnc_MPexec Remote Execution

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
Fireball - c
Posted on Apr 02, 2013 - 19:02 (UTC)
Note that the function you provide as argument is *not* transferred to the remote client or server. You will have to use either
  1. functions defined in global namespace
  2. functions defined depending on where you want to execute them; in server or/and client code if you separate it using conditions on isServer or local player
  3. pre-defined BIS functions
You can also execute scripts remotely like this:
["myScript.sqf", "BIS_fnc_execVM", true, true] call BIS_fnc_MP;
Or transfer code as parameter (not recommended) like that:
[{ hint "Hello World!"; }, "BIS_fnc_spawn", true, true] call BIS_fnc_MP;
kylania - c
Posted on Jul 04, 2013 - 21:20 (UTC)
«
« One key note when designing a mission/script is to limit the amount of use you make of the isPersistent parameter. It is not recommended to use it often for vehicle creation, object creation, etc.
Each time you use the isPersistent parameter it adds to a BIS Logic which is used to sync all clients and new clients that join, excessive use of the command will make the logic build up and eventually you will cause the server to desync out because of the massive amount of data it has to send to all clients and JIP clients to try to keep them in sync.

It is highly recommended to make as little use as possible of the isPersistent option unless you have to for network performance sake. »
 – Tonic
Killzone_Kid - c
Posted on Dec 10, 2013 - 13:37 (UTC)
If you need to achieve a single global execution of an existing function on all PCs including your own, the syntax could not be any more simple than: [arguments, functionname] call BIS_fnc_MP; This is particularly useful with commands such as switchMove where the command effect is local. For example to make sure animation is played on every PC, first define a global function on every PC (maybe inside init.sqf):
switchMoveEverywhere = compileFinal " _this select 0 switchMove (_this select 1); ";
Then execute BIS_fnc_MP on only one PC which will in return execute switchMoveEverywhere function everywhere:
[ [ player, "AmovPercMstpSrasWrflDnon_AadjPpneMstpSrasWrflDleft" ], "switchMoveEverywhere" ] call BIS_fnc_MP;
Waffle SS. - c
Posted on May 23, 2015 - 21:47 (UTC)
Adding onto what Killzone_Kid said, a custom function isn't necessary when using only a single command.
[ [player, "AmovPercMstpSrasWrflDnon_AadjPpneMstpSrasWrflDleft"], "switchMove" ] call BIS_fnc_MP;
Warka - c
Posted on Jun 08, 2015 - 12:08 (UTC)

From version 1.50 the function BIS_fnc_MP will use the engine based remote execution.

  • This will positively affect its performance, namely processing speed and amount of transferred data.
  • The syntax and functionality of BIS_fnc_MP will remain same to retain the backward compatibility.
  • To prevent abusing of the remoteExec and remoteExecCall commands the BIS_fnc_MP will use, the content authors will be able to define the operation modes as well as white-lists for commands/functions for clients and server separately.
  • White-lists defined in CfgRemoteExecCommands and CfgRemoteExecFunctions won't be supported from 1.48 as they will be replaced by the new structure more powerful and detailed structure: CfgRemoteExec.
Waffle SS. - c
Posted on Jul 20, 2015 - 21:07 (UTC)
Pay close attention to where and when you call BIS_fnc_MP. If you use it on the server during init, it will probably run before the player is loaded into the server, and the player behaves more like a JIP. Either waiting for the briefing to end (time > 0), or using the JIP parameter in BIS_fnc_MP are two ways of getting around this issue.