compileFinal: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - "\{\{GameCategory\|(arma[0123])\|New[ _]Scripting[ _]Commands[ _]List\}\}" to "{{GameCategory|$1|New Scripting Commands}}")
m (Text replacement - "Nelis.75733126" to "Nelis75733126")
 
(39 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Command|Comments=
{{RV|type=command
____________________________________________________________________________________________


| arma3 |Game name=
|game1= arma3
|version1= 0.56


|0.56|Game version=
|gr1= Strings


|gr1= Strings |GROUP1=
|descr= Compiles an expression / takes an existing [[HashMap]] and makes it final, preventing it from being modified or overwritten (by [[=]] assignation, [[publicVariable]], [[set]] or any other command).
____________________________________________________________________________________________
{{Feature|informative|This feature is only available in the retail version of {{arma3}}.}}


| Compile expression and makes it final, preventing it from:
|s1= [[compileFinal]] expression
* repeated [[compile]] or [[compileFinal]]
* removal by [[nil]]
* remote rewrite using [[publicVariable]], [[publicVariableClient]] and [[publicVariableServer]]
{{Informative | This feature is only available in retail version of Arma 3}}
|DESCRIPTION=
____________________________________________________________________________________________


|'''compileFinal''' expression |SYNTAX=
|p1= expression: [[String]], {{GVI|arma3|2.14|size= 0.75}} [[Code]] or [[HashMap]]


|p1= expression: [[String]] |PARAMETER1=
|r1= [[Code]] or [[HashMap]]


| [[Code]] |RETURNVALUE=
|x1= <sqf>
____________________________________________________________________________________________
_myCode = compileFinal "a = a + 1";
 
call _myCode;
|x1= <code>myCode <nowiki>=</nowiki> compileFinal "a <nowiki>=</nowiki> a + 1";  
[[call]] myCode;<br>
// repeated compile won't have any effect
{{codecomment|//--- Repeated compile won't have any effect}}
_myCode = compileFinal "a = a + 2";
myCode <nowiki>=</nowiki> compileFinal "a <nowiki>=</nowiki> a + 2";<br>
</sqf>
{{codecomment|//--- Duplicate code will be final as well}}
myDuplicateCode = myCode;
</code>|EXAMPLE1=
____________________________________________________________________________________________


| [[compile]], [[call]], [[spawn]], [[isFinal]] |SEEALSO=
|x2= <sqf>
// duplicate code will be final as well
_myDuplicateCode = _myCode;


// an alternative is to copy str'd code (since Arma 3 v2.02)
private _myNonFinalCopy = compile toString _myCode;
</sqf>
|x3= <sqf>
// since {{arma3}} v2.14
private _readonlyCode = compileFinal { systemChat "Hello World!"; };
private _readonlyHashMap = compileFinal _myHashMap;
</sqf>
|seealso= [[compile]] [[compileScript]] [[isFinal]] [[call]] [[spawn]]
}}
}}


<h3 style="display:none">Notes</h3>
{{Note
<dl class="command_description">
|user= AgentRev01
<!-- Note Section BEGIN -->
|timestamp= 20130815003500
|text= When broadcasting a compileFinal'ed variable using [[publicVariable]] or its variants, the variable also becomes final on the other client(s) and/or the server.
Also, compileFinal does not prevent [[Event_handlers|event handlers]] from being removed or overwritten.
}}


<dd class="notedate">Posted on August 14, 2013
{{Note
<dt class="note">[[User:AgentRev01|AgentRev]]<dd class="note">
|user= Nelis75733126
When broadcasting a compileFinal'ed variable using [[publicVariable]] or its variants, the variable also becomes final on the other client(s) and/or the server.
|timestamp= 20170527115800
|text= in {{arma3}} v1.70.141838, [[compileFinal]] also works for [[profileNamespace]] and [[uiNamespace]]. But be careful with that.
}}


Also, compileFinal does not prevent [[Event_handlers|event handlers]] from being removed or overwritten.
{{Note
|user= Dscha
|timestamp= 20201023103900
|text= Change with {{arma3}} {{Link|https://dev.arma3.com/post/spotrep-00095|patch 2.00}}, [[compileFinal]] is now '''unable''' to store code type variables in [[profileNamespace]]!
}}
 
{{Note
|user= Hypoxic125
|timestamp= 20240622234127
|text= Making a base class read only using HashMapObjects


<sqf>
Class_Dog = compileFinal createHashMapObject [
    // Properties
    ["#type", "Dog"],
    ["owner", objNull],
    ["legs", 4],
    ["health", 100],
    ["vehicleclass", "Dog_Base_F"],
    ["vehicle", objNull],


<!-- Note Section END -->
// Constructor
</dl>
    ["#create", {
        params [["_owner", objNull], ["_vehicle", objNull]];


<h3 style="display:none">Bottom Section</h3>
        if ([_owner, _vehicle] findIf {isNull _x} != -1) exitWith {};


[[Category:Scripting Commands|COMPILE]]
        _self set ["owner", _owner];
{{GameCategory|arma3|Scripting Commands}}
        _self set ["vehicle", _vehicle]
{{GameCategory|arma3|New Scripting Commands}}
    }]
];


<!-- CONTINUE Notes -->
NewDog = createHashMapObject [
<dl class="command_description">
    [["#base", Class_Dog]],
<dd class="notedate">Posted on May 27, 2017 - 11:58 (UTC)</dd>
    [player_1, createVehicle [Class_Dog get "vehicleclass", [0,0,0], 0, [], "NONE"]]
<dt class="note">[[User:IT07|IT07]]</dt>
];
<dd class="note">
in Arma 3 1.70.141838, compileFinal also works for profileNamespace and uiNamespace. But be careful with that.
</dd>
</dl>
<!-- DISCONTINUE Notes -->


<!-- CONTINUE Notes -->
NewDog set ["owner", player_2];
<dl class="command_description">
NewDog get "owner";                // returns player_2
<dd class="notedate">Posted on October 23, 2020 - 10:39 (UTC)</dd>
<dt class="note">[[User:Dscha|Dscha]]</dt>
<dd class="note">
Change with Arma 3 Patch [https://dev.arma3.com/post/spotrep-00095 2.00], [[compileFinal]] is now '''unable''' to store code type variables in profileNamespace!


</dd>
Class_Dog set ["owner", player_1];  // Error: Read Only
</dl>
</sqf>
<!-- DISCONTINUE Notes -->
}}

Latest revision as of 15:38, 29 June 2024

Hover & click on the images for description

Description

Description:
Compiles an expression / takes an existing HashMap and makes it final, preventing it from being modified or overwritten (by = assignation, publicVariable, set or any other command).
This feature is only available in the retail version of Arma 3.
Groups:
Strings

Syntax

Syntax:
compileFinal expression
Parameters:
expression: String, Arma 3 logo black.png2.14 Code or HashMap
Return Value:
Code or HashMap

Examples

Example 1:
_myCode = compileFinal "a = a + 1"; call _myCode; // repeated compile won't have any effect _myCode = compileFinal "a = a + 2";
Example 2:
// duplicate code will be final as well _myDuplicateCode = _myCode; // an alternative is to copy str'd code (since Arma 3 v2.02) private _myNonFinalCopy = compile toString _myCode;
Example 3:
// since Arma 3 v2.14 private _readonlyCode = compileFinal { systemChat "Hello World!"; }; private _readonlyHashMap = compileFinal _myHashMap;

Additional Information

See also:
compile compileScript isFinal call spawn

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
AgentRev01 - c
Posted on Aug 15, 2013 - 00:35 (UTC)
When broadcasting a compileFinal'ed variable using publicVariable or its variants, the variable also becomes final on the other client(s) and/or the server. Also, compileFinal does not prevent event handlers from being removed or overwritten.
Nelis75733126 - c
Posted on May 27, 2017 - 11:58 (UTC)
in Arma 3 v1.70.141838, compileFinal also works for profileNamespace and uiNamespace. But be careful with that.
Dscha - c
Posted on Oct 23, 2020 - 10:39 (UTC)
Change with Arma 3 patch 2.00, compileFinal is now unable to store code type variables in profileNamespace!
Hypoxic125 - c
Posted on Jun 22, 2024 - 23:41 (UTC)
Making a base class read only using HashMapObjects
Class_Dog = compileFinal createHashMapObject [ // Properties ["#type", "Dog"], ["owner", objNull], ["legs", 4], ["health", 100], ["vehicleclass", "Dog_Base_F"], ["vehicle", objNull], // Constructor ["#create", { params [["_owner", objNull], ["_vehicle", objNull]]; if ([_owner, _vehicle] findIf {isNull _x} != -1) exitWith {}; _self set ["owner", _owner]; _self set ["vehicle", _vehicle] }] ]; NewDog = createHashMapObject [ [["#base", Class_Dog]], [player_1, createVehicle [Class_Dog get "vehicleclass", [0,0,0], 0, [], "NONE"]] ]; NewDog set ["owner", player_2]; NewDog get "owner"; // returns player_2 Class_Dog set ["owner", player_1]; // Error: Read Only