Lou Montana/Sandbox – User

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Add Join In Progress category and link)
m (Update w/ links)
 
(107 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Informative|Future [[Multiplayer Scripting]] page}}
[[Category: Sandbox]]
{{SideTOC}}
{{Feature|informative|To go on [[Initialisation Order]].}}
{{Stub}}
== The basics ==


* In Multiplayer, players are connected to a server that distributes information among them.
{| class="wikitable sortable align-center align-left-col-1"
* The server can be either a dedicated machine, or hosted by a player; in the latter it means the server can have a [[player]] unit.
|+ Order of Initialisation (use column sorting for respective machine order)
* Players can join a game ''after'' it started: they are considered "[[Join In Progress|JIP]]" and scripting should be adapted to them.
! rowspan="2" class="unsortable" style="text-align: center" | Task
! rowspan="2" | Exec Environment
! rowspan="1" colspan="5" class="unsortable" | Machine
|-
! Single Player
! Dedicated Server
! Hosted Server
! Multiplayer Client
! [[Multiplayer Scripting#Join In Progress|JIP]] MP Client


{{Informative|In Singleplayer, the game acts as a player-hosted server ({{Inline code|[[isServer]]}} returns {{Inline code|[[true]]}}).}}
|-
{{Warning|Some Multiplayer commands will '''not''' work in Singleplayer, such as {{Inline code|[[netId]]}} !}}
| [[Arma 3: Functions Library|Functions]] with <syntaxhighlight lang="cpp" inline>recompile</syntaxhighlight> {{Link|Arma 3: Functions Library#Attributes 3|attribute}} are recompiled
| {{n/a}}
| 1 <!-- Single Player -->
| 1 <!-- Dedicated Server -->
| 1 <!-- Hosted Server -->
| 1 <!-- Multiplayer Client -->
| 1 <!-- JIP MP Client -->


|-
| [[Arma 3: Functions Library|Functions]] with <syntaxhighlight lang="cpp" inline>preInit</syntaxhighlight> {{Link|Arma 3: Functions Library#Attributes 3|attribute}} are called
| [[Scheduler#Unscheduled Environment|Unscheduled]]
| 2 <!-- Single Player -->
| 2 <!-- Dedicated Server -->
| 2 <!-- Hosted Server -->
| 2 <!-- Multiplayer Client -->
| 2 <!-- JIP MP Client -->


== Locality ==
|-
| Object Init Event Handlers are called
| [[Scheduler#Unscheduled Environment|Unscheduled]]
| 3 <!-- Single Player -->
| 3 <!-- Dedicated Server -->
| 3 <!-- Hosted Server -->
| 3 <!-- Multiplayer Client -->
| {{Icon|unchecked}} <!-- JIP MP Client -->


=== Definitions ===
* '''LOCAL''' is an attribute for the machine where the command/script/function is executed.
* '''REMOTE''' means '''non local'''. All players are remote units to a dedicated server, for example.
* [[:Category:Scripting_Commands|commands]] arguments and effects can be either '''local''' or '''global''':
{|
|style="padding-right: 0.5em;"|{{EffArg|cmd|arg|local}}
|a '''local''' argument means an argument that is processed on the machine where the command is executed
|-
|-
|{{EffArg|cmd|arg|global}}
| Expressions of [[Eden Editor: Configuring Attributes|Eden Editor entity attributes]] are called<ref name="isPlayer"><sqf inline>isPlayer _entity</sqf> does not return [[true]] immediately. Once the entity has become a [[player]], it is transferred to the client.</ref>
|a '''global''' argument means any unit, even a remote one
| [[Scheduler#Unscheduled Environment|Unscheduled]]
|-
| 4 <!-- Single Player -->
|{{EffArg|cmd|eff|local}}
| 4 <!-- Dedicated Server -->
|a '''local''' effect means that the effect will only happen on the machine where the command is executed
| 4 <!-- Hosted Server -->
|-
| {{Icon|unchecked}} <!-- Multiplayer Client -->
|{{EffArg|cmd|eff|global}}
| {{Icon|unchecked}} <!-- JIP MP Client -->
|a '''global''' effect means that all the computers will receive it
|}
See [[Locality in Multiplayer]] for more information.


=== Different machines ===
{|class="bikitable"
!Machine
!Conditions
|-
|Dedicated Server
|{{Inline code|[[isDedicated]]}}
|-
|Player Server
|{{Inline code|[[hasInterface]] && [[isServer]]}}
|-
|Client
|{{Inline code|[[hasInterface]] && not [[isServer]]}}
|-
|-
|[[Join In Progress|JIP]] Client
| Object initialisation fields are called
|{{Inline code|[[hasInterface]] && [[didJIP]]}}
| [[Scheduler#Unscheduled Environment|Unscheduled]]
|-
| 5 <!-- Single Player -->
|[[Arma 3 Headless Client|Headless Client]]
| 5 <!-- Dedicated Server -->
|{{Inline code|not [[hasInterface]] && not [[isDedicated]]}}
| 5 <!-- Hosted Server -->
|}
| 4 <!-- Multiplayer Client -->
* If you want to know if the current machine is a server (Dedicated Server or Player Server), use {{Inline code|[[isServer]]}}.
| 3 <!-- JIP MP Client -->
* If you want to know if the current machine has a player (Player Server included), use {{Inline code|[[hasInterface]]}}.
{{Warning|
* a [[Arma 3 Headless Client|Headless Client]] '''can''' be [[Join In Progress|JIP]]
* even if it is highly unlikely, a server '''can''' be [[Join In Progress|JIP]], too!}}


=== General information about locality and its changes ===
|- style="background-color: #95F0AD"
* a [[player]]'s unit is '''always''' local to the player's machine.
| [[Event Scripts#init.sqs|init.sqs]] is executed
** a dedicated server doesn't have a [[player]] unit ({{Inline code|[[isNull]] [[player]] {{codecomment|// returns [[true]]}}}})
|
** to know if a certain unit is ''a'' player, use [[isPlayer]]
| 6 <!-- Single Player -->
* an AI group with a player-leader will be local to the player's computer.
| <!-- Dedicated Server -->
** a subordinate player being in a player-lead group will remain local to its computer (see bulletpoint #1)
| <!-- Hosted Server -->
* a driven vehicle is always local to its driver (not the commander, not the gunner)
| <!-- Multiplayer Client -->
** editor-placed objects and empty vehicles are local to the server
| <!-- JIP MP Client -->
** units created with [[createUnit]] will be local to the computer that issued the command
** objects and vehicles created with [[createVehicle]] will be local to the computer that issued the command


=== Locality changes ===
|- style="background-color: #95F0AD"
* if the player-leader dies, the AI is transferred where the new leader is local (server in case of AI, client in case of another player)
| [[Event Scripts#init.sqf|init.sqf]] is executed
* [[join|joining]] AI units will change locality to the new leader's computer
| [[Scheduler#Scheduled Environment|Scheduled]]<ref name="enginewaits">Note '''in single player''' that while the environment is [[Scheduler#Scheduled Environment|Scheduled]] ([[canSuspend]] returns true), the engine seems to wait until the script is done executing, essentially behaving similarly to an [[Scheduler#Unscheduled Environment|Unscheduled environment]] - infinite loops will freeze the game, [[uiSleep]] may pause the game for up to ~20s (postInit), [[waitUntil]] can cause catastrophic issues, etc.</ref>
* a driver gets in an empty vehicle, locality will change from server to player
| <!-- Single Player -->
* locality can also change in the event of a ||Team Switch]] or usage of [[selectPlayer]]  
| <!-- Dedicated Server -->
| <!-- Hosted Server -->
| <!-- Multiplayer Client -->
| <!-- JIP MP Client -->


=== Code examples ===
{|class="bikitable"
!Code
!Argu-ments
!Effect
!Description
|-
|-
|{{Inline code|remoteUnit [[setDamage]] 1;}}
| Expressions of [[Eden Editor: Configuring Attributes|Eden Editor scenario attributes]] are called<ref name="playerCommandNotAvailable">[[player]] is not available immediately.</ref>
|align="center"|{{EffArg|cmd|arg|global}}
| [[Scheduler#Unscheduled Environment|Unscheduled]]
|align="center"|{{EffArg|cmd|eff|global}}
| <!-- Single Player -->
|Any unit (local or remote) will die, and all the computers will know
| <!-- Dedicated Server -->
|-
| <!-- Hosted Server -->
|{{Inline code|localUnit [[addMagazine]] "30Rnd_556x45_STANAG";}}
| <!-- Multiplayer Client -->
|align="center"|{{EffArg|cmd|arg|local}}
| <!-- JIP MP Client -->
|align="center"|{{EffArg|cmd|eff|global}}
 
|Only a local unit can have its inventory edited with this command, but all the machines will be notified: if a player looks into the localUnit inventory, the added magazine will be there
|- style="background-color: #95DEF0"
|-
| Persistent functions are called
|{{Inline code|remoteUnit [[setFace]] "Miller";}}
|
|align="center"|{{EffArg|cmd|arg|global}}
| <!-- Single Player -->
|align="center"|{{EffArg|cmd|eff|local}}
| <!-- Dedicated Server -->
|Any unit (local or remote) can get its face changed, but the new face will not be propagated through the network. Only the local machine's player will see the effect of the command
| <!-- Hosted Server -->
{{Informative|This command should ideally be '''executed on every machine''', for example with:
| <!-- Multiplayer Client -->
[remoteUnit, "Miller"] [[remoteExec]] ["setFace", 0, true];
| <!-- JIP MP Client -->
See [[#Remote Execution|Remote Execution]] paragraph for more information.}}
 
|-
|-
|{{Inline code|localCamera [[cameraEffect]] ["Internal", "Back"];}}
| [[Modules]] are initialised
|align="center"|{{EffArg|cmd|arg|local}}
|
|align="center"|{{EffArg|cmd|eff|local}}
| <!-- Single Player -->
|Only a local camera can be entered, and of course only the local machine will see through this camera
| <!-- Dedicated Server -->
|}
| <!-- Hosted Server -->
| <!-- Multiplayer Client -->
| {{Icon|unchecked}} <!-- JIP MP Client -->


|- style="background-color: #DEF0AD"
| [[Event Scripts#initServer.sqf|initServer.sqf]] is executed
| [[Scheduler#Scheduled Environment|Scheduled]]
| <!-- Single Player -->
| <!-- Dedicated Server -->
| <!-- Hosted Server -->
| {{n/a}} <!-- Multiplayer Client -->
| {{n/a}} <!-- JIP MP Client -->


== PublicVariable commands ==
|- style="background-color: #DEF0AD"
PublicVariable commands allow to send '''global''' variables to specified machines.
| [[Event Scripts#initPlayerLocal.sqf|initPlayerLocal.sqf]] is executed
* Network reception is guaranteed
| [[Scheduler#Scheduled Environment|Scheduled]]
* Short variable names should be used for network performance
| <!-- Single Player -->
* These commands shouldn't be used intensely for the same reason
| {{n/a}} <!-- Dedicated Server -->
{|class="bikitable"
| <!-- Hosted Server -->
!Command
| <!-- Multiplayer Client -->
!Effect
| <!-- JIP MP Client -->
|-
|[[publicVariable]]
|Set/update a variable value from the local machine to all the other machines (including server)
|-
|[[publicVariableServer]]
|Set/update a variable value '''from a client to the server'''
|-
|[[publicVariableClient]]
|Set/update a variable value '''from the local machine''' (not necessarily the server) '''to a specific client'''<br />{{Important|The information will be lost if the targeted client disconnects!}}
|}


=== How it works ===
|- style="background-color: #DEF0AD"
The server has the variable {{Inline code|ABC_Score}} to send to everyone, it then uses {{Inline code|[[publicVariable]] "ABC_Score"}} (do not forget the quotes!)<br />
| [[Event Scripts#initPlayerServer.sqf|initPlayerServer.sqf]] is executed on the server
This sends the variable name and value to the clients.
| [[Scheduler#Scheduled Environment|Scheduled]]
* If the variable is not yet declared on their machine, it will declare it as well.
| <!-- Single Player -->
* If the variable already exists, '''the value is overridden''' by the server's value.
| {{n/a}} <!-- Dedicated Server -->
* If the variable changes again on the server, it has to be manually [[publicVariable]]'d once again!
| ?? <!-- Hosted Server -->
* A [[Join In Progress|JIP]] player will synchronise '''server's''' public variables '''before''' executing '''init.sqf'''. See [[Initialization Order]] for more information.
| <!-- Multiplayer Client -->
** A JIP player will '''not''' synchronise [[publicVariableClient]]-received variables after he disconnects/reconnects. Only server-known public variables sent with [[publicVariable]] will be synchronised.
| <!-- JIP MP Client -->


|-
| [[Arma 3: Functions Library|Functions]] with <syntaxhighlight lang="cpp" inline>postInit</syntaxhighlight> {{Link|Arma 3: Functions Library#Attributes 3|attribute}} are called
| [[Scheduler#Scheduled Environment|Scheduled]]<ref name="enginewaits"/>
| <!-- Single Player -->
| <!-- Dedicated Server -->
| <!-- Hosted Server -->
| <!-- Multiplayer Client -->
| <!-- JIP MP Client -->


== Remote Execution ==
|- style="background-color: #95DEF0"
{{arma2}} introduced the (now obsolete) [[Multiplayer framework]], used as follow:
| [[Event Scripts#init.sqs|init.sqs]] is executed
waitUntil{ not isNil "BIS_MPF_InitDone"; };
| [[Scheduler#Scheduled Environment|Scheduled]]
[nil, nil, rHINT, "Message to everyone!"] call RE;
| <!-- Single Player -->
| <!-- Dedicated Server -->
| <!-- Hosted Server -->
| <!-- Multiplayer Client -->
| <!-- JIP MP Client -->


{{arma3}} alpha introduced [[BIS_fnc_MP]]:
|- style="background-color: #95DEF0"
["Message to everyone, including JIP players!", "hint", true, true] call BIS_fnc_MP;
| [[Event Scripts#init.sqf|init.sqf]] is executed
| [[Scheduler#Scheduled Environment|Scheduled]]
| <!-- Single Player -->
| <!-- Dedicated Server -->
| <!-- Hosted Server -->
| <!-- Multiplayer Client -->
| <!-- JIP MP Client -->


{{Warning|These two methods above are considered '''OBSOLETE''' since {{arma3}} v1.50 introduced two engine commands: [[remoteExec]] and [[remoteExecCall]].}}
|-
| [[remoteExec]]'s [[Multiplayer Scripting#Join In Progress|JIP]] queue
| {{n/a}}
| {{n/a}} <!-- Single Player -->
| {{n/a}} <!-- Dedicated Server -->
| {{n/a}} <!-- Hosted Server -->
| {{n/a}} <!-- Multiplayer Client -->
| 42 <!-- JIP MP Client -->


|- style="background-color: #EEE"
| ''Scenario going''
| {{n/a}}
| <!-- Single Player -->
| <!-- Dedicated Server -->
| <!-- Hosted Server -->
| <!-- Multiplayer Client -->
| <!-- JIP MP Client -->


'''{{arma3}} (&gt; v1.50):'''
|-
["Message to everyone, including JIP players!", 0, true] remoteExec ["hint"];
| [[Event Scripts#exit.sqf|exit.sqf]]
See [[Arma 3 Remote Execution]] for more information.
|
| <!-- Single Player -->
| <!-- Dedicated Server -->
| <!-- Hosted Server -->
| <!-- Multiplayer Client -->
| <!-- JIP MP Client -->


|-
| [[Event Scripts#exit.sqs|exit.sqs]]
|
| <!-- Single Player -->
| <!-- Dedicated Server -->
| <!-- Hosted Server -->
| <!-- Multiplayer Client -->
| <!-- JIP MP Client -->


== Join In Progress ==
|-
See [[Join In Progress]] for more information.
| {{Link|Arma 3: Mission Event Handlers#Ended|"Ended" Mission Event Handler}}
|
| <!-- Single Player -->
| <!-- Dedicated Server -->
| <!-- Hosted Server -->
| <!-- Multiplayer Client -->
| <!-- JIP MP Client -->


|-
|  {{Link|Arma 3: Mission Event Handlers#MPEnded|"MPEnded" Mission Event Handler}}
|
| <!-- Single Player -->
| <!-- Dedicated Server -->
| <!-- Hosted Server -->
| <!-- Multiplayer Client -->
| <!-- JIP MP Client -->


== See also ==
|}
* [[Arma 3 Headless Client|Headless Client]]
* [[Locality in Multiplayer]]
* [[:Category:Commands by effects and arguments locality|Commands by effects and arguments locality]]
** [[:Category:Commands requiring server side execution|Server-only commands]]
* [[Initialization Order]]
* [[Arma 3 Remote Execution]]




[[Category: Scripting Topics]]
== See Also ==


[[Category:Sandbox]]
* [[Arma 3: Functions Library]]<!--
* [[Arma 2: Functions Library]] -->
* [[Arma 3: Remote Execution]], [[BIS_fnc_MP]] <!-- keep? -->
* [[Eden Editor: Configuring Attributes|Eden Editor: Configuring Attributes]]
* [[Event Scripts]]
* [[Scheduler]]

Latest revision as of 01:29, 18 March 2024

Order of Initialisation (use column sorting for respective machine order)
Task Exec Environment Machine
Single Player Dedicated Server Hosted Server Multiplayer Client JIP MP Client
Functions with recompile attribute are recompiled N/A 1 1 1 1 1
Functions with preInit attribute are called Unscheduled 2 2 2 2 2
Object Init Event Handlers are called Unscheduled 3 3 3 3 Unchecked
Expressions of Eden Editor entity attributes are called[1] Unscheduled 4 4 4 Unchecked Unchecked
Object initialisation fields are called Unscheduled 5 5 5 4 3
init.sqs is executed 6
init.sqf is executed Scheduled[2]
Expressions of Eden Editor scenario attributes are called[3] Unscheduled
Persistent functions are called
Modules are initialised Unchecked
initServer.sqf is executed Scheduled N/A N/A
initPlayerLocal.sqf is executed Scheduled N/A
initPlayerServer.sqf is executed on the server Scheduled N/A ??
Functions with postInit attribute are called Scheduled[2]
init.sqs is executed Scheduled
init.sqf is executed Scheduled
remoteExec's JIP queue N/A N/A N/A N/A N/A 42
Scenario going N/A
exit.sqf
exit.sqs
"Ended" Mission Event Handler
"MPEnded" Mission Event Handler


See Also

  1. isPlayer _entity does not return true immediately. Once the entity has become a player, it is transferred to the client.
  2. 2.0 2.1 Note in single player that while the environment is Scheduled (canSuspend returns true), the engine seems to wait until the script is done executing, essentially behaving similarly to an Unscheduled environment - infinite loops will freeze the game, uiSleep may pause the game for up to ~20s (postInit), waitUntil can cause catastrophic issues, etc.
  3. player is not available immediately.