addPublicVariableEventHandler: Difference between revisions

From Bohemia Interactive Community
m (Text replacement - " <!-- (DIS)?CONTINUE Notes -->" to "")
m (Some wiki formatting)
 
(39 intermediate revisions by the same user not shown)
Line 2: Line 2:


|game1= arma1
|game1= arma1
|version1= 1.09
|game2= arma2
|version2= 1.00
|game3= arma2oa
|version3= 1.50
|game4= tkoh
|version4= 1.00


|version1= 1.09
|game5= arma3
|version5= 0.50


|arg= global
|arg= global
Line 17: Line 28:
|gr4= Variables
|gr4= Variables


|descr= {{Feature|arma3 | This command is deprecated since the introduction of [[remoteExec]] and [[remoteExecCall]].}}
|descr= {{Feature|arma3|This command is deprecated since {{GVI|arma3|1.52}} and the introduction of [[remoteExec]] and [[remoteExecCall]].}}


This event handler will detect if a [[missionNamespace]] variable (it is attached to) has been broadcast over network with [[publicVariable]], [[publicVariableClient]] or [[publicVariableServer]] commands and will execute EH code upon detection. Arguments passed to the code in ''_this'' array are:
This event handler will detect if a [[missionNamespace]] variable (it is attached to) has been broadcast over network with [[publicVariable]], [[publicVariableClient]] or [[publicVariableServer]] commands and will execute EH code upon detection.
<br>
{{Feature|informative|
<br>_this select 0: [[String]] - broadcast variable name (same variable name EH is attached to)
<br>_this select 1: [[Anything]] - broadcast variable value
<br>_this select 2: [[Object]], [[Group]] - target the variable got set on with [[setVariable]]  (see: alternative syntax)
<br><br>
{{Feature | Informative |
* This EH works '''only''' in Multiplayer environment
* This EH works '''only''' in Multiplayer environment
* There is '''no way to remove''' this EH
* There is '''no way''' to remove this EH
* This EH will not fire on the machine that executed broadcast with [[publicVariable]] command, only on the machines that receive the broadcast
* This EH will not fire on the machine that executed broadcast with [[publicVariable]] command, only on the machines that receive the broadcast
* The value of broadcast variable can be exactly the same, it is the actual broadcast that triggers EH not the change in variable}}
* The value of broadcast variable can be exactly the same, it is the actual broadcast that triggers EH not the change in variable
}}


|pr= {{Feature | Warning | Alt syntax of this command doesn't work as intended.}}
|pr= {{Feature|warning|The {{Link|#Alternative Syntax}} does not work as intended.}}


|s1= varName '''addPublicVariableEventHandler''' code
|s1= varName [[addPublicVariableEventHandler]] code


|p1= varName: [[String]] - [[missionNamespace]] variable name
|p1= varName: [[String]] - [[missionNamespace]] variable name


|p2= code: [[Code]] - By default, the code is executed in [[missionNamespace]]
|p2= code: [[Code]] - by default, the code is executed in [[missionNamespace]]. {{hl|_this}} arguments array is in format [varName, value, target]:
* varName: [[String]] - broadcast variable name (same variable name EH is attached to)
* value: [[Anything]] - broadcast variable value
* target: [[Object]] or [[Group]] - target the variable got set on with [[setVariable]] (see {{Link|#Alternative Syntax}})
 
|r1= [[Nothing]]


|r1 [[Nothing]]
|s2= varName [[addPublicVariableEventHandler]] [target, code]


|s2= varName '''addPublicVariableEventHandler''' [target, code] {{Since|arma3|1.46|yes}}
|s2since= arma3 1.46


|p21= varName: [[String]] - name of the variable set on target with [[setVariable]]
|p21= varName: [[String]] - name of the variable set on target with [[setVariable]]


|p22= [target, code]: [[Array]]
|p22= target: [[Object]], [[Group]] or [[Team Member]]
 
|p23= code: [[Code]]


|p23= target: [[Object]], [[Group]] or [[Team Member]]
|r2= [[Nothing]]


|p24= code: [[Code]]
|x1= <sqf>
"publicThis" addPublicVariableEventHandler {
_varName = _this select 0;
_value = _this select 1;
_target = _this select 2;
hint format ["%1 has been updated to %2 for %3", _varName, _value, target];
};
</sqf>


|r2= [[Nothing]]
|x2= Client:
 
<sqf>"'^:)123BURP,+=lol" addPublicVariableEventHandler {hint ("NUTS are " + (_this select 1))};</sqf>
|x1= <code>"publicThis" [[addPublicVariableEventHandler]] {
Server:
[[hint]] [[format]] [
<sqf>
"%1 has been updated to: %2",
missionNamespace setVariable ["'^:)123BURP,+=lol", "craZZZZy"];
_this [[select]] 0,
publicVariable "'^:)123BURP,+=lol";
_this [[select]] 1
</sqf>
]
};</code>


|x2= Client:<code>"'^:)123BURP,+=lol" [[addPublicVariableEventHandler]] {[[hint]] ("NUTS are " + (_this [[select]] 1))};</code>
|seealso= [[publicVariable]] [[publicVariableClient]] [[publicVariableServer]]
Server:<code>[[missionNamespace]] [[setVariable]] ["'^:)123BURP,+=lol", "craZZZZy"];
}}
[[publicVariable]] "'^:)123BURP,+=lol";</code>


|seealso= [[publicVariable]], [[publicVariableClient]], [[publicVariableServer]]
{{Note
|user= TeRp
|timestamp= 20071222133000
|text= Please note that varName indicates which variable you want to monitor with this eventhandler.<br>
As a result, the example eventhandler on this page will only fire when the variable publicThis has been changed,
but not if any other variable was changed by any other client via the publicVariable command.
}}
}}


{{GameCategory|arma2|Scripting Commands}}
{{Note
{{GameCategory|arma3|Scripting Commands}}
|user= MulleDK13
{{GameCategory|tkoh|Scripting Commands}}
|timestamp= 20140227005700
|text= Note on using addPublicVariableEventHandler during initialization: If you need a function to call addPublicVariableEventHandler during initialization, you must use postInit. addPublicVariableEventHandler does not work during preInit.
}}


<dl class="command_description">
{{Note
<dd class="notedate">Posted on 22 Dec, 2007</dd>
|user= Killzone_Kid
<dt class="note">[[User:TeRp|TeRp]]<dd class="note">
|timestamp= 20140227084000
Please note that varName indicates which variable you want to monitor with this eventhandler.<br>
|text= {{User|MulleDK13}}'s note above needs some clarification. You don't "must" use postInit and you absolutely can use preInit function to initialise [[addPublicVariableEventHandler]] if you start [[Scheduler#Scheduled_Environment|scheduled]] script from it.<br>
As a result, the example eventhandler on this page will only fire when the variable publicThis has been changed,
<sqf>
but not if any other variable was changed by any other client via the publicVariable command.
// script with preInit = 1; in CfgFunctions
<dt><dt>
0 spawn {
<dd class="notedate">Posted on 27 Feb, 2014 00:57</dd>
"someVar" addPublicVariableEventHandler {
<dt class="note">[[User:MulleDK13|MulleDK13]]<dd class="note">
// yourcode
Note on using addPublicVariableEventHandler during initialization: If you need a function to call addPublicVariableEventHandler during initialization, you must use postInit. addPublicVariableEventHandler does not work during preInit.
<dt><dt>
<dd class="notedate">Posted on 27 Feb, 2014 08:40</dd>
<dt class="note">[[User:Killzone_Kid|Killzone_Kid]]<dd class="note">
MulleDK13 note above needs some clarification. You don't "must" use postInit and you absolutely can use preInit function to initialise [[addPublicVariableEventHandler]] if you start [[Scheduler#Scheduled_Environment|scheduled]] script from it. <br>
<code>//script with preInit = 1; in CfgFunctions
0 = 0 [[spawn]] {
"someVar" [[addPublicVariableEventHandler]] {
//yourcode
};
};
};</code>
};
</dl>
</sqf>
}}


<dl class="command_description">
{{Note
<dt></dt>
|user= SilentSpike
<dd class="notedate">Posted on November 23, 2015 - 21:36 (UTC)</dd>
|timestamp= 20151123213600
<dt class="note">[[User:SilentSpike|SilentSpike]]</dt>
|text= While it is true that the event handler will only fire on the machine receiving the broadcast value, please note that this machine can actually be the same machine broadcasting it in the cases of [[publicVariableClient]] and [[publicVariableServer]].
<dd class="note">
While it is true that the event handler will only fire on the machine receiving the broadcast value. Please note that this machine can actually be the same machine broadcasting it in the cases of [[publicVariableClient]] and [[publicVariableServer]].


Examples: <code>if ([[isServer]]) then {
Examples:
    "OnServer" [[addPublicVariableEventHandler]] { [[hint]] "This event handler still fired!"; };
<sqf>
    [[publicVariableServer]] "OnServer";
if (isServer) then
};</code>
{
<code>// This example assumes the client knows their own client ID
"OnServer" addPublicVariableEventHandler { hint "This event handler still fired!"; };
publicVariableServer "OnServer";
};
</sqf>
<sqf>
// This example assumes the client knows their own client ID
// It does also work on the server (when the server ID is used) irrespective of the command name
// It does also work on the server (when the server ID is used) irrespective of the command name


"OnClient" [[addPublicVariableEventHandler]] { [[hint]] "This event handler still fired!"; };
"OnClient" addPublicVariableEventHandler { hint "This event handler still fired!"; };
<client ID> [[publicVariableClient]] "OnClient";
clientID publicVariableClient "OnClient";
</code>
</sqf>
</dd>
}}
</dl>

Latest revision as of 11:02, 24 October 2025

Hover & click on the images for description

Description

Description:
Arma 3
This command is deprecated since Arma 3 logo black.png 1.52 and the introduction of remoteExec and remoteExecCall.

This event handler will detect if a missionNamespace variable (it is attached to) has been broadcast over network with publicVariable, publicVariableClient or publicVariableServer commands and will execute EH code upon detection.

  • This EH works only in Multiplayer environment
  • There is no way to remove this EH
  • This EH will not fire on the machine that executed broadcast with publicVariable command, only on the machines that receive the broadcast
  • The value of broadcast variable can be exactly the same, it is the actual broadcast that triggers EH not the change in variable
Problems:
The Alternative Syntax does not work as intended.
Groups:
Broken CommandsEvent HandlersMultiplayerVariables

Syntax

Syntax:
varName addPublicVariableEventHandler code
Parameters:
varName: String - missionNamespace variable name
code: Code - by default, the code is executed in missionNamespace. _this arguments array is in format [varName, value, target]:
Return Value:
Nothing

Alternative Syntax

Syntax:
varName addPublicVariableEventHandler [target, code]
Parameters:
varName: String - name of the variable set on target with setVariable
target: Object, Group or Team Member
code: Code
Return Value:
Nothing

Examples

Example 1:
"publicThis" addPublicVariableEventHandler { _varName = _this select 0; _value = _this select 1; _target = _this select 2; hint format ["%1 has been updated to %2 for %3", _varName, _value, target]; };
Example 2:
Client:
"'^:)123BURP,+=lol" addPublicVariableEventHandler {hint ("NUTS are " + (_this select 1))};
Server:
missionNamespace setVariable ["'^:)123BURP,+=lol", "craZZZZy"]; publicVariable "'^:)123BURP,+=lol";

Additional Information

See also:
publicVariable publicVariableClient publicVariableServer

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
TeRp - c
Posted on Dec 22, 2007 - 13:30 (UTC)
Please note that varName indicates which variable you want to monitor with this eventhandler.
As a result, the example eventhandler on this page will only fire when the variable publicThis has been changed, but not if any other variable was changed by any other client via the publicVariable command.
MulleDK13 - c
Posted on Feb 27, 2014 - 00:57 (UTC)
Note on using addPublicVariableEventHandler during initialization: If you need a function to call addPublicVariableEventHandler during initialization, you must use postInit. addPublicVariableEventHandler does not work during preInit.
Killzone_Kid - c
Posted on Feb 27, 2014 - 08:40 (UTC)
MulleDK13's note above needs some clarification. You don't "must" use postInit and you absolutely can use preInit function to initialise addPublicVariableEventHandler if you start scheduled script from it.
// script with preInit = 1; in CfgFunctions 0 spawn { "someVar" addPublicVariableEventHandler { // yourcode }; };
SilentSpike - c
Posted on Nov 23, 2015 - 21:36 (UTC)
While it is true that the event handler will only fire on the machine receiving the broadcast value, please note that this machine can actually be the same machine broadcasting it in the cases of publicVariableClient and publicVariableServer. Examples:
if (isServer) then { "OnServer" addPublicVariableEventHandler { hint "This event handler still fired!"; }; publicVariableServer "OnServer"; };
// This example assumes the client knows their own client ID // It does also work on the server (when the server ID is used) irrespective of the command name "OnClient" addPublicVariableEventHandler { hint "This event handler still fired!"; }; clientID publicVariableClient "OnClient";