From de81aba7cfad4d777d8432548e8f349d7a57c652 Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Tue, 2 Jan 2018 13:49:03 +0100 Subject: [PATCH 01/23] Reorganized most dependencies because of Restricted API access occuring in newest eclipse version; Is not fixed yet --- plugin/Raven.SQDev.Editors/.classpath | 2 +- .../Raven.SQDev.Editors/META-INF/MANIFEST.MF | 8 ++++---- plugin/Raven.SQDev.Editors/bin/.gitignore | 1 + .../sqdev/editors/BasicParseTimeListener.java | 2 +- plugin/Raven.SQDev.Misc/bin/.gitignore | 1 + .../raven/sqdev/parser/misc/ParseUtil.class | Bin 9399 -> 9869 bytes .../raven/sqdev/parser/misc/ParseUtil.java | 12 +++++++++++- .../sqdev/parser/sqf/tests/SQFParserTest.java | 2 +- .../META-INF/MANIFEST.MF | 11 +++++------ plugin/Raven.SQDev.SQFEditor/bin/.gitignore | 1 + plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF | 18 ++++++++---------- plugin/Raven.SQDev.UI/bin/.gitignore | 1 + plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF | 2 +- plugin/Raven.SQDev.Util/bin/.gitignore | 1 + .../Raven.SQDev.Wizards/META-INF/MANIFEST.MF | 6 +++--- plugin/Raven.SQDev.Wizards/bin/.gitignore | 1 + .../META-INF/MANIFEST.MF | 4 ++-- plugin/RavenSQDev.Preferences/bin/.gitignore | 1 + 18 files changed, 44 insertions(+), 30 deletions(-) create mode 100644 plugin/Raven.SQDev.Editors/bin/.gitignore create mode 100644 plugin/Raven.SQDev.Misc/bin/.gitignore create mode 100644 plugin/Raven.SQDev.SQFEditor/bin/.gitignore create mode 100644 plugin/Raven.SQDev.UI/bin/.gitignore create mode 100644 plugin/Raven.SQDev.Util/bin/.gitignore create mode 100644 plugin/Raven.SQDev.Wizards/bin/.gitignore create mode 100644 plugin/RavenSQDev.Preferences/bin/.gitignore diff --git a/plugin/Raven.SQDev.Editors/.classpath b/plugin/Raven.SQDev.Editors/.classpath index eca7bdba..c4a519dc 100644 --- a/plugin/Raven.SQDev.Editors/.classpath +++ b/plugin/Raven.SQDev.Editors/.classpath @@ -1,7 +1,7 @@ - + diff --git a/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF index 90697139..e7b33f02 100644 --- a/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF @@ -6,13 +6,13 @@ Bundle-Version: 0.7.1.stable Bundle-Activator: raven.sqdev.editors.activator.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, - org.eclipse.ui.editors;bundle-version="3.8.200", - org.eclipse.jface.text;bundle-version="3.9.2", + org.eclipse.ui.editors, + org.eclipse.jface.text, org.eclipse.swt, org.eclipse.core.resources, org.eclipse.ui.ide, - org.eclipse.core.filesystem;bundle-version="1.4.100", - raven.sqdev.misc;bundle-version="0.6.0" + org.eclipse.core.filesystem, + raven.sqdev.misc Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: raven.sqdev.editors; diff --git a/plugin/Raven.SQDev.Editors/bin/.gitignore b/plugin/Raven.SQDev.Editors/bin/.gitignore new file mode 100644 index 00000000..85996f46 --- /dev/null +++ b/plugin/Raven.SQDev.Editors/bin/.gitignore @@ -0,0 +1 @@ +/raven/ diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicParseTimeListener.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicParseTimeListener.java index 94e28fd5..cabc605c 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicParseTimeListener.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicParseTimeListener.java @@ -12,7 +12,7 @@ import raven.sqdev.misc.SQDevPreferenceUtil; /** - * This listener will cause the editor to reparse it's input when the user + * This listener will cause the editor to re-parse its input when the user * stopped typing for a longer time * * @author Raven diff --git a/plugin/Raven.SQDev.Misc/bin/.gitignore b/plugin/Raven.SQDev.Misc/bin/.gitignore new file mode 100644 index 00000000..85996f46 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/bin/.gitignore @@ -0,0 +1 @@ +/raven/ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class index 92164f7613ac0b80e9625fbe08c64865526f8b97..5b186dfab7534d9b7498fbb0afa7ec3d425f7acb 100644 GIT binary patch delta 3686 zcmZ`+3w%@M75|@*Xg|em8`T*aL>E@jCg-+*VY|iO6-R7p^`H~cb{r3B{_kQ;~-}gWN zbH4vM_hzX6>c*@WzJ2&H0H@MT5=?}XjJp+=ah+A(Tk)l(NRDZGb2QQ!3~29|nnSMvG&RqtzU0t(lG^B z;7TLU7K}%5wSsGKEkO##>U#ThM&Qb5Kxw#@o)B%cH=<>58)oB!{&v-XpH09OUO>T4h6zpmGxm=>(Zh!_F$iap9?5kFsv^P zgw|;SKcQeqOlB~EPY*=(`f!KVFD%0f9u^iQX^Hfu4G}z|;88qAMx|W5d#r328m|~{$#bl)D)=p4GbT9dtgkD018*8ZNA(0z0&goggm+Rzn*-69Rv+$+ z5T>}xjJ>9OW0S>_J33n<HLP@D;}dir zjX?Q+1jgqXkDDmR*z0^prhF=pXe^=FcrRZaUmJ^QQC%Tbu&@VXO%c6mT__~cI6|3m zQch|1vOtKNh)jjBOEe+XX$r@(tb!e)Dr6c@B?>Hb5@EUf`a=~)e^!N^3aM0~Ni^Ab zFe{KTo~ClgA~!?wQ3VQfjp^C*jDhT}S<@9bktrjKPFCm?I@M5eW?QQis-{`S;+zG! zUWHtgE9|GU6lgY~+?@t+887E_ndfoP#^!vt(?$z84{dsPFlM8LM#QzkR!e6IV)e$W zE)Ol*o|{XJMqX~Tcrj-puti>6D&{YfmEVMGdK+gjr0ZlQI?<^s2^i@2G$Q@^pd;4HRm z5NEN`Aa$;@2c0rqgx4jC6RLT4^}cQD+hpEOI3tO5xWH-LH!jI50aVx>A z?7|jR8OEK21Gv}gP#weg5vOA(;yq$~KbNZOE?9SAg+LQqoV&14b*8uM_GYLV3H~624LUkNoX zJuXB8wxWq&ug$m>OE~#HJb)JLM=KuT=Yv>=7qOgs^a{L*RrmsJID+%Yfz{+h2Tg%S zHRz<~ID+IuFRkRsF07)p&}k#ir%SPcc48w9@%`b zaBvLwFnyL2KF8nqNsRuEe}G?S^btG$5+-g3@8F;K7sjBFUd6xh73ZLu68I0||AhsO zbQiwHH>}HZ=tg|YOeI`FT#3XWILLPsje(sbIZS3A$qXAK3t8ddNUBL98#0(~L2~3^ zg4tvz8Fr>AlY}Igpv!Rdj+aZJ#x2pK!cg!tV46`{;`QgJ2)^{y)5m;Yj(; z8O0WC9i!{V9-U2kDm}ukaVulo#wU3@6x@ki>_jnF?-c%&5%M`T zg`Yg_I6rd{d`)HSo=0S7C7F0j0hQA<)=x2?k%uZ6P^BMm8%vQ~#m{4SeL*?1tZejn z5;TMVXY$i&393m}U5b!1xo!_jZ7=e%FG-*zwO8mj=^q7Y0b7xi7O+ZlFpAXqVf@{^}A@ki|U5x%vAqL&;8Iv4JXbuxv2TXx%d(nwVXJ))J5l< zIJewID~`>Hgp0BOmwql^ALe9_a8*9SF^-^!zX~VeF_!8!oZ_z-!c4Dugu48yd5D5ui)u;Gni1;pj~Sv~uT`~h&!oPzoV?Nqt@X2< zVqTjnsW!2Az0i~`K?9l^J{{F7@FZRSAj{KnnFUCP9et7t1-%-JnM z3thrZ%FO8Xw2eEYh4H;~8C}k5T8MJGf)y%ZW;06YO1g@()y~|$psN|qMAtA&6J1N! T@jZt}*Hahq?-{xQv&8*7h`nJV delta 3233 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 must be reported unbalancedPairsToReport.add(currentPair); } @@ -123,6 +128,11 @@ public static final SQFParseResult parseSQF(String input, ISQFParseInformation p result.setParseTree(tree); result.setTokenStream(tokenStream); result.mergeWith(listener.getParseResult()); + + // TODO: debug info + ParseInfo info = parser.getParseInfo(); + DecisionInfo[] infos = info.getDecisionInfo(); + System.out.println(info); return result; } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java index 4e3300c7..8c9e3b76 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java @@ -333,7 +333,7 @@ protected static Marker createWarningMarker(int offset, int length, String msg) * @param input * The input to process * @param macros - * The list of macros that should be existant in the given input + * The list of macros that should be existent in the given input * @return The resulting {@link SQFParseResult} */ protected static SQFParseResult process(String input, List macros) { diff --git a/plugin/Raven.SQDev.SQFEditor/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.SQFEditor/META-INF/MANIFEST.MF index b6973020..6c441413 100644 --- a/plugin/Raven.SQDev.SQFEditor/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.SQFEditor/META-INF/MANIFEST.MF @@ -8,15 +8,14 @@ Bundle-Vendor: Raven Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ui.editors, - org.eclipse.jface.text;bundle-version="3.9.2", + org.eclipse.jface.text, org.eclipse.osgi, - raven.sqdev.util;bundle-version="0.7.1", - raven.sqdev.editors;bundle-version="0.7.1", - raven.sqdev.preferences;bundle-version="0.5.5", org.eclipse.core.resources, org.eclipse.ui.ide, - raven.sqdev.misc;bundle-version="0.6.0", - org.junit + org.junit, + raven.sqdev.misc, + raven.sqdev.util, + raven.sqdev.editors Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: raven.sqdev.editors.sqfeditor diff --git a/plugin/Raven.SQDev.SQFEditor/bin/.gitignore b/plugin/Raven.SQDev.SQFEditor/bin/.gitignore new file mode 100644 index 00000000..85996f46 --- /dev/null +++ b/plugin/Raven.SQDev.SQFEditor/bin/.gitignore @@ -0,0 +1 @@ +/raven/ diff --git a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF index 7be7dd83..e5e8eb47 100644 --- a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF @@ -7,14 +7,16 @@ Bundle-Activator: raven.sqdev.ui.Activator Bundle-Vendor: Raven Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, - raven.sqdev.editors;bundle-version="0.7.1", - raven.sqdev.util;bundle-version="0.7.1", + org.eclipse.jface.text, + org.eclipse.jface.text.source, + raven.sqdev.util, + raven.sqdev.misc, + raven.sqdev.editors, org.eclipse.ui.navigator, org.eclipse.ui.ide, - org.eclipse.ui.editors;bundle-version="3.8.200", + org.eclipse.ui.editors, org.eclipse.core.resources, - org.eclipse.ui.navigator.resources, - raven.sqdev.misc;bundle-version="0.6.0" + org.eclipse.ui.navigator.resources Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: ., @@ -24,13 +26,9 @@ Import-Package: org.antlr.v4.runtime, org.antlr.v4.runtime.tree, org.eclipse.jdt.core.search, org.eclipse.jdt.internal.ui.dialogs, - org.eclipse.jface.text, - org.eclipse.jface.text.source, org.eclipse.search.ui, raven.sqdev.constants, raven.sqdev.exceptions, raven.sqdev.fileSystemListener, - raven.sqdev.interfaces, - raven.sqdev.misc, - raven.sqdev.util + raven.sqdev.interfaces Export-Package: raven.sqdev.ui diff --git a/plugin/Raven.SQDev.UI/bin/.gitignore b/plugin/Raven.SQDev.UI/bin/.gitignore new file mode 100644 index 00000000..85996f46 --- /dev/null +++ b/plugin/Raven.SQDev.UI/bin/.gitignore @@ -0,0 +1 @@ +/raven/ diff --git a/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF index 14f0a19c..668571fe 100644 --- a/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF @@ -12,7 +12,7 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.ui.editors, org.eclipse.ui.workbench, org.eclipse.swt, - raven.sqdev.misc;bundle-version="0.1.0", + raven.sqdev.misc, org.eclipse.jface.text, org.eclipse.ui Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/plugin/Raven.SQDev.Util/bin/.gitignore b/plugin/Raven.SQDev.Util/bin/.gitignore new file mode 100644 index 00000000..85996f46 --- /dev/null +++ b/plugin/Raven.SQDev.Util/bin/.gitignore @@ -0,0 +1 @@ +/raven/ diff --git a/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF index 6ca77bf3..5d4a5faf 100644 --- a/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF @@ -13,10 +13,10 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.ui.editors, org.eclipse.swt, org.eclipse.jface, - raven.sqdev.editors;bundle-version="0.1.1", + raven.sqdev.editors, raven.sqdev.preferences, - raven.sqdev.util;bundle-version="0.3.0", - raven.sqdev.misc;bundle-version="0.1.0", + raven.sqdev.util, + raven.sqdev.misc, raven.sqdev.ui Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/plugin/Raven.SQDev.Wizards/bin/.gitignore b/plugin/Raven.SQDev.Wizards/bin/.gitignore new file mode 100644 index 00000000..85996f46 --- /dev/null +++ b/plugin/Raven.SQDev.Wizards/bin/.gitignore @@ -0,0 +1 @@ +/raven/ diff --git a/plugin/RavenSQDev.Preferences/META-INF/MANIFEST.MF b/plugin/RavenSQDev.Preferences/META-INF/MANIFEST.MF index f3502095..ae1f7322 100644 --- a/plugin/RavenSQDev.Preferences/META-INF/MANIFEST.MF +++ b/plugin/RavenSQDev.Preferences/META-INF/MANIFEST.MF @@ -10,8 +10,8 @@ Require-Bundle: org.eclipse.ui, org.eclipse.swt, org.eclipse.osgi, org.eclipse.ui.editors, - raven.sqdev.util;bundle-version="0.3.0", - raven.sqdev.misc;bundle-version="0.1.0" + raven.sqdev.util, + raven.sqdev.misc Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: raven.sqdev.preferences.activator;uses:="org.osgi.framework,org.eclipse.ui.plugin", diff --git a/plugin/RavenSQDev.Preferences/bin/.gitignore b/plugin/RavenSQDev.Preferences/bin/.gitignore new file mode 100644 index 00000000..85996f46 --- /dev/null +++ b/plugin/RavenSQDev.Preferences/bin/.gitignore @@ -0,0 +1 @@ +/raven/ From 543549b9d62a8cf96d66575eb14cc99eb22f0f5f Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Mon, 26 Mar 2018 18:18:27 +0200 Subject: [PATCH 02/23] started implementing new parser; replaced Lists with Maps in keyword handling --- plugin/Raven.SQDev.Editors/.gitignore | 1 + .../Raven.SQDev.Editors/META-INF/MANIFEST.MF | 1 - plugin/Raven.SQDev.Editors/bin/.gitignore | 1 - .../raven/sqdev/editors/BasicCodeEditor.class | Bin 17015 -> 17034 bytes .../editors/BasicContentAssistProcessor.class | Bin 3822 -> 3898 bytes .../BasicSourceViewerConfiguration.class | Bin 10043 -> 10136 bytes .../sqdev/editors/BasicTextHover$1.class | Bin 993 -> 993 bytes .../raven/sqdev/editors/BasicTextHover.class | Bin 3083 -> 3029 bytes .../raven/sqdev/editors/KeywordScanner.class | Bin 8623 -> 8634 bytes .../sqdev/editors/activator/Activator.class | Bin 1329 -> 1335 bytes .../sqdev/editors/other/ConfigEditor.class | Bin 3105 -> 3214 bytes .../editors/BasicContentAssistProcessor.java | 35 +- .../BasicSourceViewerConfiguration.java | 200 +++---- .../raven/sqdev/editors/BasicTextHover.java | 44 +- .../raven/sqdev/editors/KeywordScanner.java | 200 +++---- .../sqdev/editors/activator/Activator.java | 2 +- .../sqdev/editors/other/ConfigEditor.java | 78 ++- plugin/Raven.SQDev.Misc/.classpath | 1 + plugin/Raven.SQDev.Misc/.gitignore | 1 + plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF | 1 - plugin/Raven.SQDev.Misc/bin/.gitignore | 1 - .../bin/raven/sqdev/activator/Activator.class | Bin 892 -> 898 bytes .../sqdev/constants/ProblemMessages.class | Bin 5008 -> 5543 bytes .../infoCollection/base/KeywordList.class | Bin 7825 -> 6062 bytes .../infoCollection/base/SQFCommand.class | Bin 16809 -> 16831 bytes .../sqdev/interfaces/IMacroSupport.class | Bin 338 -> 370 bytes .../interfaces/ISQFParseInformation.class | Bin 748 -> 819 bytes .../sqdev/misc/SQDevPreferenceUtil.class | Bin 6880 -> 6886 bytes .../raven/sqdev/parser/misc/ParseUtil.class | Bin 9869 -> 10193 bytes .../PreprocessorParseListener.class | Bin 9524 -> 9540 bytes .../PreprocessorParseResult.class | Bin 1191 -> 1325 bytes .../parser/sqf/SQFParseInformation.class | Bin 5663 -> 6606 bytes .../sqdev/parser/sqf/SQFParseResult.class | Bin 3126 -> 3315 bytes .../raven/sqdev/parser/sqf/SQFValidator.class | Bin 20687 -> 0 bytes .../parser/sqf/tests/SQFParserTest$1.class | Bin 1210 -> 1224 bytes .../parser/sqf/tests/SQFParserTest.class | Bin 10482 -> 10727 bytes .../pluginManagement/SQDevPluginManager.class | Bin 3179 -> 4174 bytes .../pluginManager/SQDevPluginManager.class | Bin 4165 -> 0 bytes .../src/raven/sqdev/activator/Activator.java | 2 +- .../sqdev/constants/ProblemMessages.java | 35 +- .../sqdev/exceptions/ValidationException.java | 26 + .../infoCollection/base/KeywordList.java | 294 +++------- .../sqdev/infoCollection/base/SQFCommand.java | 2 +- .../raven/sqdev/interfaces/IMacroSupport.java | 8 +- .../interfaces/ISQFParseInformation.java | 11 +- .../raven/sqdev/misc/SQDevPreferenceUtil.java | 2 +- .../raven/sqdev/parser/misc/ParseUtil.java | 36 +- .../PreprocessorParseListener.java | 4 +- .../preprocessor/PreprocessorParseResult.java | 14 +- .../sqdev/parser/sqf/SQFParseInformation.java | 95 ++-- .../sqdev/parser/sqf/SQFParseResult.java | 20 +- ...SQFValidator.java => SQFValidatorOLD.java} | 112 ++-- .../sqdev/parser/sqf/tests/SQFParserTest.java | 69 ++- .../pluginManagement/SQDevPluginManager.java | 44 +- .../pluginManager/SQDevPluginManager.java | 192 ------- .../sqdev/sqf/validation/SQFValidator.java | 527 ++++++++++++++++++ plugin/Raven.SQDev.SQFEditor/.gitignore | 1 + plugin/Raven.SQDev.SQFEditor/bin/.gitignore | 1 - .../bin/raven/sqdev/activator/Activator.class | Bin 1297 -> 1303 bytes .../editors/sqfeditor/SQF_Editor$1.class | Bin 2634 -> 2618 bytes .../sqdev/editors/sqfeditor/SQF_Editor.class | Bin 13881 -> 14457 bytes .../src/raven/sqdev/activator/Activator.java | 2 +- .../sqdev/editors/sqfeditor/SQF_Editor.java | 186 +++---- plugin/Raven.SQDev.UI/.gitignore | 1 + plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF | 30 +- plugin/Raven.SQDev.UI/bin/.gitignore | 1 - .../ui/commands/ShowParseTreeHandler.class | Bin 1845 -> 1845 bytes .../raven/sqdev/ui/views/RPTViewer$1$1.class | Bin 1969 -> 1969 bytes .../raven/sqdev/ui/views/RPTViewer$1.class | Bin 3798 -> 3798 bytes .../raven/sqdev/ui/views/RPTViewer$2.class | Bin 1099 -> 1099 bytes .../raven/sqdev/ui/views/RPTViewer$3.class | Bin 1903 -> 1903 bytes .../raven/sqdev/ui/views/RPTViewer$4.class | Bin 1035 -> 1035 bytes .../raven/sqdev/ui/views/RPTViewer$5$1.class | Bin 1160 -> 1160 bytes .../raven/sqdev/ui/views/RPTViewer$5$2.class | Bin 1160 -> 1160 bytes .../raven/sqdev/ui/views/RPTViewer$5$3.class | Bin 1160 -> 1160 bytes .../raven/sqdev/ui/views/RPTViewer$5.class | Bin 2348 -> 2348 bytes .../bin/raven/sqdev/ui/views/RPTViewer.class | Bin 23446 -> 23446 bytes .../ui/commands/ShowParseTreeHandler.java | 1 - .../src/raven/sqdev/ui/views/RPTViewer.java | 2 - plugin/Raven.SQDev.Util/.gitignore | 1 + plugin/Raven.SQDev.Util/bin/.gitignore | 1 - .../bin/raven/sqdev/activator/Activator.class | Bin 1015 -> 1021 bytes .../sqdev/util/SQDevProjectBuilder.class | Bin 8333 -> 8352 bytes .../src/raven/sqdev/activator/Activator.java | 2 +- plugin/Raven.SQDev.Wizards/.gitignore | 1 + .../Raven.SQDev.Wizards/META-INF/MANIFEST.MF | 33 +- plugin/Raven.SQDev.Wizards/bin/.gitignore | 1 - .../wizards/SQDevBaseNewProjectWizard.class | Bin 2321 -> 2321 bytes .../sqdev/wizards/activator/Activator.class | Bin 1054 -> 1060 bytes .../wizards/SQDevBaseNewProjectWizard.java | 1 - .../sqdev/wizards/activator/Activator.java | 3 +- plugin/RavenSQDev.Preferences/.gitignore | 1 + plugin/RavenSQDev.Preferences/bin/.gitignore | 1 - .../preferences/activator/Activator.class | Bin 1160 -> 1166 bytes .../pages/SQDevMiscPreferencePage$1.class | Bin 1199 -> 1199 bytes .../pages/SQDevMiscPreferencePage$2.class | Bin 1254 -> 1250 bytes .../pages/SQDevMiscPreferencePage$3$1.class | Bin 1424 -> 1416 bytes .../pages/SQDevMiscPreferencePage$3.class | Bin 5825 -> 5763 bytes .../pages/SQDevMiscPreferencePage.class | Bin 5317 -> 5245 bytes .../preferences/activator/Activator.java | 2 +- .../pages/SQDevMiscPreferencePage.java | 225 ++++---- 101 files changed, 1377 insertions(+), 1179 deletions(-) create mode 100644 plugin/Raven.SQDev.Editors/.gitignore delete mode 100644 plugin/Raven.SQDev.Editors/bin/.gitignore create mode 100644 plugin/Raven.SQDev.Misc/.gitignore delete mode 100644 plugin/Raven.SQDev.Misc/bin/.gitignore delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFValidator.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManager/SQDevPluginManager.class create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/exceptions/ValidationException.java rename plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/{SQFValidator.java => SQFValidatorOLD.java} (90%) delete mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/pluginManager/SQDevPluginManager.java create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java create mode 100644 plugin/Raven.SQDev.SQFEditor/.gitignore delete mode 100644 plugin/Raven.SQDev.SQFEditor/bin/.gitignore create mode 100644 plugin/Raven.SQDev.UI/.gitignore delete mode 100644 plugin/Raven.SQDev.UI/bin/.gitignore create mode 100644 plugin/Raven.SQDev.Util/.gitignore delete mode 100644 plugin/Raven.SQDev.Util/bin/.gitignore create mode 100644 plugin/Raven.SQDev.Wizards/.gitignore delete mode 100644 plugin/Raven.SQDev.Wizards/bin/.gitignore create mode 100644 plugin/RavenSQDev.Preferences/.gitignore delete mode 100644 plugin/RavenSQDev.Preferences/bin/.gitignore diff --git a/plugin/Raven.SQDev.Editors/.gitignore b/plugin/Raven.SQDev.Editors/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/plugin/Raven.SQDev.Editors/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF index e7b33f02..c9e11b7f 100644 --- a/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF @@ -42,6 +42,5 @@ Import-Package: raven.sqdev.constants, raven.sqdev.parser.misc, raven.sqdev.parser.preprocessor, raven.sqdev.pluginManagement, - raven.sqdev.pluginManager, raven.sqdev.sqdevFile, raven.sqdev.util diff --git a/plugin/Raven.SQDev.Editors/bin/.gitignore b/plugin/Raven.SQDev.Editors/bin/.gitignore deleted file mode 100644 index 85996f46..00000000 --- a/plugin/Raven.SQDev.Editors/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/raven/ diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCodeEditor.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCodeEditor.class index c32a243d56547c266fe13d1f73ef3dad0d556a0c..9d11c4b8d8e0f63dc6ff3dae080abc4b379c539b 100644 GIT binary patch delta 1482 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 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicSourceViewerConfiguration.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicSourceViewerConfiguration.class index 7e3eb6ec6f6dc143c72b2bb90017ffc98eef31fb..8ed63fd4d5c60fb7e3a0cffda742b8cf4fecd46b 100644 GIT binary patch delta 3187 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 E0ORScZ~y=R delta 3170 zcmbVOYgAO%75?_jFf$C7$IJj17)Rs{0|**5K0!qVBOob8!AIzb6U4xb9R{OmyCz*t z+oa~99-9hH(=;_w)1*N$gJh!7^pR+^8e<-|)fTHIZPPSqOpLG4eP+hzT3ubMf9^Tw z?z8v)zJ0!Z?%gs!SetP0%a`{87)L7%&=AIoJEKx}6b$KwGsf08#_)tjtL7I7rzy!~ zLIb{|;Jf&qFq;bW4=eaS*7r>}bQApep@J>gOfa>$e9|0pqhieuO7o+IQ-oZ_8Wvt>I}6TEmqffc_bH0M`~*yucw9#>Y_t6&Fq63p$+ zdtDXI4p+U)-O=i6UE?C?@)s8@jKNauQt%Q2;-R?N`rQf!@UnP2ZjmTe@`NM4TmNeX zzrkYJTzx63QjzA5ed#H@tPx}${2BEzhTI!o*(bBg{5R0G}? zBh3?y$MBAX_pZ3xJdWNM!klS5g5N9n1O6!Xn4P>hrQlEav&gkH>rdm10e=yXTap%@ z#a{`=mClZp6`mCgTAN=m*N6`oNmJ8uXGd#uQ@zjI>TWUNH2$vOA9$LecYUqX+16pi zKMC zO$Mb88YdJ@LaK>WsL>#@DKNugLJ`>&8j1DdRC1b8rBMoH zVCN<^iRW1gWn-tXt0}tNFc+Ixpe9>$kjG)DKp_Ve5>h){KCxF#7D8RD6e~2EN(duZ zWnx)Ms<5QAaHuf~jiuZAzLkq|O!^caL#L?8pXohG?n?%z^ zS6XHC9I7%1*}4 zS$EW^&|;d!8#>mxn-_TMyq?uAuWwz&O3vUip`4Z~v`j|OcdqWcXj3V*5;{~N8gmhc zc}PVyaxfpGQ70VsMp_^qw9lai@uq!R)KWxYnTQ=ZChJ{jpyk_PP7n=^{a9S>*oDji zEFta_C!wZ?_2V3A_XqIcqM`vjMCcwqQP|5KI^51r2Tc5Ih7m44*n5!7ql%SC!z$Qt zFYj4}DZHKqHzxAVQQ>Tugvq=zq70AVQ4sr-u;*ip=5c1HGT2f0OC@neGEj(T}OTo{evZ=sLnUB6JxM zy3oy-jVKQh*RXeKh`9C!;?lN(*@SHynT>iY@eB^~BRnYv(^dbEH5@aFdL_%k0sK@W z>Bu9}hK?vMRPqgo05qXotDv13+Xu$3Wg zLkefI^O%9{tk>sQQ7>QudRZAeZzy5;HK^qgsEh|eyaG)IyV|h_dl|XJ9|O&0I1KP! z{dg@>g4aY*X6cMybs?&__i7uQ zqU&uCCUk&l9pvUaz;!+Z3l1Y2M^J>L+=PcX?{RTBL#=upZ*bIjCK?ueHn-4$5PB(n z<(loP-lHWS3ya;xru}&GCP)YW2c$uUbebUza>6qV=`2GUVn`n_q%#cZLkY=$D0KM$ zC#1vpT^N#PKJ=kJyb#0@zD(Y#3F26zJpFzguPrLJycfWU@NiN)L8qM%C1n#pnJCN} zMT4R`E8RR4z~8!I?Llg)$?_pD#5b}=`9ET%eJmr@@5H|Y_@W3NNW^E{%%39@U$7!CAioxuFqS`# zRk*@GN5goS#q$Wsj=h8~GU6#R;TeiSACJ39!9I$`8S!Bv2f;rJfHjff7P9sdX=+ zhcN>t1IR#T1CAJQjQHP*S5`1m2V!nE85oQ-`gy`)Q=*0$#eZ?v3}Za>H~WKiLzG0x z5fyebbou?50ZNxMU4Sx!lp{~i-cNaa7gJi1W!ifI%9m3| zVStJPR4V84IKuro5(a?mh~a;PBua;!GEhKSxQ%l7%av} zPiML_Zw)#|wCAR0SJ148!w_$m^;yF-XTJ{J4j%7ltO;OH^yVh}YeRC^_du2W<(_?1 z7oe{M=&l~fTQyVe9{^uoUEsoAU5D>@wl(x{Oj%kk^OEZq>}c7CTonUX#K?@sP#I=2 zi`g_2cQLqDn$7<;l}5DFJakgEsL4~u-Azr5TFQ!rX1oj=Yecc;UX-UoUkyE-w46s1 MZ)?X=YSu^p2ao}%;s5{u diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicTextHover$1.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicTextHover$1.class index 6e096fcab5380f75e36cbd86b04c24f53cc63a70..b41ec432d4f1a190c907d5685791597d40df7dcb 100644 GIT binary patch delta 19 acmaFJ{*Zk`95bW-N^zXkIE delta 19 acmaFJ{*Zk`95bWAN^&js}W diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicTextHover.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicTextHover.class index ce14df3fc9ef253645b70bc48b6ae9e7dfef016e..6a552a8d1f97cfdde41ce07dd6db9bc1a0039cee 100644 GIT binary patch delta 406 zcmXYsNiRcD7>1wI-rL*W5|YMHLsg|IH58FZDy>KnG-=aBBNl9^p@y2pLi_;ByJBZy zPspVtmKOGYfy95XAik7ylJ`AB-r+lMd~c|I`+0f+hB!8GC_>hiGjuz6ZMc?MF(_DH zM!#>BHHEoaI7k;xj!S#XiiA~kwOfnspjoVaJ!sC8=2p2et_uqu?GhXxvj6*2k+YvlYXN|$i1yUc)?mKjz&lE|pI)@zfxWH@?{ z&t_U~*|_f4UkN{xpZDuFb7dA3^0D;5dR+5sHk%i?MC#XW#MH@IolqZM!4Yan;A4~~ z#)y!jhY9I1Nm4k)6lrG2kgYUM{2J?tyhnVCXJ68pG_!5G%~9)go+dmlB)SgBpP0w*HANUr*t;+11!&K zmb0)Y%sWA1X<=_E@ke|-I461T`#d?h&i$O*mc!QI&Ev%t@Sa~59!13bt%;nB9$Ar3 zYzDANDH@$pGFP%QcA?~yor%Rt)PThZW{Cd+Ps1`3Ly{@3QIsf#Ip7hbyY(_^mvN!4ex&ZpwdQZ`kXy z_lH{bVvmJVLzC2Lf>OtY`+?j?UOFjKRnjc8NJe(E zAST|T(L$@7BqZ->N4>fZI`Ig4mhb$KheLuWQj&3_0xt7Y2CK-;dej3Miy2G4$iu$0 OJRDFJ)q;wN%6bM3B~j4; diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/KeywordScanner.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/KeywordScanner.class index 651a7b2616c67257ce7fff6d3d70022b83a7e3a7..aee6d7271947816bd1e565509bb0cfc35698645d 100644 GIT binary patch delta 3435 zcmZuz3v?7`8NJ_Tc4r@x-8?prO#-APBw-UwK{Vx2S_vUU0;fed7_e$i+471Bj|HR$ zyPmdcX)TrhrJ4w~R4b^|g209lo@%kSv`E$ZZfm6~sMOY0QQEHepV@3S9L`B*XXc;( zyZ5`_{l1x}nhrPlpMC%EF#r=~_CEh?@67z#v280l)^{|li!bkNnA5RpN&t7`3nuOn z*1WJfP#N+Bwe?$4V&?E>fjm2+X)4eLTCce>+dVJf$F6>t4{iD4*@m&kw!yXk5 zd}5-ev)95t{6OGY-_f})wpLI&jCE6YXJ_oT`10qDX8RZ`1>r}Nr| z-W8puzm8R+9^=q*Q&Xpv_ZZNkq!jzJh9BC54e|1UIOiMiJ{1Rh5NiMU_;WGKNS)71BtS z)JUyrDy;TIrQVb})m>OJejN7DeO3VAqB6mf z530Vx1;+J)YIW9Is%pb|o<^B$$rLp$Jc$&iksNjhq)KkGPXS{L_h8ld;_Mj3r0>7_eKw(CEAZKyXZ|I2VdcFI`VkzfPvc(LJSqS z9h0yE)36dv=)^3126NGc1?a}7v5I%sU=!ka2#9ctr;AC7}JF zPah^Nmwgt1MPPj|5BUTQVK=sM)y<$&@Cd#N55C6r1u#aAXz-l5IW!Hx+ET>{>@1|(Su36`pzj#7{KE8L%3C6 zsglysiF=3YQbr*_X@Zoah@BQC?HjQJGw_(rsL~0WVbqK#@qMC3QD)2NvSoBbE^~{a zC!UkF?5EZ~hVIpF=*N0t2{+BD@5fUz9{izYj$(g54!Upx19Jy(w0!`_+xu`bn#2$J zf2s#&4jo0seyYxwRwPa{Qap(>_jshpQ)KQ;oimQ&=j}NW<71QE(TF>VU-F6H^deN= zg8)xkX~y3%(#tws!xnr3eF09;T&6Jwd(n*jXvYC8&#|LU6Z4F% zj!uW0)8goK47ftN3ph8`*|M^P9swTvsh6^LxYIjCk4~=YZn=e2bPwl8>ke{^7-a zWRZ*cI~1U7P-4mB$H<9_$W*)eo$=#r%V(X#@Jmsah=ELE0m-+GE_eplv6h92*?WlS z1h7jgb#cEiEp=p+=3FBhmriPk@+^3W6#56OoqhVIfZTq$a+ z$BKUEnGyw?DPgd;oIHU$Nl>>-4ISIwFQhhS7YgegYSP%o{^7RfgBQY*l4Ts)0sy-8$OvXVuWNC68Q!fCvq@-aia?h zhu|GwEk&*@L#eFDg3j()Ek&jPr7ZAtVyW?!#fheLw5<2EtVKZLS&^)ayp}DhcF0U= zxeD3#Y_j^|YGgl0vUif~=Lt~@IMZx6+d-jd7tMB-w5W@fC08Z8nPi=h3MbHTvO16m zzZ0(@TU2KcL4G@Uozcs027B^m+ieSn#a4u58^ZDk$<_~&Ey@T|l=ho;8OgGY(#lhp GeDwcjhHydv delta 3523 zcmZuz3v^V~72Rj%&Aj=%Op?juGhvcIfFw+Uu_$1`0vZvKPbreJBBeDhW5_ z?W|R)t*!FA^+QA`wL(i#LCAzaL8O#cYHL4Q?blZA2ed#xDk>%2_q|~$ln7+7eWn1HlWc$*_8#+7NR!?v5N{$a; z4(_wC244{vUG4WI1n#;KQv(ou)xy{CfO^~)^?t*`gLr7~0bf9j#{@$+6hzd-K)!m% zzgQkup9#$JZpAhe-%`5*jf1|8WP6AuwA_$80y=K?^^gC zcB&!4&$>-Kqn-)I0~*I}3w!XKIv*VC-6x38o38c*Yt8W{(t_dYjJH(H@_2)Dmvt_f zy<%y?#D2BT8lKmS3XS%lg&*LMdcm4h^Sp&4xLT0k-qqaJmAEa@(bb-8UzrG?2S+VL z@k2pNo%(dJNWGkAshji0Ry~a$SvanN2MByxV)ZI|(ffa5;YFNKoAag`FA1tOijARs z@6Ro~j9;kY(6}MLvQUP?03O9F7GA{z0`H3D3)+%&CwR@m>uP!Ey5iz1v9EeVFBML@ zd_^6Rh#LD2ZGh4<9C zg7!vyXyKnY9mFbpY~egU5QMt2QR%d6XcsJ;!C9Yx1{QlgmUzY77+&YilYCP`>f!J( zDNqN()4dT(3MH(pq8fi0Ns_2wg4$*jxo;m~XQ*a8rK9-@N=zzEsi3<7scCnXRLNlV zL{ZJmY8htAP(gTL!_;J=vn{!-(~{xXNlP7xyOTk9q}Gx;G;!+^CmY&O^P;wng$X*U zmbfMLsxZ=GFwr$?u&c%wltvk4$u;V+NK-f_V+b4DHKywz%pw5-6rxEmXB4|d{<*oQA+ zU5ch}ao}J*Ht>nS;D=6?o^2#pmpu!@A|U;)0EGmTkL^%g_0VV&zKMt7#UosAfzeNF zUK3(sm5Bxuk8;)k#QL!m=B4jdcWHUbUN9 zcF}trY{TV;(Vd`*WblQL^i&fel(0eOM_-UyXZbG&E2(hwyY7&mO_vnFrC+ zdJw&>z37Xlae)61Z-VKjq)6Bc>Z)igb&Lj*Y5aJNSBkyG=C=N~jYIfpt2=7kHqH}| zdeZnAcl@#&`GYng$mvw7@z=EU8y&4-^L;DAobMr^=O~3e)Zsox-orHQW90i$i$09y zcs)DfEF8k;I4)vK?84C$R^u4E{c-m57fHhjn-)iR8?v-)z;CH6q2V?79e&UB#wgi8 z(7c;QTkuExiBM+I=^OYnndw3${(?6-dyBxV?8&!zQYJpC90!$eA`z&R%N!tf!+ zKNGzs{@Sl&(~`?9dU6+~pJ4n0t0qI$JNE*m{Y;$}c;+CNO#Ge31pmNECwIJ9T$}-A zWb;#}j@zuBI^4|`vzu>Dxkv5hqEq1^TOY5mq+X@Z*KKliI6RyoM~7p;m9L9~Jyu;P zFHh;-;I((Xk#oY6IU%~ua#a^mE1~EjE{xaru)i3((S-k%#(xHishp;OQ{?hp*8XXh z$rp<3ZfT<7Jp80K)vDv7ORfKaeOt>Nj z-q@M_H)b$|v=;2vRiBokU1Y@R-nMdOYL5R<)_+KfS>TMEUjQW;d-JI*m%goRaXAKc zr%Oxead?bfZf!cJoMaA}Z9#~mPL!kHTrriid5hgAnEMh|*L%Fi9R408Mt$kjQAu8}O{oSe&|pibw4tdfRfQ?SnXv;!4Sk}~NaJ*Z`GkPa zHkebFgIPo{?WmANsF5W(WYlKBl)_60*Jj8lbRh7XPaOaGobW5$_7667^;%UZHQJ@G zJxvdtk9A@0fKx}?E0HIwShA~g97eOzN9~xi?3Xdq~b8S^=}eoF2` zP}bzwwz9UZjBSw#GBJzVF&U-FRwB;A*AG{M{}AD?CH(a{E^^?f=;I<`RFB3#DeEj3 zzqWq`{K89Cx^rw_3SXNRR{2Fe&d)Fssn>0k-zIZ?P7~)xiQU6_ diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/activator/Activator.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/activator/Activator.class index 2745d60f6c02ce3c3d6ec96bbe9cc6cfa0ff0cad..48ac214753f7545f4ac4d024eb6d70ab997ab718 100644 GIT binary patch delta 79 zcmdnUwVi9j5=L45qQtV)JpJOrl+-f)f}GOy%sk)3yu|d>+|<01$@>`96^u1BeefyT J%*3S63;>*o9Krwq delta 36 pcmdnawUKMX5=KUy$!{1X7>gz!WK?G~nEaAa8q5~nEX^dt3;^P;3mE_a diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/other/ConfigEditor.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/other/ConfigEditor.class index 23e6a7f485ab98f3004b90bfb9666f0322bfcb8f..6c4b29bcffa5f16ab886920cc62c61b72171f438 100644 GIT binary patch delta 737 zcmZvZOHWfl7>1uYypc3ocEmb&Nt`xeE(be0(7!qLlf+h zSGA3@Wbw{-o$alUT{0$&a6XqxhmRXqbb(_ymCP8q{P?IqufFZ6$h473hKF_vrnzeQZL9%yW<9@j^LBZ6p+yAD)-vhChbw?A|>*^E`C(h{tllK45+7W|n92m;G3zq3Q{hPk6A_Tkjp?jtinBKRYh( z@4&5oj}J3jsizq~Ewr+o9R%2;&b{m;LK{(n^b#ULyPR>Jwshg8TmEqFoBoCslVS{o zKG4`+B%|?`zR)tBMEerCk2I=_O1=y~MpD4>X$IU=NuJ zJTWht78TLV3AG2Xt6is#9+mEp(oqhp)lVOT^q(QdQBJCsZIu|DVpu5^2%8!e&L&Z-+(l4SFPpL zuCdv|?LuQyZb}$l;FIR_V}OsWg49TAVBE@krXYxWhdMoBN9B zR$XA;%h_D#p~E8vb^x;cR2}C!z<|DI2`!s9v$%#TxU4g>@bnxbKMgq0c-HuZ7k`9%e#fLcRk| zv4cUeH6*sqimfwrGc1NiIKnxxaGn9iMRiFIVmVmHBvW#e#WWE?1!#$97(5s3pn5lo nmK0wI4r2@`!7q6wB2yTH*ZQK<-IWUlON(#~8-o?gf#S`7D7J@u diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicContentAssistProcessor.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicContentAssistProcessor.java index c083ba77..83bc8479 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicContentAssistProcessor.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicContentAssistProcessor.java @@ -1,7 +1,10 @@ package raven.sqdev.editors; import java.util.ArrayList; -import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.Stream; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.contentassist.CompletionProposal; @@ -33,26 +36,32 @@ public BasicContentAssistProcessor(BasicCodeEditor editor) { @Override public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) { - String prefix = EditorUtil.getWordPartBeforeOffset(viewer.getDocument(), offset); + String prefix = EditorUtil.getWordPartBeforeOffset(viewer.getDocument(), offset).toLowerCase(); - List keywords; - // get the respective list of keywords - if (prefix.isEmpty()) { - keywords = editor.getBasicConfiguration().getAllConfiguredKeywords(); - } else { - keywords = editor.getBasicConfiguration().getConfiguredKeywordsFor(prefix.charAt(0)); - } + Map keywords = editor.getBasicConfiguration().getAllConfiguredKeywords(); ArrayList proposals = new ArrayList(); // create proposals - for (Keyword currentKeyword : keywords) { - if (currentKeyword.getKeyword().toLowerCase().startsWith(prefix.toLowerCase())) { + Stream keywordStream = keywords.values().stream().filter(new Predicate() { + + @Override + public boolean test(Keyword keyword) { + return keyword.getKeyword().toLowerCase().startsWith(prefix); + } + }); + + keywordStream = keywordStream.sorted(); + + keywordStream.forEachOrdered(new Consumer() { + + @Override + public void accept(Keyword keyword) { // add a proposal - proposals.add(new BasicCompletionProposal(currentKeyword, offset - prefix.length(), + proposals.add(new BasicCompletionProposal(keyword, offset - prefix.length(), prefix.length())); } - } + }); if (proposals.size() > 0) { return proposals.toArray(new ICompletionProposal[proposals.size()]); diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicSourceViewerConfiguration.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicSourceViewerConfiguration.java index d1e833f2..1c4a1880 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicSourceViewerConfiguration.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicSourceViewerConfiguration.java @@ -36,14 +36,13 @@ * @see {@linkplain SourceViewerConfiguration} * */ -public class BasicSourceViewerConfiguration extends SourceViewerConfiguration - implements IPropertyChangeListener { - +public class BasicSourceViewerConfiguration extends SourceViewerConfiguration implements IPropertyChangeListener { + /** * The color manager */ protected ColorManager colorManager; - + /** * The configured keywordScanner providing the keywords for the syntax * highlighting
@@ -51,109 +50,98 @@ public class BasicSourceViewerConfiguration extends SourceViewerConfiguration * their keyword highlighting */ protected Map configuredKeywordScanners; - + /** * The MultiKeywordScanner that will be applied for this * SourceViewerConfiguration */ protected MultiKeywordScanner multiScanner; - + /** * The editor this SourceViewer is applied on */ protected BasicCodeEditor editor; - + /** * The contentAssistant for this editor */ protected ContentAssistant assistant; - + public BasicSourceViewerConfiguration(ColorManager manager, BasicCodeEditor editor) { this.setColorManager(manager); this.editor = editor; - + this.configuredKeywordScanners = new HashMap(); this.multiScanner = new MultiKeywordScanner(editor); - + // register to get notified about preference changes SQDevPreferenceUtil.getPreferenceStore().addPropertyChangeListener(this); } - + @Override public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) { return editor.getBasicProvider().getPartitionScanner().getConfiguredContentTypes(); } - + public ColorManager getColorManager() { return colorManager; } - + public void setColorManager(ColorManager colorManager) { this.colorManager = colorManager; } - + /** * Gets all configured Keywords */ - public List getAllConfiguredKeywords() { + public List getAllConfiguredKeywordsAsList() { ArrayList keywordList = new ArrayList(); - - Iterator> iterator = configuredKeywordScanners.entrySet() - .iterator(); - + + Iterator> iterator = configuredKeywordScanners.entrySet().iterator(); + while (iterator.hasNext()) { // add the respective keywords to the list - keywordList.addAll( - iterator.next().getValue().getKeywordProvider().getKeywordList().getKeywords()); + keywordList.addAll(iterator.next().getValue().getKeywordProvider().getKeywordList().getKeywords().values()); } - + return keywordList; } - + /** - * Gets a list of all configured Keywords starting with the given character - * - * @param c - * The starting charcter + * Gets all configured Keywords */ - public List getConfiguredKeywordsFor(char c) { - ArrayList keywordList = new ArrayList(); - - Iterator> iterator = configuredKeywordScanners.entrySet() - .iterator(); - - while (iterator.hasNext()) { - // add the respective keywords to the list - keywordList.addAll( - iterator.next().getValue().getKeywordProvider().getKeywordList().getListFor(c)); + public Map getAllConfiguredKeywords() { + Map keywords = new HashMap<>(); + + for (KeywordScanner currentScanner : configuredKeywordScanners.values()) { + keywords.putAll(currentScanner.getKeywordProvider().getKeywordList().getKeywords()); } - - return keywordList; + + return keywords; } - + /** * Gets the keywordScanner for this configuration * * @param colorPreferenceKey * The preference key for the color of the desired * KeywordScanner - * @return The KeywordScanner working for the given preference - * key or null if no such scanner could be found + * @return The KeywordScanner working for the given preference key + * or null if no such scanner could be found */ public KeywordScanner getKeywordScanner(String colorPreferenceKey) { if (!configuredKeywordScanners.containsKey(colorPreferenceKey)) { return null; } - + // return scanner return configuredKeywordScanners.get(colorPreferenceKey); } - + /** - * Creates a KeywordScanner for the given preference key that - * is automatically registered to this - * BasicSourceViewerConfiguration if there is no other scanner - * for that key + * Creates a KeywordScanner for the given preference key that is + * automatically registered to this BasicSourceViewerConfiguration + * if there is no other scanner for that key * * @param colorPreferenceKey * The key the scanner should be configured for @@ -163,20 +151,19 @@ public KeywordScanner getKeywordScanner(String colorPreferenceKey) { public void createKeywordScanner(String colorPreferenceKey, boolean caseSensitive) { if (!configuredKeywordScanners.containsKey(colorPreferenceKey)) { // create new scanner - KeywordScanner scanner = new KeywordScanner(new BasicKeywordProvider(), - colorPreferenceKey, this.editor); - + KeywordScanner scanner = new KeywordScanner(new BasicKeywordProvider(), colorPreferenceKey, this.editor); + if (!caseSensitive) { scanner.makeCaseSensitive(caseSensitive); } - + configuredKeywordScanners.put(colorPreferenceKey, scanner); - + // add to multiScanner multiScanner.addScanner(scanner); } } - + /** * Checks if a KeywordScanner for the given preference key does * exist in this BasicSourceViewerConfiguration @@ -187,80 +174,77 @@ public void createKeywordScanner(String colorPreferenceKey, boolean caseSensitiv public boolean scannerExists(String colorPreferenceKey) { return configuredKeywordScanners.containsKey(colorPreferenceKey); } - + /** * Gets the KeywordScanner that contains the given * Keyword * * @param keyword * The Keyword to search for - * @return The matching KeywordScanner or null if - * none could be found + * @return The matching KeywordScanner or null if none + * could be found */ public KeywordScanner getKeywordScannerContaining(Keyword keyword) { - Iterator> iterator = configuredKeywordScanners.entrySet() - .iterator(); - + Iterator> iterator = configuredKeywordScanners.entrySet().iterator(); + while (iterator.hasNext()) { KeywordScanner currentScanner = iterator.next().getValue(); - + if (currentScanner.contains(keyword)) { return currentScanner; } } - + return null; } - + /** * Gets the KeywordScanner that contains a Keyword * matching the given word * * @param word * The word to search for - * @return The matching KeywordScanner or null if - * none could be found + * @return The matching KeywordScanner or null if none + * could be found */ public KeywordScanner getKeywordScannerContaining(String word) { - Iterator> iterator = configuredKeywordScanners.entrySet() - .iterator(); - + Iterator> iterator = configuredKeywordScanners.entrySet().iterator(); + while (iterator.hasNext()) { KeywordScanner currentScanner = iterator.next().getValue(); - + if (currentScanner.contains(word)) { return currentScanner; } } - + return null; } - + @Override public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) { PresentationReconciler reconciler = new PresentationReconciler(); - + // syntax highlighting for keywords DefaultDamagerRepairer dr_Default = new DefaultDamagerRepairer(multiScanner); reconciler.setDamager(dr_Default, IDocument.DEFAULT_CONTENT_TYPE); reconciler.setRepairer(dr_Default, IDocument.DEFAULT_CONTENT_TYPE); - + boolean containsString = false; boolean containsComment = false; - - for (String currentType : editor.getBasicProvider().getPartitionScanner() - .getConfiguredContentTypes()) { + + for (String currentType : editor.getBasicProvider().getPartitionScanner().getConfiguredContentTypes()) { switch (currentType) { - case BasicPartitionScanner.BASIC_STRING: - containsString = true; - break; - - case BasicPartitionScanner.BASIC_COMMENT: - containsComment = true; - break; + case BasicPartitionScanner.BASIC_STRING: + containsString = true; + break; + + case BasicPartitionScanner.BASIC_COMMENT: + containsComment = true; + break; } } - + if (containsString) { // colorize strings NonRuleBasedDamagerRepairer ndr_String = new NonRuleBasedDamagerRepairer( @@ -268,7 +252,7 @@ public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceVie reconciler.setDamager(ndr_String, BasicPartitionScanner.BASIC_STRING); reconciler.setRepairer(ndr_String, BasicPartitionScanner.BASIC_STRING); } - + if (containsComment) { // colorize comments NonRuleBasedDamagerRepairer ndr_Comment = new NonRuleBasedDamagerRepairer( @@ -276,58 +260,58 @@ public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceVie reconciler.setDamager(ndr_Comment, BasicPartitionScanner.BASIC_COMMENT); reconciler.setRepairer(ndr_Comment, BasicPartitionScanner.BASIC_COMMENT); } - + return reconciler; } - + @Override public IContentAssistant getContentAssistant(ISourceViewer viewer) { assistant = new ContentAssistant(); assistant.enableAutoInsert(SQDevPreferenceUtil.isAutoCompleteEnabled()); assistant.enableColoredLabels(true); - + IContentAssistProcessor processor = new BasicContentAssistProcessor(editor); - + assistant.setContentAssistProcessor(processor, IDocument.DEFAULT_CONTENT_TYPE); - + assistant.setInformationControlCreator(getInformationControlCreator(viewer)); - + return assistant; } - + @Override public ITextHover getTextHover(ISourceViewer sv, String contentType) { return new BasicTextHover(editor); } - + @Override public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new DefaultAnnotationHover(); } - + @Override public void propertyChange(PropertyChangeEvent event) { if (event.getNewValue() == null) { // if there is no useful new value just ignore it return; } - + // watch out for a change concerning the autoCompletion switch (event.getProperty()) { - case SQDevPreferenceConstants.SQDEV_EDITOR_ENABLE_AUTOCOMPLETE_KEY: - assistant.enableAutoActivation((boolean) event.getNewValue()); - break; - - default: - if (configuredKeywordScanners.containsKey(event.getProperty())) { - // configure respective keyword scanner - configuredKeywordScanners.get(event.getProperty()).syncToPropertyChange(event); - } else { - // don't update editor - return; - } + case SQDevPreferenceConstants.SQDEV_EDITOR_ENABLE_AUTOCOMPLETE_KEY: + assistant.enableAutoActivation((boolean) event.getNewValue()); + break; + + default: + if (configuredKeywordScanners.containsKey(event.getProperty())) { + // configure respective keyword scanner + configuredKeywordScanners.get(event.getProperty()).syncToPropertyChange(event); + } else { + // don't update editor + return; + } } - + editor.update(true); } } diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicTextHover.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicTextHover.java index 062018f1..8b00fce8 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicTextHover.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicTextHover.java @@ -13,17 +13,16 @@ import raven.sqdev.miscellaneous.AdditionalKeywordProposalInformation; import raven.sqdev.util.EditorUtil; -public class BasicTextHover - implements ITextHover, ITextHoverExtension, ITextHoverExtension2 { - +public class BasicTextHover implements ITextHover, ITextHoverExtension, ITextHoverExtension2 { + /** * The editor this assist works on */ private BasicCodeEditor editor; - + /** - * Creates an instance of this hover assist that will use the keywords of - * the given editor as a foundation + * Creates an instance of this hover assist that will use the keywords of the + * given editor as a foundation * * @param editor * The editor this assist works on @@ -31,56 +30,53 @@ public class BasicTextHover public BasicTextHover(BasicCodeEditor editor) { this.editor = editor; } - + @Override public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { // won't get called return null; } - + @Override public IRegion getHoverRegion(ITextViewer textViewer, int offset) { return new Region(offset, 0); } - + @Override public IInformationControlCreator getHoverControlCreator() { return new IInformationControlCreator() { - + @Override public IInformationControl createInformationControl(Shell parent) { return new BasicInformationControl(parent, false); } }; } - + @Override public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) { // get the respective word - String word = EditorUtil.getWordAroundOffset(textViewer.getDocument(), - hoverRegion.getOffset()); - + String word = EditorUtil.getWordAroundOffset(textViewer.getDocument(), hoverRegion.getOffset()); + AdditionalKeywordProposalInformation info = null; - + if (!word.isEmpty()) { // check if there is a corresponding keyword - KeywordScanner scanner = editor.getBasicConfiguration() - .getKeywordScannerContaining(word); - + KeywordScanner scanner = editor.getBasicConfiguration().getKeywordScannerContaining(word); + if (scanner != null) { // create the info for this keyword info = new AdditionalKeywordProposalInformation( - scanner.getKeywordProvider().getKeywordList() - .getKeyword(word, scanner.isCaseSensitive())); - - if(info.isEmpty()) { + scanner.getKeywordProvider().getKeywordList().getKeyword(word)); + + if (info.isEmpty()) { // There isn't actually information to display info = null; } } } - + return info; } - + } diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/KeywordScanner.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/KeywordScanner.java index 84279b51..88c5c84c 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/KeywordScanner.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/KeywordScanner.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.text.TextAttribute; @@ -33,78 +34,74 @@ * @author Raven * */ -public class KeywordScanner extends RuleBasedScanner - implements IKeywordListChangeListener { +public class KeywordScanner extends RuleBasedScanner implements IKeywordListChangeListener { /** * The preferenceKey for the color of the token */ protected String preferenceKey; - + /** * The keyworProvider for this token */ protected IKeywordProvider provider; - + /** * The editor this scanner is working for */ protected BasicCodeEditor editor; - + /** * The token this scanner produces */ protected IToken token; - + /** * The default token the corrsponding WordRule will use */ protected IToken defaultToken; - + /** * indicates whether the keywords should be matched case sensitively */ protected boolean caseSensitive; - + /** * A list of IKeywordListChangeListeners */ protected List keywordListListeners; - + /** * A list of IUpdateListener */ protected List updateListeners; - + /** - * Indicates whether this scanner is part of a - * MultiKeywordScanner + * Indicates whether this scanner is part of a MultiKeywordScanner */ protected boolean isPartOfMultiScanner; - + /** * Creates an instance of this scanner * * @param provider - * An IKeyowrdProvider that will supply this method - * with keywords + * An IKeyowrdProvider that will supply this method with + * keywords * @param colorPreferenceKey - * The key of the preference describing the color of the - * highlighting of the keywords + * The key of the preference describing the color of the highlighting + * of the keywords * @param editor * The editor this scanner is working on * @param caseSensitive * Whether or not to match keywords case sensitive */ - public KeywordScanner(IKeywordProvider provider, String colorPreferenceKey, - BasicCodeEditor editor, boolean caseSensitive) { - String strColor = SQDevPreferenceUtil.getPreferenceStore() - .getString(colorPreferenceKey); - + public KeywordScanner(IKeywordProvider provider, String colorPreferenceKey, BasicCodeEditor editor, + boolean caseSensitive) { + String strColor = SQDevPreferenceUtil.getPreferenceStore().getString(colorPreferenceKey); + if (strColor == null || strColor.isEmpty()) { - throw new IllegalArgumentException( - "Invalid preference key \"" + colorPreferenceKey + "\""); + throw new IllegalArgumentException("Invalid preference key \"" + colorPreferenceKey + "\""); } - + // assign variables preferenceKey = colorPreferenceKey; this.provider = provider; @@ -113,58 +110,55 @@ public KeywordScanner(IKeywordProvider provider, String colorPreferenceKey, defaultToken = Token.UNDEFINED; keywordListListeners = new ArrayList(); updateListeners = new ArrayList(); - - Color color = new Color(Display.getCurrent(), - ColorUtils.decodeRGB(strColor)); - + + Color color = new Color(Display.getCurrent(), ColorUtils.decodeRGB(strColor)); + token = new Token(new TextAttribute(color, null, SWT.BOLD)); - + updateRules(provider.getKeywordList().getKeywords().size() > 0); - + // add this as a listener for the keyword provider this.provider.addKeywordListChangeListener(this); } - + /** * Creates an instance of this scanner (case sensitive) * * @param provider - * An IKeyowrdProvider that will supply this method - * with keywords + * An IKeyowrdProvider that will supply this method with + * keywords * @param colorPreferenceKey - * The key of the preference describing the color of the - * highlighting of the keywords + * The key of the preference describing the color of the highlighting + * of the keywords * @param editor * The editor this scanner is working on */ - public KeywordScanner(IKeywordProvider provider, String colorPreferenceKey, - BasicCodeEditor editor) { + public KeywordScanner(IKeywordProvider provider, String colorPreferenceKey, BasicCodeEditor editor) { this(provider, colorPreferenceKey, editor, true); } - + /** - * Synchronizes this scanner to a PropertyChangeEvent (adjusts the color of - * the highlighting + * Synchronizes this scanner to a PropertyChangeEvent (adjusts the color of the + * highlighting * * @param event - * The respective PropertyChangeEvent. Must be the same as the - * one this scanner has been initialized with + * The respective PropertyChangeEvent. Must be the same as the one + * this scanner has been initialized with */ public void syncToPropertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(preferenceKey)) { // if the changed property is the one for the color this scanner // depends on if (event.getNewValue() != null) { - Color color = new Color(Display.getCurrent(), - ColorUtils.decodeRGB((String) event.getNewValue())); - + Color color = new Color(Display.getCurrent(), ColorUtils.decodeRGB((String) event.getNewValue())); + token = new Token(new TextAttribute(color, null, SWT.BOLD)); - + updateRules(true); } } } - + /** * Will update the applied rules for this scanner according to the * keywordProvider and the {@link #token}.
@@ -174,33 +168,30 @@ public void syncToPropertyChange(PropertyChangeEvent event) { * Indicates if the editor shoukd be updated */ protected void updateRules(boolean updateEditor) { - ArrayList keywordList = provider.getKeywordList() - .getKeywords(); - - Keyword[] keywords = keywordList - .toArray(new Keyword[keywordList.size()]); - + Map keywordList = provider.getKeywordList().getKeywords(); + + Keyword[] keywords = keywordList.values().toArray(new Keyword[keywordList.size()]); + // create the respective WordRule - WordRule keywordRule = new WordRule(new WordDetector(), - getDefaultToken(), !isCaseSensitive()); - + WordRule keywordRule = new WordRule(new WordDetector(), getDefaultToken(), !isCaseSensitive()); + // add keywords for (Keyword currentKeyword : keywords) { keywordRule.addWord(currentKeyword.getKeyword(), token); } - + IRule[] rules = { keywordRule }; - + this.setRules(rules); - + if (!isPartOfMultiScanner && updateEditor) { // only update editor if this scanner is autonomous editor.update(false); } - + notifyUpdateListener(); } - + /** * Gets the rule for this KeywordScanner that describes which * keywords to color in the respective color of this scanner @@ -212,33 +203,31 @@ public IRule getRule() { if (fRules == null || fRules.length == 0) { return null; } - + return fRules[0]; } - + /** * Gets the keywordProvider of this scanner */ public IKeywordProvider getKeywordProvider() { return provider; } - + /** - * Sets the keywordProvider for this scanner and updates the editor - * accordingly + * Sets the keywordProvider for this scanner and updates the editor accordingly * * @param provider * The new keywordProvider */ public void setKeywordProvider(IKeywordProvider provider) { this.provider = provider; - + updateRules(true); - - notifyKeywordListChangeListeners( - IKeywordListChangeListener.CTX_LIST_REMOVED); + + notifyKeywordListChangeListeners(IKeywordListChangeListener.CTX_LIST_REMOVED); } - + /** * Sets the keywords for this scanner * @@ -248,14 +237,13 @@ public void setKeywordProvider(IKeywordProvider provider) { public void setKeywords(KeywordList list) { IKeywordProvider provider = getKeywordProvider(); provider.setKeywordList(list); - + setKeywordProvider(provider); - + // notify listeners about change - notifyKeywordListChangeListeners( - IKeywordListChangeListener.CTX_LIST_CHANGED); + notifyKeywordListChangeListeners(IKeywordListChangeListener.CTX_LIST_CHANGED); } - + /** * Gets the token of this scanner */ @@ -263,19 +251,18 @@ public IToken getToken() { if (token == null) { token = new Token(new TextAttribute(getColor(), null, SWT.BOLD)); } - + return token; } - + /** * Gets the color for the token of this keywordScanner */ protected Color getColor() { return new Color(Display.getCurrent(), - ColorUtils.decodeRGB(SQDevPreferenceUtil.getPreferenceStore() - .getString(preferenceKey))); + ColorUtils.decodeRGB(SQDevPreferenceUtil.getPreferenceStore().getString(preferenceKey))); } - + /** * Sets whether the keywords should be matched case sensitively * @@ -284,31 +271,31 @@ protected Color getColor() { */ public void makeCaseSensitive(boolean sensitive) { caseSensitive = sensitive; - + // apply changes updateRules(true); } - + /** * Checks whether this scanner matches keywords case sensitivelys */ public boolean isCaseSensitive() { return caseSensitive; } - + /** - * Sets the default token the WordRule corresponding to this KeywordScanner - * will use as the default token + * Sets the default token the WordRule corresponding to this KeywordScanner will + * use as the default token * * @param token * The new default token */ public void setDefaultToken(IToken token) { Assert.isNotNull(token); - + defaultToken = token; } - + /** * Gets the default token of this KeywordScanner * @@ -317,7 +304,7 @@ public void setDefaultToken(IToken token) { public IToken getDefaultToken() { return defaultToken; } - + /** * Checks whether this KeywordScanner contains the given * Keyword @@ -328,7 +315,7 @@ public IToken getDefaultToken() { public boolean contains(Keyword keyword) { return getKeywordProvider().getKeywordList().contains(keyword); } - + /** * Checks whether this KeywordScanner contains a * Keyword matching the given word @@ -337,10 +324,9 @@ public boolean contains(Keyword keyword) { * The word to search for */ public boolean contains(String word) { - return getKeywordProvider().getKeywordList().getKeyword(word, - isCaseSensitive()) != null; + return getKeywordProvider().getKeywordList().getKeyword(word) != null; } - + /** * Notifies all IKeywordListChangeListeners * @@ -352,7 +338,7 @@ protected void notifyKeywordListChangeListeners(String ctx) { listener.keywordListChanged(ctx); } } - + /** * Notifies all IUpdateListeners */ @@ -361,32 +347,30 @@ protected void notifyUpdateListener() { listener.updated(); } } - + /** - * Adds the given IKeywordListChangeListener if it is not - * already registered + * Adds the given IKeywordListChangeListener if it is not already + * registered * * @param listener * The listener to add */ - public void addKeywordListChangeListener( - IKeywordListChangeListener listener) { + public void addKeywordListChangeListener(IKeywordListChangeListener listener) { if (!keywordListListeners.contains(listener)) { keywordListListeners.add(listener); } } - + /** * Removes the given IKeywordListChangeListener * * @param listener * The listener to remove */ - public void removeKeywordListChangeListener( - IKeywordListChangeListener listener) { + public void removeKeywordListChangeListener(IKeywordListChangeListener listener) { keywordListListeners.remove(listener); } - + /** * Adds the given listener if it is not already added * @@ -398,7 +382,7 @@ public void addUpdateListener(IUpdateListener listener) { updateListeners.add(listener); } } - + /** * Removes the given listener * @@ -408,15 +392,15 @@ public void addUpdateListener(IUpdateListener listener) { public void removeUpdateListener(IUpdateListener listener) { updateListeners.remove(listener); } - + @Override public void keywordListChanged(String ctx) { if (ctx.equals(IKeywordListChangeListener.CTX_LIST_CHANGED)) { // update rules - + updateRules(true); } - + // forward event notifyKeywordListChangeListeners(ctx); } diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/activator/Activator.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/activator/Activator.java index efeed618..29b8705e 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/activator/Activator.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/activator/Activator.java @@ -5,7 +5,7 @@ import org.osgi.framework.BundleContext; import raven.sqdev.misc.SQDevPreferenceUtil; -import raven.sqdev.pluginManager.SQDevPluginManager; +import raven.sqdev.pluginManagement.SQDevPluginManager; /** * The activator class controls the plug-in life cycle diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/other/ConfigEditor.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/other/ConfigEditor.java index ff526b16..cf239017 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/other/ConfigEditor.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/other/ConfigEditor.java @@ -1,7 +1,8 @@ package raven.sqdev.editors.other; import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import org.eclipse.jface.text.rules.MultiLineRule; import org.eclipse.jface.text.rules.Token; @@ -16,74 +17,65 @@ import raven.sqdev.misc.Macro; public class ConfigEditor extends BasicCodeEditor implements IMacroSupport { - - private List macros; - + + private Map macros; + public ConfigEditor() { super(); - - macros = new ArrayList(); - + + macros = new HashMap(); + // configure macro syntax highlighting - configuration.createKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_MACROHIGHLIGHTING_COLOR_KEY, - true); - configuration.createKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_KEYWORDHIGHLIGHTING_COLOR_KEY, - true); - + configuration.createKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_MACROHIGHLIGHTING_COLOR_KEY, true); + configuration.createKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_KEYWORDHIGHLIGHTING_COLOR_KEY, true); + // set keywords for this scanner - setKeywords(configuration.getKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_KEYWORDHIGHLIGHTING_COLOR_KEY)); - + setKeywords( + configuration.getKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_KEYWORDHIGHLIGHTING_COLOR_KEY)); + // get PartitionScanner - BasicPartitionScanner partitionScanner = getBasicProvider() - .getPartitionScanner(); - + BasicPartitionScanner partitionScanner = getBasicProvider().getPartitionScanner(); + // exchange the string rule of the partitionScanner + partitionScanner.removeRule(BasicPartitionScanner.DOUBLE_QUOTE_STRING_RULE); partitionScanner - .removeRule(BasicPartitionScanner.DOUBLE_QUOTE_STRING_RULE); - partitionScanner.addRule(new MultiLineRule("\"", "\"", - new Token(BasicPartitionScanner.BASIC_STRING), (char) 0, true)); + .addRule(new MultiLineRule("\"", "\"", new Token(BasicPartitionScanner.BASIC_STRING), (char) 0, true)); } - + /** * Sets the keywords available in this editor * * @param scanner - * The KeywordScanner the Keywords have to be added - * to (e.g. in form of a KeywordProvider). By - * default this scanner is case-sensitive + * The KeywordScanner the Keywords have to be added to + * (e.g. in form of a KeywordProvider). By default this + * scanner is case-sensitive */ protected void setKeywords(KeywordScanner scanner) { scanner.getKeywordProvider().addKeyword(new Keyword("class")); } - + @Override - public boolean setMacros(List macros, boolean update) { + public boolean setMacros(Map macros, boolean update) { if (!this.macros.equals(macros)) { - this.macros = new ArrayList(macros); - - configuration - .getKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_MACROHIGHLIGHTING_COLOR_KEY) - .getKeywordProvider() - .setKeywordList(new KeywordList(this.macros)); - + this.macros = new HashMap<>(macros); + + configuration.getKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_MACROHIGHLIGHTING_COLOR_KEY) + .getKeywordProvider().setKeywordList(new KeywordList(new ArrayList<>(this.macros.values()))); + if (update) { update(false); } - + return true; } - - + + return false; } - + @Override - public List getMacros() { + public Map getMacros() { return macros; } - + } diff --git a/plugin/Raven.SQDev.Misc/.classpath b/plugin/Raven.SQDev.Misc/.classpath index cea67ffa..ef088d1c 100644 --- a/plugin/Raven.SQDev.Misc/.classpath +++ b/plugin/Raven.SQDev.Misc/.classpath @@ -4,5 +4,6 @@ + diff --git a/plugin/Raven.SQDev.Misc/.gitignore b/plugin/Raven.SQDev.Misc/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF index 60cbbcde..4d3cb342 100644 --- a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF @@ -31,7 +31,6 @@ Export-Package: org.antlr.v4.runtime, raven.sqdev.parser.preprocessor, raven.sqdev.parser.sqf, raven.sqdev.pluginManagement, - raven.sqdev.pluginManager, raven.sqdev.styles, raven.sqdev.syntax Import-Package: raven.sqdev.misc diff --git a/plugin/Raven.SQDev.Misc/bin/.gitignore b/plugin/Raven.SQDev.Misc/bin/.gitignore deleted file mode 100644 index 85996f46..00000000 --- a/plugin/Raven.SQDev.Misc/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/raven/ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/activator/Activator.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/activator/Activator.class index b0c18750a13d35b7c795369fc2f90be7f920e2dd..e966fbce31ca1a4635dcb39f3df216687f5f791e 100644 GIT binary patch delta 42 rcmeyv*2KQSoRLv~at)&dOKxgj$>cyrbw=aKm5kCbuJGm+j8_-|4_FM% delta 32 ocmZo-|HHPyoRLvyay_F2W6|UgMs-Gm$u*49j76JgGd^bo0GRa&Q~&?~ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/ProblemMessages.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/ProblemMessages.class index 766f614b96adf502ecb89526689986d1d224a4be..5c89521644264ae34323e329f4c28ffd2abf231c 100644 GIT binary patch delta 532 zcmZvYOG`pQ6oAhp*hDnn^BtTR>PTC)SUA^p(_On7RZDozVFb8_2`USX@U zNbLYz5=gE0u7d7&1y-rcP)jT@v^#Z}bTn0(i%JT2xUQnLY0VHA<>qxtP&=)ZQ~|gq z5RJ#Dxvs<{MV^SL8HOpL-YSZ0mE37{c< zvrlwS0DO_tN0Sag$i(3eB$=){)D_PE5iSOW+%Ms(C(QpD(H=B5`UZiU?)cj;vrvR$ delta 40 vcmZ3kJwcu8)W2Q(7#J8#7^ZLJTF*K8J(n({#AaFU1)Q9W3{!y;ObpWiALI+4 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/KeywordList.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/KeywordList.class index 1a0b7085cf18abe45416faf53c19d37652193395..2ee9b468281476af229bacebe7ffbd4839f24af6 100644 GIT binary patch literal 6062 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 literal 7825 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/SQFCommand.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/SQFCommand.class index eb6869c29b9ca2d3335583845516c18eeaadae56..a34c2e8df825a422d8db0419a5ee23a8ddcbaa9a 100644 GIT binary patch delta 875 zcmXBTTWAz#6bJDC|IF^r?(CPOCa#;=s7<{@-8DqKq`63<7)r%pHEL88VWD}5O;vQG z4+;_TB7O1UduSs_9#lk7L>D$q3&~qW5rr1<&4BmV8t+wWj6JhH&2Q#>=bJhInK{?b z(SCZ@rhXd%uv}^{c`qsxQQjlUyp?qwUAf-&EEY#W^*2X;w!_~d}FWro%7xroW_}8^?SoZ*cRx6K_So%el(oo zC%Y!~-Pb}xpDC@2V_5T9VZ&N%i;K(4u0)B_-PwcLy53xOPhETWfm~EPdo|S-b;TGq zNJ&0XRi=-XpFcB`j0s#s0B112eVKKf3f|36)GuY#NqL7YI`2-zf+{+(RnL;nG2XY$ z4YM*2v`b_cYWXmbQ>yh}FrZ3c16#QYA*UH(KH_8B-|%Nz!+`LK?h(@2{>FMBJghDO zq$Qmh;?n`d)0qOF*}legp_c{zYi~4eQ0w2tPhDh~)3QwY@@OL%cKEWPDTLm~-B#H)k^gv#Y{T$CBAD9>p}5Lt}(utSnXjn`||tx^e(FVT**tUz4M=k#E-u||AJ!Qh1E zXEeX@;`%E4ZOiqv>#`hlc`G`p9VxBq=cdDG!uoy$r2sYAA(@$PX}!R{`+7^_82V+F z?kPBqBQjg%;AiCIOH~Mi=#gqw7-#Xle5H!uB6i9gm5U*4mbt1ZM$sGeZ#;>cO&t+>9tt@S*S_ zABHF+@}VMxB5Gmn0{WH^K~P9<24)v4E$wDz*4gdp`+YNWX6F2vu|68^Bj=NqhobX5WLM*OU`mJc0{^%C}u2TA|$VYyeXHt~+UnWIGXmPQH z?%CK%NIn$q4i}$@baWQicXUPUY}b?iYP*G6pdeKcW0q|^6;vJ%E-cQk(G91 zj?+Xo8o(W1EwaR#^58d$6kbWRd7>no*1c5)o_y(pxqu7h8-KlZw2cj`;~$sBr}F>+ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IMacroSupport.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IMacroSupport.class index a488acdcaaa65423b0926c1e0c955e7eeea735b5..6bd716c5767a502fcad919949b451e5a5f91a1c9 100644 GIT binary patch delta 142 zcmcb_^oeOggsZTIPgY`CqJC*fW{$pZVu5v(W)vd>XK-eEUSdgUQ7R*YJ(>y|h=!cR jymbBGlA_GKbnA%^q$VyGv=G$LL^F($!4_Q%tM(!QRUa_m delta 110 zcmeywbcty~gsF&zPgY`CqJC*fW{$p3W^svilx7qo17~n%dR}5lX;CU8gC4pPn@NmP W6SoU$2x(}dYi4B7!4L#0F9HC~c_XX< diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/ISQFParseInformation.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/ISQFParseInformation.class index 228dc759676d5ff95e70ff5ec3a1047f2ef6f981..00e2cbe5ce536d3eebf1f7a434be7dc18305ca01 100644 GIT binary patch delta 350 zcmaFEx|xmZ)W2Q(7#J8#7$hcg#kmM-X!>L&mL=+!mSpDW`z97xGcs@nXQt;RmXsEy zGBO0B%iBPd=OpH(>j#$E zjKar^CG}hkj125RKQJ+HvoJF7FtEY-96&xV1FAe9nmj+6ya1BCAW**$n!GTQya-TU OR18@G&}uQTQ^Wx>Qby+h delta 262 zcmdnY_J)<~)W2Q(7#J8#7{n)X#ZCMmD$g05nVy$eQd*SC$l#!%>64XMmZ)D^l9{9L zlUZD1GjWZ}WLCy*VLNP6ij%K08Vc)RN=?>cDye5hn3U-PZ0DVp6vm%t*=2VT6kIO;7t9NZfNm(2mt6xzK?oM`?v}VL%W_d%Xj#B3l$v+* z^4i5)W@eYMaWW>hS~VRl%go6SO;cIZbepD{X&U{~hqAMv1KRA&d-nX!*|X<8=XrNJ zuT{if{`dW}03PBSM(Bu9%9CnQC!=Fd*|sJyqt|ms8kzdd5!gcPp~cEBP#BVPup{Ol=?Q&YIEc{jGRd% z^#8or)7l^&gDEJs--PROv&tPvB~4F pprh+s2)i1<}Q~R_0GZ9F2x%>{@NyAz{C}IaA5=& z-@(m9sXCXOqAsKqj2`m8-8kH?o9FfCjWS6?8<){Q7DnO|jC@++d2t)LITG7Kq-T~XXM(17 z4Kv0^a=0xPUT!C5W@d@Ba#g1_LDF}|qMpwXj@$IA)jYTpburw7FOA$wOqNb2s;k!M z?zGfzs6S5RM|x9T);MJ!o}ho7u-#U$RjnO9iP_!V!|&I1O@;|m5f2Bfcm(5-hg`9f zk&kJZjsp2OF$;@Ph$#HCV;XSj!_=$B@|bSkFt? zz|XLeUtlw@V+()8R{oCd-TOvtnK4<7B=*A3zzlbCJX)j_$_HH3NdolV3?ez<(6k) z!C7cxN8kgb;~cVO-Zrrl#Gix%&~_ z()1y&wHq`;57&j+>52;RNqe+r(4u>|Axx``IL&ShbE9iqh@0#t&8V3o$y<9kS~K-< zhuy51BgwmZxLY$v2B7O5z$8R^xehbF!%%#Wv<&=!vG_?e`?K8o7g6o6qR`(&m4Arx z{uHhLg%!A=ZjDLlP~0ciGK=b-#otnJD3@(}R%-9g{_qjvEK`&v?FL3N}?{%*k4h4GFI08eV3Wv%`$&W3!m+QGj zWv3L!Z6$QBP*-5cz$)cPX*F!-BXQ8NTFs^u#u&I=)mf6YHAJsUOkJ*yTO64?h!mHv z&*K{M1Oo%1T6eFv&K>mjg$#U5C8Um98VHSR)WDrYOTE|Ul{1fbNR^}|tNGN5}rAg+H;IOVGgtbaExUEQgPEb_CdfUbYG7M>_`*;y6Zl6k|MtafT&c#C~4E z0e*~0UdLhHz!83rqr8c!`GuUz8tZ9jg@FMtBMz@18E0@G&SE8AQ`31P##zK-4i?O- zlof>&$Q8?P6!&Ym33`Ag=s?*|MxdNwOm8oYaI@3QN;9{G`S3f4XwZBId(=$Fy;!Z8 zb@yWRW;Wi7HJRBG=EQ#s?lQCWpTt?A5d)K~_0k1!PI`*SY|ab&2r}_5@^Ar#5=-zN zHi*i0iCb|=rt!Yqxg>M?0K0J+K8ZcJf)GB$n8f|KiX~DpZbEuBh^Fm~k>2B@&|SnO zJ1ck7El5*g%SZC8l=yzJRVFqkEt8RgNBJ6g? zgxPD0wd$;~3mk|r-5F-4O&{T)bM-`+LpFm|Z#6`-_bxEkYFOYCHlx)T&3ZlC z8PB2)>k*~+8I1S>Nw^^ze2rE3Mtu4$*5f;I=?~(_AH{_~iPLV1KYvCqep&3*w^(5S zxA3df00y|92SU=DQU0Py{3cH%iQ^9Pko1{}MjpoRVx(25<`MCqP9CuFX-HRMYTTDX-ykd|qObe4V793P!$w4bk`)VLe0W diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener.class index ea776327644894c04f9adc9d1822bc1e649ccb90..fb219a2085d965f4921d420bb5ae602c4f707df0 100644 GIT binary patch delta 69 zcmdnub;N6flDLJShNe$eVp*boX-Q^|zHefIH6w#9x|j__Nls#3x_)p;QD$Dc^=2>e GSG)ith!>Fn delta 53 tcmX@&wZ&_LlDLMDhNe$eVp*boX-Q^|zE5Uxi8UjG4u+u3<|y%3ya3!55#0a) diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseResult.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseResult.class index e2084e7432f5dda8604d08f44db0b8333a36bffb..21e6c53503d0306036044784a4faccfb90520621 100644 GIT binary patch delta 588 zcmZ`%OG^S#6#ni^G-Q^JniNG3(|k-dS(btYwMr;yA=G-Z!3U-`jz$pl8)BCI09P%9 zC~V=TT|57fbQ~XP&^>TD_dDPD&VyT@dbQZUJD)885yS*=3{j)aoW=|DKA%R8ZRdHV zrpQ%2SCErRInFSZ%4Ld*Ue#2F_;~cN_be#IjGWT7Trm?j9=ZAFFTX?ll}RX-EJ-yw zB1?*a;J8G58f#b=;9;2gO(D7!UicU$%T@iPP+)Kb{v-x34V4Q&SrEde0Exk^DK)hy zSMF}qntYq9q-lV(R%3z!S?8}(t>x&oQ$N*0UEM{DS4VxpX_MxgB Zd-OlLs>@g*t}tn)?i<;Om~deF(I5S|i!%TK delta 457 zcmZXO%}T>i5QWdZQA5*EtVzX!_*1RTpQe>Agt{rZEGP&H?xHOvA+%Ui!Ik(3ArH}& z3sIE1@B!TV9zKFNiDGNL1H;^z^PQPHX^@iMK3`q|RIwdO7vfgv-(VnW6` ziVQPOvsw3jhP*b0?sa{?bso6gPE9|JJYLaaA47%-i$NfUA@>9LPN!`joOz^=#bu$W zSpV)wj*miNaB~Pw0jP%gjJ)xPtoek+Ayzm}?y1kAP|iT0yo_mDtDpdte)HcPa#Y1n z#RgT3q6Cd{ntJ=BiQVPIcnJNEs{~%9p-EC}%u@cfl(C7e#Bzz2bBLtou%nNu9kHC$ Fl`sCbT`m9s diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParseInformation.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParseInformation.class index f561576760e51a01b81850c23689ccd796d6d074..a48c380f876e3c0f4f69234e8b3e1ca835c19bdc 100644 GIT binary patch literal 6606 zcmcIo33yyp75?vJdCBCpX;T^+pg2{QG+hE(3M6exo3;>0x&;y&3i6V?B#%zsgg2A4 z!72)FRHYPTM*&gmf=FAK5TZ~QMC$?y?!^^%MR7%`l>fZ=>txnq_a&S`BV{FQ z4aEx6E;UAs`nX~D*RSoq)a*%VC{>sjMzQRa>GT;rX0pDe0E|M}W^;5)!s$&aENIQ$ z*_UWe#N&kJdG*~!(yTwv`?l3erWzHdc3ZaLjIJFr9V3-+6e?R?g@#jByuQsC;wR

`o(DfV#OZ~{}kd9YqSX!Kh>9gLDfTj)r-p}>iUHIzV>(H%EkGpA&**BFB) z@k6uOdoDpzAi^-UKB;B6}#pt6xGh{D5stCbR3PSh6OY=xD?AB#~2l2Mlm0?^4%#q zYA{ti^Lia`5QM4mgwg9p$(C@-N2lq~P^RH@h3Ns&Q(I;MNF6*{Us*-9NVJlSd;)t(yX=xD*YJgDDH`Sfm1Fp1bHg`;ZcdO-_c zS`DoVv%{Igjeh(3mF9>ftnS3tGOSUsRvT8_?2Q?zm}MtZhMlsQ$?X0ZFLlffUMRiA zhMWY`N_=!qG`hhwk_o#Zy3R?E5`)Ru7ArLnb4;UGb~|QrNK({@DZ|9D(?gz}hjkK< z^$Ih6=7u$%+aX`H>o^}5keWQmb_3U

`o(DfV#OZ~{}kd9YqSX!Kh>9gLDfTj)r-p}>iUHIzV>(H%EkGpA&**BFB) z@k6uOdoDpzAi^-UKB;B6}#pt6xGh{D5stCbR3PSh6OY=xD?AB#~2l2Mlm0?^4%#q zYA{ti^Lia`5QM4mgwg9p$(C@-N2lq~P^RH@h3Ns&Q(I;MNF6*{Us*-9NVJlSd;)t(yX=xD*YJgDDH`Sfm1Fp1bHg`;ZcdO-_c zS`DoVv%{Igjeh(3mF9>ftnS3tGOSUsRvT8_?2Q?zm}MtZhMlsQ$?X0ZFLlffUMRiA zhMWY`N_=!qG`hhwk_o#Zy3R?E5`)Ru7ArLnb4;UGb~|QrNK({@DZ|9D(?gz}hjkK< z^$Ih6=7u$%+aX`H>o^}5keWQmb_3U

tCDeAy%zMF-Z&KV3R5#3qFbdQI$P!XrVe zGX8QiqMMK^a4{~?@FvDNh@`COFkEet*5# )+Xb^^o2xhOKz7>6C%jqSAL}DiIU9 z#G>dHMY=Jd!@{M^5ylYB>Qy+dwqt3VHydT%lI@{bj=|*`)yivoo3MYqel*M}#D3Vi)HC&h1 zI28IgD4bF3#0PZTfE!sZt>lWl63+b9C7;}^;}!{KG)Mzc+=dToxIL%u@FK0_L-KJ& zD$$zQVmi(26(kyW>bMIZ=G__^rmbg$Dd3wLB9t!)lhqfAJ|EHXQBk?lN?s7I)Z*)1 zIzBFI+JKQH_vDIzBDjnn5#HntjG_Jk^#d zqvI$4M%zu2J2xFs#4PYF z$tK^f+YAF*SyGMK6&CR^5OY3v032E^^d(`XV za`Gi>{9^n;it@4E>YDJohFVD9mq~%{6NIw0uZCtJ?=y?Kr+BZJrALaM<4#Xw&zYH2 zp>R?TrgRqtoY~YUZTR2C8UIkI@l%J(>Y&)V@1JQ@*L7oXf{0w-1)`bxuJg;pl#H?d zJlgKIsjJxzvm4l{}M= zo$P!T=X}&;=as1Bn2e*`)9^UVrl#v@M})sxUD3QT9KV~xBAO@Wi1-wg;#9nrqiXLn zybdRD#tr^)CvvP4+LO%UNREkRk2y(>i5#G-G(c^t8^g(U^B+K6-2~=u9K*r~P*2&Z z$KHzaJy`UZS~7vfl%KH|XZm04MPpXBG%H({l`YT8nzN%-b!nWvX2D~aIf3&wR<(^` zZ9{QQaT*&scTb>W2&#Y0^J*{ddJWgT1un8YI7QcX$*PN zF(d`8D2)+UFglL6D2(GOg@%${Fl$Q2akaue?2ym)VP`{WO=%j}--4PwI8%le9)p)qAi!Un(bjOySl;H$8|??8Uuw;e8UjVmEfzxiMO&Jbxv={dacQ_LAMySEFcmQc~a2xqDh6icGesa(oJ;#^GI3A+xd1^X=&vGTp zKNmx2|2du%N7*4BS)@TJjoktc%8T!|7tnf$-YE6Ol<<`8z#$S{3xpbWP^_`##q2}8 zmIc0_5yGZEe6G_Dxlqm2Aj02@2k~(0ys9sy@#XtCjf5`MR&E##U8)M-A;nZ?KfXqw zi1fK0pxVh<5fPpyb;j{^;n@=kt-BE0gT{G2(ViT~cZ6^|Nv&~wKY~uKxCG(0rTN>I zy`pW)^S3p>qHXsE+uB?uSIy5;@<19t_LSs`r)0q0)l7@vYjG;sH=U2ch5S98ufA2d znvC5JlfO3KZ`-f~SKwN5a|d4~*ON&%kT*B7f4e~%E7!d-&vCwcr{Zz^1V5!)_o5Cz z<0#^?M>3nY_Veu8FDMfp9fh)km`*YrSHnLCQ6odH@qdZD@Zb*4B;E~m_oFT_o$;AN zNqxS{o=M|ZxdA#5*j~*n31*^7+)38mMN;00GjVr_Dh<9Zm6+$-lHtE6`8Bl?y~`0f zh$<>On}XlaS(&W=TbHB@DV3C6Oil&tEOlkO+~d5IUhE&I@ViMEr_s5BQ6Y(#Bpbu; z^P%nuL1jp;@W)9|A$6ALW9$xL1nN8+!uV6ZN%!VsqzhvFIfU_?i&5{pr9@(x4>Az~ zDarcfFW8jz?O$DxkYDE0FO6gPTRzmj5LDooe;y8MSpld=3qn1AIH=|VQ2Pr){c94` vVn6V@R9oSA0j$SESbEl3|NgJAo+^M9!3(5bglYXh{FS!nNoM&MOUqvZZPm4+ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParseResult.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParseResult.class deleted file mode 100644 index 4160e61c714f57edaa55d5e3f7b7eda553b0d2e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3315 zcmbtW-*XdX6g``^2~Cz3S}7J3i$F=z(ggugQ%Vb1umoD#8bn3eCSTGmo87qCbmU2& zeDgn0baZqahXDT$(~JED}g zi@I6R9YbF;MP0#Qena2XwT5e$+I78_Q_#O+R4m<8`!dHQMzF6R3J$19B9*{P3ih_|UDfOBtWXjM{adf7=tErIKdho3 zaal{l5;q#vHQ}tv@+uhWD0i^g>#iH*;dn>so+>itqt=DnEF&KtPKOwjnu(Y)=dUAo zo>MuU9-b3S#y4O_`=An4iO73n#UIyfHP?UMLRE>nSL-US;|7&tyX(SHkX*4F zPEpJoawZRVe#EDwQyk{29{vN+hnSq|v=X#p*u@{t_70ohhL)}JoT6;m1GHIVzTM3| zer@=BnATmQEBrg2eT)~fe_-VHW4yS9Q7#X1`SKPHwU=YRdcI%f?-51=oIo$8h^yfM zPU09&;RttC9}!2n1Fpw$oZkJo)1KEVZJAXnJ0TrRZoz}@frK9Lj?UA;3_o`lJjgNs zdH~6X$au-iRhFw5CirrMfBmyvUI_9`5~X00q5275rY&!&+21fa@dQ&b+-j$l^v!Aa}ZgoG01MbS`)xOSC0Xaap5TNs(V3pP~xOvmT---l8aui=OUe zL3}01odJ&=wn59wdDv0rl zcSn(<`zq_)#0sUm5LLuyO!xDrq?>13Nky=;1FWzT7NSXg5sIj-gvG8&Ep$)n%Me7D zq?T|q2;}FWhWYHoV=Q}$e}s3R;1)$MRXXtqA3VXG7-)>qC^n7Rzh!Sef?(-+wh)+= zEqK)UN*Lz^0=^0deNwK(~#FBFv1IlgpTOH?Lq;U<3e(l?YG( delta 40 tcmdnTd4h9-b46pzI diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/tests/SQFParserTest.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/tests/SQFParserTest.class index a7b1823330cfdcbc7c7f78fcaeb9ef1717a19861..7dd72c739995e84291106f4257c417f51ba40349 100644 GIT binary patch delta 144 zcmaDA{2_RQGz+8MWEmDKX8)X&$zd!mj2e>-SyVy1%?DW8Ss1k@8?dN>xp|zgnV9r6 z;QU6OuS|@-lgs%%A*%UPm>Da9T*b*+V%C#wStP+m&JtE*w48iUSavn+*~PEC=38i!7JGS delta 150 zcmewm{3>{ZGz+8k${-H8!8;Phn;(g9^n=UL&l=XgB$?ur6yrVo`DGB#{Wl44|aQ m - ! + isTutHintsEnabled - Negates the given Boolean value. Synonym for 'not'. + Returns the status of TUTORIAL HINTS setting in UI (OPTIONS GAME GENERAL TUTORIAL HINTS). - https://community.bistudio.com/wiki/!_a + https://community.bistudio.com/wiki/isTutHintsEnabled - ! Boolean + isTutHintsEnabled - + isTutHintsEnabled + - + $Code$hint str isTutHintsEnabled ;$/Code$ + undefined / undefined - Boolean + Boolean + - != + createGroup - Returns whether one value is not equal to another. Both values have need be of the same type. + Creates a new Group for the given Side. An HQ (center) for that side must already be in the Mission.sqm or have been initialized with createCenter. For the available sides see Side. + NOTES + The default limit of groups created per side was 144. Since Arma 3 v1.67 it is increased to 288. + Since Arma 3 v 1.67 it is possible to mark created group for automatic deletion when the group becomes empty (see Alt Syntax). When group is set to be automatically deleted when empty, when group becomes empty it may take up to a minute for it to get deleted. + In Arma 3 when last unit leaves its group, the group usually gets immediately auto deleted, regardless of whether or not if it was set for auto deletion manually - https://community.bistudio.com/wiki/a_!%3D_b + https://community.bistudio.com/wiki/createGroup - Anything != Anything + createGroup Side + + createGroup Array - + createGroup side + + createGroup [side, deleteWhenEmpty] + - + $Code$_group = createGroup east$/Code$ + + $Code$_group = createGroup [ east, true ];$/Code$ + - undefined / undefined + undefined / global + (December 15, 2006) + The group limit is 144 groups groups per side. If you attempt to create a group, and there is no room for another, it simply doesn't create, and it doesn't error. + + (July 10,2007) + In Armed Assault, empty groups are not automatically deleted - if you created 144 groups, you will not be able to create new group even if all units in all those groups died, because all the 144 groups still exists - you will have to delete some groups manually. + + (January 04, 2011) + A group created with createGroup will get a waypoint at [0,0,0]. When you use createUnit to fill it with units, it will get an additional waypoint at the position the first unit is created. This new waypoint will also be set as currentWaypoint. However keep these two waypoints in mind when you do some scripting involving this groups' waypoints. - Boolean + Group - Group + - % + lightDetachObject - Returns the remainder of a corresponding division + Detach light from object. - https://community.bistudio.com/wiki/a_%25_b + https://community.bistudio.com/wiki/lightDetachObject - Number % Number + lightDetachObject Object - + lightDetachObject light + - + $Code$LightDetachObject _light$/Code$ + undefined / undefined - Number + Nothing + - && + assignedGunner - Returns true only if both conditions are true. In case of the alternative syntax (code as right argument), lazy evaluation is used (if left operand is false, evaluation of the right side is skipped completely). Identical to: a and b + Returns the soldier assigned to the given vehicle as a gunner. - https://community.bistudio.com/wiki/a_%26%26_b + https://community.bistudio.com/wiki/assignedGunner - Boolean && Boolean/Code + assignedGunner Object - + assignedGunner vehicle + @@ -101,24 +129,26 @@ - Boolean + Object + - * + menuCollapse - Multiplies the given numbers. + Collapses item on given path and all its childs. - https://community.bistudio.com/wiki/a_*_b + https://community.bistudio.com/wiki/menuCollapse - Number * Number + menuCollapse Array - + menuCollapse [idc, path] + @@ -127,34 +157,26 @@ - Number + Nothing + - + + removeSwitchableUnit - Adds the given two values together or if used only with one argument it returns a copy of that argument + Remove a unit from the list of units available for Team Switch. - https://community.bistudio.com/wiki/valuea_plus_valueb + https://community.bistudio.com/wiki/removeSwitchableUnit - Number + Number - - String + String - - Array + Array - - + Number - - + Array - - + String + removeSwitchableUnit Object - + removeSwitchableUnit unitName + @@ -163,321 +185,388 @@ - Number - String - Array - Number - Array - String + Nothing + - - + scriptName - Subtracts the right value from the left one. Both need to be of the same type, both Numbers or both Arrays. In Arma 3 it is possible to subtract nested arrays. + Assign a user friendly name to the VM script this command is executed from. + Once name is assigned, it cannot be changed. - https://community.bistudio.com/wiki/a_-_b + https://community.bistudio.com/wiki/scriptName - Number - Number - - Array - Array - - - Number + scriptName String - + scriptName name + - + $Code$scriptName "leetScript.sqf";$/Code$ + + $Code$scriptName format ["%1ARTY\data\scripts\ARTY_sadarmDeploy.sqf (_this: %1)",_this];$/Code$ + undefined / undefined + (17:39, 13 June 2009 (CEST)) + scriptName is good when you want to load the handle of some spawn or call with some name: + on top of leetscript.sqf + $Code$ + scriptName "LEETSCRIPT"; + GLOBAL_SCR_NAME = [] spawn "leetscript.sqf"; + hint format ["%1",GLOBAL_SCR_NAME]; + //display "LEETSCRIPT"$/Code$ - Number - Array - Number + Nothing + - / + addGroupIcon - Divides the left number by the right one. Division by 0 throws "Division by zero" error, however script doesn't stop and the result of such division is assumed to be 0. If used with config and String as arguments it returns the subentry of the given config entry with the given name. + Add icon to a group. Returns icon ID - https://community.bistudio.com/wiki/a_/_b + https://community.bistudio.com/wiki/addGroupIcon - Number / Number - - Config / String + Group addGroupIcon Array - + group addGroupIcon properties + - + $Code$groupName addGroupIcon ["b_inf",[offsetX,offsetY]]$/Code$ + undefined / undefined - Number - Config + Number + - : + setImportance - Helper construct used in a switch-construct + Sets the importance value of location. - https://community.bistudio.com/wiki/a:b + https://community.bistudio.com/wiki/setImportance - Switch_Type : Code + Location setImportance Number - + location setImportance value + - + $Code$myLocation setImportance 2$/Code$ + undefined / undefined - Nothing + Nothing + - < + removeItem - Checks if the left number is smaller than the right one + Removes item from the inventory. - https://community.bistudio.com/wiki/a_less_b + https://community.bistudio.com/wiki/removeItem - Number < Number + Object removeItem String - + unit removeItem item + - + $Code$bluforUnit unassignItem "NVGoggles"; + bluforUnit removeItem "NVGoggles"; + opforUnit unassignItem "NVGoggles_OPFOR"; + opforUnit removeItem "NVGoggles_OPFOR"; + independentUnit unassignItem "NVGoggles_INDEP"; + independentUnit removeItem "NVGoggles_INDEP";$/Code$ + - undefined / undefined + global / global - Boolean + Nothing + - <= + setSimpleTaskDescription - Checks if the left number is smaller than or equal to the right one + Attach descriptions to the simple task. - https://community.bistudio.com/wiki/a_less%3D_b + https://community.bistudio.com/wiki/setSimpleTaskDescription - Number <= Number + Task setSimpleTaskDescription Array - + task setSimpleTaskDescription [description, descriptionShort, descriptionHUD] + - + $Code$mytask setSimpleTaskDescription ["Today you have to kill Spongebob","Kill Spongebob","Here he is!"];$/Code$ + undefined / undefined - Boolean + Nothing + - == + simulInClouds - Check if one value is equal to another. Both values need to be of the same type. + Returns if given position is in clouds. - https://community.bistudio.com/wiki/a_%3D%3D_b + https://community.bistudio.com/wiki/simulInClouds - Anything == Anything + simulInClouds Position - + simulInClouds pos + - + $Code$simulInClouds (getPos player)$/Code$ + undefined / undefined - Boolean + Boolean + - > + itemCargo - Checks if the left number is greater than the right one + Get array with items from ammo box (or any general weapon holder container). - https://community.bistudio.com/wiki/a_greater_b + https://community.bistudio.com/wiki/itemCargo - Number > Number + itemCargo Object - + itemCargo box + - + $Code$hint str itemCargo vestContainer player ;$/Code$ + - undefined / undefined + global / undefined - Boolean + Array + - >= + preloadObject - Checks if the left number is greater than or equal to the right one + Preloads all textures, materials and proxies needed to render given object. Works with both class names and objects. Returns true once all data is loaded and ready. - https://community.bistudio.com/wiki/a_greater%3D_b + https://community.bistudio.com/wiki/preloadObject - Number >= Number + Number preloadObject Object + + Number preloadObject String - + distance preloadObject object + + distance preloadObject classname + - + $Code$[] spawn + { + waitUntil {10 preloadObject "SoldierW"}; + hint "Preload finished"; + };$/Code$ + + $Code$[] spawn + { + waitUntil {10 preloadObject leader player }; + hint "Preload finished"; + };$/Code$ + undefined / undefined - Boolean + Boolean - Boolean + - >> + vehicleChat - Returns subentry of config entry with given name. Identical to config/name. + Types text to the vehicle radio channel. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) + Note: Object parameter must be a vehicle, not a player. + Note: If you are in a crew seat (i.e. driver, gunner or commander), then it will include that role in the chat name output (Eg: Driver (you_name): "Message"). - https://community.bistudio.com/wiki/config_greater_greater_name + https://community.bistudio.com/wiki/vehicleChat - Config >> String + Object vehicleChat String - + vehicleName vehicleChat chatText + - + $Code$vehicle player vehicleChat "Show this text";$/Code$ + + $Code$driver vehicle player sideChat "sideChat"; + driver vehicle player globalChat "globalChat"; + driver vehicle player groupChat "groupChat"; + vehicle player vehicleChat "vehicleChat"; + driver vehicle player commandChat "commandChat"; + driver vehicle player customChat [1, "customChat"]; + systemChat "systemChat";$/Code$ + - undefined / undefined + global / local - Config + Nothing + - ^ + deleteStatus - Returns the left number to the power of the right one. + Delete a status (created with saveStatus ) from the campaign's progress file. - https://community.bistudio.com/wiki/a_%5E_b + https://community.bistudio.com/wiki/deleteStatus - Number ^ Number + deleteStatus String - + deleteStatus statusName + - + $Code$? deleteStatus "playerStatus" : "saved status gone from campaign"$/Code$ + - undefined / undefined + undefined / global - Number + Boolean + - || + setTargetAge - Returns true only if one or both conditions are true. In case of the alternative syntax(code as right argument), lazy evaluation is used (if left operand is true, evaluation of the right side is skipped completely). Identical to: a or b + Sets how the target is known to the other centers. They behave like the target was seen age seconds ago. + Possible age values are: "ACTUAL", "5 MIN", "10 MIN", "15 MIN", "30 MIN", "60 MIN", "120 MIN" or "UNKNOWN". - https://community.bistudio.com/wiki/a_or_b + https://community.bistudio.com/wiki/setTargetAge - Boolean || Boolean/Code + Object setTargetAge String - + object setTargetAge age + - + $Code$player setTargetAge "10 MIN"$/Code$ + undefined / undefined - Boolean + Nothing + - AGLToASL + removeSimpleTask - Converts position from PositionAGL to PositionASL + Remove a simple task from the list of simple tasks. - https://community.bistudio.com/wiki/AGLToASL + https://community.bistudio.com/wiki/removeSimpleTask - AGLToASL PositionAGL + Object removeSimpleTask Task - AGLToASL posAGL + person removeSimpleTask task - $Code$_playerPosASL = AGLToASL ( player modelToWorld [0,0,0]);$/Code$ - - $Code$_camPosASL = AGLToASL positionCameraToWorld [0,0,0];$/Code$ + $Code$player removeSimpleTask _tskKillSpongebob$/Code$ undefined / undefined @@ -485,263 +574,260 @@ - PositionASL + Nothing + - AISFinishHeal + ! - Alternative Injury Simulation (AIS) end state. Used to tell engine that script side healing is done when using "HandleHeal" event handler. + Negates the given Boolean value. Synonym for 'not'. - https://community.bistudio.com/wiki/AISFinishHeal + https://community.bistudio.com/wiki/!_a - AISFinishHeal Array + ! Boolean - AISFinishHeal [unit, healer, healercanheal] - + - $Code$AISFinishHeal [_wounded, _medic, true ];$/Code$ - + undefined / undefined - Nothing + Boolean + - ASLToAGL + addScoreSide - Converts position from PositionASL to PositionAGL + Adds side score. This is shown in the MP score tab as the total score. MP Only. Server execution only. - https://community.bistudio.com/wiki/ASLToAGL + https://community.bistudio.com/wiki/addScoreSide - ASLToAGL PositionASL + Side addScoreSide Number - ASLToAGL posASL + side addScoreSide value - $Code$_playerPosAGL = ASLToAGL getPosASL player ;$/Code$ + $Code$west addScoreSide 10;$/Code$ - undefined / undefined + global / global + This scripting command must be executed on the server to work properly in multiplayer - PositionAGL + Nothing + - ASLToATL + % - Converts a position from PositionASL to PositionATL + Returns the remainder of a corresponding division - https://community.bistudio.com/wiki/ASLToATL + https://community.bistudio.com/wiki/a_%25_b - ASLToATL PositionASL + Number % Number - ASLToATL pos - + - $Code$ASLToATL ( getPosASL player ) isEqualTo getPosATL player$/Code$ - + undefined / undefined - PositionATL + Number + - ATLToASL + showWatch - Converts a position from PositionATL to PositionASL + Shows or hides the watch on the map screen, if enabled for the mission and you possess the item. (default true ) - https://community.bistudio.com/wiki/ATLToASL + https://community.bistudio.com/wiki/showWatch - ATLToASL PositionATL + showWatch Boolean - ATLToASL pos + showWatch show - $Code$ATLToASL ( getPosATL player ) isEqualTo getPosASL player$/Code$ - - $Code$_camPosASL = ATLToASL positionCameraToWorld [0,0,0];$/Code$ + $Code$showWatch false ;$/Code$ undefined / undefined + (16 Aug, 2009) + In Arma 2, the Watch is now an inventory item. Class path is CfgWeapons- ItemWatch. Use the commands addWeapon and removeWeapon to add or remove it from a unit's inventory. (example: player addweapon "ItemWatch") - PositionASL + Nothing + - abs + curatorCameraArea - Absolute value of a real number + Returns all curator camera areas. - https://community.bistudio.com/wiki/abs + https://community.bistudio.com/wiki/curatorCameraArea - abs Number + curatorCameraArea Object - abs n + curatorCameraArea curatorObj - $Code$_n = abs -3; - // Returns 3$/Code$ + $Code$_camArea = curatorCameraArea myCurator;$/Code$ - local / undefined + undefined / undefined - Number + Array + - accTime + setCuratorWaypointCost - Returns the current time acceleration factor + Sets cost of waypoints (used for placing, editing and deleting). - https://community.bistudio.com/wiki/accTime + https://community.bistudio.com/wiki/setCuratorWaypointCost - accTime + Object setCuratorWaypointCost Number - accTime + curatorObj setCuratorWaypointCost cost - $Code$_acc = accTime$/Code$ + $Code$myCUrator setCuratorWaypointCost 0.1;$/Code$ undefined / undefined - (August 2, 2006) - Use setAccTime to change the time acceleration factor. Not to be confused with skipTime. + This scripting command must be executed on the server to work properly in multiplayer - Number + Nothing + - acos + unitAimPosition - ArcCosine of a number, result in Degrees + Returns the position on the unit other units can aim at. Same as aimPos only returns position in PositionAGL format and has render scope alternative unitAimPositionVisual. - https://community.bistudio.com/wiki/acos + https://community.bistudio.com/wiki/unitAimPosition - acos Number + unitAimPosition Object - acos x + unitAimPosition unit - $Code$_degrees = acos 0.5 - // returns 60$/Code$ + $Code$unitAimPosition player ;$/Code$ - undefined / undefined + global / undefined - Number + Array + - actionIDs + addItemCargoGlobal - Returns Array of Numbers, where numbers are IDs of all user actions added to given entity with addAction command. + Creates new items and stores them in the given container. Works with items, weapons and magazines. - https://community.bistudio.com/wiki/actionIDs + https://community.bistudio.com/wiki/addItemCargoGlobal - actionIDs Object + Object addItemCargoGlobal Array - actionIDs entity + box addItemCargoGlobal [item, count] - $Code$_actions = actionIDs player ;$/Code$ + $Code$supplyBox addItemCargoGlobal ["optic_ARCO2", 10];$/Code$ - undefined / undefined + global / global - Array + Nothing + - actionKeysImages + ctrlModelScale - Returns a list of button images or names assigned to the given user action. A maximum of maxKeys keys is listed. You can find the action names in config class ControllerSchemes or user action names. + Returns 3D control model scale - https://community.bistudio.com/wiki/actionKeysImages + https://community.bistudio.com/wiki/ctrlModelScale - actionKeysImages String - - actionKeysImages Array + ctrlModelScale Control - actionKeysImages userAction - - actionKeysImages [userAction, maxKeys] + ctrlModelScale control - $Code$_text = actionKeysImages "ReloadMagazine"$/Code$ - - $Code$_reload = actionKeysImages ["ReloadMagazine",1] will return "R" (incl. the quotation marks!)$/Code$ + $Code$_currentScale = ctrlModelScale _ctrl3D;$/Code$ undefined / undefined @@ -749,164 +835,123 @@ - Structured_Text - Structured_Text + Number + - actionKeysNamesArray + * - Returns a list of button names assigned to the given user action. You can find the action names in config class ControllerSchemes or user action names. + Multiplies the given numbers. - https://community.bistudio.com/wiki/actionKeysNamesArray + https://community.bistudio.com/wiki/a_*_b - actionKeysNamesArray String - - actionKeysNamesArray Array + Number * Number - actionKeysNamesArray userAction - - actionKeysNamesArray [userAction, maxKeys] - - actionKeysNamesArray [userAction, maxKeys, inputDevicePriority] - + - $Code$list = actionKeysNamesArray "ReloadMagazine";$/Code$ - - $Code$list = actionKeysNamesArray ["ReloadMagazine", 1];$/Code$ - + undefined / undefined - (October 26, 2014) - inputDevicePriority 'Controler' is not a spelling mistake in description. - Array - Array + Number + - actionKeysNames + + - Returns a list of button names assigned to the given user action. You can find the action names in config class ControllerSchemes or user action names. + Adds the given two values together or if used only with one argument it returns a copy of that argument - https://community.bistudio.com/wiki/actionKeysNames + https://community.bistudio.com/wiki/valuea_plus_valueb - actionKeysNames String + Number + Number - actionKeysNames Array + String + String + + Array + Array + + + Number + + + Array + + + String - actionKeysNames userAction - - actionKeysNames [userAction, maxKeys] - - actionKeysNames [userAction, maxKeys, inputDevicePriority] - + - $Code$_list = actionKeysNames "ReloadMagazine"; //"R"$/Code$ - + undefined / undefined - (20:14, 20 January 2010 (CET)) - The return type is a stacked string. A string inside a string. To compare use first single and inside double quotes: - if ((actionKeysNames "User1") == '"W"') then... - - (October 26, 2014) - inputDevicePriority 'Controler' is not a spelling mistake in description. - String - String + Number - String - Array - Number - Array - String + - actionKeys + - - Returns Array containing dikCodes of keys, buttons and combos assigned to the given user action. Action names could be found in config class ControllerSchemes or user action names or user profile, for example: - keyWatch [ ] = { 24 } ; - To retrieve the value, use the property name without 'key': - $Code$ actionKeys "Watch"; // 24$/Code$ - In addition, some of the actions are also listed in here: inputAction/actions + Subtracts the right value from the left one. Both need to be of the same type, both Numbers or both Arrays. In Arma 3 it is possible to subtract nested arrays. - https://community.bistudio.com/wiki/actionKeys + https://community.bistudio.com/wiki/a_-_b - actionKeys String + Number - Number + + Array - Array + + - Number - actionKeys userAction - + - $Code$_array = actionKeys "ReloadMagazine"$/Code$ - + undefined / undefined - (May 11, 2016) - If an action key is configured with a modifier (e.g. "Right Ctrl + M" for "MiniMapToggle"), the DIK code returned by this command has a weird value, equivalent to the following: - Left Ctrl + Key = 486539264 + DIK - Left Shift + Key = 704643072 + DIK - Left Alt + Key = 939524096 + DIK - Right Ctrl + Key = -1660944384 + DIK - Right Shift + Key = 905969664 + DIK - Right Alt + Key = -1207959552 + DIK - For example, to detect if actionKeys "NetworkPlayers" contain a match for "Right Ctrl + P", one must do the following: - $Code$ if (-1660944359 in actionKeys "NetworkPlayers") then$/Code$ - with -1660944359 being equal to -1660944384 + 25, and 25 being the DIK code for the "P" key. - This increases the difficulty of accurately comparing key codes to actionKeys in UI event handlers. Those strange numbers are probably due to bit flags being added to the DIK value by the game engine for easier storage in the ArmaProfile. - In case of mouse buttons, actionKeys will also return values that are different from those in "MouseButton" UI events: - LMB: MouseButton 0 = actionKeys 65536 - RMB: MouseButton 1 = actionKeys 65665 (65536 + 1 + 128) - MMB: MouseButton 2 = actionKeys 65538 (65536 + 2) - 4MB: MouseButton 3 = actionKeys 65539 (65536 + 3) - 5MB: MouseButton 4 = actionKeys 65540 (65536 + 4) - The values above are valid for a right-handed mouse configuration, and may or may not differ for a left-handed config. - - (August 6, 2016) - The method described by @AgentRev does not work. - All numbers in SQF are floats and those are only precise up to 6...7 digits. - $Code$486539264 + 19 == 486539264 + 20 - - true - $/Code$ - The DIK codes for 'LCtrl + R' and 'LCtrl + T' are indistinguishable. - Array + Number - Array - Number + - actionName + isSprintAllowed - Returns localized name of action. + Returns true if player is allowed to sprint - https://community.bistudio.com/wiki/actionName + https://community.bistudio.com/wiki/isSprintAllowed - actionName String + isSprintAllowed Object - actionName action + isSprintAllowed unit - $Code$actionName "ReloadMagazine"$/Code$ + $Code$isSprintAllowed player;$/Code$ undefined / undefined @@ -914,154 +959,114 @@ - String + Boolean + - actionParams + / - Returns Array with params for given user action id (similar to addAction param array). The output array is of the following format: - [title, script, arguments, priority, showWindow, hideOnUse, shortcut, condition, radius, unconscious, textWindowBackground, textWindowForeground, selection], where: - title: String - action title text - script: String - script file or script expression assigned to the action - arguments: Anything or nil - arguments passed to the action - priority: Number - action priority on the action menu - showWindow: Boolean - whether the action is shown in the center of the screen too - hideOnUse: Boolean - whether the action menu should close after selecting the action - shortcut: String - action bindings to some existing engine action if any - condition: String - expression returning true or nil for action to appear on the action menu - radius: Number - max distance to entity at which action becomes available. -1 means it is engine default (~15m) - unconscious: Boolean - whether the action is available to unconscious person - textWindowBackground: String - same as textWindowBackground in setUserActionText - textWindowForeground: String - same as textWindowForeground in setUserActionText - selection: String - named selection in Geometry LOD to which the action is attached - New array element selection is available since Arma 3 v1.69.140846 + Divides the left number by the right one. Division by 0 throws "Division by zero" error, however script doesn't stop and the result of such division is assumed to be 0. If used with config and String as arguments it returns the subentry of the given config entry with the given name. - https://community.bistudio.com/wiki/actionParams + https://community.bistudio.com/wiki/a_/_b - Object actionParams Number + Number / Number + + Config / String - entity actionParams id - + - $Code$_params = player actionParams 0;$/Code$ - + undefined / undefined - Array/Nothing + Number - Config + - action + removeItemFromVest - Make a unit to perform an action. Use the List of Actions for reference about the available actions and their syntax. - NOTES: - While this command should be executed where unit is local, it is not always the case. Actions such as "Eject", "GetOut", "GetInXXXX", "MoveToXXXX", etc can be executed on remote units. - In SP, when user Alt+Tabs the simulation is paused and so the action will also halt until user returns to the game. For example, player action ["GetInDriver", car] executed while user is Alt+Tabbed will result in user seeing the action happening when he returns to the game screen. This doesn't happen in MP. + Removes item from soldier's vest. - https://community.bistudio.com/wiki/action + https://community.bistudio.com/wiki/removeItemFromVest - Object action Array + Object removeItemFromVest String - unit action actionArray + unit removeItemFromVest item - $Code$player action ["SitDown", player ];$/Code$ - - $Code$_soldier action ["Eject", vehicle _soldier];$/Code$ - + - local / global + global / global - (28 Aug, 2009) - In ArmA 2, you can place a unique unit (for example a boat, far of all combats) and use it for all command lines with action. - - (March 27, 2015) - This command has no effect when a dead unit is used as input. - - (June 27, 2017) - $Code$player action ["SWITCHWEAPON",player,player,-1]$/Code$ - Switching weapon to the back. - - (July 20, 2017) - Some of the actions (such as "DropWeapon") do not always execute, and there should be a set of conditions for them to run. - The unit must be able to perform the dropping animation in order for the action to properly execute. - So, if for example we spawn a unit at [0,0,0] and make it perform a "DropWeapon" action - it won't work if [0,0,0] is water (which it is, if the current map is an island) because the unit will be swimming. - Also, you cannot stack up actions right after the other. If you run a "DropWeapon" action when the current action animation is still going - it will not perform. - There are a few more conditions for an action to perform, but relying on a hundred percent success of the action is not a good practice. - Nothing + Nothing + - activateAddons + keyImage - Activates the listed addons. The list of active addons is initialized during this function. + Returns a structured text, containing an image or name (if no image is found) of the button, on the keyboard, mouse or joystick, with the given code. - https://community.bistudio.com/wiki/activateAddons + https://community.bistudio.com/wiki/keyImage - activateAddons Array + keyImage Number - activateAddons [addon1,] + keyImage dikCode - $Code$activateAddons ["BISOFP"];$/Code$ + $Code$_name = keyImage 28; //result is "Enter"$/Code$ undefined / undefined - (Jan 21, 2009) - Be aware that "Addon1" is the cfgPatches class of the desired addon to preload. - - (May 10, 2009) - This command will activate addons that are referenced via scripts but not included in a missions required addons section. If executed from a configs init event with the call command, it will effectively override a missions required addons, preventing them from being activated (Appears to only happen in multi player). - To activate the passed addons along with those defined in the mission.sqm, execute the command from a configs init event using spawn or execVM. UNN - Nothing + Structured_Text + - activateKey + size - Activates the given keyname for the current user profile. The keys are used to unlock missions or campaigns. - See keys, keysLimit and doneKeys in the description.ext file of the missions. + Returns a location's size. - https://community.bistudio.com/wiki/activateKey + https://community.bistudio.com/wiki/size - activateKey String + size Location - activateKey keyname + size location - $Code$activateKey "Mission04Key";$/Code$ + $Code$_locSize = size myLocation$/Code$ undefined / undefined @@ -1069,59 +1074,59 @@ - Nothing + Array + - activatedAddons + allowFleeing - Returns a list of all activated addons. + Sets the cowardice level (the lack of courage or bravery) of a group or unit. + The more cowardice a Group or Object has, the sooner it will start fleeing. + 0 means maximum courage, while 1 means always fleeing. - https://community.bistudio.com/wiki/activatedAddons + https://community.bistudio.com/wiki/allowFleeing - activatedAddons + Object/Group allowFleeing Number - activatedAddons + name allowFleeing cowardice - $Code$_addons = activatedAddons ;$/Code$ + $Code$_group1 allowFleeing 0;$/Code$ - undefined / undefined + local / global - (March 28, 2014) - This command can return a large array, often too large to be diag_log'd or hinted. At the time of writing, my game returned an array with 389 elements. The code below will ignore all the BI addons (they start with a3_) and writes the rest (ie, all your custom addons) to the RPT. - $Code${ if (! (["a3_", _x] call BIS_fnc_inString )) then { diag_log _x;} } forEach activatedAddons ;$/Code$ - Array + Nothing + - add3DENConnection + camPreloaded - Connect entities together. + Checks whether the camera has finished preloading. - https://community.bistudio.com/wiki/add3DENConnection + https://community.bistudio.com/wiki/camPreloaded - add3DENConnection Array + camPreloaded Object - add3DENConnection [type, from, to] + camPreloaded camera - $Code$add3DENConnection ["RandomStart", get3DENSelected "Object","marker_0"] - // Set random start on marker "marker_0" for all selected objects.$/Code$ + $Code$?(camPreloaded _camera) : exit$/Code$ undefined / undefined @@ -1129,392 +1134,340 @@ - Boolean + Boolean + - add3DENEventHandler + : - Add code to be run when a Eden Editor event is triggered. - See the list of all Eden Editor Event Handlers. + Helper construct used in a switch-construct - https://community.bistudio.com/wiki/add3DENEventHandler + https://community.bistudio.com/wiki/a:b - add3DENEventHandler Array + Switch_Type : Code - add3DENEventHandler [type,code] - + - $Code$eh = add3DENEventHandler ["onUndo",{ systemChat "Zip..."}];$/Code$ - + undefined / undefined - Number + Nothing + - add3DENLayer + customRadio - Add an editing layer in Eden Editor. + Sends the message to the custom radio channel. The message is defined in the description.ext file or radio protocol. - https://community.bistudio.com/wiki/add3DENLayer + https://community.bistudio.com/wiki/customRadio - Number add3DENLayer String + Object customRadio Array - parentLayerID add3DENLayer name + unit customRadio [channel, message] - $Code$_myLayer = -1 add3DENLayer "Enemy Base"; - _myLayerFort = _myLayer add3DENLayer "Fortifications"; - _myLayerPatrol = _myLayer add3DENLayer "Patrols";$/Code$ + $Code$_soldierOne customRadio [1, "WordEnemy"];$/Code$ - undefined / undefined + global / local + (December 3, 2016) + To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: + $Code$ player customRadio [1, "#MySound.ogg"];$/Code$ - Number + Nothing + - addAction + getMissionConfig - This command syntax is for Arma 3 only. For TKOH and older versions see addAction TKOH - Adds an entry to the action menu of an object (scroll wheel menu). The action can only be activated when in proximity to the object (eg: building). Adding an action to the player obviously makes that action available to the player at all times. The appearance of onscreen text could be further tweaked with setUserActionText. For event handling of user interaction see inGameUISetEventHandler - This command has local effect. Created action is only available on the computer where command was executed. To make action available to all players, command must be executed on all connected clients (see remoteExec ). addAction is also ignored on dedicated server, because of no user interface. In Arma 3 addAction does not work on animals. This is intended behavior. - Since Arma 3 v1.63.136787, two new params are available: radius and unconscious. - Since Arma 3 v1.69.140846, new param is available: selection. + Returns Config entry for the given scenario attribute from the 1st tier. The attribute can be config class or config property. If it is defined in multiple places, the command checks them in the following order: + External Description.ext file + Eden Editor scenario attribute + So if attribute exists in both places, attribute from description.ext is used. Previously, scenario attributes were extracted from Description.ext using missionConfigFile. That still works, but it ignores attributes set directly in the editor and it should not be used anymore. - https://community.bistudio.com/wiki/addAction + https://community.bistudio.com/wiki/getMissionConfig - Object addAction Array + getMissionConfig String - object addAction [title, script, arguments, priority, showWindow, hideOnUse, shortcut, condition, radius, unconscious, selection] + getMissionConfig attribute - $Code$// Short and sweet: - player addAction ["A Useless Action That Does Nothing", {}]; - player addAction [" t color='#FF0000' This Useless Action Is RED /t ", { hint "RED"}]; - player addAction ["Hint Hello!", { hint format ["Hello %1!", _this select 3]}, name player ]; - player addAction ["String Exec", " hint 'this is also compiled'"];$/Code$ - - $Code$// SQF file example: - _act = player addAction ["Exec the file", "somescript.sqf"] - // somescript.sqf: hint str _this;$/Code$ - - $Code$// SQS file example: - _genAct = generator addAction ["Switch on generator", "activate_generator.sqs"] - // activate_generator.sqs:_gen = _this select 0 - _caller = _this select 1 - _id = _this select 2 - ; remove the action once it is activated - _gen removeAction _id - // This example shows an action called "Switch on generator" added to an object with the name 'generator'. As soon as the player gets close to this object, he can execute the given action via the action menu. Then the script 'activate_generator.sqs' is executed, which in our example only removes the action from the generator.$/Code$ - - $Code$// Create object on dedicated server and add action to the object on every client: - if ( isDedicated ) then - { - _obj = "some_obj_class" createVehicle [1234, 1234, 0]; - [_obj, ["Greetings!", { hint "Hello!"}]] remoteExec ["addAction", -2, _obj]; - };$/Code$ + $Code$_header = getMissionConfig "Header" + // Returns scenario header config. Replaces the previous approach which would scan only the external Description.ext file, but ignore the value set in the Eden Editor:_header = missionConfigFile "Header"; // Old approach$/Code$ - global / local + undefined / undefined - (August 2, 2006) - An easy way to keep track of and remove actions is to store the IDs of the actions in variables. - This can be accomplished by doing the following: - $Code$_myaction = player addAction ["Hello", "hello.sqs"];$/Code$ - This stores the action's ID in the local variable "_myaction" and assists in keeping track of the action ID. - To remove the above action, you would use the following line: - $Code$ player removeAction _myaction;$/Code$ - - (June 19, 2014) - If executing actual script code like this: - $Code$_unit addAction [ "yourAction", { hint "A line of code" } ];$/Code$ - you can have a user action that uses and/or affects variables used elsewhere in the script that adds the action. - But beware! - The variable(s) must be global otherwise it won't work! i.e. - Fail - $Code$_variable = false ; _unit addAction [ "action", { _variable = true } ];$/Code$ - Succeed - $Code$variable = false ; _unit addAction [ "action", { variable = true } ];$/Code$ - - (March 10, 2015) - Actionception: $Code$actions = []; - actions set [0, player addAction ["Actionception", { - if ( count actions == 1) then { - actions set [1, player addAction [" Actionception ", { - if ( count actions == 2) then { - actions set [2, player addAction [" Actionception ", { - if ( count actions == 3) then { - actions set [3, player addAction [" Actionception ", { - { - player removeAction _x ; - } forEach actions; - }, [], 10, false, true ]]; - }; - }, [], 10, false, false ]]; - }; - }, [], 10, false, false ]]; - }; - }, [], 10, false, false ]];$/Code$ - Function to remove user actions with unknown ids: - $Code$KK_fnc_removeUnknownUserActions = { - for "_i" from 0 to ( player addAction ["",""]) do { - if !(_i in _this ) then { - player removeAction _i; - }; - }; - };$/Code$ - To test: - $Code$ for "_i" from 0 to 9 do { - player addAction ["Action #" + str _i, { - [0,5,6] call KK_fnc_removeUnknownUserActions; - }]; - }; - $/Code$ - Removes all user actions but 0, 5 and 6. - - (July 18, 2016) - A3 v1.62.137494 : Condition is not evaluated when map is opened (and probably also true for other displays or opened dialog) - Number + Config + - addBackpackCargoGlobal + setSoundEffect - Add backpack(s) to the cargo space of vehicle. MP synchronized. Classname list of available backpacks is here + Defines the different sound effects. + Sound - plays a 2D sound from CfgSounds + Voice - plays a 3D sound from CfgSounds + SoundEnv - plays an environmental sound from CfgEnvSounds + SoundDet (only for triggers) - creates a dynamic sound object attached to a trigger defined in CfgSFX + To stop any sound, deactivate the trigger (might take up to 0.5 sec to stop) or delete the trigger (immediate). Also use "$NONE$" to skip the sound (1st item), when there is none to be used (Example 3, 4, 5). - https://community.bistudio.com/wiki/addBackpackCargoGlobal + https://community.bistudio.com/wiki/setSoundEffect - Object addBackpackCargoGlobal Array + Object setSoundEffect Array + + Array setSoundEffect Array - vehicle addBackpackCargoGlobal [packClassName, count] + trigger setSoundEffect [sound, voice, soundEnv, soundDet] + + waypoint setSoundEffect [sound, voice, soundEnv, soundDet] - $Code$this addBackpackCargoGlobal ["TK_RPG_Backpack_EP1",2];$/Code$ + $Code$_trigger setSoundEffect ["Alarm", "", "", ""];$/Code$ - $Code$_apc addBackpackCargoGlobal ["US_Patrol_Pack_EP1",4];$/Code$ + $Code$[_group1,2] setSoundEffect ["Alarm", "", "", ""];$/Code$ + + $Code$_trigger setSoundEffect ["$NONE$", "Alarm", "", ""];$/Code$ + + $Code$_trigger setSoundEffect ["$NONE$", "", "BattlefieldFirefight1", ""];$/Code$ + + $Code$_trigger setSoundEffect ["$NONE$", "", "", "Owl"];$/Code$ - global / global + undefined / undefined + (October 2, 2013) + To avoid having to create a dummy sound definition, you can use $NONE$ instead. + $Code$private "_trigger"; + _trigger = createTrigger ["EmptyDetector", position player]; + _trigger setTriggerStatements ["true", "", ""]; + _trigger setSoundEffect ["$NONE$", "", "BattlefieldFirefight1", ""]; + $/Code$ + + (March 7, 2012) + When using this function, I found that if the parameter sound was empty, then you would always get a 'Sound not found' error. The following code fixes this problem. You need to create a dummy sound. This is what example 3 is hinting towards. + description.ext: + $Code$class CfgSounds + { + sounds[] = {}; + class NoSound + { + name = "NoSound"; + sound[] = {"", 0, 1}; + titles[] = {}; + }; //Dummy sound needed for setSoundEffect command, due to stupid bug in engine. + }; + $/Code$ + (code sample above written by 'CarlGustaffa' on the Bohemia Interactive forums.) + script.sqf: + $Code$_trigger = createTrigger[ "EmptyDetector", _position ]; + _trigger setTriggerStatements [ "true", "", "" ]; + _trigger setSoundEffect[ "NoSound", "", "", "Wind2_EP1" ]; + $/Code$ - Nothing + Nothing - Nothing + - addBackpackCargo + < - Add backpack(s) to the cargo space of vehicle. Classname list of available backpacks is here. - In Arma 3, arguments for this command must be local ( ). For global variant see addBackpackCargoGlobal + Checks if the left number is smaller than the right one - https://community.bistudio.com/wiki/addBackpackCargo + https://community.bistudio.com/wiki/a_less_b - Object addBackpackCargo Array + Number < Number - vehicle addBackpackCargo [packClassName,count] - + - $Code$this addBackpackCargo ["TK_RPG_Backpack_EP1",2];$/Code$ - - $Code$_apc addBackpackCargo ["US_Patrol_Pack_EP1",4];$/Code$ - + - global / local + undefined / undefined - Nothing + Boolean + - addBackpackGlobal + logNetworkTerminate - Adds a backpack to a unit (even non-local) + Terminates a network log file started with logNetwork with the given handle - https://community.bistudio.com/wiki/addBackpackGlobal + https://community.bistudio.com/wiki/logNetworkTerminate - Object addBackpackGlobal String + logNetworkTerminate Number - unit addBackpackGlobal backpack + logNetworkTerminate handle - $Code$player addBackpackGlobal "B_AssaultPack_khk";$/Code$ - + - global / global + undefined / undefined - Nothing + Nothing + - addBackpack + > - Adds a backpack for a unit. If a unit already has a backpack, the old backpack will be placed on the ground under the unit. - Classname list of available backpacks : - Arma 2 OA backpacks - Arma 3 backpacks - objects starting with "B_", starts with " B_AssaultPack_khk " + Checks if the left number is greater than the right one - https://community.bistudio.com/wiki/addBackpack + https://community.bistudio.com/wiki/a_greater_b - Object addBackpack String + Number > Number - unit addBackpack packClassName - + - $Code$this addBackpack "TK_RPG_Backpack_EP1";$/Code$ - - $Code$_mySoldierDude addBackpack "US_Patrol_Pack_EP1";$/Code$ - + - local / global + undefined / undefined - Nothing + Boolean + - addCamShake + wind - Creates the camera shaking effect, like when you are near an explosion + Returns the current wind vector (in m/s) as array [x, y, z]. + NOTE: the last value (z, "up-down") always returns 0 – wind being only horizontal. - https://community.bistudio.com/wiki/addCamShake + https://community.bistudio.com/wiki/wind - addCamShake Array + wind - addCamShake [power, duration, frequency] + wind - $Code$addCamShake [10, 1, 25];$/Code$ - - $Code$enableCamShake true ; - addCamShake [5, 5, 25];$/Code$ + $Code$_windArray = wind ;$/Code$ - undefined / local + undefined / undefined + In OFP 1.96, wind speed and direction are directly related to overcast. - Nothing + Array + - addCuratorAddons + createMissionDisplay - Allow curator use of given addon. + Create single missions display as a child of given display. The mission dialog will be set to the directory given as an argument "root". - https://community.bistudio.com/wiki/addCuratorAddons + https://community.bistudio.com/wiki/createMissionDisplay - Object addCuratorAddons Array + Display createMissionDisplay String - curatorObj addCuratorAddons addons + display createMissionDisplay string - $Code$curatorObj addCuratorAddons ["A3_Armor_F_AMV","A3_Armor_F_Panther"];$/Code$ - - $Code$curatorObj addCuratorAddons ["A3_Modules_F_Curator_Lightning"];$/Code$ + $Code$_ChildDisplay = _Rootdisplay createMissionDisplay "Tutorial";$/Code$ - $Code$// Addons can be stacked: - curatorObj addCuratorAddons ["A3_Armor_F_AMV","A3_Armor_F_Panther"]; - curatorObj addCuratorAddons ["A3_Modules_F_Curator_Lightning"]; - diag_log curatorAddons curatorObj;[ - "A3_Armor_F_AMV", - "A3_Armor_F_Panther", - "A3_Modules_F_Curator_Lightning" - ]$/Code$ + $Code$// In Arma 3 this would create scenarios UI + findDisplay 46 createMissionDisplay "";$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Display + - addCuratorCameraArea + camPrepareBank - Adds or changes curator camera area (depends on if ID is already used). + Prepares the camera bank angle. + This command is non-functional ! - https://community.bistudio.com/wiki/addCuratorCameraArea + https://community.bistudio.com/wiki/camPrepareBank - Object addCuratorCameraArea Array + Object camPrepareBank Number - curatorObj addCuratorCameraArea [cameraAreaID,position,radius] + camera camPrepareBank bank - $Code$myCurator addCuratorCameraArea [3, position mySoldier,300];$/Code$ + $Code$_camera camPrepareBank -0.1$/Code$ undefined / undefined @@ -1522,56 +1475,81 @@ - Nothing + Nothing + - addCuratorEditableObjects + currentWaypoint - Register objects which can be edited by a curator. + Return the index of the current waypoint. + To determine the validity of the index, compare it to the waypoints count. + If all waypoints are 'completed', then the index is 1 greater than the last valid index. + If there are no waypoints, then the index is 0. + By default, a group has 1 waypoint at their starting position, which is considered completed and so the currentWaypoint is 1. - https://community.bistudio.com/wiki/addCuratorEditableObjects + https://community.bistudio.com/wiki/currentWaypoint - Object addCuratorEditableObjects Array + currentWaypoint Group - curatorObj addCuratorEditableObjects [objects,addCrew] + currentWaypoint groupName - $Code$curatorModule addCuratorEditableObjects [[car], true ];$/Code$ + $Code$_index = currentWaypoint group player ;$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Number + - addCuratorEditingArea + ctrlMapMouseOver - Adds or changes curator edit area (depends on if ID is already used). + Returns description of map sign mouse cursor is over. Works with in-game map as well as 2D editor map in edit mode. - https://community.bistudio.com/wiki/addCuratorEditingArea + https://community.bistudio.com/wiki/ctrlMapMouseOver - Object addCuratorEditingArea Array + ctrlMapMouseOver Control - curatorObj addCuratorEditingArea [editAreaID,position,radius] + ctrlMapMouseOver control - $Code$myCurator addCuratorEditingArea [4, position player,1000];$/Code$ + $Code$( uiNamespace getVariable "_map") ctrlMapCursor ["Track","HC_overFriendly"]; + _mouseover = if ( count ( ctrlMapMouseOver (uiNamespace getVariable "_map")) 0) then + { + ctrlMapMouseOver ( uiNamespace getVariable "_map") + } + else + { + [""] + }; + if (_mouseover select 0 == "task" && str (_logic getVariable "onTaskAssigned") != str {}) then + { + //--- Task + ( uiNamespace getVariable "_map") ctrlMapCursor ["Track","HC_overMission"]; + } + else + { + //--- Waypoint + ( uiNamespace getVariable "_map") ctrlMapCursor ["Track","HC_move"]; + };$/Code$ + + $Code$onEachFrame { hintSilent str ctrlMapMouseOver ( findDisplay 12 displayCtrl 51)};$/Code$ undefined / undefined @@ -1579,27 +1557,30 @@ - Nothing + Array + - addCuratorPoints + airDensityRTD - Adds or removes curator points. Points can be only in range from 0 to 1. + Returns air density in given altitude - https://community.bistudio.com/wiki/addCuratorPoints + https://community.bistudio.com/wiki/airDensityRTD - Object addCuratorPoints Number + airDensityRTD Number - curatorObj addCuratorPoints points + airDensityRTD altitude - $Code$curatorModule addCuratorPoints 0.5$/Code$ + $Code$_density = airDensityRTD 0;//Returns 1.22406$/Code$ + + $Code$_density = airDensityRTD 1000;//Returns 1.11096$/Code$ undefined / undefined @@ -1607,446 +1588,498 @@ - Nothing + Number + - addEditorObject + independent - Add an object to the editor and assign arguments. Create script is,called with _new equal to true. Returns the ID of the new EditorObject.,Subtype class is optional. - i - Some Old Editor Command + Pre-defined variable for the independent side. + Alias for resistance. - https://community.bistudio.com/wiki/addEditorObject + https://community.bistudio.com/wiki/independent - Control addEditorObject Array + independent - map addEditorObject [type,[name1,value1,],subtype class] + independent - + $Code$// SQF: + if (( side _unit) == independent ) then { + hint "This is a independent unit!"; + };$/Code$ + undefined / undefined - String + Side + - addEventHandler + hcSetGroup - Adds event handler (EH) to the given object and returns EH handle. If EH has some data to return upon event (e.g. the "killed" EH will return an array with 2 elements: the killed unit, and the killer), it is passed in _this variable. Since Arma 3 v.1.63.137807 the EH handle is also stored in _thisEventHandler variable and is available during EH code execution. For more information about event handlers and their types check the scripting topic Event handlers in this reference. You may add as many event handlers of any type as you like to every unit. For instance, if you add an event handler of type "killed" and one already exists, the old one doesn't get overwritten. Use removeEventHandler to delete event handlers. + Add group to unit's high command bar. + Array parameters are group, group-name and team (teammain, teamred, teamgreen, teamblue, teamyellow). + Group is the only necessary parameter. - https://community.bistudio.com/wiki/addEventHandler + https://community.bistudio.com/wiki/hcSetGroup - Object addEventHandler Array + Object hcSetGroup Array - object addEventHandler [type, command] + unit hcSetGroup array - $Code$_EHkilledIdx = player addEventHandler ["killed", {_this exec "playerKilled.sqs"}]$/Code$ + $Code$unit hcSetGroup [group, "HQ", teamred];$/Code$ - $Code$this addEventHandler ["killed", " hint format ['Killed by %1',_this select 1]"]$/Code$ + $Code$player hcSetGroup [group];$/Code$ - global / local + undefined / undefined - (July 7, 2015) - When using overridable EH, such as "InventoryOpened" and similar, where returning true allows to override default action, exitWith cannot be used to return value. So: - $Code$ if (whatever) exitWith { true }; false ;$/Code$ - Forget about it, will not work. Instead use: - $Code$ if (whatever) then { true } else { false };$/Code$ - 100% satisfaction guaranteed! - Number + Nothing + - addForce + findCover - Applies force to given object at given position. Force is defined as vector [x, y, z] in world space, position is vector [x, y, z] in model space. If you need to define force in model space, use vectorModelToWorld or vectorModelToWorldVisual commands first. The force applied as impulse. For more information see NVIDIA docs + Returns the object around where the unit finds cover. The minDist, visibilityPosition and ignoreObject parameters are optional. Command is not functional since Arma 2. + This command is not implemented - https://community.bistudio.com/wiki/addForce + https://community.bistudio.com/wiki/findCover - Object addForce Array + Object findCover Array - object addForce [force, position] + object findCover [position, hidePosition, maxDist, minDist, visibilityPosition, ignoreObject] - $Code$// Apply force [0,1000,0] defined in world space (not factoring object actual positioning) to object position [1,0,0]: - _object addForce [[0,1000,0],[1,0,0]];$/Code$ - - $Code$// Apply force [0,1000,0] defined in model space (relative to object) to object position [1,0,0]: - _object addForce [_object vectorModelToWorld [0,1000,0],[1,0,0]];$/Code$ - + - global / global + undefined / undefined + (17 Oct, 2009) + Arma 2: v1.04: Usage creates report log message: " MicroAI: Command findCover not implemented ( unit id ) " + + (07 Jan, 2011) + OA: v1.57: Still non functional. + + (12 July, 2011) + CO: v1.59: Still non functional. + + (13 February, 2014) + Arma 3: Still non functional. + + (July 4, 2015) + An alternative function in ArmA 3 might be BIS_fnc_findSafePos - Nothing + Object + - addGoggles + logNetwork - Create a new item and try to link it into goggles slot. This command doesn't add NVGoggles. Use addItem and assignItem or just linkItem for latter. + Registers new log file recording a network traffic and returns handle of the log. - https://community.bistudio.com/wiki/addGoggles + https://community.bistudio.com/wiki/logNetwork - Object addGoggles String + logNetwork String - unit addGoggles type + logNetwork logFile - $Code$player addGoggles "G_Tactical_Clear";$/Code$ - - $Code$diver addGoggles "G_Diving";$/Code$ + $Code$_handle = logNetwork "myLog.txt";$/Code$ undefined / undefined + (March 15, 2016) + With his syntax i get an error... - logNetwork "networkLog.txt"; + $Code$ 5:37:06 Error in expression logNetwork "networkLog.txt"; + 5:37:06 Error position: logNetwork "networkLog.txt"; + 5:37:06 Error lognetwork: Typ Zeichenfolge(STRING), erwartet(except) Array + $/Code$ - Nothing + Number + - addGroupIcon + hcGroupParams - Add icon to a group. Returns icon ID + Returns parameters describing group in high command bar. + Return value is [string, float[4]] - https://community.bistudio.com/wiki/addGroupIcon + https://community.bistudio.com/wiki/hcGroupParams - Group addGroupIcon Array + Object hcGroupParams Group - group addGroupIcon properties + unit hcGroupParams group - $Code$groupName addGroupIcon ["b_inf",[offsetX,offsetY]]$/Code$ - + undefined / undefined - Number + Array + - addHandgunItem + speedMode - Adds weapon item to the weapon cargo space. This is used for infantry weapons. - As of Arma 3 DEV 1.37, this command also supports weapon magazines. + Returns speed mode of the group, which can be any of the following: + "LIMITED" + "NORMAL" + "FULL" - https://community.bistudio.com/wiki/addHandgunItem + https://community.bistudio.com/wiki/speedMode - Object addHandgunItem String + speedMode Object/Group - unit addHandgunItem item + speedMode groupName - $Code$player addHandgunItem "muzzle_snds_L";$/Code$ + $Code$_grpspeed1 = speedMode grp1$/Code$ - local / global + undefined / undefined - Nothing + String + - addHeadgear + isWeaponDeployed - Creates a headgear item and tries to link it to headgear slot. If slot is occupied with another item, the item in the slot will be replaced. + Returns true if weapon is currently deployed. - https://community.bistudio.com/wiki/addHeadgear + https://community.bistudio.com/wiki/isWeaponDeployed - Object addHeadgear String + isWeaponDeployed Object - unit addHeadgear item + isWeaponDeployed unit - $Code$player addHeadgear "H_HelmetB";$/Code$ + $Code$_dep = isWeaponDeployed player ;$/Code$ - global / global + global / undefined + (July 1, 2015) + You can force a unit out of bipod or resting with: + $Code$_unit playMove "";$/Code$ + + (March 4, 2017) + playMove, as well as switchMove, appear to not work when forcing a player out of being deployed. A more reliable method is: $Code$_player setPos (_player modelToWorld [0,0,0]);$/Code$ - Nothing + Boolean + - addItemCargoGlobal + leaveVehicle - Creates new items and stores them in the given container. Works with items, weapons and magazines. + Ceases the using of the vehicle by a group and unassigns vehicle from the group. If the argument is a single unit, the vehicle will be unassigned from unit's group. After vehicle is unassigned from the group, each individual crew member then unassigned from the vehicle. + In short the command could be hypothetically presented as: + leaveVehicle = un- addVehicle + unassignVehicle forEach crew + However, to make it more reliable, it is best to move unit out of the vehicle manually with moveOut command and force unassign the vehicle with unassignVehicle - https://community.bistudio.com/wiki/addItemCargoGlobal + https://community.bistudio.com/wiki/leaveVehicle - Object addItemCargoGlobal Array + Group/Object leaveVehicle Object - box addItemCargoGlobal [item, count] + group leaveVehicle vehicle - $Code$supplyBox addItemCargoGlobal ["optic_ARCO2", 10];$/Code$ + $Code$_unit leaveVehicle _vehicle$/Code$ + + $Code$_grp leaveVehicle _vehicle$/Code$ - global / global + local / local + (August 31, 2013) + In ArmA 3 this command will not force a player to exit from a vehicle. It will unassign vehicle role for this player. AI crew however will also disembark. - Nothing + Nothing + - addItemCargo + removeAllEventHandlers - Creates new items and stores them in given container. Works with items, weapons and magazines. For global variant see addItemCargoGlobal + Removes all event handlers of given type that were added by addEventHandler. Since VBS2 v1.24 can be applied on individual weapon rounds. - https://community.bistudio.com/wiki/addItemCargo + https://community.bistudio.com/wiki/removeAllEventHandlers - Object addItemCargo Array + Object removeAllEventHandlers String - box addItemCargo [item, count] + objectName removeAllEventHandlers handlerType - $Code$supplyBox addItemCargo ["optic_ARCO", 10];$/Code$ + $Code$player removeAllEventHandlers "killed";$/Code$ - local / local + undefined / undefined - Nothing + Nothing + - addItemPool + lbSetTextRight - Adds count items of type name into the weapon pool (used in the campaign to transfer items to the next mission) + Sets the text on the right side of the item with the given index of the listbox or combobox with id idc of the topmost user dialog. - https://community.bistudio.com/wiki/addItemPool + https://community.bistudio.com/wiki/lbSetTextRight - addItemPool Array + lbSetTextRight Array + + Control lbSetTextRight Array - addItemPool [itemName, count] + lbSetTextRight [idc, index, name] + + control lbSetTextRight [index, name] - $Code$addItemPool ["ItemGPS", 5];$/Code$ + $Code$lbSetTextRight [101, 0, "iskoda"];$/Code$ + + $Code$_control lbSetTextRight [0, "iskoda"];$/Code$ - undefined / undefined + local / local + More information on the LB command family can be found here - Nothing + Nothing - Nothing + - addItemToBackpack + getSpeed - Create new item and store it to soldier's backpack. The item can also be a weapon or a magazine. + Get the speed for the given speed mode. + SpeedMode can be: + "AUTO" + "SLOW" + "NORMAL" + "FAST" - https://community.bistudio.com/wiki/addItemToBackpack + https://community.bistudio.com/wiki/getSpeed - Object addItemToBackpack String + Object getSpeed String - unit addItemToBackpack item + object getSpeed speedMode - $Code$player addItemToBackpack "arifle_MXM_Hamr_pointer_F";$/Code$ - - $Code$player addItemToBackpack "itemGPS";$/Code$ + $Code$_spd = player getSpeed "FAST";$/Code$ - global / global + global / undefined - Nothing + Number + - addItemToUniform + deleteMarkerLocal - Create new item and store it to soldier's uniform. The item can also be a weapon or a magazine. + Destroys the given marker. - https://community.bistudio.com/wiki/addItemToUniform + https://community.bistudio.com/wiki/deleteMarkerLocal - Object addItemToUniform String + deleteMarkerLocal String - unit addItemToUniform item + deleteMarkerLocal markerName - $Code$player addItemToUniform "itemGPS";$/Code$ - - $Code$player addItemToUniform "hgun_Rook40_F";$/Code$ + $Code$deleteMarkerLocal "Marker1"$/Code$ - global / global + undefined / local + (7 January, 2012) + Unproven: I believe that if you use this command on a globally-created marker, and subsequently another machine executes a global command on the same marker (e.g. setMarkerPos), then the marker will be re-created on the machine it was previously deleted on. Can result in confusing marker behaviour. - Nothing + Nothing + - addItemToVest + ^ - Create new item and store it to soldier's vest. The item can also be a weapon or a magazine. + Returns the left number to the power of the right one. - https://community.bistudio.com/wiki/addItemToVest + https://community.bistudio.com/wiki/a_%5E_b - Object addItemToVest String + Number ^ Number - unit addItemToVest item - + - $Code$player addItemToVest "itemGPS";$/Code$ - - $Code$player addItemToVest "hgun_Rook40_F";$/Code$ - + - global / global + undefined / undefined - Nothing + Number + - addItem + systemChat - Creates new item and tries to add it into inventory. Inventory must have enough space to accomodate new item or command will fail.The item can also be a weapon or a magazine. + Types text to the system radio channel. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) - https://community.bistudio.com/wiki/addItem + https://community.bistudio.com/wiki/systemChat - Object addItem String + systemChat String - unit addItem item + systemChat text - $Code$bluforUnit addItem "NVGoggles"; - bluforUnit assignItem "NVGoggles"; - opforUnit addItem "NVGoggles_OPFOR"; - opforUnit assignItem "NVGoggles_OPFOR"; - independentUnit addItem "NVGoggles_INDEP"; - independentUnit assignItem "NVGoggles_INDEP";$/Code$ + $Code$systemChat "Hello world!";$/Code$ + + $Code$driver vehicle player sideChat "sideChat"; + driver vehicle player globalChat "globalChat"; + driver vehicle player groupChat "groupChat"; + vehicle player vehicleChat "vehicleChat"; + driver vehicle player commandChat "commandChat"; + driver vehicle player customChat [1, "customChat"]; + systemChat "systemChat";$/Code$ - global / global + undefined / local - Nothing + Nothing + - addLiveStats + titleCut - Adds score to the Xbox Live Statistics score for the given unit (or the commander unit of the given vehicle). (Also available in OFPE & VBS2) + this command was obsoleted, use cutText instead. - https://community.bistudio.com/wiki/addLiveStats + https://community.bistudio.com/wiki/titleCut - Object addLiveStats Number + titleCut Array - unit addLiveStats score + titleCut [text, type, speed] - $Code$player addLiveStats 10$/Code$ + $Code$titleCut ["Hello, how are you?","Plain Down",3];$/Code$ undefined / undefined @@ -2054,342 +2087,388 @@ - Nothing + Nothing + - addMPEventHandler + animationSourcePhase - Adds MP event handler (EH) to the given object and returns EH handle. MP event handlers are added globally to every client on network in multiplayer and will fire on every client too upon event. If EH has some data to return upon event (e.g. the "MPKilled" EH will return an array with 2 elements: the killed unit, and the killer), it is passed in _this variable. Since Arma 3 v.1.63.137807 the EH handle is also stored in _thisEventHandler variable and is available during EH code execution. For more information see: Arma_3:_Event_Handlers#addMPEventHandler + Returns current animation phase of given source. Similar to animationPhase or doorPhase but designed to complement animateSource. - https://community.bistudio.com/wiki/addMPEventHandler + https://community.bistudio.com/wiki/animationSourcePhase - Object addMPEventHandler Array + Object animationSourcePhase String - object addMPEventHandler [type, expression] + object animationSourcePhase source - $Code$_index = player addMPEventHandler ["mpkilled", {Null = _this execVM "playerkilled.sqf";}];$/Code$ + $Code$_phase = house animationSourcePhase "Door_1_source";$/Code$ - global / global + undefined / undefined - (May 8, 2015) - MP EHs are added on every PC and execute on every PC, apart from MPRespawn, that only executes at the locality where unit respawns. - Number + Number + - addMagazineAmmoCargo + selectNoPlayer - Adds magazines with specified ammo count to the cargo space of a vehicle or a container. + Switches player to no unit, makes player return objNull. SP only, the command is completely ignored in MP. - https://community.bistudio.com/wiki/addMagazineAmmoCargo + https://community.bistudio.com/wiki/selectNoPlayer - Object addMagazineAmmoCargo Array + selectNoPlayer - cargospace addMagazineAmmoCargo [magazine, quantity, ammocount] + selectNoPlayer - $Code$_ammobox addMagazineAmmoCargo ["30Rnd_65x39_caseless_mag", 2, 5];$/Code$ + $Code$// Single player: + selectNoPlayer ; + hint str player ; // NULL-object + // Rough multiplayer emulation:_noPlayer = createGroup sideLogic createUnit [ + "Logic", + [0,0,1000], + [], + 0, + "NONE" + ]; + selectPlayer _noPlayer; + hint str player ; //L Charlie 4-3:1 (KK)$/Code$ - global / global + undefined / undefined + Player returns objNull after this command has been used. It also has at least the following side effects: closeDialog won't work anymore and onKeyDown event handlers cease to detect the ESC key. In order to get things back to normal a new player object has to be set with selectPlayer. Using objNull won't cut it in this case. - Nothing + Nothing + - addMagazineCargoGlobal + publicVariableClient - Add magazines to the cargo space of vehicles, which can be taken out by infantry units. - MP Synchronized + Send the variable value to the client computer - same limitations regarding variable type as publicVariable. + The Client ID is the temporary ID given to a connected client for that session. You can find out this ID with the owner command (using it on a player's character, for example, will give you that players client ID). + In Arma 3 it is possible to broadcast nil value - https://community.bistudio.com/wiki/addMagazineCargoGlobal + https://community.bistudio.com/wiki/publicVariableClient - Object addMagazineCargoGlobal Array + Number publicVariableClient String - vehicleName addMagazineCargoGlobal [magazineName, count] + clientID publicVariableClient varName - $Code$_truck addMagazineCargoGlobal ["M16", 5];$/Code$ + $Code$3 publicVariableClient "CTFscoreOne";$/Code$ - global / global + undefined / undefined - (November 7, 2011) - Synchronized to JIP as well. + (24 Aug, 2012) + publicVariableServer (run on client) + publicVariableClient (run on server) + Publishes a variable (name as STRING) to a specific client, from the server. This is useful where you want to synchronize a variable with only a specific client. + This is a useful way to cut down on network traffic, as publicVariable commands are issued as a priority message. So use publicVariable sparingly, and these commands where they apply. - Rocket + + (21 Sep, 2013) + While publicVariable is JIP compatible and persistent, publicVariableClient is not. If you log out then log in with the same owner id the public variable sent to your client prior will be nil. + $Code$//server + pv = 123; + 3 publicVariableClient "pv"; + //connected client with id 3 + hint str pv; //123 + // + //client log out/log in + // + //client id is still 3 + hint str pv; //error, undefined variable pv$/Code$ + + (April 12, 2015) + Tested in Arma 3 v1.43, publicVariableClient works client-to-client if owner id of the targeted client is known. - Nothing + Nothing + - addMagazineCargo + countType - Add magazines to the cargo space of vehicles, which can be taken out by infantry units. Once the magazine cargo space is filled up, any further addMagazineCargo commands are ignored. - In Arma 3, arguments for this command must be local ( ). For global variant see addMagazineCargoGlobal + Count how many objects in the array are of given type. This command also works with parent classes like "Air", "Tank", and "Car". For a full class reference see Classes. - https://community.bistudio.com/wiki/addMagazineCargo + https://community.bistudio.com/wiki/countType - Object addMagazineCargo Array + String countType Array - vehicleName addMagazineCargo [magazineName, count] + type countType objects - $Code$_truck addMagazineCargo ["M16", 5];$/Code$ + $Code$_count = "Tank" countType list _triggerOne;$/Code$ + + $Code$_count = "B_medic_F" countType units player ;$/Code$ - global / local + global / undefined - (October 24, 2009) - Only works on clients. + (April 23, 2007) + This command can be used on the whole hierarchical class tree (i.e. when checking a HMMWV, one could test for "HMMWV50", "Car", "LandVehicle", etc.) + + (May 4, 2016) + To complement Kronzky's note, if one needs to count exact types, countType is not suitable for this, use count instead: + $Code$_count = { typeOf _x == "B_medic_F"} count units player ;$/Code$ - Nothing + Number + - addMagazineGlobal + worldSize - Adds a magazine to the unit. - Note: You may create invalid combinations by adding more magazines than the free space in unit's inventory allows. When doing so, application behaviour is undefined. - This command is broken in MP as it dupes inventory items. Use addMagazine array for now, it takes global argument and has global effect too. + Returns config size of the current world. - https://community.bistudio.com/wiki/addMagazineGlobal + https://community.bistudio.com/wiki/worldSize - Object addMagazineGlobal String + worldSize - unit addMagazineGlobal magazineName + worldSize - $Code$player addMagazineGlobal "30Rnd_65x39_caseless_mag";$/Code$ + $Code$_size = worldSize ; //8192$/Code$ - global / global + undefined / undefined - Nothing + Number + - addMagazinePool + lbPicture - Add magazines to the magazine pool, of which the player may choose in the following mission. Available in campaigns only. + Returns the picture name of the item with the given index of the listbox or combobox with id idc of the topmost user dialog. - https://community.bistudio.com/wiki/addMagazinePool + https://community.bistudio.com/wiki/lbPicture - addMagazinePool Array + lbPicture Array + + Control lbPicture Number - addMagazinePool [magazineName, count] + lbPicture [idc, index] + + control lbPicture index - $Code$addMagazinePool ["M16", 20];$/Code$ + $Code$_picture = lbPicture [101, 0];$/Code$ + + $Code$_picture = _control lbPicture 0;$/Code$ undefined / undefined + More information on the LB command family can be found here - Nothing + String - String + - addMagazineTurret + selectEditorObject - Adds a magazine to the turret. Use turret path [-1] for driver's turret. - Note: you may create invalid combinations by using this function, for example by adding 20 grenades. When doing so, application behaviour is undefined. Since Arma 3 v1.55.133817 it is possible to set custom ammo count in added magazine. + Select an editor object. Does not un-select previously selected objects. + i + Some Old Editor Command - https://community.bistudio.com/wiki/addMagazineTurret + https://community.bistudio.com/wiki/selectEditorObject - Object addMagazineTurret Array + Control selectEditorObject String - vehicle addMagazineTurret [magazineName, turretPath, ammoCount] + map selectEditorObject object - $Code$_tank addMagazineTurret ["SmokeLauncherMag",[0,0]];$/Code$ - - $Code$_tank addMagazineTurret ["20Rnd_120mmSABOT_M1A2",[0]];$/Code$ - + - local / global + undefined / undefined - Nothing + Any_Value + - addMagazines + setCurrentTask - Adds multiple magazines to the unit. For cargo containers use addMagazineCargoGlobal command. + Set the task as a current task of the person. - https://community.bistudio.com/wiki/addMagazines + https://community.bistudio.com/wiki/setCurrentTask - Object addMagazines Array + Object setCurrentTask Task - unit addMagazines [magazineName, count] + object setCurrentTask task - $Code$player addMagazines ["30Rnd_65x39_caseless_mag", 3];$/Code$ + $Code$player setCurrentTask tskKillSpongebob;$/Code$ - global / global + undefined / undefined - Nothing + Nothing + - addMagazine + currentVisionMode - Add a magazine to a person. Infantry units can only carry a specific number of magazines, once the magazine slots are filled, any further addMagazine commands are ignored. - Note: When you add a new weapon via scripting commands as well as the magazines for it, the addMagazine command has to be given before the addWeapon command, otherwise the weapon won't be loaded. - In Arma 3, the alternative variant of this command (addMagazine ARRAY) accepts global arguments, i.e. you can use it on the server to give remote unit a magazine with limited ammo. + Returns current vision mode of unit's weapon. + 0 - daytime + 1 - night vision + 2 - thermal vision - https://community.bistudio.com/wiki/addMagazine + https://community.bistudio.com/wiki/currentVisionMode - Object addMagazine String - - Object addMagazine Array + currentVisionMode Object - unitName addMagazine magazineName - - unitName addMagazine [magazineName, ammoCount] + currentVisionMode unit - $Code$player addMagazine "30Rnd_556x45_STANAG";$/Code$ + $Code$_currMode = currentVisionMode gunner _tank$/Code$ - $Code$player addMagazine ["30Rnd_556x45_STANAG", 15];$/Code$ + $Code$if ( currentVisionMode player == 1) then + { + hint "nightvision active"; + };$/Code$ - local / global + global / undefined - (August 2, 2006) - If the unit has magazines already, you may need to use the commands removeMagazine or removeMagazines to make space for the mags you want to add. - - (February 21, 2010) - In turreted vehicles the magazine is added to the first turret with primaryGunner = 1; set in the Vehicles turret config part (and the magazine is ONLY added to the very first turret if more than one is configged with primaryGunner = 1; ). - - (May 12, 2010) - When wanting to add many magazines to an object's init-line it can be easier to use loops than to just repeat the addMagazine command. - If you want to add N magazines to an object either of the two below ways are handy, the first for fewer magazines, and the latter when you want to add many since it then is the easiest of the two to read. - $Code${this addMagazine "magazineClassName"} forEach [1,2,3,...,N]; - for "_i" from 0 to (N - 1) do {this addMagazine "magazineClassName"};$/Code$ + (April 29, 2016) + The return value is somewhat erratic for UAVs. For example, if you are connected to a UAV, with the turret set to thermal vision and PIP feed enabled, "currentVisionMode gunner _uav" returns 2 when controlling the turret, but returns 0 after releasing control, even thought the PIP feed is still in thermal mode. WIth nightvision, it will return 1 whether or not you are controlling the turret, but if you switch from 1st to 3rd person before releasing control, then it returns 0 afterwards... - Nothing - Nothing + Number + - addMenuItem + ctrlCommitted - Creates a new menu item. Menu can be "file" or "view",index is index,as returned from addMenu command. priority is optional and determines,where in the menu the item will reside (higher priority items first). - i - Some Old Editor Command + Check if the control animation is finished. - https://community.bistudio.com/wiki/addMenuItem + https://community.bistudio.com/wiki/ctrlCommitted - Control addMenuItem Array + ctrlCommitted Control - map addMenuItem [menu or index,text,command,priority] + ctrlCommitted controlName - + $Code$_done = ctrlCommitted _control$/Code$ + undefined / undefined - Number + Boolean + - addMenu + ctrlSetStructuredText - Adds a new menu button. Priority is optional. - i - Some Old Editor Command + Set the structured text which will be displayed in structured text control. - https://community.bistudio.com/wiki/addMenu + https://community.bistudio.com/wiki/ctrlSetStructuredText - Control addMenu Array + Control ctrlSetStructuredText Structured_Text - map addMenu [text,priority] + control ctrlSetStructuredText structuredText - $Code$example$/Code$ + $Code$_control ctrlSetStructuredText parseText "First line img image=data\isniper.paa / br / Second line"$/Code$ + + $Code$// To center text vertically, add extra line above with blank space ( ) and set its size to adjust: + with uiNamespace do { + button = findDisplay 46 ctrlCreate ["RscShortcutButton", -1]; + button ctrlSetPosition [0,0,0.3,0.1]; + button ctrlCommit 0; + button ctrlSetStructuredText parseText + " t size='0.5' /t br/ t size='1' align='center' Button Text /t "; + };$/Code$ undefined / undefined @@ -2397,28 +2476,28 @@ - Number + Nothing + - addMissionEventHandler + halt - Adds event handler (EH) attached to the current mission and returns EH handle. If EH has some data to return upon event, it is passed in _this variable. Since Arma 3 v.1.63.137807 the EH handle is also stored in _thisEventHandler variable and is available during EH code execution. For the list of available mission event handlers see: Arma_3:_Event_Handlers/addMissionEventHandler + Stops the program into a debugger. In retail version using halt results in error. - https://community.bistudio.com/wiki/addMissionEventHandler + https://community.bistudio.com/wiki/halt - addMissionEventHandler Array + halt - addMissionEventHandler [type, command] + halt - $Code$// A script could be executed to stop custom scripts graciously, or save progress & stats, for example: - _id = addMissionEventHandler ["Ended",{ _this execVM "missionEnded.sqf" }];$/Code$ + $Code$? _DbugWanted :halt$/Code$ undefined / undefined @@ -2426,61 +2505,147 @@ - Number + Nothing + - addMusicEventHandler + isFlatEmpty - Adds playMusic event handler. Returns id of the handler or -1 when failed. Just like addMissionEventHandler, music EH is also attached to the mission. + Checks given position against given filter params. Filter includes checks for: + If there are any objects closer than given distance from given position (in 2D) + If the area around position is flat enough to match given gradient + If the given position is over water or land + If the given position is over shore line + The gradient seems to correlate with general hill steepness: 0.1 (10%) ~6 o, 0.5 (50%) ~27 o, 1.0 (100%) ~45 o, etc.There are also some oddities about this command that need to be noted: + Objects accounted for proximity check seem to be static objects. Nearby vehicles and units do not seem to affect the output + Given position will be magically transferred into given position + getTerrainHeightASL value + The second element must be -1 ( = 0 really) at all times, otherwise command becomes unusable + The command might be a bit heavy on computations so avoid frequent and large area checks + See also: BIS_fnc_findSafePos - https://community.bistudio.com/wiki/addMusicEventHandler + https://community.bistudio.com/wiki/isFlatEmpty - addMusicEventHandler Array + Array isFlatEmpty Array - addMusicEventHandler [type, function] + position isFlatEmpty [minDistance, mode, maxGradient, maxGradientRadius, overLandOrWater, shoreLine, ignoreObject] - $Code$_ehID = addMusicEventHandler ["MusicStart", { hint str _this}];$/Code$ + $Code$// Check if player position is over land: + _overLand = !( position player isFlatEmpty [-1, -1, -1, -1, 0, false ] isEqualTo []);$/Code$ - $Code$_ehID = addMusicEventHandler ["MusicStop", { hint str _this}];$/Code$ + $Code$// Check if player position is over shore line: + _overShore = !( position player isFlatEmpty [-1, -1, -1, -1, 0, true ] isEqualTo []);$/Code$ + + $Code$// Check if player position is over water: + _overWater = !( position player isFlatEmpty [-1, -1, -1, -1, 2, false ] isEqualTo []);$/Code$ + + $Code$// Check if no object is closer than 5m to player position: + _isEmpty = !( position player isFlatEmpty [5, -1, -1, -1, -1, false, player ] isEqualTo []);$/Code$ + + $Code$// Check if area 10m around player position is relatively flat: + _isFlat = !( position player isFlatEmpty [-1, -1, 0.3, 10, -1] isEqualTo []);$/Code$ + + $Code$// Check if area 15m around player position is very flat and empty: + _isFlatEmpty = !( position player isFlatEmpty [15, -1, 0.1, 15, -1, false, player ] isEqualTo []);$/Code$ undefined / undefined - (March 4, 2013) - There are these two types at this time: - MusicStart - It is triggered when the music is started (command playMusic ). In variable _this is stored class name from CfgMusic. - MusicStop - It is triggered when the music is ended (command playMusic ). In variable _this is stored class name from CfgMusic. + (April 24, 2016) + When this command is instructed to check if area at given position is empty it takes into account the radius of the bounding sphere of surrounding objects. Because of this, the high voltage columns such as "Land_HighVoltageColumnWire_F" and such objects may appear extremely large to the calculations and the position will be rejected even if visually it doesn't look too bad. To avoid this, use findEmptyPosition command first to find guaranteed empty position, then pass the result to isFlatEmpty making sure you switched off proximity check by setting 1st param to -1. For example: + $Code$// Check if given position is flat and empty within 1m radius + [4274.66,12113,0.00139618] isFlatEmpty [1, -1, 0.1, 1, -1, false, objNull ]; //[]$/Code$ + The result suggests it is not flat and empty. + $Code$// Check if given position is flat within 1m radius + [4274.66,12113,0.00139618] isFlatEmpty [-1, -1, 0.1, 1, -1, false, objNull ]; //[4274.66,12113,48.3209]$/Code$ + The result suggests it is. + $Code$// Check if given position is empty within 1m radius + [4274.66,12113,0.00139618] isFlatEmpty [1, -1, -1, -1, -1, false, objNull ]; //[]$/Code$ + The result suggests it is not empty. But the position is in the middle of a road and there is nothing within 1m but there is "Land_HighVoltageColumnWire_F" not far. + $Code$// Check if given position is empty within 1m radius ignoring nearest "Land_HighVoltageColumnWire_F" + [4274.66,12113,0.00139618] isFlatEmpty [1, -1, -1, 1, -1, false, nearestObject [[4274.66,12113,0.00139618], "Land_HighVoltageColumnWire_F"]]; //[4274.66,12113,48.3209]$/Code$ + The result now suggests it is empty. So instead of relying on internal proximity check we can combine both commands: + $Code$fnc_isFlatEmpty = + { + params ["_pos", "_params"]; + _pos = _pos findEmptyPosition [0, _params select 0]; + if (_pos isEqualTo []) exitWith {[]}; + _params =+ _params; + _params set [0, -1]; + _pos = _pos isFlatEmpty _params; + if (_pos isEqualTo []) exitWith {[]}; + _pos + }; + // Test + [[4274.66,12113,0.00139618], [1, -1, 0.1, 1, -1, false, objNull ]] call fnc_isFlatEmpty; //[4274.53,12113,48.3175] + $/Code$ - Number + Array + - addOwnedMine + throw - Sets ownership over a remotely detonatable mine to the unit. + Throws an exception. The exception is processed by first catch block. This command will terminate further execution of the code. + NOTE : Avoid using alternative shorthand syntax if you are planning on preparing your exception information dynamically, as it will have to be generated first regardless of the condition of the if statement before it, as shown in example 3. - https://community.bistudio.com/wiki/addOwnedMine + https://community.bistudio.com/wiki/throw - Object addOwnedMine Object + throw Anything + + If_Type throw Anything - Unit addOwnedMine mine + throw expression + + if throw exception - $Code$player addOwnedMine SuperMine;$/Code$ + $Code$try { throw "invalid argument"} catch { hint str _exception};$/Code$ + + $Code$// Since Arma 3 v1.53.133045: + 123 try { if (_this != 123) throw "invalid argument"} catch { hint str _exception};$/Code$ + + $Code$// The correct usage of shorthand alt syntax: + try { + if (a b) throw "Error: some error"; /// OK + /// The command argument is static + } catch { + hint str _exception; + }; + try { + _someFunc = { + ..... + }; + if (a b) throw ( call _someFunc); /// NOT OK + /// The command argument is dynamic + /// _someFunc is called first to get the value regardless of (a b) outcome + } catch { + hint str _exception; + }; + try { + _someFunc = { + ..... + }; + if (a b) then { throw ( call _someFunc)}; /// OK + /// The command argument is dynamic + /// _someFunc is only called when (a b) is true + } catch { + hint str _exception; + };$/Code$ undefined / undefined @@ -2488,508 +2653,464 @@ - Nothing + Nothing - Nothing + - addPlayerScores + setAnimAimPrecision - MP server only: Adds player score. + Set aimPrecision value of the current animation state (parameter aimPrecision) - https://community.bistudio.com/wiki/addPlayerScores + https://community.bistudio.com/wiki/setAnimAimPrecision - Object addPlayerScores Array + Object setAnimAimPrecision Number - unit addPlayerScores values + unit setAnimAimPrecision value - $Code$player addPlayerScores [0, 1, 0, 0, 1];$/Code$ + $Code$player setAnimAimPrecision 1$/Code$ - undefined / undefined + global / global - This scripting command must be executed on the server to work properly in multiplayer - - (May 2, 2017) - As this command will add the given number to a player's score, a little bit of thought needs to be given to friendly-fire if it's for something like a deathmatch or a FFA, due to friendly-fire incurring negative points. So to counter this just add 2 points every time a player kills a unit from the same side: - $Code$player addPlayerScores [2, 0, 0, 0, 0];$/Code$ - The 2 points will add 1 point to counter the negative friendly-fire point and 1 point to add correctly to the score. - Nothing + Nothing + - addPrimaryWeaponItem + disableCollisionWith - Adds weapon item to the weapon cargo space. This is used for infantry weapons. - As of Arma 3 DEV 1.37, this command also supports weapon magazines. + Disable collision between vehicles. This command doesn't disable collision between PhysX objects. + ! + Command has to be executed where objects are local, and as long as they don't change locality, the effect of this command will be global. + If the 2 objects are not local to the same computer, then it has to be executed on both computers to achieve the desired effect. + If one or both objects change locality, the command needs to be executed again on the new owner 's machine(s) to maintain the effect. - https://community.bistudio.com/wiki/addPrimaryWeaponItem + https://community.bistudio.com/wiki/disableCollisionWith - Object addPrimaryWeaponItem String + Object disableCollisionWith Object - unit addPrimaryWeaponItem item + vehicle disableCollisionWith vehicle - $Code$player addPrimaryWeaponItem "muzzle_snds_H";$/Code$ - + local / global - (June 22, 2014) - If the item being added is not supported by the unit's weapon then the command will simply fail silently. The item is also not added to the unit's inventory in such a case. + (April 4, 2015) + disableCollisionWith is basically a script that when you apply it to an object, and your unit can go through it like a ghost. However, if you wish the object to be solid again, you may wish to use the enableCollisionWith. + An example for this is: + $Code$//name of unit in editor such as player1 + //name of object in editor such as barrel1 + barrel1 disableCollisionWith player1; + //to make the barrel solid again, do this as vice versa if you know what your doing! + barrel1 enableCollisionWith player1 $/Code$ + On a side note: this can come in handy a lot if you want a unit to sit on the back of a car or on top of a container - Nothing + Nothing + - addPublicVariableEventHandler + composeText - 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 select 0: String - broadcast variable name (same variable name EH is attached to) - _this select 1: Anything - broadcast variable value - _this select 2: Object, Group - target the variable got set on with setVariable (see: alternative syntax) - Please note: - * EH works only in Multiplayer environment. - * EH will not fire on the machine that executed broadcast 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. - Alt syntax of this command doesn't work as intended + Creates a structured text by joining the given structured or plain texts. - https://community.bistudio.com/wiki/addPublicVariableEventHandler + https://community.bistudio.com/wiki/composeText - String addPublicVariableEventHandler Code - - String addPublicVariableEventHandler Array + composeText Array - varName addPublicVariableEventHandler code - - varName addPublicVariableEventHandler [target, code] + composeText [text1, text2,] - $Code$"publicThis" addPublicVariableEventHandler { - hint format [ - "%1 has been updated to: %2", - _this select 0, - _this select 1 - ] - };$/Code$ - - $Code$// Client: - "'^:)123BURP,+=lol" addPublicVariableEventHandler { hint ("NUTS are " + (_this select 1))}; - // Server: missionNamespace setVariable ["'^:)123BURP,+=lol", "craZZZZy"]; - publicVariable "'^:)123BURP,+=lol";$/Code$ + $Code$_txt = composeText ["First line", image "data\isniper.paa", lineBreak, "Second line"];$/Code$ - global / local + undefined / undefined - (22 Dec, 2007) - 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. - - (27 Feb, 2014 00:57) - 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. - - (27 Feb, 2014 08:40) - 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 scheduled script from it. - $Code$//script with preInit = 1; in CfgFunctions - 0 = 0 spawn { - "someVar" addPublicVariableEventHandler { - //yourcode - }; - };$/Code$ - - (November 23, 2015) - 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 { - "OnServer" addPublicVariableEventHandler { hint "This event handler still fired!"; }; - publicVariableServer "OnServer"; - };$/Code$ - $Code$// 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!"; }; - client ID publicVariableClient "OnClient"; - $/Code$ - Nothing - Nothing + Structured_Text + - addRating + someAmmo - Add a number to the rating of a unit - negative values can be used to reduce the rating. - This command is usually used to reward for completed mission objectives. The rating is given at the end of the mission and is automatically adjusted when killing enemies or friendlies. - When the rating gets below -2000, the unit's side switches to "ENEMY" ( sideEnemy ) and the unit is attacked by everyone.(see Rating Values ) - See also: Arma_3:_Event_Handlers#HandleRating + Check if unit has some ammo. - https://community.bistudio.com/wiki/addRating + https://community.bistudio.com/wiki/someAmmo - Object addRating Number + someAmmo Object - unitName addRating rating + someAmmo unitName - $Code$player addRating 2000;$/Code$ + $Code$? not (someAmmo _loon1) : hint "Loon1 is out of ammo!"$/Code$ - local / global + undefined / undefined - (November 16, 2014) - Since there is no setRating command, its expected behaviour can scripted as such: - $Code$BNRG_fnc_setRating = { - _setRating = _this select 0; - _unit = _this select 1; - _getRating = rating _unit; - _addVal = _setRating - _getRating; - _unit addRating _addVal; - }; - [1000,player] call BNRG_fnc_setRating//set player rating 1000$/Code$ - Using this example, no matter what the units rating was before, it will always set its rating to 1000. - Nothing + Boolean + - addResources + diag_captureFrameToFile - Adds resources to a team member. + This command starts counting frames from the moment it is executed and when the count reaches the number passed as param, the current frame is captured and + written to a log file in the same directory as the.rpt file. + The full Path to the log file is logged to simultaneously. + The data in the log file can be copied and pasted into the diag_captureFrame UI dialog to get a visualisation later on. + Note : Only available in specific builds. See Performance Profiling for details. - https://community.bistudio.com/wiki/addResources + https://community.bistudio.com/wiki/diag_captureFrameToFile - Team_Member addResources Array + diag_captureFrameToFile Number - teamMember addResources [resource1, resource2,] + diag_captureFrameToFile frame - + $Code$diag_captureFrameToFile 1; //capture the first frame after command execution$/Code$ + + $Code$diag_captureFrameToFile 24; //capture 24th frame after command execution$/Code$ + - global / local + undefined / undefined - Nothing + Nothing + - addScoreSide + diag_activeSQSScripts - Adds side score. This is shown in the MP score tab as the total score. MP Only. Server execution only. + Returns array with active SQSs. - https://community.bistudio.com/wiki/addScoreSide + https://community.bistudio.com/wiki/diag_activeSQSScripts - Side addScoreSide Number + diag_activeSQSScripts - side addScoreSide value + diag_activeSQSScripts - $Code$west addScoreSide 10;$/Code$ + $Code${ systemChat str _x} forEach diag_activeSQSScripts ;$/Code$ - global / global + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Array + - addScore + menuChecked - Add a number to the score of a unit. This score is shown in multiplayer in the "I" ("P" in Arma 3) screen. Negative values will remove from the score. Server execution only. - See also: Arma_3:_Event_Handlers#HandleScore + Returns if item on given path is checked or not. - https://community.bistudio.com/wiki/addScore + https://community.bistudio.com/wiki/menuChecked - Object addScore Number + menuChecked Array - unit addScore score + menuChecked [idc, path] - $Code$unit addScore 10;$/Code$ - + - global / global + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Boolean + - addSecondaryWeaponItem + remove3DENConnection - Adds weapon item to the weapon cargo space. This is used for infantry weapons. - As of Arma 3 DEV 1.37, this command also supports weapon magazines. + Remove connection between entities. - https://community.bistudio.com/wiki/addSecondaryWeaponItem + https://community.bistudio.com/wiki/remove3DENConnection - Object addSecondaryWeaponItem String + remove3DENConnection Array - unit addSecondaryWeaponItem item + remove3DENConnection [type, from, to] - + $Code$remove3DENConnection ["RandomStart", get3DENSelected "Object","marker_0"] + // Remove random start on marker "marker_0" from all selected objects.$/Code$ + - local / global + undefined / undefined - Nothing + Boolean + - addSwitchableUnit + addResources - Adds a unit into the list of units available for Team Switch. Units marked as playable in editor are automatically switchable. This command allows to add non-playable unit into array of switchableUnits and make them available for teamSwitch. SP only. + Adds resources to a team member. - https://community.bistudio.com/wiki/addSwitchableUnit + https://community.bistudio.com/wiki/addResources - addSwitchableUnit Object + Team_Member addResources Array - addSwitchableUnit unitName + teamMember addResources [resource1, resource2,] - $Code$addSwitchableUnit bob$/Code$ - + - undefined / undefined + global / local - Nothing + Nothing + - addTeamMember + addHeadgear - Add given member to given team. Effect is local, unless both member and team are local to PC on which command is executed, then effect is global. - The same Team Member can be member of several different teams at the same time. + Creates a headgear item and tries to link it to headgear slot. If slot is occupied with another item, the item in the slot will be replaced. - https://community.bistudio.com/wiki/addTeamMember + https://community.bistudio.com/wiki/addHeadgear - Team_Member addTeamMember Team_Member + Object addHeadgear String - team addTeamMember member + unit addHeadgear item - $Code$_team addTeamMember _teamMember;$/Code$ + $Code$player addHeadgear "H_HelmetB";$/Code$ - local / local + global / global - Nothing + Nothing + - addToRemainsCollector + enableAudioFeature - Adds an array of vehicles/units to disposal manager for automatic wreck/body removal. The disposal manager follows wreck/body removal values set in description.ext + Enable/disable an audio feature, features are: "lowpass", "building_interior". Return previous state - https://community.bistudio.com/wiki/addToRemainsCollector + https://community.bistudio.com/wiki/enableAudioFeature - addToRemainsCollector Array + enableAudioFeature Array - addToRemainsCollector remains + enableAudioFeature [feature, enable] - $Code$addToRemainsCollector [unit1, unit2, vehicle1];$/Code$ + $Code$prevState = enableAudioFeature ["lowpass", true ];$/Code$ - global / global + undefined / undefined - Nothing + Boolean + - addTorque + showRadio - Applies torque (rotation momentum) to the center of mass of the given object. Torque force is defined as vector [x, y, z] applied in world space. If you need to define torque in model space, convert the torque vector first by vectorModelToWorld or vectorModelToWorldVisual command. The torque applied as impulse. Diagram below explain which way the object would rotate. For more information see NVIDIA docs + Shows or hides the radio on the map screen, if enabled for the mission and you possess the item. (default true ) - https://community.bistudio.com/wiki/addTorque + https://community.bistudio.com/wiki/showRadio - Object addTorque Array + showRadio Boolean - object addTorque torque + showRadio show - $Code$// Apply torque [1000,0,0] to object not factoring object positioning: - _wheel addTorque [1000,0,0];$/Code$ - - $Code$// Apply torque [1000,0,0] relative to object: - _wheel addTorque (_wheel vectorModelToWorld [1000,0,0]);$/Code$ + $Code$showRadio false$/Code$ - global / global + undefined / undefined + (16 Aug, 2009) + In Arma 2, the radio is now an item in ArmA 2. Class path is CfgWeapons- ItemRadio. Use the command addWeapon and removeWeapon to remove it from a unit's inventory. (example: player removeweapon "ItemRadio") - Nothing + Nothing + - addUniform + getUnitTrait - Create a new uniform and try to link it into uniform slot (given uniform has to be supported by allowedUniforms list of target soldier). To check if uniform is allowed use isUniformAllowed and to force add incompatible uniform use forceAddUniform + Gets the current value of a trait of the given unit. + Default traits are: + audibleCoef (scalar) + camouflageCoef (scalar) + engineer (bool) + explosiveSpecialist (bool) + loadCoef (scalar) + medic (bool) + UAVHacker (bool) - https://community.bistudio.com/wiki/addUniform + https://community.bistudio.com/wiki/getUnitTrait - Object addUniform String + Object getUnitTrait String - unit addUniform type + unit getUnitTrait skill_name - $Code$_unit addUniform "U_B_CombatUniform_mcam";$/Code$ + $Code$player getUnitTrait "Medic";$/Code$ - global / global + global / undefined - Nothing + Boolean/Number + - addVehicle + clearRadio - Adds a specified vehicle for use by a specified AI led group taking into account vehicle's cost. The vehicle will be considered as an available vehicle for use by this group. - When vehicle is added in this way, it can appear as a target for the enemy even if the vehicle is currently free of the crew. Vehicles with crew, which are placed in the editor, get automatically added to the group. To remove vehicle from a group, use leaveVehicle. + Clean up the content of radio protocol history. - https://community.bistudio.com/wiki/addVehicle + https://community.bistudio.com/wiki/clearRadio - Group addVehicle Object + clearRadio - groupName addVehicle vehicleName + clearRadio - $Code$_grp addVehicle _vehicle$/Code$ - - $Code$// Using on crewed vehicle: - group tank addVehicle tank;$/Code$ + $Code$clearRadio;$/Code$ - local / undefined + undefined / local - (22 Nov, 2008 00:40) - This command works best when used on empty vehicles. If used on a vehicle already driven by a member of another group, the driver will continue under his own group's orders, which may not benefit the addVehicle group. - More than one vehicle can be added to a group, and more than one group can be added to a vehicle. - When deciding whether to board a vehicle, AI leaders seem to only consider the transport benefit of a vehicle, ignoring any combat benefits the vehicle may provide. + Use $Code$ enableRadio false;$/Code$ to disable the chat. - Nothing + Nothing + - addVest + ATLToASL - Create a new vest and try to link it into vest slot. + Converts a position from PositionATL to PositionASL - https://community.bistudio.com/wiki/addVest + https://community.bistudio.com/wiki/ATLToASL - Object addVest String + ATLToASL PositionATL - unit addVest type + ATLToASL pos - $Code$player addVest "V_TacVest_blk_POLICE";$/Code$ + $Code$ATLToASL ( getPosATL player ) isEqualTo getPosASL player$/Code$ + + $Code$_camPosASL = ATLToASL positionCameraToWorld [0,0,0];$/Code$ undefined / undefined @@ -2997,334 +3118,371 @@ - Nothing + PositionASL + - addWaypoint + lnbData - Adds (or inserts when index is given) a new waypoint to a group. - The waypoint is placed randomly within a circle with the given center and radius. - The function returns a waypoint with format [group, index]. + Returns the additional text (invisible) in an item with the given position of the 2D listbox. - https://community.bistudio.com/wiki/addWaypoint + https://community.bistudio.com/wiki/lnbData - Group addWaypoint Array + lnbData Array + + Control lnbData Array - groupName addWaypoint [center, radius, index, name] + lnbData [idc, [row, column]] + + ctrl lnbData [row, column] - $Code$_wp =_grp addWaypoint [ position player, 0];$/Code$ + $Code$_ctrl lnbData [ lnbCurSelRow _ctrl,0]; //"#1"$/Code$ - global / global + local / local - (November 26, 2009) - In game versions prior to Arma 3 v1.22: - If you add a waypoint to your group and then want them to start moving to that waypoint, make sure to call setWaypointType "MOVE" on your waypoint. - - (18:23, 28 April 2011 (CEST)) - In VBS2 1.30, the randomization of addWaypoint doesn't seem to work correctly all of the time. - The alternative syntax of addWaypoint with a specified index doesn't seem to work correctly. - - (June 21, 2014) - if you want to create a waypoint of type "MOVE" and set it as actual waypoint, you can use the move command that does everything for you with only one line of code ! Be aware that move command intercepts multiple waypoints and it will not line up in waypoints queue. In other word it is a quick solution if you want your group to get only one waypoint, but for several waypoints you'll have to use addwaypoint and all setwaypointXXXXXX commands around. see move command. - - (August 4, 2014) - The waypoint may not be created exactly at the center position even if radius is zero. The position will be moved away if there are e.g. rocks at the center position or if it is placed at the edge of water on a shore. + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Array + String - String + - addWeaponCargoGlobal + fillWeaponsFromPool - Add weapons to the cargo space of vehicles, which can be taken out by infantry units. - MP Synchronized + Adds magazines from the campaign pool to the given unit, depending on his weapons. - https://community.bistudio.com/wiki/addWeaponCargoGlobal + https://community.bistudio.com/wiki/fillWeaponsFromPool - Object addWeaponCargoGlobal Array + fillWeaponsFromPool Object - vehicleName addWeaponCargoGlobal [weaponName, count] + fillWeaponsFromPool unitName - $Code$_truck addWeaponCargoGlobal["M16",5];$/Code$ + $Code$fillWeaponsFromPool _soldier$/Code$ - global / global + undefined / undefined - (November 7, 2011) - Synchronized to JIP as well. - Nothing + Nothing + - addWeaponCargo + cameraInterest - Add weapons to the cargo space of vehicles, which can be taken out by infantry units. Ignores available cargo space. - In Arma 3, arguments for this command must be local ( ). For global variant see addWeaponCargoGlobal + Return camera interest for given entity, as set by setCameraInterest, or as autodetected. - https://community.bistudio.com/wiki/addWeaponCargo + https://community.bistudio.com/wiki/cameraInterest - Object addWeaponCargo Array + cameraInterest Object - vehicleName addWeaponCargo [weaponName, count] + cameraInterest entity - $Code$_truck addWeaponCargo ["M16",5]$/Code$ + $Code$camInterest = cameraInterest myUnit;$/Code$ - global / local + undefined / undefined - (October 24, 2009) - Only works on clients. - - (July 10, 2010) - When players add/remove gear directly via the gear menu that gear is synchronized across the network. Since this command is local only, using it during a mission can cause all sorts of weird issues. To get proper synchronization use this command in the object's init line or in a script called from its init line with a call compile preprocessFile command (and not execVM ). - Nothing + Number + - addWeaponGlobal + surfaceIsWater - Add a weapon to a unit. Infantry units can only carry weapons in their respective slots (primary, secondary and handgun), the addWeaponGlobal command will replace the weapon currently in a slot with the added weapon if it shares the same slot. - To make sure the added weapon is loaded and ready, add the magazine first. - This command is broken when used on dedicated server + Returns whether water is at given position. - https://community.bistudio.com/wiki/addWeaponGlobal + https://community.bistudio.com/wiki/surfaceIsWater - Object addWeaponGlobal String + surfaceIsWater Array - unit addWeaponGlobal weapon + surfaceIsWater position - $Code${ - _x addMagazineGlobal "Laserbatteries"; - _x addWeaponGlobal "Laserdesignator"; - } forEach allUnits ;$/Code$ + $Code$_isWater= surfaceIsWater [1000, 3000];$/Code$ - $Code${ - if ( typeOf _x == "O_Heli_Attack_02_black_F") then { - _x addMagazineGlobal "38Rnd_80mm_rockets"; - _x addWeaponGlobal "rockets_Skyfire"; - }; - } forEach vehicles ;$/Code$ + $Code$_isWater = surfaceIsWater position player ;$/Code$ - global / global + undefined / undefined - (July 7, 2015) - If you do not remove weapon first, using this command from dedicated server will duplicate weapon. + (4 May, 2012) + Does not work with inland water. Works only with sea water. - Nothing + Boolean + - addWeaponItem + addItem - Adds a weapon item to the specified weapon. The item can be weapon magazine, in which case the amount of ammo and target muzzle could also be specified. + Creates new item and tries to add it into inventory. Inventory must have enough space to accomodate new item or command will fail.The item can also be a weapon or a magazine. - https://community.bistudio.com/wiki/addWeaponItem + https://community.bistudio.com/wiki/addItem - Object addWeaponItem Array + Object addItem String - unit addWeaponItem [weaponName, itemName] - - unit addWeaponItem [weaponName, [itemName, ammoCount, muzzleName]] + unit addItem item - $Code$player addWeaponItem ["arifle_MX_GL_ACO_F", "1Rnd_HE_Grenade_shell"];$/Code$ - - $Code$player addWeaponItem ["arifle_MX_GL_ACO_F", ["1Rnd_HE_Grenade_shell", 1, "GL_3GL_F"]];$/Code$ + $Code$bluforUnit addItem "NVGoggles"; + bluforUnit assignItem "NVGoggles"; + opforUnit addItem "NVGoggles_OPFOR"; + opforUnit assignItem "NVGoggles_OPFOR"; + independentUnit addItem "NVGoggles_INDEP"; + independentUnit assignItem "NVGoggles_INDEP";$/Code$ - local / global + global / global - Nothing + Nothing + - addWeaponPool + setRain - Add weapons to the weapon pool, of which the player may choose in the following mission. Available in campaigns only. + Set rain density smoothly over the given transition time (in seconds). A transition time of zero means an immediate change. A rain density of zero is no rain, one is maximum rain. Rain is not possible when overcast is less than 0.7. + NOTE : Since Arma 3 this command is MP synchronised, if executed on server, the changes will propagate globally. If executed on client effect is temporary as it will soon change to the server setting. - https://community.bistudio.com/wiki/addWeaponPool + https://community.bistudio.com/wiki/setRain - addWeaponPool Array + Number setRain Number - addWeaponPool [weaponName, count] + time setRain rain - $Code$addWeaponPool ["M16",5];$/Code$ + $Code$60 setRain 1;$/Code$ + + $Code$// Force no rain: + 0 setRain 0; + forceWeatherChange ; + 999999 setRain 0;$/Code$ - undefined / undefined + undefined / global + This scripting command must be executed on the server to work properly in multiplayer + + (December 15, 2015) + setTimeMultiplier does NOT affect transition time. + + (November 16, 2016) + Using Example 2 on dedicated server might need additional interference on JIP clients. The reason is that JIP has rain value 0 slowly changing to 0. To force client to sync one can execute this on client: $Code$ skipTime 1; skipTime -1;$/Code$ - Nothing + Nothing + - addWeaponTurret + list - Adds a weapon to the turret. Use turret path [-1] for driver's turret. + List of units that would activate given Trigger. + It returns nothing before the simulation started, i.e. in (undelayed) init.sqf files. Returns a pointer to the trigger's list after the simulation started. Since this is just a reference this means that the value in your local variable will change as the content of the trigger area changes. To permanently copy the returned list to a different variable, use _mylist = +(list triggerOne). + The second example can be used inside the trigger (in that case, no need to name your trigger). + The list returned for trigger of type "Not present" is the same as that returned for type "present". + NOTE: While the command can query any trigger, local or remote, the result will be only for the trigger condition set on the local client. See createTrigger for more info. - https://community.bistudio.com/wiki/addWeaponTurret + https://community.bistudio.com/wiki/list - Object addWeaponTurret Array + list Object - vehicle addWeaponTurret [weaponName, turretPath] + list trigger - $Code$_tank addWeaponTurret ["LMG_M200",[0,0]];$/Code$ + $Code$_tlist = list _triggerOne;$/Code$ + + $Code$hint format ["%1", thislist ];$/Code$ - local / global + global / local + (March 6, 2013) + Calling list immediately after creating a trigger via createTrigger (and setting up activation, area, statements, timeout, etc..), will return null instead of an array. It seems the trigger needs about 1 second to initialise, after which it will behave as expected: returning an array of all the objects inside the trigger (the ones matching the criteria), or an empty array. - Nothing + Array/Nothing + - addWeapon + groupFromNetId - Add a weapon to a unit. The unit must be local to the computer where command is executed. For a global version of this command see addWeaponGlobal. - Infantry units can only carry a specific number of weapons, once the weapon slots are filled, any further addWeapon commands are ignored. + Get group with given unique ID. For objects use objectFromNetId. As this command is MP only, you can use BIS_fnc_groupFromNetId, which extends the use to SP as well. - https://community.bistudio.com/wiki/addWeapon + https://community.bistudio.com/wiki/groupFromNetId - Object addWeapon String + groupFromNetId String - unit addWeapon weapon + groupFromNetId id - $Code$player addMagazine "30Rnd_556x45_Stanag"; - player addWeapon "BAF_L85A2_RIS_SUSAT";$/Code$ - - $Code$An_2 addMagazine "100Rnd_762x51_M240"; - An_2 addWeapon "M240_veh";$/Code$ + $Code$_group = groupFromNetId "4:45";$/Code$ - local / global + undefined / undefined - (August 2, 2006) - Notes from before the conversion: - To ensure that the weapon is loaded at the start of the mission, add at least one magazine ( addMagazine ) before adding the weapon. To remove weapons use the removeAllWeapons or the removeWeapon commands. - - When adding a weapon in-game, a bug means that sometimes the weapon can't be fired. Swap to a different weapon and swap back again to enable the newly added weapon to fire; or drop and pick up the weapon again. - Nothing + Group + - admin + WFSideText - This is dedicated server command, which queries the admin state of any client on the network by their client ( owner ) id. Possible results are: - 1 - client is admin that is voted in - 2 - client is admin that is logged in - In all other cases it returns 0. To self check the admin state of a local client, use BIS_fnc_admin. + Returns the un localized text value of an object's side / a group's side or a side as: + east, opfor - "East" + west, blufor - "West" + resistance, independent - "Resistance" + civilian - "Civilian" + sideUnknown - "Unknown" + sideEnemy - "Unknown" + sideFriendly - "Unknown" + sideLogic - "Unknown" + sideEmpty - "Unknown" + sideAmbientLife - "Unknown" - https://community.bistudio.com/wiki/admin + https://community.bistudio.com/wiki/WFSideText - admin Number + WFSideText Object/Group/Side - admin ownerID + WFSideText param - $Code$_isLoggedInAdmin = admin 3 == 2;$/Code$ + $Code$WFSideText player ;$/Code$ - $Code$_adminState = admin owner unit1;$/Code$ + $Code$WFSideText group player ;$/Code$ + + $Code$WFSideText west$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer + (August 17, 2014) + WF stands for Warfare - Number + String + - agent + weaponAccessoriesCargo - Return a person for a given agent. + Returns array with all items assigned to the given weapon in given cargo container. - https://community.bistudio.com/wiki/agent + https://community.bistudio.com/wiki/weaponAccessoriesCargo - agent Team_Member + Object weaponAccessoriesCargo Array - agent teamMember + container weaponAccessoriesCargo [weaponId, creatorId] @@ -3334,596 +3492,660 @@ - Object + Array + - agents + camPrepareDir - Return a list of agents in the current mission. + Prepares the camera heading. + This command is non-functional ! - https://community.bistudio.com/wiki/agents + https://community.bistudio.com/wiki/camPrepareDir - agents + Object camPrepareDir Number - agents + camera camPrepareDir direction - $Code${ agent _x moveTo position player } forEach agents ;$/Code$ + $Code$_camera camPrepareDir 150$/Code$ undefined / undefined - (April 4, 2012) - Note that agents returns a reference to the agent itself, not the object. For example: {alive _x} count agents; would return an error. But you can assign the agent a reference using setVariable, and then reference it, for example: {alive (_x getVariable ["agentObject",objNull]) count agents; would return the number of agents still alive - BUT you would need to define "agentObject" after you create the agent, for example: - _agent = createAgent [_type, _position, [], _radius, "NONE"];_agent setVariable["agentObject",_agent,true]; - - (August 1, 2013) - Alternatively, to get object from agent reference use agent command. - Array + Nothing + - aimPos + diag_activeSQFScripts - Returns the position of the object other units can aim to. + Returns an array with active SQFs. - https://community.bistudio.com/wiki/aimPos + https://community.bistudio.com/wiki/diag_activeSQFScripts - aimPos Object + diag_activeSQFScripts - aimPos object + diag_activeSQFScripts - $Code$aimPos player$/Code$ + $Code${ systemChat str _x} forEach diag_activeSQFScripts ;$/Code$ + + $Code$[] spawn { + hint str diag_activeSQFScripts ; //[[" spawn ","",true,1]] + }; + [] spawn { + scriptName "myScript"; + hint str diag_activeSQFScripts ; //[["myScript","",true,1]] + };$/Code$ - global / undefined + undefined / undefined - (July 7, 2015) - Generally returns the center position of the object (middle of the geometry, not the model's [0,0,0]). - Array + Array + - aimedAtTarget + lockCameraTo - Returns how good the weapon of the vehicle is aimed at the target. + Lock/Unlock stabilized camera (in vanilla used currently only for UAVs) to target. - https://community.bistudio.com/wiki/aimedAtTarget + https://community.bistudio.com/wiki/lockCameraTo - Object aimedAtTarget Array + Object lockCameraTo Array - vehicle aimedAtTarget [target, weapon] + vehicle lockCameraTo [target, turretPath] - $Code$_aimingQuality = heli aimedAtTarget [target];$/Code$ - - $Code$_aimingQuality = heli aimedAtTarget [target,"M197"];$/Code$ + $Code$uav lockCameraTo [vehicle, [0,0]];$/Code$ undefined / undefined - (November 19, 2013) - The command doesn't work with soldier weapons, only vehicle weapons (in Arma 3 at least). The return value is either 1 or 0, very rarely the value falls in between. 1 doesn't mean you are going to hit the target, while 0 means you're definitely off. + (April 10, 2015) + The command also accepts a position (ASL) instead of an object. The vehicle has to have a stabilized optic for this command to work. - Number + Nothing + - airDensityRTD + tvSetValue - Returns air density in given altitude + Sets scalar data to item on given path. IDC means id of parent Tree View. If the given value is not integer, it will be converted to integer - https://community.bistudio.com/wiki/airDensityRTD + https://community.bistudio.com/wiki/tvSetValue - airDensityRTD Number + tvSetValue Array + + Control tvSetValue Array - airDensityRTD altitude + tvSetValue [idc, [path], val] + + _ctrl tvSetValue [ [path], val] - $Code$_density = airDensityRTD 0;//Returns 1.22406$/Code$ + $Code$tvSetValue [101, [0], 555];$/Code$ - $Code$_density = airDensityRTD 1000;//Returns 1.11096$/Code$ + $Code$_ctrl tvSetValue [ [0,0,0], 14];$/Code$ - undefined / undefined + local / local + (September 11, 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Number + Nothing - Nothing + - airplaneThrottle + setLightIntensity - Returns throttle position. Works only on player's vehicle. + Sets intensity of light. - https://community.bistudio.com/wiki/airplaneThrottle + https://community.bistudio.com/wiki/setLightIntensity - airplaneThrottle Object + Object setLightIntensity Number - airplaneThrottle airplane + light setLightIntensity value - $Code$_trottle = airplaneThrottle myPlane$/Code$ + $Code$myLight setLightIntensity 4;$/Code$ - undefined / undefined + local / local + (Mar 24, 2014) + In ArmA3 ver1.14 setLightIntensity will overwrite the previous effect processed by setLightBrightness on the same light source, vice versa. And both of them currently play the same role on brightness, for example: $Code$_light setLightIntensity 3000;// same as _light setLightBrightness 1;$/Code$ - Number + Nothing + - airportSide + weaponAccessories - Checks a side of the airport. ID is the number to identify which airport on the island you want to check. - Possible values for sara are: - 0 - Paraiso - 1 - Rahmadi - 2 - Pita - 3 - Antigua + Get array with all items linked to a given weapon. - https://community.bistudio.com/wiki/airportSide + https://community.bistudio.com/wiki/weaponAccessories - airportSide Number - - airportSide Object + Object weaponAccessories String - airportSide id - - airportSide target + unit weaponAccessories weapon - $Code$airportSide 0;$/Code$ + $Code$player weaponAccessories primaryWeapon player ; ["","acc_pointer_IR","optic_Aco",""]$/Code$ undefined / undefined + (October 26, 2014) + To check if currently selected muzzle has a silencer: + $Code$hasSilencer = player weaponAccessories currentMuzzle player param [0, ""] != "";$/Code$ + + (March 16, 2015) + Since revision 129742, this command also returns an attached bipod. - Side - Side + Array + - alive + musicVolume - Check if given vehicle/person/building is alive (i.e. not dead or destroyed). alive objNull returns false. + Checks the current music volume (set by fadeMusic ) - https://community.bistudio.com/wiki/alive + https://community.bistudio.com/wiki/musicVolume - alive Object + musicVolume - alive object + musicVolume - $Code$// SQS: - ?!( alive player ) : exit$/Code$ - - $Code$// SQF: - if (! alive player ) exitWith {};$/Code$ - + - global / undefined + undefined / undefined - (October 19, 2015) - Alive or not could be the question! in multi-player, missions come with respawn module(s). When a player is dead shot, (alive player) will return false, then almost immediately true if the "revive" respawn template is enabled, then could turn on false if time for assistance is elapsed or if the player activates the respawn menu before; and finally true after player respawns. Just be aware that in that case (respawn + revive enabled), the status of the player is toggling: true false true false true. Then, alive status while player is waiting for being rescued could lead to some error scripts as player is supposed to be alive but in limbo and the dead entity "player" passed to server. - Boolean + Number + - all3DENEntities + createLocation - Returns an array of all currently placed Eden Editor entities, including groups, waypoints, and markers in following format: - [objects, groups, triggers, systems, waypoints, markers, layers, comments] - objects: Array of Objects - groups: Array of Groups - triggers: Array of Objects - systems: Array of Objects - waypoints: Array of Arrays in Waypoint format - markers: Array of Strings - layers: Array of Numbers - comments: Array of Numbers + Creates a location of the specified class and dimensions at the specified position. Classes are defined in CfgLocationTypes. - https://community.bistudio.com/wiki/all3DENEntities + https://community.bistudio.com/wiki/createLocation - all3DENEntities + createLocation Array - all3DENEntities + createLocation [className, position, sizeX, sizeY] - $Code$systemChat str all3DENEntities ;$/Code$ + $Code$_location = createLocation [ "NameVillage", [4035,2151,10], 100, 100];$/Code$ + + $Code$_location = createLocation [ "NameVillage", [4035,2151,10], 30, 30]; + _location setText "Player town";$/Code$ - undefined / undefined + undefined / local - - - Array + (12:25, 12 February 2010) + Possible location types, see: Location Types + For the actual name text of the location, use setText. + + + Location + - allAirports + getDLCs - Returns all map airports, both static and dynamic + Returns array of appIDs of DLCs. Use filter param to get specific type of DLCs: + 0 - all + 1 - owned + 2 - not owned - https://community.bistudio.com/wiki/allAirports + https://community.bistudio.com/wiki/getDLCs - allAirports + getDLCs Number - allAirports + getDLCs filter - $Code$_allAirports = allAirports ;$/Code$ + $Code$_ownedDLCs = getDLCs 1;$/Code$ + + $Code$// Is the Karts DLC owned by this client? + hintSilent str (288520 in ( getDLCs 1));$/Code$ undefined / undefined + (May 30, 2014) + Current list of IDs that correspond to the available DLCs: + 275700 - Arma 3 Zeus + 249860 - Arma 3 Soundtrack + 304400 - Arma 3 DLC Bundle + 249861 - Arma 3 Maps + 249862 - Arma 3 Tactical Guide + 288520 - Arma 3 Karts + 304380 - Arma 3 Helicopters + 332350 - Arma 3 Marksmen + + (April 7, 2015) + To add to the note above, app ID can be found in CfgMods. Here is an example path from zeus using the Splendid Config Viewer: + $Code$ configFile "CfgMods" "Curator" "appId"$/Code$ + This method can be used to find app IDs without having to find a list like the one above. + I am also pretty sure you are able to define your own app ID for your own mods using this method. + + (July 1, 2016) + The required DLC-IDs equal to the Steam App-IDs of each obtainable DLC. + To extend Sniperwolfs list: + 395180 - Arma 3 Apex + + (October 30, 2017) + More dlc + Arma 3 Laws of War 571710 + Arma 3 Jets 601670 - Array + Array + - allControls + ctSetValue - Returns a list of all controls for desired existing display. Returned controls also include controls from control groups + Associates metadata (number) with the row determined by the index. Returns Nothing. - https://community.bistudio.com/wiki/allControls + https://community.bistudio.com/wiki/ctSetValue - allControls Display + Control ctSetValue Number - allControls display + Control ctSetValue Number - $Code$_allCtrls = allControls findDisplay 46;$/Code$ + $Code$_control ctSetValue 0;$/Code$ - undefined / undefined + local / local - Array + Nothing + - allCurators + lnbGetColumnsPosition - Returns list of all curators. + Returns relative screen X of ListNBox control columns position [0.1,0.3,0.6...]. Use lnbSetColumnsPos to set positions. - https://community.bistudio.com/wiki/allCurators + https://community.bistudio.com/wiki/lnbGetColumnsPosition - allCurators + lnbGetColumnsPosition Control - allCurators + lnbGetColumnsPosition _ctrl - $Code$_myVariable = allCurators;$/Code$ + $Code$lnbGetColumnsPosition _ctrl;$/Code$ - undefined / undefined + local / local - (June 20, 2015) - This returns all curator logic units, not the units assigned to the logic. + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Array + Array + - allCutLayers + removeAllMPEventHandlers - Returns all named layers used by cutRsc, cutText, cutObj or cutFadeOut. The layer normally would be added on the first use of any of the aforementioned commands, however if a layer needs to be reserved it could be done like so: _layerNum = "myLayerName" cutFadeOut 0;. The index of the layer name in the array corresponds to the layer number the cut effect will be displayed on. If no layers were defined, the return is [""], because 0 layer is reserved for usage in cut commands without layer param or when name of the layer given is empty "". + Removes all MP event handlers of the given type which were added by addMPEventHandler. Command needs to be executed only on one PC for MP event handler to be removed globally. - https://community.bistudio.com/wiki/allCutLayers + https://community.bistudio.com/wiki/removeAllMPEventHandlers - allCutLayers + Object removeAllMPEventHandlers String - allCutLayers + objectName removeAllMPEventHandlers event - $Code$_allLayers = allCutLayers ;$/Code$ + $Code$player removeAllMPEventHandlers "mpkilled";$/Code$ - undefined / undefined + global / global - Array + Nothing + - allDeadMen + addMagazineCargo - Return a list of dead units including agents. Dead unit might be inside vehicle. + Add magazines to the cargo space of vehicles, which can be taken out by infantry units. Once the magazine cargo space is filled up, any further addMagazineCargo commands are ignored. + In Arma 3, arguments for this command must be local ( ). For global variant see addMagazineCargoGlobal - https://community.bistudio.com/wiki/allDeadMen + https://community.bistudio.com/wiki/addMagazineCargo - allDeadMen + Object addMagazineCargo Array - allDeadMen + vehicleName addMagazineCargo [magazineName, count] - $Code${ deleteVehicle _x } forEach allDeadMen;$/Code$ + $Code$_truck addMagazineCargo ["M16", 5];$/Code$ - undefined / undefined + global / local - (17 Oct, 2009) - As dead men are civilian side, don't try to count them with {side _x isEqualTo EAST} count allDeadMen; result will always be 0. - Use the configfile "side" instead: - 0 = [] spawn {while {true} do {sleep 0.1; _westScore = {getNumber (configfile "CfgVehicles" typeOf _x "side") == 0} count allDeadMen; hintSilent format ["East killed: %1",_westScore]};}; + (October 24, 2009) + Only works on clients. - Array + Nothing + - allDead + ctFindRowHeader - Return a list of all dead units including agents and destroyed vehicles. Dead units may be in vehicles. + Takes index of a row as a parameter. Returns index of the closest header above this row. - https://community.bistudio.com/wiki/allDead + https://community.bistudio.com/wiki/ctFindRowHeader - allDead + Number ctFindRowHeader Number - allDead + Control ctFindRowHeader Number - $Code${ deleteVehicle _x } forEach allDead ;$/Code$ - - $Code$// allAlive: - _all = allUnits + vehicles ; - { - _all pushBack agent _x; - } forEach ( agents - [ teamMemberNull ]); - allAlive = _all - allDead ;$/Code$ + $Code$_index = _control ctFindRowHeader 0;$/Code$ - undefined / undefined + local / local - (April 6, 2017) - This also returns bodies hidden with hideBody until they are deleted. Tested in A2OA 1.63.131129 - Array + Number + - allDisplays + curatorRegisteredObjects - Returns a list of all opened GUI displays. Other displays, such as IGUI displays could be accessed via uiNamespace variable, which is updated every time display is opened or closed. For example, to access IGUI displays: - $Code$ uiNamespace getVariable ["IGUI_displays", []];$/Code$. Other display variables: - 3DENDisplays_displays - 3DENDisplaysTemp_displays - GUI_displays - IGUI_displays - Loading_displays - CuratorDisplays_displays - BootcampDisplays_displays - CuratorTitles_displays - BootcampTitles_displays - KartDisplays_displays + Returns array with all objects that has curator registered and their settings. - https://community.bistudio.com/wiki/allDisplays + https://community.bistudio.com/wiki/curatorRegisteredObjects - allDisplays + curatorRegisteredObjects Object - allDisplays + curatorRegisteredObjects curatorObj - $Code$_allDisps = allDisplays ;$/Code$ - + undefined / undefined - Array + Array + - allGroups + addCuratorAddons - Return a list of all groups created on the following sides east, west, resistance / independent and civilian only. Does not contain groups of sideLogic. + Allow curator use of given addon. - https://community.bistudio.com/wiki/allGroups + https://community.bistudio.com/wiki/addCuratorAddons - allGroups + Object addCuratorAddons Array - allGroups + curatorObj addCuratorAddons addons - $Code${( leader _x) sideChat "Go ! Go ! Go !"} forEach allGroups ;$/Code$ + $Code$curatorObj addCuratorAddons ["A3_Armor_F_AMV","A3_Armor_F_Panther"];$/Code$ - $Code$// All groups with players: - private _allGroupsWithPlayers = []; - {_allGroupsWithPlayers pushBackUnique group _x} forEach allPlayers ;$/Code$ + $Code$curatorObj addCuratorAddons ["A3_Modules_F_Curator_Lightning"];$/Code$ + + $Code$// Addons can be stacked: + curatorObj addCuratorAddons ["A3_Armor_F_AMV","A3_Armor_F_Panther"]; + curatorObj addCuratorAddons ["A3_Modules_F_Curator_Lightning"]; + diag_log curatorAddons curatorObj;[ + "A3_Armor_F_AMV", + "A3_Armor_F_Panther", + "A3_Modules_F_Curator_Lightning" + ]$/Code$ undefined / undefined + This scripting command must be executed on the server to work properly in multiplayer - Array + Nothing + - allMapMarkers + menuSetData - Return all markers in map including user placed markers (_USER_DEFINED #). - Since Arma 3 v1.57.134377 User defined markers have the following name format: _USER_DEFINED # PlayerID / MarkerID / ChannelID where: - PlayerID - unique network id of the player (same as _id in onPlayerConnected ) - MarkerID - a marker counter id - ChannelID - id of the chat channel on which marker was placed (see currentChannel ) + Sets new data into item on given path. - https://community.bistudio.com/wiki/allMapMarkers + https://community.bistudio.com/wiki/menuSetData - allMapMarkers + menuSetData Array - allMapMarkers + menuSetData [idc, path, data] - $Code$_markers = allMapMarkers ; - // returns: ["marker1","_USER_DEFINED #2/0"]$/Code$ - - $Code${ - private "_a"; - _a = toArray _x; - _a resize 15; - if ( toString _a == "_USER_DEFINED #") then { - deleteMarker _x; - } - } forEach allMapMarkers ;$/Code$ - - $Code$if (_someString in allMapMarkers ) then { - hint (_someString + " is a valid marker name"); - };$/Code$ - + undefined / undefined - (March 17, 2014) - A3 1.12 : Markers placed in editor will be in the array as a string of their name. Markers placed by the player will begin with "_USER_DEFINED #." - - (March 17, 2014) - To expand on the comment above. In Multiplayer, user created marker will appear in allMapMarkers as _USER_DEFINED #ID/Number, where ID is unique id related to _id param from onPlayerConnected and Number is sequential integer incremented by 1 with each marker placement by the IDed user. - Array + Nothing + - allMines + getShotParents - Returns an array of all mines in the mission + Returns shot information Array for the given projectile in format [vehicle, instigator], where vehicle is the vehicle the shot was fired from, and the instigator is the person who pulled the trigger. If shot was fired by a soldier on foot or in FFV position in vehicle, the soldier is returned for the vehicle. - https://community.bistudio.com/wiki/allMines + https://community.bistudio.com/wiki/getShotParents - allMines + getShotParents Object - allMines + getShotParents projectile - $Code$allMines$/Code$ + $Code$_shotParents = getShotParents myProjectile;$/Code$ - $Code$( allMines select 0) mineDetectedBy west ;$/Code$ + $Code$tank addEventHandler ["Fired", { systemChat str getShotParents (_this select 6)}];$/Code$ undefined / undefined @@ -3931,393 +4153,362 @@ - Array + Array + - allMissionObjects + camCommitPrepared - Returns all mission objects (created by or during a mission) with given type (or its subtype). In some cases allMissionObjects could be substituted with entities, which would be much much faster alternative. Some of the unusual mission objects that can be detected with this command (as well as with nearestObject ): - "#slop" - blood drop - "#mark" - unit footprints - "#track" - vehicle tracks - "#crater" - explosion crater on the ground - "#crateronvehicle" - bullet marks on vehicle - "#explosion" - an explosion - "#objectdestructed" - building, tree or bush destruction - "#soundonvehicle" - sound created with say3D for example - "#dynamicsound" - sound source created using createSoundSource + Smoothly conduct the changes that were assigned to a camera within the given time. If the time is set to zero, the changes are done immediately. - https://community.bistudio.com/wiki/allMissionObjects + https://community.bistudio.com/wiki/camCommitPrepared - allMissionObjects String + Object camCommitPrepared Number - allMissionObjects type + camera camCommitPrepared time - $Code$_airObjects = allMissionObjects "Air";$/Code$ - - $Code${ deleteVehicle _x } forEach ( allMissionObjects "");$/Code$ - - $Code$_allMObjects = allMissionObjects "All";$/Code$ + $Code$//create a camera object + _cam = "camera" camCreate [5600,4800,10]; + _cam camPrepareTarget player ; + _cam cameraEffect ["internal", "BACK"]; + _cam camCommitPrepared 0; + //smoothly move the camera to its new position in 6 seconds. + _cam camPreparePos [5680,4720,20]; + _cam camCommitPrepared 6; + waitUntil { camCommitted _cam}; + //proceed$/Code$ - undefined / undefined + local / local - (June 22, 2012) - Be VERY careful with the use of this command. It is very demanding as it must iterate through all mission created objects. Particular care should be taken exercising this often on dedicated servers. - - (Decembere 15, 2013) - For some reason in Arma 3 this command is up to 5 times faster on the dedicated server than on a connected client. In my experiments it took on average 5 ms for the command to complete on a client while under 1 ms on the server. - Array + Nothing + - allPlayers + simulCloudOcclusion - Returns a list of all human players including dead players. The command also returns all connected headless clients. To filter headless clients out: - $Code$_justPlayers = allPlayers - entities "HeadlessClient_F";$/Code$ - NOTES: - In player hosted game, the complete array of allPlayers may get delayed at the start. Use BIS_fnc_listPlayers if you need it earlier - The order of players in the return array may differ from server to clients + Returns clouds occlusion between two given points (0 - no clouds, 1 - full clouds). - https://community.bistudio.com/wiki/allPlayers + https://community.bistudio.com/wiki/simulCloudOcclusion - allPlayers + simulCloudOcclusion Array - allPlayers + simulCloudOcclusion [pos1,pos2] - $Code${ - systemChat format [ - "Player %1 is %2", - name _x, - ["dead", "alive"] select alive _x - ]; - } forEach allPlayers ;$/Code$ - - $Code$_bluNums = west countSide allPlayers ;$/Code$ - - $Code$// Find all human players if headless clients are used: - _allHCs = entities "HeadlessClient_F"; - _allHPs = allPlayers - _allHCs;$/Code$ + $Code$canSeeSun = ( simulCloudOcclusion == 0)$/Code$ undefined / undefined + (8 August, 2014) + The simulCloudOcclusion command is not recognized on dedicated servers, and will produce an error. If you use this command, it cannot be anywhere within a script that is run on the dedicated server, or the entire script will halt. To get around this, you can use: $Code$if ! isDedicated then {[] execVM "simulCloudOcclusionScript.sqf"};$/Code$ - Array + Number + - allSimpleObjects + getCameraViewDirection - Returns array of all simple objects that belong to the listed class names. If the array of types is empty [], all simple objects are returned including those without class name. NOTE : There is no inheritance in simple objects, so only exact class match is allowed. className is not case sensitive. + Returns the direction unit is looking in render time scope. While for AI the origin for the view direction vector can be taken from eyePos unit, for human player the origin should be taken from player camera position positionCameraToWorld [0,0,0] - https://community.bistudio.com/wiki/allSimpleObjects + https://community.bistudio.com/wiki/getCameraViewDirection - allSimpleObjects Array + getCameraViewDirection Object - allSimpleObjects [className1, className2,classNameN] + getCameraViewDirection unit - $Code$allSimpleObjects ["Box_NATO_Equip_F", "Land_CampingChair_V2_F"];$/Code$ - - $Code$_allSimpleObjects = allSimpleObjects [];$/Code$ + $Code$// Draw AI eye direction (green), weapon direction (red) and camera direction (blue) in 3D: + bob = createGroup east createUnit ["O_Soldier_F", [0,0,0], [], 0, "NONE"]; + bob setVehiclePosition [ player modelToWorld [0,100,0], [], 0, "NONE"]; + onEachFrame + { + _beg = ASLToAGL eyePos bob; + _endE = (_beg vectorAdd ( eyeDirection bob vectorMultiply 100)); + drawLine3D [ _beg, _endE, [0,1,0,1]]; + _endW = (_beg vectorAdd (bob weaponDirection currentWeapon bob vectorMultiply 100)); + drawLine3D [_beg, _endW, [1,0,0,1]]; + _endV = (_beg vectorAdd ( getCameraViewDirection bob vectorMultiply 100)); + drawLine3D [_beg, _endV, [0,0,1,1]]; + };$/Code$ - undefined / undefined + global / undefined - Array + Array + - allSites + getMass - Return all sites in map. - This command is considered deprecated and is no longer supported + Returns mass of a PhysX object. - https://community.bistudio.com/wiki/allSites + https://community.bistudio.com/wiki/getMass - allSites + getMass Object - allSites + getMass object - $Code$_allSites = allSites ;$/Code$ + $Code$_mass = getMass _myCar$/Code$ - undefined / undefined + global / undefined + (April 15, 2015) + This function will return 0 for infantry AI units. That means a manned Blufor Hunter has the same mass than an empty one (8306.63). + Crates return their initial mass, but if you empty them or load items, magazines and weapons, the mass remains the same. In fact, none of these (non-physx) objects has a mass. - Array + Number + - allTurrets + endLoadingScreen - Returns array of available turret paths from vehicle object. To look up turrets from config, use BIS_fnc_allTurrets + Finishes loading screen started by startLoadingScreen. - https://community.bistudio.com/wiki/allTurrets + https://community.bistudio.com/wiki/endLoadingScreen - allTurrets Object - - allTurrets Array + endLoadingScreen - allTurrets vehicle - - allTurrets [vehicle, personTurrets] + endLoadingScreen - $Code$_turretPaths = allTurrets SlammerUP; //[[0],[0,0]] - _turretPaths = allTurrets [SlammerUP, true ]; //[[0],[0,0]] - Commander turret is also FFV turret - _turretPaths = allTurrets [SlammerUP, false ]; //[[0]]$/Code$ - - $Code$// Return FFV turrets only: - _FFVTurrets = allTurrets [tank, true ] - allTurrets [tank, false ];$/Code$ + $Code$startLoadingScreen ["Loading My Mission"]; + //Batch of code + //Batch of code + //Batch of code + progressLoadingScreen 0.5; + //Batch of code + //Batch of code + //Batch of code + endLoadingScreen ;$/Code$ undefined / undefined - (April 13, 2016) - The first syntax (vehicle only without boolean) will include commander turrets like in the example, and does not include actual FFV turrets like offroad back seats, as expected. - Also, the driver turret [-1] is never included in the results, which can be solved as follows: - $Code$_paths = [[-1]] + allTurrets _vehicle;$/Code$ - Array - Array + Nothing + - allUnitsUAV + ctRowCount - Return a list of all UAV vehicles. + Returns number of rows (headers not included) in the RscControlsTable. - https://community.bistudio.com/wiki/allUnitsUAV + https://community.bistudio.com/wiki/ctRowCount - allUnitsUAV + ctRowCount Control - allUnitsUAV + ctRowCount Control - $Code$hint format ["No. of UAV(s) on the map: %1", count allUnitsUAV ];$/Code$ - - $Code${_x setDamage 1} forEach allUnitsUAV ;$/Code$ + $Code$ctRowCount _control;$/Code$ - undefined / undefined + local / local - (October 10, 2014) - This command returns a list of all unmanned vehicles, not the UAV AI units inside them, as the name might otherwise suggest. - Array + Number + - allUnits + ctrlDelete - Return a list of all units (all persons except agents) created on the following sides east, west, resistance / independent and civilian only. Does not contain units of sideLogic. Dead units and units awaiting for respawn are also excluded. + Deletes given control. + Returns whether the deletion was successful. - https://community.bistudio.com/wiki/allUnits + https://community.bistudio.com/wiki/ctrlDelete - allUnits + ctrlDelete Control - allUnits + ctrlDelete control - $Code${_x setDamage 0.5; _x groupChat "Braaains"} forEach allUnits ;$/Code$ + $Code$ctrlDelete (( findDisplay 20000) displayCtrl 20001);$/Code$ undefined / undefined - (July 15, 2011) - It returns infantry outside and inside vehicles. + (April 18, 2015) + ctrlDelete can only delete controls created with ctrlCreate. Use ctrlShow false and ctrlEnable false to disable existing controls. - Array + Boolean + - allVariables + globalRadio - Returns a list of all variables from desired namespace. Namespaces supported: - Control - Team_Member - Namespace - Object - Group - Task - Location + Sends the audio message to the global radio channel. The message is defined in CfgRadio in the description.ext file or config radio protocol. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). + Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. - https://community.bistudio.com/wiki/allVariables + https://community.bistudio.com/wiki/globalRadio - allVariables Control/Team_Member + Object globalRadio String - allVariables namespace + unit globalRadio radioName - $Code$_allVarsUINamespace = allVariables uiNamespace ;$/Code$ + $Code$_soldierOne globalRadio "messageOne";$/Code$ - $Code$_allVarsTrigger = allVariables trigger1;$/Code$ + $Code$player globalRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ - undefined / undefined + global / local - (June 11, 2016) - Using profileNamespace and uiNamespace with this command has been disabled in multiplayer. [1] - - (October 1, 2016) - One still can use allVariables in Multiplayer against profileNamespace and uiNamespace using config parser. In Description.ext - $Code$_EXEC(somevar = allVariables profileNamespace)$/Code$ - in code - $Code$_allprofilevars = parsingNamespace getVariable "somevar"$/Code$ - but list will be valid only at the moment of parsing config. + (December 3, 2016) + To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: + $Code$ player globalRadio "#MySound.ogg";$/Code$ - Array + Nothing + - allow3DMode + checkAIFeature - Allow/dissallow 3D mode., - i - Some Old Editor Command + Check if given AI feature is currently enabled. Feature may be one of: + "AwareFormationSoft", "CombatFormationSoft". - https://community.bistudio.com/wiki/allow3DMode + https://community.bistudio.com/wiki/checkAIFeature - Control allow3DMode Boolean + checkAIFeature String - map allow3DMode bool + checkAIFeature feature - + $Code$_featureUsed = checkAIFeature "AwareFormationSoft"$/Code$ + undefined / undefined - Nothing + Boolean + - allowCrewInImmobile + isSimpleObject - If true, units can be in a vehicle with broken tracks/wheels. + Returns true if given object is simple object - https://community.bistudio.com/wiki/allowCrewInImmobile + https://community.bistudio.com/wiki/isSimpleObject - Object allowCrewInImmobile Boolean + isSimpleObject Object - vehicle allowCrewInImmobile bool + isSimpleObject object - $Code$_vehicle allowCrewInImmobile true ;$/Code$ + $Code$_isSimple = isSimpleObject _obj1;$/Code$ undefined / undefined - (April 27, 2015) - This will stop AI disembarking when immobile - $Code$KK_fnc_allowCrewInImmobile = { - _this allowCrewInImmobile true; - { - _x disableAI "FSM"; - _x setBehaviour "CARELESS"; - } forEach crew _this; - }; - //example - car call KK_fnc_allowCrewInImmobile;$/Code$ - Nothing + Boolean + - allowCuratorLogicIgnoreAreas + kbAddDatabase - Allows curator placing and working with modules outside of edit areas. + Register knowledge base database to given person. See Conversations for more details. - https://community.bistudio.com/wiki/allowCuratorLogicIgnoreAreas + https://community.bistudio.com/wiki/kbAddDatabase - Object allowCuratorLogicIgnoreAreas Boolean + Object kbAddDatabase String - curatorObj allowCuratorLogicIgnoreAreas allow + person kbAddDatabase fileName - $Code$curatorModule allowCuratorLogicIgnoreAreas true$/Code$ + $Code$_hasBeenAdded = _unit kbAddDatabase "chat.txt"$/Code$ undefined / undefined @@ -4325,681 +4516,714 @@ - Nothing + Boolean + - allowDamage + primaryWeaponMagazine - Allow or prevent an object being damaged (or injured, or killed). The command does not prevent object from taking scripted damage such as setHit, setHitIndex, setHitPointDamage or setDamage. To check if damage is allowed at current locality, see isDamageAllowed. - ! - This command has to be executed where object is local and as long as object does not change locality the effect of this command will be global. If object changes locality, the command needs to be executed again on the new owner 's machine to maintain the effect + Returns array containing class name of currently loaded primary weapon magazine (or magazine s in case of weapon having grenade launcher), otherwise it returns []. This command is used for infantry weapons only. - https://community.bistudio.com/wiki/allowDamage + https://community.bistudio.com/wiki/primaryWeaponMagazine - Object allowDamage Boolean + primaryWeaponMagazine Object - object allowDamage allow + primaryWeaponMagazine unit - $Code$player allowDamage false ;$/Code$ + $Code$hint primaryWeaponMagazine player ; //["30Rnd_65x39_caseless_mag"]$/Code$ + + $Code$_array = primaryWeaponMagazine player ; + if ( count _array 0) then { + hint ("Primary weapon is loaded with " + (_array select 0) + "!"); + } else { + if ( primaryWeapon player != "") then { + hint "Primary weapon is not loaded!"; + } else { + hint "Player doesn't have a primary weapon!"; + }; + };$/Code$ - local / global + undefined / undefined - (September 2, 2013) - $Code$_object allowDamage false$/Code$ - has the same effect as - $Code$_object addEventHandler ["HandleDamage", {0}]$/Code$ - (except for buildings that are native to the map; for those, the effects of HandleDamage will not sync properly across all clients, even if added to the building on every client and the server) + (June 8, 2014) + This function returns an array like ["type of magazine loaded in primary weapon", "type of grenade loaded in launcher if exist"] + For example ["30Rnd_556x45_Stanag", "1Rnd_HE_Grenade_shell"], with no consideration about amount of these ammo. + However, be careful if you intend to use it in expression like : (magazines _unit) - (primaryWeaponMagazine _unit), i.e. magazines "minus" this array, + The result will inventory all magazines (with grenades, chemlights...) except ALL magazines (and grenades eventually) belonging to the TYPE of the loaded one! i.e. you suppress ALL "30Rnd_556x45_Stanag" but the "30Rnd_556x45_Stanag_Tracer_Green" are still remaining. + If you kill the unit, the same expression will return a consistent inventory as primary weapon "disappears" and primaryWeaponMagazine is empty. "30Rnd_556x45_Stanag" are back! - Nothing + Array + - allowDammage + waypointDescription - Allow or prevent an object being damaged (or injured, or killed). Alias of allowDamage. - The command does not prevent object from taking scripted damage such as setDamage or setHit. - ! - Command has to be executed where object is local and as long as object does not change locality the effect of this command will be global. - If object changes locality, the command needs to be executed again on the new owner 's machine to maintain the effect. + Gets the waypoint description. - https://community.bistudio.com/wiki/allowDammage + https://community.bistudio.com/wiki/waypointDescription - Object allowDammage Boolean + waypointDescription Array - object allowDammage allow + waypointDescription waypoint - $Code$player allowDammage false ;$/Code$ + $Code$waypointDescription [groupOne,1]$/Code$ undefined / undefined - (October 24, 2014) - This command is still working in A3 1.32.127785, at least in single player. I didn't test multiplayer. - Nothing + String + - allowFileOperations + setParticleFire - Allow/dissallow file ops (load/save etc). - i - Some Old Editor Command + Set fire parameters to particle effect. + Note: You need to create emitter at first. Basic parameters of particle effect must be defined too. You can use script commands setParticleClass or setParticleParams to do so (see example). Correspondence between CfgCloudlets class param names and command array of params: + $Code$particleSource setParticleFire + [ + coreIntensity, + coreDistance, + damageTime + ];$/Code$ - https://community.bistudio.com/wiki/allowFileOperations + https://community.bistudio.com/wiki/setParticleFire - Control allowFileOperations Boolean + Object setParticleFire Array - map allowFileOperations bool + source setParticleFire [coreIntensity, coreDistance, damageTime] - + $Code$_emitter = "#particlesource" createVehicleLocal ( getPos player ); + _emitter setParticleClass "MediumSmoke"; + _emitter setParticleFire [0.3,1.0,0.1];$/Code$ + undefined / undefined - Nothing + Nothing + - allowFleeing + registerTask - Sets the cowardice level (the lack of courage or bravery) of a group or unit. - The more cowardice a Group or Object has, the sooner it will start fleeing. - 0 means maximum courage, while 1 means always fleeing. + Register a new task type. Parameters are defined in the given config class (subclass of CfgTasks). - https://community.bistudio.com/wiki/allowFleeing + https://community.bistudio.com/wiki/registerTask - Object/Group allowFleeing Number + Team_Member registerTask String - name allowFleeing cowardice + teamMember registerTask entryName - $Code$_group1 allowFleeing 0;$/Code$ - + - local / global + undefined / undefined - Nothing + Boolean + - allowGetIn + commandFire - Set if the units given in the list are allowed to enter vehicles. + Order the given unit to fire on the given target (via the radio). + If the target is objNull, the unit is ordered to fire on its current target (set with doTarget or commandTarget ). - https://community.bistudio.com/wiki/allowGetIn + https://community.bistudio.com/wiki/commandFire - Array allowGetIn Boolean + Object/Array commandFire Object - unitArray allowGetIn allow + unitName commandFire target - $Code$[_soldier1, _soldier2] allowGetIn true ;$/Code$ + $Code$_ESoldier1 commandFire _WSoldier1$/Code$ - global / global + local / local - (8 May, 2014) - (ArmA3 ver 1.18), here's a quick reference to unit's embarkation and disembarkation. - Command - Remote Control - Behavior - Role Unassigning - orderGetIn - false - orderGetIn won't take effect on player controlled AI units, and which needs to be used together with assaignAs command family. Generally speaking, orderGetIn is a Role Excuator. - When orderGetIn was disabled it won't automatically unassign unit's vehicle role but will force the unit get out of the vehicle and stop him re-entering until it was enabled again. orderGetIn false won't stop a unit when he is embarking a vehicle in the half way but unassignVehicle will do. orderGetIn false will wait to fire until the unit enter a vehicle. - allowGetIn - false - allowGetIn won't take effect on player controlled AI units. Different from orderGetIn, this command is a Role Holder, it can control the unit's movement in the half way set by orderGetIn but not by setWaypointType, unit will be forced to get out from a vehicle by allowGetIn false and won't automatically re-enter the vehicle until allowGetIn true - allowGetIn won't do anything with unit's vehicle role - doGetOut - true - Works on player controlled ai silently, unit will automatically get back to the vehicle after disembarkation. (Unit won't get out until vehicle is stopped or landed) - false - commandGetOut - true - Same as doGetOut with radio message. (Unit won't get out until vehicle is stopped or landed) - false - leaveVehicle - false - leaveVehicle can't force a player controlled AI disembark - true - action ["GetOut",_veh] - true - Eject immediately without parachute - false - action ["Eject",_veh] - true - Eject immediately with parachute if needed - false - setWaypointType "GETIN" - false - Waypoint won't be affected by orderGetIn false or allowGetIn false until the unit is on the vehicle. - N/A - Nothing + Nothing + - allowSprint + createMarkerLocal - Force player to run/jog if set to false. + Creates a local marker at the given position. Marker exists only on PC that created it. The marker name has to be unique. + NOTE: Local markers have own set of local commands "XXXXLocal" to work with. If you use global marker command on a local marker, the local marker will become global marker. - https://community.bistudio.com/wiki/allowSprint + https://community.bistudio.com/wiki/createMarkerLocal - Object allowSprint Boolean + createMarkerLocal Array - unit allowSprint state + createMarkerLocal [name, position] - $Code$player allowSprint false$/Code$ + $Code$_marker = createMarkerLocal ["Marker1", position player ];$/Code$ - undefined / undefined + undefined / local + To create a marker which is visible on the map you need to define at least the following three settings: + $Code$_markerstr = createMarkerLocal ["markername",[_Xpos,_Ypos]]; + _markerstr setMarkerShapeLocal "ICON"; + _markerstr setMarkerTypeLocal "DOT";$/Code$ - Nothing + String + - ammoOnPylon + with - Returns ammo count on given pylon. - Returns false ( Bool ) on failure. + Creates a With Type that is used inside a do construct in order to execute code inside a given namespace. + when used in a do-construct in scripts with allowed suspension, an unexpected namespace switch could happen (see note below) + NOTE for the reasons unknown, namespace switching might unexpectedly occur inside some scopes ( for, if, try, call ) started in scheduled scripts ( canSuspend true) after small suspension if with was not the main scope. For example: + $Code$[] spawn + { + with uiNamespace do + { + for "_i" from 1 to 1 do + { + systemChat str [ + currentNamespace isEqualTo uiNamespace, + currentNamespace isEqualTo missionNamespace + ]; + // result [true, false] + sleep 0.05; // -- small suspension + systemChat str [ + currentNamespace isEqualTo uiNamespace, + currentNamespace isEqualTo missionNamespace + ]; + // result [false, true] -- switching + }; + }; + };$/Code$ + However if with used in parent scope, everything works correctly: + $Code$ with uiNamespace do + { + [] spawn + { + for "_i" from 1 to 1 do + { + systemChat str [ + currentNamespace isEqualTo uiNamespace, + currentNamespace isEqualTo missionNamespace + ]; + // result [true, false] + sleep 0.05; // -- small suspension + systemChat str [ + currentNamespace isEqualTo uiNamespace, + currentNamespace isEqualTo missionNamespace + ]; + // result [true, false] -- NO switching + }; + }; + };$/Code$ + To eliminate possibility of error you can also use setVariable or getVariable with desired Namespace, which is also scheduled environment save. - https://community.bistudio.com/wiki/ammoOnPylon + https://community.bistudio.com/wiki/with - Object ammoOnPylon String/Number + with Namespace - vehicle ammoOnPylon pylon + with namespace - $Code$_ammoCount = ( vehicle player ) ammoOnPylon "pylon1";$/Code$ + $Code$_myWithType = with uiNamespace ;$/Code$ - $Code$hint str (( vehicle player ) ammoOnPylon "pylonCenter");$/Code$ + $Code$with missionNamespace do {global = global + 1};$/Code$ undefined / undefined - (August 18, 2017) - The pylon indices start at 1 and not at 0. - Number/Boolean + With_Type + - ammo + vectorDistance - Check how many rounds are left in the currently loaded magazine in the given muzzle. Since Arma v1.55.133505 the command also returns ammo for units in vehicles. + Distance between two 3D vectors. - https://community.bistudio.com/wiki/ammo + https://community.bistudio.com/wiki/vectorDistance - Object ammo String + Array vectorDistance Array - unit ammo muzzle + vector1 vectorDistance vector2 - $Code$_count = player ammo "M16"; //returns 30 in case of a full magazine$/Code$ - - $Code$_count = player ammo "M203Muzzle";$/Code$ + $Code$_euclideanDist = getPosASL player vectorDistance [0,0,0];$/Code$ - $Code$_count = player ammo primaryWeapon player ;$/Code$ + $Code$( getPosASL _a) vectorDistance ( getPosASL _b); /* same as */( getPosATL _a) distance ( getPosATL _b);$/Code$ - global / undefined + undefined / undefined - (February 17, 2012) - OA 1.60 : The command works (now?) also for units in vehicles. However only for the vehicle's gunners' weapons - aka those returned by "weapons vehicle". + (28 Jun, 2014) + (ArmA3 1.22)Algorithm: + $Code$ + Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; + Result = sqrt ((x2 - x1) ^ 2 + (y2 - y1) ^ 2 + (z2 - z1) ^ 2); + $/Code$ - Number + Number + - and + getSlingLoad - Returns true only if both conditions are true. In case of the alternative syntax, lazy evaluation is used (if left operand is false, evaluation of the right side is skipped completely). + Return object which is sling loaded by vehicle - https://community.bistudio.com/wiki/and + https://community.bistudio.com/wiki/getSlingLoad - Boolean and Boolean - - Boolean and Code + getSlingLoad Object - a and b - - a and b + getSlingLoad vehicle - $Code$if (( alive player ) and (_enemycount == 0)) then { hint "you win !"}$/Code$ - - $Code$if (( count _array 0) and {(_array select 0) == player }) then { hint "It works! Without lazy evaluation it would throw an error if array was empty."}$/Code$ + $Code$_cargo = getSlingLoad heli1;$/Code$ undefined / undefined - (April 12, 2015) - Just like the "or" command, the "and" command allows several conditions to be checked. Example: - $Code$if(alive player and speed player 0 and _someOtherVar) then { hint"All three condtions are true" };$/Code$ - The example above will check if the player is alive and if the player is moving and checks if _someOtherVar is true. + (05 April, 2014) + Returns objNull when nothing is sling loaded. - Boolean - Boolean + Object + - animateBay + addMagazines - Force animation of bay to given state, -1 for reset to engine handling, can cause weapon inoperative, because weapon is released when bay state =1. + Adds multiple magazines to the unit. For cargo containers use addMagazineCargoGlobal command. - https://community.bistudio.com/wiki/animateBay + https://community.bistudio.com/wiki/addMagazines - Object animateBay Array + Object addMagazines Array - vehicle animateBay [pylon nameindex, anim phase] + unit addMagazines [magazineName, count] - $Code$( vehicle player ) animateBay ["pylonLeft1", 0.5];$/Code$ + $Code$player addMagazines ["30Rnd_65x39_caseless_mag", 3];$/Code$ - undefined / undefined + global / global - Nothing + Nothing + - animateDoor + markerShape - Animates a door on a vehicle. Animation is defined in config file in CfgVehicles - AnimationSources. Wanted animation phase is set with phase param. This command works only on animation sources with "door" controller. Door_L in the example below can be animated with animateDoor but not CargoRamp_Open: heli animateDoor ["Door_L", 1]; - class AnimationSources - { - class CargoRamp_Open - { - source = "user" ; - animPeriod = 5 ; - initPhase = 0 ; - } ; - class Door_L - { - source = "door" ; - animPeriod = 1.6 ; - } ; - } ; - To animate doors or other sources that have "user" controller, use animate command, or even better, animateSource (recommended). Sources with "hit" controller can be animated with setHitPointDamage command applied to the name contained in hitpoint property. For availability of animation sources and their controller types see: createVehicle/vehicles + Gets the marker shape. See setMarkerShape for a list of strings that can be returned. - https://community.bistudio.com/wiki/animateDoor + https://community.bistudio.com/wiki/markerShape - Object animateDoor Array + markerShape String - object animateDoor [doorname, phase, instant] + markerShape name - $Code$Taru animateDoor ["Door_1_source", 1];$/Code$ - - $Code$// Open left front door on Ifrit instantly: - Ifrit animateDoor ["Door_LF", 1, true ];$/Code$ + $Code$if ( markerShape "Marker1" == "RECTANGLE") then { hint "Marker1 is a rectangle!"}$/Code$ - global / global + global / undefined + (May 30, 2016) + Free hand drawn markers return "POLYLINE" - Nothing + String + - animatePylon + surfaceType - Force animation of pylon to given state, -1 for reset to engine handling, can cause weapon inoperative, because weapon is released when pylon state =1. + Returns what surface type is at the given position. + See the spoiler for surface types: + Show text + A3 1.28: + "#GdtStratisConcrete" + "#GdtStratisDryGrass" + "#GdtStratisGreenGrass" + "#GdtStratisRocky" + "#GdtStratisForestPine" + "#GdtStratisBeach" + "#GdtStratisDirt" + "#GdtVRsurface01" + "#GdtDirt" + "#GdtGrassGreen" + "#GdtGrassDry" + "#GdtSoil" + "#GdtThorn" + "#GdtStony" + "#GdtConcrete" + "#GdtMarsh" + "#GdtBeach" + "#GdtSeabed" + "#GdtDead" + A3 1.66: + "#Default" + "#Water" + "#SurfRoadDirt" + "#SurfRoadConcrete" + "#SurfRoadTarmac" + "#SurfWood" + "#SurfMetal" + "#SurfRoofTin" + "#SurfRoofTiles" + "#SurfIntWood" + "#SurfIntConcrete" + "#SurfIntTiles" + "#SurfIntMetal" + "#SurfWater" + "#TEST_SurfNormal" + "#GdtStratisConcrete" + "#GdtStratisBeach" + "#GdtStratisDirt" + "#GdtStratisSeabedCluttered" + "#GdtStratisSeabed" + "#GdtStratisDryGrass" + "#GdtStratisGreenGrass" + "#GdtStratisRocky" + "#GdtStratisThistles" + "#GdtStratisForestPine" + "#GdtRubble" + "#GdtForestPine" + "#GdtConcrete" + "#GdtSoil" + "#GdtBeach" + "#GdtRock" + "#GdtDead" + "#GdtDirt" + "#GdtDesert" + "#GdtGrassGreen" + "#GdtGrassDry" + "#GdtGrassWild" + "#GdtWeed" + "#GdtWildField" + "#GdtThorn" + "#GdtStony" + "#GdtStonyThistle" + "#GdtMud" + "#GdtMarsh" + "#GdtSeabed" + "#concrete" + "#concrete_out" + "#concrete_inside" + "#dirtrunway" + "#road" + "#floor" + "#floor_inside" + "#carpet_inside" + "#carpet" + "#mud" + "#concrete_hall" + "#stones" + "#cardboard" + "#lino" + "#steel" + "#trash" + "#parquet" + "#sand" + "#metalPlate" + "#woodenFloor" + "#planks" + "#planks_inside" + "#grid" + "#rubble" + "#BuildingRubble" + "#tiling" + "#wavyMetal" + "#GdtVRsurface01" + "#surf_metal" + "#surf_roadconcrete" + "#surf_roaddirt" + "#surf_roadtarmac" + "#surf_rooftiles" + "#surf_rooftin" + "#surf_wood" + "#surfint_concrete" + "#surfint_metal" + "#surfint_tiles" + "#surfint_wood" + "#road_exp" + "#sand_exp" + "#SurfRoadDirt_exp" + "#SurfRoadConcrete_exp" + "#SurfRoadTarmac_exp" + "#SurfTrailDirt_exp" + "#concrete_exp" + "#concrete_in_exp" + "#concrete_hall_exp" + "#floor_exp" + "#floor_in_exp" + "#stones_exp" + "#planks_in_exp" + "#planks_exp" + "#softwood_in_exp" + "#steel_exp" + "#metalPlate_exp" + "#metalPlatePressed_exp" + "#metalPlate_in_exp" + "#grid_exp" + "#wavyMetal_exp" + "#carpet_exp" + "#carpet_in_exp" + "#mat_in_exp" + "#mud_exp" + "#straw_exp" + "#cardboard_exp" + "#lino_in_exp" + "#lino_exp" + "#roof_tiles_exp" + "#trash_exp" + "#rubble_exp" + "#BuildingRubble_exp" + "#GdtGrassShort" + "#GdtGrassTall" + "#GdtGrassLong" + "#GdtVolcanoBeach" + "#GdtRedDirt" + "#GdtAsphalt" + "#GdtField" + "#GdtForest" + "#GdtVolcano" + "#GdtCliff" - https://community.bistudio.com/wiki/animatePylon + https://community.bistudio.com/wiki/surfaceType - Object animatePylon Array + surfaceType Array - vehicle animatePylon [pylon nameindex, anim phase] + surfaceType position - $Code$( vehicle player ) animatePylon [1, 0.5];$/Code$ - - + $Code$_surface = surfaceType [4500, 4500];$/Code$ + + $Code$_surface = surfaceType position player ;$/Code$ + + undefined / undefined + (February 05, 2010) + In ArmA 2 returned value is "#UTGRASS" for natural surface and "#UTCONCRETE" for urban surface. + + (December 16, 2006) + Only seems to return either "#GRASSSOUTH" or "#GRASSGENERAL", even when you're in a building or in water. + + (December 30, 2006) + Another returned value is "#SANDGENERAL". However, when providing an exact [x,y] position the "surfaceType" function seems to return the general surface type of the environment rather than the exact type on that given position. - Nothing + String + - animateSource + opfor - Process an animation of the object. If animate uses class name from CfgModels Animations, animateSource uses name defined by source property. This allows to use just one command on a bunch of animations related to the same source simultaneously. Since Arma 3 v1.65.138459 speed of animation can be altered with coefficient. - A class with the same source name should also be present in main config in CfgVehicles AnimationSources and have to be bound to the "user" controller for the command to work. If in order to animate door in example below using animate command it would require 2 calls: - house animate ["Door_1_rot", 1]; - house animate ["Door_Handle_1_rot", 1]; - With animateSource this would require only 1 (provided everything is configured correctly): - house animateSource ["Door_1_sound_source", 1]; - // model.cfg - .... - class Animations - { - class Door_1_rot - { - type = rotation ; - source = Door_1_sound_source ; - selection = Door_1 ; - axis = Door_1_axis ; - memory = 1 ; - minValue = 0.1 ; - maxValue = 1 ; - angle0 = 0 ; - angle1 = ( rad 110 ) ; - } ; - class Door_Handle_1_rot - { - type = rotation ; - source = Door_1_noSound_source ; - selection = Door_Handle_1 ; - axis = Door_Handle_1_axis ; - memory = 1 ; - minValue = 0 ; - maxValue = 0.1 ; - angle0 = 0 ; - angle1 = ( rad - 50 ) ; - } ; - } ; - ... - // config.cpp - ... - class AnimationSources - { - class Door_1_sound_source - { - source = "user" ; - initPhase = 0 ; - animPeriod = 1 ; - sound = "GenericDoorsSound" ; - soundPosition = "Door_1_trigger" ; - } ; - } ; - ... - If you don't know much about model config you can use this page createVehicle/vehicles for reference. Some of the AnimationSources are listed with the class names of the available assets in Arma 3. If it says "user", the chances are it could work with animateSource (see example 2). - It is recommended that animateSource command is used instead of animate whenever is possible, as it is more efficient and optimized for MP - Mixing animateSource command with animate command to animate the same part can lead to unexpected behavior + Pre-defined variable for the opfor side. + Alias for east. - https://community.bistudio.com/wiki/animateSource + https://community.bistudio.com/wiki/opfor - Object animateSource Array + opfor - object animateSource [source, phase, speed] + opfor - $Code$house animateSource ["Door_1_source", 1, true ];$/Code$ - - $Code$// Create UGV and manipulate its turret (Currently not possible to do with animate command. See createVehicle/vehicles for reference) - ugv = "B_UGV_01_F" createVehicle ( player getRelPos [5, 0]); - ugv addAction ["Show Turret", - { - ugv animateSource ["Turret", 0]; - ugv animateSource ["MainTurret", rad 0, true ]; - ugv animateSource ["MainGun", rad 0, true ]; - }]; - ugv addAction ["Hide Turret", {ugv animateSource ["Turret", 1]}]; - ugv addAction ["Turret Left", {ugv animateSource ["MainTurret", rad 90]}]; - ugv addAction ["Turret Right", {ugv animateSource ["MainTurret", - rad 90]}]; - ugv addAction ["Turret Up", {ugv animateSource ["MainGun", rad 30]}]; - ugv addAction ["Turret Down", {ugv animateSource ["MainGun", - rad 20]}];$/Code$ - - $Code$barGate animateSource ["Door_1_source",0]; //Close - barGate animateSource ["Door_1_source",1]; //Open$/Code$ + $Code$if ( side player == opfor ) then { + hint "OPFOR"; + };$/Code$ - global / global + undefined / undefined - Nothing + Side + - animate + taskCompleted - Activates given object animation. Animation is defined in CfgModels Animations class of model.cfg or another model config. Since Arma 3 v1.65.138459 speed of animation can be altered with coefficient. - To animate door of the house from example below: house animate ["Door_1_rot", 1]; - class Animations - { - class Door_1_rot - { - type = rotation ; - source = Door_1_source ; - selection = Door_1 ; - axis = Door_1_axis ; - memory = 1 ; - minValue = 0.1 ; - maxValue = 1 ; - angle0 = 0 ; - angle1 = ( rad 110 ) ; - } ; - class Door_Handle_1_rot_1 - { - type = rotation ; - source = Door_1_handle_source ; - selection = Door_Handle_1 ; - axis = Door_Handle_1_axis ; - memory = 1 ; - minValue = 0 ; - maxValue = 0.1 ; - angle0 = 0 ; - angle1 = ( rad - 50 ) ; - } ; - } ; - Since model.cfg is not always available for reference, most animation names could also be obtained from animationNames command. Class names listed in CfgVehicles AnimationSources bound to "Proxy" controller can also be animated with animate command (see createVehicle/vehicles ): offroad animate ["HideBackpacks", 0]; - It is recommended that animateSource command is used instead of animate whenever is possible, as it is more efficient and optimised for MP - Mixing animateSource command with animate command to animate the same part may produce some undefined behaviour + Return if task is completed. (state Succeeded, Failed or Canceled) - https://community.bistudio.com/wiki/animate + https://community.bistudio.com/wiki/taskCompleted - Object animate Array + taskCompleted Task - objectName animate [animationName, phase, speed] + taskCompleted task - $Code$_building animate ["maindoor", 1];$/Code$ - - $Code$_building animate ["Door_1_rot", 1, true ];$/Code$ - - $Code$// Create Offroad and add flashing police light bar: - offroad = "C_Offroad_01_F" createVehicle ( player getRelPos [5, 0]); - offroad animate ["HidePolice", 0]; - offroad animate ["BeaconsStart", 1];$/Code$ - + - global / global + undefined / undefined - (Aug 2007) - Animations can be used on existing game models such as houses that have doors eg. The general syntax is house animate ["dvere1",1] to 'open' the door and house animate ["dvere1",0] to 'close it'. Whether used on Oem addons, or official ones, an internal working knowledge (via config.cpp) of the model's animated name(s) is required. - 'open' and 'close' are visual perceptions of the state of the model, and are a design decision of the p3d. Open does not, necessarily mean, 1, and close does not mean 0. - '0' and '1' are better seen as FULLY_OFF and FULLY_ON - If a door is initially closed in the model, FULLY_ON, will open it. If it is initialy OPEN visually, in the model, FULLY_ON will close it. - initphase=1; (in config cpp) does not alter open and close meanings, all it does, is, set the model to the 'on' (rather than 'off') state to begin with. Whether on means open or close visually, is a p3d design decision. - - (June 2011) - Also, to animate the object called "Bar Gate" in ArmA, use the following: $Code$myGate animate ["Bargate",1]$/Code$ to close it, and $Code$myGate animate ["Bargate", 0]$/Code$ to open it. - - (June 21, 2015) - With this command you can switch the offroad police lights on like this : - $Code$_vehicle animate ["BeaconsStart",1];$/Code$ - And switch it off : - $Code$_vehicle animate ["BeaconsStart",0];$/Code$ - - (February 16, 2016) - Aparently "Bargate" was exchainged with "Door_1_rot" - Doesen't work: - $Code$object animate ["Bargate", 0];$/Code$ - Works: - $Code$object animate ["Door_1_rot", 0];$/Code$ - - (March 14, 2016) - To animate bargate use animateSource : - $Code$bargate animateSource ["Door_1_source", 1];$/Code$ - Nothing + Boolean + - animationNames + currentCommand - Returns Array of Strings where elements are the names of model animations, which should theoretically be available for use with animate command. However in practice this depends on whether animation is also made available for use in scripts via config. + Return the current command type (empty string when no command) for the commander of given vehicle (or for a given soldier). Value returned can be one of: + "WAIT", "ATTACK", "HIDE", "MOVE", "HEAL", "REPAIR", "REFUEL", "REARM", "SUPPORT", "JOIN", "GET IN", "FIRE", "GET OUT", "STOP", "EXPECT", "ACTION", "ATTACKFIRE", - https://community.bistudio.com/wiki/animationNames + https://community.bistudio.com/wiki/currentCommand - animationNames Object + currentCommand Object - animationNames object + currentCommand vehicleName - $Code$_names = animationNames static_AT; - // Returns: ["MainTurret", "MainGun", "MainTurret_destructX", "MainTurret_destructY", "MainTurret_destructZ", "MainGun_destructX", "MainGun_destructY", "MainGun_destructZ", "magazine_destruct", "ammo_belt_destruct", "bolt_destruct", "charging_handle_destruct", "damagehideVez_destruct", "damagehideHlaven_destruct", "damagehideRecoil_destruct", "Turret_shake", "Turret_shake_aside", "Magazine_hide", "Ammo_belt_hide", "muzzleFlash", "AddAutonomous_unhide", "bullet001_reload_hide", "bullet002_reload_hide", "bullet003_reload_hide", "bullet004_reload_hide", "bullet005_reload_hide", "bullet006_reload_hide", "bullet007_reload_hide", "bullet008_reload_hide"]$/Code$ - + undefined / undefined - Array + String + - animationPhase + flagAnimationPhase - Returns the phase of the given animation on the given object. Animation can be scripted ( animate, animateSource, animateDoor ) or engine driven. Animation names for an object could be found out with animationNames command. When animation is rotation, like with "MainTurret" for example, the output is in radians, to convert to degrees use deg command. + Returns flag position on the flag pole in range of 0..1, where 0 is bottom of the flag pole, 1 is the top of the flag pole. The result is local to the PC on which command is executed - https://community.bistudio.com/wiki/animationPhase + https://community.bistudio.com/wiki/flagAnimationPhase - Object animationPhase String + flagAnimationPhase Object - object animationPhase animationName + flagAnimationPhase flag - $Code$_building animate ["maindoor",1]; - sleep 1; - _p = _building animationPhase "maindoor"; - // returns 1 (if the animation speed is = 2 seconds)$/Code$ - - $Code$_flagPole animationPhase "flag";$/Code$ - - $Code$_tank animationPhase "MainTurret";$/Code$ + $Code$flagAnimationPhase _flag1; //0.5$/Code$ global / undefined @@ -5007,240 +5231,238 @@ - Number + Number + - animationSourcePhase + setMarkerPos - Returns current animation phase of given source. Similar to animationPhase or doorPhase but designed to complement animateSource. + Moves the marker. Pos format is Position2D. - https://community.bistudio.com/wiki/animationSourcePhase + https://community.bistudio.com/wiki/setMarkerPos - Object animationSourcePhase String + String setMarkerPos Array - object animationSourcePhase source + markerName setMarkerPos pos - $Code$_phase = house animationSourcePhase "Door_1_source";$/Code$ + $Code$"MarkerOne" setMarkerPos getMarkerPos "MarkerTwo"$/Code$ - undefined / undefined + undefined / global + Effect is local in OFP. + + (March 31, 2008) + This command will not move a marker on dedicated server (if a client calls it). AI will continue to respawn at old spot if you are moving something like respawn_west. + + (August 7, 2009) + The marker position can actually be set in 3D. This has a benefit for respawn markers, when placed at the correct altitude ASL on the LHD, the correct altitude will be used for respawn. There is no particular benefit for regular markers since markerPos will still return 0 for the altitude array element. - Number + Nothing + - animationState + addItemPool - Returns the name of a unit's current primary animation. Seems to be forced to lower case in Arma 3. + Adds count items of type name into the weapon pool (used in the campaign to transfer items to the next mission) - https://community.bistudio.com/wiki/animationState + https://community.bistudio.com/wiki/addItemPool - animationState Object + addItemPool Array - animationState unitName + addItemPool [itemName, count] - $Code$_state = animationState player ;$/Code$ + $Code$addItemPool ["ItemGPS", 5];$/Code$ - global / undefined + undefined / undefined - (August 22, 2014) - (A3 1.26) To sort animation state by keyword, use BIS_fnc_ambientAnimGetParams - $Code$ ("KNEEL" call BIS_fnc_ambientAnimGetParams ) select 0; - //return: ["amovpknlmstpslowwrfldnon"…]$/Code$ - Useful keywords are: "STAND", "WATCH", "GUARD", "LISTEN_BRIEFING", "LEAN_ON_TABLE", "LEAN", "SIT_AT_TABLE", "KNEEL", "PRONE_INJURED", "BRIEFING" ect. - String + Nothing + - append + cbSetChecked - Appends array2 to the back of array1 modifying array1. - NOTE: append does not return array, it modifies existing array. If you need to return a copy, use "+": - $Code$array3 = array1 + array2;$/Code$ + Sets the current state of a checkbox (CT_CHECKBOX type 77 of Dialog Control ). - https://community.bistudio.com/wiki/append + https://community.bistudio.com/wiki/cbSetChecked - Array append Array + Control cbSetChecked Boolean - array1 append array2 + control cbSetChecked state - $Code$_arr = [1,2,3]; - _arr append [4,5,6]; - hint str _arr; //[1,2,3,4,5,6]$/Code$ + $Code$_myCheckBox cbSetChecked true ;$/Code$ + + $Code$_disp = findDisplay 46 createDisplay "RscDisplayEmpty"; + _chk = _disp ctrlCreate ["RscCheckBox", -1]; + _chk cbSetChecked true ;$/Code$ undefined / undefined - (March 9, 2015) - $Code$_array1 append _array2$/Code$ is roughly 1.2x faster (depending on array size) than $Code$_array1 = _array1 + _array2$/Code$ (Averaged over 10.000 iterations with two identical arrays containing the numbers 0 through 9) - The larger the arrays to append, the faster append is as it does not create a new array, which happens with array addition. - - (May 21, 2015) - Array "unshift" implementation using append, a faster alternative to BIS_fnc_arrayUnShift : - $Code$KK_fnc_unshift = { - private ["_arr", "_tmp"]; - _arr = _this select 0; - _tmp = [_this select 1]; - _tmp append _arr; - _arr resize 0; - _arr append _tmp; - _arr - }; - // Example - arr = [1,2,3]; - [arr, 0] call KK_fnc_unshift; //both arr and return of function are [0,1,2,3] - $/Code$ - - (May 21, 2015) - Array "insert" implementation using append, much faster alternative to BIS_fnc_arrayInsert : - $Code$KK_fnc_insert = { - private ["_arr", "_i", "_res"]; - _arr = _this select 0; - _i = _this select 2; - _res = []; - _res append (_arr select [0, _i]); - _res append (_this select 1); - _res append (_arr select [_i, count _arr - _i]); - _res - }; - // Example - arr = [1,2,3,4]; - [arr, ["a","b"], 2] call KK_fnc_insert; //[1,2,"a","b",3,4]$/Code$ - - (May 21, 2015) - A faster alternative to BIS_fnc_arrayPushStack using append : - $Code$KK_fnc_pushStack = { - _this select 0 append (_this select 1); - _this select 0 - }; - // Example - arr = [1,2,3]; - [arr,[4,5,6]] call KK_fnc_pushStack; //both arr and function return are [1,2,3,4,5,6]$/Code$ - Nothing + Nothing + - apply + setWaypointTimeout - Applies given code to each element of the array and returns resulting array. The value of the current array element, to which the code will be applied, is stored in variable _x. + Defines the time between condition satisfaction and waypoint finish (randomly from min to max, with an average value mid). - https://community.bistudio.com/wiki/apply + https://community.bistudio.com/wiki/setWaypointTimeout - Array apply Code + Array setWaypointTimeout Array - array apply code + waypoint setWaypointTimeout [min, mid, max] - $Code$_arr = [1,2,3,4,5,6,7,8,9,0] apply {[1,0] select (_x % 2 == 0)}; //[1,0,1,0,1,0,1,0,1,0]$/Code$ - - $Code$_arr = [1,2,3,4,5,6,7,8,9,0] apply {_x ^ _x}; //[1,4,27,256,3125,46656,823543,16777216,387420480,1]$/Code$ - - $Code$_arr1 = []; - _arr1 resize 20; - _arr2 = _arr1 apply {0}; //[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]$/Code$ + $Code$[_grp, 2] setWaypointTimeout [5, 10, 6];$/Code$ undefined / undefined - (February 18, 2016) - (to anyone else wondering, I took a minute to get it): This is Array.map() is JavaScript + (00:32, 12 December 2010) + The example doesn't seem to make sense, according to the listed syntax. It seems to set a Max time greater than the Mid time. + + (03:30, 12 December 2010) + If mid is greater than max, the result will be really near the mid value. + Results with the values of the example: 8.237, 9.383, 10.425, 9.417, 9.43401, 10.425, 9.90601, 9.96701, 9.42401, 9.42502, 9.96698, 9.89999... - Array + Nothing + - armoryPoints + allowGetIn - Returns, stored in [USERNAME].ArmaXProfile, value of armoryPoints entry. If the entry doesn't exist, it returns 0. + Set if the units given in the list are allowed to enter vehicles. - https://community.bistudio.com/wiki/armoryPoints + https://community.bistudio.com/wiki/allowGetIn - armoryPoints + Array allowGetIn Boolean - armoryPoints + unitArray allowGetIn allow - $Code$_points = armoryPoints ;$/Code$ + $Code$[_soldier1, _soldier2] allowGetIn true ;$/Code$ - undefined / undefined + global / global + (8 May, 2014) + (ArmA3 ver 1.18), here's a quick reference to unit's embarkation and disembarkation. + Command + Remote Control + Behavior + Role Unassigning + orderGetIn + false + orderGetIn won't take effect on player controlled AI units, and which needs to be used together with assaignAs command family. Generally speaking, orderGetIn is a Role Excuator. + When orderGetIn was disabled it won't automatically unassign unit's vehicle role but will force the unit get out of the vehicle and stop him re-entering until it was enabled again. orderGetIn false won't stop a unit when he is embarking a vehicle in the half way but unassignVehicle will do. orderGetIn false will wait to fire until the unit enter a vehicle. + allowGetIn + false + allowGetIn won't take effect on player controlled AI units. Different from orderGetIn, this command is a Role Holder, it can control the unit's movement in the half way set by orderGetIn but not by setWaypointType, unit will be forced to get out from a vehicle by allowGetIn false and won't automatically re-enter the vehicle until allowGetIn true + allowGetIn won't do anything with unit's vehicle role + doGetOut + true + Works on player controlled ai silently, unit will automatically get back to the vehicle after disembarkation. (Unit won't get out until vehicle is stopped or landed) + false + commandGetOut + true + Same as doGetOut with radio message. (Unit won't get out until vehicle is stopped or landed) + false + leaveVehicle + false + leaveVehicle can't force a player controlled AI disembark + true + action ["GetOut",_veh] + true + Eject immediately without parachute + false + action ["Eject",_veh] + true + Eject immediately with parachute if needed + false + setWaypointType "GETIN" + false + Waypoint won't be affected by orderGetIn false or allowGetIn false until the unit is on the vehicle. + N/A - Number + Nothing + - arrayIntersect + getUnitLoadout - Intersects array1 with array2 returning array of unique common elements. Additionally, using the same array for array1 and array2 will simply return array of unique elements. Intersects only 1st dimension of an array. + Returns an array with all assigned items, weapons, containers and their stored items. + Detailed explanation of the returned array: Talk:getUnitLoadout + This command is not final and might be changed in a near future. - https://community.bistudio.com/wiki/arrayIntersect + https://community.bistudio.com/wiki/getUnitLoadout - Array arrayIntersect Array + getUnitLoadout Object + + getUnitLoadout String/Config - array1 arrayIntersect array2 + getUnitLoadout unit + + getUnitLoadout class - $Code$_arr1 = [1,2,3,4,5,2,3,4]; - _arr2 = [4,5,6,1,2,3,5,6]; - hint str (_arr1 arrayIntersect _arr2); // [4,5,1,2,3]$/Code$ - - $Code$_arr = [1,2,3,1,2,3,1,2,3,4,5]; - hint str (_arr arrayIntersect _arr); // [1,2,3,4,5]$/Code$ + $Code$getUnitLoadout player ;$/Code$ - $Code$// Remove nils : - hint str ([1,2, nil,3] arrayIntersect [1,2, nil,3]); // [1,2,3]$/Code$ + $Code$getUnitLoadout "B_Soldier_F";$/Code$ - $Code$// Also works with array elements which are equal : - hint str ([[1],[2],[3]] arrayIntersect [[2],[3],[4]]); // [[2],[3]]$/Code$ + $Code$getUnitLoadout ( configFile "CfgVehicles" "B_Soldier_F");$/Code$ undefined / undefined @@ -5248,28 +5470,28 @@ - Array + Array - Array + - asin + visibleGPS - Arcsine of a number, result in Degrees. + Checks if the player has GPS receiver opened and visible - https://community.bistudio.com/wiki/asin + https://community.bistudio.com/wiki/visibleGPS - asin Number + visibleGPS - asin x + visibleGPS - $Code$_degrees=asin 0.5 - returns 30$/Code$ + $Code$if ( visibleGPS ) then { hint "GPS is visible"};$/Code$ undefined / undefined @@ -5277,73 +5499,79 @@ - Number + Boolean + - assert + loadVest - Tests a condition and if the condition is false, displays error on screen (if -showscripterrors enabled) and logs error into.rpt file. It does not interrupt the script execution. - If script was pre-processed with preprocessFileLineNumbers, it will also show/log the error line number and the file name. + Returns current sum of mass from items stored in a vest. - https://community.bistudio.com/wiki/assert + https://community.bistudio.com/wiki/loadVest - assert Boolean + loadVest Object - assert condition + loadVest unit - $Code$assert (1 2);$/Code$ - - $Code$// Check function params (Faster alternative to BIS_fnc_param ) - some_func = { - _0 = _this select 0; - _1 = _this select 1; - _2 = _this select 2; - if (! assert ( - typeName _0 == "ARRAY" && - typeName _1 == "STRING" && - typeName _2 == "SCALAR" - )) exitWith {/*optional error logging*/}; - hint "Alright!"; - }; - [1,2,3] call some_func; //assert error - [[1],"2",3] call some_func; //Alright!$/Code$ - + undefined / undefined - (May 15, 2010) - Returns false, if condition is false, and returns true, if condition is true. - Boolean + Number + - assignAsCargoIndex + serverCommand - Assigns the character to a specific cargo / passenger index of the given vehicle. + Executes a server command. Which command is available for execution can be found with serverCommandAvailable and whether or not it can be executed with serverCommandExecutable. + If serverCommand is executed on a client, it must be executed from UI event handler ( ctrlAddEventHandler, displayAddEventHandler ), such as onButtonDown or other User_Interface_Event_Handlers. + As of Arma 3 v1.39 serverCommand can be used on dedicated server and headless clients. This requires a password, both set in server.cfg and passed to the command itself (See Alt Syntax). This new version also doesn't need to be executed from within a UI Eventhandler. - https://community.bistudio.com/wiki/assignAsCargoIndex + https://community.bistudio.com/wiki/serverCommand - Object assignAsCargoIndex Array + serverCommand String + + String serverCommand String - character assignAsCargoIndex [vehicle, index] + serverCommand command + + password serverCommand command - $Code$player assignAsCargoIndex [myHelicopter, 1];$/Code$ + $Code$serverCommand "#logout";$/Code$ + + $Code$// Create button on the main map which will show userlist to anyone who clicks on it: + with uiNamespace do + { + ctrl = findDisplay 12 ctrlCreate ["RscButton", -1]; + ctrl ctrlSetPosition [0,0,0.5,0.1]; + ctrl ctrlSetText "USERLIST"; + ctrl ctrlCommit 0; + ctrl ctrlAddEventHandler ["ButtonDown", + { + serverCommand "#userlist"; + }]; + };$/Code$ + + $Code$serverCommand format ["#kick %1",_name];$/Code$ + + $Code$_isOK = "MyServerCommandPassword" serverCommand "#lock";$/Code$ undefined / undefined @@ -5351,361 +5579,517 @@ - Boolean + Boolean - Boolean + - assignAsCargo + lbDelete - Assign a unit as cargo of a vehicle. Used together with orderGetIn to order a unit to get in as cargo into a specific vehicle. Before usage of this command a subordinate unit hasn't got the option to get into the cargo space of the vehicle. + Removes the item with the given index from the listbox or combobox with id idc of the topmost user dialog. - https://community.bistudio.com/wiki/assignAsCargo + https://community.bistudio.com/wiki/lbDelete - Object assignAsCargo Object + lbDelete Array + + Control lbDelete Number - unitName assignAsCargo vehicleName + lbDelete [idc, index] + + control lbDelete index - $Code$_soldier1 assignAsCargo _truck - [_soldier1] orderGetIn true$/Code$ + $Code$lbDelete [101, 0];$/Code$ + + $Code$_control lbDelete 0;$/Code$ - global / global + local / local + More information on the LB command family can be found here - Nothing + Nothing - Nothing + - assignAsCommander + setMimic - Assign a unit as commander of a vehicle. Used together with orderGetIn to order subordinate units to get in as commander of a specific vehicle. Before usage of this command a subordinate unit hasn't got the option to get into the commander place of the vehicle. + Set person's facial expression. Following mimic values are recognized: + "Default" + "Normal" + "Smile" + "Hurt" + "Ironic" + "Sad" + "Cynic" + "Surprised" + "Agresive" + "Angry" + Since Arma 2 OA 1.6*, these values are used : + "neutral" + "dead" + "danger" + "hurt" + "aware" + "safe" + "combat" - https://community.bistudio.com/wiki/assignAsCommander + https://community.bistudio.com/wiki/setMimic - Object assignAsCommander Object + Object setMimic String - unitName assignAsCommander vehicleName + person setMimic mimic - $Code$_soldier1 assignAsCommander _tank - [_soldier1] orderGetIn true$/Code$ + $Code$_soldier1 setmimic "angry"$/Code$ - global / global + global / local + To give the impression of hard faced guys going into a mission, use the setmimic "angry" command. I always have this on my guys to stop them grinning during a cutscene/mission. + + In OFP v1.96, a character will keep any facial expression you set indefinately. Setmimic to "" to return soldier to automatic facial expressions. + + (Jan 19, 2010) + Not working in Arma 2 1.05. + + (September 2, 2013) + In Arma 3 the following face expressions work: "neutral","dead","danger","hurt","aware","safe","combat". Names must be written in all lower case letters. There is another grimace in config - "unconscious", which doesn't quite work. - Nothing + Nothing + - assignAsDriver + getPosASLVisual - Assign a unit as driver of a vehicle. Used together with orderGetIn to order subordinate units to get in as driver of a specific vehicle. Before usage of this command a subordinate unit hasn't got the option to get into the driver place of the vehicle. + Returns an object's rendered 3D position ASL (z value above sea level) in render time scope. Alias of visiblePositionASL. - https://community.bistudio.com/wiki/assignAsDriver + https://community.bistudio.com/wiki/getPosASLVisual - Object assignAsDriver Object + getPosASLVisual Object - unitName assignAsDriver vehicleName + getPosASLVisual object - $Code$_soldier1 assignAsDriver _tank - [_soldier1] orderGetIn true$/Code$ + $Code$_playerRenderedPosASL = getPosASLVisual player ;$/Code$ - global / global + global / undefined - Nothing + Array + - assignAsGunner + taskChildren - Assign a unit as gunner of a vehicle. Used together with orderGetIn to order subordinate units to get in as gunner of a specific vehicle. Before usage of this command a subordinate unit hasn't got the option to get into the gunner place of the vehicle. + Return the child tasks of the specified task. - https://community.bistudio.com/wiki/assignAsGunner + https://community.bistudio.com/wiki/taskChildren - Object assignAsGunner Object + taskChildren Task - unitName assignAsGunner vehicleName + taskChildren task - $Code$_soldier1 assignAsGunner _tank - [_soldier1] orderGetIn true$/Code$ - + - global / global + undefined / undefined - Nothing + Array + - assignAsTurret + arrayIntersect - Assigns the soldier to turret. + Intersects array1 with array2 returning array of unique common elements. Additionally, using the same array for array1 and array2 will simply return array of unique elements. Intersects only 1st dimension of an array. - https://community.bistudio.com/wiki/assignAsTurret + https://community.bistudio.com/wiki/arrayIntersect - Object assignAsTurret Array + Array arrayIntersect Array - unit assignAsTurret [vehicle, [turretPath]] + array1 arrayIntersect array2 - + $Code$_arr1 = [1,2,3,4,5,2,3,4]; + _arr2 = [4,5,6,1,2,3,5,6]; + hint str (_arr1 arrayIntersect _arr2); // [4,5,1,2,3]$/Code$ + + $Code$_arr = [1,2,3,1,2,3,1,2,3,4,5]; + hint str (_arr arrayIntersect _arr); // [1,2,3,4,5]$/Code$ + + $Code$// Remove nils : + hint str ([1,2, nil,3] arrayIntersect [1,2, nil,3]); // [1,2,3]$/Code$ + + $Code$// Also works with array elements which are equal : + hint str ([[1],[2],[3]] arrayIntersect [[2],[3],[4]]); // [[2],[3]]$/Code$ + undefined / undefined - Nothing + Array + - assignCurator + commandStop - Assign player as curator. Two players cannot act as one curator. + Order the given unit(s) to stop (via the radio). A stop command will never finish, the unit will never be ready. - https://community.bistudio.com/wiki/assignCurator + https://community.bistudio.com/wiki/commandStop - Object assignCurator Object + commandStop Object/Array - player assignCurator curatorObj + commandStop unitName - $Code$player assignCurator myCurator;$/Code$ + $Code$commandStop _soldier1;$/Code$ + + $Code$commandStop [_soldier1, _soldier2];$/Code$ + + $Code$commandStop ( units player );$/Code$ - undefined / undefined + global / global - This scripting command must be executed on the server to work properly in multiplayer + In ArmA 1.14, this command will not stop a unit that has been given a move order by means of selecting the unit, then clicking on the in game map (or ground). - Nothing + Nothing + - assignItem + selectRandomWeighted - Assigns existing item from inventory (uniform, vest, backpack) to a correct slot. If the slot is occupied by another item, it gets replaced. + Returns a random element from the given array according to assigned weights. Engine solution to BIS_fnc_selectRandomWeighted. A few notes: + Negative weights are not supported + If an item's weight is 0, the item is ignored + The weights don't have to total to 1 + If numbers of items and weights do not match, the shortest array is used + A single array Syntax is slightly faster then Alt Syntax - https://community.bistudio.com/wiki/assignItem + https://community.bistudio.com/wiki/selectRandomWeighted - Object assignItem String + selectRandomWeighted Array + + Array selectRandomWeighted Array - unit assignItem item + selectRandomWeighted valuesAndWeights + + values selectRandomWeighted weights - $Code$bluforUnit addItem "NVGoggles"; - bluforUnit assignItem "NVGoggles"; - opforUnit addItem "NVGoggles_OPFOR"; - opforUnit assignItem "NVGoggles_OPFOR"; - independentUnit addItem "NVGoggles_INDEP"; - independentUnit assignItem "NVGoggles_INDEP";$/Code$ + $Code$_randomWeightedElement = selectRandomWeighted [1,0.1,2,0.2,3,1.3,4,2.4,5,7.5];$/Code$ + + $Code$_randomWeightedElement = [1,2,3,4,5] selectRandomWeighted [0.1,0.2,1.3,2.4,7.5];$/Code$ - global / global + undefined / undefined + (June 26, 2017) + A 100000 runs of the following code: + $Code$_values = [0,1,2,3,4,5,6,7,8,9]; + _weights = [0.109,0.65,0.01,1.01,1.24,0,1.59,0.09,1.15,0.55]; + _result = _values selectRandomWeighted _weights;$/Code$ + Gave this result: + 0 - 0 + 0.01 - 144 + 0.09 - 1409 + 0.109 - 1633 + 0.55 - 8673 + 0.65 - 10127 + 1.01 - 15668 + 1.15 - 18059 + 1.24 - 19518 + 1.59 - 24769 - Nothing + Anything - Anything + - assignTeam + setPlateNumber - Assigns the unit (in case of a vehicle, its commander) to the given team. Team is an option in group control (unit management) menu that allows to split player group in teams and then give bulk order to separate teams. In order to operate properly, the command requires specific conditions: - The command requires player to be fully initialised - The unit getting assigned must be either player himself or a unit in player's group - Units in player's group as well as player himself can all have different teams assigned - The colour of the assigned team for a unit is seen on the group management UI as well as squad radar - The possible team values (colours) are: - "MAIN" - (white) - "RED" - (red) - "GREEN" - (green) - "BLUE" - (blue) - "YELLOW" - (yellow) - NOTE : In older version of the game the effect of this command is local + Change the license plates on any vehicle which has plates configured. Max 15 characters are allowed! - https://community.bistudio.com/wiki/assignTeam + https://community.bistudio.com/wiki/setPlateNumber - Object assignTeam String + Object setPlateNumber String - unit assignTeam team + vehicle setPlateNumber string - $Code$_soldier2 assignTeam "RED";$/Code$ + $Code$vehicle player setPlateNumber "Custom Plate 99"$/Code$ - global / global + undefined / undefined - (July 12, 2016) - Since Arma 3 v1.62 this command has global effects and is persistent even on machines that join in progress. - Nothing + Nothing + - assignToAirport + setVelocityTransformation - Not correctly implemented yet, currently it does the same as landAt. As the implementation may get fixed sometime, please do not use this command until then. + Places an object at an interpolated position between two other objects and sets its vectors in proportion to the relative position. + The final position/vector is determined by the "interval" specified in the command. + This assumes an imaginary path between the two reference objects, where + at the beginning of the path (interval: 0) the position and vector are identical to the first reference object, + at the end of the path (interval: 1) they're identical to the second reference object, + and at 0.5 they are halfway in-between. + See setVelocityTransformation (VBS2) for more details. - https://community.bistudio.com/wiki/assignToAirport + https://community.bistudio.com/wiki/setVelocityTransformation - Object assignToAirport Number - - Object assignToAirport Object + Object setVelocityTransformation Array - plane assignToAirport id - - plane assignToAirport target + object setVelocityTransformation [position1, position2, velocity1, velocity2, direction1, direction2, upVector1, upVector2, interval] - $Code$plane1 assignToAirport 0$/Code$ + $Code$_tracker setVelocityTransformation [ + getPosASL _currentPos, + getPosASL _nextPos, + velocity _currentVelocity, + velocity _nextVelocity, + vectorDir _currentVectorDir, + vectorDir _nextVectorDir, + vectorUp _currentVectorUp, + vectorUp _nextVectorUp, + _timeDiff + ];$/Code$ + + $Code$// Bob on imaginary stairway to heaven: + bob = createAgent ["C_man_1", player getRelPos [5, 0], [], 0, "CAN_COLLIDE"]; + bob switchMove "ladderciviluploop"; + pos1 = getPosASL bob; + pos2 = pos1 vectorAdd [0,0,0.75]; + bob addEventHandler ["AnimDone", + { + pos1 = pos2; + pos2 = pos2 vectorAdd [0,0,0.75] + }]; + onEachFrame + { + if (! alive bob) then + { + onEachFrame {}; + bob switchMove ""; + bob removeAllEventHandlers "AnimDone"; + }; + bob setVelocityTransformation [ + pos1, + pos2, + [0,0,0], + [0,0,0], + [0,1,0], + [0,1,0], + [0,0,1], + [0,0,1], + moveTime bob + ]; + };$/Code$ undefined / undefined + (Aug 4, 2014 – 12:35) + (A3 1.24) Generally speaking setVelocityTransformation is more likely a combination of setPosASL, setVectorDirAndUp (or BIS_fnc_setPitchBank ) and time multiplier. It can be used as a position tracker with all necessary information collected, copied and then released within one function. Here’s a simple reproduction on how setVelocityTransformation works in game: + $Code$ + private ["_dataOld","_dataNext","_capturedData","_obj","_fps","_startTrackingTime","_stepOld","_stepNext","_tracker","_tempTime"]; + _stepOld = 0; + _tempTime = 0; + _stepNext = 1; + while { true } do { + _capturedData = _capturedData + [[ getPosASL _obj, velocity _obj, vectorDir _obj, vectorUp _obj]]; + sleep _fps; + _tempTime = _tempTime + _fps; + if (_tempTime = _startTrackingTime) then { + _dataOld = _capturedData select _stepOld; + _dataNext = _capturedData select _stepNext; + _stepOld = _stepOld + 1; + _stepNext = if (_stepNext = ( count _capturedData)) then [{_stepOld},{_stepNext + 1}]; + _tracker setVelocityTransformation + [_dataOld select 0,_dataNext select 0,_dataOld select 1,_dataNext select 1, + _dataOld select 2,_dataNext select 2,_dataOld select 3,_dataNext select 3,1]; + }; + };$/Code$ + Tracker starts coping the route and stance from the object when time start counting. TimeDiff determines the distance multiply between the current position and the next position. - Nothing - Nothing + Nothing + - assignedCargo + lbSortByValue - Returns the list of soldiers assigned to the given vehicle as a cargo. + Sorts the ListBox entries by lbValue. The entries are sorted in ascending order. Also note that this command will mix up the entries randomly if multiple entries have the same value. - https://community.bistudio.com/wiki/assignedCargo + https://community.bistudio.com/wiki/lbSortByValue - assignedCargo Object + lbSortByValue Control + + lbSortByValue Number - assignedCargo vehicle + lbSortByValue control + + lbSortByValue idc - $Code$_list = assignedCargo _vehicleName$/Code$ + $Code$lbSortByValue _control;$/Code$ + + $Code$lbSortByValue 101;$/Code$ undefined / undefined + A good way to avoid that this Command will mix your Listbox up is, to assign your Value summed up with the Index ID returned by lbAdd to your Listbox Entries. + Posted: Sep 10 2014 + + More information on the LB command family can be found here - Array + Nothing - Nothing + - assignedCommander + camCommand - Returns the soldier assigned to the given vehicle as a commander. + Executes a command on the given camera / actor object. Known commands for: + All camera types - "manual on", "manual off" + "camera" - "inertia on", "inertia off" + "seagull" - "landed", "airborne" + When you execute camCommand "landed" on a flying seagull, it will land and sit on the floor until you call camCommand "airborne". The camCommand changes are conducted immediately, the command doesn't wait for camCommit. - https://community.bistudio.com/wiki/assignedCommander + https://community.bistudio.com/wiki/camCommand - assignedCommander Object + Object camCommand String - assignedCommander vehicle + camera camCommand command - $Code$_commander = assignedCommander vehicleName$/Code$ + $Code$_camera camCommand "manual on";$/Code$ - undefined / undefined + local / local + (May 23, 2017) + In Arma 3 with the addition of the curator camera type, the following commands are supported: + $Code$_camera = "CamCurator" camCreate [0,0,0]; + _camera camCommand "maxPitch 89"; + _camera camCommand "minPitch -89"; + _camera camCommand "speedDefault 0.1"; + _camera camCommand "speedMax 2"; + _camera camCommand "ceilingHeight 5000"; + _camera camCommand "atl off"; + _camera camCommand "surfaceSpeed off"; + $/Code$ - Object + Nothing + - assignedDriver + controlsGroupCtrl - Returns the soldier assigned to the given vehicle as a driver. + Returns a child control with specified idc from a controls group - https://community.bistudio.com/wiki/assignedDriver + https://community.bistudio.com/wiki/controlsGroupCtrl - assignedDriver Object + Control controlsGroupCtrl Number - assignedDriver vehicle + ctrlgrp controlsGroupCtrl idc - $Code$_driver= assignedDriver vehicleName$/Code$ + $Code$_control = _controlsGroup controlsGroupCtrl 101;$/Code$ undefined / undefined @@ -5713,573 +6097,526 @@ - Object + Control + - assignedGunner + windStr - Returns the soldier assigned to the given vehicle as a gunner. + Returns the current wind strength. - https://community.bistudio.com/wiki/assignedGunner + https://community.bistudio.com/wiki/windStr - assignedGunner Object + windStr - assignedGunner vehicle + windStr - + $Code$10 setWindStr (0.5 * windStr );$/Code$ + undefined / undefined - Object + Number + - assignedItems + magazinesDetailBackpack - Get array with all assigned items. + Returns an array with the type names of all the unit's backpack magazines. - https://community.bistudio.com/wiki/assignedItems + https://community.bistudio.com/wiki/magazinesDetailBackpack - assignedItems Object + magazinesDetailBackpack Object - assignedItems unit + magazinesDetailBackpack unit - $Code$hint str assignedItems player ;$/Code$ + $Code$magazinesDetailBackpack player$/Code$ undefined / undefined - (June 18, 2013) - Arma 3, version 0.70 - headgear and goggles are not present in returned array now. - - (August 22, 2013) - For head gear use headgear, addHeadgear and removeHeadgear. For goggles use goggles, addGoggles and removeGoggles - Array + Array + - assignedTarget + getFriend - Returns the target assigned to the vehicle/unit. To unassign the target use doWatch objNull or commandWatch objNull. + Returns if sides are friendly or hostile. For a value smaller than 0.6 it results in being enemy, otherwise it's friendly. See also Side relations. - https://community.bistudio.com/wiki/assignedTarget + https://community.bistudio.com/wiki/getFriend - assignedTarget Object + Side getFriend Side - assignedTarget vehicleName + side1 getFriend side2 - $Code$_target = assignedTarget _T72$/Code$ + $Code$value = west getFriend east ;$/Code$ + + $Code$_isEnemy = side _killer getFriend side _victim 0.6;$/Code$ - local / undefined + global / undefined - Object + Number + - assignedTeam + isKindOf - Returns the team the unit belongs to. Possible values: - MAIN (default and white) - RED - GREEN - BLUE - YELLOW - This command will return nil if given unit is objNull, remoteControling another unit or is not local + Checks whether the object is (a subtype) of the given type. While main syntax and alt syntax support only CfgVehicles, CfgAmmo and CfgNonAIVehicles, alt syntax 2 allows to specify any config, including mission config. - https://community.bistudio.com/wiki/assignedTeam + https://community.bistudio.com/wiki/isKindOf - assignedTeam Object + Object isKindOf String + + String isKindOf String + + String isKindOf Array - assignedTeam unitName + object isKindOf typeName + + typeName1 isKindOf typeName2 + + typeName1 isKindOf [typeName2, targetConfig] - $Code$_team = assignedTeam player ;$/Code$ + $Code$vehicle player isKindOf "Tank";$/Code$ + + $Code$"BMP2" isKindOf "Tank";$/Code$ + + $Code$currentWeapon player isKindOf ["Rifle", configFile "CfgWeapons"];$/Code$ - local / undefined + undefined / undefined - (December 13, 2014) - As of Arma 3 version 1.36. assignedTeam might return nil instead of any of the STRINGs above if the player is currently remote controlling a unit. - $Code$ assignedTeam player - - $/Code$ + (April 23, 2007) + This command can be used on the whole hierarchical class tree (i.e. when checking a HMMWV, one could test for "HMMWV50", "Car", "LandVehicle", etc., all of which would return true.) - (May 23, 2017) - Executed on server also nothing is returned... so arguments need to be local. + (16 Apr, 2008) + It appears isKindOf is limited to the CfgVehicles branch of the class hierachy. + So CfgWeapons, CfgMagazines, etc will return false for checks like: + ("M9" isKindOf "Pistol") returns false + + (8 Nov, 2009) + In a2 isKindOf also works for CfgAmmo in addition to CfgVehicles: ("M_9M311_AA" isKindOf "MissileBase") returns true. NOT for CfgWeapons, CfgMagazines and others.. + + (June 16, 2015) + In case you cannot use isKindOf because of the reasons stated, just use BIS fnc returnParents with class names as return value: + $Code$ _isKindOf = "Rifle" in [( configFile "CfgWeapons" "BWA3_G36K"), true ] call BIS_fnc_returnParents ; // is true$/Code$ + + (September 6, 2015) + In A3 isKindOf works well with CfgWeapons and CfgMagazines using the syntax from example 3. + It should be prefered to James' solution as it performs more than 25x faster. Tested in debug console with the following code snippets: + $Code$bool = "CA_Magazine" in ([( configFile "CfgMagazines" "HandGrenade"),true] call BIS_fnc_returnParents ); -- 0.12111ms$/Code$ + $Code$bool = "HandGrenade" isKindOf ["CA_Magazine", configFile "CfgMagazines"]; -- 0.00439453ms$/Code$ + When checking in CfgVehicles the syntax from example 2 performs a little faster. - String/Nothing + Boolean - Boolean - Boolean + - assignedVehicleRole + pixelGridNoUIScale - Return the role a unit is assigned to within its assigned vehicle. - The array which is returned contains: - [] - Not assigned to any vehicle - ["Driver"] - Assigned as driver - ["Cargo"] (or ["Cargo", [turret path]] since Arma 3 1.31.127272) - Assigned as cargo - ["Turret", [turret path]] - Assigned to a turret - If no vehicle role is assigned, an empty array is returned. + Returns grid size based on screen resolution and configs: uiScaleFactor, uiScaleMaxGrids + As mentioned in the name of this command, the user interface scale is ignored. - https://community.bistudio.com/wiki/assignedVehicleRole + https://community.bistudio.com/wiki/pixelGridNoUIScale - assignedVehicleRole Object + pixelGridNoUIScale - assignedVehicleRole unitName + pixelGridNoUIScale - $Code$_RoleArray = assignedVehicleRole player ;$/Code$ - - $Code$// Get weapons available to player at player occupied turret: - _weaponsTurret = vehicle player weaponsTurret ( assignedVehicleRole player select 1);$/Code$ + $Code$_gridHeightNoUIScale = pixelH * pixelGridNoUIScale ;$/Code$ - global / undefined + undefined / undefined - (August 31, 2013) - When unit with unassigned vehicle role enters a vehicle, it gets assigned vehicle role automatically. The unit then will hold on to its assigned role after exiting the vehicle. To add, when player is in the group of AIs and is not the leader, assignedVehicleRole of the player could be unpredictable and absolutely not related to the position player occupies. In short, forget about this command, it is unreliable and has been broken too many times in the past. - - (November 15, 2014) - In multiplayer (tested in v1.34), this only works reliably on the server. - Behaviour is as follows: - On a client, the command will return empty arrays for every unit that is not local. - On the server, the command correctly returns the position, regardless of the units locality. - Array + Number + - assignedVehicle + waypointLoiterRadius - Returns the vehicle a unit is assigned to. If no vehicle is assigned objNull is returned. + Gets the waypoint loiter radius. Waypoint uses format Waypoint. - https://community.bistudio.com/wiki/assignedVehicle + https://community.bistudio.com/wiki/waypointLoiterRadius - assignedVehicle Object + waypointLoiterRadius Waypoint - assignedVehicle unit + waypointLoiterRadius Waypoint - $Code$_vehicle = assignedVehicle player ;$/Code$ + $Code$_radius = waypointLoiterRadius [groupOne, 1];$/Code$ - local / undefined + undefined / undefined - Object + Number + - atan2 + allSites - ArcTangent of x/y. Used to determine the angle of a vector [x,y]. Result in Degrees between -180 and 180. - Note that this command can handle y being 0, unlike when using atan, and will return 90 + Return all sites in map. + This command is considered deprecated and is no longer supported - https://community.bistudio.com/wiki/atan2 + https://community.bistudio.com/wiki/allSites - Number atan2 Number + allSites - x atan2 y + allSites - $Code$_xy = [5,3]; - _degrees = (_xy select 0) atan2 (_xy select 1); //59.0362$/Code$ - - $Code$// Get direction from _obj1 to _obj2: - _vd = getPosASL _obj2 vectorDiff getPosASL _obj1; - _dir = (_vd select 0) atan2 (_vd select 1); //_dir range from -180 to +180 - if (_dir 0) then {_dir = 360 + _dir}; //_dir range from 0 to 360$/Code$ - - $Code$// Get relative direction from _obj1 to _obj2: - _xy = _obj1 worldToModel getPosASL _obj2; - _dir = (_xy select 0) atan2 (_xy select 1); //_dir range from -180 to +180 - if (_dir 0) then {_dir = 360 + _dir}; //_dir range from 0 to 360$/Code$ + $Code$_allSites = allSites ;$/Code$ undefined / undefined - (08:00, 18 November 2009) - To get the direction of an object from the player: - $Code$ - _dir = (( getPos _obj select 0) - ( getPos player select 0)) atan2 (( getPos _obj select 1) - ( getPos player select 1)); - //_dir will be from -180 to 180. - $/Code$ - If positive values are needed then use: - $Code$ - if (_dir 0) then {_dir = _dir + 360}; - $/Code$ - Or just use BIS_fnc_dirTo directly. - Number + Array + - atan + moveToFailed - ArcTangent of a number, result in Degrees. + Check if latest low level moveTo command failed. - https://community.bistudio.com/wiki/atan + https://community.bistudio.com/wiki/moveToFailed - atan Number + moveToFailed Object - atan x + moveToFailed person - $Code$_degrees = atan 1; //45$/Code$ - + undefined / undefined - Number + Boolean + - atg + removeHeadgear - Equivalent to atan + Removes headgear from a unit. If unit has no headgear command quietly fails. - https://community.bistudio.com/wiki/atg + https://community.bistudio.com/wiki/removeHeadgear - atg Number + removeHeadgear Object - atg x + removeHeadgear unit - + $Code$removeHeadgear player ;$/Code$ + - undefined / undefined + global / global + (August 5, 2016) + To clarify, this command effectively DELETES the headgear. It does not simply remove it from unit's head and move it into inventory. - Number + Nothing + - attachObject + flagOwner - Attaches a location to the specified object. To detach a location, attach it to objNull. + Returns the global owner of a flag. A getter for setFlagOwner. Note that owner of a flag is Object rather than Number, as how it is usually with other owner commands - https://community.bistudio.com/wiki/attachObject + https://community.bistudio.com/wiki/flagOwner - Location attachObject Object + flagOwner Object - location attachObject object + flagOwner flag - $Code$myLocation attachObject player ;$/Code$ + $Code$_person = flagOwner _flagOne;$/Code$ - undefined / undefined + global / global - Nothing + Object + - attachTo + lnbSize - Attaches an object to another object. The offset is applied to the object center unless a memory point is provided. If no offset is specified, the offset used will be the current relative positioning of objects against each other. + Returns size of 2D listbox or combobox as [rows, columns]. - https://community.bistudio.com/wiki/attachTo + https://community.bistudio.com/wiki/lnbSize - Object attachTo Array + lnbSize Control - object1 attachTo [object2, offset, memPoint] + lnbSize control - $Code$player attachTo [car, [0, 0, 1] ];$/Code$ - - $Code$player attachTo [tank, [0, -1, 0], "Usti hlavne"];$/Code$ - - $Code$// Automatic offset: - ammoCrate attachTo [ player ];$/Code$ - - $Code$To set orientation of attached object use setVectorDirAndUp command: - _expl1 = "DemoCharge_Remote_Ammo" createVehicle position player ; - _expl1 attachTo [ player, [-0.1, 0.1, 0.15], "Pelvis"]; - _expl1 setVectorDirAndUp [ [0.5, 0.5, 0], [-0.5, 0.5, 0] ]; - _expl2 = "DemoCharge_Remote_Ammo" createVehicle position player ; - _expl2 attachTo [ player, [0, 0.15, 0.15], "Pelvis"]; - _expl2 setVectorDirAndUp [ [1, 0, 0], [0, 1, 0] ]; - _expl3 = "DemoCharge_Remote_Ammo" createVehicle position player ; - _expl3 attachTo [ player, [0.1, 0.1, 0.15], "Pelvis"]; - _expl3 setVectorDirAndUp [ [0.5, -0.5, 0], [0.5, 0.5, 0] ];$/Code$ + $Code$lnbSize _ctrl;//[8,2]$/Code$ - global / global + local / local - (June 6, 2009) - You can use setDir to change the direction of the attached object. The direction is relative to the object you attach it to, so setDir 180 won't point to the south but to the rear of the object you attach it to. - Use setPos to synchronize the direction of the object in a network game. - Example code: - $Code$ - _obj setDir 180; - _obj setPos getPos _obj;$/Code$ - - (September 17, 2011) - Some objects you cannot attach anything to. To be more precise, you can attach objects to them, but the behaviour is unexpected. For instance: $Code$ - SuitcaseObject attachTo [FoldingTableObject, [0,0,0]];$/Code$ - You would expect the suitcase to jump to the pivot point of the table, and stick to it. - Instead, the suitcase will freeze in it's original position. Even if the table is moved, the suitcase will be unaffected: it will not follow the table, it will not even respond to actions it reacted to prior to being attached: pushing, being shot at, etc.. It's just an object frozen in space. In MP it's even weirder, the suitcase would turn invisible. - Dodgy objects when it comes to attaching things to them: most in Objects(small), Objects(signs), all of Objects(helpers) categories, etc.. - - (March 28, 2014) - If you attach an explosive charge to an object (e.g. ammobox), the charge will not detonate when you simply set the damage to 1. You must detach it before. - $Code$ private ["_target"]; - _target = your_ammobox ; - // create and attach charge - private ["_charge"]; - _charge = "DemoCharge_Remote_Ammo_Scripted" createVehicle position player ; - _charge attachTo [_target, [0,0,0.2]]; - _charge setVectorDirAndUp [[0.5,0.5,0],[-0.5,0.5,0]]; - // now detonate charge - detach _charge; //Important! - _charge setDamage 1; - $/Code$ - - (1 Jun, 2014) - (ArmA3 ver 1.20) attachTo overwrites setVectorDirAndUp if attached obj was changed to attach another one. - $Code$ - _obj attachTo [_logic,[0,0,0]]; - _obj setVectorDirAndUp [[0,1,0],[0,0,-1]]; - _obj attachTo [_logic,[0,0,2]]; //vector no changes - _obj attachTo [_anotherOne,[0,0,0]]; //vector changes to default - $/Code$ - - (September 25, 2014) - Attaching an object does not update the accessibility of a place for the AI. The command shouldn't be used for positioning large static objects - the AI will simply walk thru such objects. - - (September 1, 2016) - Using attachTo with an objects that have ragdoll physics (such as ammo boxes, containers, etc.) may cause unexpected behaviour. When you do so, if the attached object intersect origin object, origin object may gain some - enormous collision properties even if the collision model for the attached object is not present localy to origin object, until detached. Vehicles may start flipping with no mass calculation (ie tank might fly), player object might gain inifinite - Z-vector velocity on any interaction with terrain relief and other objects. - Nothing + Array + - attachedObjects + goto - Returns a list of attached objects. + In SQS scripts only: Go to given label. + String argument is used here. + Be sure to use double quotes around label name in goto. Define the label with #. Note that Labels are not case sensitive and that labels are searched for from the top of the script, so multiple occurrences of a label will only result in the top most one ever being found. - https://community.bistudio.com/wiki/attachedObjects + https://community.bistudio.com/wiki/goto - attachedObjects Object + goto String - attachedObjects obj + goto label - $Code${ - detach _x; - } forEach attachedObjects player ;$/Code$ - - $Code$if ( count attachedObjects player == 0) then { - hint "There are no objects attached to player"; - };$/Code$ - + undefined / undefined + (August 4, 2006) + Notes from before the conversion: + This function works only inside of SQS script. + The search for labels always begins at the top of the script so that if there are multiple occurrences of a label the first occurrence will always be the one found. + Because of the searching order, it is faster to place loops which are executed often at the top of a script. + Labels are not case sensitive. + Loops which look something like the example below should be avoided as many of them could cause the mission to slow down: + #wait + if (condition) then { goto "wait"} + It is better to use the @ command to wait for a condition to be true, or put a small delay into the wait loop. + Example + While it is not required to include a delay in a loop, such a loop without a delay can cause the script to slow the game down, as the loop will be executed many times before the game engine interrupts the script. + Unless you really want the loop to execute multiple times during a frame, you should include a small delay. + You would need to have many scripts running for this to be a significant issue. + Deciding whether to use a script with a loop or a trigger or even a @ statement to detect a condition is a complicated matter and should be subject to experimentation. + + (August 4, 2006) + A goto command called within a forEach loop, will only execute a single jump to goto, once the forEach loop has finished: + { goto "wait"} forEach [0,1,2,3,4] - Array + Nothing + - attachedObject + setPitch - Returns the object a location is attached to. If the location is unattached, then objNull is returned. + Sets the pitch of a persons voice. - https://community.bistudio.com/wiki/attachedObject + https://community.bistudio.com/wiki/setPitch - attachedObject Location + Object setPitch Number - attachedObject location + person setPitch pitch - $Code$_locAttachedObj = attachedObject myLocation;$/Code$ + $Code$unit1 setPitch 1$/Code$ - undefined / undefined + undefined / local - Object + Nothing + - attachedTo + animationState - Returns the object it is attached to. - Returns objNull if not attached to anything. + Returns the name of a unit's current primary animation. Seems to be forced to lower case in Arma 3. - https://community.bistudio.com/wiki/attachedTo + https://community.bistudio.com/wiki/animationState - attachedTo Object + animationState Object - attachedTo object + animationState unitName - $Code$if ( isNull attachedTo _obj1) then { - hint "_obj1 is not attached to anything."; - };$/Code$ + $Code$_state = animationState player ;$/Code$ - undefined / undefined + global / undefined + (August 22, 2014) + (A3 1.26) To sort animation state by keyword, use BIS_fnc_ambientAnimGetParams + $Code$ ("KNEEL" call BIS_fnc_ambientAnimGetParams ) select 0; + //return: ["amovpknlmstpslowwrfldnon"…]$/Code$ + Useful keywords are: "STAND", "WATCH", "GUARD", "LISTEN_BRIEFING", "LEAN_ON_TABLE", "LEAN", "SIT_AT_TABLE", "KNEEL", "PRONE_INJURED", "BRIEFING" ect. - Object + String + - attackEnabled + teamMember - Return whether a group's leader can issue attack commands to soldiers under his command. + Return an agent for given person. - https://community.bistudio.com/wiki/attackEnabled + https://community.bistudio.com/wiki/teamMember - attackEnabled Object/Group + teamMember Object - attackEnabled name + teamMember person - $Code$if (not attackEnabled _soldier) then {_soldier setCombatMode "Careless"}$/Code$ + $Code$_agent = teamMember player ;$/Code$ - global / undefined + undefined / undefined - Boolean + Team_Member + - backpackCargo + animatePylon - Get array with backpacks from ammo box (or any general weapon holder container). + Force animation of pylon to given state, -1 for reset to engine handling, can cause weapon inoperative, because weapon is released when pylon state =1. - https://community.bistudio.com/wiki/backpackCargo + https://community.bistudio.com/wiki/animatePylon - backpackCargo Object + Object animatePylon Array - backpackCargo box + vehicle animatePylon [pylon nameindex, anim phase] - $Code$hint str backpackCargo vehicle player ;$/Code$ + $Code$( vehicle player ) animatePylon [1, 0.5];$/Code$ undefined / undefined @@ -6287,107 +6624,144 @@ - Array + Nothing + - backpackContainer + isNil - Returns a cargo container of a unit's backpack. + Tests whether the variable defined by the String argument is undefined, or whether an expression result passed as Code is undefined. + The command returns true if the variable or the expression result is undefined (i.e. the expression result is Void ), and false in all other cases. - https://community.bistudio.com/wiki/backpackContainer + https://community.bistudio.com/wiki/isNil - backpackContainer Object + isNil String + + isNil Code - backpackContainer unit + isNil variableName + + isNil code - $Code$hint str backpackContainer player ; //1a5f7900# 163944: backpack_fast.p3d$/Code$ - - $Code$hint str getMagazineCargo backpackContainer player ; - // [ - //[ - //"APERSBoundingMine_Range_Mag", - //"ClaymoreDirectionalMine_Remote_Mag", - //"SLAMDirectionalMine_Wire_Mag", - //"DemoCharge_Remote_Mag" - //],[ - //3, - //2, - //2, - //1 - //] - //]$/Code$ + $Code$if ( isNil "_pokus") then {_pokus = 0};$/Code$ - $Code$( backpackContainer player ) addWeaponCargoGlobal [ weapons player select 0,1];$/Code$ + $Code$isNil { player getVariable "someVar"};$/Code$ undefined / undefined - (Apr 29, 2014) - In ArmA3 ver 1.16, we can use either backpackContainer or unitBackpack at present since both of them enjoy same operand type and return value. + I recently had a strange experience with this command. I forgot to wrap the name of the variable with quotes, and it returned the opposite of the true null status of the variable. Just something to watch out for. + + ^ If you don't wrap the name of the variable in quotes, then it will instead read the value of the variable itself. If that variable is a string or code, then the command will use that string or code held by the variable. Example: + _myvar = "_hisvar"; + isnil _myvar; + //will return true if _hisvar is null + _myvar = {tank1}; + sleep (random 50); + isnil _myvar; + //will return if tank1 is nil, at the time the isnil command is checked (not at the time _myvar is established) + -- General Barron 10:37, 30 December 2009 (CET) + + isNil is also able to check if an expression is undefined. As such, an alternative way to check variables would be: + isNil {variable} + you can use this method to also check if variables defined using setVariable exist as well: + isNil {player getVariable "Something"} + As well as testing if a function returns a value + func_ChangeVehicleName = + { + _this setVehicleVarName "newName"; + }; + if (isNil {player call func_ChangeVehicleName}) // returns true, because this function does not return anything + + (September 25, 2014) + While isNil isn't available in OFP/CWA you can easily emulate it with something like this: + _nil = format["%1",_nilstring]; + ?(format["%1",foo]==_nil): foo = "Hello World!" + + (October 25, 2014) + You can also use isNil to check if an array element exists or if a setVariable variable exists + $Code$_array = [0,1,2,3]; + if (isNil {_array select 4}) then {hint "Element does not exist";};$/Code$ + $Code$if ( isNil { missionNamespace getVariable "MY_VARIABLE"})$/Code$ + When trying to test array elements, you can only test elements that are 1 element out of range. Testing elements 2 or more elements out of range will result in a script error. + + (June 25, 2017) + isNil in combination with code will execute that code so be aware. + + (July 18, 2017) + isNil CODE will execute the code in unscheduled environment - Object + Boolean - Boolean + - backpackItems + addWeapon - Get array with all items (of any kind, even weapons) in backpack of the given unit. + Add a weapon to a unit. The unit must be local to the computer where command is executed. For a global version of this command see addWeaponGlobal. + Infantry units can only carry a specific number of weapons, once the weapon slots are filled, any further addWeapon commands are ignored. - https://community.bistudio.com/wiki/backpackItems + https://community.bistudio.com/wiki/addWeapon - backpackItems Object + Object addWeapon String - backpackItems unit + unit addWeapon weapon - $Code$backpackItems player ;[ - "hgun_P07_F", - "Titan_AT" - ]$/Code$ + $Code$player addMagazine "30Rnd_556x45_Stanag"; + player addWeapon "BAF_L85A2_RIS_SUSAT";$/Code$ + + $Code$An_2 addMagazine "100Rnd_762x51_M240"; + An_2 addWeapon "M240_veh";$/Code$ - undefined / undefined + local / global + (August 2, 2006) + Notes from before the conversion: + To ensure that the weapon is loaded at the start of the mission, add at least one magazine ( addMagazine ) before adding the weapon. To remove weapons use the removeAllWeapons or the removeWeapon commands. + + When adding a weapon in-game, a bug means that sometimes the weapon can't be fired. Swap to a different weapon and swap back again to enable the newly added weapon to fire; or drop and pick up the weapon again. - Array + Nothing + - backpackMagazines + listVehicleSensors - Get array with all magazines from backpack of the given unit. + Returns an array of the sensors in the given vehicle's config (configfile CfgVehicles vehicle Components SensorsManagerComponent Components). - https://community.bistudio.com/wiki/backpackMagazines + https://community.bistudio.com/wiki/listVehicleSensors - backpackMagazines Object + listVehicleSensors Object - backpackMagazines unit + listVehicleSensors vehicle - $Code$backpackMagazines player ;[ - "Titan AT Missile(1/1)[id/cr:16/0](2x)" - ]$/Code$ + $Code$_sensors = listVehicleSensors ( vehicle player ); + hint str _sensors;$/Code$ undefined / undefined @@ -6395,55 +6769,56 @@ - Array + Array + - backpack + cheatsEnabled - Returns a class of a backpack. + Checks whether cheats are enabled (whether the designers' version is running). - https://community.bistudio.com/wiki/backpack + https://community.bistudio.com/wiki/cheatsEnabled - backpack Object + cheatsEnabled - backpack unit + cheatsEnabled - $Code$_classname = backpack player ;$/Code$ - + undefined / undefined - String + Boolean + - backpackSpaceFor + boundingBox - Returns how much space is in backpack for given weapon or magazine + Returns a bounding box of given object in model coordinate space. This command is rather generous on the size estimation, for more precise coordinates use boundingBoxReal - https://community.bistudio.com/wiki/backpackSpaceFor + https://community.bistudio.com/wiki/boundingBox - Object backpackSpaceFor String + boundingBox Object - backpack backpackSpaceFor weaponName + boundingBox model - $Code$( backpack player ) backpackSpaceFor "m16"; // [weapons, magazines]$/Code$ + $Code$_box = boundingBox _abrams$/Code$ undefined / undefined @@ -6451,180 +6826,227 @@ - Array + Array + - behaviour + ctrlModelDirAndUp - Return the behaviour of a unit. For Arma 3 behaviour explanation see Arma_3_AI_Behavior + Returns vectorDir and vectorUp of the model used in 3D Dialog Control. - https://community.bistudio.com/wiki/behaviour + https://community.bistudio.com/wiki/ctrlModelDirAndUp - behaviour Object + ctrlModelDirAndUp Control - behaviour unitName + ctrlModelDirAndUp control - $Code$_soldier setBehaviour "CARELESS"; - _b = behaviour _soldier; //returns "CARELESS"$/Code$ + $Code$_vectorDirAndUp = ctrlModelDirAndUp _control3D;$/Code$ - global / undefined + undefined / undefined - (14 Feb 2010) - Although behaviour is called on an individual unit, what you are really getting back is the behaviour of that unit's group. Behaviour is a group setting. - String + Array + - benchmark + vectorMagnitudeSqr - Returns the value of "3D Performance" in OFP Preferences (flashpoint.cfg). This can be used to estimate the computer performance to adapt CPU and GPU demanding settings like view distance dynamically in missions. + Squared magnitude of a 3D vector. - https://community.bistudio.com/wiki/benchmark + https://community.bistudio.com/wiki/vectorMagnitudeSqr - benchmark + vectorMagnitudeSqr Array - benchmark + vectorMagnitudeSqr vector - $Code$? (benchmark 2000) : setViewDistance 2000$/Code$ + $Code$_sizeSqr = vectorMagnitudeSqr [0,3,4]; //25$/Code$ undefined / undefined - (14 March 2014) - The command is obsolete, it was used in OFP to measure PC performance. In A3 it returns 2000. + (28 Jun, 2014) + (ArmA3 1.22)Algorithm: + $Code$ + Vector = [x,y,z]; + Result = (x ^ 2) + (y ^ 2) + (z ^ 2) + $/Code$ + It is recommended to use vectorMagnitudeSqr instead of BIS_fnc_magnitudeSqr. - Number + Number + - binocular + isLightOn - Returns class name of currently used binocular weapon. + Returns true if vehicle headlights are on otherwise false. - https://community.bistudio.com/wiki/binocular + https://community.bistudio.com/wiki/isLightOn - binocular Object + isLightOn Object - binocular unit + isLightOn vehicle - $Code$_binocs = binocular player ; //Rangefinder$/Code$ + $Code$_lightsOn = isLightOn vehicle player ;$/Code$ + + $Code$_pilotLightOn = isLightOn heli;$/Code$ - undefined / undefined + global / undefined - String + Boolean + - blufor + setWaypointStatements - Pre-defined variable for the blufor side. - Alias for west. + The waypoint is done only when the condition is fulfilled. When the waypoint is done, the statement expression is executed. + Within the Condition & Statement code string: + this refers to the group leader + thisList refers to an array containing each unit in the group - https://community.bistudio.com/wiki/blufor + https://community.bistudio.com/wiki/setWaypointStatements - blufor + Array setWaypointStatements Array - blufor + waypoint setWaypointStatements [condition, statement] - $Code$if ( side player == blufor ) then { - hint "BLUFOR"; - };$/Code$ + $Code$new_wp setWaypointStatements [" true ", " hint 'hello'; hint 'goodbye'"];$/Code$ + + $Code$new_wp setWaypointStatements [" true ", " diag_log ['GroupLeader: ', this ]; diag_log ['Units: ', thislist ]"];$/Code$ undefined / undefined + (May 21, 2016) + Within the completion statement currentWaypoint will give the index of the waypoint being completed (as opposed to the following one). + This is particularly useful if you need a self deleting waypoint: $Code$ setWaypointStatements [" true "," deleteWaypoint [ group this, currentWaypoint ( group this)]"]$/Code$ + + (May 9, 2017) + The condition block carries the same rules as functions which return a value. The return value must be of type Boolean. I can bypass the use of triggers in this manner. + $Code$_wp setWaypointStatements [" code code code; _returnBool ", " onActivation block; "];$/Code$ - Side + Nothing + - boundingBoxReal + tvSetData - Returns a bounding box of given object in model coordinates space. This command is similar to boundingBox but gives more precise measurements. + Sets string data to item on given path. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/boundingBoxReal + https://community.bistudio.com/wiki/tvSetData - boundingBoxReal Object + tvSetData Array + + Control tvSetData Array - boundingBoxReal obj + tvSetData [idc, [path], data] + + _ctrl tvSetData [ [path], data] - $Code$_bbr = boundingBoxReal vehicle player ; - _p1 = _bbr select 0; - _p2 = _bbr select 1; - _maxWidth = abs ((_p2 select 0) - (_p1 select 0)); - _maxLength = abs ((_p2 select 1) - (_p1 select 1)); - _maxHeight = abs ((_p2 select 2) - (_p1 select 2));$/Code$ + $Code$tvSetData [101, [0], "Test data"];$/Code$ + + $Code$_ctrl tvSetData [ [0,0,0], "Test data"];$/Code$ - undefined / undefined + local / local + (Sep 11 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Array + Nothing - Nothing + - boundingBox + shownMap - Returns a bounding box of given object in model coordinate space. This command is rather generous on the size estimation, for more precise coordinates use boundingBoxReal + Checks if client has Map enabled in description.ext ( showMap param) or force enabled with showMap command. - https://community.bistudio.com/wiki/boundingBox + https://community.bistudio.com/wiki/shownMap - boundingBox Object + shownMap - boundingBox model + shownMap - $Code$_box = boundingBox _abrams$/Code$ + $Code$if ( shownMap ) then { hint "You have Map enabled"};$/Code$ undefined / undefined @@ -6632,212 +7054,201 @@ - Array + Boolean + - boundingCenter + setWeaponReloadingTime - Returns the position of original (loaded) center of object in model coordinates. + Sets states and/or makes an action of/on weapon. Reload time is between 0 and 1 inclusive, where 1 is 100% of maximum reloading time. - https://community.bistudio.com/wiki/boundingCenter + https://community.bistudio.com/wiki/setWeaponReloadingTime - boundingCenter Object + Object setWeaponReloadingTime Array - boundingCenter object + vehicle setWeaponReloadingTime [gunner, muzzleName, reloadTime] - $Code$_center = boundingCenter TruckOne$/Code$ + $Code$_done = _vehicle setWeaponReloadingTime [ gunner ( vehicle player ), currentMuzzle ( gunner ( vehicle player )), 0.5];$/Code$ undefined / undefined + (January 15, 2012) + The description is confusing to me. What the command essential does is to set the reloading state/time of the given weapon. For example you can fire a missile, and make the weapon available to fire again instantly if you apply 0. + Or you can delay or stop the reload event indefinitely. The 0-1 range is a percentage - the reload time is taken from the weapons's config value (either reloadTime or magazineReloadTime - not sure). The effect is one time only each - it does not modify the weapon's general reload time. + Works also for infantry weapons - probably useful weapons with longer reload time like sniper weapons or launchers: + player setWeaponReloadingTime [player,currentWeapon player,0]; + No idea what's point of the return value. + + (May 14, 2017) + Note that setWeaponReloadingTime is only having effect on a current weapon state (loaded projectile) so since the projectile is fired the next one will be reverted to a weapon config defaults. To keep the fire rate speed changed over time, use this code: + $Code$player addEventHandler ["FiredMan",{ + params ["","_weapon","_muzzle"]; + private _type = _weapon call BIS_fnc_itemType; + private _time = -1; + switch (_type select 1) do { + case 'SniperRifle' : {_time = 0.5}; + case 'AssaultRifle' : {}; + case 'Handgun' : {}; + case 'Rifle' : {}; + case 'SubmachineGun' : {}; + case 'MachineGun' : {}; + case 'Mortar' : {}; + case 'GrenadeLauncher' : {}; + case 'BombLauncher' : {}; + case 'MissileLauncher' : {}; + case 'RocketLauncher' : {}; + case 'Cannon' : {}; + case 'Throw' : {}; + }; + if (_time isEqualTo -1) exitWith {}; + (vehicle player) setWeaponReloadingTime [(vehicle player), _muzzle, _time]; + }]; + $/Code$ + This Event Handler makes the gun of specific type shoot at a desired rate on each weapon state (sniper rifle will shoot 50% faster in this example). For more information about weapon kinds are there, visit BIS_fnc_itemType. - Array + Boolean + - breakOut + enableDynamicSimulation - Breaks the code execution out of scope {} named name. nil is returned. Scope name can be assigned using scopeName command. - Since Arma 3 v1.47, breakOut can be used to return a value. It is the closest SQF comes to having "return" like operation. + Enables or disables Arma_3_Dynamic_Simulation for given non AI object - https://community.bistudio.com/wiki/breakOut + https://community.bistudio.com/wiki/enableDynamicSimulation - breakOut String - - Anything breakOut String + Object/Group enableDynamicSimulation Boolean - breakOut name - - value breakOut name + object enableDynamicSimulation enable - $Code$scopeName "main"; - while { true } do { - scopeName "loop1"; - while { true } do { - scopeName "loop2"; - if (condition1) then { breakTo "main"}; // Breaks all scopes and return to "main" - if (condition2) then { breakOut "loop2"}; // Breaks scope named "loop2" - sleep 1; - }; - sleep 1; - };$/Code$ - - $Code$call { - scopeName "main"; - call { - 123 breakOut "main" - }; - 345 - }; // call returns 123$/Code$ + $Code$_myObject enableDynamicSimulation true ;$/Code$ undefined / undefined - (19 Aug, 2008) - When "name" is nil, the command is ignored. - When "name" is an undefined scope name or "", the script quits current scope. - $Code$if (true) then { - hint "1"; - breakOut nil; - hint "2"; - }; //result "2" - if (true) then { - hint "1"; - breakOut ""; - hint "2"; - }; //result "1" - if (true) then { - hint "1"; - breakOut "dskfhdsklfh"; - hint "2"; - }; //result "1" - $/Code$ - - (August 27, 2015) - breakOut can still be used if multiple scopes share identical names. It will simply break out of the nearest scope that matches the name parameter you've used. For example: - $Code$call { - scopeName "Main"; //Parent Main - call { - scopeName "Main"; //Child Main - "String" breakOut "Main"; //Will break out of child main and return "String" to parent main - }; - }; - $/Code$ - Therefore you are able to consistently reuse scope names such as "Main", "Child", "Primary", "Secondary", etc throughout functions without worrying about having to ensure you create unique names for each scope. - Nothing - Anything + Nothing + - breakTo + preprocessFile - Breaks block to scope named name. Nil is returned. - Scope name can be assigned using scopeName command. + Reads and processes the content of the specified file. Preprocessor is C-like, supports comments using // or /* and */ and PreProcessor Commands. Due to the hard-drive access this command executes (and the lack of caching) this command should not be used in time-critical script loops. - https://community.bistudio.com/wiki/breakTo + https://community.bistudio.com/wiki/preprocessFile - breakTo String + preprocessFile String - breakTo name + preprocessFile fileName - $Code$scopeName "main"; - while { true } do { - scopeName "loop1"; - while { true } do { - scopeName "loop2"; - if (condition1) then { breakTo "main"}; // Breaks all scopes and return to "main" - if (condition2) then { breakOut "loop2"}; // Breaks scope named "loop2" - sleep 1; - }; - sleep 1; - };$/Code$ + $Code$_content = preprocessFile "myFunction.sqf";$/Code$ undefined / undefined - (May 18, 2017) - This command can not be used to re-execute scopes in which command is inside of. Example: - $Code$scopeName "whatever"; - if true then { - breakTo "whatever" - }; + (March 4, 2008) + File path is always relative to mission directory. If script dir\a.sqf includes dir\b.sqf, use "dir\b.sqf" and not "b.sqf". + + (July 8, 2011) + Use preprocessFileLineNumbers instead as it provides more context information on error. + + (December 17, 2013) + The main difference between preprocessFile and preprocessFileLineNumbers is that the latter adds #line directive to the target file, which allows to log the __LINE__ error happened at and the __FILE__ error happened in. + + (July 25, 2014) + Essentially what the preprocessFile command does is it refers to the contents of a file as a string: + Example 1: + boop.html: + $Code$ t align = 'center' valign = 'middle' shadow = '0' size = '2' structured text /t $/Code$ + init.sqf: + $Code$_text = parseText preprocessFile "boop.html"; + hint _text; $/Code$ - The example above will not make the engine jump back to line 1 and re-execute the 2nd line. Instead, it will just jump across line 2 to line 5 if it [ line 5 ] exists. + This is especially useful for long strings, and it works on files with any file extension as long as they can be edited with a text editor. + Example 2: + init.sqf: + $Code$ hint preprocessFile "description.ext"; + copyToClipboard preprocessFile "mission.sqm"; + $/Code$ + The above is all valid. However, using *.jpg or any other files saved in an image format is not possible. - Nothing + String + - briefingName + menuClear - Returns the name of the current briefing/scenario name. + Removes all entries from given menu strip. - https://community.bistudio.com/wiki/briefingName + https://community.bistudio.com/wiki/menuClear - briefingName + menuClear Number - briefingName + menuClear idc - $Code$_name = briefingName ;$/Code$ - + undefined / undefined - String + Nothing + - buildingExit + getAnimAimPrecision - Returns the given indexed exit in a building. The returned value is in format Position. + Returns aim precision for current animation - https://community.bistudio.com/wiki/buildingExit + https://community.bistudio.com/wiki/getAnimAimPrecision - Object buildingExit Number + getAnimAimPrecision Object - building buildingExit index + getAnimAimPrecision unit - $Code$_building buildingExit 0$/Code$ + $Code$getAnimAimPrecision player;$/Code$ undefined / undefined @@ -6845,294 +7256,350 @@ - Array + Number + - buildingPos + setIdentity - Returns PositionAGL of a given indexed position in a building. The index is 0-based (i.e. the first possible position would be 0. So if a building has 5 positions listed in the editor, 4 would be the highest position index usable with this command). Command will return [0,0,0] if buildingPos with given index is non-existent. - Since Arma 3 v.155.133934 if index -1 is supplied, the command will return array with all available positions. + Set identity of person. + Identities are defined in Description.ext of the mission or campaign. For a list of available faces, glasses and speakers check Category:CfgIdentities. - https://community.bistudio.com/wiki/buildingPos + https://community.bistudio.com/wiki/setIdentity - Object buildingPos Number + Object setIdentity String - building buildingPos index + person setIdentity identity - $Code$_soldier setPosATL (_house1 buildingPos 2);$/Code$ - - $Code$_allpositions = nearestBuilding player buildingPos -1;$/Code$ + $Code$_soldier1 setIdentity "MyLittleSoldier";$/Code$ - global / undefined + undefined / undefined - (August 2, 2006) - Notes from before the conversion: - These examples will move a unit to the 1st position specified in a buildings model, in the second example - bunker1. - $Code$this move (building buildingPos 1); - this move (bunker1 buildingPos 1);$/Code$ - In the default game buildings, the buildingPos is usually right behind a window. This can make it easy to place units in the windows of buildings, by putting the unit near a building and putting this in its init field: - $Code$this setPosATL (( nearestBuilding this) buildingPos 1);$/Code$ - The location returned by buildingPos is not reliable after the player has exited and then resumed the mission. For code that is executed immediately after the mission starts there is no problem. - If buildingPos locations are to be accessed during the mission when the player may have exited and then resumed, save the locations you require at the start of the mission and use these saved locations in your subsequent scripts. + (August 28, 2013) + For ArmA3 the definition format in the Description.ext file is: + class CfgIdentities + { + class MyLittleSoldier + { + name = "Givens"; + nameSound = "Givens"; + face="WhiteHead_06"; + glasses="None"; + speaker="Male05ENG"; + pitch=1.1; + }; + }; + nameSound can be any preset BIS recorded name value. By default units will be called out in voice by their number. By using nameSound you can call them out by name using the following values: + Default: + Armstrong + Nichols + Tanny + Frost + Lacey + Larkin + Kerry + Jackson + Miller + McKendrick + Levine + Reynolds + BLUFOR: + Adams + Bennett + Campbell + Dixon + Everett + Franklin + Givens + Hawkins + Lopez + Martinez + O'Connor + Ryan + Patterson + Sykes + Taylor + Walker + OPFOR: + Amin + Masood + Fahim + Habibi + Kushan + Jawadi + Nazari + Siddiqi + Takhtar + Wardak + Yousuf + INDEPENDENT: + Anthis + Costa + Dimitirou + Elias + Gekas + Kouris + Leventis + Markos + Nikas + Nicolo + Panas + Petros + Rosi + Samaras + Stavrou + Thanos + Vega + CODE NAMES: + Ghost + Stranger + Fox + Snake + Razer + Jester + Nomad + Viper + Korneedler + face can be any of the following: + AfricanHead_01 + AfricanHead_02 + AfricanHead_03 + AsianHead_A3_01 + AsianHead_A3_02 + AsianHead_A3_03 + GreekHead_A3_01 + GreekHead_A3_02 + GreekHead_A3_03 + GreekHead_A3_04 + GreekHead_A3_05 + GreekHead_A3_06 + GreekHead_A3_07 + GreekHead_A3_08 + GreekHead_A3_09 + PersianHead_A3_01 + PersianHead_A3_02 + PersianHead_A3_03 + NATOHead_01 + WhiteHead_02 + WhiteHead_03 + WhiteHead_04 + WhiteHead_05 + WhiteHead_06 + WhiteHead_07 + WhiteHead_08 + WhiteHead_09 + WhiteHead_10 + WhiteHead_11 + WhiteHead_12 + WhiteHead_13 + WhiteHead_14 + WhiteHead_15 + speaker can be any of the following: + Male01ENG + Male01ENGB + Male01GRE + Male01PER + Male02ENG + Male02ENGB + Male02GRE + Male02PER + Male03ENG + Male03ENGB + Male03GRE + Male03PER + Male04ENG + Male04ENGB + Male04GRE + Male05ENG + Male06ENG + Male07ENG + Male08ENG + Male09ENG + In ArmA 3 1.04+ these settings can also be set individually without description.ext editing by using the following commands: setFace, setName, setNameSound, setSpeaker, setPitch - (January 26, 2007) - The highest index is not necessarily the highest position in a building! Check the z-value to find out the absolute height of a position. + (August 4, 2006) + Notes from before the conversion: + The definition format in the Description.ext file is: + class CfgIdentities + { + class John_Doe + { + name = "John Bartholemew Doe"; + face = "Face20"; + glasses = "None"; + speaker = "Dan"; + pitch = 1.1; + }; + }; + In Operation Flashpoint, + Name can be any string. + Face can take any of the following values: + Male: "Face1"... to "Face52", "Face99" & "FaceR01" to "Face R04" + Female: "Eva", "Kamila", "Lada", "Lucie", "Marketa" & "Nada" + Glasses can take the following values: "None", "Spectacles" & "Sunglasses" + Speaker determines which voice is used and can take any of the following values: + "Adam" + "Dan" + "George" + "Greg" + "John" + "Jonah" + "Marc" + "Patrick" + "Paul" + "Peter" + "Rich" + "Rob" + "Ted" + "Tom" + "Nikolai" + "Vitaliy" + "Sergey" + "Oleg" + "Ruslan" + "Aleksei" + "Andrei" + "Boris" + "Georgiy" + "Vadim" + "Vladimir" + "Ivan" + Pitch sets the tone of voice. 1.0 for normal; 1.0 for deep; 1.0 for high pitched - (February 16, 2007) - (building buildingPos 1) will return [0,0,0] if buildingPos with this index does not exist. + (November 18, 2006) + Preview of all faces in Armed Assault can be found on Czech Biki - (January 08, 2011) - Almost all buildings loose their building positions when they get (visually) damaged or destroyed. Some debris do still have building positions though. So it is no technical limitation. Just most damaged/destructed buildings models do not (yet?) have building positions. Keep in mind that a damaged or destroyed building is a different object instance (and model). + (May 10, 2008) + Glasses and Female faces do not work as of Arma patch 1.12beta. - Array + Nothing + - buttonAction + velocityModelSpace - Return the action assigned to a control of the currently active user dialog. Can be used for buttons and active texts. Read Dialog Control for more information about user dialogs and controls. + Returns the velocity (speed vector) of the vehicle as an array with format [x, y, z]. Vector is in model space. - https://community.bistudio.com/wiki/buttonAction + https://community.bistudio.com/wiki/velocityModelSpace - buttonAction Number - - buttonAction Control + velocityModelSpace Object - buttonAction idc - - buttonAction control + velocityModelSpace vehicle - $Code$buttonSetAction [100, {player exec "reply.sqs"}] - _action = buttonAction 100 - returns {player exec "reply.sqs"}$/Code$ + $Code$velocityModelSpace _chopper; + comment "Returns [X (left(-) right(+)), Y (backward(-) forward(+)), Z (down(-) up(+))]";$/Code$ - local / undefined + undefined / undefined + (December 11, 2014) + This function is useful for helicopters as it returns Z vector like an indicator of thrust/load ratio. More or less climb (+) or descent (-) tendency but: + As X,Y,Z vectors are relative to vehicle attitude, this function doesn't return a climb or descend rate (as the attitude of the vehicle can be far from horizontal). You can get negative Z vector, in jets, while climbing fast, peeling off in the sky! + More or less, you can use as a Z accelerometer factor but invert the sign: +G acceleration (negative vector below the jet) is -Z here. + If not "physically" correct, the behavior is sufficient enough for Arma flight model. + + (June 21, 2015) + Previous note is physically incorrect. Velocity can not be used to give information about Thrust/Load ratio or G-Forces/acceleration. To get acceleration you have to create the derivative of velocity after time dv/dt - the difference of velocity between 2 timesteps divided by the time that passed between the 2 steps. - String - String + Array + - buttonSetAction + importAllGroups - Set the action of a control of the currently active user dialog. Can be used for buttons and active texts. See Dialog Control for more information about user dialogs. Works with: - CT_BUTTON - CT_XBUTTON - CT_ACTIVETEXT - CT_SHORTCUTBUTTON - The action code is expected to be in SQS format + Imports all groups into the RTE. + i + Some Old Editor Command - https://community.bistudio.com/wiki/buttonSetAction + https://community.bistudio.com/wiki/importAllGroups - buttonSetAction Array - - Control buttonSetAction String + importAllGroups Control - buttonSetAction [idc, action] - - control buttonSetAction action + importAllGroups map - $Code$buttonSetAction [100, " player exec ""reply.sqs"""];$/Code$ - - $Code$_ctrl buttonSetAction " if ( alive bob) then { hint 'alive'} else { hint 'dead'}"; // SQF but SQS compatible, see SQS$/Code$ - + - local / local + undefined / undefined - (October 5, 2009) - When using buttonSetAction for an ActiveText control from a script, you cannot use any variables local to the script in it. - /* This will print 'any bar' in the hint box, - since _foo has no value according to buttonSetAction */ - _foo = "foo"; - buttonSetAction [100, "hint format[""%1 bar"", _foo];"]; - - (February 15, 2016) - This command does not overwride the buttonaction which was set via "action" in the hpp of the dialog - - (June 11, 2016) - To use variables local to the defining script, a syntax like the one below needs to be used: - $Code$_foo = "foo"; - buttonSetAction [100, format["hint '%1 bar'", _foo]]; - $/Code$ - works! thanks to Kronzky for commenting this workaround in the VBS wiki - Nothing - Nothing + Nothing + - cadetMode + menuData - Returns if the player is currently playing in cadet or veteran mode. + Returns data stored in menu entry on given path. - https://community.bistudio.com/wiki/cadetMode + https://community.bistudio.com/wiki/menuData - cadetMode + menuData Array - cadetMode + menuData [idc, path] - $Code$? ( cadetMode ) : _AIsoldier setSkill 0.1 //sqs$/Code$ - - $Code$if ( cadetMode ) then {_AIsoldier setSkill 0.1}; //sqf$/Code$ - + undefined / undefined - (December 1, 2009) - In ArmA II, this command will return true if the difficulty level is set to "Recruit" or "Regular". It returns false for the "Veteran" and "Expert" difficulty levels. - Boolean + String + - callExtension + overcast - Calls custom.dll also known as Extension. The name of the extension is the name of the extension.dll without ".dll" part (or without "_x64.dll" part on 64-bit Arma). For example if the file is 'myExtension.dll' the name of the extension will be "myExtension". For 64-bit extensions, the name of the extension doesn't need to change and is still "myExtension". The game will automatically look for 'myExtension_x64.dll' when you use 64-bit Arma exe. - This command is blocking, meaning that the game will wait for the extension to return before continuing. This may cause FPS drop if extension is not optimised. If extension takes too long, consider making asynchronous extension, where the result of the work of the extension is collected in a separate call. - Currently there is no limit how much data you can send to the extension. However there is a limit on how much data you can return from extension in one call. The limit is known to the extension and is passed in int outputSize. The limit may or may not change in the future and is currently 10240 bytes. It is up to extension designer to handle multipart results if returned data exceeds output limit. - Since Arma 3 v1.67 it is possible to pass array of arguments to extensions. The array of arguments could be anything and all elements will be converted to strings, however you might want to only send simple types like Booleans, Strings, Numbers and Arrays of all of the above. There is currently a limit on how many arguments can be sent and it is 1024. However an argument could be an Array itself, in this case extension maker will have to provide additional methods for parsing such arguments. - Possible error codes: - 101: SYNTAX_ERROR_WRONG_PARAMS_SIZE - 102: SYNTAX_ERROR_WRONG_PARAMS_TYPE - 201: PARAMS_ERROR_TOO_MANY_ARGS - 301: EXECUTION_WARNING_TAKES_TOO_LONG - Each error will have entry in.rpt file with more details. - Since Arma 3 v1.69, RVExtensionVersion interface (see source code example below) has been added, which is called by the engine on extension load and expects extension version. This interface is designed to work with both, Linux and Windows. The max buffer size is 32 bytes. The version information will then appear in. rpt file like so: - $Code$19:06:36 CallExtension loaded: test_extension (.\test_extension.dll) [1.0.0.1]$/Code$ - For more information see Extensions. + Return the current overcast level. Zero is clear skies, one is maximum cloud cover. - https://community.bistudio.com/wiki/callExtension + https://community.bistudio.com/wiki/overcast - String callExtension String - - String callExtension Array + overcast - extension callExtension function - - extension callExtension [function, arguments] + overcast - $Code$_return = "myExtension" callExtension "stringToBeParsed";$/Code$ - - $Code$_result = "test_extension" callExtension str weapons player ; - _result = "test_extension" callExtension ["fnc1", getUnitLoadout player ]; - _result = "test_extension" callExtension ["fnc2", magazinesAmmoFull player ]; - _result = "test_extension" callExtension ["fnc1", [ weapons player, magazines player ]];$/Code$ - - $Code$_result = "test_extension" callExtension ["fnc1", [1,"two", true,[4,"five", false ]]]; - parseSimpleArray (_result select 0) params ["_number","_string","_boolean","_array"]; - systemChat str [_number,_string,_boolean,_array]; - // Source Code ( Download.dll ) - //This is an example of an extension compatible with both syntaxes. When using 1st syntax, the data is just copied from input to output. When using alt syntax, the arguments are parsed and then assembled back into string array in 2 ways: fnc1 and fnc2. fnc1 is a fraction faster. - //#include string - //#include vector - //#include iterator - //#include sstream - //#define CURRENT_VERSION "1.0.0.1" - //extern "C" - //{ - ////--- Engine called on extension load - //__declspec ( dllexport ) void __stdcall RVExtensionVersion ( char * output, int outputSize ) ; - ////--- STRING callExtension STRING - //__declspec ( dllexport ) void __stdcall RVExtension ( char * output, int outputSize, const char * function ) ; - ////--- STRING callExtension ARRAY - //__declspec ( dllexport ) int __stdcall RVExtensionArgs ( char * output, int outputSize, const char * function, const char ** args, int argsCnt ) ; - //} - ////--- Extension version information shown in.rpt file - //void __stdcall RVExtensionVersion ( char * output, int outputSize ) - //{ - ////--- max outputSize is 32 bytes - //strncpy_s ( output, outputSize, CURRENT_VERSION, _TRUNCATE ) ; - //} - ////--- name callExtension function - //void __stdcall RVExtension ( char * output, int outputSize, const char * function ) - //{ - //std :: string str = function ; - //strncpy_s ( output, outputSize, ( "Input Was: " + str ). c_str ( ), _TRUNCATE ) ; - //} - ////--- name callExtension [function, args] - //int __stdcall RVExtensionArgs ( char * output, int outputSize, const char * function, const char ** args, int argsCnt ) - //{ - //if ( strcmp ( function, "fnc1" ) == 0 ) - //{ - ////--- Manually assemble output array - //int i = 0 ; - //std :: string str = "[" ; - ////--- Each argument can be accessed via args[n] - //if ( argsCnt 0 ) - //str + = args [ i ++ ] ; - //while ( i argsCnt ) - //{ - //str + = "," ; - //str + = args [ i ++ ] ; - //} - //str + = "]" ; - ////--- Extension result - //strncpy_s ( output, outputSize, str. c_str ( ), _TRUNCATE ) ; - ////--- Extension return code - //return 100 ; - //} - //else if ( strcmp ( function, "fnc2" ) == 0 ) - //{ - ////--- Parse args into vector - //std :: vector std :: string vec ( args, std :: next ( args, argsCnt ) ) ; - //std :: ostringstream oss ; - //if ( ! vec. empty ( ) ) - //{ - ////--- Assemble output array - //std :: copy ( vec. begin ( ), vec. end ( ) - 1, std :: ostream_iterator std :: string ( oss, "," ) ) ; - //oss vec. back ( ) ; - //} - ////--- Extension result - //strncpy_s ( output, outputSize, ( "[" + oss. str ( ) + "]" ). c_str ( ), _TRUNCATE ) ; - ////--- Extension return code - //return 200 ; - //} - //else - //{ - //strncpy_s ( output, outputSize, "Avaliable Functions: fnc1, fnc2", outputSize - 1 ) ; - //return - 1 ; - //} - //}$/Code$ + $Code$_cloudLevel = overcast$/Code$ undefined / undefined @@ -7140,415 +7607,376 @@ - String - Array + Number + - call + copyToClipboard - Executes given set of compiled instructions with an option to pass arguments to the executed Code. In OFP this command used to accept String for the code. + Copy text string to the clipboard. + In MP available only on the client that is server - https://community.bistudio.com/wiki/call + https://community.bistudio.com/wiki/copyToClipboard - call Code - - Anything call Code + copyToClipboard String - call code - - args call code + copyToClipboard text - $Code$call { hint str 123};$/Code$ - - $Code$123 call { hint str _this};$/Code$ - - $Code$_sum = [1, 2] call {(_this select 0) + (_this select 1)}; - hint str _sum; //3$/Code$ - - $Code$123 call compile " hint str _this";$/Code$ - - $Code$_result = 123 call compile preprocessFileLineNumbers "myfile.sqf";$/Code$ + $Code$copyToClipboard str _data;$/Code$ undefined / undefined - (July 5, 2014) - A called function may only use suspension ( sleep, uiSleep, waitUntil ) if it originates in a scheduled environment. If the called function originates in a non-scheduled environment it will return a generic error. - $Code$// *** non-scheduled origin *** - [] spawn { - // *** scheduled scope *** - [] call { - // *** scheduled scope *** - sleep 3; // - OK - hintSilent "Hello World!"; - }; - }; - $/Code$ - $Code$// *** non-scheduled origin *** - [] call { - // *** non-scheduled scope*** - [] call { - // *** non-scheduled scope *** - sleep 3; // - NOT OK - hintSilent "Hello World!"; - }; - }; - $/Code$ - $Code$// *** scheduled origin *** - [] spawn { - // *** scheduled scope *** - [] call { - // *** scheduled scope *** - sleep 3; // - OK - hintSilent "Hello World!"; - }; - }; - $/Code$ - $Code$// *** scheduled origin *** - [] call { - // *** scheduled scope*** - [] call { - // *** scheduled scope *** - sleep 3; // - OK - hintSilent "Hello World!"; - }; - }; + (October 12, 2014) + To add a line break in output text do this: + $Code$_br = toString [13,10];//(carriage return & line feed) + _string = "Line 1" + _br + "Line 2"; + copyToClipboard _string; $/Code$ - - (February 17, 2015) - If the code is in non-scheduled scope and contains while-do statement, the code runs only 10,000 times at the maximum, even if the statement makes infinite loop. (ARMA3 Ver. 1.38.128937) - $Code$// *** non-scheduled origin *** - [] call { - // *** non-scheduled scope*** - [] call { - // *** non-scheduled scope *** - _a=0; - while{_a 15000} do{ - _a=_a+1; - }; - hint str(_a);//10000 - }; - };$/Code$ + Paste into text editor of choice, you get: + $Code$Line 1 + Line 2$/Code$ + (A3 1.30 Stable executed inside.sqf via execVM ) - Anything - Anything + Nothing + - camCommand + cos - Executes a command on the given camera / actor object. Known commands for: - All camera types - "manual on", "manual off" - "camera" - "inertia on", "inertia off" - "seagull" - "landed", "airborne" - When you execute camCommand "landed" on a flying seagull, it will land and sit on the floor until you call camCommand "airborne". The camCommand changes are conducted immediately, the command doesn't wait for camCommit. + Cosine of a number, argument in degrees. - https://community.bistudio.com/wiki/camCommand + https://community.bistudio.com/wiki/cos - Object camCommand String + cos Number - camera camCommand command + cos x - $Code$_camera camCommand "manual on";$/Code$ + $Code$cos 60;//returns 0.5$/Code$ - local / local + undefined / undefined - (May 23, 2017) - In Arma 3 with the addition of the curator camera type, the following commands are supported: - $Code$_camera = "CamCurator" camCreate [0,0,0]; - _camera camCommand "maxPitch 89"; - _camera camCommand "minPitch -89"; - _camera camCommand "speedDefault 0.1"; - _camera camCommand "speedMax 2"; - _camera camCommand "ceilingHeight 5000"; - _camera camCommand "atl off"; - _camera camCommand "surfaceSpeed off"; - $/Code$ + (August 8, 2006) + Be aware that there might be rounding errors in the results of this command. + cos 90 + for example doesn't return the expected '0', but '-4.37114e-008'. So, if you want to compare results of Cosinus, don't use the compare operator + (cos 90)==0 + but rather use less than. + (cos 90) 0.00001 - Nothing + Number + - camCommitPrepared + fuel - Smoothly conduct the changes that were assigned to a camera within the given time. If the time is set to zero, the changes are done immediately. + Checks how much fuel is left in the gas tank of a vehicle. - https://community.bistudio.com/wiki/camCommitPrepared + https://community.bistudio.com/wiki/fuel - Object camCommitPrepared Number + fuel Object - camera camCommitPrepared time + fuel vehicle - $Code$//create a camera object - _cam = "camera" camCreate [5600,4800,10]; - _cam camPrepareTarget player ; - _cam cameraEffect ["internal", "BACK"]; - _cam camCommitPrepared 0; - //smoothly move the camera to its new position in 6 seconds. - _cam camPreparePos [5680,4720,20]; - _cam camCommitPrepared 6; - waitUntil { camCommitted _cam}; - //proceed$/Code$ + $Code$if ( fuel vehicle player == 0) then { hint "The vehicle is out of fuel!"};$/Code$ - local / local + global / undefined + Vehicles refuelled in game with the Fuel trucks e.t.c never get completely refuelled. After refuelling, rather than returning a value of 1 when the fuel command is called. They return a value greater than 0.98 and less than 1. - Nothing + Number + - camCommitted + setDetailMapBlendPars - Checks if the conduction of the last camCommit call already finished. + Sets the detail texture map blend pars. Allows for smooth transition between detailed and undetailed terrain texture at distance. If noDetail fullDetail, the texture detail will incur smooth transition in the area between the thresholds. If noDetail = fullDetail there will be obvious visible edge between texture detail changes at fullDetail distance. - https://community.bistudio.com/wiki/camCommitted + https://community.bistudio.com/wiki/setDetailMapBlendPars - camCommitted Object + setDetailMapBlendPars Array - camCommitted camera + setDetailMapBlendPars [fullDetail, noDetail] - $Code$// SQS: - ; create a camera object - _cam = "camera" camCreate [5600,4800,10] - _cam camSetTarget player - _cam cameraEffect ["internal", "BACK"] - _cam camCommit 0 - ; smoothly move the camera to its new position in 6 seconds - _cam camSetPos [5680,4720,20] - _cam camCommit 6 - @ camCommitted _cam - ; proceed$/Code$ + $Code$setDetailMapBlendPars [20, 50];$/Code$ + + $Code$setDetailMapBlendPars ( if ( currentWeapon player in [ + "Binocular", + "Rangefinder", + "Laserdesignator" + ]) then [ + {[300,600]}, + {[20,50]} + ]);$/Code$ - undefined / undefined + undefined / local - Boolean + Nothing + - camCommit + setFSMVariable - Smoothly conduct the changes that were assigned to a camera within the given time. If the time is set to zero, the changes are done immediately. + Set variable to given value in the variable space of given FSM. + The FSM handle is the number returned by the execFSM command. - https://community.bistudio.com/wiki/camCommit + https://community.bistudio.com/wiki/setFSMVariable - Object camCommit Number + Number setFSMVariable Array - camera camCommit time + handle setFSMVariable [name, value] - $Code$// SQS - ; create a camera object - _cam = "camera" camCreate [5600,4800,10] - _cam camSetTarget player - _cam cameraEffect ["internal", "BACK"] - _cam camCommit 0 - ; smoothly move the camera to its new position in 6 seconds - _cam camSetPos [5680,4720,20] - _cam camCommit 6 - @ camCommitted _cam - ; proceed$/Code$ - - $Code$// SQF - private "_cam"; - comment "create a camera object"; - _cam = "camera" camCreate [ position player select 0, position player select 1, 2]; - _cam camSetTarget player ; - _cam cameraEffect ["internal", "BACK"]; - _cam camCommit 0; - comment "smoothly move the camera to its new position in 6 seconds"; - _cam camSetPos [ position player select 0, ( position player select 1) + 10, 20]; - _cam camCommit 6; - waitUntil { camCommitted _cam; };$/Code$ + $Code$_handle = execFSM "test.fsm"; + _handle setFSMVariable ["_foo", 23]; + + // sets variable _foo in the FSM to 23$/Code$ - local / local + undefined / undefined + (March 23, 2014) + If the variable is not yet defined within the FSM it will be created. - Nothing + Nothing + - camConstuctionSetParams + isAutonomous - Sets construction camera parameters. To work with "camconstruct" object. + Returns true if UAV is in autonomous mode. - https://community.bistudio.com/wiki/camConstuctionSetParams + https://community.bistudio.com/wiki/isAutonomous - Object camConstuctionSetParams Array + isAutonomous Object - camera camConstuctionSetParams [[x,y,z], radius, maxAboveLand] + isAutonomous uav - $Code$_camera camConstuctionSetParams [ getPos player, 50, 20];$/Code$ + $Code$bool = isAutonomous uav;$/Code$ - undefined / undefined + global / undefined - Nothing + Boolean + - camCreate + airplaneThrottle - Create a camera or a seagull object on the given position. Also other objects can be created this way, but vehicles created with camCreate cannot be entered. Any units created with camCreate will remain static. Differently to createVehicle, objects are created without consideration of the collision detection with surrounding objects, thus the objects are spawned exactly at the given position. camCreate is conducted immediately, the command doesn't wait for camCommit. + Returns throttle position. Works only on player's vehicle. - https://community.bistudio.com/wiki/camCreate + https://community.bistudio.com/wiki/airplaneThrottle - String camCreate Array + airplaneThrottle Object - type camCreate position + airplaneThrottle airplane - $Code$_cam = "camera" camCreate ( position player )$/Code$ + $Code$_trottle = airplaneThrottle myPlane$/Code$ - undefined / local + undefined / undefined - (August 3, 2006) - Notes from before the conversion: - (CWR 1.91) createVehicle is a valid replacement (with special consideration to locality). - You can also use camCreate to create objects. - $Code$flare1 = "flare" camCreate getPos gameLogic_1$/Code$ - However, soldier units created in this way have little or no AI. - Object + Number + - camDestroy + setPylonLoadOut - Destroy an object created with camCreate. camDestroy is conducted immediately, the command doesn't wait for camCommit. - NOTE: Destroying camera object does not terminate camera effect automatically. + Will add missile to vehicle pylon, TransportPylonsComponent in config is required - https://community.bistudio.com/wiki/camDestroy + https://community.bistudio.com/wiki/setPylonLoadOut - camDestroy Object + Object setPylonLoadOut Array - camDestroy object + vehicle setPylonLoadOut [pylon nameindex, magazine name, forced, turret] - $Code$camDestroy _cam;$/Code$ - - $Code$_cam cameraEffect ["terminate","back"]; - camDestroy _cam;$/Code$ + $Code$( vehicle player ) setPylonLoadOut ["pylon1", ""];$/Code$ - local / local + undefined / undefined - Nothing + Boolean + - camPreloaded + logEntities - Checks whether the camera has finished preloading. + Creates a log file containing the list of all game entities in scene. + File is created in the same directory as.rpt file. + Special: BattlEye's RCON variant of this command is #logEntities (see also Multiplayer_Server_Commands ) - https://community.bistudio.com/wiki/camPreloaded + https://community.bistudio.com/wiki/logEntities - camPreloaded Object + logEntities - camPreloaded camera + logEntities - $Code$?(camPreloaded _camera) : exit$/Code$ + $Code$logEntities ;$/Code$ undefined / undefined + File name example: + logEntities_4688_12-04-2014_12-19-39.log + File content example: + ====================== Vehicles ======================= + Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:1, Out: 0, NetID:2:3, Pos: [2476.243896][73.782043], N:B_Soldier_F + Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2471.500977][62.477680], N:Snake_random_F + Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2489.192383][73.935181], N:Snake_random_F + Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2487.953857][73.828362], N:Snake_random_F + Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2800.174805][96.234093], N:Rabbit_F + Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2825.378418][2.068635], N:Rabbit_F + Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2888.919434][6.837101], N:Rabbit_F + Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2910.756104][16.089361], N:Rabbit_F + Loc:0, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 1, AnyPl:0, Out: 0, NetID:2:0, Pos: [9.000000][9.000000], N:Logic + Total objects: 9 + Statistics objects: 9 + IsLocal: 8 + IsMarkedToDelete: 0 + IsDestroyed: 0 + IsDamageDestroyed: 0 + IsDamageDead: 0 + IsNotSimulated: 9 + IsVisible: 1 + IsAnyPlayer: 1 + IsOutsideMap: 0 + =================== Slow vehicles ===================== + Total objects: 214 + Statistics objects: 0 + Static objects are accounted in total object count but not included in statistics + IsLocal: 0 + IsMarkedToDelete: 0 + IsDestroyed: 0 + IsDamageDestroyed: 0 + IsDamageDead: 0 + IsNotSimulated: 0 + IsVisible: 0 + IsAnyPlayer: 0 + IsOutsideMap: 0 + =================== Out vehicles ==================== + Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:2:1, Pos: [2476.243896][73.782043], N:Supply40 + Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:2:2, Pos: [2476.243896][73.782043], N:Supply140 + Total objects: 2 + Statistics objects: 2 + IsLocal: 2 + IsMarkedToDelete: 0 + IsDestroyed: 0 + IsDamageDestroyed: 0 + IsDamageDead: 0 + IsNotSimulated: 2 + IsVisible: 0 + IsAnyPlayer: 0 + IsOutsideMap: 0 - Boolean + Nothing + - camPreload + radioVolume - Preload the scene for the prepared camera. Time gives timeout, zero means no (infinite) timeout. + Checks the current radio volume (set by fadeRadio ). - https://community.bistudio.com/wiki/camPreload + https://community.bistudio.com/wiki/radioVolume - Object camPreload Number + radioVolume - camera camPreload time + radioVolume - $Code$_camera camPreload 5$/Code$ + $Code$_volume = radioVolume;$/Code$ undefined / undefined @@ -7556,57 +7984,59 @@ - Nothing + Number + - camPrepareBank + unlinkItem - Prepares the camera bank angle. - This command is non-functional ! + Unassign and delete existing item from its assigned slot. If item does not exist or is not in the assigned slot, command simply fails. - https://community.bistudio.com/wiki/camPrepareBank + https://community.bistudio.com/wiki/unlinkItem - Object camPrepareBank Number + Object unlinkItem String - camera camPrepareBank bank + unit unlinkItem item - $Code$_camera camPrepareBank -0.1$/Code$ + $Code$bluforUnit unlinkItem "NVGoggles"; + opforUnit unlinkItem "NVGoggles_OPFOR"; + independentUnit unlinkItem "NVGoggles_INDEP";$/Code$ - undefined / undefined + global / global - Nothing + Nothing + - camPrepareDir + members - Prepares the camera heading. - This command is non-functional ! + Return a list of members in given team. - https://community.bistudio.com/wiki/camPrepareDir + https://community.bistudio.com/wiki/members - Object camPrepareDir Number + members Team_Member - camera camPrepareDir direction + members team - $Code$_camera camPrepareDir 150$/Code$ + $Code$_members = members _team$/Code$ undefined / undefined @@ -7614,28 +8044,34 @@ - Nothing + Array + - camPrepareDive + west - Prepares the camera dive angle. - This command is non-functional ! + West side. - https://community.bistudio.com/wiki/camPrepareDive + https://community.bistudio.com/wiki/west - Object camPrepareDive Number + west - camera camPrepareDive dive + west - $Code$_camera camPrepareDive -0.1$/Code$ + $Code$// SQS: + ?((side _unit) == west ) : hint "This is a western unit!"$/Code$ + + $Code$// SQF: + if (( side _unit) == west ) then { + hint "This is a western unit!"; + };$/Code$ undefined / undefined @@ -7643,28 +8079,42 @@ - Nothing + Side + - camPrepareFocus + nearestLocations - focusRange is in format [distance,blur]. Prepares the camera focus blur. - [-1,1] will reset default values (auto focusing), [-1,-1] will disable postprocessing (all is focused). + Returns an array of locations of chosen type(s) within the given radius of the given position, sorted from nearest to farthest. - https://community.bistudio.com/wiki/camPrepareFocus + https://community.bistudio.com/wiki/nearestLocations - Object camPrepareFocus Array + nearestLocations Array - camera camPrepareFocus focusRange + nearestLocations [position, [locationType,], radius, sortPosition] - $Code$_camera camPrepareFocus [50, 1]$/Code$ + $Code$_nearbyLocations = nearestLocations [ position player, ["RockArea","VegetationFir"], 100];$/Code$ + + $Code$// Find any of nearest locations: + allLocationTypes = []; + "allLocationTypes pushBack configName _x" configClasses ( + configFile "CfgLocationTypes" + ); + { + systemChat format [ + "%1 (%2) - %3m", + _x, + text _x, + position player distance _x + ]; + } forEach nearestLocations [ player, allLocationTypes, 500];$/Code$ undefined / undefined @@ -7672,28 +8122,28 @@ - Nothing + Array + - camPrepareFovRange + shownHUD - Prepares the camera field of view range for auto zooming. - This command is non-functional ! + Returns array of Booleans corresponding to the visibility of various HUD elements (see extended showHUD ). - https://community.bistudio.com/wiki/camPrepareFovRange + https://community.bistudio.com/wiki/shownHUD - Object camPrepareFovRange Array + shownHUD - camera camPrepareFovRange fovRange + shownHUD - $Code$_camera camPrepareFovRange [0.1, 0.5]$/Code$ + $Code$_hudStatus = shownHUD ;$/Code$ undefined / undefined @@ -7701,27 +8151,32 @@ - Nothing + Array + - camPrepareFov + sliderSpeed - Prepares the camera field of view (zoom). The default zoom level is 0.75, 0.01 is the nearest and 2 the furthest zoom value. The angle of the field of view is atan(FOV)*2 radians when in 4:3 aspect ratio. Needs the call of camCommitPrepared to be conducted. + Return speed, as an Array [min, max] of slider idc of topmost user dialog. - https://community.bistudio.com/wiki/camPrepareFov + https://community.bistudio.com/wiki/sliderSpeed - Object camPrepareFov Number + sliderSpeed Number + + sliderSpeed Control - camera camPrepareFov fieldOfView + sliderSpeed idc + + sliderSpeed control - $Code$_camera camPrepareFov 0.1$/Code$ + $Code$_slidespeed1 = sliderSpeed 105;$/Code$ undefined / undefined @@ -7729,27 +8184,29 @@ - Nothing + Array - Array + - camPreparePos + add3DENEventHandler - Prepares the camera position (format Position ). + Add code to be run when a Eden Editor event is triggered. + See the list of all Eden Editor Event Handlers. - https://community.bistudio.com/wiki/camPreparePos + https://community.bistudio.com/wiki/add3DENEventHandler - Object camPreparePos Array + add3DENEventHandler Array - camera camPreparePos position + add3DENEventHandler [type,code] - $Code$_camera camPreparePos getPos player$/Code$ + $Code$eh = add3DENEventHandler ["onUndo",{ systemChat "Zip..."}];$/Code$ undefined / undefined @@ -7757,27 +8214,29 @@ - Nothing + Number + - camPrepareRelPos + emptyPositions - Prepares the camera position relative to the current position of the currect target (see camPrepareTarget ). + Returns the number of given positions in the vehicle. + Positions can be "Commander", "Driver", "Gunner" or "Cargo" - https://community.bistudio.com/wiki/camPrepareRelPos + https://community.bistudio.com/wiki/emptyPositions - Object camPrepareRelPos Array + Object emptyPositions String - camera camPrepareRelPos position + vehicle emptyPositions position - $Code$_camera camPrepareRelPos [10,5,-2]$/Code$ + $Code$_freeCargoPositions = vehicle player emptyPositions "cargo";$/Code$ undefined / undefined @@ -7785,165 +8244,164 @@ - Nothing + Number + - camPrepareTarget + assignItem - Prepares the camera target to a position or to a target. + Assigns existing item from inventory (uniform, vest, backpack) to a correct slot. If the slot is occupied by another item, it gets replaced. - https://community.bistudio.com/wiki/camPrepareTarget + https://community.bistudio.com/wiki/assignItem - Object camPrepareTarget Array - - Object camPrepareTarget Object + Object assignItem String - camera camPrepareTarget position - - camera camPrepareTarget target + unit assignItem item - $Code$_camera camPrepareTarget getPos player$/Code$ - - $Code$_camera camPrepareTarget player$/Code$ + $Code$bluforUnit addItem "NVGoggles"; + bluforUnit assignItem "NVGoggles"; + opforUnit addItem "NVGoggles_OPFOR"; + opforUnit assignItem "NVGoggles_OPFOR"; + independentUnit addItem "NVGoggles_INDEP"; + independentUnit assignItem "NVGoggles_INDEP";$/Code$ - undefined / undefined + global / global - Nothing - Nothing + Nothing + - camSetBank + tvSetColor - Sets camera bank angle. Does not commit changes. - This command is non-functional ! + Sets text color on given Tree View Item - https://community.bistudio.com/wiki/camSetBank + https://community.bistudio.com/wiki/tvSetColor - Object camSetBank Number + tvSetColor Array + + Control tvSetColor Array - camera camSetBank bank + tvSetColor [idc, path, color] + + control tvSetColor [path, color] - $Code$_camera camSetBank -0.1$/Code$ + $Code$tvSetColor [101, [0,0], [1,0,0,1]];$/Code$ + + $Code$_ctrl tvSetColor [[0,0], [1,0,0,1]];$/Code$ undefined / undefined - (Apr 15, 2010) - Command is non-functional. Instead, use fn vbs setPitchBank in VBS2, or setVectorUp or this user function in Arma. - Nothing + Nothing - Nothing + - camSetDir + waypointScript - Sets the orientation of the given camera in the direction of the given vector. Needs camCommit. + Gets the waypoint script. - https://community.bistudio.com/wiki/camSetDir + https://community.bistudio.com/wiki/waypointScript - Object camSetDir Array + waypointScript Array - camera camSetDir direction + waypointScript waypoint - $Code$pos1 = player modelToWorld [0,5,5]; - cam = "camera" camCreate pos1; - cam cameraEffect ["INTERNAL", "BACK"]; - pos2 = player modelToWorld [0,50,50]; - cam camSetPos pos2; - cam camSetDir (pos2 vectorFromTo pos1); - cam camCommit 5; - 0 = [] spawn - { - waitUntil { camCommitted cam}; - cam camSetPos pos1; - cam camCommit 5; - };$/Code$ + $Code$waypointScript [groupOne,1]$/Code$ - local / local + undefined / undefined - (May 9, 2016) - cameraEffect "INTERNAL" works better than "EXTERNAL" with this command. - Nothing + String + - camSetDive + globalChat - Sets camera dive angle. Does not commit changes. - This command is non-functional ! + Types text to the global radio channel. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) - https://community.bistudio.com/wiki/camSetDive + https://community.bistudio.com/wiki/globalChat - Object camSetDive Number + Object globalChat String - camera camSetDive dive + unitName globalChat chatText - $Code$_camera camSetDive -0.1$/Code$ + $Code$_soldierOne globalChat "Show this text";$/Code$ + + $Code$driver vehicle player sideChat "sideChat"; + driver vehicle player globalChat "globalChat"; + driver vehicle player groupChat "groupChat"; + vehicle player vehicleChat "vehicleChat"; + driver vehicle player commandChat "commandChat"; + driver vehicle player customChat [1, "customChat"]; + systemChat "systemChat";$/Code$ - undefined / undefined + global / local - (Apr 15, 2010) - Command is non-functional. Instead, use fn vbs setPitchBank in VBS2, or setVectorUp or this user function in Arma. + In OFP 1.96, this command can be used by a Game_Logic unit, which will result in the text being displayed on screen without any indication of the side of radio source, or quotation marks. For example : gamelogic1 globalchat "hello world" will create the text hello world in the radio log. - Nothing + Nothing + - camSetFocus + ctrlParent - Sets camera focus range in format [distance, blur]. blur param - sets the camera focus blur. It does not automatically commit changes (see camCommit ). Use [-1, -1] to disable focus completely. + Returns container of the given control. - https://community.bistudio.com/wiki/camSetFocus + https://community.bistudio.com/wiki/ctrlParent - Object camSetFocus Array + ctrlParent Control - camera camSetFocus focusRange + ctrlParent controlName - $Code$_camera camSetFocus [50, 1];$/Code$ + $Code$_display = ctrlParent _control$/Code$ undefined / undefined @@ -7951,223 +8409,397 @@ - Nothing + Display + - camSetFovRange + setNameSound - Set the zoom level ( F ield O f V iew) start and end values for automatical zooming. - The default zoom level is 0.7 where 0 is the nearest and 1 is the most far zoom value. - This command is non-functional ! + Sets the nameSound of a person. By default, when giving orders, the units are addressed by their number. When nameSound is set, it will be used instead to address the unit. For example: "Two, hold fire!", one can have: "Miller, hold fire!" - https://community.bistudio.com/wiki/camSetFovRange + https://community.bistudio.com/wiki/setNameSound - Object camSetFovRange Array + Object setNameSound String - camera camSetFovRange fovRange + person setNameSound name - $Code$_cam camSetFovRange [0.1, 0.7];$/Code$ + $Code$unit1 setNameSound "dixon";$/Code$ + + $Code$unit1 setNameSound ""; // will reset to default behaviour$/Code$ + + $Code$_name = "Masood"; + unit1 setNameSound _name; + unit1 setName _name;$/Code$ - local / local + undefined / undefined + (September 19, 2013) + nameSound can be any preset BIS recorded name value. By default units will be called out in voice by their number. By using nameSound you can call them out by name using the following values: + Default: + Armstrong + Nichols + Tanny + Frost + Lacey + Larkin + Kerry + Jackson + Miller + McKendrick + Levine + Reynolds + BLUFOR: + Adams + Bennett + Campbell + Dixon + Everett + Franklin + Givens + Hawkins + Lopez + Martinez + OConnor + Ryan + Patterson + Sykes + Taylor + Walker + OPFOR: + Amin + Masood + Fahim + Habibi + Kushan + Jawadi + Nazari + Siddiqi + Takhtar + Wardak + Yousuf + INDEPENDENT: + Anthis + Costa + Dimitirou + Elias + Gekas + Kouris + Leventis + Markos + Nikas + Nicolo + Panas + Petros + Rosi + Samaras + Stavrou + Thanos + Vega + CODE NAMES: + Ghost + Stranger + Fox + Snake + Razer + Jester + Nomad + Viper + Korneedler + + (December 22, 2013) + setting an incorrect value like "0" or "randomString" will remove the callsign (" /* 2, */ fall back") + + (April 25, 2015) + While kylania listed available names, you can use any word you want. Available words for english can be found in configfile "RadioProtocolENG" "Words". - Nothing + Nothing + - camSetFov + disableAI - Set the zoom level ( F ield O f V iew) of the given camera. - The zoom level is from 0.01 for the nearest and 2 for the furthest zoom value, with a default zoom level of 0.75 - The angle of the field of view is atan(FOV)*2 radians when in 4:3 aspect ratio. + Disable parts of the AI behaviour to get a better control over the actions of a unit. Must be executed where AI unit is local. If unit changes locality, it might need to be executed again at the new locality to maintain effect. + Possible values are: + "TARGET" - stop the unit to watch the assigned target / group commander may not assign targets + "AUTOTARGET" - prevent the unit from assigning a target independently and watching unknown objects / no automatic target selection + "MOVE" - disable the AI's movement / do not move + "ANIM" - disable ability of AI to change animation. Available only since ArmA: Cold War Assault (OFP 1.99). + "TEAMSWITCH" - AI disabled because of Team Switch + "FSM" - disable the execution of AI behavior scripts. Available only since Operation Arrowhead v1.60. + "WEAPONAIM" - no weapon aiming + "AIMINGERROR" - prevents AI's aiming from being distracted by its shooting, moving, turning, reloading, hit, injury, fatigue, suppression or concealed/lost target Available only since Arma 3 v1.42. + "SUPPRESSION" - prevents AI from being suppressed Available only since Arma 3 v1.42. + "CHECKVISIBLE" - disables visibility raycasts Available only since Arma 3 v1.54. + "COVER" - disables usage of cover positions by the AI Available only since Arma 3 v1.56. + "AUTOCOMBAT" - disables autonomous switching to COMBAT when in danger Available only since Arma 3 v1.56. + "PATH" - stops the AI’s movement but not the target alignment Available only since Arma 3 v1.61. + "MINEDETECTION" - disable Ai mine detection. + "ALL" - all of the above Available since Arma 3 v1.65 + Note: In OFP there is no way to undo this command. - https://community.bistudio.com/wiki/camSetFov + https://community.bistudio.com/wiki/disableAI - Object camSetFov Number + Object disableAI String - camera camSetFov level + unitName disableAI section - $Code$_cam camSetFov 0.75;$/Code$ + $Code$_soldier1 disableAI "AUTOTARGET";$/Code$ - local / local + local / global + (26.9.2013) + After substantial testing in ArmA3 1.01, the AI sections are as follows: + MOVE: disabling this will stop units from turning and moving. Units will still change stance and fire at the enemy if the enemy happens to walk right in front of the barrel. Unit will watch enemies that are in their line of sight, but won't turn their bodies to face the enemy, only their head. Works for grouped units as well. Good for staging units and holding them completely still. Movement can't be controlled by a script either, you have to re-enable movement for that. Unit will still be able to aim within his cone of fire. + AUTOTARGET: Essentially makes single units without a group, "deaf". The unit still goes prone and combat ready if he hears gunfire. They won't turn around when gunfire comes from the behind, but if an enemy walks in front they will target the enemy and fire as normal. WON'T WORK FOR GROUPED UNITS WITH A LEADER, the leader will assign targets to the units and effectively enables the AI back on. + TARGET: Will prevent units from engaging the target. Units still move around for cover etc...but won't hunt down the player. Works in groups as well. Excellent for keeping units inside bases or other areas without having them flank or engage anyone. They will still seek good cover if something is close by. + ANIM: completely freezes the unit, including breathing. Won't even blink. No move command works until the unit is unfrozen. + FSM: Essentially makes the enemy "dumber". Enemies react slower to enemy fire and the enemy stops using hand signals. Disabling FSM, can give the impression of untrained units as they react slower and are more disorganized than when FSM is enabled. Good for rebel fighters and when enabled better for professional armies. + + (August 3, 2006) + Notes from before the conversion: + The "TARGET" section of the AI is likely different than what you would think. Normally, when an AI group is standing still and sees an enemy, the group will break formation and start moving towards the enemy. If you disable the "TARGET" AI, then the AI units will stay where they are at. Even if you disable the "MOVE" AI, the units will still move out to attack the enemy, unless you disable the "TARGET" AI. Disabling both these AI sections is useful when placing units in defensive positions. This way, you can have them stay behind their cover, and not run out into the open. + This command has also a bug: after mission save or load the effect will be no longer active and you must set it again. It's also good way to detect number of saves and loads (loads can be recognized using time command). + + (Feb 7, 2009) + Multiplayer Use as of ArmA v1.14: + Contrary to the post above, using this command WILL disable A.I. movement ability if used with the "MOVE" parameter. Works even when the A.I. is grouped with other units. I use this command to set up stationary targets at objectives all the time. Works on a dedicated server. + + (September 19, 2015) + Beware that disabling "TARGET" AI to units in the player's group will disable the ability to execute engage orders issued by the player. + + (August 24, 2016) + As of version 1.65 dev., disableAI "MOVE" will also stop vehicles driven by AI. + + (September 26, 2016) + Command is buggy in version 1.64.138497 as it disables the ability to drive vehicles for players. Tested with $Code$player disableAI "move"$/Code$. Entering a vehicle is possible, but not starting the engine. $Code$player enableAI "move"$/Code$ enables the player to drive again. + Already in the feedback tracker: https://feedback.bistudio.com/T120346 + + (Januaary 21, 2017) + Does not lower CPU usage of still AI without enemies in range - Nothing + Nothing + - camSetPos + onGroupIconClick - Sets the position of the given camera or seagull (see camCreate ). It is worth mentioning that camera position can also be set with setPos, in which case it would be instant. With camSetPos it is possible to make smooth position transition in time, defined with camCommit, which is required in this case. + Defines an action performed when player clicked on group marker (3D or in a map). The code executed once. This EH, unlike onGroupIconOverEnter and onGroupIconOverLeave, has one more param which returns 1 if RMB was pressed, 0 otherwise. + i + Since Arma 3 v1.57 a stackable version of this EH is available: GroupIconClick - https://community.bistudio.com/wiki/camSetPos + https://community.bistudio.com/wiki/onGroupIconClick - Object camSetPos Array + onGroupIconClick String/Code - camera camSetPos position + onGroupIconClick command - $Code$_cam camSetPos [2300,1000,130]; - _cam camCommit 10;$/Code$ + $Code$onGroupIconClick + { + // Passed values for _this are: + _is3D = _this select 0; + _group = _this select 1; + _wpID = _this select 2; + _RMB = _this select 3; + _posx = _this select 4; + _posy = _this select 5; + _shift = _this select 6; + _ctrl = _this select 7; + _alt = _this select 8; + _message = format ["____ Info ____"]; + {_message = _message + format ["\n %1",_x]} forEach _this; + hint _message; + }$/Code$ - local / local + undefined / undefined - Nothing + Nothing + - camSetRelPos + diag_log - Sets the position of the given camera relative to its target, set with camSetTarget. Needs a call to camCommit to be conducted. Note, that since it sets relative position to the target, the camSetTarget command should be executed already, before camSetRelPos. + Dumps the argument's value to the report file. Each call creates a new line in the file. - https://community.bistudio.com/wiki/camSetRelPos + https://community.bistudio.com/wiki/diag_log - Object camSetRelPos Array + diag_log Anything - camera camSetRelPos position + diag_log anything - $Code$_cam camSetTarget _car; - _cam camSetRelPos [0,10,8];$/Code$ + $Code$diag_log time ;$/Code$ + + $Code$diag_log format ["%1, %2", player, time ];$/Code$ + + $Code$_arr = [1, "foo", player, "bar"]; + { + diag_log _x ; + } forEach _arr; // Creates 4 entries on 4 lines$/Code$ + + $Code$_arr = [1, "foo", player, "bar"]; + diag_log _arr; + // Creates one entry of e.g. [1,"foo",B Alpha 1-1:1 (Player Name),"bar"]$/Code$ - local / local + undefined / undefined - The location of the camera will depend on the direction the target object is facing. - The camera does not bank with the target (bug?). + To dump a string without "" use text. + Posted 23:35, 19 April 2011 + + in patch 1.59 there is a limit of 1044 characters to be printed, no error or crash but diag_log line will simply end at character number 1044. - Nothing + Nothing + - camSetTarget + tvData - Set the target object or position where the given camera should point at. Needs the call of camCommit to be conducted. + Returns string data from item on given path. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/camSetTarget + https://community.bistudio.com/wiki/tvData - Object camSetTarget Object + tvData Array - Object camSetTarget Array + Control tvData Array - camera camSetTarget target + tvData [idc, [path]] - camera camSetTarget position + control tvData [path] - $Code$_camera camSetTarget player ;$/Code$ - - $Code$_camera camSetTarget [2540,1503,26];$/Code$ + $Code$tvData [101, [0]];$/Code$ - $Code$_cam = "camera" camCreate ( player modelToWorld [0,100,10]); - _cam camSetTarget player ; - _cam camSetRelPos [0, 0.5, 1.5]; - _cam cameraEffect ["internal", "back"]; - _cam camCommit 1; - player setRandomLip true ;$/Code$ + $Code$(_display displayCtrl 101) tvData [0];$/Code$ local / local + (Sep 11 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Nothing - Nothing + String - String + - camTarget + setSimpleTaskDestination - Returns camera's target. + Attach a destination to the simple task. Overrides setSimpleTaskTarget - https://community.bistudio.com/wiki/camTarget + https://community.bistudio.com/wiki/setSimpleTaskDestination - camTarget Object + Task setSimpleTaskDestination Array - camTarget camera + task setSimpleTaskDestination pos - + $Code$_tskGoHere setSimpleTaskDestination ( getMarkerPos "obj1");$/Code$ + undefined / undefined - Object + Nothing + - camUseNVG + shownArtilleryComputer - Set / clear using of night vision during cutscenes. This command only works with camCreate created camera that is currently the main camera for the player (see example). + Checks whether the player has the artillery computer currently open. - https://community.bistudio.com/wiki/camUseNVG + https://community.bistudio.com/wiki/shownArtilleryComputer - camUseNVG Boolean + shownArtilleryComputer - camUseNVG set + shownArtilleryComputer - $Code$camUseNVG true ;$/Code$ - - $Code$setDate [2000,12,31,0,0]; - _cam = "camera" camCreate [0,0,0]; - _cam camSetTarget player ; - _cam camSetRelPos [0,-5,3]; - _cam cameraEffect ["Internal","Back"]; - _cam camCommit 0; - camUseNVG true ;$/Code$ + $Code$if ( shownArtilleryComputer ) then { hint "Artillery Computer shown on screen"; };$/Code$ undefined / undefined @@ -8175,236 +8807,307 @@ - Nothing + Boolean + - cameraEffectEnableHUD + kbTell - Enable / disable showing of in-game UI during currently active camera effect. + Make the person tell to the receiver the sentence. See Conversations for more details. - https://community.bistudio.com/wiki/cameraEffectEnableHUD + https://community.bistudio.com/wiki/kbTell - cameraEffectEnableHUD Boolean + Object kbTell Array - cameraEffectEnableHUD enable + person kbTell [receiver, topicName, sentenceClass, [argumentName, argumentValue, argumentText, argumentSpeech], , forceRadio] - $Code$cameraEffectEnableHUD true ;$/Code$ + $Code$// In Config file + class CfgIdentities + { + class SSMHQ + { + name = $STR_DN_WARFARE_HQ_BASE_UNFOLDED; + face = "Face97"; + glasses = "None"; + speaker = "MaleA0EN"; + pitch = 1.0; + }; + }; + // IN BIKB + class Sentences + { + class AirstrikeRequest + { + text = "%team requesting close air support at grid %location "; + speech[] = { %Team, RequestingCloseAirSupportAtGrid, %Location }; + class Arguments + { + class Team { type = "simple"; }; + class Location { type = "simple"; }; + }; + }; + }; + class Arguments {}; + class Special {}; + startWithVocal[] = {}; + startWithConsonant[] = {}; + // In Script file + BIS_SSM_HQWEST = (createGroup west) createUnit ["Logic", [10,10,1000], [], 0, "NONE"];//Game Logic as HQ + BIS_SSM_HQWEST setGroupId ["Headquarters", "SIX"]; + BIS_SSM_HQWEST setIdentity "SSMHQ_EN"; + player kbAddtopic ["Airstrike", BIKB]; + BIS_SSM_HQWEST kbAddtopic ["Airstrike", BIKB]; + player kbTell [BIS_SSM_HQWEST, "Airstrike", "AirstrikeRequest", ["Team", {}, "Anvil", ["Anvil"]], ["Location", {}, "Strelka", ["Strelka"]], true];$/Code$ undefined / undefined - (November 3, 2015) - Must be executed after camCommit. - - - Nothing - - - - - cameraEffect - - - Sets the given effect on the given camera. If you want to switch the screen directly to the first-person, aiming, third-person or group view of an object, use switchCamera instead. The effect type "Terminate" is used to exit the current camera view and switch back to the player's view. Does not need camCommit. - Since Arma 3 v1.73.142217, it is possible to terminate individual r2t source. For example: $Code$cam cameraEffect ["terminate", "back", "rtt1"]; // would terminate "rtt1" r2t source - cam cameraEffect ["terminate", "back"]; // would terminate all r2t sources$/Code$ - - - https://community.bistudio.com/wiki/cameraEffect - - - Object cameraEffect Array - - - camera cameraEffect [effectName, effectPosition, r2tName] - - - $Code$_cam cameraEffect ["internal", "BACK"];$/Code$ - - $Code$_cam cameraEffect ["internal", "back", "rendersurface"];$/Code$ - - $Code$cam = "seagull" camCreate ( player modelToWorld [0,0,100]); - cam cameraEffect ["FIXED", "LEFT TOP"]; - cam camCommand "MANUAL ON";$/Code$ - - - local / local - - - (October 30, 2016) - Types of camera for CfgCameraEffects config: - CamExternal (CamInterpolated) type = 0; // linked directly with object - CamStatic type = 1; // fixed point in space - CamStaticWithZoom type = 2; // fixed point in space - CamChained type = 3; // chained - CamTerminate type = 4; // terminate - CamInternal type = 5; // internal view + (may 02, 2010) + Jezuro's helping topic on BIforum : link - Nothing + Nothing + - cameraInterest + try - Return camera interest for given entity, as set by setCameraInterest, or as autodetected. + Defines a try-catch structure. This sets up an exception handling block. Any thrown exception in a try block is caught in a catch block. The structured exception block has the following form: + $Code$ try //begin of try-catch block + { //block, that can throw exception } + catch + { //block, that process an exception. Exception is described in _exception variable };$/Code$ - https://community.bistudio.com/wiki/cameraInterest + https://community.bistudio.com/wiki/try - cameraInterest Object + try Code + + Anything try Code - cameraInterest entity + try code + + args try code - $Code$camInterest = cameraInterest myUnit;$/Code$ - + undefined / undefined + (June 9, 2015) + Do not expect this behave like Javascript try catch and ignore all errors. But it does have one useful behaviour. Normally when runtime error occurs in SQF (unlike when there is compile error) it continues to execute till the end. But if the script is placed in try {} scope and throw is used upon error, the script immediately terminates, exits the try {} scope and enters catch {} scope. This way it is possible to process possible exceptions in civilised manner. - Number + Exception - Exception + - cameraOn + camCreate - Returns the vehicle to which the camera is attached. + Create a camera or a seagull object on the given position. Also other objects can be created this way, but vehicles created with camCreate cannot be entered. Any units created with camCreate will remain static. Differently to createVehicle, objects are created without consideration of the collision detection with surrounding objects, thus the objects are spawned exactly at the given position. camCreate is conducted immediately, the command doesn't wait for camCommit. - https://community.bistudio.com/wiki/cameraOn + https://community.bistudio.com/wiki/camCreate - cameraOn + String camCreate Array - cameraOn + type camCreate position - + $Code$_cam = "camera" camCreate ( position player )$/Code$ + - undefined / undefined + undefined / local - (November 2, 2015) - $Code$ _MyScreenPos = getPos cameraOn; code - This would getPos for the current player or vehicle that the client's camera is attached to. - code _CameraOnSetPos = cameraOn setPos _pos; code - This would do setPos for the current player or vehicle that the client's camera is attached to. - /dd - /dl - $/Code$ + (August 3, 2006) + Notes from before the conversion: + (CWR 1.91) createVehicle is a valid replacement (with special consideration to locality). + You can also use camCreate to create objects. + $Code$flare1 = "flare" camCreate getPos gameLogic_1$/Code$ + However, soldier units created in this way have little or no AI. - Object + Object + - cameraView + createSoundSource - Returns mode of active camera view. Mode is one of: - "INTERNAL" (1st person) - "EXTERNAL" (3rd person) - "GUNNER" (optics / sights) - "GROUP" (commander view) + Creates a sound source of the given type (type is the name of the subclass of CfgVehicles which is pointing to the sound defined in CfgSFX ). If the markers array contains several marker names, the position of a random one is used, otherwise, the given position is used. The sound source is placed inside a circle with this position as its center and placement as its radius. Some of the vanilla classes pre-configured in Arma 3: + "Sound_Alarm" + "Sound_Alarm2" + "Sound_BattlefieldExplosions" + "Sound_BattlefieldFirefight" + "Sound_Fire" + "Sound_SmokeWreck1" + "Sound_SparklesWreck1" + "Sound_SparklesWreck2" + "Sound_Stream" + Since Arma 3 v1.69.141183 it is possible to define sounds for use with createSoundSource in mission config. As mentioned earlier, the sounds needed for this command should be defined inside CfgVehicles class, which itself references CfgSFX class. If given class searched in main config and is not found, the search will continue in description.ext. Here is an example of suitable mission config definition: + // description.ext + class CfgSFX + { + class MyOwl + { + sound0 [] = { "@A3\Sounds_F\environment\animals\birds\owl1", db - 10, 1.0, 1000, 0.2, 0, 15, 30 }; // path to addon sound + sound1 [] = { "@A3\Sounds_F\environment\animals\birds\owl2", db - 10, 1.0, 1000, 0.2, 0, 15, 30 }; // path to addon sound + sound2 [] = { "@A3\Sounds_F\environment\animals\birds\owl3", db - 10, 1.0, 1000, 0.2, 0, 15, 30 }; // path to addon sound + sounds [] = { sound0, sound1, sound2 }; + empty [] = { "", 0, 0, 0, 0, 0, 0, 0 }; + }; + }; + class CfgVehicles + { + class MyOwlSound // class name to be used with createSoundSource + { + sound = "MyOwl" ; // reference to CfgSFX class + }; + }; + $Code$_owl = createSoundSource ["MyOwlSound", position player, [], 0];$/Code$ + Note that the sound created by createSoundSource will always be looping. Also when CfgSFX sound definition contains more than 1 sound, there is no guarantee that the sound played will be the same on every PC in Multiplayer. - https://community.bistudio.com/wiki/cameraView + https://community.bistudio.com/wiki/createSoundSource - cameraView + createSoundSource Array - cameraView + createSoundSource [type, position, markers, placement] - $Code$if ( cameraOn == _vehicle && cameraView == "External") then + $Code$_soundSource = createSoundSource ["LittleDog", position player, [], 0]$/Code$ + + $Code$[] spawn { - _vehicle switchCamera "Internal"; + _alarm = createSoundSource ["Sound_Alarm", position player, [], 0]; //starts alarm + sleep 10; + deleteVehicle _alarm; //stops alarm };$/Code$ - undefined / undefined + global / global - String + Object + - campaignConfigFile + lnbSetPicture - Return root of campaign description.ext entries hierarchy. + Sets the picture in the item with the given position of the 2D listbox. + Name is the picture name. + The picture is searched in the mission, directory, the dtaExt subdirectory of the campaign directory, and the dtaExt directory and the data bank (or directory). - https://community.bistudio.com/wiki/campaignConfigFile + https://community.bistudio.com/wiki/lnbSetPicture - campaignConfigFile + lnbSetPicture Array + + Control lnbSetPicture Array - campaignConfigFile + lnbSetPicture [IDC, [Row, Column], PicturePathOrPictureName] + + _ctrl lnbSetPicture [ [Row, Column], PicturePathOrPictureName] - + $Code$lnbSetPicture [1, [0, 0], "Picture"];$/Code$ + + $Code$_ctrl lnbSetPicture [ [0, 0], "\A3\Ui_f\data\GUI\Cfg\Ranks\lieutenant_gs.paa"];$/Code$ + - undefined / undefined + local / local + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Config + Nothing - Nothing + - canAddItemToBackpack + selectRandom - Checks if given object can be stored into soldier's backpack. + Returns a random element from the given array. Engine solution to BIS_fnc_selectRandom - https://community.bistudio.com/wiki/canAddItemToBackpack + https://community.bistudio.com/wiki/selectRandom - Object canAddItemToBackpack String - - Object canAddItemToBackpack Array + selectRandom Array - unit canAddItemToBackpack item - - unit canAddItemToBackpack [item, count] + selectRandom array - $Code$_item = "HandGrenade"; - _fits = player canAddItemToBackpack _item; - if (_fits) then { - player addItemToBackpack _item; - } else { - hint "no room!"; - };$/Code$ + $Code$_randomElement = selectRandom [1,2,3,4,5];$/Code$ undefined / undefined @@ -8412,37 +9115,29 @@ - Boolean - Boolean + Anything + - canAddItemToUniform + copyFromClipboard - Checks if given object can be stored into soldier's uniform. + Return the content of the (text) clipboard. + Disabled in Multiplayer for security reasons - https://community.bistudio.com/wiki/canAddItemToUniform + https://community.bistudio.com/wiki/copyFromClipboard - Object canAddItemToUniform String - - Object canAddItemToUniform Array + copyFromClipboard - unit canAddItemToUniform item - - unit canAddItemToUniform [item, count] + copyFromClipboard - $Code$_item = "HandGrenade"; - _fits = player canAddItemToUniform _item; - if (_fits) then { - player addItemToUniform _item; - } else { - hint "no room!"; - };$/Code$ + $Code$hint copyFromClipboard ;$/Code$ undefined / undefined @@ -8450,286 +9145,238 @@ - Boolean - Boolean + String + - canAddItemToVest + vectorCos - Checks if given object can be stored into soldier's vest. + Cosine of angle between two 3D vectors. - https://community.bistudio.com/wiki/canAddItemToVest + https://community.bistudio.com/wiki/vectorCos - Object canAddItemToVest String - - Object canAddItemToVest Array + Array vectorCos Array - unit canAddItemToVest item - - unit canAddItemToVest [item, count] + vector1 vectorCos vector2 - $Code$_item = "HandGrenade"; - _fits = player canAddItemToVest _item; - if (_fits) then { - player addItemToVest _item; - } else { - hint "no room!"; - };$/Code$ + $Code$_cos = getPos player vectorCos [0,0,2];$/Code$ undefined / undefined + (28 Jun, 2014) + (ArmA3 1.22)Algorithm: + $Code$ + Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; + Result = ((x1 * x2) + (y1 * y2) + (z1 * z2))/(( sqrt (x1 ^ 2 + y1 ^ 2 + z1 ^ 2))*( sqrt (x2 ^ 2 + y2 ^ 2 + z2 ^ 2))) + $/Code$ + Given two vectors of attributes, A and B, the cosine similarity, cos(θ), is represented using a dot product and magnitude. The resulting similarity values indicating intermediate similarity or dissimilarity between two vectors. - Boolean - Boolean + Number + - canAdd + units - Checks if given object can be stored in inventory of given object or any inventory container ( uniform, vest, backpack ) of given unit. + Returns an array with all the units in the group or group of the unit. For a destroyed object an empty array is returned. - https://community.bistudio.com/wiki/canAdd + https://community.bistudio.com/wiki/units - Object canAdd String - - Object canAdd Array + units Group/Object - object canAdd item - - object canAdd [item, count] + units groupOrUnit - $Code$if ( player canAdd "FirstAidKit") then { - player addItem "FirstAidKit"; - } else { - hint "Not enough space"; - };$/Code$ - - $Code$if (_box canAdd "FirstAidKit") then { - _box addWeaponCargo ["FirstAidKit", 1]; - } else { - hint "Not enough space"; - };$/Code$ + $Code$_myUnitCount = count units group player ;$/Code$ - $Code$car canAdd [ currentWeapon player, 50];$/Code$ + $Code$_isInMyGroup = _soldier1 in units player ;$/Code$ undefined / undefined - (November 29, 2015) - Can also be used on any object that has inventory, not only player inventory containers. - Where _box is B_supplyCrate_F : - $Code$// Empty - _box canAdd "FirstAidKit"; - - true - // Full - _box canAdd "FirstAidKit"; - - false - $/Code$ - - (February 11, 2017) - This can also be used as alternative to canAddItemToBackpack, canAddItemToUniform, canAddItemToVest where container might not be strictly defined.In some cases it might be a good optimisation for your code, where you also don't need to perform checks on which type of player container this is. Example: - $Code$_i = [(uniformContainer player),(vestContainer player),(backpackContainer player)] call BIS_fnc_selectRandom; - if (_i canAdd "Rangefinder") then { - _i addItemCargoGlobal ["Rangefinder",1]; - }; - $/Code$ + (September 24, 2009) + The returned array on MP clients is not updated when team members die (only when they are deleted). ( Tested on VBS2 ) - Boolean - Boolean + Array + - canFire + setDammage - Returns true if the given vehicle is still able to fire. For the command to return true, vehicle must be alive, have weapon operator and the weapon cannot be damaged = 0.9 but can be empty due to running out of ammo. If mission starts with vehicle having no ammo or setVehicleAmmo 0 command is executed on the vehicle, then canFire will always report false for it. + Damage / repair object. + Damage 0 means fully functional, damage 1 means completely destroyed / dead. + Alias of setDamage, which was introduced to fix a spelling error in this operator's name. - https://community.bistudio.com/wiki/canFire + https://community.bistudio.com/wiki/setDammage - canFire Object + Object setDammage Number - canFire unitName + object setDammage damage - $Code$// SQS: - ?!( canFire _tank) : player sideChat "Tank disabled!"$/Code$ - - $Code$// SQF: - if ( ! ( canFire _tank)) then { - player sideChat "Tank disabled!"; - };$/Code$ + $Code$_soldier1 setDammage 1;$/Code$ - global / undefined + global / global - (07:16, 20 January 2007 (CEST)) - true even if unit is out of ammo. Only false if gun is damaged. - - (05:20, 24 August 2008 (CEST)) - False if there is no gunner in the vehicle, regardless of damage level. - - (07:20, 23 April 2018 (UTC)) - This command seems to have evolved. Returns "true" (on Hunter, Ifrit) even if Gun's damage is set to 1 and turret also, as far there is a gunner. The only way to obtain a canFire "false" is to make the crew disembark (2 burned tires for example). Then no matter the gun state, if the gunner disembarks without order, the vehicle can't fire. In this case: can't move can't fire. - NB: if you jump into a hunter HMG after having setHitPointDamage(d) "hitTurret" and "hitGun" to 1, the turret can't rotate any more, the gun is pitched down but you can fire (trigger) to the ground. Difficult to check the behavior for each vehicles. + In OFP, setting a unit's damage to a negative value will set it's health to full, but impair their aim. - Boolean + Nothing + - canMove + taskState - Returns if the given vehicle is still able to move. This command checks only the damage value, not the amount of fuel! + Returns the current state of a task. + Possible return values are: + None + Created + Assigned + Succeeded + Failed + Canceled - https://community.bistudio.com/wiki/canMove + https://community.bistudio.com/wiki/taskState - canMove Object + taskState Task - canMove unitName + taskState task - $Code$// SQS : - ?!( canMove _tank) : player sideChat "He's nailed on the ground! Now hurry!"$/Code$ - - $Code$if (! canMove _tank) then - { - player sideChat "He's nailed on the ground! Now hurry!"; - };$/Code$ + $Code$tskSomeTask = player createSimpleTask ["NewTask"]; + hint format["Taskstate: %1", taskState tskSomeTask];$/Code$ - global / undefined + undefined / undefined - (08:17, 22 Juil 2016 (UTC)) - This command will return true for a car or a tank out of fuel, but false for an helicopter or a plane for the same condition. - Boolean + String + - canSlingLoad + addMusicEventHandler - Returns true if it is possible to sling load cargo + Adds playMusic event handler. Returns id of the handler or -1 when failed. Just like addMissionEventHandler, music EH is also attached to the mission. - https://community.bistudio.com/wiki/canSlingLoad + https://community.bistudio.com/wiki/addMusicEventHandler - Object canSlingLoad Object + addMusicEventHandler Array - vehicle canSlingLoad cargo + addMusicEventHandler [type, function] - $Code$_slingable = veh1 canSlingLoad veh2;$/Code$ + $Code$_ehID = addMusicEventHandler ["MusicStart", { hint str _this}];$/Code$ - $Code$hint str (( vehicle player ) canSlingLoad veh1);$/Code$ + $Code$_ehID = addMusicEventHandler ["MusicStop", { hint str _this}];$/Code$ undefined / undefined + (March 4, 2013) + There are these two types at this time: + MusicStart - It is triggered when the music is started (command playMusic ). In variable _this is stored class name from CfgMusic. + MusicStop - It is triggered when the music is ended (command playMusic ). In variable _this is stored class name from CfgMusic. - Boolean + Number + - canStand + setRank - Returns if the given soldier is able to stand up. + Sets rank of given unit. + Possible values: PRIVATE, CORPORAL, SERGEANT, LIEUTENANT, CAPTAIN, MAJOR or COLONEL. + Since Arma 3 v1.67 this command is - https://community.bistudio.com/wiki/canStand + https://community.bistudio.com/wiki/setRank - canStand Object + Object setRank String - canStand unitName + unitName setRank rank - $Code$// SQS : - ?!( canStand player ) : player groupChat "My legs! They hit my legs!"$/Code$ - - $Code$if (! canStand player ) then - { - player groupChat "My legs! They hit my legs!"; - };$/Code$ + $Code$player setRank "COLONEL"$/Code$ - global / undefined + global / local - The command may return true for dead units. + (Mar 26, 2009) + Changing a unit's rank using either setUnitRank or setRank will also REPLACE their current rating dependent on their new rank (colonels have a rating of 7500 etc). That is to say REPLACE, not add to: the unit's old rating will disappear with the rank change. + + (April 12, 2014) + Behavior when used on players in multiplayer seems unpredictable. (ArmA 3 1.00) - Boolean + Nothing + - canSuspend + isNumber - Returns true if sleep, uiSleep or waitUntil commands can be used in current scope. Usually when suspension is not allowed but used, for example when code is executed in unscheduled environment, the script engine would ignore any suspension command and throw error: "Suspending not allowed in this context". Using canSuspend command allows to detect the correct environment for the code. - Note : The definition of scheduled and unscheduled environment is not the same as whether or not the script execution can or cannot be suspended. For example while. sqs and. fsm scripts are scheduled (i.e. added to the scheduler : diag_activeSQSScripts, diag_activeMissionFSMs ), they cannot use sleep or be suspended like execVM or spawn scripts can, therefore canSuspend for these types of scripts will return false. + Check if config entry represents number. - https://community.bistudio.com/wiki/canSuspend + https://community.bistudio.com/wiki/isNumber - canSuspend + isNumber Config - canSuspend + isNumber config - $Code$onEachFrame - { - systemChat str canSuspend ; //false - [] spawn { hint str canSuspend }; //true - onEachFrame {}; - };$/Code$ - - $Code$// Make sure the function code is always spawned even when called: - mysleep = - { - if (! canSuspend ) exitWith {_this spawn mysleep}; - sleep _this; - hint ("slept " + str _this); - }; - 5 call mysleep;$/Code$ + $Code$_ok = isNumber (configFile "CfgVehicles") + // Result is false$/Code$ undefined / undefined @@ -8737,27 +9384,29 @@ - Boolean + Boolean + - canTriggerDynamicSimulation + diag_enable - A getter for triggerDynamicSimulation + Used to enable/disabled various diagnostics. + Only available in the Arma 3 Diagnostic exe - https://community.bistudio.com/wiki/canTriggerDynamicSimulation + https://community.bistudio.com/wiki/diag_enable - canTriggerDynamicSimulation Object + String diag_enable Boolean - canTriggerDynamicSimulation unit + diag_mode diag_enable state - $Code$hint str canTriggerDynamicSimulation player ;$/Code$ + $Code$"All" diag_enable true$/Code$ undefined / undefined @@ -8765,191 +9414,267 @@ - Boolean + Nothing + - canUnloadInCombat + fireAtTarget - Check if cargo of this vehicle want to get out when in combat. + Remotely forces a unit to fire the given weapon. See also: BIS_fnc_fire - https://community.bistudio.com/wiki/canUnloadInCombat + https://community.bistudio.com/wiki/fireAtTarget - canUnloadInCombat Object + Object fireAtTarget Array - canUnloadInCombat vehicle + sourceVehicle fireAtTarget [targetVehicle, weaponMuzzleName] - $Code$if (canUnloadInCombat _vehicle) then {...};$/Code$ - - - undefined / undefined - - - - - Boolean - - - - - canVehicleCargo - - - Returns bool array if it is possible to load cargo inside vehicle and if possible to load cargo into empty vehicle - - - https://community.bistudio.com/wiki/canVehicleCargo - - - Object canVehicleCargo Object - - - vehicle canVehicleCargo cargo - - - $Code$// Blackfish with no vehicle cargo loaded - _result = blackfish canVehicleCargo offroad; //[true, true]$/Code$ - - $Code$// Blackfish with one vehicle cargo called offroad already loaded - _result = blackfish canVehicleCargo offroad; //[false, false] - - // Even if the Blackfish was empty offroad can't be loaded because it's already in a cargo space$/Code$ - - $Code$// Blackfish with one vehicle cargo called offroad already loaded - _result = blackfish canVehicleCargo offroad2; //[false, true] - - // offroad2 can't be loaded because there isn't enough space in the Blackfish, but if there was space offroad2 could be loaded into the Blackfish$/Code$ + $Code$_handle = this fireAtTarget [groundtarget1,"HellfireLauncher"];$/Code$ + + $Code$_handle = Igla_AA_pod_TK_EP1 fireAtTarget [_helicopter, currentWeapon Igla_AA_pod_TK_EP1];$/Code$ + + $Code$_handle = Igla_AA_pod_TK_EP1 fireAtTarget [helicopter];$/Code$ undefined / undefined + (Sep 16, 2010) + Most likely only for missiles and for interaction with player only. + + (Apr 8, 2014) + (A3 1.14) Source vehicle is only limited to manned vehicle while any other types won’t be able to active fireAtTarget handle, e.g. + $Code$ + _handle = _InfantryUnit fireAtTarget [_Infnatrytarget,( weapons _Infantryunit select 0)]; + //false & no bullet shoot + $/Code$ + Target has no limitation and can be any object: + $Code$ + _handle = ( vehicle _veh) fireAtTarget [ObjNull,( weapons ( vehicle _veh) select 0)]; + //true & a bullet shoot + $/Code$ + Handle returns false if weapon class name is inaccurate, e.g. + $Code$ + _Handle = ( vehicle _veh) fireAtTarget [ObjNull,”UnknownWeapon”]; + //false & no bullet shoot. + $/Code$ + Handle still returns true even though the vehicle is unavailable to shoot any bullet: + $Code$ + _weapon = weapons ( vehicle _veh) select 0; + ( vehicle _veh) setAmmo [_weapon,0]; + _Handle = ( vehicle _veh) fireAtTarget [ObjNull,_weapon]; + //true & no bullet shoot + $/Code$ + difference + command + Source + Target + Behavior + Workaround templets + fire + Either Unit or manned vehicle + N/A + Fired aiming at air for infantry rifle + Together with selectWeapon, + suggested to work with "throw","put" weapon type + for infantry, or vehicle entity indeed. + fireAtTarget + Manned vehicle only + Any object + Normal shoot, won’t aim at target automatically + _veh doWatch _target; + waitUntil {_veh aimedAtTarget [_target] 0}; + _veh fireAtTarget [_target]; + forceWeaponFire + Either Unit or manned aircraft (weapon operator) + N/A + Normal shoot, can change fire mode + //E.g. unit won't shoot until he is facing the target. + _unit doWatch _tar; + waitUntil { + _dir = direction _unit; + _relative = [_unit,_tar] call BIS_fnc_relativeDirTo ; + if (_dir == _relative) exitWith { + _unit forceWeaponFire [ currentWeapon _unit,"single"]; + }; + false + }; + doFire + Unit only + Either unit or vehicle + automatic aiming and shooting + No special example. + commandFire + Unit only + Either unit or vehicle + automatic aiming and shooting + No special example. + action ["UseWeapon"] + Either unit or manned vehicle + N/A + unexpected behavior + N/A - Array + Boolean + - cancelSimpleTaskDestination + sideChat - Cancels a simple task destination. + Types text to the side radio channel. Must have assigned "ItemRadio" to see or transmit the messages. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) - https://community.bistudio.com/wiki/cancelSimpleTaskDestination + https://community.bistudio.com/wiki/sideChat - cancelSimpleTaskDestination Task + Object sideChat String + + Array sideChat String - cancelSimpleTaskDestination task + unitName sideChat chatText + + [side, identity] sideChat chatText - $Code$cancelSimpleTaskDestination myTask;$/Code$ + $Code$_soldierOne sideChat "Show this text";$/Code$ + + $Code$[ west, "HQ"] sideChat "Hi there";$/Code$ + + $Code$driver vehicle player sideChat "sideChat"; + driver vehicle player globalChat "globalChat"; + driver vehicle player groupChat "groupChat"; + vehicle player vehicleChat "vehicleChat"; + driver vehicle player commandChat "commandChat"; + driver vehicle player customChat [1, "customChat"]; + systemChat "systemChat";$/Code$ - undefined / undefined + global / local + In OFP v1.96, sideChat messages can be sent from 2 abstract sources: "Papa_Bear" and "Base FireFly". Use sideChat on an array in the form [SIDE,"base"],[SIDE,"HQ"],[SIDE,"Papa_bear"] or [SIDE,"airbase"], where SIDE is the side broadcasting. "HQ", "base" and "Papa_bear" seem to be the same object. The callsign strings can be re-defined using a stringTable.csv file, using STR_CFG_PAPABEAR and STR_CFG_FIREFLYBASE. Example : [EAST,"base"] sideChat "Return to base!". - Nothing + Nothing - Nothing + - captiveNum + land - Checks whether the unit is a captive. If the unit is a vehicle, its commander is checked instead. - If a unit's captivity level was set as a Boolean, then the returned number is either 0 (for false ) or 1 (for true ). + Force helicopter landing. Landing mode may be: + "LAND" (complete stop) + "GET IN" (hovering very low, for another unit to get in) + "GET OUT" (hovering low,for another unit to get out) + "NONE" (cancel a landing) Available since ArmA 2 57463 build. - https://community.bistudio.com/wiki/captiveNum + https://community.bistudio.com/wiki/land - captiveNum Object + Object land String - captiveNum unit + helicopter land mode - $Code$_captivity = captiveNum _unit;$/Code$ - - $Code$_unit setCaptive 1024; - hint str captive _unit; //true - hint str captiveNum _unit; //1024$/Code$ + $Code$_cobraOne land "LAND"$/Code$ - global / undefined + local / global + (August 4, 2006) + Notes from before the conversion: + Helos will land at the nearest "H" or "Invisible H", if there is one around (within 500m in ArmA). + + To make a helicopter LAND correctly and not hovering over the landing position use unitReady to check if the helicopter already has reached his destination. + You can fix a landing bug by using a short delay bevore checking the unitReady command. + _helicopter move (getPos _destination); + sleep 3; + while { ( (alive _helicopter) && !(unitReady _helicopter) ) } do + { + sleep 1; + }; + if (alive _helicopter) then + { + _helicopter land "LAND"; + }; - Number + Nothing + - captive + vectorWorldToModelVisual - Returns if the given unit is captive. "captive" means that enemies will not shoot at the unit. + Converts vector direction from world to model space in render time scope. - https://community.bistudio.com/wiki/captive + https://community.bistudio.com/wiki/vectorWorldToModelVisual - captive Object + Object vectorWorldToModelVisual Array - captive object + object vectorWorldToModelVisual worldDir - $Code$if (! captive _general) then {_general setCaptive true };$/Code$ + $Code$// Convert world space vector [0,-10,4] to model space of object _airplane: + _airplane vectorWorldToModelVisual [0,-10,4];$/Code$ - global / undefined + undefined / undefined - (August 3, 2006) - Notes from before the conversion: - Use setCaptive to make a unit captive. - Boolean + Array + - case + getObjectType - This command is used inside a switch do construct. Although the syntax below states that this operator takes only one argument, that is most likely not true. It seems like it needs two arguments of which the left one is some sort of hidden variable that gets defined inside a switch do construct. That is the reason why this operator can not be used outside a switch do construct. (see https://foxhound.international/arma-3-sqf-grammar.html for further explaination) - Also note that it is not possible to store the returned Switch Type in a variable and use that variable in another switch do construct. It will never lead to an execution of the corresponding code block. + Returns object type as a number: + 1 - Primary - Normal object placed in Visitor, part of landscape + 2 - Network - Road placed in Visitor, part of landscape + 4 - Temporary - Temporary object (like tracks) + 8 - TypeVehicle - Some entity added by game + 16 - TypeTempVehicle - Temporary entity + 32 - LandDecal - Land decal - https://community.bistudio.com/wiki/case + https://community.bistudio.com/wiki/getObjectType - case Anything + getObjectType Object - case b + getObjectType object - $Code$switch (_condition) do { - case 1: { hint "1" }; - case 2: { hint "2" }; - default { hint "default" }; - };$/Code$ + $Code$_objType = getObjectType player ;$/Code$ + + $Code$_objType = getObjectType cursorObject ;$/Code$ undefined / undefined @@ -8957,86 +9682,95 @@ - Switch_Type + Number + - catch + floor - Processes code when an exception is thrown in a try block. The exception caught can be found in the _exception variable. + Returns the next lowest integer in relation to x. - https://community.bistudio.com/wiki/catch + https://community.bistudio.com/wiki/floor - Exception catch Code + floor Number - try-block catch code + floor x - + $Code$floor 5.25 + Result is 5$/Code$ + + $Code$floor -5.25 + Result is -6$/Code$ + undefined / undefined - Anything + Number + - cbChecked + direction - Returns the current state of a checkbox (CT_CHECKBOX type 77 of Dialog Control ). + Returns the direction an object or a location is facing (differs from getDir in that this also works with locations). - https://community.bistudio.com/wiki/cbChecked + https://community.bistudio.com/wiki/direction - cbChecked Control + direction Object/Location - cbChecked control + direction object - $Code$_checked = cbChecked _myCheckBox;$/Code$ + $Code$player setDir 90; + _d = direction player ;//returns 90$/Code$ - undefined / undefined + global / undefined - Boolean + Number + - cbSetChecked + collect3DENHistory - Sets the current state of a checkbox (CT_CHECKBOX type 77 of Dialog Control ). + Execute a block of code in which all Eden Editor operations will be recorded as one history step. For example creating an entity, setting its attributes and then connections would normally be recorded as three different steps. Calling them all within single collect3DENHistory block will group them together and the user will need to undo only once to revert the changes. - https://community.bistudio.com/wiki/cbSetChecked + https://community.bistudio.com/wiki/collect3DENHistory - Control cbSetChecked Boolean + collect3DENHistory Code - control cbSetChecked state + collect3DENHistory code - $Code$_myCheckBox cbSetChecked true ;$/Code$ - - $Code$_disp = findDisplay 46 createDisplay "RscDisplayEmpty"; - _chk = _disp ctrlCreate ["RscCheckBox", -1]; - _chk cbSetChecked true ;$/Code$ + $Code$collect3DENHistory { + _logic = create3DENEntity ["Logic", "Logic", position player ]; + add3DENConnection ["Sync", [_logic], player ]; + }; + // Creates a logic and connects it to player in one history step.$/Code$ undefined / undefined @@ -9044,31 +9778,30 @@ - Nothing + Nothing + - ceil + slingLoadAssistantShown - The ceil value of x. + Returns true of Sling Load Assistant is open - https://community.bistudio.com/wiki/ceil + https://community.bistudio.com/wiki/slingLoadAssistantShown - ceil Number + slingLoadAssistantShown - ceil x + slingLoadAssistantShown - $Code$ceil 5.25 - Result is 6$/Code$ - - $Code$ceil -5.25 - Result is -5$/Code$ + $Code$waitUntil { slingLoadAssistantShown }; + hint "You lack rudimentary motor skills and basic eye-hand coordination."; + //scold user for unethical practices$/Code$ undefined / undefined @@ -9076,212 +9809,237 @@ - Number + Boolean + - channelEnabled + publicVariableServer - Returns true or false depending on whether the given channel is enabled or disabled. For more information about enabling/disabling of chat channels see enableChannel. Channel / Number correspondence: - 0 = Global - 1 = Side - 2 = Command - 3 = Group - 4 = Vehicle - 5 = Direct - 6-15 = Custom Radio (Is not supported by channelEnabled ) - Please note that since Arma 3 v1.59.135661 the output of this command was changed from Boolean to Array in format [ Boolean, Boolean ] + Send the variable value to the server - same limitations regarding variable type as publicVariable. + In Arma 3 it is possible to broadcast nil value - https://community.bistudio.com/wiki/channelEnabled + https://community.bistudio.com/wiki/publicVariableServer - channelEnabled Number + publicVariableServer String - channelEnabled channel + publicVariableServer varName - $Code$_isGlobalChatEnabled = ( channelEnabled 0) select 0; // Check if user can use text on global channel$/Code$ - - $Code$_isGlobalVoiceEnabled = ( channelEnabled 0) select 1; // Check if user can use the VoN on global channel$/Code$ + $Code$publicVariableServer "CTFscoreOne";$/Code$ undefined / undefined + (24 Aug, 2012) + publicVariableServer (run on client) + publicVariableClient (run on server) + Publishers the variable (name as STRING) to the server only. Useful when you want to synchronize a variable with the server but not any other clients. - Rocket - Array + Nothing + - cheatsEnabled + splitString - Checks whether cheats are enabled (whether the designers' version is running). + An SQF version of C++ strtok. Splits given string str into an array of tokens according to given delimiters. In addition, if empty string "" is used for delimiters, str is split by each character. - https://community.bistudio.com/wiki/cheatsEnabled + https://community.bistudio.com/wiki/splitString - cheatsEnabled + String splitString String - cheatsEnabled + str splitString delimiters - + $Code$_str = "- This, is a sample string." splitString "-,. "; // ["This","is","a","sample","string"] + _str joinString " "; // "This is a sample string"$/Code$ + + $Code$"\A3\ui_f\data\map\vehicleicons\iconLogic_ca.paa" splitString "\."; + // ["A3","ui_f","data","map","vehicleicons","iconLogic_ca","paa"]$/Code$ + + $Code$"1:2:3" splitString ":"; // ["1","2","3"]$/Code$ + + $Code$["test","test"] joinString toString [12345] splitString toString [12345]; // ["test","test"]$/Code$ + + $Code$"Japa is the best!" splitString "" joinString " "; // "J a p a i s t h e b e s t !"$/Code$ + + $Code$_cmd = currentMagazineDetail player ; //"9mm 16Rnd Mag(13/16)[id/cr:10000011/0]" + _cmd splitString "([ ]/:)"; //["9mm","16Rnd","Mag","13","16","id","cr","10000011","0"]$/Code$ + + $Code$// Remove all \r\n from file: + loadFile "somefile.txt" splitString toString [13,10] joinString " "$/Code$ + undefined / undefined + (May 17, 2016) + This command is unreliable/broken when it comes to some non-ASCII characters (as of Arma 3 1.58): + $Code$"Mörser" splitString "" + - ["M"," "," ","r","s","e","r"] + "Mörser" splitString "ö" + - ["M","rser"] + "Mörser" splitString "ä" + - ["M"," rser"]$/Code$ + + (October 17, 2016) + This commands works only with ASCII chars, any chars with codes 127, also used in different languages, will be converted to [" ", " "]. Use toArray to preserve special characters: + $Code$_spaced = toArray "Mörser" apply { toString [_x]} joinString " "; // M ö r s e r$/Code$ - Boolean + Array + - checkAIFeature + skillFinal - Check if given AI feature is currently enabled. Feature may be one of: - "AwareFormationSoft", "CombatFormationSoft". + Returns final, recalculated sub skill value of given unit. (with regard to AI Level coefficient (Difficulty settings)). - https://community.bistudio.com/wiki/checkAIFeature + https://community.bistudio.com/wiki/skillFinal - checkAIFeature String + Object skillFinal String - checkAIFeature feature + unit skillFinal skillName - $Code$_featureUsed = checkAIFeature "AwareFormationSoft"$/Code$ + $Code$_unitTrueEndurance = unit1 skillFinal "endurance";$/Code$ undefined / undefined + Since 1.40 the command works also in MP environment + + (January 31, 2015) - Boolean + Number + - checkVisibility + uniformMagazines - Checks if one position is visible from another position and how much. The results can be affected by getTerrainGrid value, especially if position is near the ground. Particle effects such as smoke can also affect the results. + Get array with all magazines from uniform of the given unit. - https://community.bistudio.com/wiki/checkVisibility + https://community.bistudio.com/wiki/uniformMagazines - Array checkVisibility Array + uniformMagazines Object - [ignore, LOD, ignore2] checkVisibility [beg, end] + uniformMagazines unit - $Code$_cansee = [ objNull, "VIEW"] checkVisibility [ eyePos player, eyePos unit1];$/Code$ + $Code$uniformMagazines player ;[ + "6.5mm 30Rnd STANAG Mag(30/30)[id/cr:1/0](3x)" + ]$/Code$ undefined / undefined - (August 8, 2016) - Particles that have blockAIVisibility set to 1 will influence the result, but will not make checkVisibility return 0. Instead an extremly small number will be returned. - Distance, fog, overcast, rain and nighttime have no effect on the result. - Number + Array + - civilian + setCompassOscillation - Pre-defined variable for the civilian side. - When used in a format statement ( hint format ["%1",civilian] ), the string returned is "CIV". + Sets compass oscillation. - https://community.bistudio.com/wiki/civilian + https://community.bistudio.com/wiki/setCompassOscillation - civilian + setCompassOscillation Array - civilian + setCompassOscillation [angle, frequencyMin, frequencyMax] - $Code$// SQS: - ?((side _unit) == civilian ) : hint "This is a civilian unit!"$/Code$ - - $Code$// SQF: - if (( side _unit) == civilian ) then { - hint "This is a civilian unit!"; - };$/Code$ + $Code$setCompassOscillation [1, 1, 1];$/Code$ undefined / undefined - In OFP v1.96, empty vehicles, objects and dead soldiers are on side civilian. - Side + Nothing + - className + getPilotCameraRotation - Returns short name of location. + Returns rotation (relative to the centered camera position) of the object airplane or helicopter pilotCamera. - https://community.bistudio.com/wiki/className + https://community.bistudio.com/wiki/getPilotCameraRotation - className Location + getPilotCameraRotation Object - className loc + getPilotCameraRotation object - + $Code$_pilotCamRot = getPilotCameraRotation vehicle player$/Code$ + - undefined / undefined + local / undefined - String + Array + - clearAllItemsFromBackpack + menuSize - Removes all items from the backpack. + Returns how many sub entries is in item on given path. - https://community.bistudio.com/wiki/clearAllItemsFromBackpack + https://community.bistudio.com/wiki/menuSize - clearAllItemsFromBackpack Object + menuSize Array - clearAllItemsFromBackpack unit + menuSize [idc, path] @@ -9291,648 +10049,796 @@ - Nothing + Number + - clearBackpackCargo + setDestination - Removes all backpacks from ammo box (or any general weapon holder container). + Set the destination for path planning of the pilot. + Possible values for planningMode are: + "DoNotPlan" - used when not moving + "DoNotPlanFormation" - used in formation when simple path testing is used + "LEADER PLANNED" - used for formation leader (full path finding used) + "LEADER DIRECT" - used for DirectGo (like getin, supply) + "FORMATION PLANNED" - used in formation when full path finding is used + "VEHICLE PLANNED" - used for vehicle driver + Works best when used on agents - https://community.bistudio.com/wiki/clearBackpackCargo + https://community.bistudio.com/wiki/setDestination - clearBackpackCargo Object + Object setDestination Array - clearBackpackCargo box + object setDestination [position, planningMode, forceReplan] - $Code$clearBackpackCargo myBox;$/Code$ + $Code$bob setDestination [ screenToWorld [0.5,0.5], "LEADER PLANNED", true ]$/Code$ - undefined / undefined + local / global - (July 6, 2017) - This will remove not only backpacks, but vests and uniforms as well. - Nothing + Nothing + - clearBackpackCargoGlobal + setWaypointHousePosition - Removes all backpacks from the vehicle cargo space. MP synchronized. + For waypoints attached to a house, this defines the target house position. - https://community.bistudio.com/wiki/clearBackpackCargoGlobal + https://community.bistudio.com/wiki/setWaypointHousePosition - clearBackpackCargoGlobal Object + Array setWaypointHousePosition Number - clearBackpackCargoGlobal unit + waypoint setWaypointHousePosition pos - $Code$clearBackpackCargoGlobal jeepOne;$/Code$ + $Code$[_grp, 2] setWaypointHousePosition 1;$/Code$ - global / global + undefined / undefined - (July 6, 2017) - This will remove not only backpacks, but vests and uniforms as well. - Nothing + Nothing + - clearGroupIcons + boundingCenter - Removes all icon from group. + Returns the position of original (loaded) center of object in model coordinates. - https://community.bistudio.com/wiki/clearGroupIcons + https://community.bistudio.com/wiki/boundingCenter - clearGroupIcons Group + boundingCenter Object - clearGroupIcons group + boundingCenter object - + $Code$_center = boundingCenter TruckOne$/Code$ + undefined / undefined - Nothing + Array + - clearItemCargoGlobal + switchLight - Removes all items from ammo box (or any general weapon holder container). + Controls whether a lamp is lit or not. For working with CfgNonAIVehicles class "StreetLamp" only. - https://community.bistudio.com/wiki/clearItemCargoGlobal + https://community.bistudio.com/wiki/switchLight - clearItemCargoGlobal Object + Object switchLight String - clearItemCargoGlobal box + lamp switchLight mode - + $Code$( object 12345) switchLight "OFF"$/Code$ + + $Code$nearestObject [player, "Streetlamp"] switchLight "OFF"$/Code$ + - global / global + undefined / undefined + (January 23, 2010) + If you want turn street lamp off in ArmA2, the syntax is: + ID959522=position player nearestObject 959522 + ID959522 switchLight "off" + + (September 16, 2013) + In ArmA3 use setHit instead: + $Code$_lamp = nearestObject [ player, "Lamps_base_F"]; + _lamp setHit ["light_1_hitpoint", 0.97]; //off + _lamp setHit ["light_1_hitpoint", 0]; //on$/Code$ + Switch all lights off in the 500 radius of player: + $Code${ + for "_i" from 0 to count getAllHitPointsDamage _x - 1 do + { + _x setHitIndex [_i, 0.97]; + }; + } + forEach nearestObjects + [ + player, + [ + "Lamps_base_F", + "PowerLines_base_F", + "PowerLines_Small_base_F" + ], + 500 + ];$/Code$ - Nothing + Nothing + - clearItemCargo + tvExpandAll - Removes all items from ammo box (or any general weapon holder container). + Expands all tree items for the given Tree View. - https://community.bistudio.com/wiki/clearItemCargo + https://community.bistudio.com/wiki/tvExpandAll - clearItemCargo Object + tvExpandAll Number + + tvExpandAll Control - clearItemCargo box + tvExpandAll idc + + tvExpandAll control - $Code$clearItemCargo myBox;$/Code$ + $Code$tvExpandAll 101;$/Code$ + + $Code$tvExpandAll _ctrl;$/Code$ - undefined / undefined + local / local - Nothing + Nothing - Nothing + - clearItemPool + lbSetPictureColor - Removes all items from ammo box (or any general weapon holder container) + Sets the color of item's picture (left) with the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. - https://community.bistudio.com/wiki/clearItemPool + https://community.bistudio.com/wiki/lbSetPictureColor - clearItemPool Object + lbSetPictureColor Array + + Control lbSetPictureColor Array - clearItemPool box + lbSetPictureColor [idc, index, color] + + control lbSetPictureColor [index, color] - $Code$clearItemPool jeepOne$/Code$ + $Code$lbSetPictureColor [101, 0, [0, 1, 0, 0.5]];$/Code$ + + $Code$_ctrl lbSetPictureColor [0, [1, 1, 1, 1]];$/Code$ undefined / undefined + More information on the LB command family can be found here + + (August 18, 2015) + (ArmA 3 1.48) To give an image on the right side of a listbox item: + $Code$_ctrl lbSetPictureRightColor [_index, [1,1,1,0.7]];$/Code$ - Nothing + Nothing - Nothing + - clearMagazineCargoGlobal + weaponInertia - Removes all magazines from the vehicle cargo space. MP synchronized. + Returns current rate of how much the weapon view is distorted because of quick aiming - https://community.bistudio.com/wiki/clearMagazineCargoGlobal + https://community.bistudio.com/wiki/weaponInertia - clearMagazineCargoGlobal Object + weaponInertia Object - clearMagazineCargoGlobal unit + weaponInertia unit - $Code$clearMagazineCargoGlobal jeepOne;$/Code$ + $Code$_inertia = weaponInertia player ;$/Code$ - global / global + undefined / undefined - Nothing + Array + - clearMagazineCargo + hideObjectGlobal - Remove all magazines from the given vehicle's magazine cargo space. + This command is designed for MP. Hides object on all connected clients as well as JIP. Call on the server only. Can be used on all objects with class names, i.e. ( typeOf object != ""). In SP this command behaves just like hideObject. - https://community.bistudio.com/wiki/clearMagazineCargo + https://community.bistudio.com/wiki/hideObjectGlobal - clearMagazineCargo Object + hideObjectGlobal Object + + Object hideObjectGlobal Boolean - clearMagazineCargo vehicleName + hideObjectGlobal object + + object hideObjectGlobal hidden - $Code$clearMagazineCargo _truck;$/Code$ + $Code$hideObjectGlobal nearestBuilding [2500,2500,0];$/Code$ + + $Code$objectname hideObjectGlobal true;$/Code$ - global / local + global / global - (11:02, 24 October 2009 (CEST)) - Effect is local, run on each client for global effect. + This scripting command must be executed on the server to work properly in multiplayer + + (June 27, 2015) + hideObject and hideObjectGlobal disable object collision in addition to rendering. A3 1.45.131175 + (tested by hiding buildings and running through, driving through, flying through, and shooting through where the building used to be) + + (September 1, 2016) + As of A3 1,62.134494 running hideObjectGlobal in big loop may cause some objects not to be hidden for a players already connected or passed JIP. To avoid players rendering desync consider running that in preInit schedule of a server. + + (August 7, 2017) + In A3 1.72.142342 when you hide object via hideObjectGlobal, model sounds still be audible. + For e.g. if you delete apex house from map, you still hear a conditioner sound at this spot - Nothing + Nothing - Nothing + - clearMagazinePool + ctValue - Remove all magazines from the magazine pool, of which the player may choose in the following missions. Available in campaigns only. + Returns metadata (number) associated with a particular row of RscControlsTable. - https://community.bistudio.com/wiki/clearMagazinePool + https://community.bistudio.com/wiki/ctValue - clearMagazinePool + ctValue Control - clearMagazinePool + ctValue Control - + $Code$_number = ctValue _control;$/Code$ + - undefined / undefined + local / local - Nothing + Number + - clearOverlay + hasPilotCamera - Clear the current overlay. - i - Some Old Editor Command + Returns true if the object airplane or helicopter has a pilotCamera. - https://community.bistudio.com/wiki/clearOverlay + https://community.bistudio.com/wiki/hasPilotCamera - clearOverlay Control + hasPilotCamera Object - clearOverlay map + hasPilotCamera object - $Code$clearOverlay _map,$/Code$ + $Code$hasPilotCamera vehicle player$/Code$ - undefined / undefined + global / undefined - Nothing + Boolean + - clearRadio + sliderSetRange - Clean up the content of radio protocol history. + Set limits of slider idc of topmost user dialog. - https://community.bistudio.com/wiki/clearRadio + https://community.bistudio.com/wiki/sliderSetRange - clearRadio + sliderSetRange Array + + Control sliderSetRange Array - clearRadio + sliderSetRange [idc, min, max] + + control sliderSetRange [min, max] - $Code$clearRadio;$/Code$ + $Code$sliderSetRange [101, 0, 100];$/Code$ - undefined / local + undefined / undefined - Use $Code$ enableRadio false;$/Code$ to disable the chat. - Nothing + Nothing - Nothing + - clearWeaponCargoGlobal + removeAllItemsWithMagazines - Removes all weapons from the vehicle cargo space. MP synchronized. + Removes all itemsWithMagazines from the uniform, vest and backpack. - https://community.bistudio.com/wiki/clearWeaponCargoGlobal + https://community.bistudio.com/wiki/removeAllItemsWithMagazines - clearWeaponCargoGlobal Object + removeAllItemsWithMagazines Object - clearWeaponCargoGlobal unit + removeAllItemsWithMagazines unit - $Code$clearWeaponCargoGlobal jeepOne;$/Code$ + $Code$removeAllItemsWithMagazines player ;$/Code$ - global / global + undefined / undefined - Nothing + Nothing + - clearWeaponCargo + current3DENOperation - Remove all weapons from the given vehicle's weapon cargo space. + Returns the currently performed editing operation in Eden Editor. - https://community.bistudio.com/wiki/clearWeaponCargo + https://community.bistudio.com/wiki/current3DENOperation - clearWeaponCargo Object + current3DENOperation - clearWeaponCargo vehicleName + current3DENOperation - $Code$clearWeaponCargo _truck$/Code$ + $Code$if ( current3DENOperation == "Move") then { hint "Moving";};$/Code$ - global / local + undefined / undefined - (October 24, 2009) - Only works on clients. - Nothing + String + - clearWeaponPool + setUnitLoadout - Remove all weapons from the weapon pool, of which the player may choose in the following missions. Available in campaigns only. + Creates a loadout from given inventory structure and applies it to a unit. + This command is not final and might be changed in a near future. - https://community.bistudio.com/wiki/clearWeaponPool + https://community.bistudio.com/wiki/setUnitLoadout - clearWeaponPool + Object setUnitLoadout Array - clearWeaponPool + unit setUnitLoadout [loadout, rearm] - + $Code$_loadout = getUnitLoadout player_1 ; + player_2 setUnitLoadout _loadout;//Copies loadout from player_1 and applies it to player_2$/Code$ + - undefined / undefined + global / global - Nothing + Nothing + - clientOwner + clearAllItemsFromBackpack - Returns the client's owner id + Removes all items from the backpack. - https://community.bistudio.com/wiki/clientOwner + https://community.bistudio.com/wiki/clearAllItemsFromBackpack - clientOwner + clearAllItemsFromBackpack Object - clientOwner + clearAllItemsFromBackpack unit - $Code$_id = clientOwner ;$/Code$ - + undefined / undefined - (February 17, 2016) - On hosted server there could be some inconsistency between clientOwner, owner and object creator id, especially in missions started from save. On the dedicated server this command however works reliably. - Number + Nothing + - closeDialog + createDisplay - Close the currently active user dialog with exit code. Most common exit codes are: - $Code$#define IDC_OK 1 //emulate "Ok" button$/Code$ - $Code$#define IDC_CANCEL 2 //emulate "Cancel" button$/Code$ + Creates child display of given display and loads from "resourceName". The notable difference between createDisplay and createDialog is that with createDisplay the player would be able to move whilst having control of the mouse pointer. + Since Arma 3 v1.49.131653 createDisplay returns Display and will first look in description.ext for resourceName config, if not found, it will then look in main config. + Displays created with both createDisplay and createDialog will take control of the mouse pointer and will close when user presses Esc. + $Code$_emptyDisplay = findDisplay 46 createDisplay "RscDisplayEmpty";$/Code$ + If display is needed which exists independently, it can be created in IGUI layer with cutRsc command. + $Code$"someLayer" cutRsc ["RscTitleDisplayEmpty", "PLAIN"]; + _emptyDisplay = uiNamespace getVariable "RscTitleDisplayEmpty";$/Code$ + Such display can be closed with closeDisplay command or by overwriting the same cut layer with another output. Note that "Unload" EH for some reason does not work with such display. - https://community.bistudio.com/wiki/closeDialog + https://community.bistudio.com/wiki/createDisplay - closeDialog Number + Display createDisplay String - closeDialog exitcode + parent createDisplay resourceName - $Code$closeDialog 2;$/Code$ - - $Code$#define IDC_CANCEL 2 - closeDialog IDC_CANCEL;$/Code$ + $Code$findDisplay 46 createDisplay "RscCredits";$/Code$ - local / local + undefined / undefined + (August 23, 2014) + Do not simply createDisplay from UI context code such as "ButtonDown" UI Event handler, as it will crash the game. Instead use spawn scope: + $Code$[] spawn { findDisplay 46 createDisplay "RscCredits"};$/Code$ + + (November 15, 2014) + Arma3 v1.34 + When using CreateDisplay instead of CreateDialog, all the commands for working with the controls of the display only work with the control version, not the IDC version. + EXAMPLE: + $Code$LbAdd [1234, "item"]; // does not work on displays, and won't error either + _ctrl LbAdd "item"; // does work with displays$/Code$ + So you have to use the control(DisplayCtrl) and not the IDC. + + (July 29, 2017) + A user dialog created with createDisplay over mission display ( findDisplay 46) will stop display event handlers added to mission display from firing. However if it is created with createDialog then the event handlers continue to work. - Nothing + Nothing/Display + - closeDisplay + getText - Close given display with exit code. Most common exit codes are: - $Code$#define IDC_OK 1 //emulate "Ok" button$/Code$ - $Code$#define IDC_CANCEL 2 //emulate "Cancel" button$/Code$ + Extract text from config entry. - https://community.bistudio.com/wiki/closeDisplay + https://community.bistudio.com/wiki/getText - Display closeDisplay Number + getText Config - display closeDisplay exitcode + getText config - $Code$_display closeDisplay 1;$/Code$ - - $Code$#define IDC_OK 1 - _display closeDisplay IDC_OK;$/Code$ + $Code$_text = getText ( configFile "CfgVehicles" "Thing" "icon");$/Code$ undefined / undefined - (November 18, 2015) - closeDisplay does not instantly close the display but does it on next display simulation cycle (when display becomes active) + (Mar 28, 2014) + (ArmA3 1.14) It's recommended to use BIS_fnc_GetCfgData or BIS_fnc_returnConfigEntry to get variable cfg data rather than conditioning via isNumber, isText, isArray, getNumber, getText and getArray combination. + Traditional workaround: + $Code$ + _cfg = configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type" + switch ( true ) do + { + case ( isNumber _cfg): { getNumber _cfg}; + case ( isText _cfg): { getText _cfg}; + case ( isArray _cfg): { getArray _cfg;}; + default { nil }; + }; + $/Code$ + Recommended workaround: + $Code$ + ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_GetCfgData ; + $/Code$ + To return default value once entry was not found, we can use BIS_fnc_returnConfigEntry instead of BIS_fnc_GetCfgData. e.g. + $Code$ + [( configFile "CannonFire" "LightExp"),"lifeTime",0] call BIS_fnc_returnConfigEntry ;//0.5 + $/Code$ + To compose collected String into Array, use BIS_fnc_getCfgDataArray instead. E.g. + $Code$ + ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_getCfgDataArray ; + $/Code$ - Nothing + String + - closeOverlay + triggerAttachObject - Closes the current overlay without committing. - i - Some Old Editor Command + Assigns a static object to the trigger. The activation source is changed to "STATIC". - https://community.bistudio.com/wiki/closeOverlay + https://community.bistudio.com/wiki/triggerAttachObject - closeOverlay Control + Object triggerAttachObject Number - closeOverlay map + triggerName triggerAttachObject objectId - + $Code$_trigger triggerAttachObject 1234;$/Code$ + undefined / undefined + (October 31, 2013) + This command doesn't quite work in Arma 3 [1] + Further investigation reveals that objectId param for this command is some kind of map id and not the id you can see in the editor. This map id could be seen in multiplayer when looking at netId of the static objects, for example "1:-23984219837", the -23984219837 would be the objectId. Unfortunately it still doesn't work. - Nothing + Nothing + - collapseObjectTree + hasInterface - Collapse the object tree. - i - Some Old Editor Command + Returns true if the computer has an interface (a real player). False for a dedicated server or for a headless client. - https://community.bistudio.com/wiki/collapseObjectTree + https://community.bistudio.com/wiki/hasInterface - collapseObjectTree Control + hasInterface - collapseObjectTree map + hasInterface - $Code$collapseObjectTree _map,$/Code$ + $Code$headless = !( hasInterface || isDedicated );$/Code$ + + $Code$_isHC = ! hasInterface && ! isDedicated ;$/Code$ undefined / undefined + (December 21, 2014) + $Code$ if ( isDedicated ) then { + //run on dedicated server only + }; + if ( isServer ) then { + //run on dedicated server or player host + }; + if ( hasInterface ) then { + //run on all player clients incl. player host + }; + if (! isDedicated ) then { + //run on all player clients incl. player host and headless clients + }; + if (! isServer ) then { + //run on all player clients incl. headless clients but not player host + }; + if (! hasInterface ) then { + //run on headless clients and dedicated server + }; + if (! hasInterface && ! isDedicated ) then { + //run on headless clients only + };$/Code$ - Nothing + Boolean + - collect3DENHistory + removeMagazineGlobal - Execute a block of code in which all Eden Editor operations will be recorded as one history step. For example creating an entity, setting its attributes and then connections would normally be recorded as three different steps. Calling them all within single collect3DENHistory block will group them together and the user will need to undo only once to revert the changes. + Removes the magazine from the unit. - https://community.bistudio.com/wiki/collect3DENHistory + https://community.bistudio.com/wiki/removeMagazineGlobal - collect3DENHistory Code + Object removeMagazineGlobal String - collect3DENHistory code + unit removeMagazineGlobal magazineName - $Code$collect3DENHistory { - _logic = create3DENEntity ["Logic", "Logic", position player ]; - add3DENConnection ["Sync", [_logic], player ]; - }; - // Creates a logic and connects it to player in one history step.$/Code$ + $Code$player removeMagazineGlobal "30Rnd_65x39_caseless_mag";$/Code$ - undefined / undefined + global / global - Nothing + Nothing + - combatMode + setUnloadInCombat - Returns the combat mode of the given unit. See setCombatMode for more information about combat modes. + If cargo or turret units should get out of vehicle when in combat. If true, vehicle will stop and units will dismount. Vehicle must be local. - https://community.bistudio.com/wiki/combatMode + https://community.bistudio.com/wiki/setUnloadInCombat - combatMode Object/Group + Object setUnloadInCombat Array - combatMode grp + vehicle setUnloadInCombat [allowCargo, allowTurrets] - $Code$if (( combatMode _grp1) == "BLUE") then {_grp1 setCombatMode "GREEN"};$/Code$ + $Code$_veh setUnloadInCombat [ true, false ];$/Code$ - global / undefined + local / global - (August 3, 2006) - Notes from before the conversion: - Use setCombatMode to set the combat mode. The definitions of the colours are given under that command. - - In OFP v1.96, combatMode return value does not change when unit's combat mode is set with radio commands, ie troops under the player's command. - String + Nothing + - commandArtilleryFire + airportSide - Orders a unit to reload defined magazine commence fire burst on the given position (via the radio). + Checks a side of the airport. ID is the number to identify which airport on the island you want to check. + Possible values for sara are: + 0 - Paraiso + 1 - Rahmadi + 2 - Pita + 3 - Antigua - https://community.bistudio.com/wiki/commandArtilleryFire + https://community.bistudio.com/wiki/airportSide - Object commandArtilleryFire Array + airportSide Number + + airportSide Object - unit commandArtilleryFire [position, type, rounds] + airportSide id + + airportSide target - $Code$mortar1 commandArtilleryFire [[3000, 120, 1000], "8Rnd_82mm_Mo_shells", 3];$/Code$ + $Code$airportSide 0;$/Code$ undefined / undefined @@ -9940,651 +10846,689 @@ - Nothing + Side - Side + - commandChat + setCurrentChannel - Types text to the command radio channel. Must have assigned "ItemRadio" to see or transmit the messages. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) + Sets given channel as current chat channel. Scripted way of selecting desired channel on the UI. The given channel may be disabled (see enableChannel ), this is why this command returns boolean, true on success or false on failure. Correspondence between channel and number: + 0 = Global + 1 = Side + 2 = Command + 3 = Group + 4 = Vehicle + 5 = Direct + 6-15 = Custom Radio (see radioChannelCreate ) - https://community.bistudio.com/wiki/commandChat + https://community.bistudio.com/wiki/setCurrentChannel - Object commandChat String - - Array commandChat String + setCurrentChannel Number - unitName commandChat chatText - - [side, identity] commandChat chatText + setCurrentChannel channel - $Code$_soldierOne commandChat "Show this text";$/Code$ - - $Code$[ playerSide, "HQ"] commandChat "Do this! That's an order!";$/Code$ - - $Code$driver vehicle player sideChat "sideChat"; - driver vehicle player globalChat "globalChat"; - driver vehicle player groupChat "groupChat"; - vehicle player vehicleChat "vehicleChat"; - driver vehicle player commandChat "commandChat"; - driver vehicle player customChat [1, "customChat"]; - systemChat "systemChat";$/Code$ + $Code$_isDirectSelected = setCurrentChannel 5; // sets Direct channel as current active$/Code$ - global / local + undefined / local + (December 9, 2015) + This command can be used together with custom radio channels, but an offset of 5 must be added to the index from radioChannelCreate. + $Code$_index = radioChannelCreate [[1, 0, 0, 1], "Custom Channel 1", "%UNIT_NAME", [player]]; + setCurrentChannel (_index + 5); + $/Code$ - Nothing - Nothing + Boolean + - commandFSM + isEqualTypeAll - Orders a unit to process command defined by FSM file (via the radio). + Compares types of all elements of an array to the type of a single value. - https://community.bistudio.com/wiki/commandFSM + https://community.bistudio.com/wiki/isEqualTypeAll - Object/Array commandFSM Array + Array isEqualTypeAll Anything - unitName commandFSM [fsm name, position, target] + arr isEqualTypeAll val - $Code$_soldierOne commandFSM ["move.fsm", position player, player]$/Code$ + $Code$_arr = [1,2,3,4,5,6,7,8,9,0]; + _arr isEqualTypeAll ""; //false + _arr isEqualTypeAll 0; //true$/Code$ undefined / undefined + (November 25, 2015) + This command will return false if the array on the left side is empty ([]) regardless of the sample value. + $Code$[] isEqualTypeAll "" + - false + $/Code$ - Nothing + Boolean + - commandFire + assignedCommander - Order the given unit to fire on the given target (via the radio). - If the target is objNull, the unit is ordered to fire on its current target (set with doTarget or commandTarget ). + Returns the soldier assigned to the given vehicle as a commander. - https://community.bistudio.com/wiki/commandFire + https://community.bistudio.com/wiki/assignedCommander - Object/Array commandFire Object + assignedCommander Object - unitName commandFire target + assignedCommander vehicle - $Code$_ESoldier1 commandFire _WSoldier1$/Code$ + $Code$_commander = assignedCommander vehicleName$/Code$ - local / local + undefined / undefined - Nothing + Object + - commandFollow + ctrlTextHeight - Order the given unit to follow the given other unit (via the radio). + Returns the control text height. Supported control types are: + CT_STATIC 0 + CT_EDIT 2 ( Since Arma 3 v1.57.135040 ) + CT_STRUCTURED_TEXT 13 - https://community.bistudio.com/wiki/commandFollow + https://community.bistudio.com/wiki/ctrlTextHeight - Object/Array commandFollow Object + ctrlTextHeight Control - unitName commandFollow followedunit + ctrlTextHeight control - $Code$_soldier1 commandFollow _soldier2$/Code$ + $Code$_h = ctrlTextHeight _ctrl;$/Code$ - local / undefined + undefined / undefined + (May 24, 2017) + in ArmA 3 v.1.70.141764, this command always returns 0 if the control has no width. - Nothing + Number + - commandGetOut + isForcedWalk - Orders the unit to get out from the vehicle (via the radio). + Returns true if player is forced to walk with forceWalk. - https://community.bistudio.com/wiki/commandGetOut + https://community.bistudio.com/wiki/isForcedWalk - commandGetOut Object/Array + isForcedWalk Object - commandGetOut unitName + isForcedWalk unitName - $Code$commandGetOut _unitOne$/Code$ + $Code$_bool = isForcedWalk player ;$/Code$ - local / global + undefined / undefined - Nothing + Boolean + - commandMove + lbSetPictureColorDisabled - Order the given unit(s) to move to the given location (via the radio). Exactly the same as doMove, except this command displays a radio message. + Sets the disabled color of item's picture (left) with the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. - https://community.bistudio.com/wiki/commandMove + https://community.bistudio.com/wiki/lbSetPictureColorDisabled - Object/Array commandMove Array + lbSetPictureColorDisabled Array + + Control lbSetPictureColorDisabled Array - unitName commandMove position + lbSetPictureColorDisabled [idc, index, color] + + control lbSetPictureColorDisabled [index, color] - $Code$_soldier1 commandMove ( getMarkerPos "Marker1")$/Code$ + $Code$lbSetPictureColorDisabled [101, 0, [1, 1, 1, 0.25]];$/Code$ + + $Code$_ctrl lbSetPictureColorDisabled [0, [1, 1, 1, 0.25]];$/Code$ - local / global + undefined / undefined + More information on the LB command family can be found here - Nothing + Nothing - Nothing + - commandRadio + currentMagazineDetailTurret - Sends the audio message to the command radio channel. Must have assigned "ItemRadio" to send or receive the transmission. The message is defined in CfgRadio in the description.ext file or config radio protocol. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). - Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. + Returns the class name of currently used magazine on specified turret. Use turret path [-1] for driver's turret. Note that a turret is not loaded until unit enters it, so this command will return "". - https://community.bistudio.com/wiki/commandRadio + https://community.bistudio.com/wiki/currentMagazineDetailTurret - Object commandRadio String - - Array commandRadio String + Object currentMagazineDetailTurret Array - unit commandRadio radioName - - [side, identity] commandRadio radioName + vehicle currentMagazineDetailTurret [turret path] - $Code$_soldierOne commandRadio "messageOne";$/Code$ - - $Code$player commandRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ - - $Code$[ west, "Base"] commandRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ + $Code$_magazineDetail = MBT_Kuma currentMagazineDetailTurret [0];$/Code$ - global / local + undefined / undefined - (June 24, 2010) - example: $Code$ _unit commandRadio "SentCmdHide";$/Code$ - radio command from CA_Dubbing config should work - - (December 3, 2016) - To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: - $Code$ player commandRadio "#MySound.ogg";$/Code$ - Nothing - Nothing + String + - commandStop + addMagazineAmmoCargo - Order the given unit(s) to stop (via the radio). A stop command will never finish, the unit will never be ready. + Adds magazines with specified ammo count to the cargo space of a vehicle or a container. - https://community.bistudio.com/wiki/commandStop + https://community.bistudio.com/wiki/addMagazineAmmoCargo - commandStop Object/Array + Object addMagazineAmmoCargo Array - commandStop unitName + cargospace addMagazineAmmoCargo [magazine, quantity, ammocount] - $Code$commandStop _soldier1;$/Code$ - - $Code$commandStop [_soldier1, _soldier2];$/Code$ - - $Code$commandStop ( units player );$/Code$ + $Code$_ammobox addMagazineAmmoCargo ["30Rnd_65x39_caseless_mag", 2, 5];$/Code$ global / global - In ArmA 1.14, this command will not stop a unit that has been given a move order by means of selecting the unit, then clicking on the in game map (or ground). - Nothing + Nothing + - commandSuppressiveFire + cursorTarget - Order the given unit to suppress a given position or target (via the radio). + Returns the target pointed at by the player (usually with cross-hairs). The target has to be known to the player to some degree ( knowsAbout 0). If target is completely unknown, command returns objNull. + A valid target could belong to an enemy or a friendly side. Buildings are normally known to player and so are valid targets. Try nearTargets to see what else is considered a target. While friendly targets are usually known to the player, enemy targets can be totally unknown, especially if "auto-spotting" (or sometimes called "auto-reporting") is switched off. To check if auto-spotting is enabled: difficultyEnabled "autospot" + cursorTarget also returns locked target for the duration of the lock even if there is another target under the cursor. As soon as missile is fired, cursorTarget switches to current known target under cursor or objNull. Targeting (currently "T" in Arma 3) works regardless of the state of "auto-spotting". + Adding a target to the known list could be done with reveal command. When auto-spotting is enabled, zooming on the enemy target with cross-hairs usually reveals the target. As friendly targets are always known, zooming on friendly target could improve knowsAbout value. + Side relations can also influence target knowledge. For example east target is unknown target for civilian, but making them friends with setFriend instantly improves civilian knowledge of the east. - https://community.bistudio.com/wiki/commandSuppressiveFire + https://community.bistudio.com/wiki/cursorTarget - Object/Array commandSuppressiveFire Object/Array + cursorTarget - unitName commandSuppressiveFire target + cursorTarget - $Code$_soldier commandSuppressiveFire [1869.508,5760.962,0.000]$/Code$ - - $Code$_soldier commandSuppressiveFire cursorTarget$/Code$ + $Code$alive cursorTarget ;$/Code$ - local / local + undefined / undefined - (October 8, 2016) - Command expects position as second argument in format ASL in A3 1.64.138497. + (01:25, 18 February 2011 (CET)) + If the player is in a vehicle and a lockable weapon is selected and a target is locked, the locked target will be returned, regardless if it's in sight or not. + + (11 March 2011) + Addition to Myke's note: + It also works for infantry with launchers that canLock, like Javelin or AA. + Only the lock cursor must be visible on the target - not a full lock necessarily. + + (13:09, 11 July 2009 (CEST)) + Player must knows about what he is pointing to for this command to return something other than NULL-OBJECT + This command doesn't work through building windows + This recognition doesn't work with every object : soldiers, vehicles, big houses are ok, but not trees, plants, road signs or others little things + + (22:11, 23 August 2013 (CEST)) + To add to Lou Montana's note, use reveal command on the object you want to be detected with cursorTarget when pointing at it. Without it, distant units are most likely to return objNull even if you shoot and hit them. Units that have been previously subjected to enableSimulation false; or enableSimulationGlobal false; may stay unrecognised for a long time even after simulation was re-enabled, returning objNull as cursorTarget. Force revealing units with reveal command usually solves the problem. For example: $Code${ player reveal _x} forEach allUnits ;$/Code$ + + (December 3, 2014) + cursorTarget seems to change when your cursor enters an object's boundingBox. Because of this, if the player is inside the boundingBox, the object will always be the current cursorTarget if the player is not looking at another object, although sometimes the object will remain the cursorTarget even if the player does. + + (April 21, 2015) + Cursortarget will not return enemy units, even very close, if "autoreport" is disabled in game difficulty settings, and if player is alone. + However, when enemy units open fire on player, the cursortarget becomes functional on these units. If player is in a group, cursortarget is also functional (report by other units). + + (February 5, 2016) + CursorTarget will return a Null_Object for all of thus which have a disabled simulation (_object enableSimulation false). - Nothing + Object + - commandTarget + inputAction - Order the given unit(s) to target the given target (via the radio). Command given to the player, puts a red square with words Target and Distance on player's HUD at target location. If player in vehicle and has radar facilities, it also adds target marker to the radar. + Return the state of input devices mapped to given input action. + For Arma 3 inputActions see: inputAction/actions. + For Arma 3 inputActions bindings see: inputAction/actions/bindings. + For earlier Arma editions see Category:Key Actions. - https://community.bistudio.com/wiki/commandTarget + https://community.bistudio.com/wiki/inputAction - Object commandTarget Object + inputAction String - unitName commandTarget target + inputAction name - $Code$_ESoldier1 commandTarget _WSoldier1;$/Code$ + $Code$inputAction "leanLeft" + // Returns 1 if the button mapped to "leanLeft" is pressed currently else 0.$/Code$ - $Code$player commandTarget bob;$/Code$ + $Code$[] spawn { + waitUntil { inputAction "reloadMagazine" 0}; + hint "Reload Key Pressed"; + };$/Code$ - local / global + undefined / undefined + (07:38, 15 October 2010 (CEST)) + This command also returns values other than 0 and 1 (like 0.02 or 1.3). Any value greater than zero usually signals that the key or button is pressed. inputAction does not work reliably when used in RscDisplayMission's onKeyDown event handler (the same is probably true for other input related event handlers). + + (May 8, 2014) + inputAction does not return the actual state of the queried key when a dialog screen is open. Instead, it will always return 0. + + (July 31, 2015) + inputAction is capable of returning the state of analog inputs. This includes mouse, joystick, and even TrackIR. A joystick axis will return a value from 0 to 1, while mouse movement returns the rate of change, which can be 1. + Right mouse click is currently not supported, but right mouse hold is. http://feedback.arma3.com/view.php?id=25015 - Nothing + Number + - commandWatch + setSpeedMode - Orders the unit(s) to watch the given position or target (via the radio). Use objNull as the target to order a unit to stop watching a position/target + Set group speed mode. Mode may be one of: + "LIMITED" (half speed) + "NORMAL" (full speed, maintain formation) + "FULL" (do not wait for any other units in formation) - https://community.bistudio.com/wiki/commandWatch + https://community.bistudio.com/wiki/setSpeedMode - Object/Array commandWatch Array - - Object/Array commandWatch Object + Object/Group setSpeedMode String - unitName commandWatch position - - unitName commandWatch target + groupName setSpeedMode mode - $Code$_soldierOne commandWatch markerPos "MarkerMoveOne"$/Code$ - - $Code$[s1,s2] commandWatch player$/Code$ + $Code$_groupOne setSpeedMode "LIMITED"$/Code$ local / global + (14 Feb 2010) + Although setSpeedMode can be called on an individual unit, the entire group will be affected. + + (17 May 2008) + In Multiplayer, this command is overwritten by itself to NORMAL or FULLSPEED (i don't know which one, but it's fast move) when you ask the unit to move via script (ex : _unit doMove (getMarkerPos "destination"); ) + The solution to solve this problem is to initialize the setSpeedMode after your order the unit to move. + So basically it gives you : + _unit doMove (getMarkerPos "destination"); + _unit setSpeedMode "LIMITED"; + If you plan to move the unit again after it reaches its destination, you will have to set the speed mode to LIMITED again like i did just above. - Nothing - Nothing + Nothing + - commander + isVehicleCargo - In OFP it returns the commander of a vehicle. Since ArmA and VBS2 it returns the primary observer. The commander of a vehicle can be found with effectiveCommander. + Return transporting vehicle if vehicle is loaded in one. - https://community.bistudio.com/wiki/commander + https://community.bistudio.com/wiki/isVehicleCargo - commander Object + isVehicleCargo Object - commander vehicleName + isVehicleCargo vehicle - $Code$moveOut commander _tank;$/Code$ - - $Code$// Detect if player is in commander turret of a vehicle: - _isVehicleCommander = player isEqualTo commander objectParent player ;$/Code$ + $Code$// Blackfish with given variable name blackfish, with a vehicle inside called quad + _transportingVehicle = isVehicleCargo quad; //returns blackfish + //Vehicle called quad that is not being transported as cargo + _transportingVehicle = getVehicleCargo quad; //returns objNull$/Code$ - global / undefined + undefined / undefined - (August 3, 2006) - Notes from before the conversion: - It is also possible to find the commander of a vehicle by placing a C after the name of the vehicle so Tank1C and commander Tank1 both refer to the same unit, providing the original commander has not got out of the tank. - The difference between the two is Tank1C is always the unit that was commander of the tank when the mission started, whilst commander Tank1 is the commander which is now there. - - (August 3, 2006) - WARNING about Hardrock note: - Take very care about this : if you give a vehiculeVarName to one crew, so his referent will not be Tank1x anymore ! Also, if in the mission editor, you put something in the name field, when this soldier will getin a vehicle, it will not be a Tank1x too. So do not take consideration about Hardrock note, if you don't want to have bad surprise. It Is better to force names by using setVehicleVarName command. - $Code$(( crew tank) select 0) setVehicleVarName "Tankcrew0"$/Code$ - Object + Object + - commandingMenu + items - Return the name of the player actual topmost commanding menu. + Returns an array of names of all special items of a vehicle or a soldier. - https://community.bistudio.com/wiki/commandingMenu + https://community.bistudio.com/wiki/items - commandingMenu + items Object - commandingMenu + items unit - $Code$waitUntil { commandingMenu == "RscStatus"}; hint "Press 4, I'm bleeding !";$/Code$ + $Code$_itemsplayer = items player ;$/Code$ + + $Code$player sideChat format ["%1", items player ];$/Code$ - undefined / undefined + global / undefined - (July 15, 2009) - Possible values are : - "" - means menu is closed - "RscMainMenu" - Main menu, by pressing backspace - "RscMoveHigh" - Move menu (1) - "#WATCH" - Watch menu (2) - "#WATCH0" - Watch menu - next page (2-0) - "RscWatchDir" - Engage menu (3) - "RscWatchMoreDir" - Engage menu - watch a direction (3-8) - "#GET_IN" - Mount menu (4) - "RscStatus" - Status menu (5) - "RscCallSupport" - Mount menu - call support (5-1) - "#ACTION" - Action menu (6) - "RscCombatMode" - Combat mode menu (7) - "RscFormations" - Formation menu(8) - "RscTeam" - Team menu (9) - "RscSelectTeam" - Team menu - select team (0-5) - "RscReply" - Reply menu (0) - "#User:BIS_Menu_GroupCommunication" - Communication menu (0-8) - "#CUSTOM_RADIO" - Custom sounds menu (0-9) - "RscRadio" - Radio menu (0-0) - "RscGroupRootMenu" - "simplified" menu + (June 18, 2013) + Arma 3, version 0.70 - magazines, explosives, grenades and all items currently linked on the unit are not returned now. - String + Array + - comment + preprocessFileLineNumbers - Define a comment. - Mainly used in SQF Syntax, as you're able to introduce comment lines with semicolons in a SQS script. + Returns the preprocessed content of the given file. The preprocessor is C-like, it supports comments using /* */ and PreProcessor_Commands. The preprocessor also adds a default debug entrypoint for compiler at the begining of script: #line 1 "aFilename" + The #line keyword can be used in any script that are not preprocess, or with preprocess script with extra macro to protect reserverd sharp character. The format is: + #line number " name " + followed by new line. number could be only positive integer and name could be any name. This will be used only if an error occurs in the script. The error will contain the line: + File filename, line linenumber + where filename will be the name you set and linenumber will be number + how many lines it is from the #line line. If the error happened on the line right under #line it will add 0 to number, if on second line, it will add 1 etc. + It is possible to use more than one #line keywords, but it seems having just one at the top for little script is enough to pinpoint position of the error easily. - https://community.bistudio.com/wiki/comment + https://community.bistudio.com/wiki/preprocessFileLineNumbers - comment String + preprocessFileLineNumbers String - comment commentMsg + preprocessFileLineNumbers fileName - $Code$// script.sqs - comment "This is a commented line"$/Code$ - - $Code$// function.sqf - comment "This is a commented line";$/Code$ + $Code$_string = preprocessFileLineNumbers "A3\ui_f\scripts\IGUI\RscUnitInfo.sqf" + // Result is: + //#line 1 "A3\ui_f\scripts\IGUI\RscUnitInfo.sqf" + //disableserialization; + //........$/Code$ undefined / undefined - (September 12, 2009) - Like ArmA, you can't use brackets to make a multi-lines comment. But, in a sqf file, you can make a comment as follow : - $Code$ comment " - first line - seconde line";$/Code$ - - (November 4, 2016) - If a file is loaded with preprocessFile, execVM or spawn (but not loadFile), you may also define C-like comments using //... and /*...*/. + (December 17, 2013) + The main difference between preprocessFile and preprocessFileLineNumbers is that the latter adds #line keyword to the target file, which allows to log the __LINE__ error happened at and the __FILE__ error happened in. - (November 4, 2016) - comment can also be used to create comments inside trigger activation fields where // or */...*/ does not work. + (November 4, 2017) + The #line directive get's removed from the output. + So to add a custom #line directive before while using preprocessFileLineNumbers, you have to use a preprocessor macro like this: + #define DEBUG(sharp,name) sharp##line 0 name + and add this at the right place in your code + DEBUG(#,"your filename"); + This way you can have custom filenames in error messages. - Nothing + String + - commitOverlay + setLightAmbient - Commit the current overlay. - i - Some Old Editor Command + Set ambient color of light. This includes surfaces that face away from the light, unlike setLightColor. - https://community.bistudio.com/wiki/commitOverlay + https://community.bistudio.com/wiki/setLightAmbient - commitOverlay Control + Object setLightAmbient Array - commitOverlay map + light setLightAmbient [r, g, b] - $Code$commitOverlay _map,$/Code$ + $Code$myLight setLightAmbient [0.5,0,0]; //produces red light around the origin source$/Code$ - undefined / undefined + local / local + (Dec 1, 2006) + Light can be created with command createVehicleLocal with special vehicle class "#lightpoint" + for example: + $Code$_light = "#lightpoint" createVehicleLocal pos; + _light setLightBrightness 1.0; + _light setLightAmbient [0.0, 1.0, 0.0]; + _light setLightColor [0.0, 1.0, 0.0]; + _light lightAttachObject [_object, [0,0,0]]; + $/Code$ + + (Aug 17, 2007) + To clarify: + setLightAmbient - Terrain and surrounding objects are bathed in this colour. + setLightColor - Controls the "haze" seen around the lightsource (ex flares). + + (Mar 25, 2014) + When both setLightAmbient and setLightColor were [0,0,0], there won’t be any visual presentation on the light source. - Nothing + Nothing + - compileFinal + getPosASLW - Compile expression and makes it final, preventing it from: - repeated compile or compileFinal - removal by nil - remote rewrite using publicVariable, publicVariableClient and publicVariableServer + Returns the object position height above sea surface (waves included). - https://community.bistudio.com/wiki/compileFinal + https://community.bistudio.com/wiki/getPosASLW - compileFinal String + getPosASLW Object - compileFinal expression + getPosASLW obj - $Code$myCode = compileFinal "a = a + 1"; - call myCode; - //--- Repeated compile won't have any effect - myCode = compileFinal "a = a + 2"; - //--- Duplicate code will be final as well - myDuplicateCode = myCode;$/Code$ + $Code$_pos = getPosASLW _diver;$/Code$ - undefined / local + global / undefined - (August 14, 2013) - 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. - - (May 27, 2017) - in ArmA 3 1.70.141838, compileFinal also works for profileNamespace and uiNamespace. But be careful with that. - Code + Array + - compile + getPosWorld - Compile expression. + Returns PositionWorld, which is PositionASL of the model centre [0,0,0] of an object, rather than transformed boundingCenter or LandContact vertices. - https://community.bistudio.com/wiki/compile + https://community.bistudio.com/wiki/getPosWorld - compile String + getPosWorld Object - compile expression + getPosWorld object - $Code$_string = "a = a + 1"; - _code = compile _string; - call _code;$/Code$ + $Code$_obj setPosWorld getPosWorld _obj;$/Code$ - $Code$hint str compile "a = b"; - //Result: {a=b}$/Code$ + $Code$ATLToASL (_groundObj modelToWorld [0,0,0]) isEqualTo getPosWorld _groundObj; //true$/Code$ + + $Code$// Wave height under a boat: + _h = ((boat modelToWorld [0,0,0]) vectorDiff getPosWorld boat) select 2;$/Code$ - undefined / undefined + global / undefined - Code + Array + - completedFSM + menuHover - Check whether the given FSM completes. - The FSM handle is the number returned by the execFSM command. + Returns path to menu entry mouse is currently hovering over. - https://community.bistudio.com/wiki/completedFSM + https://community.bistudio.com/wiki/menuHover - completedFSM Number + menuHover Number - completedFSM fsmHandle + menuHover idc - $Code$_completed = completedFSM _fsmHandle;$/Code$ - + undefined / undefined - Boolean + Array + - composeText + ctrlSetFontSecondary - Creates a structured text by joining the given structured or plain texts. + Sets the font size of the secondary text of given control. - https://community.bistudio.com/wiki/composeText + https://community.bistudio.com/wiki/ctrlSetFontSecondary - composeText Array + Control ctrlSetFontSecondary String - composeText [text1, text2,] + ctrl ctrlSetFontSecondary fontClass - $Code$_txt = composeText ["First line", image "data\isniper.paa", lineBreak, "Second line"];$/Code$ + $Code$_control ctrlSetFontSecondary "TahomaB";$/Code$ undefined / undefined @@ -10592,214 +11536,173 @@ - Structured_Text + Nothing + - configClasses + setPilotCameraRotation - Returns an array of config entries which meet criteria in condition code. Command iterates through all available config sub classes of the given config class. Current looked at config is stored in _x variable (similar to alternative count command implementation). Condition has to return true in order for the looked at config to be added to the resulting array. Slightly faster than configProperties, but doesn't account for config properties or inherited entries. - The condition code passed to configClasses should only be used for simple filter expressions and nothing more + Sets rotation (relative to the centered camera position) of the object airplane or helicopter pilotCamera. - https://community.bistudio.com/wiki/configClasses + https://community.bistudio.com/wiki/setPilotCameraRotation - String configClasses Config + Object setPilotCameraRotation Array - condition configClasses config + object setPilotCameraRotation rotation - $Code$// collect all CfgVehicles configs: - _configs = " true " configClasses ( configFile "CfgVehicles");$/Code$ - - $Code$// Return all classes that can transport 10 and more soldiers: - _transporters = " getNumber (_x 'transportSoldier') = 10" configClasses ( configFile "CfgVehicles");$/Code$ - - $Code$// Return all classes that inherit from 'RscText': - hint str (" inheritsFrom _x == ( configFile 'RscText')" configClasses configFile );$/Code$ + $Code$vehicle player setPilotCameraRotation [ rad 90, rad 45 ]$/Code$ - undefined / undefined + local / undefined - (oct 19, 2014) - A fantastic way to filter stuff. eg; Create an array of west vehicles and spawn then in front of the player in rows of 5 - $Code$ - private ["_cfgArray","_xPos","_yPos","_veh"]; - _cfgArray = "( - (getNumber (_x 'scope') = 2) && - {getNumber (_x 'side') == 1 && - {getText (_x 'vehicleClass') in ['Armored', 'Car', 'Air'] - } - } - )" configClasses (configFile "CfgVehicles"); - _xPos = 0; - _yPos = 0; - { - _yPos = _yPos + 20; - _veh = createVehicle [ ( configName _x ), player modelToWorld [_xPos, _yPos, 0], [], 0, "None"]; - if (_yPos = 100) then { - _yPos = 0; - _xPos = _xPos + 20; - }; - } forEach _cfgArray; - $/Code$ - - (May 28, 2016) - configClasses does not account for inherited subclasses, use configProperties with isClass filter instead - $Code$ configProperties [_config, " isClass _x", true ];$/Code$ - - (May 28, 2017) - this will get a list of ALL locations on the currently loaded world - $Code$( "true" configClasses ( configFile "CfgWorlds" worldName "names" ) ) apply { - // change each config entry into a location - nearestLocation [ - getArray ( _x "position" ), - getText ( _x "type" ) - ] - };$/Code$ - Array + Nothing + - configFile + setPlayable - Return root of config entries hierarchy. - See AllInOne Config for a full config extract as example. + Create MP role for the unit. The roles created this way are used for Join In Progress and Team Switch. + NOTE: Currently in Arma 3 this command does nothing. + Doesn't work as intended - https://community.bistudio.com/wiki/configFile + https://community.bistudio.com/wiki/setPlayable - configFile + setPlayable Object - configFile + setPlayable unitName - $Code$_isMyClassActive = isClass ( configFile / "CfgPatches" / "MyClass");$/Code$ + $Code$setPlayable _aPerson$/Code$ undefined / undefined - (Jul 19, 2014) - (ArmA3 1.24) It is recommended to use configClasses instead of BIS_fnc_getCfgSubClasses and BIS_fnc_uniqueClasses on subclasses collection or conditional selection. - $Code$ - _faces = " true " configClasses ( configFile "Cfgfaces"); - //same as: _faces = (configfile "CfgFaces") call BIS_fnc_getCfgSubClasses ; - $/Code$ - $Code$ - //Extract all animals: - animals = "(( configName _x) isKindOf 'animal')" configClasses ( configFile "CfgVehicles"); - /*same as: - aniamls = []; - [( configFile "CfgVehicles"),{ - if (( configName _this) isKindOf “animal”) then { - animals set [ count animals, _this] - } - } - ] call BIS_fnc_uniqueClasses ;*/ - $/Code$ - Return nested subclasses, currently still BIS_fnc_returnChildren - $Code$ - //Return all nested config classes. - [( configFile "CfgFaces"),1, true, true ] call BIS_fnc_returnChildren ; - $/Code$ + (december 19, 2009) + if you want to add a TeamSwitchable unit (at least in Arma2), better use addSwitchableUnit - Config + Nothing + - configHierarchy + teamSwitch - Returns hierarchy of the given config class. Just like with inheritsFrom, only complete config classes are supported + Invoke the Team Switch dialog (force it even when conditions are not met). There has to be at least one playable unit for team switch to work, and for this command to work in MP, respawn type in description.ext should be 5 (SIDE). + NOTE: When player switches and leaves behind AI unit, you need to enable "TeamSwitch" AI on it _unit enableAI "TeamSwitch" so that the unit continues with waypoints - https://community.bistudio.com/wiki/configHierarchy + https://community.bistudio.com/wiki/teamSwitch - configHierarchy Config + teamSwitch - configHierarchy configClass + teamSwitch - $Code$_hierarchy = configHierarchy ( configFile "CfgVehicles" "Car"); - //[bin\config.bin,bin\config.bin/CfgVehicles,bin\config.bin/CfgVehicles/Car]$/Code$ - + undefined / undefined - Array + Nothing + - configName + screenshot - Returns name of config entry. + Captures a screenshot and stores it to given filename. PNG is the only available format and the file must have.png extension. + The file is saved into Screenshots folder in the Profile directory. The folder is by default limited to 250 MB to prevent abuse. + To increase the limit, add the following line at the end of the profile file: + $Code$maxScreenShotFolderSizeMB = 2000;$/Code$ + 2000 can be replaced by any value in MB. - https://community.bistudio.com/wiki/configName + https://community.bistudio.com/wiki/screenshot - configName Config + screenshot String - configName config + screenshot filename - $Code$_name = configName ( configFile "CfgVehicles"); - // Result is "CfgVehicles"$/Code$ + $Code$screenshot "";$/Code$ + + $Code$screenshot "testFile.png";$/Code$ + + $Code$// The following code will result in the screenshot being placed in \Documents\Arma 3\Screenshots\any\where\you\want.png + screenshot "any\where\you\want.png";$/Code$ undefined / undefined + (July 18, 2016) + This command only captures the rendered picture (including ppEffects). GUI nor the mouse are visible on the screenshot. (ArmA 3 1.62.137494) + + (December 3, 2017) + Change Sampling on Video Options to make bigger picture than your screen. + For example, 200% sampling on 1920x1080 screen and take screenshot via this command, it will generate a 3840x2160 picture. + + (March 20, 2018) + The command will silently fail if your profiles folder is configured to be somewhere else (-profiles parameter), or if your HDR setting is below 16 (configurable in arma3.cfg or medium and above in in-game settings) + For full reference on recommended settings consult Eden Editor: Configuring Asset Previews - String + Nothing + - configNull + attachedObjects - A non-existing Config. - configNull == configNull ; // true - isNull configNull ; // true - configNull isEqualTo configNull ; // true + Returns a list of attached objects. - https://community.bistudio.com/wiki/configNull + https://community.bistudio.com/wiki/attachedObjects - configNull + attachedObjects Object - configNull + attachedObjects obj - $Code$_config = missionNamespace getVariable ["myConfig", configNull ];$/Code$ + $Code${ + detach _x; + } forEach attachedObjects player ;$/Code$ - $Code$str configNull ; // ""$/Code$ + $Code$if ( count attachedObjects player == 0) then { + hint "There are no objects attached to player"; + };$/Code$ undefined / undefined @@ -10807,218 +11710,292 @@ - Config + Array + - configProperties + animateSource - Returns an array of config entries which meet criteria in condition code. Command iterates through available classes and config properties for given config entry. If 3rd param is true the search also includes inherited properties. Current looked at config is stored in _x variable (similar to alternative count command implementation). Condition has to return true in order for the looked at property to be added to the resulting array. A bit slower than configClasses but allows to access inherited entires. - The condition code passed to configProperties should only be used for simple filter expressions and nothing more + Process an animation of the object. If animate uses class name from CfgModels Animations, animateSource uses name defined by source property. This allows to use just one command on a bunch of animations related to the same source simultaneously. Since Arma 3 v1.65.138459 speed of animation can be altered with coefficient. + A class with the same source name should also be present in main config in CfgVehicles AnimationSources and have to be bound to the "user" controller for the command to work. If in order to animate door in example below using animate command it would require 2 calls: + house animate ["Door_1_rot", 1]; + house animate ["Door_Handle_1_rot", 1]; + With animateSource this would require only 1 (provided everything is configured correctly): + house animateSource ["Door_1_sound_source", 1]; + // model.cfg + .... + class Animations + { + class Door_1_rot + { + type = rotation ; + source = Door_1_sound_source ; + selection = Door_1 ; + axis = Door_1_axis ; + memory = 1 ; + minValue = 0.1 ; + maxValue = 1 ; + angle0 = 0 ; + angle1 = ( rad 110 ); + }; + class Door_Handle_1_rot + { + type = rotation ; + source = Door_1_noSound_source ; + selection = Door_Handle_1 ; + axis = Door_Handle_1_axis ; + memory = 1 ; + minValue = 0 ; + maxValue = 0.1 ; + angle0 = 0 ; + angle1 = ( rad - 50 ); + }; + }; + ... + // config.cpp + ... + class AnimationSources + { + class Door_1_sound_source + { + source = "user" ; + initPhase = 0 ; + animPeriod = 1 ; + sound = "GenericDoorsSound" ; + soundPosition = "Door_1_trigger" ; + }; + }; + ... + If you don't know much about model config you can use this page createVehicle/vehicles for reference. Some of the AnimationSources are listed with the class names of the available assets in Arma 3. If it says "user", the chances are it could work with animateSource (see example 2). + It is recommended that animateSource command is used instead of animate whenever is possible, as it is more efficient and optimized for MP + Mixing animateSource command with animate command to animate the same part can lead to unexpected behavior - https://community.bistudio.com/wiki/configProperties + https://community.bistudio.com/wiki/animateSource - configProperties Array + Object animateSource Array - configProperties [config, condition, inherit] + object animateSource [source, phase, speed] - $Code$_configs = configProperties [ configFile "CfgVehicles" "O_Truck_02_box_F"];$/Code$ + $Code$house animateSource ["Door_1_source", 1, true ];$/Code$ - $Code$_configs = configProperties [ configFile "RscText", " true ", true ];$/Code$ + $Code$// Create UGV and manipulate its turret (Currently not possible to do with animate command. See createVehicle/vehicles for reference) + ugv = "B_UGV_01_F" createVehicle ( player getRelPos [5, 0]); + ugv addAction ["Show Turret", + { + ugv animateSource ["Turret", 0]; + ugv animateSource ["MainTurret", rad 0, true ]; + ugv animateSource ["MainGun", rad 0, true ]; + }]; + ugv addAction ["Hide Turret", {ugv animateSource ["Turret", 1]}]; + ugv addAction ["Turret Left", {ugv animateSource ["MainTurret", rad 90]}]; + ugv addAction ["Turret Right", {ugv animateSource ["MainTurret", - rad 90]}]; + ugv addAction ["Turret Up", {ugv animateSource ["MainGun", rad 30]}]; + ugv addAction ["Turret Down", {ugv animateSource ["MainGun", - rad 20]}];$/Code$ - $Code$// Get all hitpoints of a truck: - _hitPoints = []; - _hitPointsCfgs = configProperties [ - configFile "CfgVehicles" "O_Truck_02_box_F" "HitPoints", - " true ", - true - ]; - hint str _hitPointsCfgs;$/Code$ + $Code$barGate animateSource ["Door_1_source",0]; //Close + barGate animateSource ["Door_1_source",1]; //Open$/Code$ - undefined / undefined + global / global - Array + Nothing + - configSourceAddonList + enableVehicleCargo - Returns an array of addons ( CfgPatches ) in which the given config class is defined. + Enable/disable option to transport other vehicles (if configured) or be transported. - https://community.bistudio.com/wiki/configSourceAddonList + https://community.bistudio.com/wiki/enableVehicleCargo - configSourceAddonList Config + Object enableVehicleCargo Boolean - configSourceAddonList config + vehicle enableVehicleCargo enable - $Code$_addons = configSourceAddonList ( configFile "CfgVehicles" "Man"); - hint str _addons; // ["A3_Data_F","A3_Characters_F","A3_Data_F_Curator","A3_Air_F_Heli"]$/Code$ + $Code$vehicle enableVehicleCargo true ;$/Code$ undefined / undefined + (June 20, 2016) + Setting enableVehicleCargo to true does not mean a vehicle can now load vehicles as cargo. They are still required to be correctly setup as shown on the Vehicle in Vehicle Transport page. - Array + Nothing + - configSourceMod + moveInCommander - Returns modDir of the mod that given config class was loaded from. + Move soldier into vehicle commander position (Immediate, no animation). - https://community.bistudio.com/wiki/configSourceMod + https://community.bistudio.com/wiki/moveInCommander - configSourceMod Config + Object moveInCommander Object - configSourceMod config + unitName moveInCommander vehicle - $Code$configSourceMod ( configFile "CfgVehicles" "Heli_Transport_04_base_F"); //Returns "heli"$/Code$ - - $Code$configSourceMod ( configFile "CfgVehicles" "Car"); //Returns "A3"$/Code$ + $Code$_soldierOne moveInCommander _tankOne$/Code$ - undefined / undefined + local / global + (August 4, 2006) + Notes from before the conversion: + MP Note Functions MoveInCommander can only be called for local soldiers. They will be ignored for remote soldiers. (see Locality in Multiplayer ) + + In OFP v1.96, the moveIn commands will not trigger an associated getIn event. To ensure the getIn event is fired, use the "getIn Commander" action command. - String + Nothing + - configSourceModList + switchMove - Returns an array of mods (CfgMods) in which the given config class is defined. + When used on a person, the given move is started immediately (there is no transition). Use switchmove "" to switch back to the default movement if there is no transition back, otherwise the person may be stuck. + List of moves in ArmA 2 + List of moves in Armed Assault + List of moves in Operation Flashpoint: Resistance - https://community.bistudio.com/wiki/configSourceModList + https://community.bistudio.com/wiki/switchMove - configSourceModList Config + Object switchMove String - configSourceModList config + person switchmove movename - $Code$_mods = configSourceModList ( configFile "CfgVehicles" "Man"); - hint str _mods; // ["A3","curator","heli"]$/Code$ + $Code$_loon1 switchMove "FXStandDip"$/Code$ - undefined / undefined + global / local + (March 25, 2007) + In some cases the movement won't stay. I.e. AI hostages that put their hands behind their heads (_hostage switchMove "AmovPercMstpSsurWnonDnon") won't hold their hands up, unless you first use disableAI "autoTarget" on them. They mostly put their hands down because they 'noticed' unknown objects. + + (August 03, 2008) + This command will not cause an AnimChanged or AnimDone event. However, playMove will. + + (November 12, 2016) + When using this command on the player unit outside unscheduled UI contexts, it will cause a minor camera glitch for a single frame. + For example, Draw3D and KeyDown are UI contexts and so are not affected by the glitch, but EachFrame and scheduled scripts are not UI contexts and are affected by the glitch. - Array + Nothing + - confirmSensorTarget + removeVest - Sets for which Side the entity becomes a "confirmed hostile" target - a target that becomes highlighted red on the sensors display. + Removes vest from unit. - https://community.bistudio.com/wiki/confirmSensorTarget + https://community.bistudio.com/wiki/removeVest - Object confirmSensorTarget Array + removeVest Object - vehicle confirmSensorTarget [side, isConfirmed] + removeVest unit - $Code$( vehicle player ) confirmSensorTarget [ west, true ];$/Code$ + $Code$removeVest player ;$/Code$ - undefined / undefined + global / global - Nothing + Nothing + - connectTerminalToUAV + forgetTarget - Connect person with UAV terminal to UAV unit. UAV Terminal item needs to be assigned to GPS slot. If UAV is already connected to another terminal, this new connection will fail. + Resets info group has about target - https://community.bistudio.com/wiki/connectTerminalToUAV + https://community.bistudio.com/wiki/forgetTarget - Object connectTerminalToUAV Object + Group/Object forgetTarget Object - person connectTerminalToUAV uav + group forgetTarget target - $Code$bool = player connectTerminalToUAV uav1;$/Code$ - - $Code$player connectTerminalToUAV objNull ; //disconnect$/Code$ + $Code$soldier1 forgetTarget soldier2;$/Code$ - global / global + undefined / undefined - Boolean + Nothing + - controlNull + isEqualTypeAny - A non-existing Control. To compare non-existent objects use isNull or isEqualTo : - controlNull == controlNull ; // false - isNull controlNull ; // true - controlNull isEqualTo controlNull ; // true + Compares type of given value to every type in the given array and if match is found, true is returned. - https://community.bistudio.com/wiki/controlNull + https://community.bistudio.com/wiki/isEqualTypeAny - controlNull + Anything isEqualTypeAny Array - controlNull + val isEqualTypeAny types - $Code$! isNull controlNull ; // false$/Code$ - - $Code$str controlNull ; // No control$/Code$ + $Code$_var = [1,2,3]; + _var isEqualTypeAny [0,"", objNull ]; //false + _var isEqualTypeAny [0,"", objNull,[]]; //true$/Code$ undefined / undefined @@ -11026,27 +12003,32 @@ - Control + Boolean + - controlsGroupCtrl + currentThrowable - Returns a child control with specified idc from a controls group + Returns currently selected throwable, which will be launched if user presses "G". + Please note: The weapon/magazine id system is W.I.P. and may change without notice. - https://community.bistudio.com/wiki/controlsGroupCtrl + https://community.bistudio.com/wiki/currentThrowable - Control controlsGroupCtrl Number + currentThrowable Object - ctrlgrp controlsGroupCtrl idc + currentThrowable player - $Code$_control = _controlsGroup controlsGroupCtrl 101;$/Code$ + $Code$currentThrowable player ; //["SmokeShellGreen","SmokeShellGreenMuzzle",[1.00002e+007,0]]$/Code$ + + $Code$_ct = currentThrowable player ; //["HandGrenade","HandGrenadeMuzzle",[1e+007,0]] + _id = (_ct select 2 select 0) - 10000000; //18$/Code$ undefined / undefined @@ -11054,95 +12036,99 @@ - Control + Array + - copyFromClipboard + lbSetColor - Return the content of the (text) clipboard. - Disabled in Multiplayer for security reasons + Sets the color of the item (left) with the given index of the listbox or combobox with id idc of the topmost user dialog to color. + Colour is in format Color. - https://community.bistudio.com/wiki/copyFromClipboard + https://community.bistudio.com/wiki/lbSetColor - copyFromClipboard + lbSetColor Array + + Control lbSetColor Array - copyFromClipboard + lbSetColor [idc, index, color] + + control lbSetColor [index, color] - $Code$hint copyFromClipboard ;$/Code$ + $Code$lbSetColor [101, 0, [0, 1, 0, 0.5]];$/Code$ + + $Code$_control lbSetColor [0, [0, 1, 0, 0.5]];$/Code$ - undefined / undefined + local / local + More information on the LB command family can be found here - String + Nothing - Nothing + - copyToClipboard + setSimpleTaskTarget - Copy text string to the clipboard. - In MP available only on the client that is server + Attach a target to the simple task. Overrides setSimpleTaskDestination. - https://community.bistudio.com/wiki/copyToClipboard + https://community.bistudio.com/wiki/setSimpleTaskTarget - copyToClipboard String + Task setSimpleTaskTarget Array - copyToClipboard text + task setSimpleTaskTarget [target, precisePosition] - $Code$copyToClipboard str _data;$/Code$ + $Code$task setSimpleTaskTarget [targetVehicle, true];$/Code$ undefined / undefined - (October 12, 2014) - To add a line break in output text do this: - $Code$_br = toString [13,10];//(carriage return & line feed) - _string = "Line 1" + _br + "Line 2"; - copyToClipboard _string; - $/Code$ - Paste into text editor of choice, you get: - $Code$Line 1 - Line 2$/Code$ - (A3 1.30 Stable executed inside.sqf via execVM ) - Nothing + Nothing + - copyWaypoints + uniformItems - Copy the chain of waypoints from source to target group. The target group will start to process waypoints from the first one. + Get array with all items (of any kind, even weapons) from uniform. - https://community.bistudio.com/wiki/copyWaypoints + https://community.bistudio.com/wiki/uniformItems - Group copyWaypoints Group + uniformItems Object - groupTo copyWaypoints groupFrom + uniformItems unit - $Code$group1 copyWaypoints group2;$/Code$ + $Code$uniformItems player ;[ + "FirstAidKit", + "30Rnd_65x39_caseless_mag", + "30Rnd_65x39_caseless_mag", + "30Rnd_65x39_caseless_mag" + ]$/Code$ undefined / undefined @@ -11150,325 +12136,283 @@ - Nothing + Array + - cos + visiblePosition - Cosine of a number, argument in degrees. + Returns an object's rendered position (z value above surface underneath) in render time scope. Same as getPosVisual - https://community.bistudio.com/wiki/cos + https://community.bistudio.com/wiki/visiblePosition - cos Number + visiblePosition Object - cos x + visiblePosition object - $Code$cos 60;//returns 0.5$/Code$ + $Code$playerRenderedPos = visiblePosition player;$/Code$ undefined / undefined - (August 8, 2006) - Be aware that there might be rounding errors in the results of this command. - cos 90 - for example doesn't return the expected '0', but '-4.37114e-008'. So, if you want to compare results of Cosinus, don't use the compare operator - (cos 90)==0 - but rather use less than. - (cos 90) 0.00001 + (February 4, 2015) + Z (visiblePosition select 2) works but if unit/object is in a building, Z remains at ground level. If you need Z depending on building floors/stages, use getPosAtl select 2 instead. - Number + Array + - countEnemy + nearEntities - Count how many units in the array are considered enemy to the given unit. + Find entities in the sphere with given radius. If typeName(s) is (are) given, only entities of given type (or its subtype) are listed. + This command returns only alive entities. If you need to return dead entities as well use entities command. - https://community.bistudio.com/wiki/countEnemy + https://community.bistudio.com/wiki/nearEntities - Object countEnemy Array + Object/Array nearEntities Number + + Object/Array nearEntities Array - unitName countEnemy arrayName + position nearEntities radius + + position nearEntities [typeName, radius] - $Code$_num = player countEnemy list _triggerOne;$/Code$ + $Code$_list = player nearEntities 20; + _list = ( position player ) nearEntities 50; + _list = player nearEntities ["Man", 1000]; + _list = ( position player ) nearEntities ["LaserTarget", 3000]; + _list = player nearEntities [["Car", "Motorcycle", "Tank"], 50]; + _list = ( position player ) nearEntities [["Man", "Air", "Car", "Motorcycle", "Tank"], 200];$/Code$ global / undefined - (August 3, 2006) - Notes from before the conversion: - The countEnemy command seem to count the number of units from the array that are considered to be of the given type by the whole side, not just the specified unit. - - (December 15, 2006) - The unit that's checking (left side of the command) needs a certain level of knowledge about the target (about.1) before the enemy units are actually counted. (OFP & ArmA) + (27 Mar, 2014) + According to Code Optimisation, this function is the fastest and should be used instead of nearestObjects when suitable. - Number + Array - Array + - countFriendly + setVehicleArmor - Count how many units in the array are considered friendly to the given unit. + Sets the armor (or health for men) state of the vehicle (a value from 0 to 1). + Works like setDamage only in reverse: player setVehicleArmor 1 is the same as player setDamage 0, and player setVehicleArmor 0 is the same as player setDamage 0.97 - https://community.bistudio.com/wiki/countFriendly + https://community.bistudio.com/wiki/setVehicleArmor - Object countFriendly Array + Object setVehicleArmor Number - unitName countFriendly arrayName + vehicleName setVehicleArmor value - $Code$_num = player countFriendly list _triggerOne;$/Code$ + $Code$player setVehicleArmor 0.5;$/Code$ - global / undefined + local / global - (August 3, 2006) - Notes from before the conversion: - The countFriendly command seem to count the number of units from the array that are considered to be of the given type by the whole side, not just the specified unit. - Number + Nothing + - countSide + sideFriendly - Count how many units in the given array belong to given side. If the object in passed array is a Group, the leader of the group will be counted. + The Friendly side (used for captives). - https://community.bistudio.com/wiki/countSide + https://community.bistudio.com/wiki/sideFriendly - Side countSide Array + sideFriendly - side countSide arrayName + sideFriendly - $Code$_num = west countSide list _triggerOne;$/Code$ - - $Code$_numCivPlayable = civilian countSide playableUnits ;$/Code$ - + - global / undefined + undefined / undefined - (July 4, 2014) - The countSide command will also accept an array of groups. Tested in ARMA 3 v1.22 - - (October 19, 2014) - This command considers captive units as civilians, regardless of their group's side. - Number + Side + - countType + disableUAVConnectability - Count how many objects in the array are of given type. This command also works with parent classes like "Air", "Tank", and "Car". For a full class reference see Classes. + Disables unit's AV terminal(s) connecting to UAV. - https://community.bistudio.com/wiki/countType + https://community.bistudio.com/wiki/disableUAVConnectability - String countType Array + Object disableUAVConnectability Array - type countType objects + object disableUAVConnectability [uav, checkAllItems] - $Code$_count = "Tank" countType list _triggerOne;$/Code$ - - $Code$_count = "B_medic_F" countType units player ;$/Code$ + $Code$unit disableUAVConnectability [uav,true];$/Code$ - global / undefined + undefined / local - (April 23, 2007) - This command can be used on the whole hierarchical class tree (i.e. when checking a HMMWV, one could test for "HMMWV50", "Car", "LandVehicle", etc.) - - (May 4, 2016) - To complement Kronzky's note, if one needs to count exact types, countType is not suitable for this, use count instead: - $Code$_count = { typeOf _x == "B_medic_F"} count units player ;$/Code$ - Number + Nothing + - countUnknown + curatorEditingAreaType - Count how many units in the array are unknown to the given unit. + Returns type of edit areas assigned to curator (blacklist/whitelist). - https://community.bistudio.com/wiki/countUnknown + https://community.bistudio.com/wiki/curatorEditingAreaType - Object countUnknown Array + curatorEditingAreaType Object - unitName countUnknown arrayName + curatorEditingAreaType obj - $Code$_num = player countUnknown list _triggerOne;$/Code$ + + + undefined / undefined + + + + + Boolean + + + + + + drawPolygon + + + Draws given polygon on the given map control with given color. The polygon must consist of at least 3 points. Unlike with other draw shape commands and due to complexity, this command does not support filling of the polygon with color. Use drawTriangle command to construct and fill polygon shape as a workaround. + + + https://community.bistudio.com/wiki/drawPolygon + + + Control drawPolygon Array + + + map drawPolygon [polygon, color] + + + $Code$test_polygon = []; + for "_i" from 1 to 12 do + { + test_polygon pushBack ( player getPos [10 + random 100, 360/_i]); + }; + findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", + { + _this select 0 drawPolygon [test_polygon, [0,0,1,1]]; + }];$/Code$ - global / undefined + undefined / undefined - Number + Nothing + - count + addCuratorEditableObjects - Can be used to count: - the number of elements in array - the number of elements in array with condition - the number of sub-entries in a config object - the number of characters in a string (since ["Arma 3","Arma3",127,126674,"Development"]) + Register objects which can be edited by a curator. - https://community.bistudio.com/wiki/count + https://community.bistudio.com/wiki/addCuratorEditableObjects - count Array - - Code count Array - - count Config - - count String + Object addCuratorEditableObjects Array - count array - - condition count array - - count configname - - count string + curatorObj addCuratorEditableObjects [objects,addCrew] - $Code$_cnt = count [0,0,1,2]; // returns 4 - _cnt = count units group player ; // returns number of units in player group$/Code$ - - $Code$_cnt = { _x == 4} count [1,9,8,3,4,4,4,5,6]; // returns 3 - _cnt = { alive _x } count allUnits ; // returns the number of alive units$/Code$ - - $Code$_cnt = count ( configFile "CfgVehicles");$/Code$ - - $Code$hint str count "japa is the man!"; //16$/Code$ + $Code$curatorModule addCuratorEditableObjects [[car], true ];$/Code$ - local / undefined + undefined / undefined - (April 28, 2007) - This conditional count command only works if all the elements in the tested array are of the same type as the tested element. - For example, the following code will created an error, since the elements are of different types (object, number, string): - $Code$_arr = [ player,100,"one"]; {_x == "one"} count _arr;$/Code$ - Alternatively, to avoid the error use isEqualTo instead of ==. --KK - This one, on the other hand, where all elements are strings, just like the tested element, will return the correct result of 1: - $Code$_arr = ["one","two","three"]; {_x == "one"} count _arr;$/Code$ - - (August 3, 2006) - Notes from before the conversion: - Use this to calculate how many "M16" mags a soldier has left. - $Code${_x == "M16"} count magazines soldier1;$/Code$ - Take care when using count to determine how many units are left alive in a group: count units group player or count units groupname Will return the number of units the leader of the group thinks are alive. If some units have been killed out of sight of other members of the group then it may take sometime for this to be the actual numbers in the group. To determine exactly how many units are really alive in a group use: - $Code${ alive _x} count units group player ;$/Code$ - or - $Code${ alive _x} count units groupname;$/Code$ - - (December 15, 2014) - count can be (ab)used for a very fast and simple check if at least one element in an array fulfills a certain condition: - $Code$if({if( _x fulfills condition ) exitWith {1}; false} count _array isEqualTo 1) then - { - //do whatever here - };$/Code$ - This code will exit the count loop as soon as it finds an element fulfilling the condition, leaving the count with the value of 1, hence make the larger if-condition be true. - If no array element fulfills the condition, the count will be 0 and the if-condition will be false. - - (December 29, 2014) - Quit loop at first fulfilled condition (same as above but faster): - $Code$0 = { if (_x == 4) exitWith { - //do something when we reach 4 - }} count [1,2,3,4,5,6];$/Code$ - - (January 2, 2015) - Using exitWith inside a count loop will overwrite the default functionality and make count return whatever the exitWith returns: - $Code$_result = { - if(_x isEqualTo 3) exitWith {"Hello"} - } count [1,2,3,4,5]; - //_result = "Hello"$/Code$ - - (August 22, 2016) - With the alternative syntax each iteration should result in an interior return of bool or nothing. Example: - $Code$createDialog "RscFunctionsViewer"; - { lbAdd [292901,_x]; } count ["first","second","third"];$/Code$ - lbAdd returns a number, so this throws "Error Type Number, expected Bool". Tested in A2OA 1.63.131129 + This scripting command must be executed on the server to work properly in multiplayer - Number - Number - Number - Number + Nothing + - create3DENComposition + lightnings - Create new Composition. To create individual entities, use create3DENEntity. + Return the current lightnings value. - https://community.bistudio.com/wiki/create3DENComposition + https://community.bistudio.com/wiki/lightnings - create3DENComposition Array + lightnings - create3DENComposition [configPath, position] + lightnings - $Code$myComposition = create3DENComposition [ - configFile "CfgGroups" "West" "BLU_F" "Infantry" "BUS_InfSquad", - screenToWorld [0.5,0.5] - ];$/Code$ + $Code$// Get the current lightnings value: + _lightningsVal = lightnings ;$/Code$ undefined / undefined @@ -11476,306 +12420,268 @@ - Array + Number + - create3DENEntity + setMarkerDirLocal - Create new Eden Entity. Used for creating individual entities; to create a composition (e.g., infantry squad), use create3DENComposition. - This is the only way how to add new editable entities to Eden Editor scenario. Other 'create' commands like createVehicle or createUnit will still work, but the resulting entity won't be editable. + Sets the orientation of the marker. Angle is in degrees. - https://community.bistudio.com/wiki/create3DENEntity + https://community.bistudio.com/wiki/setMarkerDirLocal - create3DENEntity Array - - Group create3DENEntity Array + String setMarkerDirLocal Number - create3DENEntity [mode, class, position, ] - - group create3DENEntity [mode, class, position, ] + markerName setMarkerDirLocal angle - $Code$dude1 = create3DENEntity ["Object","B_Soldier_F", screenToWorld [0.5,0.5]];$/Code$ - - $Code$dude2 = ( group dude1) create3DENEntity ["Object","B_Soldier_AR_F", screenToWorld [0.5,0.5]];$/Code$ - - $Code$myMarker = create3DENEntity ["Marker","mil_warning", position player ];$/Code$ - - $Code$mytrigger = create3DENEntity ["Trigger","EmptyDetectorArea10x10", position player ];$/Code$ + $Code$"Marker1" setMarkerDirLocal 90;$/Code$ - undefined / undefined + undefined / local - (March 29, 2016) - The classnames for triggers can be found in the config class CfgNonAIVehicles - - (June 14, 2016) - Mode can also be "Logic". Not sure if it's a replacement for "System" or a it's a completely separate mode. - EdenEntity - EdenEntity + Nothing + - createAgent + disableUserInput - Creates an (independent) agent (person) of the given type (type is a name of a subclass of CfgVehicles ). An agent does not have a group or leader or the standard soldier FSM associated with it -- for instance, an enemy soldier spawned as an agent has limited AI and will stand stupidly when fired upon -- which can be useful to limit the amount of AI processing being done in a mission with very large numbers of "AI". If the markers array contains several marker names, the position of a random one is used, otherwise, the given position is used. The unit is placed inside a circle with this position as its center and placement as its radius. - Players assigned to an agent using setPlayable will be able to control the agent, operate weapons and other actions, but will not be able to access their inventory using the gear screen. - Special properties can be: "NONE", "CAN_COLLIDE" and "FORM". + Disable and enable the keyboard and mouse input, usually used during cutscenes. + Be careful with the usage of this command, always remember to enable the user input again, as once the user input is disabled, you can only shut down OFP but not exit the mission with escape. - https://community.bistudio.com/wiki/createAgent + https://community.bistudio.com/wiki/disableUserInput - createAgent Array + disableUserInput Boolean - createAgent [type, position, markers, placement, special] + disableUserInput state - $Code$agent = createAgent ["SoldierWB", position player, [], 0, "FORM"];$/Code$ + $Code$disableUserInput true + ; cutscene + disableUserInput false$/Code$ - undefined / undefined + undefined / local - (September 29, 2014) - In Arma 3, default FSM is calling BIS_fnc_animalBehaviour script upon agent creation, which takes on some animal behavioural logic. The problem here is that it is almost impossible to make animal do what is told. Until now. Since Arma 3 v1.31.127383 you can set BIS_fnc_animalBehaviour_disable variable on the agent at the moment of agent creation, to override the function. - $Code$tr = createTrigger ["EmptyDetector", player modelToWorld [0, 10, 0]]; - tr setTriggerArea [5, 5, 0, true ]; - tr setTriggerActivation ["CIV", "PRESENT", true]; - rabbits = []; - private "_r"; - for "_i" from 1 to 10 do { - _r = createAgent ["Rabbit_F", position tr, [], 0, "NONE"]; - _r setVariable ["BIS_fnc_animalBehaviour_disable", true ]; - rabbits pushBack _r; - }; - tr setTriggerStatements [ - " if (rabbits isEqualTo thisList) exitWith { - _r = thisList select floor random count thisList; - _r moveTo (_r modelToWorld [2.5 - random 5, 2.5 - random 5, 0]); - }; - _esc = rabbits - thisList; - doStop _esc; - {_x moveTo position thisTrigger} forEach _esc; - systemChat str [ time, _esc]; - false ", - "", - "" - ];$/Code$ - - (April 18, 2015) - Agents seem to use the same collision model that the player uses, unlike normal AI. Normal AI don't collide with objects, but agents are physically stopped by obstacles the same way players are. This also probably means agents cost more resources than normal AI. + (14 March 2014) + Sometimes, when disableUserInput true command is invoked while the user is holding a button, when disableUserInput false is called and the user is no longer holding the button, the input will resume as if the user is still holding the button. To reset this behaviour, disable and enable user input again in the same frame: + $Code$ disableUserInput true ; + //do something + disableUserInput false ; + disableUserInput true ; + disableUserInput false ;$/Code$ + Unfortunately, if the user is moving mouse when disableUserInput true command is invoked, the mouse input will get stuck for the whole duration of disabled user input but will reset as soon as disableUserInput false is called. I was unable to find workaround for this one. - Object + Nothing + - createCenter + landAt - In a nutshell, this command creates game Side. Without side it is not possible to create Groups. So if center for particular side is undefined, no groups can be created for this side. A Unit needs a group to be able to spawn in. So if no center for particular side exists, no groups for this side can be created and therefore no units for this side can be spawned. In Arma 3, the centers for all sides are created for you. An attempt to create center for existing side is ignored. Center can only be created for: east, west, resistance, civilian and sideLogic. These are the only sides groups can be created for. - Old description : Creates a new AI HQ for the given side. An 'HQ ' is something each side needs to have to be able to communicate. By default, all centers for units which are present in the mission are created before the mission is started. This command can be used to initialize a side which has no units present in the Mission.sqm, so that you can spawn groups and units for it. - For the available sides see Side. + Order an AI airplane to land at a given airport. ID is the number to identify which map airport you want the airplane to land at. Since Arma 3 v1.68 it is possible to also make the airplane land at a dynamic airport object (e.g. aircraft carrier, makeshift runway...). - https://community.bistudio.com/wiki/createCenter + https://community.bistudio.com/wiki/landAt - createCenter Side + Object landAt Number + + Object landAt Object - createCenter side + plane landAt id + + _plane1 landAt _dynamicAirport1 - $Code$_SideHQ = createCenter east$/Code$ + $Code$_plane1 landAt 1;$/Code$ + + $Code$_dynamicAirport1 = "DynamicAirport_01_F" createVehicle position player ; + _plane1 landAt _dynamicAirport1;$/Code$ - undefined / global + local / global - (17:15, 22 June 2007 (CEST)) - You need to set the new sides friendly status using the setFriend command, once you have created your Center. Otherwise the newly created AI will not engage you, if you're on the opposing side. + ARMA 3: + Altis : + 0 = Airbase + 1 = AAC Airfield + 2 = Krya Nera Airstrip + 3 = Selakeno Airfield + 4 = Molos Airfield + 5 = Almyra Salt Lake Airstrip + Posted 17:56, 21 September 2010 (CEST) + + ARMA 2 OA: + Takistan : + 0 = Airport NorthWest + 1 = Airport SouthEast + Planes approach all airports from South West + ARMA 2: + Utes : + 0 = There is only one airport + Chernarus : + 0 = Airport NorthWest close to Grishno + 1 = Airport NorthEast close to Kranostav + 2 = Airport SouthWest close to Balota + 3 = Nearest Airport + Planes approach all airports from South East + ARMA: + Sahrani : + 0: - Paraiso + 1: - Rahmadi + 2: - Pita + 3: - Antigua + + (November 8, 2014) + In Arma 3 (1.34) landAt only works for fixed-wing aircraft. Rotary-wing craft ignore this command. + + (June 19, 2016) + ARMA 3 : Tanoa + 0 = Aeroport de Tanoa + 1 = Tuvanaka Airbase + 2 = Saint-George Airstrip + 3 = Bala Airstrip + 4 = La Rochelle Aerodome + ARMA 3 : Stratis + 0 = Stratis Airbase - Side + Nothing - Nothing + - createDialog + waypointsEnabledUAV - Create a dialog which is defined either in the mission's description.ext, in the campaign's description.ext or in the global resource.cpp. The given name has to be the class name used in one of these files. If another dialog is already opened, the desired dialog is created as a child dialog of the one already opened. + Checks if the UAV has waypoints enabled. - https://community.bistudio.com/wiki/createDialog + https://community.bistudio.com/wiki/waypointsEnabledUAV - createDialog String + waypointsEnabledUAV Object - createDialog dialogName + waypointsEnabledUAV uav - $Code$_ok = createDialog "RscDisplayGame"; - if (!_ok) then { hint "Dialog couldn't be opened!"};$/Code$ + $Code$_uav enableUAVWaypoints false ; + hint str waypointsEnabledUAV _uav; // returns false$/Code$ - undefined / local + undefined / undefined - (July 29, 2017) - A user dialog created with createDisplay over mission display ( findDisplay 46) will stop display event handlers added to mission display from firing. However if it is created with createDialog then the event handlers continue to work. - Boolean + Boolean + - createDiaryLink + selectWeaponTurret - Create a link to the section of diary given by subject. Record is selected based on given object (diary record,task or unit). + Selects the given weapon on specified turret. Use turret path [-1] for driver's turret. Since ver. 1.63.136864 this command supports both weapon name and muzzle name. - https://community.bistudio.com/wiki/createDiaryLink + https://community.bistudio.com/wiki/selectWeaponTurret - createDiaryLink Array + Object selectWeaponTurret Array - createDiaryLink [subject,object,text] + vehicle selectWeaponTurret [weapon, turretPath] - $Code$_link = createDiarySubject ["Group", player,"Player"]$/Code$ - - $Code$diaryRec1 = player createDiaryRecord ["diary", ["Record 1", "We can't refer to next record (("]]; - diaryRec2 = player createDiaryRecord ["diary", ["Record 2", "Got to " + ( createDiaryLink ["Diary", diaryRec1, "record 1"])]]; - diaryRec3 = player createDiaryRecord ["diary", ["Record 3", "Got to " + ( createDiaryLink ["Diary", diaryRec2, "record 2"])]];$/Code$ - - $Code$funcProcessDiaryLink = { - processDiaryLink createDiaryLink ["diary", _this, ""]; - }; - diaryRec1 = player createDiaryRecord ["diary", ["Record 1", - "In this example, we can go to any next record: go to execute expression='diaryRec2 call funcProcessDiaryLink' Record 2 /execute " - ]]; - diaryRec2 = player createDiaryRecord ["diary", ["Record 2", - "Go to execute expression='diaryRec3 call funcProcessDiaryLink' Record 3 /execute " - ]]; - diaryRec3 = player createDiaryRecord ["diary", ["Record 3", - "Go to execute expression='diaryRec1 call funcProcessDiaryLink' Record 1 /execute " - ]];$/Code$ + $Code$MBT_Kuma selectWeaponTurret ["LMG_coax",[0]];$/Code$ undefined / undefined + (February 13, 2017) + The command will treat weapon or muzzle param like a weapon first. If no such weapon is found then it will try to find muzzle with such name. For example AMV-7 Marshall APC has main gun "autocannon_40mm_CTWS" which has 2 muzzles "HE" and "AP". Default muzzle is "HE". So if you try to select weapon by the name "autocannon_40mm_CTWS" you will always get "HE" muzzle selected. However if you pass "AP" as param, it will correctly select "AP" muzzle, since no "AP" weapon exists on this turret it will continue searching for a muzzle with this name and will find it eventually. - String + Nothing + - createDiaryRecord + setLightFlareMaxDistance - creates a diary entry. - Supported tags and their parameters: - All - image : String - path to image. When present, any element with it will be displayed as image. - width : Number - image width in pixels. - height : Number - image height in pixels. - font - color : String - HTML color in format #aarrggbb or #rrggbb - size : Number - font height in pixels. - face : String - font type (class from CfgFontFamilies) - br - marker - name : String - marker name - execute - expression : String - executed code - executeClose - expression : String - executed code, diary is closed afterwards - log - subject : String - subject name. - record : String - record name (e.g. "Record6" or "Unit1059524") - gear - unit : Number - unit ID - teamSwitch - unit : Number - unit ID - kick - id : Number - player ID - ban - id : Number - player ID - mute - id : Number - player ID - currentTask - id : Number - task ID + Sets max distance where the flare is visible. - https://community.bistudio.com/wiki/createDiaryRecord + https://community.bistudio.com/wiki/setLightFlareMaxDistance - Object createDiaryRecord Array + Object setLightFlareMaxDistance Number - unitName createDiaryRecord [subject, text, task, state] - - unitName createDiaryRecord [subject, [title, text], task, state] + light setLightFlareMaxDistance distance - $Code$player createDiaryRecord ["Diary", ["Intel", "Enemy base is on grid marker name='enemyBase' 161170 /marker "]]$/Code$ - - $Code$player createDiaryRecord ["Diary", "Information gathered. br / img image='wellDone_ca.paa' / "]$/Code$ + $Code$myLight setLightFlareMaxDistance 500;$/Code$ - undefined / local + local / local - (14:54, 15 January 2011‎) - To insert a link into a diary record that executes code instead of jumping to a marker, use the tag - execute expression=" Code to execute " Text /execute - - (March 24, 2017) - When adding multiple diary records, be aware that they appear in reverse order. ie the first one you add will appear last and the last one you add will be first. - String + Nothing + - createDiarySubject + allMines - Create a new subject page in a log. + Returns an array of all mines in the mission - https://community.bistudio.com/wiki/createDiarySubject + https://community.bistudio.com/wiki/allMines - Object createDiarySubject Array + allMines - person createDiarySubject [subject, displayName, picture] + allMines - $Code$_index = player createDiarySubject ["myPage","My page"];$/Code$ + $Code$allMines$/Code$ + + $Code$( allMines select 0) mineDetectedBy west ;$/Code$ undefined / undefined @@ -11783,77 +12689,62 @@ - Number + Array + - createDisplay + ctrlAddEventHandler - Creates child display of given display and loads from "resourceName". The notable difference between createDisplay and createDialog is that with createDisplay the player would be able to move whilst having control of the mouse pointer. - Since Arma 3 v1.49.131653 createDisplay returns Display and will first look in description.ext for resourceName config, if not found, it will then look in main config. - Displays created with both createDisplay and createDialog will take control of the mouse pointer and will close when user presses Esc. - $Code$_emptyDisplay = findDisplay 46 createDisplay "RscDisplayEmpty";$/Code$ - If display is needed which exists independently, it can be created in IGUI layer with cutRsc command. - $Code$"someLayer" cutRsc ["RscTitleDisplayEmpty", "PLAIN"]; - _emptyDisplay = uiNamespace getVariable "RscTitleDisplayEmpty";$/Code$ - Such display can be closed with closeDisplay command or by overwriting the same cut layer with another output. Note that "Unload" EH for some reason does not work with such display. + Add an event handler ( User Interface Event Handlers ) to the given control. Returns id of the handler or -1 when failed. + NOTE: Control EHs are processed in reversed order, i.e. last added: first, first added: last. So if you have an override it should be set up in the 1st added EH. - https://community.bistudio.com/wiki/createDisplay + https://community.bistudio.com/wiki/ctrlAddEventHandler - Display createDisplay String + Control ctrlAddEventHandler Array - parent createDisplay resourceName + control ctrlAddEventHandler [handler,function] - $Code$findDisplay 46 createDisplay "RscCredits";$/Code$ + $Code$_map ctrlAddEventHandler ["draw","_this call BIS_fnc_strategicMapOpen_draw"];$/Code$ + + $Code$_map ctrlAddEventHandler ["draw",{ hintSilent str _this}];$/Code$ undefined / undefined - (August 23, 2014) - Do not simply createDisplay from UI context code such as "ButtonDown" UI Event handler, as it will crash the game. Instead use spawn scope: - $Code$[] spawn { findDisplay 46 createDisplay "RscCredits"};$/Code$ - - (November 15, 2014) - Arma3 v1.34 - When using CreateDisplay instead of CreateDialog, all the commands for working with the controls of the display only work with the control version, not the IDC version. - EXAMPLE: - $Code$LbAdd [1234, "item"]; // does not work on displays, and won't error either - _ctrl LbAdd "item"; // does work with displays$/Code$ - So you have to use the control(DisplayCtrl) and not the IDC. - - (July 29, 2017) - A user dialog created with createDisplay over mission display ( findDisplay 46) will stop display event handlers added to mission display from firing. However if it is created with createDialog then the event handlers continue to work. + (October 30, 2013) + As of Arma 3 v1.05.111658 ctrlAddEventHandler and displayAddEventHandler support script Code in addition to String [1] - Nothing/Display + Number + - createGearDialog + saveGame - Opens gear dialog for given unit. Alternatively use action command: - $Code$ player action ["Gear", player ];$/Code$ + Autosave game (used for Retry). - https://community.bistudio.com/wiki/createGearDialog + https://community.bistudio.com/wiki/saveGame - createGearDialog Array + saveGame - createGearDialog [unit, resource] + saveGame - $Code$createGearDialog [player];$/Code$ + $Code$saveGame ;$/Code$ undefined / undefined @@ -11861,305 +12752,285 @@ - Nothing + Nothing + - createGroup + compile - Creates a new Group for the given Side. An HQ (center) for that side must already be in the Mission.sqm or have been initialized with createCenter. For the available sides see Side. - NOTES - The default limit of groups created per side was 144. Since Arma 3 v1.67 it is increased to 288. - Since Arma 3 v 1.67 it is possible to mark created group for automatic deletion when the group becomes empty (see Alt Syntax). When group is set to be automatically deleted when empty, when group becomes empty it may take up to a minute for it to get deleted. - In Arma 3 when last unit leaves its group, the group usually gets immediately auto deleted, regardless of whether or not if it was set for auto deletion manually + Compile expression. - https://community.bistudio.com/wiki/createGroup + https://community.bistudio.com/wiki/compile - createGroup Side - - createGroup Array + compile String - createGroup side - - createGroup [side, deleteWhenEmpty] + compile expression - $Code$_group = createGroup east$/Code$ + $Code$_string = "a = a + 1"; + _code = compile _string; + call _code;$/Code$ - $Code$_group = createGroup [ east, true ];$/Code$ + $Code$hint str compile "a = b"; + //Result: {a=b}$/Code$ - undefined / global + undefined / undefined - (December 15, 2006) - The group limit is 144 groups groups per side. If you attempt to create a group, and there is no room for another, it simply doesn't create, and it doesn't error. - - (July 10,2007) - In Armed Assault, empty groups are not automatically deleted - if you created 144 groups, you will not be able to create new group even if all units in all those groups died, because all the 144 groups still exists - you will have to delete some groups manually. - - (January 04, 2011) - A group created with createGroup will get a waypoint at [0,0,0]. When you use createUnit to fill it with units, it will get an additional waypoint at the position the first unit is created. This new waypoint will also be set as currentWaypoint. However keep these two waypoints in mind when you do some scripting involving this groups' waypoints. - Group - Group + Code + - createGuardedPoint + getEditorObjectScope - Adds a point guarded by the given side (scripted way of adding equivalent of "GUARDED BY" trigger in Editor ). A closest AI group in the given side with assigned "GUARD" waypoint will attempt to secure this guard point. The actual guarded position is determined via the following rules: - Given "position" is always considered. It could be Object, Group, Position2D or Position3D. In every case, z coordinate will be ignored and point will be placed on nearest surface. - If "objectMapID" is not negative, the position of the object with the given ID is used (Overrides "position"). -1 to ignore this argument. z of the object position will be intact. - If the given "vehicle" is valid, the position of the vehicle is extracted and guarded (Overrides both "position" and "objectMapID"). objNull to ignore. z of the vehicle position will be intact. - For use with "GUARD" waypoint. How does "GUARD" waypoint work: Waypoint:Guard + Returns the editor object scope of the specified editor object. + i + Some Old Editor Command - https://community.bistudio.com/wiki/createGuardedPoint + https://community.bistudio.com/wiki/getEditorObjectScope - createGuardedPoint Array + Control getEditorObjectScope String - createGuardedPoint [side, position, objectMapID, vehicle] + map getEditorObjectScope object - $Code$createGuardedPoint [ east, [0,0], -1, vehicle player ];$/Code$ - + undefined / undefined - Nothing + String + - createLocation + tvSetTooltip - Creates a location of the specified class and dimensions at the specified position. Classes are defined in CfgLocationTypes. + Sets the tooltip text associated with the specified tree view path. - https://community.bistudio.com/wiki/createLocation + https://community.bistudio.com/wiki/tvSetTooltip - createLocation Array + tvSetTooltip Array + + Control tvSetTooltip Array - createLocation [className, position, sizeX, sizeY] + tvSetTooltip [idc, path, text] + + ctrl tvSetTooltip [path, text] - $Code$_location = createLocation [ "NameVillage", [4035,2151,10], 100, 100];$/Code$ + $Code$tvSetTooltip [101, [0,2], "This is a tooltip"];$/Code$ - $Code$_location = createLocation [ "NameVillage", [4035,2151,10], 30, 30]; - _location setText "Player town";$/Code$ + $Code$_tree tvSetTooltip [[0,2], "This is a tooltip"];$/Code$ - undefined / local + undefined / undefined - (12:25, 12 February 2010) - Possible location types, see: Location Types - For the actual name text of the location, use setText. - Location + Nothing - Nothing + - createMPCampaignDisplay + unitIsUAV - Create a MP campaign display. The class name must be a mission collection declared in the configs; in example, configFile /"CfgMissions"/"MPMissions"/"Apex"/ - If the class doesn't exist or isn't a mission collection, the display will be created empty. + Returns true if the unit type is UAV - coresponding to transport param "isUAV" - https://community.bistudio.com/wiki/createMPCampaignDisplay + https://community.bistudio.com/wiki/unitIsUAV - Display createMPCampaignDisplay String + unitIsUAV Object - display createMPCampaignDisplay class + unitIsUAV unit - $Code$findDisplay 46 createMPCampaignDisplay "Apex";$/Code$ + $Code$_isUAV = unitIsUAV veh;$/Code$ undefined / undefined - (July 14, 2016) - $Code$ findDisplay 46 createMPCampaignDisplay "123";$/Code$ - Nothing + Boolean + - createMarker + currentWeapon - Creates a new marker at the given position. The marker name has to be unique. + Return the name of the currently selected weapon (on the primary turret for vehicles). - https://community.bistudio.com/wiki/createMarker + https://community.bistudio.com/wiki/currentWeapon - createMarker Array + currentWeapon Object - createMarker [name, position] + currentWeapon vehicle - $Code$_marker1 = createMarker ["Marker1", position player ];$/Code$ + $Code$_weaponClass = currentWeapon (vehicle player);//Example: "M16A2GL"$/Code$ - $Code$_marker2 = createMarker ["Marker2", player ];$/Code$ + $Code$_weaponClass = currentWeapon player;$/Code$ - undefined / global + undefined / undefined - $Code$_markerstr = createMarker ["markername",[_Xpos,_Ypos]]; - _markerstr setMarkerShape "ICON"; - _markerstr setMarkerType "hd_dot";$/Code$ + (July 15, 2009) + You have to make a little delay (sleep 0.001; (not less)) to use this command, else you will be returned an empty string. - (September 19, 2015) - createMarker accepts an object as position parameter as well (A3 - 1.50.131969). You could try this with the following code (both SP/MP) - $Code$_markerstr = createMarker ["markername", player]; - _markerstr setMarkerShape "RECTANGLE"; - _markerstr setMarkerSize [100,100];$/Code$ + (July 15, 2009) + It seems it's not working in 1.02 for other unit than player. + + (May 4, 2010) + This works for vehicles providing there is a gunner - String + String + - createMarkerLocal + queryMagazinePool - Creates a local marker at the given position. Marker exists only on PC that created it. The marker name has to be unique. - NOTE: Local markers have own set of local commands "XXXXLocal" to work with. If you use global marker command on a local marker, the local marker will become global marker. + Return number of magazines of type name in magazine pool (used in campaign to transfer magazines into next mission). - https://community.bistudio.com/wiki/createMarkerLocal + https://community.bistudio.com/wiki/queryMagazinePool - createMarkerLocal Array + queryMagazinePool String - createMarkerLocal [name, position] + queryMagazinePool name - $Code$_marker = createMarkerLocal ["Marker1", position player ];$/Code$ + $Code$_num = queryMagazinePool "M16";$/Code$ - undefined / local + undefined / undefined - To create a marker which is visible on the map you need to define at least the following three settings: - $Code$_markerstr = createMarkerLocal ["markername",[_Xpos,_Ypos]]; - _markerstr setMarkerShapeLocal "ICON"; - _markerstr setMarkerTypeLocal "DOT";$/Code$ - String + Number + - createMenu + taskMarkerOffset - Creates a previously added menu. - i - Some Old Editor Command + Returns model space position for the task marker - https://community.bistudio.com/wiki/createMenu + https://community.bistudio.com/wiki/taskMarkerOffset - Control createMenu Number + taskMarkerOffset Object - map createMenu index + taskMarkerOffset unit - + $Code$_offset = taskMarkerOffset player ;$/Code$ + undefined / undefined - Nothing + Array + - createMine + is3DENMultiplayer - Creates a mine of the given type (type is the name of the subclass of CfgVehicles). If the markers array contains several marker names, the position of a random one is used, otherwise, the given position is used. The mine is placed inside a circle with this position as its center and placement as its radius. + Returns true if the Eden Editor is in multiplayer mode. Returns true in the following cases: + Multiplayer Preview launched directly from 3DEN - true in preview and only for the creator + MP mission is chosen for editing when creating a server: Multiplayer - Server Browser - Host Server. When 3D EDITOR button is clicked for selected mission and 3DEN is launched, command returns true within the editor environment. (see also is3DEN ) - https://community.bistudio.com/wiki/createMine + https://community.bistudio.com/wiki/is3DENMultiplayer - createMine Array + is3DENMultiplayer - createMine [type, position, markers, placement] + is3DENMultiplayer - $Code$_mine = createMine ["MineMine", position player, [], 0];$/Code$ + $Code$if is3DENMultiplayer then { systemChat "Your hosting a test server!"};$/Code$ undefined / undefined - (June 5, 2017) - Note that this command uses AGL (very similar to ASL) positions, so if you want to use the moored or seabed mine, you'll have to find the appropriate negative z value that is underwater and convert that to ASL. - Also note that you can't adjust the positions of sea mines after they've been created. The command is either ignored or not propagated across the network to clients. - Object + Boolean + - createMissionDisplay + removeAll3DENEventHandlers - Create single missions display as a child of given display. The mission dialog will be set to the directory given as an argument "root". + Removes all Eden Editor event handlers of given type. + See the list of all Eden Editor Event Handlers. - https://community.bistudio.com/wiki/createMissionDisplay + https://community.bistudio.com/wiki/removeAll3DENEventHandlers - Display createMissionDisplay String + removeAll3DENEventHandlers String - display createMissionDisplay string + removeAll3DENEventHandlers type - $Code$_ChildDisplay = _Rootdisplay createMissionDisplay "Tutorial";$/Code$ - - $Code$// In Arma 3 this would create scenarios UI - findDisplay 46 createMissionDisplay "";$/Code$ + $Code$removeAll3DENEventHandlers "onUndo";$/Code$ undefined / undefined @@ -12167,919 +13038,784 @@ - Display + Nothing + - createSimpleObject + setEditorObjectScope - Create object with given shape defined as path to.p3d model. Supported LODs include Geometry, Fire Geometry, Roadway, View Geometry and ShadowVolume. Supported features include collision, texturing, animation, penetration, AI spotting occlusion, and surface specific sounds (like footsteps). Unsupported features include PhysX, damage, AI pathfinding (causes walking through walls), and built in lights. - Given the simulation limitations, global decorative objects can be created with very little network traffic. Objects that could be exclusively created with this command are: trees, bushes, rocks, bridges, roads, vehicle wrecks, custom models in mission, and other objects without a class in config. The height of the placement position might need to be adjusted experimentally. Some of the model examples could be found here: createSimpleObject/objects - Guide: https://community.bistudio.com/wiki/Arma_3_Simple_Objects - One cannot attach actions to a simple object via addAction. - NOTES : - Objects created with Syntax 1 cannot be textured. Some objects may also have inverted default direction. - Objects created with Syntax 2 can be textured. The default direction should match the direction of the object if it was created with createVehicle. - Since Arma 3 v1.67 simple objects support setVariable and getVariable + This command defines the level of access a user has to editor objects. + "objects" is an array of either Editor Objects (eg ["_unit_0"]) or actual Game Objects (eg [player]). If the array is empty then the command will automatically parse all editor objects. + "editorType" is the editor type to effect (eg "unit", "vehicle", "center") or "" for all types. + "condition" is an executable string that must evaluate to true or false. If true, the scope of the evaluated editor object will be modified. "_x" can be used in the string as reference to the ingame representation of the currently processed array member. + "scope" is one of "HIDE", "VIEW", "SELECT", "LINKTO", "LINKFROM", "ALLNODRAG", "ALLNOTREE", "ALLNOCOPY", "ALLNOSELECT" or "ALL". + "subordinatesAlso" is a boolean value. If true then subordinates in the editor will be assigned the same scope as the parent. + i + Some Old Editor Command - https://community.bistudio.com/wiki/createSimpleObject + https://community.bistudio.com/wiki/setEditorObjectScope - createSimpleObject Array + Control setEditorObjectScope Array - createSimpleObject [shapeName, positionWorld] - - createSimpleObject [className, positionASL] + map setEditorObjectScope [objects, editorType, condition, scope, subordinatesAlso] - $Code$_pos = player getRelPos [10, 0]; - _tank = createSimpleObject ["a3\armor_f_beta\apc_tracked_01\apc_tracked_01_rcws_f.p3d", _pos]; - _tank setPos (_pos vectorAdd ( getPosWorld _tank vectorDiff (_tank modelToWorld [0,0,0]))); - _tank hideSelection ["zasleh", true ]; - _tank hideSelection ["zasleh2", true ]; - _tank hideSelection ["clan", true ]; - _tank animate ["Wheel_podkoloL3", 0.5, true ]; - _tank animate ["Wheel_podkoloL6", 0.5, true ];$/Code$ + $Code$_map setEditorObjectScope [ [],"vehicle", "side effectiveCommander _x != side player", "HIDE", false]$/Code$ - $Code$_pos = player getRelPos [10, 0]; - _tank = createSimpleObject ["B_APC_Tracked_01_CRV_F", AGLtoASL _pos]; - _tank setObjectTexture [0, "#(rgb,8,8,3)color(0,1,0,0.01)"]; - _tank hideSelection ["zasleh", true ]; - _tank hideSelection ["zasleh2", true ]; - _tank hideSelection ["clan", true ]; - _tank animate ["Wheel_podkoloL3", 0.5, true ]; - _tank animate ["Wheel_podkoloL6", 0.5, true ];$/Code$ + $Code$((findDisplay 128) displayCtrl 51) setEditorObjectScope [ ["_unit_0"], "", "true", "ALLNODRAG", false]$/Code$ - undefined / global + undefined / undefined - (April 18, 2016) - The easiest way to correctly place simple object is to create normal object of the same shape from class (if possible), then copy getPosWorld, vectorDir and vectorUp from it. Then create the simple object and apply copied values to it, this will position simple object exactly as normal object was positioned: - $Code$_heli = "B_Heli_Light_01_F" createVehicleLocal ( player getRelPos [10, 0]); - _position = getPosWorld _heli; - _vectorDirUp = [ vectorDir _heli, vectorUp _heli]; - _model = getModelInfo _heli select 1; - deleteVehicle _heli; - _simpleHeli = createSimpleObject [_model, _position]; - _simpleHeli setVectorDirAndUp _vectorDirUp;$/Code$ - - (April 28, 2016) - Models from within the mission file/folder can be created, but full system path is needed. Use: - $Code$( str missionConfigFile select [0, count str missionConfigFile - 15]) + "myModel.p3d" - //mission folder path code from: http://killzonekid.com/arma-scripting-tutorials-mission-root/ $/Code$ - - (May 11, 2016) - simulationEnabled returns false. - - (September 5, 2016) - There is a section in function library dedicated to simple object creation and interaction. It's purpose is to simplify the operations: - BIS_fnc_createSimpleObject - creates simple object according to the supplied data - you can supply p3d path, class name or data you get from scanning a non-simple object - BIS_fnc_simpleObjectData - gathers and returns data about the non-simple object - data can be then used to create simple object - BIS_fnc_replaceWithSimpleObject - replaces non-simple object with simple object on the scene - do not use it in large scale in MP missions as it is not network efficient - BIS_fnc_adjustSimpleObject - adjusts simple object to looks as close to the non-simple object as possible - function is internally called from the 'bis_fnc_createSimpleObject', you won't probably need to call this function directly - Check the function headers for more info about the input parameters and possibilities. - Object + Nothing + - createSimpleTask + diag_codePerformance - Creates a new Task. The task effect is local, it will only exist on PC it was added. + Attempts to run given code with given arguments given number of cycles in unscheduled environment and returns average time it took to run the code as well as actual number of executions performed. The command will return as soon as possible if the tested code is slow and the duration of the command exceeds 1 second. Engine alternative to BIS_fnc_codePerformance + NOTE: For security purposes, this command will only run for 1 cycle in MP, unless in-game debug console is available via description.ext option or Eden attribute setting. - https://community.bistudio.com/wiki/createSimpleTask + https://community.bistudio.com/wiki/diag_codePerformance - Object createSimpleTask Array + diag_codePerformance Array - person createSimpleTask [name, parentTask ] + diag_codePerformance [code, arguments, cycles] - $Code$_currentTask = player createSimpleTask ["NewTask"];$/Code$ - - $Code$_childTask = player createSimpleTask ["ChildTask", _currentTask];$/Code$ + $Code$_result = diag_codePerformance [{ private _a = 123;}, 0, 10000];$/Code$ - global / local + undefined / undefined - (July 02, 2011) - Creating child will position the new task just under the parent task. - Creating another "normal" (parent) task will create a new line above the others. Think of it if you want ordered objectives. - Succeeding parent task will automatically succeed childs, whatever their taskState was set to. (I.E. If a task is set as a child to another, it will be completed when its parent is complete.. no matter if the child task really was or not). - This command has to be executed again for it to be applied for JIP players - no server sync - Full step by step code from beginning to end: - Step 1: create a new simpleTask - $Code$ - A_SIMPLE_TASK = player createSimpleTask [( localize "STR_aSimpleTask")]; - $/Code$ - You may create a task at any given point in time. You just need to be aware of the fact, that you've created the task for a single unit (the player). So if you make use of teamSwitch, respawn or similiar, you need to think about how to manage this, so all of these units will have up to date tasks assigned to them. - Second, it's a good practice to use a stringtable, even if you do not plan (yet) to offer translations. - Step 2: task destination - $Code$ - A_SIMPLE_TASK setSimpleTaskDestination _destination; - $/Code$ - variable/pointer-to-your-task setSimpleTaskDestination some-position. That's it. - Step 3: task description - $Code$ - A_SIMPLE_TASK setSimpleTaskDescription [ - ( localize "STR_aSimpleTaskLongText"), - ( localize "STR_aSimpleTask"), - ( localize "STR_aSimpleTaskWaypointLabel") - ]; - $/Code$ - Again, no magic involved here. You take your task, the command setSimpleTaskDescription an pass an array with three strings in it. The first string is the long description text, the second is the name/title of the task and the last one will show up on-screen on the waypoint in cadet mode. - Step 4: set and update task states - $Code$ - A_SIMPLE_TASK setTaskState "CREATED"; - $/Code$ - And that's it. Here a minimal working example: - $Code$ - A_SIMPLE_TASK = player createSimpleTask ["simple task title"]; - A_SIMPLE_TASK setSimpleTaskDestination ( position player ); - A_SIMPLE_TASK setSimpleTaskDescription [ - "simple task long description", - "simple task title", - "simple task waypoint label" - ]; - A_SIMPLE_TASK setTaskState "CREATED"; - $/Code$ - And then later in the mission: - $Code$ - A_SIMPLE_TASK setTaskState "SUCCEEDED"; - $/Code$ - If you want to keep the player in the loop about the status of tasks, you may always do this: - $Code$ - [ objNull, objNull, A_SIMPLE_TASK, "SUCCEEDED"] execVM "CA\Modules\MP\data\scriptCommands\taskHint.sqf"; - $/Code$ - Task + Array + - createSite + didJIP - Create a new site. - This command is considered deprecated and is no longer supported + Checks if the current client Joined In Progress. - https://community.bistudio.com/wiki/createSite + https://community.bistudio.com/wiki/didJIP - String createSite Position + didJIP - type createSite pos + didJIP - + $Code$clientDidJIP = didJIP ;$/Code$ + undefined / undefined - (February 18, 2014) - "CreateSite is an obsolete command from the time in development when Sites were handled separately from other modules. Now they use the modules framework. - If you want a specific Site to be activated during the mission, place it in the editor and use the Condition line in its parameters (the last one)." - Jezuro [1] + (February 23, 2016) + reports false in CfgFunctions with preInit = 1; even when the client joined in progress. - Object + Boolean + - createSoundSource + findDisplay - Creates a sound source of the given type (type is the name of the subclass of CfgVehicles which is pointing to the sound defined in CfgSFX ). If the markers array contains several marker names, the position of a random one is used, otherwise, the given position is used. The sound source is placed inside a circle with this position as its center and placement as its radius. Some of the vanilla classes pre-configured in Arma 3: - "Sound_Alarm" - "Sound_Alarm2" - "Sound_BattlefieldExplosions" - "Sound_BattlefieldFirefight" - "Sound_Fire" - "Sound_SmokeWreck1" - "Sound_SparklesWreck1" - "Sound_SparklesWreck2" - "Sound_Stream" - Since Arma 3 v1.69.141183 it is possible to define sounds for use with createSoundSource in mission config. As mentioned earlier, the sounds needed for this command should be defined inside CfgVehicles class, which itself references CfgSFX class. If given class searched in main config and is not found, the search will continue in description.ext. Here is an example of suitable mission config definition: - // description.ext - class CfgSFX - { - class MyOwl - { - sound0 [ ] = { "@A3\Sounds_F\environment\animals\birds\owl1", db - 10, 1.0, 1000, 0.2, 0, 15, 30 } ; // path to addon sound - sound1 [ ] = { "@A3\Sounds_F\environment\animals\birds\owl2", db - 10, 1.0, 1000, 0.2, 0, 15, 30 } ; // path to addon sound - sound2 [ ] = { "@A3\Sounds_F\environment\animals\birds\owl3", db - 10, 1.0, 1000, 0.2, 0, 15, 30 } ; // path to addon sound - sounds [ ] = { sound0, sound1, sound2 } ; - empty [ ] = { "", 0, 0, 0, 0, 0, 0, 0 } ; - } ; - } ; - class CfgVehicles - { - class MyOwlSound // class name to be used with createSoundSource - { - sound = "MyOwl" ; // reference to CfgSFX class - } ; - } ; - $Code$_owl = createSoundSource ["MyOwlSound", position player, [], 0];$/Code$ - Note that the sound created by createSoundSource will always be looping. Also when CfgSFX sound definition contains more than 1 sound, there is no guarantee that the sound played will be the same on every PC in Multiplayer. + Find display by its IDD (which is defined in the description.ext or config). + If the specified display can't be found displayNull ("No display") is returned, (which can be tested with the isNull command.) + The primary display uses IDD 46. (eg: findDisplay 46). This will return displayNull on a dedicated server (so be sure to check isDedicated if using this in a waitUntil condition). - https://community.bistudio.com/wiki/createSoundSource + https://community.bistudio.com/wiki/findDisplay - createSoundSource Array + findDisplay Number - createSoundSource [type, position, markers, placement] + findDisplay idd - $Code$_soundSource = createSoundSource ["LittleDog", position player, [], 0]$/Code$ - - $Code$[] spawn - { - _alarm = createSoundSource ["Sound_Alarm", position player, [], 0]; //starts alarm - sleep 10; - deleteVehicle _alarm; //stops alarm - };$/Code$ + $Code$_display = findDisplay 1;$/Code$ - global / global + undefined / undefined + (15 June 2008) + findDisplay does not find displays defined under RscTitles (even when they are visible). + To access those types of displays, either assign the resource to a global variable, or pass its this value to a script, during the onLoad event: + e.g. class RscTitles { + class MyRsc { + onLoad = "myDisplay = (_this select 0)"; // or + // onLoad = "_this execVM 'myDialog.sqf'"; + ... + You can then use the stored value as you would for regular dialogs: + $Code$(myDisplay displayCtrl 1111) ctrlSetText "hello there");$/Code$ + + (17 March 2010) + I posted a tutorial on finding and using displays here. + + (07 March 2014) + The Zeus Display uses IDD 312 + + (March 25, 2015) + Display 12 is map + + (June 25, 2017) + I have tested the behavior of this command and I found out that it [ findDisplay ] appears to only return the display AFTER any onLoad event handler of that display is done. So, using findDisplay inside an onLoad event handler is useless. + + (August 14, 2017) + There are some specific cases, where findDisplay will not be able to find an existing display. Here's the cases and how to act on them: + $Code$//Your display has IDD= -1. + class RscDisplayNew + { + idd=-1; + scriptName = "RscDisplayNew"; + ... + };$/Code$ + $Code$//Your display doesn't have IDD + class RscDisplayNew + { + scriptName = "RscDisplayNew"; + ... + };$/Code$ + $Code$//Your display doesn't have scriptname with IDD = -1 + class RscDisplayNew + { + idd=-1; + ... + };$/Code$ + $Code$//Your display doesn't have scriptname, neither IDD + class RscDisplayNew + { + ... + };$/Code$ + 1. + You actually can find a -1 display, but this means finding a display with this IDD might be a problem, when there are a few displays marked as -1. + So as you can see, theres an entry called scriptName. You can get a reference to this display by using uiNamespace : + $Code$(uiNamespace getVariable "RscDisplayNew")$/Code$ + NOTE : Variables are overwritten with a reference of the last declared display under the same scriptName entry. Take a look at case 3 for solution. + 2. + Displays without IDD's can actually exist. They can be manipulated only in a way described in the first case using uiNamespace. + 3. + You can really have this display seeking it manually in a allDisplays return. This is experimental, but working option. + 4. + You will have a problem finding this display, since this display doesn't exist even in allDisplays (?) return. Behaviour unknown. - Object + Display + - createTask + setParticleParams - Create a new AI task (subtask of parentTask). Type is name of registered task type. + Set parameters to particle source. Array is in format ParticleArray. + Since Arma 3 version 1.11.114706 you can use this command to overwrite many values set by setParticleClass, particularity those defined in ParticleArray. Correspondence between CfgCloudlets class param names and command array of params: + $Code$particleSource setParticleParams + [ + /* String or Array - If string then the name of the particleShape. And following default values are used: + particleFSNtieth = 1 + particleFSIndex = 0 + particleFSFrameCount = 1 + particleFSLoop = true + */ + [ + particleShape, /* String */ + particleFSNtieth, /* Number */ + particleFSIndex, /* Number */ + particleFSFrameCount, /* Number */ + particleFSLoop /*Optional - Boolean. Default: true */ + ], + animationName, /* String */ + particleType, /* String - Enum: Billboard, SpaceObject*/ + timerPeriod, /* Number */ + lifeTime, /* Number */ + position, /*3D Array of numbers as relative position to particleSource or (if object at index 18 is set) object. + Or (if object at index 18 is set) String as memoryPoint of object.*/ + moveVelocity, /*3D Array of numbers.*/ + rotationVelocity, /* Number */ + weight, /* Number */ + volume, /* Number */ + rubbing, /* Number */ + size, /* Array of Number */ + color, /* Array of Array of RGBA Numbers */ + animationSpeed, /* Array of Number */ + randomDirectionPeriod, /* Number */ + randomDirectionIntensity, /* Number */ + onTimerScript, /* String */ + beforeDestroyScript, /* String */ + this, /* Object */ + angle, /*Optional Number - Default: 0*/ + onSurface, /*Optional Boolean */ + bounceOnSurface, /*Optional Number */ + emissiveColor /*Optional Array of Array of RGBA Numbers */ + ];$/Code$ - https://community.bistudio.com/wiki/createTask + https://community.bistudio.com/wiki/setParticleParams - Team_Member createTask Array + Object setParticleParams Array - teamMember createTask [[type, parentTask], priority, name1, value1nameN, valueN] + particleSource setParticleParams array - + $Code$see ParticleArray$/Code$ + undefined / undefined - Task + Nothing + - createTeam + debugFSM - Create a team and name it. + Dump (something about FSM) to debugging output. This command is (assumed to be) non-functional in the retail version. + Non functional in retail - https://community.bistudio.com/wiki/createTeam + https://community.bistudio.com/wiki/debugFSM - createTeam Array + Number debugFSM Boolean - createTeam [type, name] + FSMhandle debugFSM true - $Code$_team = createTeam ["USMC_Team", "Fire Team Red"];$/Code$ - + undefined / undefined - Team_Member + Nothing + - createTrigger + distributionRegion - Creates a sensor ( trigger ) of the given type and at the given position. The type must be a class name in CfgNonAIVehicles or CfgVehicles with simulation = detector. An array containing all units that have activated the trigger is available via list triggerobj. Created triggers can be deleted using deleteVehicle. - NOTE1: Since Arma 3 v1.43.129935 triggers can be created locally on clients setting optional param makeGlobal to false - NOTE2: Since Arma 3 v1.53.132440 triggers can be disabled/enabled using enableSimulation command - Triggers are created with default params, which are: - a: 50.0 - b: 50.0 - c: -1 - angle: 0 - rectangular: false - activationBy: None - activationType: Present - repeating: false - timeoutMin: 0 - timeoutMid: 0 - timeoutMax: 0 - interruptable: true - type: None - text: "" - name: "" - expCond: "this" - expActiv: "" - expDesactiv: "" + Returns the numerical index for the distribution region of this copy of ArmA. + 1 - US + 2 - Rest of the world - https://community.bistudio.com/wiki/createTrigger + https://community.bistudio.com/wiki/distributionRegion - createTrigger Array + distributionRegion - createTrigger [type, position, makeGlobal] + distributionRegion - $Code$_trg = createTrigger ["EmptyDetector", getPos player ]; - _trg setTriggerArea [5, 5, 0, false ]; - _trg setTriggerActivation ["CIV", "PRESENT", true ]; - _trg setTriggerStatements ["this", "hint 'Civilian near player'", "hint 'no civilian near'"];$/Code$ + $Code$distributionRegion == 1$/Code$ undefined / undefined - (March 6, 2013) - Calling list immediately after creating a trigger this way (and setting up activation, area, statements, timeout, etc..), will return null instead of an array. It seems the trigger needs about 1 second to initialise, after which it will behave as expected: returning an array of all the objects inside the trigger (the ones matching the criteria), or an empty array. - Object + Number + - createUnit + hintSilent - Create unit of a class that's defined in CfgVehicles. - The Group parameter MUST be an existing group or the unit won't be created. + Same as hint, but without a sound. - https://community.bistudio.com/wiki/createUnit + https://community.bistudio.com/wiki/hintSilent - Group createUnit Array - - String createUnit Array + hintSilent String/Structured_Text - group createUnit [type, position, markers, placement, special] - - type createUnit [position, group, init, skill, rank] + hintSilent text - $Code$_unit = group player createUnit ["SoldierWB", position player, [], 0, "FORM"];$/Code$ - - $Code$"SoldierWB" createUnit [ position player, group player ];$/Code$ - - $Code$"soldierWB" createUnit [ getMarkerPos "barracks", _groupAlpha];$/Code$ - - $Code$"soldierWB" createUnit [ getMarkerPos "marker_1", _groupAlpha, "loon1 = this; - this addWeapon 'BAF_L85A2_RIS_SUSAT'", 0.6, "corporal"];$/Code$ + $Code$hintSilent "You texte comes here !"$/Code$ - undefined / global + undefined / local - (August 13, 2006) - To give a newly created unit a name, put "newUnit = this" in the init field. - - (18:41, 5 April 2007 (CEST)) - The eventhandlers added with addEventHandler in the init parameter will only fire locally on the machine where this creation command is called from. - - (December 24, 2007) - If you do not wish it to be in a group, you can create a gamelogic and group it to that. Note: The unit will deny to move away from the gamelogic. - - (August 27, 2015) - In order to solve the above problem you can simply group it to the game logic as stated, then group it to grpNull - e.g - $Code$myUnit join myGroupLogic; - myUnit join grpNull - $/Code$ - - (21 December 2006) - Although this command takes a group as an argument, you need to use the join command if you want the created units to perform actions such as move. For example: - $Code$ comment "Create a new soldier within 100m of the player and cause them to run towards the player" ; - _grp = createGroup west ; - unit = _grp createUnit ["SoldierWB", position player, [], 100, "FORM"] ; - [unit] join _grp ; - unit move position player ; - $/Code$ - However, some commands such as setUnitPos only work if run before the join. - - (11 March 2011) - Comment above about 'an additional join required' is no longer true for Operation Arrowhead. - - (27th Nov 2016) - (A3 v1.64)The side of created unit by this command fallows the fraction from its config and won’t be affected by the side of the passed group parameter which is created by createGroup on the fly without entities. - $Code$ - _grp = createGroup east ; // O Alpha 1-1 - _ap = _grp createUnit [ “C_man_p_beggar_F”, position player, [], 0, "FORM"]; - //the side of _ap is still CIV not EAST. - $/Code$ - We can use join command family or fill the _grp with entities in advance to set _ap to our desired side. - Object - Nothing + Nothing + - createVehicleCrew + posWorldToScreen - Creates crew to given empty vehicle. Crew members are default crew defined in config. Crew side will also correspond to vehicle's faction. This command does not addVehicle to the created crew in the same way this normally happens when crewed vehicle created in the editor. + Convert world coordinates to screen coordinates in map. - https://community.bistudio.com/wiki/createVehicleCrew + https://community.bistudio.com/wiki/posWorldToScreen - createVehicleCrew Object + Control posWorldToScreen Array - createVehicleCrew vehicle + map posWorldToScreen position - $Code$// Spawn a flying UAV with crew. - myUAV = [ getPos player, 0, "B_UAV_02_F", west ] call BIS_fnc_spawnVehicle ; - createVehicleCrew (myUAV select 0);$/Code$ - - $Code$_veh = createVehicle ["O_MRAP_02_hmg_F", position player, [], 0, "NONE"]; - createVehicleCrew _veh; - { - diag_log [_x, faction _x, side _x, side group _x]; - } forEach crew _veh;[O Alpha 1-1:1,"OPF_F",EAST,EAST] - [O Alpha 1-1:2,"OPF_F",EAST,EAST]$/Code$ - + undefined / undefined - (August 20, 2014) - As of ARMA 3 v1.26 the command will work on non-empty vehicles. If any of the crew defined in config are missing they will be added. - - (November 8, 2014) - This command creates drivers/copilots, commanders and gunners where appropriate, but it never creates cargo crew. - So a gunship Huron will get a pilot and copilot plus 2 door gunners, but nobody in the back. - - (December 22, 2015) - createVehicleCrew does not work with Transport Unload waypoints for helicopters. You need to spawn the pilots separately and then get them into the helicopter in order to get Transport Unload waypoints to work. - - (July 2, 2017) - The particular seats to which units are added depend on the dontCreateAI property, the hasDriver property of the base class, and the hasGunner propery of turret classes. - For instance, the following snippet calculates how many seats will be occupied by the created crew: - $Code$private _vehCfg = configFile "CfgVehicles" typeOf _vehicle; - private _crewCount = {round getNumber (_x "dontCreateAI") 1 && - ((_x == _vehCfg && {round getNumber (_x "hasDriver") 0}) || - (_x != _vehCfg && {round getNumber (_x "hasGunner") 0}))} count ([_vehicle, configNull] call BIS_fnc_getTurrets); - $/Code$ - Also, I've written a function to create a UAV crew for a specific side: https://gist.github.com/AgentRev/cb25d30e464f2239b6cee51fa0110c78 - Nothing + Array + - createVehicleLocal + lbValue - Creates an object of the given type. Created object is not transferred through network in MP games. netId of such vehicle in multiplayer will be "0:0". To disable local vehicle creation, use CfgDisabledCommands to blacklist this command + Returns the additional integer value in the item with the given index of the listbox or combobox with id idc of the topmost user dialog. - https://community.bistudio.com/wiki/createVehicleLocal + https://community.bistudio.com/wiki/lbValue - String createVehicleLocal Position + lbValue Array + + Control lbValue Number - type createVehicleLocal position - - - $Code$_lightsource = "#lightpoint" createVehicleLocal _pos;$/Code$ + lbValue [idc, index] + + control lbValue index + + + $Code$_value = lbValue [101, 0];$/Code$ + + $Code$_value = _control lbValue 0;$/Code$ - undefined / local + local / local - (07:18, 5 June 2008 (CEST)) - If the object that is created is of the type ammo, then it will created on all clients ( tested only on VBS2 ). - - (18:04, 5 September 2013 (CEST)) - Indeed the type of Ammo is transfered to ALL clients, but apparently also the muzzle effects (firing sound, light, etc.); this includes muzzles from Horns (Truck or Car Horn, Bicycle bells, etc.) as well as any other weapon. Tested on Arma 1 - Arma 2 OA (latest patch). + More information on the LB command family can be found here - Object + Number - Number + - createVehicle + setVectorDir - Creates an empty object of given classname type (See Arma 3 Assets or createVehicle/vehicles ) - For a class reference from older games see Classes. - Some special 'Scripted' vehicle classes: - DemoCharge_Remote_Ammo_Scripted - same as DemoCharge_Remote_Ammo but will explode when destroyed or setDamage 1; - SatchelCharge_Remote_Ammo_Scripted - same as SatchelCharge_Remote_Ammo but will explode when destroyed or setDamage 1; - ClaymoreDirectionalMine_Remote_Ammo_Scripted - same as ClaymoreDirectionalMine_Remote_Ammo but will explode when destroyed or setDamage 1; - GroundWeaponHolder_Scripted - same as GroundWeaponHolder but will not be auto-deleted when empty - WeaponHolderSimulated_Scripted - same as WeaponHolderSimulated but will not be auto-deleted when empty - Randomization: - In Arma 3 many vehicles will get randomized in appearance by default in order to add some variety to the game. It is possible to override this default behavior by setting BIS_enableRandomization variable to false in the vehicle namespace: - $Code$_veh = "C_Offroad_01_F" createVehicle position player ; - _veh setVariable ["BIS_enableRandomization", false ];$/Code$ - or - $Code$this setVariable ["BIS_enableRandomization", false ];$/Code$ - if done in mission editor init field. + Set object's direction vector. Up vector will remain unchanged. - https://community.bistudio.com/wiki/createVehicle + https://community.bistudio.com/wiki/setVectorDir - String createVehicle Position - - createVehicle Array + Object setVectorDir Array - type createVehicle position - - createVehicle [type, position, markers, placement, special] + object setVectorDir [x,y,z] - $Code$_jeep = "Jeep" createVehicle position player ;$/Code$ - - $Code$_heli = "AH1Z" createVehicle getMarkerPos "hspawn";$/Code$ - - $Code$_veh = createVehicle ["ah1w", position player, [], 0, "FLY"];$/Code$ - - $Code$_veh = createVehicle ["2S6M_Tunguska", getMarkerPos "marker1", ["marker2","marker3"], 0, "NONE"];$/Code$ - - $Code$// Objects such as - //test_EmptyObjectForBubbles - //test_EmptyObjectForFireBig - //test_EmptyObjectForSmoke - //create additional emitters, which are stored in "effects" variable on the object. Since Arma 3 v1.71 these emitters are automatically deleted when object is deleted - [] spawn - { - _fire = "test_EmptyObjectForFireBig" createVehicle position player ; - sleep 5; - deleteVehicle _fire; - };$/Code$ - - $Code$// The following explosives (with ending _Scripted) - //DemoCharge_Remote_Ammo_Scripted - //SatchelCharge_Remote_Ammo_Scripted - //ClaymoreDirectionalMine_Remote_Ammo_Scripted - //can be set off by applying setDamage 1 to them for ease of scripting: - _claymore = "ClaymoreDirectionalMine_Remote_Ammo_Scripted" createVehicle position player ; - 0 = _claymore spawn - { - uiSleep 5; - _this setDamage 1; - };$/Code$ - - $Code$// How to add inventory to objects without inventory: - _boxes = "Land_Pallet_MilBoxes_F" createVehicle position player ; - _cargo = "Supply500" createVehicle [0,0,0]; - _cargo attachTo [_boxes, [0,0,0.85]]; - // optional for objects that can take damage - _boxes addEventHandler ["Killed", - { - { - detach _x, - deleteVehicle _x; - } - forEach attachedObjects (_this select 0); - }];$/Code$ - - $Code$// Drop weapon: - _wh = "GroundWeaponHolder_Scripted" createVehicle position player ; - player action ["DropWeapon", _wh, currentWeapon player ];$/Code$ - + - undefined / global + local / global - (August 13, 2006) - Using main syntax of this command sets the created vehicle not exactly at the given position, you have to setPos it there, if accuracy counts. - - (Jan 20, 2006) - Using main syntax of this command sets the created vehicle in the nearest possible position. You can create a dozen of tanks with it - they will appear side by side. - - (December 13, 2006) - Observe that buildings with the default destrType will not work correctly in multiplayer in Armed Assault when created with this command. The Destruction effect will only be displayed where the building is local. - - (Oct 18, 2009) - As of Arma2, this command cannot be used to create game logics (source). Use createUnit instead. - - (January 14, 2011) - In multiplayer, only run this command on one machine. It will create a the vehicle on all machines every time it is called on any machine. - - (January 26 2014) - Using getPosATL should work, if otherwise you are struggling to get a the proper position coordinates. - - (September 12, 2014) - "vehclass" createVehicle pos is the same if not faster than createVehicle ["vehclass", pos, [], 0, "NONE"] - - (August 22, 2015) - GroundWeaponHolder class is automatically deleted when empty after 0.5 to 1 seconds in A3 1.48. The exact delay is random but never lower than 0.50 secs after creation. You can stop deletion by adding something (cargo) to it within 0.5 seconds. + (March 16, 2008) + Command can be also used to rotate camera in all three axis. - (December 1, 2015) - The short syntax creates vehicles at ground level ignoring the Z in pos - $Code$"vehclass" createVehicle pos$/Code$ This is equivalent to $Code$createVehicle ["vehclass", [pos select 0, pos select 1, 0], [], 0, "NONE"]$/Code$ + (21:06, 3 March 2009 (CET)) + setVectorDir can only influence an object's pitch. It can not influence bank. Example: + $Code$player setVectorDir [0,0,1]$/Code$ + If the player is facing 0 degrees (north), then this will do NOTHING. + If the player is facing 90 degrees (east), then this will make him pitch 90 degrees up. + You can't directly pitch an object beyond 90 degrees, because this would change its facing direction. You must first flip it's direction using setDir, then you must bank the object 180 degrees, THEN you pitch the object appropriately. - (May 16, 2017) - For the alternative syntax, if the vehicle has canFloat = 1; in its config class (e.g. boats and wheeled APCs), the command expects PositionAGL, and otherwise always PositionATL. + (August 17, 2015) + In Arma 3, setVectorDir does not control an object's pitch or bank, in fact, it is not possible to change either of those solely using setVectorDir. This command can only affect horizontal rotation along the x-plane, unless an object first has it's vectorUp changed to something other than [0,0,1]. Correct input to setVectorDir should be calculated using the trigonometric functions sin and cos. + examples: + $Code$ + 0 degrees (north) + player setVectorDir + [ + sin 0, //equals 0 + cos 0, //equals 1 + 1 + ]; + 45 degrees (north-east) + player setVectorDir + [ + sin 45, //equals 0.707 + cos 45, //equals 0.707 + 1 + ];$/Code$ + If you are doing trigonometric calculations, it may be better to use setVectorDir rather than setDir, since sine and cosine have already been calculated and will not need to be re-calculated + (also, setDir probably uses setVectorDir anyway.) - Object - Object + Nothing + - crew + sideEnemy - Returns the crew (both dead and alive) of the given vehicle. + The enemy side (used for renegades). Unit of this side is enemy to everyone. + To become one, you can attack members of your own side or use addRating. + When below a rating of -2000 units switch automatically to this side. - https://community.bistudio.com/wiki/crew + https://community.bistudio.com/wiki/sideEnemy - crew Object + sideEnemy - crew vehicleName + sideEnemy - $Code$player in ( crew _tank);$/Code$ + $Code$if ( side player == sideEnemy ) then { + hint "We've got a renegade!"; + };$/Code$ - global / undefined + undefined / undefined - (3 February, 2010) - The crew command will return crew in order [driver,gunner,commander,turrets,cargo] - - (1 June, 2014) - The crew command will return an empty array if the object has no crew - this includes objects that can't hold crew. If used on a unit (man, module, etc.) it will return an array containing that unit. - Array + Side + - ctAddHeader + triggerActivation - Adds a header line of controls according to the HeaderTemplate class. It returns an array containing header index and array of created controls in a format [ headerIndex, [ control0, control1... control n ]]. - Note that rows and headers are indexed separately. + Returns trigger activation in the form [by, type, repeating]. + Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. - https://community.bistudio.com/wiki/ctAddHeader + https://community.bistudio.com/wiki/triggerActivation - ctAddHeader Control + triggerActivation Object - ctAddHeader Control + triggerActivation trigger - $Code$_array = ctAddHeader _control;$/Code$ - + - local / local + global / local - Array + Array + - ctAddRow + allPlayers - Adds one row of controls according to the RowTemplate class. It returns an array containing row index and array of created controls in a format [ rowIndex, [ control0, control1... control n ]]. - Note that rows and headers are indexed separately. + Returns a list of all human players including dead players. The command also returns all connected headless clients. To filter headless clients out: + $Code$_justPlayers = allPlayers - entities "HeadlessClient_F";$/Code$ + NOTES: + In player hosted game, the complete array of allPlayers may get delayed at the start. Use BIS_fnc_listPlayers if you need it earlier + The order of players in the return array may differ from server to clients - https://community.bistudio.com/wiki/ctAddRow + https://community.bistudio.com/wiki/allPlayers - ctAddRow Control + allPlayers - ctAddRow Control + allPlayers - $Code$_array = ctAddRow _control;$/Code$ + $Code${ + systemChat format [ + "Player %1 is %2", + name _x, + ["dead", "alive"] select alive _x + ]; + } forEach allPlayers ;$/Code$ + + $Code$_bluNums = west countSide allPlayers ;$/Code$ + + $Code$// Find all human players if headless clients are used: + _allHCs = entities "HeadlessClient_F"; + _allHPs = allPlayers - _allHCs;$/Code$ - local / local + undefined / undefined - Array + Array + - ctClear + markerColor - Removes all the lines from the RscControlsTable. Returns Nothing. + Returns marker color for given marker. See setMarkerColor. Note: This function is identical to getMarkerColor. - https://community.bistudio.com/wiki/ctClear + https://community.bistudio.com/wiki/markerColor - ctClear Control + markerColor String - ctClear Control + markerColor markerName - $Code$ctClear _control;$/Code$ + $Code$if ( markerColor "Marker1" == "ColorRed") then { hint "Marker1 is red!"}$/Code$ - local / local + undefined / undefined - Nothing + String + - ctCurSel + removeCuratorEditingArea - Returns index of the selected row. Will take only rows, but not headers into account. + Removes editing area for given curator. - https://community.bistudio.com/wiki/ctCurSel + https://community.bistudio.com/wiki/removeCuratorEditingArea - ctCurSel Control + Object removeCuratorEditingArea Number - ctCurSel Control + curatorObj removeCuratorEditingArea editAreaID - $Code$_curSel = ctCurSel _control;$/Code$ + $Code$myCurator removeCuratorEditingArea 3;$/Code$ - local / local + undefined / undefined - Number + Nothing + - ctData + createTrigger - Returns metadata (string) associated with a particular row of RscControlsTable. + Creates a sensor ( trigger ) of the given type and at the given position. The type must be a class name in CfgNonAIVehicles or CfgVehicles with simulation = detector. An array containing all units that have activated the trigger is available via list triggerobj. Created triggers can be deleted using deleteVehicle. + NOTE1: Since Arma 3 v1.43.129935 triggers can be created locally on clients setting optional param makeGlobal to false + NOTE2: Since Arma 3 v1.53.132440 triggers can be disabled/enabled using enableSimulation command + Triggers are created with default params, which are: + a: 50.0 + b: 50.0 + c: -1 + angle: 0 + rectangular: false + activationBy: None + activationType: Present + repeating: false + timeoutMin: 0 + timeoutMid: 0 + timeoutMax: 0 + interruptable: true + type: None + text: "" + name: "" + expCond: "this" + expActiv: "" + expDesactiv: "" - https://community.bistudio.com/wiki/ctData + https://community.bistudio.com/wiki/createTrigger - ctData Control + createTrigger Array - ctData Control + createTrigger [type, position, makeGlobal] - $Code$ctData _control;$/Code$ + $Code$_trg = createTrigger ["EmptyDetector", getPos player ]; + _trg setTriggerArea [5, 5, 0, false ]; + _trg setTriggerActivation ["CIV", "PRESENT", true ]; + _trg setTriggerStatements ["this", "hint 'Civilian near player'", "hint 'no civilian near'"];$/Code$ - local / local + undefined / undefined + (March 6, 2013) + Calling list immediately after creating a trigger this way (and setting up activation, area, statements, timeout, etc..), will return null instead of an array. It seems the trigger needs about 1 second to initialise, after which it will behave as expected: returning an array of all the objects inside the trigger (the ones matching the criteria), or an empty array. - String + Object + - ctFindHeaderRows + is3DEN - Takes index of a header as a parameter. Returns array of indices of rows under this header. + Returns true if the Eden Editor is currently being used. true when inside editor environment, false during preview. (see also is3DENMultiplayer ) - https://community.bistudio.com/wiki/ctFindHeaderRows + https://community.bistudio.com/wiki/is3DEN - Control ctFindHeaderRows Number + is3DEN - Control ctFindHeaderRows Number + is3DEN - $Code$_array = _control ctFindHeaderRows 0;$/Code$ + $Code$if is3DEN then { systemChat "Welcome to Eden Editor!"};$/Code$ - local / local + undefined / undefined - Array + Boolean + - ctFindRowHeader + lbSetSelected - Takes index of a row as a parameter. Returns index of the closest header above this row. + Set the selection state of the given row of the given listbox of style LB_MULTI. For single selection listbox use lbSetCurSel instead. - https://community.bistudio.com/wiki/ctFindRowHeader + https://community.bistudio.com/wiki/lbSetSelected - Number ctFindRowHeader Number + Control lbSetSelected Array - Control ctFindRowHeader Number + control lbSetSelected [index, selected] - $Code$_index = _control ctFindRowHeader 0;$/Code$ + $Code$_control lbSetSelected [0, true ];$/Code$ - local / local + undefined / undefined + (April 10, 2016) + This command works fine with listboxs of style LB_MULTI and should not be marked as obsolete as lbSetCurSel does not provide the same functionality. - Number + Nothing + - ctHeaderControls + tvSetPictureColor - Returns array of controls on the header with the given index. + Sets the colour of the picture (set via tvSetPicture ) under the specified tree view path. - https://community.bistudio.com/wiki/ctHeaderControls + https://community.bistudio.com/wiki/tvSetPictureColor - Control ctHeaderControls Number + tvSetPictureColor Array + + Control tvSetPictureColor Array - Control ctHeaderControls Number + tvSetPictureColor [idc, path, color] + + ctrl tvSetPictureColor [path, color] - $Code$_array = _control ctHeaderControls 0;$/Code$ + $Code$tvSetPictureColor [101, [0,2], [1,0,1,1]];$/Code$ + + $Code$_tree tvSetPictureColor [[0,2], [1,0,1,1]];$/Code$ local / local @@ -13087,518 +13823,580 @@ - Array + Nothing - Nothing + - ctHeaderCount + getAmmoCargo - Returns number of headers (rows not included) in the RscControlsTable. + Returns the amount of ammo resources in the cargo space of a rearm vehicle. - https://community.bistudio.com/wiki/ctHeaderCount + https://community.bistudio.com/wiki/getAmmoCargo - ctHeaderCount Control + getAmmoCargo Object - ctHeaderCount Control + getAmmoCargo vehicle - $Code$ctHeaderCount _control;$/Code$ + $Code$value = getAmmoCargo myVehicleName;$/Code$ - local / local + global / undefined + (December 22, 2014) + If the vehicle is not alive, it always returns Nothing, which you should check for using isNil. + If the vehicle is unable to carry that type of cargo, it returns -1.#IND, which you should check for using finite. - Number + Number + - ctRemoveHeaders + diag_fpsMin - Takes array of header indices as a parameter and removes headers with those indices. Indices of remaining headers will be recomputed. + Returns minimal framerate. Calculated from the longest frame over last 16 frames. - https://community.bistudio.com/wiki/ctRemoveHeaders + https://community.bistudio.com/wiki/diag_fpsMin - Control ctRemoveHeaders Array + diag_fpsMin - Control ctRemoveHeaders Array + diag_fpsMin - $Code$_control ctRemoveHeaders [0, 1, 2];$/Code$ + $Code$_minfps = diag_fpsMin ;$/Code$ - local / local + undefined / undefined - Nothing + Number + - ctRemoveRows + difficultyEnabledRTD - Takes array of row indices as a parameter and removes rows with those indices. Indices of remaining rows will be recomputed. + Returns true if rotorlib simulation is enabled. Forcing by mission is included - https://community.bistudio.com/wiki/ctRemoveRows + https://community.bistudio.com/wiki/difficultyEnabledRTD - Control ctRemoveRows Array + difficultyEnabledRTD - Control ctRemoveRows Array + difficultyEnabledRTD - $Code$_control ctRemoveRows [0, 1, 2];$/Code$ + $Code$_rtdOn = difficultyEnabledRTD$/Code$ - local / local + undefined / undefined - Nothing + Boolean + - ctRowControls + fadeSpeech - Returns array of controls on the row with the given index. + Cause a smooth change in the master speech volume. The change duration is given by time, the target volume by volume. The default master is 1.0. - https://community.bistudio.com/wiki/ctRowControls + https://community.bistudio.com/wiki/fadeSpeech - Control ctRowControls Number + Number fadeSpeech Number - Control ctRowControls Number + time fadeSpeech volume - $Code$_array = _control ctRowControls 0;$/Code$ + $Code$5 fadeSpeech 0.1;$/Code$ - local / local + undefined / local - Array + Nothing + - ctRowCount + canAddItemToVest - Returns number of rows (headers not included) in the RscControlsTable. + Checks if given object can be stored into soldier's vest. - https://community.bistudio.com/wiki/ctRowCount + https://community.bistudio.com/wiki/canAddItemToVest - ctRowCount Control + Object canAddItemToVest String + + Object canAddItemToVest Array - ctRowCount Control + unit canAddItemToVest item + + unit canAddItemToVest [item, count] - $Code$ctRowCount _control;$/Code$ + $Code$_item = "HandGrenade"; + _fits = player canAddItemToVest _item; + if (_fits) then { + player addItemToVest _item; + } else { + hint "no room!"; + };$/Code$ - local / local + undefined / undefined - Number + Boolean - Boolean + - ctSetCurSel + setTriggerActivation - Selects the line with the given index. Will take only rows, but not headers into account. -1 deselects all. Returns Nothing. + Defines the trigger activation type. + See ArmA:Mission Editor - Triggers for a thorough overview of triggers and its fields for activation, effects, etc. Since Arma 3 v1.67, "ANYPLAYER" activation can be used to detect any player. - https://community.bistudio.com/wiki/ctSetCurSel + https://community.bistudio.com/wiki/setTriggerActivation - Control ctSetCurSel Number + Object setTriggerActivation Array - Control ctSetCurSel Number + trigger setTriggerActivation [by, type, repeating] - $Code$_control ctSetCurSel 0;$/Code$ + $Code$_trigger setTriggerActivation ["WEST", "EAST D", true ]$/Code$ - local / local + global / local - Nothing + Nothing + - ctSetData + getEditorMode - Associates metadata (string) with the row determined by the index. Returns Nothing. + Returns the current mode of the editor. + i + Some Old Editor Command - https://community.bistudio.com/wiki/ctSetData + https://community.bistudio.com/wiki/getEditorMode - Control ctSetData Array + getEditorMode Control - Control ctSetData [[[Number]], String ] + getEditorMode map - $Code$_control ctSetData [0, "Test"];$/Code$ - + - local / local + undefined / undefined - Nothing + String + - ctSetHeaderTemplate + deleteIdentity - Takes config path to the new header template. Clears the whole RscControlsTable and sets the new header template. + Delete an identity (created with saveIdentity ) from the campaign's progress file. - https://community.bistudio.com/wiki/ctSetHeaderTemplate + https://community.bistudio.com/wiki/deleteIdentity - Control ctSetHeaderTemplate Config + deleteIdentity String - Control ctSetHeaderTemplate Config + deleteIdentity identityName - $Code$_control ctSetHeaderTemplate _configPath;$/Code$ + $Code$?deleteIdentity "playerIdentity":hint "Delete ok"$/Code$ - local / local + undefined / local - Nothing + Boolean + - ctSetRowTemplate + inflame - Takes config path to the new row template. Clears the whole RscControlsTable and sets the new row template (Deleting all rows and headers is easier to implement than replacing the rows and filling them with new data. IDCs could overflow etc.). + Control fireplace burning. Set inflame to true (on) or false (off). - https://community.bistudio.com/wiki/ctSetRowTemplate + https://community.bistudio.com/wiki/inflame - Control ctSetRowTemplate Config + Object inflame Boolean - Control ctSetRowTemplate Config + fireplace inflame burn - $Code$_control ctSetRowTemplate _configPath;$/Code$ + $Code$_fireplaceOne inflame true ;$/Code$ - local / local + global / global - Nothing + Nothing + - ctSetValue + endl - Associates metadata (number) with the row determined by the index. Returns Nothing. + Creates a string containing a line break, similar to lineBreak for text. The name is inspired by c++ std::endl (line end). The command returns "\r\n", which contains control characters rather than printable characters: + hint str count "\r\n"; // 4 + hint str count endl ; // 2 + The line break works for diag_log and ctrlSetText. It doesn't work with the hint because hint interprets printable "\n" as line break instead. Alternatively one can use toString command to get other characters. - https://community.bistudio.com/wiki/ctSetValue + https://community.bistudio.com/wiki/endl - Control ctSetValue Number + endl - Control ctSetValue Number + endl - $Code$_control ctSetValue 0;$/Code$ + $Code$diag_log ("line1" + endl + "line2");$/Code$ + + $Code$_ctrl = findDisplay 46 ctrlCreate ["RscTextMulti", -1]; + _ctrl ctrlSetPosition [0,0,1,1]; + _ctrl ctrlCommit 0; + _ctrl ctrlSetText format ["line1%1line2%1line3", endl ];$/Code$ - local / local + undefined / undefined - Nothing + String + - ctValue + getObjectTextures - Returns metadata (number) associated with a particular row of RscControlsTable. + Gets all custom textures (hiddenSelectionsTextures) associated with the object. - https://community.bistudio.com/wiki/ctValue + https://community.bistudio.com/wiki/getObjectTextures - ctValue Control + getObjectTextures Object - ctValue Control + getObjectTextures obj - $Code$_number = ctValue _control;$/Code$ + $Code$_textures = getObjectTextures player ;$/Code$ - local / local + global / undefined - Number + Array + - ctrlActivate + addWeaponGlobal - Launch actions attached to given (button based) control. + Add a weapon to a unit. Infantry units can only carry weapons in their respective slots (primary, secondary and handgun), the addWeaponGlobal command will replace the weapon currently in a slot with the added weapon if it shares the same slot. + To make sure the added weapon is loaded and ready, add the magazine first. + This command is broken when used on dedicated server - https://community.bistudio.com/wiki/ctrlActivate + https://community.bistudio.com/wiki/addWeaponGlobal - ctrlActivate Control + Object addWeaponGlobal String - ctrlActivate controlName + unit addWeaponGlobal weapon - $Code$ctrlActivate _control$/Code$ + $Code${ + _x addMagazineGlobal "Laserbatteries"; + _x addWeaponGlobal "Laserdesignator"; + } forEach allUnits ;$/Code$ + + $Code${ + if ( typeOf _x == "O_Heli_Attack_02_black_F") then { + _x addMagazineGlobal "38Rnd_80mm_rockets"; + _x addWeaponGlobal "rockets_Skyfire"; + }; + } forEach vehicles ;$/Code$ - undefined / undefined + global / global + (July 7, 2015) + If you do not remove weapon first, using this command from dedicated server will duplicate weapon. - Nothing + Nothing + - ctrlAddEventHandler + sideLogic - Add an event handler ( User Interface Event Handlers ) to the given control. Returns id of the handler or -1 when failed. - NOTE: Control EHs are processed in reversed order, i.e. last added: first, first added: last. So if you have an override it should be set up in the 1st added EH. + The Logic side. + Side of Game Logics and Modules. - https://community.bistudio.com/wiki/ctrlAddEventHandler + https://community.bistudio.com/wiki/sideLogic - Control ctrlAddEventHandler Array + sideLogic - control ctrlAddEventHandler [handler,function] + sideLogic - $Code$_map ctrlAddEventHandler ["draw","_this call BIS_fnc_strategicMapOpen_draw"];$/Code$ - - $Code$_map ctrlAddEventHandler ["draw",{ hintSilent str _this}];$/Code$ + $Code$if ( side _obj == sideLogic ) then { + hint "It's a logic!"; + };$/Code$ undefined / undefined - (October 30, 2013) - As of Arma 3 v1.05.111658 ctrlAddEventHandler and displayAddEventHandler support script Code in addition to String [1] - Number + Side + - ctrlAngle + setCaptive - Gets rotation info of an ST_PICTURE control. + Mark a unit as captive. If unit is a vehicle, commander is marked. A captive is neutral to everyone (belong to civilian side ), and will not trigger "detected by" conditions for its original side. + Using a number (instead of a boolean) for the status has no further effect on the engine's behavior, but can be used by captiveNum to keep track of the captivity status at a finer resolution (e.g. handcuffed, grouped, etc.). The numbered status syntax was introduced in Arma 2. - https://community.bistudio.com/wiki/ctrlAngle + https://community.bistudio.com/wiki/setCaptive - ctrlAngle Control + Object setCaptive Boolean + + Object setCaptive Number - ctrlAngle control + unitName setCaptive status + + unitName setCaptive status - $Code$ctrlAngle _control;$/Code$ + $Code$_soldier1 setCaptive true ;$/Code$ + + $Code$_soldier1 setCaptive 1;$/Code$ - undefined / undefined + local / global + (August 4, 2006) + This function does not remove unit's weapons. + If you make a unit captive, that unit will still fire on the enemy, but the enemy will not fire back. + + (January 1, 2011) + If you change a unit from captive to no longer captive (for example, to "reveal" an undercover unit), enemy units that already have prior knowledge of the unit as a captive will only partially engage, making it very easy for the undercover unit. This seems to be a bug. + However other enemy unit the unit later encounters will engage freely with full force. + + (November 19, 2017) + Talkingtoaj note doesn't apply to Arma 3 anymore (earlier than 1.76) + A captive unit will immediately be shot (after a normal "human" reaction time from the AI) - Array + Nothing - Nothing + - ctrlAutoScrollDelay + camSetFovRange - Returns number of seconds auto-scroll will wait before scroll and/or rewind. -2 if scrollbar not present. - Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. + Set the zoom level ( F ield O f V iew) start and end values for automatical zooming. + The default zoom level is 0.7 where 0 is the nearest and 1 is the most far zoom value. + This command is non-functional ! - https://community.bistudio.com/wiki/ctrlAutoScrollDelay + https://community.bistudio.com/wiki/camSetFovRange - ctrlAutoScrollDelay Control + Object camSetFovRange Array - ctrlAutoScrollDelay control + camera camSetFovRange fovRange - $Code$_ctrlDelay = ctrlAutoScrollDelay _ctrlGroup;$/Code$ + $Code$_cam camSetFovRange [0.1, 0.7];$/Code$ - undefined / undefined + local / local - Number + Nothing + - ctrlAutoScrollRewind + forEachMemberAgent - Returns true if auto-scroll should move back to start after it reaches the end. - Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. + Executes the given command recursively for each agent that is a member of the given team. For just teams use forEachMemberTeam. For both teams and agents use forEachMember. - https://community.bistudio.com/wiki/ctrlAutoScrollRewind + https://community.bistudio.com/wiki/forEachMemberAgent - ctrlAutoScrollRewind Control + Code forEachMemberAgent Team_Member - ctrlAutoScrollRewind control + command forEachMemberAgent team - $Code$_ctrlRewind = ctrlAutoScrollRewind _ctrlGroup;$/Code$ - + undefined / undefined - Boolean + Nothing + - ctrlAutoScrollSpeed + isLaserOn - Returns number of seconds to auto-scroll one line. -1 if auto-scroll is disabled. -2 if scrollbar not present. - Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. + Returns true if the vehicle has its laser turned on. Not to be confused with isIRLaserOn which is for units - https://community.bistudio.com/wiki/ctrlAutoScrollSpeed + https://community.bistudio.com/wiki/isLaserOn - ctrlAutoScrollSpeed Control + isLaserOn Object - ctrlAutoScrollSpeed control + isLaserOn vehicle - $Code$_ctrlSpeed = ctrlAutoScrollSpeed _ctrlGroup;$/Code$ - + - undefined / undefined + local / global - Number + Boolean + - ctrlChecked + set3DENLayer - Returns the current state of given checkbox in checkboxes control (CT_CHECKBOXES, type = 7; ). Since Arma 3 v1.71.141591 it is possible to query multiple checkboxes by providing checkbox index. For more information see DialogControls-CheckBoxes. - Note: The "onCheckBoxesSelChanged" control EH returns the control, index of changed checkbox and its current checked state. The checked state however is not a Boolean but Number 0 or 1. To convert ctrlChecked command output into number as well, use parseNumber command. + Set layer for Eden Entity. - https://community.bistudio.com/wiki/ctrlChecked + https://community.bistudio.com/wiki/set3DENLayer - ctrlChecked Control - - Control ctrlChecked Number + EdenEntity set3DENLayer Number - ctrlChecked control - - control ctrlChecked index + entity set3DENLayer layerID - $Code$ctrlChecked _control;$/Code$ - - $Code$_control ctrlChecked 3;$/Code$ + $Code$_myLayer = -1 add3DENLayer "CTRG"; + player set3DENLayer _myLayer;$/Code$ undefined / undefined @@ -13606,38 +14404,36 @@ - Boolean - Boolean + Boolean + - ctrlClassName + getMissionConfigValue - Returns the class name of a Control as it is defined in config. If you need config class of a game created Display, it is stored on display itself: - $Code$_className = findDisplay 12 getVariable ["BIS_fnc_initDisplay_configClass", ""]; // "RscDiary"$/Code$ + Returns value of the given scenario attribute from the 1st tier. Since only config properties have values, the attribute should be config property. If it is not found or config class is given, the return is nil. If the attribute defined in multiple places, the command checks them in the following order: + External Description.ext file + Eden Editor scenario attribute + So if attribute exists in both places, attribute from description.ext is used. Previously, scenario attributes were extracted from Description.ext using missionConfigFile. That still works, but it ignores attributes set directly in the editor and it should not be used anymore. - https://community.bistudio.com/wiki/ctrlClassName + https://community.bistudio.com/wiki/getMissionConfigValue - ctrlClassName Control + getMissionConfigValue String + + getMissionConfigValue Array - ctrlClassName control + getMissionConfigValue attribute + + getMissionConfigValue [attribute, defaultValue] - $Code$// List class names of all controls present on display 46: - _ctrls = ""; - for "_i" from -1 to 10000 do { - with uiNamespace do { - _ctrl = findDisplay 46 displayCtrl _i; - if (! isNull _ctrl) then { - _ctrls = _ctrls + format ["IDC: %1, Class Name: %2\n", _i, ctrlClassName _ctrl]; - }; - }; - }; - hint _ctrls;$/Code$ + $Code$_respawnDelay = getMissionConfigValue ["respawnDelay",0] + // Returns respawn delay value. Replaces the previous approach which would scan only the external Description.ext file, but ignore the value set in the Eden Editor:_respawnDelay = getNumber ( missionConfigFile "respawnDelay"); // Old approach$/Code$ undefined / undefined @@ -13645,332 +14441,314 @@ - String + Number/String/Array - Number/String/Array + - ctrlCommitted + simulationEnabled - Check if the control animation is finished. + Check if the entity has enabled simulation. - https://community.bistudio.com/wiki/ctrlCommitted + https://community.bistudio.com/wiki/simulationEnabled - ctrlCommitted Control + simulationEnabled Object - ctrlCommitted controlName + simulationEnabled entity - $Code$_done = ctrlCommitted _control$/Code$ - + undefined / undefined - Boolean + Boolean + - ctrlCommit + vectorDiff - Commit control animation. + Subtracts one 3D vector from another. (vector1 - vector2) - https://community.bistudio.com/wiki/ctrlCommit + https://community.bistudio.com/wiki/vectorDiff - Control ctrlCommit Number + Array vectorDiff Array - controlName ctrlCommit time + vector1 vectorDiff vector2 - $Code$_control ctrlCommit 2$/Code$ + $Code$hint str ( velocity car vectorDiff velocity bike);$/Code$ undefined / undefined - (April 11, 2015) - Use this command if you want to for example change the position or size of a control. + (28 Jun, 2014) + (ArmA3 1.22)Algorithm: + $Code$ + Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; + Result = [x1 – x2,y1 – y2,z1 – z2;] + $/Code$ + It is recommended to use vectorDiff instead of BIS_fnc_vectorDiff. - Nothing + Array + - ctrlCreate + evalObjectArgument - Creates new control in given display. Some of the common controls that can be used with this command: - RscText - simple text box - RscTextMulti - simple multiline text box - RscPicture - simple picture box - RscPictureKeepAspect - picture box that doesn't stretch picture - RscEdit - input box - RscEditMulti - multiline input box - RscTree - tree view control - RscTreeSearch - searchable tree view control (see Example 4) - RscVideo - picture control with autostart for video texture (see BIS_fnc_playVideo ) - RscVideoKeepAspect - picture control for video to keep original video aspect ratio - NOTE : Since Arma 3 v1.69.141213 ctrlCreate will also search for control class in mission config, if search in the main config failed. This means one can now define classes in mission config and use them with ctrlCreate + Return argument in mission editor of a given object. + i + Some Old Editor Command - https://community.bistudio.com/wiki/ctrlCreate + https://community.bistudio.com/wiki/evalObjectArgument - Display ctrlCreate Array + Control evalObjectArgument Array - display ctrlCreate [class, idc, controlsGroup] + map evalObjectArgument [object, argument] - $Code$_display ctrlCreate ["RscText", 1234];$/Code$ - - $Code$_map = findDisplay 46 ctrlCreate ["RscMapControl", -1]; - _multiLineText = findDisplay 46 ctrlCreate ["RscTextMulti", -1]; - _multiLineEdit = findDisplay 46 ctrlCreate ["RscEditMulti", -1];$/Code$ - - $Code$myControl = findDisplay 0 ctrlCreate ["RscText", 1234, findDisplay 0 displayCtrl 2300];$/Code$ - - $Code$// Create Tree View control with search. Available RscTreeSearch class is hardcoded to be used with RscEdit with idc 645. Example below demonstrates how to. After tree is generated, try typing something in the top box. - [] spawn - { - disableSerialization ; - _display = findDisplay 46 createDisplay "RscDisplayEmpty"; - _edit = _display ctrlCreate ["RscEdit", 645]; - _edit ctrlSetPosition [0,0,1,0.04]; - _edit ctrlSetBackgroundColor [0,0,0,1]; - _edit ctrlCommit 0; - _tv = _display ctrlCreate ["RscTreeSearch", -1]; - _tv ctrlSetFont "EtelkaMonospacePro"; - _tv ctrlSetFontHeight 0.03; - _tv ctrlSetPosition [0,0.06,1,0.94]; - _tv ctrlSetBackgroundColor [0,0,0,1]; - _tv ctrlCommit 0; - _classes = "true" configClasses ( configFile "CfgVehicles"); - for "_i" from 0 to 5 do - { - _tv tvAdd [[], configName selectRandom _classes]; - for "_j" from 0 to 5 do - { - _tv tvAdd [[_i], configName selectRandom _classes]; - for "_k" from 0 to 5 do - { - _tv tvAdd [[_i, _j], configName selectRandom _classes]; - for "_n" from 0 to 5 do - { - _tv tvAdd [[_i, _j, _k], configName selectRandom _classes]; - }; - }; - }; - }; - };$/Code$ + $Code$// returns string "[1009.0351, 1319.4928]" + ( findDisplay 128 displayCtrl 51) getObjectArgument ["_unit_1", "POSITION"] + // returns array [1009.0351, 1319.4928] + ( findDisplay 128 displayCtrl 51) evalObjectArgument ["_unit_1", "POSITION"]$/Code$ undefined / undefined - (February 6, 2016) - Although you can only dynamically create controls using BIS's configs, there are many commands to change certain aspects of each created control. See GUI Control - - (May 29, 2017) - Since Arma 3 1.70 ListBoxes created thru ctrlCreate are no more encountering problems with max of 7 selections without scrolling the control. - Control + Any_Value + - ctrlDelete + clearBackpackCargoGlobal - Deletes given control. - Returns whether the deletion was successful. + Removes all backpacks from the vehicle cargo space. MP synchronized. - https://community.bistudio.com/wiki/ctrlDelete + https://community.bistudio.com/wiki/clearBackpackCargoGlobal - ctrlDelete Control + clearBackpackCargoGlobal Object - ctrlDelete control + clearBackpackCargoGlobal unit - $Code$ctrlDelete (( findDisplay 20000) displayCtrl 20001);$/Code$ + $Code$clearBackpackCargoGlobal jeepOne;$/Code$ - undefined / undefined + global / global - (April 18, 2015) - ctrlDelete can only delete controls created with ctrlCreate. Use ctrlShow false and ctrlEnable false to disable existing controls. + (July 6, 2017) + This will remove not only backpacks, but vests and uniforms as well. - Boolean + Nothing + - ctrlEnabled + pushBackUnique - Returns if a control on the currently active user dialog is enabled. Disabled controls cannot be focused. - Read Dialog Control for more information about user dialogs and controls. + Adds element to the back of the given array but only if it is unique to the array. The index of the added element is returned upon success, otherwise -1. This command modifies the original array. - https://community.bistudio.com/wiki/ctrlEnabled + https://community.bistudio.com/wiki/pushBackUnique - ctrlEnabled Number - - ctrlEnabled Control + Array pushBackUnique Anything - ctrlEnabled idc - - ctrlEnabled controlName + array pushBackUnique element - $Code$if (!(ctrlEnabled 100)) then - { - ctrlEnable [100, true] - };$/Code$ + $Code$_arr = [1,2,3]; + _index = _arr pushBackUnique 3; + hint str [_index, _arr]; //[-1,[1,2,3]]$/Code$ - $Code$_enabled = ctrlEnabled _control$/Code$ + $Code$_arr = [1,2,3]; + _index = _arr pushBackUnique 4; + hint str [_index, _arr]; //[3,[1,2,3,4]]$/Code$ - local / undefined + undefined / undefined - Boolean - Boolean + Number + - ctrlEnable + isCollisionLightOn - Enable or disable a control of the currently active user dialog. Disabled controls cannot be clicked onto. - Read Dialog Control for more information about user dialogs and controls. + Returns true if vehicle collision lights are on otherwise false. - https://community.bistudio.com/wiki/ctrlEnable + https://community.bistudio.com/wiki/isCollisionLightOn - ctrlEnable Array - - Control ctrlEnable Boolean + isCollisionLightOn Object - ctrlEnable [idc, enable] - - controlName ctrlEnable enable + isCollisionLightOn vehicle - $Code$ctrlEnable [100, false]$/Code$ - - $Code$_ctrl ctrlEnable false$/Code$ + $Code$_collisionLightOn = isCollisionLightOn heli;$/Code$ - local / local + global / undefined - (July 20, 2017) - Please do note that enabled controls can gain focus upon click. Therefore do not enable background controls or else they will cover any controls on top of them. - As a general rule of thumb, enabled controls should only be already on the top of the GUI. + (April 6, 2015) + Bind Collision light action to UserAction 2 + $Code$this addAction ["", { + _this select 1 action [ + ["CollisionLightOn", "CollisionLightOff"] select isCollisionLightOn (_this select 0), + _this select 0 + ]; + }, "", -10, false, true, "User2", "_this == driver _target"];$/Code$ - Nothing - Nothing + Boolean + - ctrlFade + time - Returns the current fade factor of control. + Returns time elapsed since mission started (in seconds). The value is different on each client. If you need unified time, use serverTime. - https://community.bistudio.com/wiki/ctrlFade + https://community.bistudio.com/wiki/time - ctrlFade Control + time - ctrlFade controlName + time - $Code$_scale = ctrlFade _control$/Code$ + $Code$_future = time + 30; + waitUntil { time = _future}; /* continue after 30 seconds... */$/Code$ + + $Code$// Wait until mission fully started: + waitUntil { time 0};$/Code$ undefined / undefined + (August 4, 2006) + Notes from before the conversion: + Not to be confused with _time. Within a script, the reserved local variable _time returns the time elapsed since the script started running. Note that the value of time is not saved when the mission is saved and so will be reset to zero when a mission is restarted from a saved position. The value of _time is saved correctly and will resume from where it was. + _time has only special meaning in SQS scripts, in SQF script it is just another variable. -- Killzone_Kid + + (January 5, 2007) + Notes from before the conversion: + time works properly in sqf called with execVM command. In an other hand, _time does not works in sqf called with execVM command.(Arma v1.02.5103GER) + + (October 02, 2010) + On overloaded servers (below ~10 server FPS), time readings are unreliable. Seconds actually take longer. While the clients keep a steady tempo, server time lags behind, resulting in considerable offset between client and server time (easily 30 minutes for a 2 hour game). Client time is synchronised to server time during JIP, but other than that it runs independently. + + (30 Oct 2013) + Arma 3 JIP bug: + As of Arma 3 v1.02, for JIP clients 'time' value will start off counting from 0, not the real 'time' value. After about 2.5sec (on average), it will then jump to a high value and synchronise with the real 'time' value, which could be 900, for example. + Therefore, do not use 'time' for any start of mission init timeouts; it's unreliable. (It's odd that it doesn't synchronise at the same time as public variables.) + + (September 1, 2016) + In MP : Since per-client time and server time is unconsistant I strongly recommend execution of time-critical tasks from server-side scripts and with remoteExec or remoteExecCall ( Since only A3 1.50 alternative may be publicVariableClient with pre-defined handler) as this will eliminate any time calculation lags and make it reliable. - Number + Number + - ctrlHTMLLoaded + ctrlShow - Returns true when HTML content was successfully loaded. + Set if a control of the currently active user dialog is shown or not. + Read Dialog Control for more information about user dialogs and controls. - https://community.bistudio.com/wiki/ctrlHTMLLoaded + https://community.bistudio.com/wiki/ctrlShow - ctrlHTMLLoaded Control + ctrlShow Array + + Control ctrlShow Boolean - ctrlHTMLLoaded control + ctrlShow [idc, show] + + controlName ctrlShow show - $Code$_control htmlLoad "test.html"; - if (! ctrlHTMLLoaded _control) then { - hint "Loading test.html failed!"; - };$/Code$ + $Code$ctrlShow [100, false ];$/Code$ + + $Code$_control ctrlShow false ;$/Code$ - undefined / undefined + local / local - Boolean + Nothing - Nothing + - ctrlIDC + synchronizedTriggers - Returns control IDC. + Returns the list of triggers synchronized with a given waypoint. - https://community.bistudio.com/wiki/ctrlIDC + https://community.bistudio.com/wiki/synchronizedTriggers - ctrlIDC Control + synchronizedTriggers Waypoint - ctrlIDC control + synchronizedTriggers waypoint @@ -13980,309 +14758,280 @@ - Number + Array + - ctrlIDD + lockDriver - Returns display IDD. + Lock the driver position of the vehicle. This command must be executed where vehicle is local. - https://community.bistudio.com/wiki/ctrlIDD + https://community.bistudio.com/wiki/lockDriver - ctrlIDD Display + Object lockDriver Boolean - ctrlIDD display + vehicle lockDriver lock - $Code$ctrlIDD findDisplay 46; //46$/Code$ + $Code$vehicleName lockDriver true ;$/Code$ - undefined / undefined + local / global - Number + Nothing + - ctrlMapAnimAdd + nearestLocation - Adds the next frame to the map animation. + Return the closest location of specified class to a given position. Checked range is unlimited (i.e. covers the whole map). - https://community.bistudio.com/wiki/ctrlMapAnimAdd + https://community.bistudio.com/wiki/nearestLocation - Control ctrlMapAnimAdd Array + nearestLocation Array - map ctrlMapAnimAdd [time, zoom, position] + nearestLocation [position, locationClass] - $Code$_map ctrlMapAnimAdd [1, 0.1, getMarkerPos "anim1"]; - ctrlMapAnimCommit _map;$/Code$ + $Code$_nearestCity = nearestLocation [ getPos player, "nameCity"];$/Code$ - $Code$// Center map on player: - _ctrl ctrlMapAnimAdd [0, 0.05, player ]; - ctrlMapAnimCommit _ctrl;$/Code$ + $Code$_anyNearestLocation = nearestLocation [ player, ""];$/Code$ - local / local + undefined / undefined - (17:11, 9 March 2010) - Besides Position2D, both Objects and Position3D work. - Nothing + Location + - ctrlMapAnimClear + briefingName - Clears the map animation. + Returns the name of the current briefing/scenario name. - https://community.bistudio.com/wiki/ctrlMapAnimClear + https://community.bistudio.com/wiki/briefingName - ctrlMapAnimClear Control + briefingName - ctrlMapAnimClear controlName + briefingName - + $Code$_name = briefingName ;$/Code$ + - local / local + undefined / undefined - Nothing + String + - ctrlMapAnimCommit + setLeader - Plays the map animation. + Set the leader of given team. Effect is local, unless both leader unit and team are local to PC on which command is executed, then effect is global. - https://community.bistudio.com/wiki/ctrlMapAnimCommit + https://community.bistudio.com/wiki/setLeader - ctrlMapAnimCommit Control + Team_Member setLeader Team_Member - ctrlMapAnimCommit controlName + team setLeader leader - $Code$// Center map on player: - _ctrl ctrlMapAnimAdd [0, 0.05, player ]; - ctrlMapAnimCommit _ctrl;$/Code$ - + local / local - Nothing + Nothing + - ctrlMapAnimDone + isKeyActive - Checks whether the map animation has finished. + Checks whether the given key is active in the current user profile. + See keys, keysLimit and doneKeys in the description.ext file of the missions. - https://community.bistudio.com/wiki/ctrlMapAnimDone + https://community.bistudio.com/wiki/isKeyActive - ctrlMapAnimDone Control + isKeyActive String - ctrlMapAnimDone controlName + isKeyActive keyName - + $Code$_ok = isKeyActive "Mission04Key"$/Code$ + - local / local + undefined / undefined - Boolean + Boolean + - ctrlMapCursor + tvCollapse - Changes the default cursor that appears when interacting with a map control to a custom one. Use an empty string to restore the default cursor. If the specified cursor does not exist, the default is used and no error is produced. ( NOT in case of ArmA 3. Using an empty string will result in an error: "No entry 'bin\config.bin/CfgWrapperUI/Cursors.' ). The cursor is the name of a config entry from CfgWrapperUI / Cursors. This command has the following specifics: - When used on Main Map ( findDisplay 12 displayCtrl 51) it is possible to override multiple default cursors. For example, while leaving default "Arrow" intact, it is possible to just override "Scroll" with lets say "Wait" (Example 3) - When used on a custom map, for example user made Mini Map, there is only one single cursor "" for everything, therefore only this cursor can be overridden (see Example 4 on how to override it) - Some possible class names (for the whole list see ctrlMapCursor/cursors ): - Arrow - Track - Move - Scroll - Rotate - Track3D - Move3D - Rotate3D - Raise3D - Wait - HC_move - HC_overFriendly - HC_overEnemy - HC_overMission - HC_unsel - NOTE1 : Cursor names are case sensitive. + Collapses tree item pointed to by the path. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/ctrlMapCursor + https://community.bistudio.com/wiki/tvCollapse - Control ctrlMapCursor Array + tvCollapse Array + + Control tvCollapse Array - control ctrlMapCursor [defaultCursor, newCursor] + tvCollapse [idc, path] + + control tvCollapse path - $Code$_map ctrlMapCursor ["Track", "Arrow"];$/Code$ - - $Code$uiNamespace setVariable ["_map", findDisplay 12 displayCtrl 51]; - ( uiNamespace getVariable "_map") ctrlMapCursor ["Track","HC_overFriendly"];$/Code$ - - $Code$findDisplay 12 displayCtrl 51 ctrlMapCursor ["Scroll", "Wait"];$/Code$ + $Code$tvCollapse [101, [0]];$/Code$ - $Code$// Cycle through all available cursors over custom map: - 0 = [] spawn - { - disableSerialization ; - _map = findDisplay 46 createDisplay "RscCredits" ctrlCreate ["RscMapControl", -1]; - _map ctrlSetPosition [0,0,1,1]; - _map ctrlCommit 0; - { - _map ctrlMapCursor ["", configName _x]; // -- the actual usage - hint format ["Current cursor: %1", configName _x]; - sleep 1; - } - forEach ("true" configClasses ( configFile "CfgWrapperUI" "Cursors")); - };$/Code$ + $Code$_ctrl tvCollapse [0];$/Code$ - undefined / undefined + local / local - (February 8, 2016) - When using this command, the cursor will change for the whole display, resulting in visual glitches. Adding the onMouseMoving event handler can help solve this problem: + (Sep 11 2014) + (A3 1.28)tv command family overview $Code$ - _control ctrlAddEventHandler ["MouseMoving",{ - _this params [ - ["_mapCtrl", controlNull,[[[controlNull]]]], - ["_xPos",-1,[0]], - ["_yPos",-1,[0]], - ["_mouseIn", false,[[[true]]]] - ]; - if (_mouseIn) then { - // Mouse is in control area - _mapCtrl ctrlMapCursor ["","Track"]; - } else { - // Mouse is out of control area, goes back to arrow - _mapCtrl ctrlMapCursor ["","Arrow"]; - }; - }]; + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; $/Code$ - Nothing + Nothing - Nothing + - ctrlMapMouseOver + setMarkerBrush - Returns description of map sign mouse cursor is over. Works with in-game map as well as 2D editor map in edit mode. + Selects the fill texture for the marker ("RECTANGLE" or "ELLIPSE"). Brush is the name of the subclass in CfgMarkerBrushes. + brush can be: + "Solid" + "SolidFull" (A3 only) + "Horizontal" + "Vertical" + "Grid" + "FDiagonal" + "BDiagonal" + "DiagGrid" + "Cross" + "Border" + "SolidBorder" - https://community.bistudio.com/wiki/ctrlMapMouseOver + https://community.bistudio.com/wiki/setMarkerBrush - ctrlMapMouseOver Control + String setMarkerBrush String - ctrlMapMouseOver control + markerName setMarkerBrush brush - $Code$( uiNamespace getVariable "_map") ctrlMapCursor ["Track","HC_overFriendly"]; - _mouseover = if ( count ( ctrlMapMouseOver (uiNamespace getVariable "_map")) 0) then - { - ctrlMapMouseOver ( uiNamespace getVariable "_map") - } - else - { - [""] - }; - if (_mouseover select 0 == "task" && str (_logic getVariable "onTaskAssigned") != str {}) then - { - //--- Task - ( uiNamespace getVariable "_map") ctrlMapCursor ["Track","HC_overMission"]; - } - else - { - //--- Waypoint - ( uiNamespace getVariable "_map") ctrlMapCursor ["Track","HC_move"]; - };$/Code$ - - $Code$onEachFrame { hintSilent str ctrlMapMouseOver ( findDisplay 12 displayCtrl 51)};$/Code$ + $Code$"Marker1" setMarkerBrush "DIAGGRID";$/Code$ - undefined / undefined + undefined / global - Array + Nothing + - ctrlMapScale + AGLToASL - Returns the current scale of given map control. + Converts position from PositionAGL to PositionASL - https://community.bistudio.com/wiki/ctrlMapScale + https://community.bistudio.com/wiki/AGLToASL - ctrlMapScale Control + AGLToASL PositionAGL - ctrlMapScale ctrl + AGLToASL posAGL - $Code$_control = ( findDisplay 12) displayCtrl 51; //Arma 3 - _scale = ctrlMapScale _control; //returns number from 1 to 0.001$/Code$ + $Code$_playerPosASL = AGLToASL ( player modelToWorld [0,0,0]);$/Code$ + + $Code$_camPosASL = AGLToASL positionCameraToWorld [0,0,0];$/Code$ undefined / undefined @@ -14290,432 +15039,482 @@ - Number + PositionASL + - ctrlMapScreenToWorld + triggerActivated - Convert screen coordinates in map to world coordinates. + Returns true if the trigger has been activated. + Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. - https://community.bistudio.com/wiki/ctrlMapScreenToWorld + https://community.bistudio.com/wiki/triggerActivated - Control ctrlMapScreenToWorld Array + triggerActivated Object - map ctrlMapScreenToWorld [x, y] + triggerActivated trigger - $Code$_WorldCoord = _Control ctrlMapScreenToWorld _ScreenCoord$/Code$ - - $Code$_WorldCoord = _Control ctrlMapScreenToWorld [_x,_y]$/Code$ + $Code$if ( triggerActivated trg1) then { + // Code + };$/Code$ - undefined / undefined + global / local - (April 6, 2007) - Notes: - You can get the screen coordinates by the UI Event Handlers onMouseButtonDown, onMouseButtonUp, onMouseButtonClick, onMouseButtonDblClick. - The return Array is in 2-D, you can use it with all set-position commands. - _x = returnArray select 0; - _y = returnArray select 1; - - (December 2, 2009) - Notes: - In VBS2 1.23 this command does not seem to work properly. Therefore when defining UI Event Handlers onMouseButtonClick and onMouseButtonDblClick the functions onMapSingleClick and onDoubleClick (VBS2) can be used instead, these already provide access to the world coordinates of the click event. - - The command parameters are screen position coordinates, which may not equate to to the map control's coordinates. A map control's screen coordinates and size can be found use the ctrlPosition command. This is an issue when using the Arma 3 in-game map, which is not fullscreen (all previous titles used full screen map controls, so map control coords did equate to screen coords). + If trigger already activated at least once, triggerActivated will only return false if trigger is set to activate Repeatedly. + In other words, a trigger set to activate Once will always return true once activated at least once (even if trigger is no longer activated). - Array + Boolean + - ctrlMapWorldToScreen + getHideFrom - Transfers a map control world position to screen coordinates. + Returns the Position where object believes the enemy to be. If there is no direct line of sight between the object and the enemy, this position is extrapolated based on the last known position and speed of the enemy. A returned position of [0,0,0] implies that object does not knowAbout enemy. If enemy is null it is some position in front of the object or enemy position. - https://community.bistudio.com/wiki/ctrlMapWorldToScreen + https://community.bistudio.com/wiki/getHideFrom - Control ctrlMapWorldToScreen Position + Object getHideFrom Object - control ctrlMapWorldToScreen position + object getHideFrom enemy - $Code$_screenCoord = _control ctrlMapWorldToScreen _worldCoord;$/Code$ - - $Code$_screenCoord = _control ctrlMapWorldToScreen position player ;$/Code$ - + undefined / undefined - (June 16, 2010) - Notes: - It returns a 2d array with the position on the active map display. Say the return [0.5.0.5] would mean that your input 3d world position, like [500,1000], is currently at the center of the active map display. - In other words you can make the actual world position (of an object for example), relative to your active map display. + (April 25, 2015) + This command is definatlely not broken, at least not in A3 1.42. It functions exactly as the description says it does. The reason why the Z value is elevated is because it represents the units torso. When the unit is prone and spotted, the Z value is much less. Here you can see a perfectly working example of this command Talk:getHideFrom#Operation Script Sample - Array + Array + - ctrlModelDirAndUp + setParticleClass - Returns vectorDir and vectorUp of the model used in 3D Dialog Control. + Set parameters from existing config class. ClassName is name of the class from CfgCloudlets. + Since version 1.11.114706 you can use setParticleParams to overwrite many values set by config class, particularity those defined in ParticleArray. - https://community.bistudio.com/wiki/ctrlModelDirAndUp + https://community.bistudio.com/wiki/setParticleClass - ctrlModelDirAndUp Control + Object setParticleClass String - ctrlModelDirAndUp control + source setParticleClass className - $Code$_vectorDirAndUp = ctrlModelDirAndUp _control3D;$/Code$ + $Code$_source01 = "#particlesource" createVehicleLocal _pos01; + _source01 setParticleClass "ObjectDestructionFire1Smallx"; + _source01 attachTo [_object,[0,0,0]];$/Code$ undefined / undefined + (June 28, 2015) + This can be very useful for getting features that can't normally be added with commands, such as AI view blocking and particles that can only be above/underwater. - Array + Nothing + - ctrlModelScale + waypointAttachVehicle - Returns 3D control model scale + Attaches a Unit to the given Waypoint. - https://community.bistudio.com/wiki/ctrlModelScale + https://community.bistudio.com/wiki/waypointAttachVehicle - ctrlModelScale Control + Array waypointAttachVehicle Object - ctrlModelScale control + waypoint waypointAttachVehicle vehicleName - $Code$_currentScale = ctrlModelScale _ctrl3D;$/Code$ + $Code$[_grp, 2] waypointAttachVehicle vehicle player$/Code$ + + $Code$[_grp, 2] waypointAttachVehicle _soldier1$/Code$ undefined / undefined + (June 19, 2010) + You can attach waypoint only to vehicle inserted from classic editor. Trying to attach it to dynamically spawned ( createUnit, createVehicle ) won't work. Engine will then try to find suitable target by itself, affecting game performance. - Number + Nothing + - ctrlModel + synchronizedWaypoints - Returns model used in 3D Dialog Control. + Returns the list of waypoints synchronized with a given trigger or waypoint. - https://community.bistudio.com/wiki/ctrlModel + https://community.bistudio.com/wiki/synchronizedWaypoints - ctrlModel Control + synchronizedWaypoints Object/Waypoint - ctrlModel control + synchronizedWaypoints obj - $Code$_model = ctrlModel _control3D;$/Code$ - + undefined / undefined - String + Array + - ctrlParentControlsGroup + curatorCamera - Returns the parent control of a given child control + Returns curator camera object. - https://community.bistudio.com/wiki/ctrlParentControlsGroup + https://community.bistudio.com/wiki/curatorCamera - ctrlParentControlsGroup Control + curatorCamera - ctrlParentControlsGroup ctrl + curatorCamera - $Code$_ctrlCombo = _ctrl controlsGroupCtrl 100;//Control - ctrlParentControlsGroup _ctrlCombo;//Parent control group (_ctrl)$/Code$ - + undefined / undefined - Control + Object + - ctrlParent + setRainbow - Returns container of the given control. + Changes the rainbow value smoothly during the given time (in seconds). A time of zero means there will be an immediate change. - https://community.bistudio.com/wiki/ctrlParent + https://community.bistudio.com/wiki/setRainbow - ctrlParent Control + Number setRainbow Number - ctrlParent controlName + time setRainbow value - $Code$_display = ctrlParent _control$/Code$ - + undefined / undefined + (April 24, 2015) + It should be known that this command does not create a rainbow in all conditions. As in real life, the rainbow can only appear after rainfall and opposite of the sun when it is low on the horizon. - Display + Nothing + - ctrlPosition + squadParams - Returns the current position of 2D control as [x, y, w, h] array. For 3D control it returns relative [x,y,z]. + Returns data about squad of given unit loaded from squad.xml. + All items in returned array are String. - https://community.bistudio.com/wiki/ctrlPosition + https://community.bistudio.com/wiki/squadParams - ctrlPosition Control + squadParams Object - ctrlPosition controlName + squadParams unit - $Code$_pos = ctrlPosition _control;$/Code$ + $Code$_info = squadParams player ;$/Code$ - undefined / undefined + global / undefined - (May 22, 2017) - If the ctrl is part of a CtrlGroup the returned position is relative to the ctrlGroups position. + (July 19, 2015) + Returns an empty array in singleplayer. - Array + Array + - ctrlRemoveAllEventHandlers + engineOn - Remove all event handlers from the given control. + Activates and deactivates the engine of a vehicle. This command has to be executed where vehicle is local. + NOTE: Executed on a remote vehicle this command may turn the engine on but then it will get turned off by itself after a short while. - https://community.bistudio.com/wiki/ctrlRemoveAllEventHandlers + https://community.bistudio.com/wiki/engineOn - Control ctrlRemoveAllEventHandlers String + Object engineOn Boolean - control ctrlRemoveAllEventHandlers handlerName + vehicle engineOn state - + $Code$if (! isEngineOn _jeep) then {_jeep engineOn true };$/Code$ + + $Code$if ( local vehicle player ) then { + vehicle player engineOn true ; + } else { + hint "Get in the driver seat, soldier!"; + };$/Code$ + - undefined / undefined + local / global + (August 25, 2014) + To switch engine off can also use setFuel and fuel : + $Code$ private "_gas"; + _gas = fuel heli; + heli setFuel 0; + sleep 0.01; + heli setFuel _gas;$/Code$ + Also sets helicopter fuel back to original quantity. Works on every other vehicle. - Nothing + Nothing + - ctrlRemoveEventHandler + lbSetPictureColorSelected - Remove a given event handler from the given control. + Sets the selected color of item's picture (left) with the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. - https://community.bistudio.com/wiki/ctrlRemoveEventHandler + https://community.bistudio.com/wiki/lbSetPictureColorSelected - Control ctrlRemoveEventHandler Array + lbSetPictureColorSelected Array + + Control lbSetPictureColorSelected Array - control ctrlRemoveEventHandler [handler name,id] + lbSetPictureColorSelected [idc, index, color] + + control lbSetPictureColorSelected [index, color] - $Code$_map ctrlRemoveEventHandler ["Draw", _id];$/Code$ + $Code$lbSetPictureColorSelected [101, 0, [0, 1, 0, 0.5]];$/Code$ + + $Code$_ctrl lbSetPictureColorSelected [0, [1, 1, 1, 1]];$/Code$ undefined / undefined + More information on the LB command family can be found here - Nothing + Nothing - Nothing + - ctrlScale + actionKeysNamesArray - Returns the current scale of the control. + Returns a list of button names assigned to the given user action. You can find the action names in config class ControllerSchemes or user action names. - https://community.bistudio.com/wiki/ctrlScale + https://community.bistudio.com/wiki/actionKeysNamesArray - ctrlScale Control + actionKeysNamesArray String + + actionKeysNamesArray Array - ctrlScale controlName + actionKeysNamesArray userAction + + actionKeysNamesArray [userAction, maxKeys] + + actionKeysNamesArray [userAction, maxKeys, inputDevicePriority] - $Code$_scale = ctrlScale _control$/Code$ + $Code$list = actionKeysNamesArray "ReloadMagazine";$/Code$ + + $Code$list = actionKeysNamesArray ["ReloadMagazine", 1];$/Code$ undefined / undefined + (October 26, 2014) + inputDevicePriority 'Controler' is not a spelling mistake in description. - Number + Array - Array + - ctrlSetActiveColor + allowCrewInImmobile - Sets text color of given control when control is selected. + If true, units can be in a vehicle with broken tracks/wheels. - https://community.bistudio.com/wiki/ctrlSetActiveColor + https://community.bistudio.com/wiki/allowCrewInImmobile - Control ctrlSetActiveColor Array + Object allowCrewInImmobile Boolean - display ctrlSetActiveColor color + vehicle allowCrewInImmobile bool - $Code$_control ctrlSetActiveColor [1, 0, 0, 1]$/Code$ + $Code$_vehicle allowCrewInImmobile true ;$/Code$ undefined / undefined + (April 27, 2015) + This will stop AI disembarking when immobile + $Code$KK_fnc_allowCrewInImmobile = { + _this allowCrewInImmobile true; + { + _x disableAI "FSM"; + _x setBehaviour "CARELESS"; + } forEach crew _this; + }; + //example + car call KK_fnc_allowCrewInImmobile;$/Code$ - Nothing + Nothing + - ctrlSetAngle + fullCrew - Sets the rotation of an ST_PICTURE control. Rotation will be done within the control boundaries, so if the X and Y are given off center, the picture may get clipped by the control boundaries. Doesn't require ctrlCommit. Procedural textures filled controls do not rotate. + Returns array with all crew inside given vehicle. Since Arma 3 v1.55.133810 it is possible to return empty seats as well. + NOTE that with introduction of person turrets, the cargo indexes listed in the return are true for moveInCargo command but incompatible with actions such as "GetInCargo" and "MoveToCargo". To find out seats compatible with cargo action commands, execute command with "cargo" filter: + $Code$ fullCrew [heli, "cargo", true ];$/Code$ + The return array is ordered according to cargo index compatible with action cargo commands, i.e. 1st element has index 0, second - index 1, etc. For example armed WY-55 Hellcat reports: + [[ NULL-object,"cargo",2,[],false],[ NULL-object,"cargo",3,[],false],[ NULL-object,"cargo",4,[],false],[ NULL-object,"cargo",5,[],false]] + for cargo positions. The following commands will put player in the same seat: + $Code$ player moveInCargo [heli, 2]; + player action ["GetInCargo", heli, 0];$/Code$ - https://community.bistudio.com/wiki/ctrlSetAngle + https://community.bistudio.com/wiki/fullCrew - Control ctrlSetAngle Array + fullCrew Object + + fullCrew Array - control ctrlSetAngle [angle, centerX, centerY] + fullCrew vehicle + + fullCrew [vehicle, type, includeEmpty] - $Code$_control ctrlSetAngle [25, 0.5, 0.5];$/Code$ + $Code$_list = fullCrew vehicle player ;$/Code$ - $Code$with uiNamespace do - { - ctrl = findDisplay 46 ctrlCreate ["RscPictureKeepAspect", -1]; - ctrl ctrlSetPosition [0,0,1,1]; - ctrl ctrlSetText "A3\Missions_F_Exp\data\Img\lobby\ui_campaign_lobby_background_tablet_radial_left_ca.paa"; - ctrl ctrlCommit 0; - angle = 0; - onEachFrame - { - with uiNamespace do - { - if (angle 359) then {angle = 0}; - ctrl ctrlSetAngle [angle, 0.5, 0.5]; - angle = angle + 1; - }; - }; - };$/Code$ + $Code$_list = fullCrew [ vehicle player, "turret"];$/Code$ - undefined / undefined + global / undefined + (December 13, 2014) + Be aware that the returned role may or may not be in lowercase. E.g. it's "driver" for the driver, but "Turret" for turret units. + As of Arma 3 version 1.36, the alternative syntax of this command returns all crew members if the filter is anything except "driver", "commander", "gunner", "turret" or "cargo" + The filter is not case sensitive. - Nothing + Array - Array + - ctrlSetAutoScrollDelay + priority - Sets number of second before auto-scroll starts/rewinds. Setter for ctrlAutoScrollDelay. - Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. + Return the priority of the task. - https://community.bistudio.com/wiki/ctrlSetAutoScrollDelay + https://community.bistudio.com/wiki/priority - Control ctrlSetAutoScrollDelay Number + priority Task - control ctrlSetAutoScrollDelay delay + priority task - $Code$_ctrlGroup ctrlSetAutoScrollDelay 5;$/Code$ + $Code$_prioTsk01 = priority task01$/Code$ undefined / undefined @@ -14723,28 +15522,29 @@ - Nothing + Number + - ctrlSetAutoScrollRewind + camPrepareFovRange - Defines if scroll should rewind when auto-scroll reach end. Setter for ctrlAutoScrollRewind. - Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. + Prepares the camera field of view range for auto zooming. + This command is non-functional ! - https://community.bistudio.com/wiki/ctrlSetAutoScrollRewind + https://community.bistudio.com/wiki/camPrepareFovRange - Control ctrlSetAutoScrollRewind Boolean + Object camPrepareFovRange Array - control ctrlSetAutoScrollRewind set + camera camPrepareFovRange fovRange - $Code$_ctrlGroup ctrlSetAutoScrollRewind true ;$/Code$ + $Code$_camera camPrepareFovRange [0.1, 0.5]$/Code$ undefined / undefined @@ -14752,28 +15552,32 @@ - Nothing + Nothing + - ctrlSetAutoScrollSpeed + onCommandModeChanged - Sets number of second required to scroll to next line. If speed 0, auto-scroll is disabled. Setter for ctrlAutoScrollSpeed. - Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. + Defines code performed when hc command mode changes either because of (Left Ctrl + Space) shortcut or hcShowBar scripting command. Groups hc mode must contain at least one group for this command to work (see High Command ). Attached code receives _isHighCommand boolean. + i + Since Arma 3 v1.57 a stackable version of this EH is available: CommandModeChanged - https://community.bistudio.com/wiki/ctrlSetAutoScrollSpeed + https://community.bistudio.com/wiki/onCommandModeChanged - Control ctrlSetAutoScrollSpeed Number + onCommandModeChanged Code/String - control ctrlSetAutoScrollSpeed speed + onCommandModeChanged code - $Code$_ctrlGroup ctrlSetAutoScrollSpeed 0.1;$/Code$ + $Code$//Examples in-use can be found in: + //ca\modules\HC\data\scripts\HC_GUI.sqf + //A3\modules_f\HC\data\scripts\HC_GUI.sqf$/Code$ undefined / undefined @@ -14781,365 +15585,422 @@ - Nothing + Nothing + - ctrlSetBackgroundColor + animateBay - Sets background color of given control. + Force animation of bay to given state, -1 for reset to engine handling, can cause weapon inoperative, because weapon is released when bay state =1. - https://community.bistudio.com/wiki/ctrlSetBackgroundColor + https://community.bistudio.com/wiki/animateBay - Control ctrlSetBackgroundColor Array + Object animateBay Array - control ctrlSetBackgroundColor color + vehicle animateBay [pylon nameindex, anim phase] - $Code$_control ctrlSetBackgroundColor [1, 0, 0, 1]$/Code$ + $Code$( vehicle player ) animateBay ["pylonLeft1", 0.5];$/Code$ undefined / undefined - (May 10, 2017) - According to https://feedback.bistudio.com/T78904 - This definetly doesn't work with RscButton's. \br - According to ( https://resources.bisimulations.com/wiki/ctrlSetBackgroundColor ) this "Only affects Comboboxes, Static Text, Structured Text or Maps. " - Nothing + Nothing + - ctrlSetChecked + flagTexture - Sets checked state of a checkbox in checkboxes control (CT_CHECKBOXES, type = 7; ). Since Arma 3 v1.71.141591 it is possible to check checkbox with given index in multiple checkboxes set-up. For more information see DialogControls-CheckBoxes. + Returns texture of the local instance of the flag. A getter for setFlagTexture. It will not return flag textures applied using forceFlagTexture, use getForcedFlagTexture for that. - https://community.bistudio.com/wiki/ctrlSetChecked + https://community.bistudio.com/wiki/flagTexture - Control ctrlSetChecked Boolean - - Control ctrlSetChecked Array + flagTexture Object - control ctrlSetChecked checked - - control ctrlSetChecked [index, checked] + flagTexture flagCarrier - $Code$_control ctrlSetChecked true ;$/Code$ - - $Code$_control ctrlSetChecked [3, true ];$/Code$ + $Code$_flagTexture = flagTexture _flag1;$/Code$ - undefined / undefined + global / local - Nothing - Nothing + String + - ctrlSetEventHandler + setVehicleAmmo - Sets given event handler of given control. - The provided function should return true/false indicating that the event has handled this event fully or not and whether the engine should execute it's default code or not afterwards. - See User Interface Event Handlers for the full list of handler names. - If applicable, see DIK_KeyCodes for a list of key code constants, which are relevant to key related user interface events like: KeyDown & KeyUp. + Sets how much ammunition (compared to a full state defined by the vehicle type) the vehicle has. Note that the ammo will be added only to local turrets. To check locality of turret use turretLocal. + The value ranges from 0 to 1. - https://community.bistudio.com/wiki/ctrlSetEventHandler + https://community.bistudio.com/wiki/setVehicleAmmo - Control ctrlSetEventHandler Array + Object setVehicleAmmo Number - controlName ctrlSetEventHandler [handlerName, function] + vehicleName setVehicleAmmo value - $Code$_control [[ctrlSetEventHandler]] ["KeyDown", ""]$/Code$ + $Code$player setVehicleAmmo 0;$/Code$ - $Code$(_display displayCtrl 108) [[ctrlSetEventHandler]] ["LBSelChanged","['ListChange',_this] call FireEvents"];$/Code$ + $Code$_vehicle setVehicleAmmo 1;$/Code$ - undefined / undefined + local / global - The article User Interface Event Handlers contains a list of event handler names. - Be aware though, that the preceding "on" in the listed names must be eliminated when used with the ctrlSetEventHandler command. - e.g. instead of $Code$ _control ctrlSetEventHandler [" OnLBSelChanged ", ""]; // WRONG $/Code$ - use - $Code$ _control ctrlSetEventHandler [" LBSelChanged ", ""]; // RIGHT $/Code$ + This command does not add magazines to vehicle weapons that normally start with more than one magazine. It can however, remove these magazines. + + A2:OA v1.59 - Magazines of vehicle turrets are also refilled by this command. + + If you 'unit/vehicle setVehicleAmmo 0;' an unit/vehicle first, you cannot refill it with 'unit/vehicle setVehicleAmmo 1;'. + You need to execute where the unit is local. + You need to execute on the effectiveCommander of a vehicle. + + In ArmA 3, using this command seems correctly rearm the vehicle and its turrets in all situations (tested with beta 0.72). + + In ArmA 3, when using this on a player, this command can only reduce the number of magazine in relation to the current ammo quantity of the unit. For example if player has 8 magazines, player setVehicleAmmo 0.5; will leave unit with 4 mags. Executing player setVehicleAmmo 0.5; again will leave unit with 2 mags. player setVehicleAmmo 0.5; again - 1 mag. player setVehicleAmmo 0; will remove all mags. If player had 10 mags with 30 bullets in each, player setVehicleAmmo 0.01; will leave player with loaded mag with 3 bullets in it (300 x 0.01 = 3) + + (December 20, 2014) + This command does not operate compared to a full state defined by the vehicle type, but rather relative to a vehicle's current magazine loadout. To get the former behaviour use setVehicleAmmoDef, which utilizes the vehicles default magazine loadout (i.e. its CfgVehicles magazines[] values). - Nothing + Nothing + - ctrlSetFade + disableConversation - Sets wanted transparency for control animation. Requires ctrlCommit to commit changes. + Disable the ability to talk to other people. - https://community.bistudio.com/wiki/ctrlSetFade + https://community.bistudio.com/wiki/disableConversation - Control ctrlSetFade Number + Object disableConversation Boolean - controlName ctrlSetFade fade + unitName disableConversation disable - $Code$_control ctrlSetFade 1; - _control ctrlCommit 5;$/Code$ + $Code$player disableConversation true$/Code$ + + $Code$soldier1 disableConversation true$/Code$ undefined / undefined - (March 10, 2015) - This command sets the amount of fade. For example: - $Code$ - _ctrl ctrlSetFade 1; // hides the control - _ctrl ctrlSetFade 0.5; // control is 50% visible - _ctrl ctrlSetFade 0; // control is fully visible - $/Code$ + (July 10, 2009) + Note that this will also prevent you from using group radio. + If you just want player unable to speak to others (or one particular soldier), + use $Code$player setVariable ["BIS_noCoreConversations", true];$/Code$ + or, for the other soldier, + $Code$unitName setVariable ["BIS_noCoreConversations", true];$/Code$ + + (August 18, 2010) + My previous note is incorrect now, you can use disableConversation and still use the group radio, at least in A2:OA ! - Nothing + Nothing + - ctrlSetFocus + enginesTorqueRTD - Set the input focus on given control. + Torque produced by engines in N·m (Newton*meter) - https://community.bistudio.com/wiki/ctrlSetFocus + https://community.bistudio.com/wiki/enginesTorqueRTD - ctrlSetFocus Control + enginesTorqueRTD Object - ctrlSetFocus controlName + enginesTorqueRTD RTD_helicopter - $Code$ctrlSetFocus _control$/Code$ + $Code$_UH80_E1 = ( enginesTorqueRTD _UH80) select 0;//engine 1 Torque + _UH80_E2 = ( enginesTorqueRTD _UH80) select 1;//engine 2 Torque$/Code$ undefined / undefined - (June 30, 2017) - This command seems to only work on controls that accept any input from keyboard or mouse. - Nothing + Array + - ctrlSetFontH1B + clientOwner - Sets H1 bold font of given HTML control. + Returns the client's owner id - https://community.bistudio.com/wiki/ctrlSetFontH1B + https://community.bistudio.com/wiki/clientOwner - Control ctrlSetFontH1B String + clientOwner - controlName ctrlSetFontH1B fontName + clientOwner - $Code$_control ctrlSetFontH1B "TahomaB"$/Code$ + $Code$_id = clientOwner ;$/Code$ undefined / undefined + (February 17, 2016) + On hosted server there could be some inconsistency between clientOwner, owner and object creator id, especially in missions started from save. On the dedicated server this command however works reliably. - Nothing + Number + - ctrlSetFontH1 + setFlagOwner - Sets H1 font of given HTML control. + Sets flag owner. When owner is set to objNull or any object other than a unit of class man or logic, flag is returned to the flagpole. A flag owned by a logic has no visual representation. - https://community.bistudio.com/wiki/ctrlSetFontH1 + https://community.bistudio.com/wiki/setFlagOwner - Control ctrlSetFontH1 String + Object setFlagOwner Object - controlName ctrlSetFontH1 fontName + flag setFlagOwner owner - $Code$_control ctrlSetFontH1 "TahomaB"$/Code$ + $Code$_flag1 setFlagOwner _soldier1;$/Code$ + + $Code$// To return the flag back to the flag pole: + //Method 1: (set owner null) + flag _flagCarrier setFlagOwner objNull ; + //Method 2: (set the flag mast as the owner) + flag _flagCarrier setFlagOwner flag _flagCarrier;$/Code$ - undefined / undefined + global / global + Since flags can not be owned by vehicles, use "flag setFlagOwner driver tank1" or "flag1 setFlagOwner tank1D" to assign the flag to the vehicle's driver. The second method will only work if tank1 is the name of a unit, not a variable refering to it. True for OFP&Arma - Nothing + Nothing + - ctrlSetFontH2B + getGroupIcon - Sets H2 bold font of given HTML control. + Get group icon properties. - https://community.bistudio.com/wiki/ctrlSetFontH2B + https://community.bistudio.com/wiki/getGroupIcon - Control ctrlSetFontH2B String + Group getGroupIcon Number - controlName ctrlSetFontH2B fontName + group getGroupIcon ID - $Code$_control ctrlSetFontH2B "TahomaB"$/Code$ + $Code$_grpIconId = _group getVariable "BIS_MARTA_ICON_TYPE"; + _grpIcon = _group getGroupIcon _grpIconId;$/Code$ - undefined / undefined + global / undefined - Nothing + Array + - ctrlSetFontH2 + playerSide - Sets H2 font of given HTML control + Returns the player's side. This is valid even when the player controlled person is dead (a difference from side player ). - https://community.bistudio.com/wiki/ctrlSetFontH2 + https://community.bistudio.com/wiki/playerSide - Control ctrlSetFontH2 String + playerSide - controlName ctrlSetFontH2 fontName + playerSide - $Code$_control ctrlSetFontH2 "TahomaB"$/Code$ + $Code$if ( side man1 == playerSide ) then { + hint "man1 is on your side!"; + };$/Code$ + + $Code$switch ( playerSide ) do { + case west : { + hint "You are BLUFOR"; + }; + case east : { + hint "You are OPFOR"; + }; + };$/Code$ undefined / undefined + (27 Jan, 2008) + playerSide defaults to west for JIP players early on during initialization regardless of their side. + So if you are a JIP player on another side (like east ), you will need to cater for this for any early initializations. + + (13 Oct, 2008) + playerSide also shows your starting side, even if your side changes to enemy due to a bad rating. In that case, playerSide != side player. - Nothing + Side + - ctrlSetFontH3B + log - Sets H3 bold font of given HTML control. + Base-10 logarithm of x. - https://community.bistudio.com/wiki/ctrlSetFontH3B + https://community.bistudio.com/wiki/log - Control ctrlSetFontH3B String + log Number - controlName ctrlSetFontH3B fontName + log x - $Code$_control ctrlSetFontH3B "TahomaB"$/Code$ + $Code$_log = log 10; // 1$/Code$ undefined / undefined + (23:14, 16 Jun 2014) + (A3 1.20) To clarify: + $Code$y = 10 ^ x // x = log y$/Code$ + People use logarithm at the purpose of simplifying multiplication via exponents plus years before. + $Code$23456*45634 = 1.07039e+009 + log 23456 = 4.37025; log 45634 = 4.65929; ( log 23456) + ( log 45634) = 9.02954 + 10^(( log 23456) + ( log 45634)) = 10 ^ 9.02954 // same as 23456*45634 + $/Code$ + As modern usage, for instance, to evaluate another exponent when multiple is known (Which magnitude is 4 times stronger than 8.3 earthquake?): + $Code$//_Unknown = log x; 8.3 = log y + // x = 10 ^_Unknown; y = 10 ^8.3 + //x/y = (10 ^_Unknown)/(10 ^8.3) = log 4 + // x/y = _Unknown – 8.3 = 0.6 + //_result = 8.9 magnitude + _result = ( log 4) + 8.3 + $/Code$ - Nothing + Number + - ctrlSetFontH3 + isMultiplayerSolo - Sets H3 font of given HTML control. + Returns true when playing a game in solo multiplayer (for example Apex coop campaign PLAY SOLO option). - https://community.bistudio.com/wiki/ctrlSetFontH3 + https://community.bistudio.com/wiki/isMultiplayerSolo - Control ctrlSetFontH3 String + isMultiplayerSolo - controlName ctrlSetFontH3 fontName + isMultiplayerSolo - $Code$_control ctrlSetFontH3 "TahomaB"$/Code$ - + undefined / undefined - Nothing + Boolean + - ctrlSetFontH4B + set3DENMissionAttribute - Sets H4 bold font of given HTML control. + Set scenario attribute. + An attribute is identified by its property ( data when it's engine-drive attribute) value in config. For the list of all attributes with their properties, see Setting Attributes. + ! + Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! - https://community.bistudio.com/wiki/ctrlSetFontH4B + https://community.bistudio.com/wiki/set3DENMissionAttribute - Control ctrlSetFontH4B String + String set3DENMissionAttribute Array - controlName ctrlSetFontH4B fontName + section set3DENMissionAttribute [ class, value ] - $Code$_control ctrlSetFontH4B "TahomaB"$/Code$ + $Code$"Multiplayer" set3DENMissionAttribute ["respawn",3]; + // Set respawn type to 3$/Code$ undefined / undefined @@ -15147,111 +16008,132 @@ - Nothing + Boolean + - ctrlSetFontH4 + unlockAchievement - Sets H4 font of given HTML control. + Unlock the given achievement. - https://community.bistudio.com/wiki/ctrlSetFontH4 + https://community.bistudio.com/wiki/unlockAchievement - Control ctrlSetFontH4 String + unlockAchievement String - controlName ctrlSetFontH4 fontName + unlockAchievement name - $Code$_control ctrlSetFontH4 "TahomaB"$/Code$ - + undefined / undefined + (February 10, 2016) + This is an obsolete command used in the experimental Arma 2 Xbox 360 version. + https://forums.bistudio.com/topic/187873-unlockachievment-command/ - Nothing + Boolean + - ctrlSetFontH5B + formation - Sets H5 bold font of given HTML control. + Returns the current formation of a group. - https://community.bistudio.com/wiki/ctrlSetFontH5B + https://community.bistudio.com/wiki/formation - Control ctrlSetFontH5B String + formation Object/Group - controlName ctrlSetFontH5B fontName + formation grp - $Code$_control ctrlSetFontH5B "TahomaB"$/Code$ + $Code$formation group player$/Code$ - undefined / undefined + global / undefined + (January 9, 2007) + Additional ARMA Formations: "File" - Column Compact. "DIAMOND" - Delta. - Nothing + String + - ctrlSetFontH5 + handgunMagazine - Sets H5 font of given HTML control. + Returns either single element array, containing class name of currently loaded in the handgun magazine, or an empty array if unit has no handgun or handgun is not loaded. This command is used for infantry weapons only. - https://community.bistudio.com/wiki/ctrlSetFontH5 + https://community.bistudio.com/wiki/handgunMagazine - Control ctrlSetFontH5 String + handgunMagazine Object - controlName ctrlSetFontH5 fontName + handgunMagazine unit - $Code$_control ctrlSetFontH5 "TahomaB"$/Code$ + $Code$hint handgunMagazine player ; //["16Rnd_9x21_Mag"]$/Code$ + + $Code$_array = handgunMagazine player ; + if ( count _array 0) then { + hint ("Handgun is loaded with " + (_array select 0) + "!"); + } else { + if ( handgunWeapon player != "") then { + hint "Handgun is not loaded!"; + } else { + hint "Player doesn't have a handgun!"; + }; + };$/Code$ - undefined / undefined + global / undefined - Nothing + Array + - ctrlSetFontH6B + findNearestEnemy - Sets H6 bold font of given HTML control. + Finds the nearest enemy to the specified position. Returns a null object if the object's group does not know about any enemies. This command will return nearest object that is known to the unit and is considered enemy. An empty vehicle that is part of enemy group assets (see addVehicle ) can be returned as valid nearest target. - https://community.bistudio.com/wiki/ctrlSetFontH6B + https://community.bistudio.com/wiki/findNearestEnemy - Control ctrlSetFontH6B String + Object findNearestEnemy Object/Array - controlName ctrlSetFontH6B fontName + object findNearestEnemy position - $Code$_control ctrlSetFontH6B "TahomaB"$/Code$ + $Code$_myNearestEnemy = ( units _myGroup select 0) findNearestEnemy player ;$/Code$ + + $Code$_myNearestEnemy = player findNearestEnemy player ;$/Code$ undefined / undefined @@ -15259,27 +16141,28 @@ - Nothing + Object + - ctrlSetFontH6 + showPad - Sets H6 font of given HTML control. + Shows or hides the notebook on the map screen, if enabled for the mission. (default true ). It is no longer relevant to Arma 2. - https://community.bistudio.com/wiki/ctrlSetFontH6 + https://community.bistudio.com/wiki/showPad - Control ctrlSetFontH6 String + showPad Boolean - controlName ctrlSetFontH6 fontName + showPad show - $Code$_control ctrlSetFontH6 "TahomaB"$/Code$ + $Code$showPad false$/Code$ undefined / undefined @@ -15287,55 +16170,78 @@ - Nothing + Nothing + - ctrlSetFontHeightH1 + onEachFrame - Sets H1 font size of given HTML control. + Runs given statement every frame. + i + Since Arma 3 v1.57 a stackable version of this EH is available: EachFrame + In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. - https://community.bistudio.com/wiki/ctrlSetFontHeightH1 + https://community.bistudio.com/wiki/onEachFrame - Control ctrlSetFontHeightH1 Number + onEachFrame String/Code - controlName ctrlSetFontHeightH1 height + onEachFrame statement - $Code$_control ctrlSetFontHeightH1 0.05$/Code$ + $Code$onEachFrame { hintSilent str position player }; //Hints position every frame$/Code$ + + $Code$// Private variables defined outside of onEachFrame scope are not inherited: + _myvar = "bob"; + myvar = "bill"; + onEachFrame { hintSilent str [_myvar, myvar]}; + //Result: [any,"bill"]$/Code$ + + $Code$// Only one onEachFrame loop can exist at any time: + onEachFrame { player sideChat "first"}; + onEachFrame { player sideChat "second"}; + //Result: "second","second","second"..."second" + // Note how "first" never gets shown even though it precedes "second". This is because script thread is executing within the same frame and first onEachFrame is overwritten before it has a chance to execute its statement.$/Code$ + + $Code$// Script suspension is not permitted within onEachFrame scope: + onEachFrame { sleep 1}; + //ERROR!!!$/Code$ undefined / undefined + (21 Dec, 2012) + $Code$ onEachFrame {}; //Reset event$/Code$ - Nothing + Nothing + - ctrlSetFontHeightH2 + freeLook - Sets H2 font size of given HTML control. + Returns true if freelook is active. - https://community.bistudio.com/wiki/ctrlSetFontHeightH2 + https://community.bistudio.com/wiki/freeLook - Control ctrlSetFontHeightH2 Number + freeLook - controlName ctrlSetFontHeightH2 height + freeLook - $Code$_control ctrlSetFontHeightH2 0.05$/Code$ + $Code$systemChat (if freeLook then {"Quit looking around player!"} else {""});$/Code$ undefined / undefined @@ -15343,111 +16249,123 @@ - Nothing + Boolean + - ctrlSetFontHeightH3 + moveToCompleted - Sets H3 font size of given HTML control. + Check if latest low level moveTo command is finished. - https://community.bistudio.com/wiki/ctrlSetFontHeightH3 + https://community.bistudio.com/wiki/moveToCompleted - Control ctrlSetFontHeightH3 Number + moveToCompleted Object - controlName ctrlSetFontHeightH3 height + moveToCompleted person - $Code$_control ctrlSetFontHeightH3 0.05$/Code$ - + undefined / undefined - Nothing + Boolean + - ctrlSetFontHeightH4 + setMarkerDir - Sets H3 font size of given HTML control. + Sets the orientation of the marker. Angle is in degrees. - https://community.bistudio.com/wiki/ctrlSetFontHeightH4 + https://community.bistudio.com/wiki/setMarkerDir - Control ctrlSetFontHeightH4 Number + String setMarkerDir Number - controlName ctrlSetFontHeightH4 height + markerName setMarkerDir angle - $Code$_control ctrlSetFontHeightH4 0.05$/Code$ + $Code$"Marker1" setMarkerDir 90;$/Code$ - undefined / undefined + undefined / global - Nothing + Nothing + - ctrlSetFontHeightH5 + nearRoads - Sets H5 font size of given HTML control. + Find the road segments within the circle of given radius. - https://community.bistudio.com/wiki/ctrlSetFontHeightH5 + https://community.bistudio.com/wiki/nearRoads - Control ctrlSetFontHeightH5 Number + Object/Array nearRoads Number - controlName ctrlSetFontHeightH5 height + pos nearRoads radius - $Code$_control ctrlSetFontHeightH5 0.05$/Code$ + $Code$_list = player nearRoads 50;$/Code$ + + $Code$_list = ( position _unit) nearRoads 50;$/Code$ + + $Code$_list = [1800,5700] nearRoads 50;$/Code$ undefined / undefined + (26 Mar, 2011) + NearRoads always gets data in the same order. In a 300 meter radius around Feruz Abad, for example, the first one is in the south-west corner and the last one is in the north-east. + Click below for picture. + [1] - Nothing + Array + - ctrlSetFontHeightH6 + isArray - Sets H6 font size of given HTML control. + Check if config entry represents array. - https://community.bistudio.com/wiki/ctrlSetFontHeightH6 + https://community.bistudio.com/wiki/isArray - Control ctrlSetFontHeightH6 Number + isArray Config - controlName ctrlSetFontHeightH6 height + isArray config - $Code$_control ctrlSetFontHeightH6 0.05$/Code$ + $Code$_ok = isArray (configFile "CfgVehicles") + // Result is false$/Code$ undefined / undefined @@ -15455,85 +16373,91 @@ - Nothing + Boolean + - ctrlSetFontHeightSecondary + forceAddUniform - Sets the font size of the secondary text of given control. + Create a new uniform and hard link it into slot (without any restrictions). - https://community.bistudio.com/wiki/ctrlSetFontHeightSecondary + https://community.bistudio.com/wiki/forceAddUniform - Control ctrlSetFontHeightSecondary Number + Object forceAddUniform String - ctrl ctrlSetFontHeightSecondary value + unit forceAddUniform type - $Code$_control ctrlSetFontHeightSecondary 0.05;$/Code$ + $Code$_unit forceAddUniform "U_B_CombatUniform_mcam";$/Code$ - undefined / undefined + global / global - Nothing + Nothing + - ctrlSetFontHeight + createMPCampaignDisplay - Sets the font size of given control. + Create a MP campaign display. The class name must be a mission collection declared in the configs; in example, configFile /"CfgMissions"/"MPMissions"/"Apex"/ + If the class doesn't exist or isn't a mission collection, the display will be created empty. - https://community.bistudio.com/wiki/ctrlSetFontHeight + https://community.bistudio.com/wiki/createMPCampaignDisplay - Control ctrlSetFontHeight Number + Display createMPCampaignDisplay String - controlName ctrlSetFontHeight height + display createMPCampaignDisplay class - $Code$_control ctrlSetFontHeight 0.05$/Code$ + $Code$findDisplay 46 createMPCampaignDisplay "Apex";$/Code$ undefined / undefined + (July 14, 2016) + $Code$ findDisplay 46 createMPCampaignDisplay "123";$/Code$ - Nothing + Nothing + - ctrlSetFontP + commitOverlay - Sets P font of given HTML control or its size. + Commit the current overlay. + i + Some Old Editor Command - https://community.bistudio.com/wiki/ctrlSetFontP + https://community.bistudio.com/wiki/commitOverlay - Control ctrlSetFontP String/Number + commitOverlay Control - control ctrlSetFontP fontOrSize + commitOverlay map - $Code$_control ctrlSetFontP "TahomaB"$/Code$ - - $Code$_control ctrlSetFontP 0.05$/Code$ + $Code$commitOverlay _map,$/Code$ undefined / undefined @@ -15541,55 +16465,58 @@ - Nothing + Nothing + - ctrlSetFontPB + clearMagazineCargoGlobal - Sets P bold font of given HTML control. + Removes all magazines from the vehicle cargo space. MP synchronized. - https://community.bistudio.com/wiki/ctrlSetFontPB + https://community.bistudio.com/wiki/clearMagazineCargoGlobal - Control ctrlSetFontPB String + clearMagazineCargoGlobal Object - controlName ctrlSetFontPB fontName + clearMagazineCargoGlobal unit - $Code$_control ctrlSetFontPB "TahomaB"$/Code$ + $Code$clearMagazineCargoGlobal jeepOne;$/Code$ - undefined / undefined + global / global - Nothing + Nothing + - ctrlSetFontSecondary + enableCamShake - Sets the font size of the secondary text of given control. + Allows camera shake effects via addCamShake. If set to false, then a currently active shake effect will stop immediately. + By default, shake effects are enabled, but once they have been disabled by this command, they will have to be enabled first, in order to be visible. - https://community.bistudio.com/wiki/ctrlSetFontSecondary + https://community.bistudio.com/wiki/enableCamShake - Control ctrlSetFontSecondary String + enableCamShake Boolean - ctrl ctrlSetFontSecondary fontClass + enableCamShake value - $Code$_control ctrlSetFontSecondary "TahomaB";$/Code$ + $Code$enableCamShake false ;$/Code$ undefined / undefined @@ -15597,41 +16524,29 @@ - Nothing + Nothing + - ctrlSetFont + vehicleCargoEnabled - Sets the font for given control (see Fonts ) - Available Arma 3 fonts - "EtelkaMonospacePro" - "EtelkaMonospaceProBold" - "EtelkaNarrowMediumPro" - "LCD14" - "LucidaConsoleB" - "PuristaBold" - "PuristaLight" - "PuristaMedium" - "PuristaSemibold" - "RobotoCondensed" - "RobotoCondensedBold" - "RobotoCondensedLight" - "TahomaB" + Check if the vehicle has enabled transporting other vehicles or not. - https://community.bistudio.com/wiki/ctrlSetFont + https://community.bistudio.com/wiki/vehicleCargoEnabled - Control ctrlSetFont String + vehicleCargoEnabled Object - control ctrlSetFont fontName + vehicleCargoEnabled vehicle - $Code$_control ctrlSetFont "TahomaB"$/Code$ + $Code$// Blackfish (Vehicle Transport) with given variable name blackfish + _canTransportVehicles = vehicleCargoEnabled blackfish; //returns true$/Code$ undefined / undefined @@ -15639,55 +16554,56 @@ - Nothing + Boolean + - ctrlSetForegroundColor + kbReact - Sets foreground color of given control. Color is in format Color. + Pass a non-verbal communication to the receiver. See Conversations for more details. - https://community.bistudio.com/wiki/ctrlSetForegroundColor + https://community.bistudio.com/wiki/kbReact - Control ctrlSetForegroundColor Array + Object kbReact Array - control ctrlSetForegroundColor color + person kbReact [receiver, topic, sentenceID, [argumentName, argumentValue, argumentText, argumentSpeech], ] - $Code$_control ctrlSetForegroundColor [1, 0, 0, 1]$/Code$ - + undefined / undefined - Nothing + Nothing + - ctrlSetModel + safeZoneXAbs - Sets model for 3D Dialog Control. + Returns SafeZone left border (of all monitors, in case there's more than one) - https://community.bistudio.com/wiki/ctrlSetModel + https://community.bistudio.com/wiki/safeZoneXAbs - Control ctrlSetModel String + safeZoneXAbs - control ctrlSetModel model + safeZoneXAbs - $Code$_control3D ctrlSetModel "\a3\Ui_f\objects\Compass.p3d";$/Code$ + $Code$_szX = safeZoneXAbs;$/Code$ undefined / undefined @@ -15695,27 +16611,31 @@ - Nothing + Number + - ctrlSetModelDirAndUp + setDefaultCamera - Sets orientation of 3D control model. It is similar to setVectorDirAndUp command for an object. + Sets the position and direction for the camera used after camera is set on no object (log out view when leaving MP game for example) - https://community.bistudio.com/wiki/ctrlSetModelDirAndUp + https://community.bistudio.com/wiki/setDefaultCamera - Control ctrlSetModelDirAndUp Array + setDefaultCamera Array - control ctrlSetModelDirAndUp [dir, up] + setDefaultCamera [position, direction] - $Code$_ctrl3D ctrlSetModelDirAndUp [[0,1,0],[0,0,1]]; //default orientation$/Code$ + $Code$setDefaultCamera [[5000,5000,200],[1,1,-1]];$/Code$ + + $Code$// Lift camera 100m up above current player position and point downwards: + setDefaultCamera [ ATLtoASL ( player modelToWorld [0,0,100]),[0,0,-1]];$/Code$ undefined / undefined @@ -15723,27 +16643,29 @@ - Nothing + Nothing + - ctrlSetModelScale + toUpper - Sets 3D control model scale + Converts the supplied string to all uppercase characters. - https://community.bistudio.com/wiki/ctrlSetModelScale + https://community.bistudio.com/wiki/toUpper - Control ctrlSetModelScale Number + toUpper String - control ctrlSetModelScale scale + toUpper string - $Code$_ctrl3D ctrlSetModelScale 1.5;$/Code$ + $Code$hint toUpper("AaBb1") + // returns "AABB1"$/Code$ undefined / undefined @@ -15751,212 +16673,206 @@ - Nothing + String + - ctrlSetPosition + removeItemFromUniform - Sets wanted position and size for 2D control animation. Width and height are optional. ctrlCommit is required to complete the operation. For 3D control, param is relative [x,y,z] and no ctrlCommit is required as it cannot be animated. + Removes item from soldier's uniform. Can be used with magazines and weapons too. - https://community.bistudio.com/wiki/ctrlSetPosition + https://community.bistudio.com/wiki/removeItemFromUniform - Control ctrlSetPosition Array + Object removeItemFromUniform String - controlName ctrlSetPosition [x, y] - - controlName ctrlSetPosition [x, y, w, h] - - controlName ctrlSetPosition [x, y, z] + unit removeItemFromUniform item - $Code$// Move control: - _control2D ctrlSetPosition [0, 0]; - _control2D ctrlCommit 0;$/Code$ - - $Code$// Move control and resize: - _control2D ctrlSetPosition [0, 0, 1, 1]; - _control2D ctrlCommit 0;$/Code$ - - $Code$_control3D ctrlSetPosition [0.5, 1, 0.5]; //centered and 1m away from screen$/Code$ - + - undefined / undefined + global / global - (January 27, 2007) - IMPORTANT - You have to use ctrlCommit command to apply this effect(Arma v1.02.5103GER) - - (May 22, 2017) - If the target ctrl is part of a ctrlGroup, the position needs to be relative to the ctrlGroup position. - - (July 20, 2017) - If the target control is a controls' group, all the child controls of that group will be moved automatically (as their position is relative to the control group rather than the display) - Nothing + Nothing + - ctrlSetScale + displaySetEventHandler - Sets wanted scale for control animation. Top left corner remains same. This command requires ctrlCommit. + Sets given event handler of given display. + The return code of the provided function should indicate whether this event was handled correctly. This implies telling the engine whether it's default code should be executed. + See User Interface Event Handlers for the full list of handler names. + If applicable, see DIK_KeyCodes for a list of key code constants, which are relevant to key related user interface events like: KeyDown & KeyUp. - https://community.bistudio.com/wiki/ctrlSetScale + https://community.bistudio.com/wiki/displaySetEventHandler - Control ctrlSetScale Number + Display displaySetEventHandler Array - control ctrlSetScale scale + display displaySetEventHandler [handlerName, function] - $Code$_control ctrlSetScale 0.5; - _control ctrlCommit 0;$/Code$ + $Code$_control displaySetEventHandler ["KeyDown", ""]$/Code$ + + $Code$init.sqf + keyspressed = compile preprocessFile "keyspressed.sqf"; + _display = findDisplay 46; + _display displaySetEventHandler ["KeyDown","_this call keyspressed"]; + keyspressed.sqf + private['_handled']; + _handled = false; + switch (_this select 1) do + { + //F key + case 33: + { + // code here + _handled = true; + }; + }; + _handled;$/Code$ undefined / undefined + (Nov 25, 2009) + Always use displayAddEventHandler instead, as DSetEH overwrites other (peoples') DEH. - Nothing + Nothing + - ctrlSetStructuredText + setDrawIcon - Set the structured text which will be displayed in structured text control. + Set the icon to be shown in 2D editor for the specified editor object. If maintain size is false,icon will not scale depending on the scale,of the map. If maintain size is a number,the icon will maintain size,if map scale is below that number. is3D,show line and priority are,optional. + i + Some Old Editor Command - https://community.bistudio.com/wiki/ctrlSetStructuredText + https://community.bistudio.com/wiki/setDrawIcon - Control ctrlSetStructuredText Structured_Text + Control setDrawIcon Array - control ctrlSetStructuredText structuredText + map setDrawIcon [object,texture,color,offset,width,height,maintain size,angle,string identifier,shadow,is3D,draw line,priority] - $Code$_control ctrlSetStructuredText parseText "First line img image=data\isniper.paa / br / Second line"$/Code$ - - $Code$// To center text vertically, add extra line above with blank space ( ) and set its size to adjust: - with uiNamespace do { - button = findDisplay 46 ctrlCreate ["RscShortcutButton", -1]; - button ctrlSetPosition [0,0,0.3,0.1]; - button ctrlCommit 0; - button ctrlSetStructuredText parseText - " t size='0.5' /t br/ t size='1' align='center' Button Text /t "; - };$/Code$ - + undefined / undefined - Nothing + Nothing + - ctrlSetTextColor + setAperture - Sets text color of given control. Color is in format Color. As of Arma 3 v1.40 this command could also be used to change fill colour or the DialogControls-ProgressBar. + Sets custom camera aperture (-1 to do it automatically). - https://community.bistudio.com/wiki/ctrlSetTextColor + https://community.bistudio.com/wiki/setAperture - Control ctrlSetTextColor Array + setAperture Number - display ctrlSetTextColor color + setAperture aperture - $Code$_control ctrlSetTextColor [1, 0, 0, 1]$/Code$ + $Code$setAperture 0.3;$/Code$ - undefined / undefined + undefined / local - (April 10, 2015) - When used on a RscProgress control, remove the configured "texture" first. The two will affect each other. - Arma 3 v1.42 + The aperture value to simulate typical daylight (outdoor) conditions is 50. The aperture value to simulate typical daylight (indoor) conditions is 30. Setting the value to less than 20 will result in a very bright scene, suitable for night conditions. The closer the number is to 0, the more light will be let into the lens, to carry on the aperture metaphor. Different lighting/weather conditions can change the actual indoor and outdoor aperture values. Experiment and test to be sure. - Nothing + Nothing + - ctrlSetText + menuSetPicture - Set the text of a control of the currently active user dialog or display. This command can be used for: static texts, buttons, edit lines and active texts as well as for images, where you can use it to set the image path. - Read Dialog Control for more information about user dialogs and controls. + Sets new picture into menu entry on given path. - https://community.bistudio.com/wiki/ctrlSetText + https://community.bistudio.com/wiki/menuSetPicture - ctrlSetText Array + menuSetPicture Array - Control ctrlSetText String + Control menuSetPicture Array - ctrlSetText [idc, text] + menuSetPicture [idc, path, picture] - controlName ctrlSetText text + control menuSetPicture [path, picture] - $Code$ctrlSetText [100, "Hello world"];//for Dialogs$/Code$ - - $Code$_control ctrlSetText "Hello world.";// for Displays$/Code$ - + - local / local + undefined / undefined - (16 Nov, 2011) - For ArmA2 textured "shortcut" buttons (type = 16), you must use the alternative syntax. - - (October 16, 2016) - When using ctrlSetText with picture control, the path to the texture is cached, so that if the new texture is from the same file as old one, the precious CPU cycles would not be wasted on reloading it. - Nothing - Nothing + Nothing - Nothing + - ctrlSetTooltipColorBox + reverse - Sets tooltip border color of given control. Color is in format Color. + Reverses given array by reference (modifies the original array, just like resize ). - https://community.bistudio.com/wiki/ctrlSetTooltipColorBox + https://community.bistudio.com/wiki/reverse - Control ctrlSetTooltipColorBox Array + reverse Array - control ctrlSetTooltipColorBox color + reverse array - $Code$_control ctrlSetTooltipColorBox [1, 0, 0, 1];$/Code$ + $Code$_arr = [1,2,3]; + reverse _arr; + hint str _arr; //[3,2,1]$/Code$ + + $Code$_wordArr = toArray "gateman"; + reverse _wordArr; + hint toString _wordArr; //nametag$/Code$ undefined / undefined @@ -15964,27 +16880,28 @@ - Nothing + Nothing + - ctrlSetTooltipColorShade + backpackSpaceFor - Sets tooltip background color of given control. Color is in format Color. + Returns how much space is in backpack for given weapon or magazine - https://community.bistudio.com/wiki/ctrlSetTooltipColorShade + https://community.bistudio.com/wiki/backpackSpaceFor - Control ctrlSetTooltipColorShade Array + Object backpackSpaceFor String - control ctrlSetTooltipColorShade color + backpack backpackSpaceFor weaponName - $Code$_control ctrlSetTooltipColorShade [1, 0, 0, 1];$/Code$ + $Code$( backpack player ) backpackSpaceFor "m16"; // [weapons, magazines]$/Code$ undefined / undefined @@ -15992,66 +16909,73 @@ - Nothing + Array + - ctrlSetTooltipColorText + switchGesture - Sets tooltip text color of given control. Color is in format Color. + When used on a person,the given move is started immediately (there is no transition). - https://community.bistudio.com/wiki/ctrlSetTooltipColorText + https://community.bistudio.com/wiki/switchGesture - Control ctrlSetTooltipColorText Array + Object switchGesture String - display ctrlSetTooltipColorText color + soldier switchGesture moveName - $Code$_control ctrlSetTooltipColorText [1, 0, 0, 1]$/Code$ + $Code$soldierOne switchGesture "Wave";$/Code$ undefined / undefined + (August 31, 2010) + Rpt says "Not implemented" as of OA 1.54. - Nothing + Nothing + - ctrlSetTooltip + ctrlSetFont - Sets tooltip text of given control. + Sets the font for given control (see Fonts ) + Available Arma 3 fonts + "EtelkaMonospacePro" + "EtelkaMonospaceProBold" + "EtelkaNarrowMediumPro" + "LCD14" + "LucidaConsoleB" + "PuristaBold" + "PuristaLight" + "PuristaMedium" + "PuristaSemibold" + "RobotoCondensed" + "RobotoCondensedBold" + "RobotoCondensedLight" + "TahomaB" - https://community.bistudio.com/wiki/ctrlSetTooltip + https://community.bistudio.com/wiki/ctrlSetFont - Control ctrlSetTooltip String + Control ctrlSetFont String - control ctrlSetTooltip text + control ctrlSetFont fontName - $Code$_control ctrlSetTooltip "tooltip";$/Code$ - - $Code$findDisplay 10000 displayCtrl 10001 ctrlSetTooltip "ThisIsAGoodTip";$/Code$ - - $Code$with uiNamespace do - { - bar = findDisplay 46 createDisplay "RscDisplayEmpty" ctrlCreate ["RscProgress", -1]; - bar ctrlSetPosition [0,0,1,0.01]; - bar ctrlCommit 0; - bar progressSetPosition 0.75; - bar ctrlSetTooltip "lalalalalalalala"; - };$/Code$ + $Code$_control ctrlSetFont "TahomaB"$/Code$ undefined / undefined @@ -16059,27 +16983,33 @@ - Nothing + Nothing + - ctrlShown + isLocalized - Returns whether given control is shown. + Checks whether given string name is localized. - https://community.bistudio.com/wiki/ctrlShown + https://community.bistudio.com/wiki/isLocalized - ctrlShown Control + isLocalized String - ctrlShown controlName + isLocalized stringName - $Code$_bool = ctrlShown _ctrl;$/Code$ + $Code$if ( isLocalized "STR_DN_SNAKE") then { + hint localize "STR_DN_SNAKE"; + } else { + hint "STR_DN_SNAKE"; + diag_log "ToDo: STR_DN_SNAKE is not localized"; + };$/Code$ undefined / undefined @@ -16087,214 +17017,208 @@ - Boolean + Boolean + - ctrlShow + canMove - Set if a control of the currently active user dialog is shown or not. - Read Dialog Control for more information about user dialogs and controls. + Returns if the given vehicle is still able to move. This command checks only the damage value, not the amount of fuel! - https://community.bistudio.com/wiki/ctrlShow + https://community.bistudio.com/wiki/canMove - ctrlShow Array - - Control ctrlShow Boolean + canMove Object - ctrlShow [idc, show] - - controlName ctrlShow show + canMove unitName - $Code$ctrlShow [100, false ];$/Code$ + $Code$// SQS : + ?!( canMove _tank) : player sideChat "He's nailed on the ground! Now hurry!"$/Code$ - $Code$_control ctrlShow false ;$/Code$ + $Code$if (! canMove _tank) then + { + player sideChat "He's nailed on the ground! Now hurry!"; + };$/Code$ - local / local + global / undefined + (08:17, 22 Juil 2016 (UTC)) + This command will return true for a car or a tank out of fuel, but false for an helicopter or a plane for the same condition. - Nothing - Nothing + Boolean + - ctrlTextHeight + leaderboardsRequestUploadScore - Returns the control text height. Supported control types are: - CT_STATIC 0 - CT_EDIT 2 ( Since Arma 3 v1.57.135040 ) - CT_STRUCTURED_TEXT 13 + Starts async. operation to upload score to board with given name, value always overwrite the current value in the board. The details array is optional. The board has to be initialized before the call. - https://community.bistudio.com/wiki/ctrlTextHeight + https://community.bistudio.com/wiki/leaderboardsRequestUploadScore - ctrlTextHeight Control + leaderboardsRequestUploadScore Array - ctrlTextHeight control + leaderboardsRequestUploadScore [boardName, score, [details]] - $Code$_h = ctrlTextHeight _ctrl;$/Code$ + $Code$leaderboardsRequestUploadScore ["TT01", 1234, [5,6,7,8]]$/Code$ undefined / undefined - (May 24, 2017) - in ArmA 3 v.1.70.141764, this command always returns 0 if the control has no width. - Number + Boolean + - ctrlText + menuEnable - Returns the text of a control of the currently active user dialog. This command can be used on static texts, buttons, edit lines and active texts as well as for images, where it returns the image path. - Read Dialog Control for more information about user dialogs and controls. + Enables disabled menu entry on given path. - https://community.bistudio.com/wiki/ctrlText + https://community.bistudio.com/wiki/menuEnable - ctrlText Number - - ctrlText Control + menuEnable Array - ctrlText idc - - ctrlText controlName + menuEnable [idc, path] - $Code$_text = ctrlText 100$/Code$ - - $Code$_text = ctrlText _control$/Code$ - + - local / undefined + undefined / undefined - String - String + Nothing + - ctrlType + displayRemoveAllEventHandlers - Returns number representing the type of control, which is also defined by type property in config. For more information see Dialog Control + Remove all event handlers from the given display. - https://community.bistudio.com/wiki/ctrlType + https://community.bistudio.com/wiki/displayRemoveAllEventHandlers - ctrlType Control + Display displayRemoveAllEventHandlers String - ctrlType control + display displayRemoveAllEventHandlers handlerName - $Code$_type = ctrlType _rscEdit; // 2$/Code$ - + undefined / undefined - Number + Nothing + - ctrlVisible + serverName - Returns if a control of the currently active user dialog is shown or not. Read Dialog Control for more information about user dialogs and controls. + Returns name of the hosting server in MP, "" in SP. - https://community.bistudio.com/wiki/ctrlVisible + https://community.bistudio.com/wiki/serverName - ctrlVisible Number + serverName - ctrlVisible idc + serverName - $Code$_bool = ctrlVisible 100;$/Code$ - + - local / undefined + undefined / undefined - Boolean + String + - curatorAddons + disableRemoteSensors - Returns list of addons allowed to given curator. + This command will halt raycasting calculations (on the local machine only) for all groups which don't contain any local entities. If a group contains a single local entity then calculations will still be performed for the entire group. + These raycasts are used to determine what other entities an entity can see, and they take a lot of CPU time. This is of course a bit of a trick, because rather than a true optimization, it disables part of the simulation. However, there are certainly types of scenarios where these raycasts are not needed. An example is a fully Player-versus-Player scenario, where the visibility between every combination of player entity is not needed. So why not disable this by default? There are cases where you do require these raycasts, for example in stealth scenarios. Without them, commands like knowsAbout, nearTargets and targetKnowledge will only function for local units! The commands themselves are local, can be used on servers and clients, and the state is reset when the scenario ends. So, carefully consider whether your scenario can benefit from this method. - https://community.bistudio.com/wiki/curatorAddons + https://community.bistudio.com/wiki/disableRemoteSensors - curatorAddons Object + disableRemoteSensors Boolean - curatorAddons curatorObj + disableRemoteSensors state - $Code$_addons = curatorAddons myCurator;$/Code$ + $Code$disableRemoteSensors false;$/Code$ - undefined / undefined + undefined / local - Array + Nothing + - curatorCameraAreaCeiling + displayParent - Returns ceiling height for curator camera. + Returns parent display of the given display. - https://community.bistudio.com/wiki/curatorCameraAreaCeiling + https://community.bistudio.com/wiki/displayParent - curatorCameraAreaCeiling Object + displayParent Display - curatorCameraAreaCeiling curatorObj + displayParent display - $Code$curatorCameraAreCeiling BIS_curatorUnit;$/Code$ + $Code$_display = displayParent findDisplay 49; // Display #46$/Code$ undefined / undefined @@ -16302,27 +17226,28 @@ - Number + Display + - curatorCameraArea + hcShownBar - Returns all curator camera areas. + Return true if the high command bar is shown/active. - https://community.bistudio.com/wiki/curatorCameraArea + https://community.bistudio.com/wiki/hcShownBar - curatorCameraArea Object + hcShownBar - curatorCameraArea curatorObj + hcShownBar - $Code$_camArea = curatorCameraArea myCurator;$/Code$ + $Code$if ( hcShownBar ) then { hint "HC bar is active";};$/Code$ undefined / undefined @@ -16330,200 +17255,228 @@ - Array + Boolean + - curatorCamera + camPreparePos - Returns curator camera object. + Prepares the camera position (format Position ). - https://community.bistudio.com/wiki/curatorCamera + https://community.bistudio.com/wiki/camPreparePos - curatorCamera + Object camPreparePos Array - curatorCamera + camera camPreparePos position - + $Code$_camera camPreparePos getPos player$/Code$ + undefined / undefined - Object + Nothing + - curatorCoef + enableRadio - Returns current coeficient setting. + Enable and disable radio messages to be heard and shown in the left lower corner of the screen. This command can be helpful during cutscenes. - https://community.bistudio.com/wiki/curatorCoef + https://community.bistudio.com/wiki/enableRadio - Object curatorCoef String + enableRadio Boolean - curatorObj curatorCoef action + enableRadio state - $Code$curatorModule curatorCoef "Place"$/Code$ + $Code$enableRadio false$/Code$ - undefined / undefined + undefined / local + (7 August, 2008) + This command doesn't disable text-chat in multiplayer. + + (11 September, 2008) + Does not affect VON. - Number + Nothing + - curatorEditableObjects + enableEndDialog - Returns all editable objects which belong to a curator. + Enables the execution of a custom camera sequence after the players death, coded in the script onPlayerKilled.sqs. - https://community.bistudio.com/wiki/curatorEditableObjects + https://community.bistudio.com/wiki/enableEndDialog - curatorEditableObjects Object + enableEndDialog - curatorEditableObjects curatorObj + enableEndDialog - $Code$_objects = curatorEditableObjects myCurator;$/Code$ - + - global / undefined + undefined / local - Array + Nothing + - curatorEditingAreaType + canVehicleCargo - Returns type of edit areas assigned to curator (blacklist/whitelist). + Returns bool array if it is possible to load cargo inside vehicle and if possible to load cargo into empty vehicle - https://community.bistudio.com/wiki/curatorEditingAreaType + https://community.bistudio.com/wiki/canVehicleCargo - curatorEditingAreaType Object + Object canVehicleCargo Object - curatorEditingAreaType obj + vehicle canVehicleCargo cargo - + $Code$// Blackfish with no vehicle cargo loaded + _result = blackfish canVehicleCargo offroad; //[true, true]$/Code$ + + $Code$// Blackfish with one vehicle cargo called offroad already loaded + _result = blackfish canVehicleCargo offroad; //[false, false] + + // Even if the Blackfish was empty offroad can't be loaded because it's already in a cargo space$/Code$ + + $Code$// Blackfish with one vehicle cargo called offroad already loaded + _result = blackfish canVehicleCargo offroad2; //[false, true] + + // offroad2 can't be loaded because there isn't enough space in the Blackfish, but if there was space offroad2 could be loaded into the Blackfish$/Code$ + undefined / undefined - Boolean + Array + - curatorEditingArea + addWeaponCargoGlobal - Returns all curator editing areas. + Add weapons to the cargo space of vehicles, which can be taken out by infantry units. + MP Synchronized - https://community.bistudio.com/wiki/curatorEditingArea + https://community.bistudio.com/wiki/addWeaponCargoGlobal - curatorEditingArea Object + Object addWeaponCargoGlobal Array - curatorEditingArea curatorObj + vehicleName addWeaponCargoGlobal [weaponName, count] - $Code$_editingArea = curatorEditingArea myCurator;$/Code$ + $Code$_truck addWeaponCargoGlobal["M16",5];$/Code$ - undefined / undefined + global / global + (November 7, 2011) + Synchronized to JIP as well. - Array + Nothing + - curatorMouseOver + closeDisplay - Returns Curator Editable Object under curator mouse pointer in form of array: - [] - when not in curator mode - [""] - if no curator editable object under the pointer in curator mode - [ typeName, Curator Editable Object ] - if there is curator editable object under the pointer in curator mode + Close given display with exit code. Most common exit codes are: + $Code$#define IDC_OK 1 //emulate "Ok" button$/Code$ + $Code$#define IDC_CANCEL 2 //emulate "Cancel" button$/Code$ - https://community.bistudio.com/wiki/curatorMouseOver + https://community.bistudio.com/wiki/closeDisplay - curatorMouseOver + Display closeDisplay Number - curatorMouseOver + display closeDisplay exitcode - $Code$_mouseOver = curatorMouseOver ; - // possible return value:[ - "OBJECT", - 3594ab00# 164218: apc_wheeled_01_cannon_f.p3d - ]$/Code$ + $Code$_display closeDisplay 1;$/Code$ + + $Code$#define IDC_OK 1 + _display closeDisplay IDC_OK;$/Code$ undefined / undefined + (November 18, 2015) + closeDisplay does not instantly close the display but does it on next display simulation cycle (when display becomes active) - Array + Nothing + - curatorPoints + diag_recordTurretLimits - Returns number of points that curator have. Points can be only in range from 0 to 1. + Start recording tool for creating turret aiming limits. + Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. - https://community.bistudio.com/wiki/curatorPoints + https://community.bistudio.com/wiki/diag_recordTurretLimits - curatorPoints Object + diag_recordTurretLimits Boolean - curatorPoints curatorObj + diag_recordTurretLimits section - $Code$_points = curatorPoints myCurator;$/Code$ + $Code$diag_recordTurretLimits true;$/Code$ undefined / undefined @@ -16531,54 +17484,65 @@ - Number + Nothing + - curatorRegisteredObjects + markerPos - Returns array with all objects that has curator registered and their settings. + Get marker Position. Note: This function is identical to getMarkerPos. - https://community.bistudio.com/wiki/curatorRegisteredObjects + https://community.bistudio.com/wiki/markerPos - curatorRegisteredObjects Object + markerPos String - curatorRegisteredObjects curatorObj + markerPos markerName - + $Code$_mPos = markerPos "markerOne";$/Code$ + - undefined / undefined + global / undefined + (March 17, 2014) + Position's Z coordinate will always be 0." - Array + Array + - curatorSelected + uniformContainer - Returns list of all curator selected items. + Returns a cargo container of a unit's uniform. - https://community.bistudio.com/wiki/curatorSelected + https://community.bistudio.com/wiki/uniformContainer - curatorSelected + uniformContainer Object - curatorSelected + uniformContainer unit - $Code$selectedItems = curatorSelected ;$/Code$ + $Code$hint str uniformContainer player ; //2df7dd00# 163941: dummyweapon.p3d$/Code$ + + $Code$hint str getMagazineCargo uniformContainer player ; + // [ + //["30Rnd_65x39_caseless_mag"], + //[3] + //]$/Code$ undefined / undefined @@ -16586,89 +17550,106 @@ - Array + Object + - curatorWaypointCost + enableWeaponDisassembly - Return current price for placing waypoints (curator specific). + Enables or disables disassembly of static weapons. Could be applied to local player, to another unit or to static weapon directly. - https://community.bistudio.com/wiki/curatorWaypointCost + https://community.bistudio.com/wiki/enableWeaponDisassembly - curatorWaypointCost Object + enableWeaponDisassembly Boolean + + Object enableWeaponDisassembly Boolean - curatorWaypointCost curatorObj + enableWeaponDisassembly enable + + entity enableWeaponDisassembly enable - + $Code$enableWeaponDisassembly false ;$/Code$ + + $Code$soldier1 enableWeaponDisassembly false ;$/Code$ + + $Code$mortar1 enableWeaponDisassembly false ;$/Code$ + - undefined / undefined + global / global - Number + Nothing - Nothing + - current3DENOperation + commander - Returns the currently performed editing operation in Eden Editor. + In OFP it returns the commander of a vehicle. Since ArmA and VBS2 it returns the primary observer. The commander of a vehicle can be found with effectiveCommander. - https://community.bistudio.com/wiki/current3DENOperation + https://community.bistudio.com/wiki/commander - current3DENOperation + commander Object - current3DENOperation + commander vehicleName - $Code$if ( current3DENOperation == "Move") then { hint "Moving";};$/Code$ + $Code$moveOut commander _tank;$/Code$ + + $Code$// Detect if player is in commander turret of a vehicle: + _isVehicleCommander = player isEqualTo commander objectParent player ;$/Code$ - undefined / undefined + global / undefined + (August 3, 2006) + Notes from before the conversion: + It is also possible to find the commander of a vehicle by placing a C after the name of the vehicle so Tank1C and commander Tank1 both refer to the same unit, providing the original commander has not got out of the tank. + The difference between the two is Tank1C is always the unit that was commander of the tank when the mission started, whilst commander Tank1 is the commander which is now there. + + (August 3, 2006) + WARNING about Hardrock note: + Take very care about this : if you give a vehiculeVarName to one crew, so his referent will not be Tank1x anymore ! Also, if in the mission editor, you put something in the name field, when this soldier will getin a vehicle, it will not be a Tank1x too. So do not take consideration about Hardrock note, if you don't want to have bad surprise. It Is better to force names by using setVehicleVarName command. + $Code$(( crew tank) select 0) setVehicleVarName "Tankcrew0"$/Code$ - String + Object + - currentChannel + taskAlwaysVisible - Returns currently selected user chat channel on the UI (selected with and in MP). Correspondence between channel and number: - 0 = Global - 1 = Side - 2 = Command - 3 = Group - 4 = Vehicle - 5 = Direct - 6-15 = Custom Radio (see radioChannelCreate ) + Returns true if the task is flagged to be always visible or false if not. - https://community.bistudio.com/wiki/currentChannel + https://community.bistudio.com/wiki/taskAlwaysVisible - currentChannel + taskAlwaysVisible Task - currentChannel + taskAlwaysVisible task - $Code$_selected = currentChannel ; // 3 - for example for the Group$/Code$ + $Code$_isAlwaysVisible = taskAlwaysVisible ( currentTask player );$/Code$ undefined / undefined @@ -16676,55 +17657,63 @@ - Number + Boolean + - currentCommand + triggerTimeout - Return the current command type (empty string when no command) for the commander of given vehicle (or for a given soldier). Value returned can be one of: - "WAIT", "ATTACK", "HIDE", "MOVE", "HEAL", "REPAIR", "REFUEL", "REARM", "SUPPORT", "JOIN", "GET IN", "FIRE", "GET OUT", "STOP", "EXPECT", "ACTION", "ATTACKFIRE", + Returns trigger timeout in the form [min, mid, max, interruptable]. + Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. - https://community.bistudio.com/wiki/currentCommand + https://community.bistudio.com/wiki/triggerTimeout - currentCommand Object + triggerTimeout Object - currentCommand vehicleName + triggerTimeout trigger - undefined / undefined + global / local - String + Array + - currentMagazineDetailTurret + getFSMVariable - Returns the class name of currently used magazine on specified turret. Use turret path [-1] for driver's turret. Note that a turret is not loaded until unit enters it, so this command will return "". + Return the value of variable in the variable space of given FSM. The FSM handle is the number returned by the execFSM command. - https://community.bistudio.com/wiki/currentMagazineDetailTurret + https://community.bistudio.com/wiki/getFSMVariable - Object currentMagazineDetailTurret Array + Number getFSMVariable String + + Number getFSMVariable Array - vehicle currentMagazineDetailTurret [turret path] + FSMhandle getFSMVariable name + + FSMhandle getFSMVariable [name, defaultValue] - $Code$_magazineDetail = MBT_Kuma currentMagazineDetailTurret [0];$/Code$ + $Code$_handle getFSMVariable "_foo";$/Code$ + + $Code$_handle getFSMVariable ["_foo", 123];$/Code$ undefined / undefined @@ -16732,60 +17721,61 @@ - String + Anything - Anything + - currentMagazineDetail + group - Returns description of vehicle's currently loaded magazine, its ammo count (current/default) and its id. + Returns the group a unit is assigned to. - https://community.bistudio.com/wiki/currentMagazineDetail + https://community.bistudio.com/wiki/group - currentMagazineDetail Object + group Object - currentMagazineDetail vehicle + group object - $Code$_currentMagazineDetail = currentMagazineDetail player ; //"6.5mm 30Rnd STANAG Mag(30/30)[id:0]"$/Code$ - - $Code$_currentMagazineDetail = currentMagazineDetail Mi_48; //"30mm HE Shells(250/250)[id:21]"$/Code$ - - $Code$_cmd = currentMagazineDetail player ; //"9mm 16Rnd Mag(13/16)[id/cr:10000011/0]" - _cmd splitString "([ ]/:)"; //["9mm","16Rnd","Mag","13","16","id","cr","10000011","0"]$/Code$ + $Code$_playerGrp = group player$/Code$ - undefined / undefined + global / undefined + (August 19, 2006) + Few rules about group in OFP:R. + 1) When last man in group die or is moved to other group, group will be destroyed, and it can't be used anymore. + 2) 1st man joined to empty group will be group leader. - String + Group + - currentMagazineTurret + deleteMarker - Returns the name of the type of the currently using magazine on specified turret. Use turret path [-1] for driver's turret. Note that a turret is not loaded until unit enters it, so this command will return "". + Destroys the given marker. - https://community.bistudio.com/wiki/currentMagazineTurret + https://community.bistudio.com/wiki/deleteMarker - Object currentMagazineTurret Array + deleteMarker String - vehicle currentMagazineTurret [turret path] + deleteMarker name - $Code$_magazine = MBT_Kuma currentMagazineTurret [0];$/Code$ + $Code$deleteMarker "Marker1"$/Code$ undefined / undefined @@ -16793,311 +17783,339 @@ - String + Nothing + - currentMagazine + addWeaponPool - Returns class name of currently loaded vehicle's magazine. + Add weapons to the weapon pool, of which the player may choose in the following mission. Available in campaigns only. - https://community.bistudio.com/wiki/currentMagazine + https://community.bistudio.com/wiki/addWeaponPool - currentMagazine Object + addWeaponPool Array - currentMagazine vehicle + addWeaponPool [weaponName, count] - $Code$_magazineClass = currentMagazine player ;//Example: "30Rnd_545x39_AK"$/Code$ + $Code$addWeaponPool ["M16",5];$/Code$ undefined / undefined - (October 4, 2010) - See notes of currentWeapon. - String + Nothing + - currentMuzzle + getAllHitPointsDamage - Returns current muzzle of unit's weapon. - This command will return 0 Number if given object is a vehicle instead of a person. + Returns 3 arrays for easy cross reference: 1st - array of hit point names, 2nd - array of hit selection names, 3rd - array of damage values. All values in all arrays are ordered accordingly to hit part index for convenience and for use in setHitIndex and getHitIndex. Levels of damage are: + 0: no damage + 1: full damage - https://community.bistudio.com/wiki/currentMuzzle + https://community.bistudio.com/wiki/getAllHitPointsDamage - currentMuzzle Object + getAllHitPointsDamage Object - currentMuzzle gunner + getAllHitPointsDamage entity - $Code$_muzzle = currentMuzzle player ;$/Code$ - - $Code$_muzzle = currentMuzzle ( gunner ( vehicle player ));$/Code$ + $Code$getAllHitPointsDamage player ; + //[ + //["HitFace","HitNeck","HitHead","HitPelvis","HitAbdomen","HitDiaphragm","HitChest","HitBody","HitArms","HitHands","HitLegs"], + //["","neck","head","pelvis","spine1","spine2","spine3","body","","hands","legs"], + //[0,0.0939002,0.0319932,0.0858595,0.174491,1,1,0.168495,1,0.5,0.195907] + //]$/Code$ - undefined / undefined + global / undefined - String + Array + - currentNamespace + enableGunLights - Returns current global namespace the script runs in. + Force the AI to use gun lights - https://community.bistudio.com/wiki/currentNamespace + https://community.bistudio.com/wiki/enableGunLights - currentNamespace + Object/Group enableGunLights Boolean - currentNamespace + thing enableGunLights value - $Code$if ( currentNamespace isEqualTo uiNamespace ) then { hint "This is uiNamespace"};$/Code$ + $Code$_grp enableGunLights true$/Code$ + + $Code$_unit enableGunLights true$/Code$ - undefined / undefined + local / global + (27 July, 2011) + This command can be used to force lights on, but not to force lights off. ( Source ) + + (17 April, 2013) + In order for this command to work in ARMA 3 you should use groupname enableGunLights "AUTO" or soldierOne enableGunLights "AUTO". Other options are "forceOn" or "forceOff". ( Source ) - Namespace + Nothing + - currentTasks + initAmbientLife - List all uncompleted tasks. + Initialize the ambient life. - https://community.bistudio.com/wiki/currentTasks + https://community.bistudio.com/wiki/initAmbientLife - currentTasks Team_Member + initAmbientLife - currentTasks member + initAmbientLife - $Code$_playerTasks = currentTasks teamMember player$/Code$ - + undefined / undefined - Array + Nothing + - currentTask + format - Return current task of given person. + Composes a string containing other variables or other variable types. Converts any variable type to a string. If you want to convert a string back to a number, use parseNumber. NOTE that output of this command is limited to ~8Kb. joinString on the other hand doesn't have such limit. - https://community.bistudio.com/wiki/currentTask + https://community.bistudio.com/wiki/format - currentTask Object + format Array - currentTask person + format [formatString, var1, var2] - + $Code$format ["Player:%1, player's side:%2", player, side player ]; + // returns "Player:WEST 1-1-A:1 (Username), player's side:WEST"$/Code$ + + $Code$player addEventHandler ["HandleDamage", { + hint format ["You just sustained %1%2 damage!", ceil (( _this select 2) * 100), "%"]; + }]; + // hints "You just sustained 20% damage!"$/Code$ + undefined / undefined + The maximum number of characters returned by the format command seems to depend on the total byte count. For plain ASCII strings the limit is 2048 characters. + + In Arma 3 the max length of String returned by format command seems to be 8191 characters. formatText doesn't seem to have this limitation. + + (March 28, 2015) + In addition to the note above, formatTexted strings are Structured Text, hence cannot be used like formatted strings (with most scripting commands). A workaround to get strings of type String with more than 8191 characters is: $Code$ str formatText ["%1", _string]$/Code$ + + (January 2, 2016) + In addition to the note above, you may consider using joinString instead of format or formatText workaround. joinString is a fraction faster than format and it has no limit on the length of the string (apart from global String limit obviously) - Task + String + - currentThrowable + editObject - Returns currently selected throwable, which will be launched if user presses "G". - Please note: The weapon/magazine id system is W.I.P. and may change without notice. + Show the edit object dialog for the given object. + i + Some Old Editor Command - https://community.bistudio.com/wiki/currentThrowable + https://community.bistudio.com/wiki/editObject - currentThrowable Object + Control editObject String - currentThrowable player + map editObject object - $Code$currentThrowable player ; //["SmokeShellGreen","SmokeShellGreenMuzzle",[1.00002e+007,0]]$/Code$ - - $Code$_ct = currentThrowable player ; //["HandGrenade","HandGrenadeMuzzle",[1e+007,0]] - _id = (_ct select 2 select 0) - 10000000; //18$/Code$ - + undefined / undefined - Array + Any_Value + - currentVisionMode + addBackpack - Returns current vision mode of unit's weapon. - 0 - daytime - 1 - night vision - 2 - thermal vision + Adds a backpack for a unit. If a unit already has a backpack, the old backpack will be placed on the ground under the unit. + Classname list of available backpacks : + Arma 2 OA backpacks + Arma 3 backpacks - objects starting with "B_", starts with " B_AssaultPack_khk " - https://community.bistudio.com/wiki/currentVisionMode + https://community.bistudio.com/wiki/addBackpack - currentVisionMode Object + Object addBackpack String - currentVisionMode unit + unit addBackpack packClassName - $Code$_currMode = currentVisionMode gunner _tank$/Code$ + $Code$this addBackpack "TK_RPG_Backpack_EP1";$/Code$ - $Code$if ( currentVisionMode player == 1) then - { - hint "nightvision active"; - };$/Code$ + $Code$_mySoldierDude addBackpack "US_Patrol_Pack_EP1";$/Code$ - global / undefined + local / global - (April 29, 2016) - The return value is somewhat erratic for UAVs. For example, if you are connected to a UAV, with the turret set to thermal vision and PIP feed enabled, "currentVisionMode gunner _uav" returns 2 when controlling the turret, but returns 0 after releasing control, even thought the PIP feed is still in thermal mode. WIth nightvision, it will return 1 whether or not you are controlling the turret, but if you switch from 1st to 3rd person before releasing control, then it returns 0 afterwards... - Number + Nothing + - currentWaypoint + playMusic - Return the index of the current waypoint. - To determine the validity of the index, compare it to the waypoints count. - If all waypoints are 'completed', then the index is 1 greater than the last valid index. - If there are no waypoints, then the index is 0. - By default, a group has 1 waypoint at their starting position, which is considered completed and so the currentWaypoint is 1. + Plays music defined in Description.ext#CfgMusic or config.cpp. To stop the music execute playMusic "" or give the start time which is beyond the music duration playMusic ["SomeMusic", 1000]; + For Arma 3 music, see Arma 3 CfgMusic. Since Arma 3 v1.67 one can use Jukebox Utility to preview in-game music. - https://community.bistudio.com/wiki/currentWaypoint + https://community.bistudio.com/wiki/playMusic - currentWaypoint Group + playMusic String + + playMusic Array - currentWaypoint groupName + playMusic name + + playMusic [name, start] - $Code$_index = currentWaypoint group player ;$/Code$ + $Code$playMusic "RadioAmbient1";$/Code$ + + $Code$playMusic ["RadioAmbient3", 3]; //start from 00:00:03$/Code$ + + $Code$// Play from 00:00:01 to 00:00:05 + 0 = [] spawn { + playMusic ["RadioAmbient5", 1]; + sleep 4; + playMusic ""; + };$/Code$ - undefined / undefined + undefined / local + You can get all Music Types from Arma:_cfgMusic + http://community.bistudio.com/wiki/Arma_2:_Music#top - Number + Nothing - Nothing + - currentWeaponMode + setWaypointPosition - Returns current weapon mode of unit's weapon. Result can be: "Single", "Burst", "FullAuto", "manual", "player" - This command will return 0 Number if given object is a vehicle instead of a person. + Moves the waypoint to a random position in a circle with the given center and radius. - https://community.bistudio.com/wiki/currentWeaponMode + https://community.bistudio.com/wiki/setWaypointPosition - currentWeaponMode Object + Array setWaypointPosition Array - currentWeaponMode gunner + waypoint setWaypointPosition [center, radius] - $Code$_weaponMode = currentWeaponMode player ;$/Code$ - - $Code$_weaponMode = currentWeaponMode gunner vehicle player ;$/Code$ + $Code$[_grp, 2] setWaypointPosition [ position player, 0];$/Code$ undefined / undefined - (September 27, 2014) - - Be careful using this in script. This function returns these strings but also: - - 0 if unit is in a vehicle (pax), - - absolutely nothing if AH-99 helo driver or all weapons removed, - - "truckhorn2" if Hunter driver... - Absolutely nothing means: if you use a hint to display the returned value, you obtain absolutely no text,no black box, no error! Hint isn't displayed and there is no error in rpt file with compile preprocessFileLineNumbers. - On the other hand, returned value 0 when unit is pax of a vehicle, could lead to a variable error type if your script is waiting for a string. - String + Nothing + - currentWeaponTurret + actionName - Returns the name of the currently selected weapon on specified turret. Use turret path [-1] for driver's turret. + Returns localized name of action. - https://community.bistudio.com/wiki/currentWeaponTurret + https://community.bistudio.com/wiki/actionName - Object currentWeaponTurret Array + actionName String - vehicle currentWeaponTurret [turret path] + actionName action - $Code$_weapon = MBT_Kuma currentWeaponTurret [0];$/Code$ + $Code$actionName "ReloadMagazine"$/Code$ undefined / undefined @@ -17105,468 +18123,299 @@ - String + String + - currentWeapon + ctSetData - Return the name of the currently selected weapon (on the primary turret for vehicles). + Associates metadata (string) with the row determined by the index. Returns Nothing. - https://community.bistudio.com/wiki/currentWeapon + https://community.bistudio.com/wiki/ctSetData - currentWeapon Object + Control ctSetData Array - currentWeapon vehicle + Control ctSetData [[[Number]], String ] - $Code$_weaponClass = currentWeapon (vehicle player);//Example: "M16A2GL"$/Code$ - - $Code$_weaponClass = currentWeapon player;$/Code$ + $Code$_control ctSetData [0, "Test"];$/Code$ - undefined / undefined + local / local - (July 15, 2009) - You have to make a little delay (sleep 0.001; (not less)) to use this command, else you will be returned an empty string. - - (July 15, 2009) - It seems it's not working in 1.02 for other unit than player. - - (May 4, 2010) - This works for vehicles providing there is a gunner - String + Nothing + - currentZeroing + hideBody - Returns zeroing of unit's weapon. + Hides dead body of the given unit. After a short delay, the body slowly sinks into the ground. After awhile, when group of the unit becomes grpNull, the body gets deleted and becomes objNull. If applied to alive unit, nothing happens until unit dies, then the unit's body gets hidden. If a dead unit is human player, the body is hidden but not deleted until player respawns. - https://community.bistudio.com/wiki/currentZeroing + https://community.bistudio.com/wiki/hideBody - currentZeroing Object + hideBody Object - currentZeroing gunner + hideBody unit - $Code$_zeroing = currentZeroing player ;$/Code$ + $Code$hideBody player1;$/Code$ - undefined / undefined + local / global - Number + Nothing + - cursorObject + rainbow - Returns the object under cursor. This command is quite different from cursorTarget as it is more precise in determining the boundaries of the pointed at object and can detect a larger variety of objects including map objects and trees. + Returns the current rainbow intensity. - https://community.bistudio.com/wiki/cursorObject + https://community.bistudio.com/wiki/rainbow - cursorObject + rainbow - cursorObject + rainbow - $Code$hint str [ getModelInfo cursorObject, typeOf cursorObject ];$/Code$ - + undefined / undefined - (March 23, 2015) - If you point at the primary weapon of an infantry unit, cursorObject will return the p3d of the weapon instead of the unit itself (B Alpha 1-2:1.. or its variable name ). That doesn't occur for anything else (backpack or headgear). - Object + Number + - cursorTarget + setName - Returns the target pointed at by the player (usually with cross-hairs). The target has to be known to the player to some degree ( knowsAbout 0). If target is completely unknown, command returns objNull. - A valid target could belong to an enemy or a friendly side. Buildings are normally known to player and so are valid targets. Try nearTargets to see what else is considered a target. While friendly targets are usually known to the player, enemy targets can be totally unknown, especially if "auto-spotting" (or sometimes called "auto-reporting") is switched off. To check if auto-spotting is enabled: difficultyEnabled "autospot" - cursorTarget also returns locked target for the duration of the lock even if there is another target under the cursor. As soon as missile is fired, cursorTarget switches to current known target under cursor or objNull. Targeting (currently "T" in Arma 3) works regardless of the state of "auto-spotting". - Adding a target to the known list could be done with reveal command. When auto-spotting is enabled, zooming on the enemy target with cross-hairs usually reveals the target. As friendly targets are always known, zooming on friendly target could improve knowsAbout value. - Side relations can also influence target knowledge. For example east target is unknown target for civilian, but making them friends with setFriend instantly improves civilian knowledge of the east. + Sets the name of a location or a person. In Arma 3 this can be used to set name of a person but only in single player. - https://community.bistudio.com/wiki/cursorTarget + https://community.bistudio.com/wiki/setName - cursorTarget + Object setName String + + Object setName Array + + Location setName String - cursorTarget + object setName name + + unit setName [name, firstName, lastName] + + location setName name - $Code$alive cursorTarget ;$/Code$ - + $Code$myLocation setName "My Location Name";$/Code$ + + $Code$player setName "New Name";$/Code$ + + $Code$player setName ["Ben Kerry","Ben","Kerry"];$/Code$ + - undefined / undefined + undefined / local - (01:25, 18 February 2011 (CET)) - If the player is in a vehicle and a lockable weapon is selected and a target is locked, the locked target will be returned, regardless if it's in sight or not. - - (11 March 2011) - Addition to Myke's note: - It also works for infantry with launchers that canLock, like Javelin or AA. - Only the lock cursor must be visible on the target - not a full lock necessarily. - - (13:09, 11 July 2009 (CEST)) - Player must knows about what he is pointing to for this command to return something other than NULL-OBJECT - This command doesn't work through building windows - This recognition doesn't work with every object : soldiers, vehicles, big houses are ok, but not trees, plants, road signs or others little things - - (22:11, 23 August 2013 (CEST)) - To add to Lou Montana's note, use reveal command on the object you want to be detected with cursorTarget when pointing at it. Without it, distant units are most likely to return objNull even if you shoot and hit them. Units that have been previously subjected to enableSimulation false; or enableSimulationGlobal false; may stay unrecognised for a long time even after simulation was re-enabled, returning objNull as cursorTarget. Force revealing units with reveal command usually solves the problem. For example: $Code${ player reveal _x} forEach allUnits ;$/Code$ + (July 9, 2010‎) + Appears to be only for the 3d editor. - (December 3, 2014) - cursorTarget seems to change when your cursor enters an object's boundingBox. Because of this, if the player is inside the boundingBox, the object will always be the current cursorTarget if the player is not looking at another object, although sometimes the object will remain the cursorTarget even if the player does. + (September 19, 2013‎) + Support of a person as the first parameter from Arma 3 v. 1.02. - (April 21, 2015) - Cursortarget will not return enemy units, even very close, if "autoreport" is disabled in game difficulty settings, and if player is alone. - However, when enemy units open fire on player, the cursortarget becomes functional on these units. If player is in a group, cursortarget is also functional (report by other units). + (April 12, 2014) + Seems to have no effect on players in Multiplayer. (ArmA 3 v1.00) - (February 5, 2016) - CursorTarget will return a Null_Object for all of thus which have a disabled simulation (_object enableSimulation false). - - - Object - - - - - customChat - - - Sends the chat message to the custom radio channel. The radio channel needs to be created on the server before hand, with radioChannelCreate command. - - - https://community.bistudio.com/wiki/customChat - - - Object customChat Array - - - unit customChat [channel, message] - - - $Code$_unit customChat [1, "Hi, I am a custom chat message"];$/Code$ - - $Code$driver vehicle player sideChat "sideChat"; - driver vehicle player globalChat "globalChat"; - driver vehicle player groupChat "groupChat"; - vehicle player vehicleChat "vehicleChat"; - driver vehicle player commandChat "commandChat"; - driver vehicle player customChat [1, "customChat"]; - systemChat "systemChat";$/Code$ - - - global / local - - - - - Nothing - - - - - customRadio - - - Sends the message to the custom radio channel. The message is defined in the description.ext file or radio protocol. - - - https://community.bistudio.com/wiki/customRadio - - - Object customRadio Array - - - unit customRadio [channel, message] - - - $Code$_soldierOne customRadio [1, "WordEnemy"];$/Code$ - - - global / local - - - (December 3, 2016) - To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: - $Code$ player customRadio [1, "#MySound.ogg"];$/Code$ + (August 18, 2014) + Only last name will appear in command bar i.e. this setname _mynameArray will display _mynameArray select 2. If setname is used with a string : this setname "blah", nothing occurs in command bar and default randomized name is displayed. + Dealing with the units' names in a script, _x (in a foreach units group, for example) will return the "object" as B ALFA 4-1:2 or the name written in ai unit name field in editor (if exists). This context is rather a "variable name" for each object (ai) than an "identity name" as given via setname function. - Nothing + Nothing - Nothing - Nothing + - cutFadeOut + setDirection - Terminates the effect in the given layer by fading it out according to the given duration. If named layer used and it doesn't exist, it will be allocated. - For greater efficiency and ease of modability it is recommended to use named layers available with alternative syntax since Arma 3 v1.57.134673 + Set's the orientation of a location. It's area and map icon (if it's type uses an icon) will be rotated to this orientation. - https://community.bistudio.com/wiki/cutFadeOut + https://community.bistudio.com/wiki/setDirection - Number cutFadeOut Number - - String cutFadeOut Number + Location setDirection Number - layer cutFadeOut duration - - layerName cutFadeOut duration + location setDirection direction - $Code$0 cutFadeOut 2;$/Code$ - - $Code$_layer = "layer1" cutFadeOut 2;$/Code$ + $Code$location1 = createLocation ["VegetationPalm", getPos player, 200, 200]; + location1 setText "Benargee's Palm Tree"; + location1 setDirection 45;$/Code$ undefined / undefined - (July 9, 2016) - (ArmA v1.60) - The actual fadeout-duration can be dependent on the duration for the fadein (e.g. specified by cutText ). If the fadein-duration is set to a value less than 1 the fadeout-duration will be the given number multiplied by the fadein-duration. - "test" cutText ["", "BLACK", 0.5, true]; // fadein is 0 - "test" cutFadeout 2; // The actual fadeout-time is 2 * 0.5 = 1 - Nothing - Number + Nothing + - cutObj + deleteTeam - Displays an object defined in the global config in CfgTitles. - For greater efficiency and ease of modability it is recommended to use named layers available with alternative syntax since Arma 3 v1.57.134673 + Destroy given team. - https://community.bistudio.com/wiki/cutObj + https://community.bistudio.com/wiki/deleteTeam - cutObj Array - - Number cutObj Array - - String cutObj Array + deleteTeam Team_Member - cutObj [class, type, speed, showInMap] - - layer cutObj [class, type, speed, showInMap] - - layerName cutObj [class, type, speed, showInMap] + deleteTeam team - $Code$cutObj ["TVSet", "PLAIN"]; - cutObj ["TVSet", "PLAIN", 2]$/Code$ - - $Code$2 cutObj ["Sphere", "PLAIN"];$/Code$ - - $Code$_layer = "layer1" cutObj ["BISLogo", "PLAIN"];$/Code$ + $Code$deleteTeam _team;$/Code$ - undefined / local + undefined / undefined - Nothing - Nothing - Number + Nothing + - cutRsc + exportJIPMessages - Display a resource defined in RscTitles of the mission's Description.ext, the campaign's description.ext or the global config. - For greater efficiency and ease of modability it is recommended to use named layers available with alternative syntax since Arma 3 v1.57.134673 + Export list of JIP to a file. Special: BattlEye's RCON variant of this command is #exportJIPqueue (see also Multiplayer_Server_Commands ) - https://community.bistudio.com/wiki/cutRsc + https://community.bistudio.com/wiki/exportJIPMessages - cutRsc Array - - Number cutRsc Array - - String cutRsc Array + exportJIPMessages String - cutRsc [class, type, speed, showInMap] - - layer cutRsc [class, type, speed, showInMap] - - layerName cutRsc [class, type, speed, showInMap] + exportJIPMessages fileName - $Code$cutRsc ["binocular", "PLAIN"]; - cutRsc ["binocular", "PLAIN", 2]; - cutRsc ["binocular", "PLAIN", 2, false ];$/Code$ - - $Code$2 cutRsc ["binocular", "PLAIN", 2];$/Code$ - - $Code$_layer = "layer1" cutRsc ["binocular", "PLAIN", 2];$/Code$ - - $Code$// Create IGUI display: - "someLayer" cutRsc ["RscTitleDisplayEmpty", "PLAIN"]; - _display = uiNamespace getVariable "RscTitleDisplayEmpty";$/Code$ + $Code$exportJIPMessages "myFileNameWithoutExtension";$/Code$ - undefined / local + undefined / undefined - (30 Jun, 2008) - Using cutRsc (instead of titleRsc ) for a HUD has the benefits of: - having the HUD automatically hide itself when you access the map and redisplay itself after closing the map. - using the 'Direct communication' chat channel messages will not interfere with the HUD by hiding it. - - (17 Oct, 2013) - Regarding removing current resource with cutRsc ["Default", "PLAIN"]. If it does't work and it gives you error message that "Default" is not found, add it by yourself to RscTitles in description.ext so it looks like this: - class RscTitles - { - class Default - { - idd = - 1 ; - fadein = 0 ; - fadeout = 0 ; - duration = 0 ; - } ; - } ; - Alternatively, you can use cutText, yes cutText command to cancel your resources. As Karel Moricky explains: "All 'cut' commands are in the same layer, the same as all 'title' commands are in another one." So to remove cutRsc resource execute cutText on the same layer: - $Code$ cutRsc ["myRsc", "PLAIN"]; //show - cutText ["", "PLAIN"]; //remove$/Code$ - $Code$10 cutRsc ["myRsc", "PLAIN"]; //show - 10 cutText ["", "PLAIN"]; //remove$/Code$ - Also if you use layers would be a good idea to register them with BIS_fnc_rscLayer to avoid possible clashes with other layers: - $Code$("myLayerName" call BIS_fnc_rscLayer ) cutRsc ["myRsc","PLAIN"]; //show - ("myLayerName" call BIS_fnc_rscLayer ) cutText ["","PLAIN"]; //remove$/Code$ - You can also immediately remove resource with cutFadeOut command: $Code$123 cutFadeOut 0;$/Code$ - Nothing - Nothing - Number + Nothing + - cutText + showGPS - Displays a text message in the center of the screen. The text can be displayed on multiple lines by using "\n" new line characters: cutText ["line1\nline2\nline3", "PLAIN"];. Since Arma 3 v1.73.142260 this command supports Structured Text formatting. - For greater efficiency and ease of modability it is recommended to use named layers available with alternative syntax since Arma 3 v1.57.134673 + Shows or hides the GPS receiver on the map screen, if enabled for the mission and you possess the item. (default false ) - https://community.bistudio.com/wiki/cutText + https://community.bistudio.com/wiki/showGPS - cutText Array - - Number cutText Array - - String cutText Array + showGPS Boolean - cutText [text, type, speed, showInMap, isStructuredText] - - layer cutText [text, type, speed, showInMap, isStructuredText] - - layerName cutText [text, type, speed, showInMap, isStructuredText] + showGPS show - $Code$cutText ["","BLACK OUT"]; - cutText ["Hello World!","PLAIN",2];$/Code$ - - $Code$2 cutText ["Hello World!","PLAIN",2];$/Code$ - - $Code$_layer1 = "normal" cutText ["In The Centre","PLAIN"]; - _layer2 = "down" cutText ["At The Bottom","PLAIN DOWN"];$/Code$ - - $Code$// Since Arma 3 v1.73.142260: - cutText [" t color='#ff0000' size='5' RED ALERT! /t br/ ***********", "PLAIN", -1, true, true ];$/Code$ + $Code$showGPS true ;$/Code$ - undefined / local + undefined / undefined - (September 20, 2013) - In Arma 3 "PLAIN" param will display your text where the crosshair is, "PLAIN DOWN" will push the text further down, closer to the bottom of the screen. + (16 Aug, 2009) + In Arma 2, the GPS is now an inventory item. Class path is CfgWeapons- ItemGPS. Use the commands addWeapon and removeWeapon to add or remove it from a unit's inventory. (example: player addweapon "ItemGPS") - (July 6, 2016) - The value for speed has to be greater 0. If 0 is used as speed the default value (1) will be used. - If you want to create an "instant" effect you can use a really small value (e.g. 0.001) + (14 Jun, 2010) + In Arma 2 GPS is also an item, so will not be removed by removeAllWeapons, even though it can be removed by removeWeapon and added by addWeapon. To remove all items use the removeAllItems command (though this will also remove basic items such as map and compass). - Nothing - Nothing - Number + Nothing + - damage + ctrlSetTooltipColorBox - Return the damage value of an object. + Sets tooltip border color of given control. Color is in format Color. - https://community.bistudio.com/wiki/damage + https://community.bistudio.com/wiki/ctrlSetTooltipColorBox - damage Object + Control ctrlSetTooltipColorBox Array - damage object + control ctrlSetTooltipColorBox color - $Code$? (( damage player ) 0.1) : player groupChat "I'm hurt! Medic!"$/Code$ - - $Code$if (( damage player ) 0.1) then { - player groupChat "I'm hurt! Medic!"; - };$/Code$ + $Code$_control ctrlSetTooltipColorBox [1, 0, 0, 1];$/Code$ - global / undefined + undefined / undefined - (February 13, 2015) - The returned value depends on the couple target/ammo fired. This value has no correlation with the sum of all hitpoints damage status and the effective status of the object. Firing bullets on cars often lead to weird results. For example: damage returns zero while a Hunter is fired at will with an.50 HMG! Hunter can be almost destroyed with zero damage for this function. If you script, use instead the getHitPointDamage function. - Number + Nothing + @@ -17614,33 +18463,28 @@ - Number + Number + - date + setPylonsPriority - Return the actual mission date and time as an array [ year, month, day, hour, minute ]$/Code$. Month is a full number between 1 and 12, day is between 1 and 31, hour is between 0 and 23 and minute is between 0 and 59. + Overrides default pylons priorities - https://community.bistudio.com/wiki/date + https://community.bistudio.com/wiki/setPylonsPriority - date + Object setPylonsPriority Array - date + vehicle setPylonsPriority [priority pylon1, priority pylon2,] - $Code$_now = date ; // _now = [2014,10,30,2,30] (Oct. 30th, 2:30am) - _hour = _now select 3; - _min = _now select 4;$/Code$ - - $Code$if ( date select 3 = 19) then { // 7pm - hintSilent "ah, Arma sunset"; //...cue bad guys - };$/Code$ + $Code$( vehicle player ) setPylonsPriority [0,1,2,3,4,5,5,4,3,2,1,0];$/Code$ undefined / undefined @@ -17648,67 +18492,57 @@ - Array + Nothing + - daytime + getSoundController - Returns the current ingame time in hours. + Returns value of the given sound controller. - https://community.bistudio.com/wiki/daytime + https://community.bistudio.com/wiki/getSoundController - daytime + Object getSoundController String - daytime + vehicle getSoundController controller - $Code$; assumme it is 16:30 - _daytime = daytime - returns 16.5$/Code$ + $Code$vehicle player getSoundController "rpm"; //600$/Code$ undefined / undefined - (September 23, 2014) - To change daytime To 24 hour format with hours, minutes, and seconds use this: - $Code$// daytime = 1.66046 - _hour = floor daytime ; - _minute = floor (( daytime - _hour) * 60); - _second = floor ((((( daytime ) - (_hour))*60) - _minute)*60); - _time24 = text format ["%1:%2:%3",_hour,_minute,_second]; - //_time24 = 1:39:37$/Code$ - Note: Not perfect method, "12:03:06" will display as "12:3:6", more script needed to remove this. Other methods might exist for basic functionality. - Number + Number + - deActivateKey + allowCuratorLogicIgnoreAreas - Deactivates the given keyname for the current user profile. The keys are used to unlock missions or campaigns. - See keys, keysLimit and doneKeys in the description.ext file of the missions. + Allows curator placing and working with modules outside of edit areas. - https://community.bistudio.com/wiki/deActivateKey + https://community.bistudio.com/wiki/allowCuratorLogicIgnoreAreas - deActivateKey String + Object allowCuratorLogicIgnoreAreas Boolean - deActivateKey keyname + curatorObj allowCuratorLogicIgnoreAreas allow - $Code$deActivateKey "Mission04Key"$/Code$ + $Code$curatorModule allowCuratorLogicIgnoreAreas true$/Code$ undefined / undefined @@ -17716,145 +18550,266 @@ - Nothing + Nothing + - debriefingText + lineIntersectsObjs - Returns debriefing text. + Returns list of objects intersected by given line from begPos to endPos. - https://community.bistudio.com/wiki/debriefingText + https://community.bistudio.com/wiki/lineIntersectsObjs - debriefingText String + lineIntersectsObjs Array - debriefingText end + lineIntersectsObjs [begPos, endPos, withObj, ignoreObj, sortByDistance, flags] - $Code$_deathText = debriefingText "endDeath";$/Code$ - + - undefined / undefined + global / undefined + (Mar 27, 2014) + Example (in ArmA3 ver 1.14) display objects' array in the middle of the screen sorted by 6 flags: + $Code$ + Sto = []; + Fn = { + { + Sto set [_foreachindex, lineIntersectsObjs [( eyePos player ),( ATLtoASL screenToWorld [0.5,0.5]), objNull, objNull, false,_x]]; + } forEach [1,2,4,8,16,32]; + hintSilent format [" + ONLY_WATER: %1, + NEAREST_CONTACT: %2, + ONLY_STATIC: %3, + ONLY_DYNAMIC: %4, + FIRST_CONTACT: %5, + ALL_OBJECTS: %6", + Sto select 0,Sto select 1,Sto select 2,Sto select 3,Sto select 4,Sto select 5]; + }; + ["sample_id","onEachFrame","Fn"] call BIS_fnc_addStackedEventHandler ; + $/Code$ + + (March 29, 2016) + Distance sorting is relative to object model center, and not intersect position. - String + Array + - debugFSM + deleteAt - Dump (something about FSM) to debugging output. This command is (assumed to be) non-functional in the retail version. - Non functional in retail + Removes array element at the given index and returns removed element (modifies the original array, just like resize or set ). Will not issue error when -1 index is passed making it ideal for using with find command (see Example 2) - https://community.bistudio.com/wiki/debugFSM + https://community.bistudio.com/wiki/deleteAt - Number debugFSM Boolean + Array deleteAt Number - FSMhandle debugFSM true + array deleteAt index - + $Code$_arr = [1,2,3]; + _rem = _arr deleteAt 1; + hint str [_rem, _arr]; //[2,[1,3]]$/Code$ + + $Code$_arr = [1,2,3]; + _arr deleteAt (_arr find 0); // non existent item + hint str _arr; // [1,2,3] + _arr deleteAt (_arr find 2); // existent item + hint str _arr; // [1,3]$/Code$ + undefined / undefined + (October 15, 2014) + $Code$_array deleteAt 0$/Code$ is almost 60x faster than $Code$_array = _array - [_array select 0]$/Code$ (Tested with an array of 10.000 strings, iterating through it using a for-from-to-do loop) + + (March 4, 2016) + Deleting from an array with foreach and _foreachIndex variable is tricky. The array is being altered, the _foreachIndex won't keep up and other elements in the array will be skipped and in worst case not being deleted. + If you delete elements from an array in descending order (using while or for) it will work. + + (February 9, 2017) + To expand on Highheads comment above - this is because forEach implements iterators to traverse a collection, which are read only by definition. + The variable _x is an iterator that points to the current item in the collection. Trying to alter _x will have no effect. + $Code$ARRAY = [1,2,3,4,5,6,7,8]; + { _x = 2; } forEach ARRAY + // ARRAY is still [1,2,3,4,5,6,7,8]$/Code$ + When trying to use deleteAt inside forEach, the behaviour would be undefined as you are invalidating the iterator reference, and it will not know how to traverse to the next element. + In short, only use forEach when reading data from an array. + For more info about iterators, see C++ Iterators. - Nothing + Anything + - debugLog + moveInGunner - Dump argument type and value to debugging output. - This command is non-functional in the retail version + Move soldier into vehicle gunner position (Immediate, no animation). - https://community.bistudio.com/wiki/debugLog + https://community.bistudio.com/wiki/moveInGunner - debugLog Any_Value + Object moveInGunner Object - debugLog anything + unitName moveInGunner vehicle - $Code$debugLog player$/Code$ + $Code$soldierOne moveInGunner tankOne$/Code$ - undefined / undefined + local / global + (August 4, 2006) + Notes from before the conversion: + MP Note Functions MoveInGunner can only be called for local soldiers. They will be ignored for remote soldiers. (see Locality in Multiplayer ) + + In OFP v1.96, the moveIn commands will not trigger an associated getIn event. To ensure the getIn event is fired, use the "getIn Gunner" action command. - Nothing + Nothing + - default + lineIntersectsSurfaces - See switch do. + Returns list of intersections with surfaces from begPosASL to endPosASL. If there is ground intersection, it is also included. Works on units. Works underwater. Doesn't return intersection with sea surface. Hardcoded max distance: 5000m. By default, for speed purposes, command will return only 1st intersection with unique objects. Since Arma 3 v1.69.140138, this could be tweaked with an optional param. NOTE: if begPosASL is under the ground and endPosASL is above it, the command will only return intersection with the ground, this is engine limitation and none of the intersectXXX commands will work when initiated from under the ground. + Since Arma v1.51.131920 it is possible to indicate primary and secondary LOD to look for intersection. Available options are: + "FIRE" + "VIEW" + "GEOM" + "IFIRE" - ("I" stands for Indirect, almost the same as FIRE) + "NONE" + Default LODs are "VIEW" and "FIRE" - https://community.bistudio.com/wiki/default + https://community.bistudio.com/wiki/lineIntersectsSurfaces - default Code + lineIntersectsSurfaces Array - default a + lineIntersectsSurfaces [begPosASL, endPosASL, ignoreObj1, ignoreObj2, sortMode, maxResults, LOD1, LOD2, returnUnique] - $Code$switch (_condition) do { - case 1: { hint "1" }; - case 2: { hint "2" }; - default { hint "default" }; + $Code$_intersections = lineIntersectsSurfaces [ eyePos player, aimPos chopper, player, chopper, true, -1];$/Code$ + + $Code$arrow = "Sign_Arrow_F" createVehicle [0,0,0]; + onEachFrame { + _ins = lineIntersectsSurfaces [ + AGLToASL positionCameraToWorld [0,0,0], + AGLToASL positionCameraToWorld [0,0,1000], + player + ]; + if ( count _ins == 0) exitWith {arrow setPosASL [0,0,0]}; + arrow setPosASL (_ins select 0 select 0); + arrow setVectorUp (_ins select 0 select 1); + hintSilent str _ins; + };$/Code$ + + $Code$// This should detect glass windows and wire fences (since Arma v1.51.131920): + wirefence = "Land_New_WiredFence_5m_F" createVehicle position player ; + arrow = "Sign_Arrow_F" createVehicle [0,0,0]; + onEachFrame { + _ins = lineIntersectsSurfaces [ + AGLToASL positionCameraToWorld [0,0,0], + AGLToASL positionCameraToWorld [0,0,1000], + player, + objNull, + true, + 1, + "GEOM", + "NONE" + ]; + if ( count _ins == 0) exitWith {arrow setPosASL [0,0,0]}; + arrow setPosASL (_ins select 0 select 0); + arrow setVectorUp (_ins select 0 select 1); + hintSilent str _ins; };$/Code$ - undefined / undefined + global / undefined + (August 27, 2015) + Fast check if object is in a house: $Code$KK_fnc_inHouse = { + lineIntersectsSurfaces [ + getPosWorld _this, + getPosWorld _this vectorAdd [0, 0, 50], + _this, objNull, true, 1, "GEOM", "NONE" + ] select 0 params ["","","","_house"]; + if (_house isKindOf "House") exitWith { true }; + false + }; + onEachFrame { hintSilent str ( player call KK_fnc_inHouse)};$/Code$ + + (January 30, 2016) + This command is useful to place weaponholder (and then spawned weapons) on floor of houses, correcting the spawn position (can_collide) to intersect with floor: + $Code$ + MGI_fnc_setPosAGLS = { + params ["_obj", "_pos"]; + _wh_pos = getPosASL _obj; + _pos set [2, ( ATLtoASL _pos select 2)-10]; + _ins = lineIntersectsSurfaces [_wh_pos, _pos,_obj, objNull, true,1,"VIEW","FIRE"]; + _surface_distance = if ( count _ins 0) then [{(_ins select 0 select 0) distance _wh_pos},{0}]; + _wh_pos set [2, ( getPosASL _obj select 2) - (_surface_distance)]; + _weaponholder setPosASL _wh_pos; + }; + $/Code$ + After the position (_pos) obtained in BIS_fnc_buidingPositions array: + $Code$ + _weaponholder = createVehicle ["groundWeaponHolder", _pos, [], 0, "CAN_COLLIDE"]; + [_weaponholder,_pos] call MGI_fnc_setPosAGLS; + Then fill your weapon holder. + $/Code$ - Nothing + Array + - deg + setCamShakeParams - Convert a number from Radians to Degrees. + Set camera shake parameters. + Will not have any effect until shake is started via addCamShake. - https://community.bistudio.com/wiki/deg + https://community.bistudio.com/wiki/setCamShakeParams - deg Number + setCamShakeParams Array - deg x + setCamShakeParams [posCoef, vertCoef, horzCoef, bankCoef, interpolation] - $Code$_degrees= deg 1 - returns 57.295$/Code$ + $Code$setCamShakeParams [0.1, 1, 1, 1, true];$/Code$ undefined / undefined @@ -17862,350 +18817,418 @@ - Number + Nothing + - delete3DENEntities + remoteExec - Delete given entities in Eden Editor, including anything that can be placed in editor. + Asks server to execute given scripted function or script command on given target PC. The environment chosen for the execution is as follows: + Scripted function - scheduled environment ( suspension is allowed, i.e. spawn, execVM ). + Script command - unscheduled environment ( suspension is NOT allowed). + remoteExec can also be used in SP (the same restrictions apply both to SP and MP). For more information about the usage, security features and advanced jip techniques check the remote execution dedicated section. - https://community.bistudio.com/wiki/delete3DENEntities + https://community.bistudio.com/wiki/remoteExec - delete3DENEntities Array + Anything remoteExec Array - delete3DENEntities entities + params remoteExec [functionName, targets, JIP] - $Code$delete3DENEntities ( all3DENEntities select 0); - // removes all objects$/Code$ + $Code$// runs hint "hello" on each connected client + "hello" remoteExec [" hint "];$/Code$ + + $Code$// runs hint "hello" on first connected client + "hello" remoteExec [" hint ", 3];$/Code$ + + $Code$// runs hint "hello" everywhere but server + "hello" remoteExec [" hint ", -2];$/Code$ + + $Code$// runs hint "hello" everywhere but server, JIPs the message + // and returns e.g. "3_1" as a unique JIP id + myJipID = "hello" remoteExec [" hint ", -2, true ];$/Code$ + + $Code$// runs hint "hello" everywhere but server, JIPs the message under ID "some_JIP_ID" + // replacing any previous message with this ID in the JIP queue. + "hello" remoteExec [" hint ", -2, "some_JIP_ID"];$/Code$ + + $Code$// runs "someFuncWithNoArgs" on each connected client + remoteExec ["someFuncWithNoArgs"];$/Code$ + + $Code$// removes a message identified by "IamUnique" from the JIP queue + remoteExec ["", "IamUnique"];$/Code$ + + $Code$// all clients will have their ammo set to 1 for their current weapon + { player setAmmo [ primaryWeapon player, 1];} remoteExec [" bis_fnc_call ", 0];$/Code$ + + $Code$// Object obj will have its ammo set to 1 where it is local + [obj,[ primaryWeapon obj, 1]] remoteExec [" setAmmo ", obj];$/Code$ + + $Code$myJipID = "hello" remoteExec ["", 0]; + if ( isNil "myJipID") then { hint "empty function name is not allowed"; };$/Code$ undefined / undefined + (June 30, 2015) + While it is true that this function executes the desired scripted command/function by calling it, it does not mean remoteExecCall itself will be executed right away. Therefore, calling remoteExecCall is by no means a replacement for calling scripted commands/functions directly. + Example: + remoteExecCall ["func1"]; call func2; // func2 can be executed sooner than func1 + call func1; call func2; // func2 will always execute after func1. + + (December 29, 2015) + 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 class Functions is set to mode = 1;, 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+? \[.*\]"$/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. + + (January 15, 2016) + Executing commands/functions via remoteExec is more faster than using BIS_fnc_MP. Tested with BIS_fnc_codePerformance in ArmA 3 1.52. + $Code$['"string" remoteExec ["hint",player];',[],100] call BIS_fnc_codePerformance ; //Result ~0.1ms$/Code$ + $Code$['["string","hint", player ] call BIS_fnc_MP ;',[],100] call BIS_fnc_codePerformance ; //Result ~0.6ms$/Code$ + + (March 24, 2016) + The INCORRECT way to call reveal command on a certain object for every player: + $Code$[ player, _desired_object] remoteExec ["reveal", 0];$/Code$ + In this case player object will be the object obtained on the computer where remoteExec is initiated. If it is dedicated server, player will be objNull, if it is client, player would be player object on this client. In any case this will not reveal _desired_object for all connected players. + The CORRECT way: + $Code$[_desired_object, { player reveal _this}] remoteExec ["call", 0];$/Code$ + The _desired_object will be identical on every client, this is what we want, but player will refer to individual player on each client, so _desired_object will be revealed to all connected players. + + (May 25, 2016) + When adapting mission from dedicated server for SP, if target used in remoteExec is -2 (execute on every client but not server), in SP this will not execute since client is server in SP. To work around, the target could be set using isMultiplayer condition like this: + $Code$"123" remoteExec ["hint", [0, -2] select isMultiplayer ];$/Code$ + This will execute hint on every client in MP on dedicated server (target -2) and will also execute it in SP (target 0). + + (May 28, 2016) + While KK's solution works fine in sp missions and on dedicated servers, it will not work properly for hosted missions. + Solution: + $Code$[0,0.5] remoteExec [' fadeRadio ',[0,-2] select isDedicated, true ];$/Code$ + Singleplayer: isDedicated returns false - code is executed everywhere (0) + Hosted: isDedicated returns false - code is executed everywhere including host (0) + Dedicated: isDedicated returns true - code is executed everywhere excluding server (-2) + + (Jan 30, 2017) + $Code$[some params] remoteExec ['some command',2,true];$/Code$ + will fail, as you can't use JIP and remoteExec on server only + $Code$[some params] remoteExec ['some command',2]; // works$/Code$ + + (May 10, 2017) + To remoteExec : + $Code$ titleText ["Test Message", "PLAIN", 1];$/Code$ + Use + $Code$[["Test Message", "PLAIN", 1]] remoteExec ["titleText"];$/Code$ - Nothing + Anything + - deleteAt + east - Removes array element at the given index and returns removed element (modifies the original array, just like resize or set ). Will not issue error when -1 index is passed making it ideal for using with find command (see Example 2) + Pre-defined variable for the eastern side. - https://community.bistudio.com/wiki/deleteAt + https://community.bistudio.com/wiki/east - Array deleteAt Number + east - array deleteAt index + east - $Code$_arr = [1,2,3]; - _rem = _arr deleteAt 1; - hint str [_rem, _arr]; //[2,[1,3]]$/Code$ + $Code$// SQS: + ?((side _unit) == east ) : hint "This is a eastern unit!"$/Code$ - $Code$_arr = [1,2,3]; - _arr deleteAt (_arr find 0); // non existent item - hint str _arr; // [1,2,3] - _arr deleteAt (_arr find 2); // existent item - hint str _arr; // [1,3]$/Code$ + $Code$// SQF: + if (( side _unit) == east ) then { + hint "This is a eastern unit!"; + };$/Code$ undefined / undefined - (October 15, 2014) - $Code$_array deleteAt 0$/Code$ is almost 60x faster than $Code$_array = _array - [_array select 0]$/Code$ (Tested with an array of 10.000 strings, iterating through it using a for-from-to-do loop) - - (March 4, 2016) - Deleting from an array with foreach and _foreachIndex variable is tricky. The array is being altered, the _foreachIndex won't keep up and other elements in the array will be skipped and in worst case not being deleted. - If you delete elements from an array in descending order (using while or for) it will work. - - (February 9, 2017) - To expand on Highheads comment above - this is because forEach implements iterators to traverse a collection, which are read only by definition. - The variable _x is an iterator that points to the current item in the collection. Trying to alter _x will have no effect. - $Code$ARRAY = [1,2,3,4,5,6,7,8]; - { _x = 2; } forEach ARRAY - // ARRAY is still [1,2,3,4,5,6,7,8]$/Code$ - When trying to use deleteAt inside forEach, the behaviour would be undefined as you are invalidating the iterator reference, and it will not know how to traverse to the next element. - In short, only use forEach when reading data from an array. - For more info about iterators, see C++ Iterators. + (April 17, 2007) + In ArmA terms OPFOR, BLUFOR, Independents and Civilians are used in the front end UI. - Anything + Side + - deleteCenter + loadGame - In a nutshell, this command removes gaming Side (see createCenter ). If a side has 0 Groups it cannot be deleted. Center can only be created for: east, west, resistance, civilian and sideLogic, therefore only centers from the mentioned sides can be deleted. - Old description: Destroys the AI center of the given side. + Load a game from the autosave. If failed, restart the mission. - https://community.bistudio.com/wiki/deleteCenter + https://community.bistudio.com/wiki/loadGame - deleteCenter Side + loadGame - deleteCenter side + loadGame - $Code$deleteCenter east$/Code$ + $Code$loadGame ;$/Code$ - undefined / global + undefined / undefined - Nothing + Nothing + - deleteCollection + getRelDir - Delete a collection. As example, used with a soldier, it'll hide the ingame model. - When targetting ArmA 2 1.06 or newer, use hideObject instead. This function is a relic from dynamic building destruction development. It is left only for compatibility with scripts created before ArmA 2 1.06, and its functionality may be changed or removed in the future. + Returns direction, which is relative to object's current direction, from given object to another object or position in the range from 0 to 360, the equivalent of BIS_fnc_relativeDirTo. - https://community.bistudio.com/wiki/deleteCollection + https://community.bistudio.com/wiki/getRelDir - deleteCollection Object + Object getRelDir Object/Position2D/Position3D - deleteCollection object + object getRelDir position - $Code$deleteCollection unitName;$/Code$ + $Code$_reldir = player getRelDir tank;$/Code$ - undefined / undefined + global / undefined - (August 20, 2014) - In Arma 3 deleteCollection is alias for hideObject - Nothing + Number + - deleteEditorObject + distance2D - Delete the editor object. Requires all editor object links to be removed prior. - i - Some Old Editor Command + Returns a 2D distance ( distance projected to X,Y plane) in meters between two Objects or two Positions or Object and Position. - https://community.bistudio.com/wiki/deleteEditorObject + https://community.bistudio.com/wiki/distance2D - Control deleteEditorObject String + Object/Array distance2D Object/Array - map deleteEditorObject object + param1 distance2D param2 - + $Code$_meters = player distance2D heli;$/Code$ + - undefined / undefined + global / undefined - Any_Value + Number + - deleteGroupWhenEmpty + removeAllMissionEventHandlers - Marks given group for auto-deletion when group is empty. true will mark the group for auto-deletion, however false will only unmark the group that was marked previously. There are other engine group auto-deletion mechanisms in place, which are not affected by this. - NOTE: It might take up to a minute for the groups marked for auto-deletion when empty to get deleted when they become empty. + Removes all mission event handlers of the given type which were added by addMissionEventHandler. - https://community.bistudio.com/wiki/deleteGroupWhenEmpty + https://community.bistudio.com/wiki/removeAllMissionEventHandlers - Group deleteGroupWhenEmpty Boolean + removeAllMissionEventHandlers String - group deleteGroupWhenEmpty delete + removeAllMissionEventHandlers type - $Code$_group deleteGroupWhenEmpty true ;$/Code$ + $Code$removeAllMissionEventHandlers "Loaded";$/Code$ - global / global + undefined / undefined - Nothing + Nothing + - deleteGroup + addItemToVest - Destroys the given group. Group must be empty and local to the machine executing command. - NOTE: In Arma 3 you can find out locality of the group with local command, unlike with previous games. However owner and setOwner dont work with groups anywhere. The group will always be local to the client that created it, until the client disconnects, then the group becomes local to the server. - In Arma 3 when last unit leaves a group, the group gets auto deleted. Manually deleting all units from a group however, does not auto delete the empty group. To force the group to get auto-deleted when empty use deleteGroupWhenEmpty + Create new item and store it to soldier's vest. The item can also be a weapon or a magazine. - https://community.bistudio.com/wiki/deleteGroup + https://community.bistudio.com/wiki/addItemToVest - deleteGroup Group + Object addItemToVest String - deleteGroup group + unit addItemToVest item - $Code$deleteGroup _groupname$/Code$ + $Code$player addItemToVest "itemGPS";$/Code$ + + $Code$player addItemToVest "hgun_Rook40_F";$/Code$ - local / global + global / global - (December 17, 2006) - The deleteGroup Command does not work when there are living members of in the group. It doesn't error, it simply doesn't do anything. - - (07:50, 10 July 2007 (CEST)) - Living or not doesn't matter - you can't delete the group while it contains any units - even dead ones. It takes few seconds until a dead unit is automatically removed from its group. - - (September 12, 2013) - deleteGroup will only delete local groups even if called by server. Say we have a situation where client creates a group and puts a unit there and later unit dies\gets deleted, server will not be able to delete that empty group until client leaves the game and group ownership switches to server - Nothing + Nothing + - deleteIdentity + synchronizeObjectsAdd - Delete an identity (created with saveIdentity ) from the campaign's progress file. + Add given objects to the unit's list of synchronized objects. - https://community.bistudio.com/wiki/deleteIdentity + https://community.bistudio.com/wiki/synchronizeObjectsAdd - deleteIdentity String + Object synchronizeObjectsAdd Array - deleteIdentity identityName + unit synchronizeObjectsAdd [objects] - $Code$?deleteIdentity "playerIdentity":hint "Delete ok"$/Code$ + $Code$_acm = _groupLogic createUnit ["AmbientCombatManager",position player,[],0,"NONE"]; + _acm synchronizeObjectsAdd [player];$/Code$ - undefined / local + global / global - Boolean + Nothing + - deleteLocation + setFlagSide - Delete a location. + Sets flag Side. A flag may be taken by any unit that is enemy to the side that owns the flag. Just like with setFlagTexture, if the command executed where unit is local effect of the command will be global and JIP compatible. - https://community.bistudio.com/wiki/deleteLocation + https://community.bistudio.com/wiki/setFlagSide - deleteLocation Location + Object setFlagSide Side - deleteLocation location + flag setFlagSide side - $Code$deleteLocation myLocation$/Code$ + $Code$_flag1 setFlagSide east ;$/Code$ + + $Code$// Capturable OPFOR flag: + private _flag = "FlagPole_F" createVehicle position player ; + _flag setFlagTexture "\A3\Data_F\Flags\Flag_CSAT_CO.paa"; + _flag setFlagSide east ;$/Code$ - undefined / undefined + local / global - Nothing + Nothing + - deleteMarkerLocal + kbAddTopic - Destroys the given marker. + Register conversation topic to given person. See Conversations for more details. - https://community.bistudio.com/wiki/deleteMarkerLocal + https://community.bistudio.com/wiki/kbAddTopic - deleteMarkerLocal String + Object kbAddTopic Array - deleteMarkerLocal markerName + person kbAddTopic [topicName, conversationFile, fsmFile, eventHandler] - $Code$deleteMarkerLocal "Marker1"$/Code$ + $Code$player kbAddTopic ["myTest", "myTest.bikb", "myTest.fsm", compile preprocessFileLineNumbers "myTest.sqf"];$/Code$ + + $Code$player kbAddTopic ["itsGettingWarm", "weatherTalk.bikb"];$/Code$ - undefined / local + undefined / undefined - (7 January, 2012) - Unproven: I believe that if you use this command on a globally-created marker, and subsequently another machine executes a global command on the same marker (e.g. setMarkerPos), then the marker will be re-created on the machine it was previously deleted on. Can result in confusing marker behaviour. - Nothing + Nothing + - deleteMarker + curatorPoints - Destroys the given marker. + Returns number of points that curator have. Points can be only in range from 0 to 1. - https://community.bistudio.com/wiki/deleteMarker + https://community.bistudio.com/wiki/curatorPoints - deleteMarker String + curatorPoints Object - deleteMarker name + curatorPoints curatorObj - $Code$deleteMarker "Marker1"$/Code$ + $Code$_points = curatorPoints myCurator;$/Code$ undefined / undefined @@ -18213,29 +19236,37 @@ - Nothing + Number + - deleteRange + objNull - Removes a range of array elements from the given array (modifies the original array, just like resize or set ). + A non-existent Object. To compare non-existent objects use isNull or isEqualTo : + objNull == objNull ; // false + isNull objNull ; // true + objNull isEqualTo objNull ; // true - https://community.bistudio.com/wiki/deleteRange + https://community.bistudio.com/wiki/objNull - Array deleteRange Array + objNull - array deleteRange [from, count] + objNull - $Code$_arr = [1,2,3,4,5,6]; - _arr deleteRange [1,4]; - hint str _arr; //[1,6]$/Code$ + $Code$player == player ; // false if player is null$/Code$ + + $Code$isNull player ; // true if player is null$/Code$ + + $Code$str objNull // NULL-object$/Code$ + + $Code$position objNull // [0,0,0]$/Code$ undefined / undefined @@ -18243,53 +19274,73 @@ - Nothing + Object + - deleteResources + setViewDistance - Delete (unregister) resources of the team member. Resources are deleted in the order they were added. Case insensitive. + Set rendering distance, in metres. Default is 900m (in OFP) or 1,200m (in ArmA), accepted range is 500m to 5,000m (in OFP) or 10,000m (in ArmA). Setting view distance to = 0 resets the value to the one set in Options- Video- General- Visibility- Overall - https://community.bistudio.com/wiki/deleteResources + https://community.bistudio.com/wiki/setViewDistance - Team_Member deleteResources Array + setViewDistance Number - teamMember deleteResources [resource1, resource2,] + setViewDistance distance - $Code$teamMember _agent deleteResources ["Legs"];$/Code$ + $Code$setViewDistance 2250;$/Code$ + + $Code$//reset view distance in Arma 3 + setViewDistance -1;$/Code$ - global / local + undefined / local + In OFP v1.96, view distance also defines the maximum distance between a unit and any other unit they can know about. Higher view distance will involve more AI simulation cycles for every unit, which causes low performance. + + I tested the above and it seems to apply in Arma 2 as well. AI at a bit above 500m would stop engaging when I lowered the view distance down to 500m and re-engaged when I increased it back. + + In ArmA 2 viewDistance can be set up to 15 km with this command ( while from interface only 10 km ) + + (October 15, 2014) + In Arma 3, Values below 200 have no visible effect. + + (November 20, 2014) + To clarify Bernagee's post, values under 200 have no effect. Tested by setViewDistance below 200, then hint viewDistance. It will not go below 200. Also, as object view distance can only be, at a maximum, the view distance, object view distance will also be reset to 200. + + (June 8, 2015) + Client-side max view distance is limited by the server's view distance. + Tested in Arma 3. - Nothing + Nothing + - deleteSite + createSite - Removes the site. + Create a new site. This command is considered deprecated and is no longer supported - https://community.bistudio.com/wiki/deleteSite + https://community.bistudio.com/wiki/createSite - deleteSite Object + String createSite Position - deleteSite site + type createSite pos @@ -18297,57 +19348,62 @@ undefined / undefined + (February 18, 2014) + "CreateSite is an obsolete command from the time in development when Sites were handled separately from other modules. Now they use the modules framework. + If you want a specific Site to be activated during the mission, place it in the editor and use the Condition line in its parameters (the last one)." - Jezuro [1] - Nothing + Object + - deleteStatus + curatorSelected - Delete a status (created with saveStatus ) from the campaign's progress file. + Returns list of all curator selected items. - https://community.bistudio.com/wiki/deleteStatus + https://community.bistudio.com/wiki/curatorSelected - deleteStatus String + curatorSelected - deleteStatus statusName + curatorSelected - $Code$? deleteStatus "playerStatus" : "saved status gone from campaign"$/Code$ + $Code$selectedItems = curatorSelected ;$/Code$ - undefined / global + undefined / undefined - Boolean + Array + - deleteTeam + incapacitatedState - Destroy given team. + Returns the incapacitated state of the given unit. - https://community.bistudio.com/wiki/deleteTeam + https://community.bistudio.com/wiki/incapacitatedState - deleteTeam Team_Member + incapacitatedState Object - deleteTeam team + incapacitatedState person - $Code$deleteTeam _team;$/Code$ + $Code$_result = incapacitatedState player;$/Code$ undefined / undefined @@ -18355,261 +19411,222 @@ - Nothing + String + - deleteVehicleCrew + velocity - Deletes a member of the crew of a vehicle. Human players cannot be deleted. + Return velocity (speed vector) of Unit as an array with format [x, y, z]. Units are in metres per second. - https://community.bistudio.com/wiki/deleteVehicleCrew + https://community.bistudio.com/wiki/velocity - Object deleteVehicleCrew Object + velocity Object - vehicle deleteVehicleCrew unit + velocity vehicleName - $Code$heli deleteVehicleCrew driver heli;$/Code$ + $Code$_vector = velocity jeep;$/Code$ + + $Code$if ( velocity _plane1 select 2 50) then { hint "Aircraft is climbing up too fast!"};$/Code$ - global / global + undefined / undefined - (August 31, 2014) - Not quite sure of the exact use of this command. You can delete AI pilot for example with $Code$ deleteVehicle driver heli;$/Code$ but co-pilot will then jump out. If you use $Code$heli deleteVehicleCrew driver heli;$/Code$ co-pilot stays. - - (April 10, 2015) - Using the following code will remove ALL crew from the given vehicle. - $Code${_myvehicle deleteVehicleCrew _x} forEach crew _myvehicle;$/Code$ - Nothing + Array + - deleteVehicle + ctrlPosition - Deletes an object. Only units inserted in the mission editor and units created during the game's progress can be deleted by this command. Island objects and player units cannot be removed. Deleting a vehicle, which is still being accessed by a running script, can result in a CTD. - NOTE : Actual object deletion, when object becomes objNull, happens on the next frame after command execution, but there are some object modifications that happen immediately. For example if the object is unit in a group, it immediately becomes groupless isNull group _unit; //true + Returns the current position of 2D control as [x, y, w, h] array. For 3D control it returns relative [x,y,z]. - https://community.bistudio.com/wiki/deleteVehicle + https://community.bistudio.com/wiki/ctrlPosition - deleteVehicle Object + ctrlPosition Control - deleteVehicle object + ctrlPosition controlName - $Code$deleteVehicle _house1;$/Code$ - - $Code${ - _x action ["Eject", car]; - } forEach crew car; - deleteVehicle car;$/Code$ - - $Code$// Objects such as - //test_EmptyObjectForBubbles - //test_EmptyObjectForFireBig - //test_EmptyObjectForSmoke - //create additional emitters that needs to be deleted first before deleting the object itself: - ///--- function to delete test object (MP compatible) - fnc_deleteTestObj = { - _this addMPEventHandler ["MPKilled", { - _this = _this select 0; - { - deleteVehicle _x; - } forEach (_this getVariable ["effects", []]); - if ( isServer ) then { - deleteVehicle _this; - }; - }]; - _this setDamage 1; - }; - ///--- example - [] spawn { - _fire = "test_EmptyObjectForFireBig" createVehicle position player ; - sleep 5; - _fire call fnc_deleteTestObj; - };$/Code$ + $Code$_pos = ctrlPosition _control;$/Code$ - global / global + undefined / undefined + (May 22, 2017) + If the ctrl is part of a CtrlGroup the returned position is relative to the ctrlGroups position. - Nothing + Array + - deleteWaypoint + show3DIcons - Removes the specified waypoint. + Toggle the drawing of 3D icons. + i + Some Old Editor Command - https://community.bistudio.com/wiki/deleteWaypoint + https://community.bistudio.com/wiki/show3DIcons - deleteWaypoint Array + Control show3DIcons Boolean - deleteWaypoint [group, index] + map show3DIcons bool - $Code$deleteWaypoint [_grp, 2]$/Code$ - + - global / global + undefined / undefined - (1 Feb, 2008) - In order to change the behavior of a unit currently following a string of waypoints, it is not enough to use deleteWaypoint. The path of the unit is calculated by the waypoints present at start, and the unit will continue according to the original waypoints even if you delete them by using this command. - To achieve the wanted effect, you should rather use setWPPos to the units current position (thereby stopping the unit), and (after a small delay) use deleteWaypoint to remove the waypoints. - - (15 Nov, 2008) - Another (more foolproof) method to avoid the problem of non-deleteable waypoints is to introduce another group (createGroup) and join all units of the present group. A new group will start without any preset waypoints so you can start setting new WPs all over again. - Old group is "_combatGroup", new group is "_combatGroup2" - $Code$_combatGroup2 = createGroup EAST; - {[_x] joinSilent _combatGroup2} forEach ( units _combatGroup); - _combatGroup2 addWaypoint [ getPos player, 25];$/Code$ - - (January 04, 2011) - When you want to remove all waypoints, do NOT iterate over waypoints _group while trying to delete them (an array is by reference!). Instead use an approach like this: - $Code$ - while {( count ( waypoints _group)) 0} do - { - deleteWaypoint (( waypoints _group) select 0); - };$/Code$ - Nothing + Nothing + - detach + setGroupIconsSelectable - Detaches previously attached with attachTo object. + Sets if group icons raises onclick and onover events. - https://community.bistudio.com/wiki/detach + https://community.bistudio.com/wiki/setGroupIconsSelectable - detach Object + setGroupIconsSelectable Boolean - detach object + setGroupIconsSelectable bool - $Code$obj1 attachTo [player]; - detach obj1;$/Code$ + $Code$setGroupIconsSelectable true ;$/Code$ - global / global + undefined / undefined - Nothing + Object + - detectedMines + unassignVehicle - Returns an array of all mines detected by a given side + Unassigns individual unit from a vehicle, i.e removes assignedVehicleRole of the unit. If the unit is currently in that vehicle, the group leader will issue an order to disembark. - https://community.bistudio.com/wiki/detectedMines + https://community.bistudio.com/wiki/unassignVehicle - detectedMines Side + unassignVehicle Object - detectedMines side + unassignVehicle unitName - $Code$detectedMines west ;$/Code$ + $Code$unassignVehicle player ;$/Code$ - $Code$detectedMines side player ;$/Code$ + $Code${ unassignVehicle _x } forEach crew _vehiclename; + // Will make all the occupants of a vehicle disembark$/Code$ - undefined / undefined + local / global + (August 4, 2006) + Notes from before the conversion: + Even though: + {unassignVehicle _x} forEach crew vehiclename + will make all the occupants of a vehicle disembark, if they are the original crew of the vehicle then they will just get back in again. + To prevent this happening also use allowGetIn as in the example below: + {unassignVehicle _x} forEach crew vehiclename; crew vehiclename allowGetIn false - Array + Nothing + - diag_activeMissionFSMs + setAccTime - Returns array with active Mission FSMs. + Set time acceleration coefficient. May be also used to slow time in cutscenes. This command does NOT work in multiplayer. accFactor is clamped to [1/128; 4]. - https://community.bistudio.com/wiki/diag_activeMissionFSMs + https://community.bistudio.com/wiki/setAccTime - diag_activeMissionFSMs + setAccTime Number - diag_activeMissionFSMs + setAccTime accFactor - $Code${ systemChat str _x} forEach diag_activeMissionFSMs ;$/Code$ + $Code$setAccTime 0.1$/Code$ undefined / undefined + (August 4, 2006) + Notes from before the conversion: + A good habit to get into is setting the accTime to 1 at the start of all cutscenes, in case the player is running at 4x speed when the scene starts. - Array + Nothing + - diag_activeSQFScripts + toArray - Returns an array with active SQFs. + Converts the supplied String into an Array of Numbers. + The numbers in the created array are the decimal Unicode representations of characters. - https://community.bistudio.com/wiki/diag_activeSQFScripts + https://community.bistudio.com/wiki/toArray - diag_activeSQFScripts + toArray String - diag_activeSQFScripts + toArray string - $Code${ systemChat str _x} forEach diag_activeSQFScripts ;$/Code$ - - $Code$[] spawn { - hint str diag_activeSQFScripts ; //[[" spawn ","",true,1]] - }; - [] spawn { - scriptName "myScript"; - hint str diag_activeSQFScripts ; //[["myScript","",true,1]] - };$/Code$ + $Code$hint format["%1",toArray("AaŒ")] + // returns "[65,97,338]"$/Code$ undefined / undefined @@ -18617,88 +19634,95 @@ - Array + Array + - diag_activeSQSScripts + lnbPicture - Returns array with active SQSs. + Returns the picture name or path of the item with the given position of the 2D listbox. - https://community.bistudio.com/wiki/diag_activeSQSScripts + https://community.bistudio.com/wiki/lnbPicture - diag_activeSQSScripts + lnbPicture Array + + Control lnbPicture Array - diag_activeSQSScripts + lnbPicture [IDC, [row, column]] + + control lnbPicture [row, column] - $Code${ systemChat str _x} forEach diag_activeSQSScripts ;$/Code$ + $Code$lnbPicture [200, [1, 1]];$/Code$ + + $Code$_control lnbPicture [1, 1]; //"a3\ui_f\data\gui\cfg\ranks\corporal_gs.paa"$/Code$ - undefined / undefined + local / local - Array + String - String + - diag_activeScripts + setTimeMultiplier - Returns 4 element array with numbers of currently running scripts in format: [ spawn -ed, execVM -ed, exec -ed, execFSM -ed] + Sets a time multiplier for in-game time. The command range is now capped at 0.1 - 120 to avoid performance problems. - https://community.bistudio.com/wiki/diag_activeScripts + https://community.bistudio.com/wiki/setTimeMultiplier - diag_activeScripts + setTimeMultiplier Number - diag_activeScripts + setTimeMultiplier value - $Code$hint str diag_activeScripts ; //[0,0,0,1]$/Code$ + $Code$setTimeMultiplier 60;$/Code$ + + $Code$setTimeMultiplier 0.5;$/Code$ - undefined / undefined + undefined / global + This scripting command must be executed on the server to work properly in multiplayer - Array + Nothing + - diag_captureFrame + dynamicSimulationDistance - This command starts counting frames from the moment it is executed and when the count reaches the number passed as param, the current frame is captured and captured data UI dialog appears, similar to diag_captureSlowFrame. - This can also be executed on a dedicated Server and because a Server has no UI it will behave like diag_captureFrameToFile. - Special: BattlEye's RCON variant of this command is #captureFrame - Note : Only available in specific builds. See Performance Profiling for details. + A getter for setDynamicSimulationDistance - https://community.bistudio.com/wiki/diag_captureFrame + https://community.bistudio.com/wiki/dynamicSimulationDistance - diag_captureFrame Number + dynamicSimulationDistance String - diag_captureFrame frame + dynamicSimulationDistance category - $Code$diag_captureFrame 1; //capture the first frame after command execution$/Code$ - - $Code$diag_captureFrame 24; //capture 24th frame after command execution$/Code$ + $Code$hint str dynamicSimulationDistance "Prop";$/Code$ undefined / undefined @@ -18706,33 +19730,28 @@ - Nothing + Number + - diag_captureFrameToFile + triggerDynamicSimulation - This command starts counting frames from the moment it is executed and when the count reaches the number passed as param, the current frame is captured and - written to a log file in the same directory as the.rpt file. - The full Path to the log file is logged to simultaneously. - The data in the log file can be copied and pasted into the diag_captureFrame UI dialog to get a visualisation later on. - Note : Only available in specific builds. See Performance Profiling for details. + Controls ability of given unit to activate entities with disabled Arma_3_Dynamic_Simulation. If false dynamically disabled entities will not be activated by unit presence - https://community.bistudio.com/wiki/diag_captureFrameToFile + https://community.bistudio.com/wiki/triggerDynamicSimulation - diag_captureFrameToFile Number + Object triggerDynamicSimulation Boolean - diag_captureFrameToFile frame + unit triggerDynamicSimulation trigger - $Code$diag_captureFrameToFile 1; //capture the first frame after command execution$/Code$ - - $Code$diag_captureFrameToFile 24; //capture 24th frame after command execution$/Code$ + $Code$player triggerDynamicSimulation false ;$/Code$ undefined / undefined @@ -18740,68 +19759,61 @@ - Nothing + Nothing + - diag_captureSlowFrame + hmd - Opens "capture frame" dialog if current frame exceeds set threshold in seconds. One can indicate to either capture duration of a specific profiling selection or the total duration of the frame. The selection names can be obtained by expanding the profiling tree. Clicking on a tree item will highlight the item on the graph and vice versa. The GUI also provides method of copying of the displayed data to clipboard. Some of the selections: - Render - - bgD3D - Main Thread - - total - - memAl - Visualize - - visul - Mjob - - Mjob - Note : Only available in specific builds. See Performance Profiling for details. + Returns class name of currently used Head Mounted Display. Returns an empty string if the slot is empty. - https://community.bistudio.com/wiki/diag_captureSlowFrame + https://community.bistudio.com/wiki/hmd - diag_captureSlowFrame Array + hmd Object - diag_captureSlowFrame [section, threshold] + hmd unit - $Code$diag_captureSlowFrame ['total',0.003];$/Code$ - - $Code$diag_captureSlowFrame ['memAl', 0.0001];$/Code$ + $Code$_nvgs = hmd player ; //NVGoggles$/Code$ - undefined / undefined + global / undefined - Nothing + String + - diag_codePerformance + set3DENMissionAttributes - Attempts to run given code with given arguments given number of cycles in unscheduled environment and returns average time it took to run the code as well as actual number of executions performed. The command will return as soon as possible if the tested code is slow and the duration of the command exceeds 1 second. Engine alternative to BIS_fnc_codePerformance - NOTE: For security purposes, this command will only run for 1 cycle in MP, unless in-game debug console is available via description.ext option or Eden attribute setting. + Set scenario attributes. + An attribute is identified by its property ( data when it's engine-drive attribute) value in config. For the list of all attributes with their properties, see Setting Attributes. + ! + Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! - https://community.bistudio.com/wiki/diag_codePerformance + https://community.bistudio.com/wiki/set3DENMissionAttributes - diag_codePerformance Array + set3DENMissionAttributes Array - diag_codePerformance [code, arguments, cycles] + set3DENMissionAttributes [[ section, class1, value1 ],, [ section, classN, valueN ]] - $Code$_result = diag_codePerformance [{ private _a = 123;}, 0, 10000];$/Code$ + $Code$set3DENMissionAttributes [["Multiplayer","respawn",3],["Multiplayer","respawnDelay",10]]; + // Set respawn type to 3 and respawn delay to 10 seconds$/Code$ undefined / undefined @@ -18809,61 +19821,77 @@ - Array + Boolean + - diag_drawMode + isNull - Activates specific debug visualization. - Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. + Checks whether the tested item is Null. + Which null type the item has to be equal to depends on the type of game entity tested: + Objects - objNull + Controls - controlNull + Displays - displayNull + Groups - grpNull + Locations - locationNull (since ARMA 2) + Tasks - taskNull (since ARMA 2) + Scripts - scriptNull (since Arma 3 1.29.127075) + Configs - configNull (since Arma 3 1.53.133130) + Note: A test via == does not work, because, for example, objNull is not equal to anything, not even to itself. Use isEqualTo. - https://community.bistudio.com/wiki/diag_drawMode + https://community.bistudio.com/wiki/isNull - diag_drawMode String + isNull Object/Control/Display/Group - diag_drawMode type + isNull entity - $Code$diag_drawMode "normal"$/Code$ + $Code$if ( isNull obj) then { hint "doesn't exist";};$/Code$ - undefined / undefined + global / undefined - (September 6, 2016) - Currently A3 dev branch, diag.exe, version 1.65.138249 has no drawModes available: - $Code$diag_list "drawMode" - []$/Code$ + (December 9, 2015) + isNull does not work with the TEAM_MEMBER type. + Use this instead: + $Code$_tmember isEqualTo teamMemberNull$/Code$ + + (December 9, 2015) + The note in the description does not apply to the CONFIG type, probably due to backwards compatibility. + $Code$configNull == configNull + - true + $/Code$ - Nothing + Boolean + - diag_enabled + attachObject - Checks whether specific diagnostic mode is activated. - Only available in the Arma 3 Diagnostic exe + Attaches a location to the specified object. To detach a location, attach it to objNull. - https://community.bistudio.com/wiki/diag_enabled + https://community.bistudio.com/wiki/attachObject - diag_enabled String + Location attachObject Object - diag_enabled diag_mode + location attachObject object - $Code$"Animation" diag_enable true ; - diag_enabled "Animation";//returns true$/Code$ + $Code$myLocation attachObject player ;$/Code$ undefined / undefined @@ -18871,28 +19899,29 @@ - Boolean + Nothing + - diag_enable + deg - Used to enable/disabled various diagnostics. - Only available in the Arma 3 Diagnostic exe + Convert a number from Radians to Degrees. - https://community.bistudio.com/wiki/diag_enable + https://community.bistudio.com/wiki/deg - String diag_enable Boolean + deg Number - diag_mode diag_enable state + deg x - $Code$"All" diag_enable true$/Code$ + $Code$_degrees= deg 1 + returns 57.295$/Code$ undefined / undefined @@ -18900,153 +19929,204 @@ - Nothing + Number + - diag_fpsMin + ammoOnPylon - Returns minimal framerate. Calculated from the longest frame over last 16 frames. + Returns ammo count on given pylon. + Returns false ( Bool ) on failure. - https://community.bistudio.com/wiki/diag_fpsMin + https://community.bistudio.com/wiki/ammoOnPylon - diag_fpsMin + Object ammoOnPylon String/Number - diag_fpsMin + vehicle ammoOnPylon pylon - $Code$_minfps = diag_fpsMin ;$/Code$ + $Code$_ammoCount = ( vehicle player ) ammoOnPylon "pylon1";$/Code$ + + $Code$hint str (( vehicle player ) ammoOnPylon "pylonCenter");$/Code$ undefined / undefined + (August 18, 2017) + The pylon indices start at 1 and not at 0. - Number + Number/Boolean + - diag_fps + flyInHeight - Returns average framerate calculated over last 16 frames. + Sets the flying altitude for aircraft relatively to the ground surface. Avoid too low altitudes, as helicopters and planes won't evade trees and obstacles on the ground. The default flying altitude is 100 meters. - https://community.bistudio.com/wiki/diag_fps + https://community.bistudio.com/wiki/flyInHeight - diag_fps + Object flyInHeight Number - diag_fps + aircraft flyInHeight altitude - $Code$diag_log diag_fps;$/Code$ + $Code$_helicopter flyInHeight 40$/Code$ - undefined / undefined + local / global - (November 19, 2014) - The engine will always calculate the last 16 frames without caring if they are frames in which the loading screen was drawn, or actual mission frames. + (August 4, 2006) + Notes from before the conversion: + From version 1.80+ - flyInHeight now affects not only helicopters, but also planes. + + (August 4, 2006) + A planes flyInHeight, is restricted to a minimum of 20 meters. + + (December 15, 2008) + A flyInHeight of 0 will keep the chopper pinned to the ground, even when the engines have been started. + + (00:53, 11 April 2009 (CEST)) + If a helo has no waypoints, it will assume a low hover without regard to this setting. - Number + Nothing + - diag_frameNo + vestMagazines - Returns number of frame currently displayed. + Get array with all magazines from vest of the given unit. - https://community.bistudio.com/wiki/diag_frameNo + https://community.bistudio.com/wiki/vestMagazines - diag_frameNo + vestMagazines Object - diag_frameNo + vestMagazines unit - $Code$_currFrameNo = diag_frameNo ;$/Code$ + $Code$vestMagazines player ;[ + "6.5mm 30Rnd STANAG Mag(30/30)[id/cr:4/0](2x)", + "9mm 16Rnd Mag(16/16)[id/cr:7/0](2x)", + "RGO Frag Grenade(1/1)[id/cr:10/0](2x)", + "Smoke Grenade (White)(1/1)[id/cr:12/0](1x)", + "Smoke Grenade (Green)(1/1)[id/cr:13/0](1x)", + "Chemlight (Green)(1/1)[id/cr:14/0](2x)" + ]$/Code$ undefined / undefined - (November 19, 2014) - Avoid using hard-coded frame-specific events, the total amount of drawn frames is persistent across all missions. It does not get reset until the game is closed. - Number + Array + - diag_list + setMass - Returns an array of all diag modes available in the game. - Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. + Changes the mass of an object smoothly during the given time (in seconds). A time of zero (or using the alternative syntax) means an immediate change. - https://community.bistudio.com/wiki/diag_list + https://community.bistudio.com/wiki/setMass - diag_list String + Object setMass Array + + Object setMass Number - diag_list name + myObject setMass [mass, time] + + myObject setMass mass - $Code$diag_list "toggle";$/Code$ + $Code$myObject setMass [10,0.5];$/Code$ - $Code$diag_list "drawMode"$/Code$ + $Code$myObject setMass 10;$/Code$ - undefined / undefined + local / global - (October 7, 2016) - Arma 3 Version 1.65.138660 - $Code$ diag_list "toggle";$/Code$ returns: - ["Force","Animation","Mines","HitPoints","AnimSrcUnit","AnimSrcTarget","Suspension", - "EPEForce","EPEVehicle","ParticleNames","Particles","SurfaceUnder","AISkill","AIDriving", - "AIAiming","AIBrain","AIDynamicError","AISuppression"] + (20 Jun, 2014) + (ArmA3 1.22) A quick reference: + category + setMass + setCenterOfMass + unit + The larger the mass is, the easier a unit will physically fatigued + N/A + aircraft + The larger the mass is, the more sensitive an aircraft will react to joystick, vice versa (Except when AFM is enabled). + Aircraft slant due to center change accordingly, and the position of the camera view will be altered relatively at the same time. (3rd person view) + vehicle + The larger the mass is, the slower a vehicle drives (Ships will sink), vice versa. (Land vehicle performs like a bouncing ball while ships accelerated pretty speedy.) + Vehicle slant due to center change accordingly. + + (March 26, 2015) + If you intend to use setMass in conjunction with ropeCreate in MP i highly recommend to first ropeCreate then setMass (on clientside). + RopeCreate in MP will set the mass of the attached object to the server value upon execution. - Array + Nothing - Nothing + - diag_logSlowFrame + diag_captureSlowFrame - Log all frames, where section takes longer than the threshold (in seconds). + Opens "capture frame" dialog if current frame exceeds set threshold in seconds. One can indicate to either capture duration of a specific profiling selection or the total duration of the frame. The selection names can be obtained by expanding the profiling tree. Clicking on a tree item will highlight the item on the graph and vice versa. The GUI also provides method of copying of the displayed data to clipboard. Some of the selections: + Render + - bgD3D + Main Thread + - total + - memAl + Visualize + - visul + Mjob + - Mjob Note : Only available in specific builds. See Performance Profiling for details. - https://community.bistudio.com/wiki/diag_logSlowFrame + https://community.bistudio.com/wiki/diag_captureSlowFrame - diag_logSlowFrame Array + diag_captureSlowFrame Array - diag_logSlowFrame [section, threshold] + diag_captureSlowFrame [section, threshold] - $Code$diag_logSlowFrame ['total',0.3]$/Code$ + $Code$diag_captureSlowFrame ['total',0.003];$/Code$ + + $Code$diag_captureSlowFrame ['memAl', 0.0001];$/Code$ undefined / undefined @@ -19054,339 +20134,447 @@ - Nothing + Nothing + - diag_log + uiNamespace - Dumps the argument's value to the report file. Each call creates a new line in the file. + Returns the global namespace attached to user interface. - https://community.bistudio.com/wiki/diag_log + https://community.bistudio.com/wiki/uiNamespace - diag_log Anything + uiNamespace - diag_log anything + uiNamespace - $Code$diag_log time ;$/Code$ - - $Code$diag_log format ["%1, %2", player, time ];$/Code$ - - $Code$_arr = [1, "foo", player, "bar"]; - { - diag_log _x ; - } forEach _arr; // Creates 4 entries on 4 lines$/Code$ + $Code$uiNamespace setVariable ["LIB_interruptDisplay", _display];$/Code$ - $Code$_arr = [1, "foo", player, "bar"]; - diag_log _arr; - // Creates one entry of e.g. [1,"foo",B Alpha 1-1:1 (Player Name),"bar"]$/Code$ + $Code$uiNamespace setVariable ["myVar", 46]; + with uiNamespace do { + hint str myVar; //46 + };$/Code$ undefined / undefined - To dump a string without "" use text. - Posted 23:35, 19 April 2011 + variables in uiNamespace are not lost between mission changes, they are carried over. Also take note that the server can make use of uiNamespace. - in patch 1.59 there is a limit of 1044 characters to be printed, no error or crash but diag_log line will simply end at character number 1044. + (29 September, 2014) + ^The same can be said with parsingNamespace. - Nothing + Namespace + - diag_mergeConfigFile + ppEffectAdjust - Adjust configs on-the-fly without the need of restarting the game (by merging the given config file into the main config in memory). Location is relative to the Userdir (default) or mission directory depending on the the value of UserDir [FileName,UserDir]. - Doesn't work with cfgAmmo & few other classes. (Since 1.69, cfgAmmo should be mergeable!) Merging config file means also that you can't delete parameters through diag_mergeConfigFile. Changes applied by diag_mergeConfigFile are applied to all new entities so restart of mission is not necessarily required - spawning vehicle again or changing back forth weapon should usually do the trick. - Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. + Set post process effect parameters. NOTE: The two syntaxes differ in what format of the params they accept. The syntax with PP name expects colors to be packed into arrays within main array, while the syntax with PP handle can handle both flat and packed array. Therefore it is recommended to use the universal packed format, such as shown in the examples. - https://community.bistudio.com/wiki/diag_mergeConfigFile + https://community.bistudio.com/wiki/ppEffectAdjust - diag_mergeConfigFile Array + String ppEffectAdjust Array + + Number ppEffectAdjust Array - diag_mergeConfigFile [PathToConfigOnDrive] + effect ppEffectAdjust settings + + effect ppEffectAdjust settings - $Code$diag_mergeConfigFile ["O:\Arma3\A3\Stuff_F\config.cpp"]$/Code$ + $Code$"colorCorrections" ppEffectAdjust [1, 1, -0.01, [0, 0, 0, 0], [1.5, 1, 1.2, 0.6], [0.199, 0.587, 0.114, 0]];$/Code$ + + $Code$// Black&White: + _colorCorrectionsEffHandle ppEffectAdjust [1, 0.4, 0, [0, 0, 0, 0], [1, 1, 1, 0], [1, 1, 1, 0]];$/Code$ - undefined / undefined + undefined / local - Nothing + Nothing - Nothing + - diag_recordTurretLimits + forceWalk - Start recording tool for creating turret aiming limits. - Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. + Forces unit to walk even if run or sprint is selected. - https://community.bistudio.com/wiki/diag_recordTurretLimits + https://community.bistudio.com/wiki/forceWalk - diag_recordTurretLimits Boolean + Object forceWalk Boolean - diag_recordTurretLimits section + unit forceWalk value - $Code$diag_recordTurretLimits true;$/Code$ + $Code$player forceWalk true ;$/Code$ - undefined / undefined + local / undefined - Nothing + Nothing + - diag_resetShapes + nearTargets - Reload models on-the-fly without the need of restarting the game. Changes applied by diag_resetShapes are applied to all new entities so restart of mission is not necessarily required - spawning vehicle again or changing back forth weapon should usually do the trick. It works only with "-FilePatching" in combination with local data. Command will reload only models present in local data. - Limitation - you can't reload cfgSkeletons (Which is inside model.cfg) - Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. + Returns a list of targets within the defined range. "Targets" are not restricted to enemy units. - https://community.bistudio.com/wiki/diag_resetShapes + https://community.bistudio.com/wiki/nearTargets - diag_resetShapes + Object nearTargets Number - diag_resetShapes + unit nearTargets range - $Code$diag_resetShapes$/Code$ + $Code$player nearTargets 100; + // could return something like this: + //[[[2555.33,2535.33,1.32708],"SoldierEB",EAST,214222,EAST 1-1-A:1],[[2550.39,2482.5,1.32696],"SoldierWB",WEST,0,WEST 1-1-A:2]]$/Code$ undefined / undefined + (Febuary 17, 2011) + A subjective cost greater than 0 does not necessarily mean the target is an enemy unit. Any unit, that have yet to be identified by the unit, have a small positive cost in the range 0 to 1. + + (January 15, 2012) + The quality/detail level of the info depends on the knowsAbout value of the sourceUnit about the targetUnit: + For infantry: + ] 0, 1.5 [ - side unknown, some position offset, identified as SoldierWB + [ 1.5, 1.6 [ - side identified, subjective cost set + [ 1.6, 2 [ - type identified better (USMC_Soldier_Base) + [ 2, 3.6 [ - type identified precisely (USMC_Soldier) + [ 3.6, 4 ] - position identified precisely + The values seems closely linked to the accuracy value of the given targetUnit class and its parents up in the config tree: + 0class CAManBase: Man + 1.6class SoldierWB: CAManBase + 2class USMC_Soldier_Base: SoldierWB + 3.9class USMC_Soldier: USMC_Soldier_Base + For tanks: + ] 0, 0.03 [ - side unknown, some position offset, identified as LandVehicle + [ 0.03, 0.13 [ - type identified better (Tank) + [ 0.13, 0.3 [ - type identified better (M1A1) + [ 0.3, 1.5 [ - side identified, subjective cost set + [ 1.5, 3.6 [ - side identified precisely (CIV), subjective cost adjusted + [ 3.6, 4 ] - position identified precisely + The values seems closely linked to the accuracy value of the given targetUnit class and its parents up in the config tree: + 0class All + class AllVehicles: All + 0.0005class Land: AllVehicles + 0.02class LandVehicle: Land + 0.12class Tank: LandVehicle + 0.25class M1A1: Tank + + (January 17, 2012) + When an unit dies, it's nearTargets array gets emptied after some seconds. + When an unit dies, its reference will get removed from other units nearTargets' arrays immediately. + A target will be removed from the array after about 360 seconds without contact. + + (January 21, 2012) + Position accuracy seems to be a radius in meters from the perceived position. - Nothing + Array + - diag_tickTime + ctData - Real time spent from the start of the game. Expressed in fractions of second. Resolution of 1 tick is 1 ms. + Returns metadata (string) associated with a particular row of RscControlsTable. - https://community.bistudio.com/wiki/diag_tickTime + https://community.bistudio.com/wiki/ctData - diag_tickTime + ctData Control - diag_tickTime + ctData Control - $Code$_start = diag_tickTime ; - //code - _stop = diag_tickTime ; - diag_log format ["%1",_stop - _start];$/Code$ + $Code$ctData _control;$/Code$ - undefined / undefined + local / local - (8 Sept, 2010) - In Arma 2 Operation Arrowhead 1.54.0.72888 this returns the time in seconds since the game was started. - - (25 Jan, 2014) - This command will return time since last client restart as float. However because of Number format used in Arma, the more time has past since restart the less precise the returned value will be. - Number + String + - diag_toggle + difficultyOption - Used to enable/disabled various diagnostics. - Only available in the Arma 3 Diagnostic exe + Checks specific difficulty settings of the current user. Difficulty flag names can be found in the CfgDifficultyPresets config class or in + ArmA profile file under class DifficultyPresets/xxx/Options (xxx being Recruit, Regular or Veteran). + This command replaces difficultyEnabled. - https://community.bistudio.com/wiki/diag_toggle + https://community.bistudio.com/wiki/difficultyOption - diag_toggle String + difficultyOption String - diag_toggle diag_mode + difficultyOption optionName - $Code$diag_toggle "Animation";//enable - diag_toggle "Animation";//disable$/Code$ + $Code$hint str ( difficultyOption "friendlyTags");$/Code$ undefined / undefined + (March 23, 2016) + Arma 3 options: + reducedDamage + groupIndicators + friendlyTags + enemyTags + detectedMines + commands + waypoints + weaponInfo + stanceIndicator + staminaBar + weaponCrosshair + visionAid + thirdPersonView + cameraShake + scoreTable + deathMessages + vonID + mapContent + autoReport + multipleSaves - Nothing + Number + - dialog + lbSetPictureRight - Tests whether any user dialog is open. + Sets the second (right aligned) picture in the item with the given index of the listbox or combobox with id idc of the topmost user dialog. Name is the picture name. The picture is searched for in the mission directory, the dtaExt subdirectory of the campaign directory and the dtaExt directory and the data bank (or directory). + In Arma 3 it might be necessary to set the color of the picture as well with lbSetPictureRightColor as default [0,0,0,0] color makes picture invisible. - https://community.bistudio.com/wiki/dialog + https://community.bistudio.com/wiki/lbSetPictureRight - dialog + lbSetPictureRight Array + + Control lbSetPictureRight Array - dialog + lbSetPictureRight [idc, index, name] + + control lbSetPictureRight [index, name] - $Code$if (! dialog ) then { createDialog "Dialog1";};$/Code$ + $Code$lbSetPictureRight [101, 0, "iskoda"];$/Code$ + + $Code$_control lbSetPictureRight [0, "iskoda"];$/Code$ - undefined / undefined + local / local + More information on the LB command family can be found here - Boolean + Nothing - Nothing + - diarySubjectExists + execVM - Checks whether given subject is present in the diary of given person. + Compiles and adds SQF Script to the scheduler queue and returns script handle. The script is first searched for in the mission folder, then in the campaign scripts folder and finally in the global scripts folder. The script does not execute immediately upon running execVM command, but with some delay. How much delay is unknown as it largely depends on how many other scripts there are in the queue and how busy is VM. The optional argument is passed to the script in private variable _this. In Arma 3 the script handle is also passed to the script in _thisScript variable. + In order to understand execVM consider the following comparison: + $Code$ private _handle = _args execVM "someFile.sqf"; + // is practically identical to + private _handle = _args spawn compile preprocessFileLineNumbers "someFile.sqf";$/Code$ + So if you need multiple execution of the same file, you might want to store it in a function ( Functions Library ), otherwise, for a single execution, execVM is a good choice. - https://community.bistudio.com/wiki/diarySubjectExists + https://community.bistudio.com/wiki/execVM - Object diarySubjectExists String + Anything execVM String + + execVM String - person diarySubjectExists name + arguments execVM filename + + execVM filename - + $Code$_handle = execVM "test.sqf";$/Code$ + + $Code$_handle = player execVM "test.sqf"; + waitUntil { scriptDone _handle};$/Code$ + + $Code$// In Arma 3 this is also possible: + _handle = execVM "123.sqf"; + waitUntil { isNull _handle};$/Code$ + + $Code$[4] execVM "showDamage.sqf"; + // showDamage.sqf + _damage = _this select 0; + hint format ["%1", _damage];$/Code$ + undefined / undefined + (November 23, 2010) + Passing variables to the script file + To pass multiple variables to the script file, use an array e.g: + null = [myunit,1234] execVM "test.sqf"; + Now within test.sqf to access the elements, use the following: + _myunit = _this select 0; + _myvar = _this select 1; - Boolean + Script_Handle - Script_Handle + - didJIP + allDead - Checks if the current client Joined In Progress. + Return a list of all dead units including agents and destroyed vehicles. Dead units may be in vehicles. - https://community.bistudio.com/wiki/didJIP + https://community.bistudio.com/wiki/allDead - didJIP + allDead - didJIP + allDead - $Code$clientDidJIP = didJIP ;$/Code$ + $Code${ deleteVehicle _x } forEach allDead ;$/Code$ + + $Code$// allAlive: + _all = allUnits + vehicles ; + { + _all pushBack agent _x; + } forEach ( agents - [ teamMemberNull ]); + allAlive = _all - allDead ;$/Code$ undefined / undefined - (February 23, 2016) - reports false in CfgFunctions with preInit = 1; even when the client joined in progress. + (April 6, 2017) + This also returns bodies hidden with hideBody until they are deleted. Tested in A2OA 1.63.131129 - Boolean + Array + - didJIPOwner + setUnitRecoilCoefficient - Checks if the current owner of supplied Object Joined In Progress. Server execution only. On clients returns false. + Proportionaly increase/decrease unit's recoil. Drives muzzle up with every shot when supplied positive number and down when negative. 0 cancels recoil. - https://community.bistudio.com/wiki/didJIPOwner + https://community.bistudio.com/wiki/setUnitRecoilCoefficient - didJIPOwner Object + Object setUnitRecoilCoefficient Number - didJIPOwner object + unitName setUnitRecoilCoefficient coefficient - $Code$ownerDidJip = didJIPOwner tank;$/Code$ + $Code$player setUnitRecoilCoefficient 10$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer + (March 28, 2015) + Doesnt seem to work on AI or remote controlled units. Setting the value too high, positive or negative produces some interesting recoil animations. - Boolean + Nothing + - difficultyEnabledRTD + detectedMines - Returns true if rotorlib simulation is enabled. Forcing by mission is included + Returns an array of all mines detected by a given side - https://community.bistudio.com/wiki/difficultyEnabledRTD + https://community.bistudio.com/wiki/detectedMines - difficultyEnabledRTD + detectedMines Side - difficultyEnabledRTD + detectedMines side - $Code$_rtdOn = difficultyEnabledRTD$/Code$ + $Code$detectedMines west ;$/Code$ + + $Code$detectedMines side player ;$/Code$ undefined / undefined @@ -19394,436 +20582,316 @@ - Boolean + Array + - difficultyEnabled + ctrlSetModelScale - This command is deprecated since Arma 3 1.58. Since this version it always returns false. Use difficultyOption instead. See Arma 3 Difficulty Overhaul for further details. - Former functionality: - Checks specific difficulty settings of the current user. Difficulty flag names can be found in the ArmA profile file under class Difficulties/xxx/Flags (xxx being regular or veteran). - Note: stress damage for some reason is a separate difficulty so difficultyEnabled "stressDamageEnabled" might not return correct set value. There are however 2 dedicated commands for it: - enableStressDamage - isStressDamageEnabled - Note: auto trim is also for some reason a separate difficulty so difficultyEnabled "autoTrimEnabled" might not return correct set value. There are also 2 dedicated commands for it: - enableAutoTrimRTD - isAutoTrimOnRTD + Sets 3D control model scale - https://community.bistudio.com/wiki/difficultyEnabled + https://community.bistudio.com/wiki/ctrlSetModelScale - difficultyEnabled String + Control ctrlSetModelScale Number - difficultyEnabled flagName + control ctrlSetModelScale scale - $Code$hint str ( difficultyEnabled "armor");$/Code$ - - $Code$// List current difficulty settings: - call { - private ["_diff", "_cfg", "_flags", "_res"]; - _diff = []; - _cfg = configFile "CfgDifficulties"; - { - _flags = _cfg configName _x "Flags"; - for "_i" from 0 to count _flags - 1 do { - _diff pushBack configName (_flags select _i); - }; - } forEach ("true" configClasses _cfg); - _diff = _diff arrayIntersect _diff; - _diff sort true ; - _res = text ""; - { - _res = composeText [_res, parseText format [ - " t align='left' %1 - %2 /t ", - _x, - [0, 1] select difficultyEnabled _x - ], lineBreak ]; - } forEach _diff; - hint _res; - };$/Code$ + $Code$_ctrl3D ctrlSetModelScale 1.5;$/Code$ undefined / undefined - (June 29, 2015) - Arma 3 Flags: - 3rdPersonView - armor - autoAim - autoGuideAT - autoSpot - autoTrimEnabled - cameraShake - clockIndicator - deathMessages - enemyTag - extendetInfoType - friendlyTag - hud - hudGroupInfo - hudPerm - hudWp - hudWpPerm - map - mineTag - netStats - roughLanding - stanceIndicator - stressDamageEnabled - unlimitedSaves - vonID - weaponCursor - windEnabled - - Possible Values for Arma 2: - 3rdPersonView - armor - autoSpot - autoGuideAT - autoAim - allowSeagull - clockIndicator - deathMessages - enemyTag - friendlyTag - hud - hudPerm - hudWp - hudWpPerm - map - netStats - suppressPlayer - tracers - realisticFatigue - ultraAI - unlimitedSaves - weaponCursor - Boolean + Nothing + - difficultyOption + != - Checks specific difficulty settings of the current user. Difficulty flag names can be found in the CfgDifficultyPresets config class or in - ArmA profile file under class DifficultyPresets/xxx/Options (xxx being Recruit, Regular or Veteran). - This command replaces difficultyEnabled. + Returns whether one value is not equal to another. Both values have need be of the same type. - https://community.bistudio.com/wiki/difficultyOption + https://community.bistudio.com/wiki/a_!%3D_b - difficultyOption String + Anything != Anything - difficultyOption optionName - + - $Code$hint str ( difficultyOption "friendlyTags");$/Code$ - + undefined / undefined - (March 23, 2016) - Arma 3 options: - reducedDamage - groupIndicators - friendlyTags - enemyTags - detectedMines - commands - waypoints - weaponInfo - stanceIndicator - staminaBar - weaponCrosshair - visionAid - thirdPersonView - cameraShake - scoreTable - deathMessages - vonID - mapContent - autoReport - multipleSaves - Number + Boolean + - difficulty + unassignItem - Returns high-level selected difficulty mode. - Returned value will be: 0 (Recruit), 1 (Regular), 2 (Veteran) or 3 (Elite) + Unassigns existing item and tries to put it into inventory. If there is no space in inventory the item simply disappears. - https://community.bistudio.com/wiki/difficulty + https://community.bistudio.com/wiki/unassignItem - difficulty + Object unassignItem String - difficulty + unit unassignItem item - $Code$value = difficulty ;$/Code$ - - $Code$// The command returns the index of selected difficulty as they appear in CfgDifficulties - hint str difficulty ; //Result: 4$/Code$ + $Code$bluforUnit unassignItem "NVGoggles"; + bluforUnit removeItem "NVGoggles"; + opforUnit unassignItem "NVGoggles_OPFOR"; + opforUnit removeItem "NVGoggles_OPFOR"; + independentUnit unassignItem "NVGoggles_INDEP"; + independentUnit removeItem "NVGoggles_INDEP";$/Code$ - undefined / undefined + global / global - Number + Nothing + - directSay + tvAdd - Sends given audio message to the direct channel. Command operates just like xxxxRadio commands, but the sound is played over direct channel and is independent of fadeRadio. The message is defined in CfgRadio in the description.ext file or config radio protocol or a kbAddTopic. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). - Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. + Adds an item with given text to Tree View control. The position on Tree View where to add the item and the actual path to this item once added are different. If item is added to existing item, then parent item path is used. If no parent exists, empty array [] is used. See Tree View Path for more information. - https://community.bistudio.com/wiki/directSay + https://community.bistudio.com/wiki/tvAdd - Object directSay String + tvAdd Array + + Control tvAdd Array - unit directSay radioName + tvAdd [idc, pathParent, text] + + control tvAdd [pathParent, text] - $Code$player directSay configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ + $Code$_index = _ctrl tvAdd [[], "Parent Item"];$/Code$ + + $Code$_index = tvAdd [101, [0], "First item"];$/Code$ - global / local + undefined / undefined - (December 3, 2016) - To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: - $Code$ player directSay "#MySound.ogg";$/Code$ + (Sep 11 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Nothing + Number - Number + - direction + secondaryWeaponMagazine - Returns the direction an object or a location is facing (differs from getDir in that this also works with locations). + Returns either single element array, containing class name of currently loaded in the secondary weapon magazine, or an empty array if unit has no secondary weapon or secondary weapon is not loaded. This command is used for infantry weapons only. - https://community.bistudio.com/wiki/direction + https://community.bistudio.com/wiki/secondaryWeaponMagazine - direction Object/Location + secondaryWeaponMagazine Object - direction object + secondaryWeaponMagazine unit - $Code$player setDir 90; - _d = direction player ;//returns 90$/Code$ + $Code$hint secondaryWeaponMagazine player ; //["NLAW_F"]$/Code$ + + $Code$_array = secondaryWeaponMagazine player ; + if ( count _array 0) then { + hint ("Secondary weapon is loaded with " + (_array select 0) + "!"); + } else { + if ( secondaryWeapon player != "") then { + hint "Secondary weapon is not loaded!"; + } else { + hint "Player doesn't have a secondary weapon!"; + }; + };$/Code$ - global / undefined + undefined / undefined - Number + Array + - disableAI + vectorUpVisual - Disable parts of the AI behaviour to get a better control over the actions of a unit. Must be executed where AI unit is local. If unit changes locality, it might need to be executed again at the new locality to maintain effect. - Possible values are: - "TARGET" - stop the unit to watch the assigned target / group commander may not assign targets - "AUTOTARGET" - prevent the unit from assigning a target independently and watching unknown objects / no automatic target selection - "MOVE" - disable the AI's movement / do not move - "ANIM" - disable ability of AI to change animation. Available only since ArmA: Cold War Assault (OFP 1.99). - "TEAMSWITCH" - AI disabled because of Team Switch - "FSM" - disable the execution of AI behavior scripts. Available only since Operation Arrowhead v1.60. - "WEAPONAIM" - no weapon aiming - "AIMINGERROR" - prevents AI's aiming from being distracted by its shooting, moving, turning, reloading, hit, injury, fatigue, suppression or concealed/lost target Available only since Arma 3 v1.42. - "SUPPRESSION" - prevents AI from being suppressed Available only since Arma 3 v1.42. - "CHECKVISIBLE" - disables visibility raycasts Available only since Arma 3 v1.54. - "COVER" - disables usage of cover positions by the AI Available only since Arma 3 v1.56. - "AUTOCOMBAT" - disables autonomous switching to COMBAT when in danger Available only since Arma 3 v1.56. - "PATH" - stops the AI’s movement but not the target alignment Available only since Arma 3 v1.61. - "MINEDETECTION" - disable Ai mine detection. - "ALL" - all of the above Available since Arma 3 v1.65 - Note: In OFP is no way to undo this command. + Return object's up vector in world Position coordinates ( [x, y, z] ) in render time scope. - https://community.bistudio.com/wiki/disableAI + https://community.bistudio.com/wiki/vectorUpVisual - Object disableAI String + vectorUpVisual Object - unitName disableAI section + vectorUpVisual objectName - $Code$_soldier1 disableAI "AUTOTARGET";$/Code$ + $Code$_vUp = vectorUpVisual vehicle player ;$/Code$ - local / global + global / undefined - (26.9.2013) - After substantial testing in ArmA3 1.01, the AI sections are as follows: - MOVE: disabling this will stop units from turning and moving. Units will still change stance and fire at the enemy if the enemy happens to walk right in front of the barrel. Unit will watch enemies that are in their line of sight, but won't turn their bodies to face the enemy, only their head. Works for grouped units as well. Good for staging units and holding them completely still. Movement can't be controlled by a script either, you have to re-enable movement for that. Unit will still be able to aim within his cone of fire. - AUTOTARGET: Essentially makes single units without a group, "deaf". The unit still goes prone and combat ready if he hears gunfire. They won't turn around when gunfire comes from the behind, but if an enemy walks in front they will target the enemy and fire as normal. WON'T WORK FOR GROUPED UNITS WITH A LEADER, the leader will assign targets to the units and effectively enables the AI back on. - TARGET: Will prevent units from engaging the target. Units still move around for cover etc...but won't hunt down the player. Works in groups as well. Excellent for keeping units inside bases or other areas without having them flank or engage anyone. They will still seek good cover if something is close by. - ANIM: completely freezes the unit, including breathing. Won't even blink. No move command works until the unit is unfrozen. - FSM: Essentially makes the enemy "dumber". Enemies react slower to enemy fire and the enemy stops using hand signals. Disabling FSM, can give the impression of untrained units as they react slower and are more disorganized than when FSM is enabled. Good for rebel fighters and when enabled better for professional armies. - - (August 3, 2006) - Notes from before the conversion: - The "TARGET" section of the AI is likely different than what you would think. Normally, when an AI group is standing still and sees an enemy, the group will break formation and start moving towards the enemy. If you disable the "TARGET" AI, then the AI units will stay where they are at. Even if you disable the "MOVE" AI, the units will still move out to attack the enemy, unless you disable the "TARGET" AI. Disabling both these AI sections is useful when placing units in defensive positions. This way, you can have them stay behind their cover, and not run out into the open. - This command has also a bug: after mission save or load the effect will be no longer active and you must set it again. It's also good way to detect number of saves and loads (loads can be recognized using time command). - - (Feb 7, 2009) - Multiplayer Use as of ArmA v1.14: - Contrary to the post above, using this command WILL disable A.I. movement ability if used with the "MOVE" parameter. Works even when the A.I. is grouped with other units. I use this command to set up stationary targets at objectives all the time. Works on a dedicated server. - - (September 19, 2015) - Beware that disabling "TARGET" AI to units in the player's group will disable the ability to execute engage orders issued by the player. - - (August 24, 2016) - As of version 1.65 dev., disableAI "MOVE" will also stop vehicles driven by AI. - - (September 26, 2016) - Command is buggy in version 1.64.138497 as it disables the ability to drive vehicles for players. Tested with $Code$player disableAI "move"$/Code$. Entering a vehicle is possible, but not starting the engine. $Code$player enableAI "move"$/Code$ enables the player to drive again. - Already in the feedback tracker: https://feedback.bistudio.com/T120346 - Nothing + Array + - disableCollisionWith + lockTurret - Disable collision between vehicles. This commmand doesn't disable collision between PhysX objects. - ! - Command has to be executed where objects are local, and as long as they don't change locality, the effect of this command will be global. - If the 2 objects are not local to the same computer, then it has to be executed on both computers to achieve the desired effect. - If one or both objects change locality, the command needs to be executed again on the new owner 's machine(s) to maintain the effect. + Lock the gunner position of the vehicle turret. This command must be executed where vehicle is local. - https://community.bistudio.com/wiki/disableCollisionWith + https://community.bistudio.com/wiki/lockTurret - Object disableCollisionWith Object + Object lockTurret Array - vehicle disableCollisionWith vehicle + vehicle lockTurret [turret path,lock] - + $Code$vehicleName lockTurret [[0,0], true ];$/Code$ + + $Code$vehicle player lockTurret [[0], true ];$/Code$ + local / global - (April 4, 2015) - disableCollisionWith is basically a script that when you apply it to an object, and your unit can go through it like a ghost. However, if you wish the object to be solid again, you may wish to use the enableCollisionWith. - An example for this is: - $Code$//name of unit in editor such as player1 - //name of object in editor such as barrel1 - barrel1 disableCollisionWith player1; - //to make the barrel solid again, do this as vice versa if you know what your doing! - barrel1 enableCollisionWith player1 $/Code$ - On a side note: this can come in handy a lot if you want a unit to sit on the back of a car or on top of a container - Nothing + Nothing + - disableConversation + curatorMouseOver - Disable the ability to talk to other people. + Returns Curator Editable Object under curator mouse pointer in form of array: + [] - when not in curator mode + [""] - if no curator editable object under the pointer in curator mode + [ typeName, Curator Editable Object ] - if there is curator editable object under the pointer in curator mode - https://community.bistudio.com/wiki/disableConversation + https://community.bistudio.com/wiki/curatorMouseOver - Object disableConversation Boolean + curatorMouseOver - unitName disableConversation disable + curatorMouseOver - $Code$player disableConversation true$/Code$ - - $Code$soldier1 disableConversation true$/Code$ + $Code$_mouseOver = curatorMouseOver ; + // possible return value:[ + "OBJECT", + 3594ab00# 164218: apc_wheeled_01_cannon_f.p3d + ]$/Code$ undefined / undefined - (July 10, 2009) - Note that this will also prevent you from using group radio. - If you just want player unable to speak to others (or one particular soldier), - use $Code$player setVariable ["BIS_noCoreConversations", true];$/Code$ - or, for the other soldier, - $Code$unitName setVariable ["BIS_noCoreConversations", true];$/Code$ - - (August 18, 2010) - My previous note is incorrect now, you can use disableConversation and still use the group radio, at least in A2:OA ! - Nothing + Array + - disableDebriefingStats + isUAVConnectable - Disable debriefing score table. - This command is broken. + Returns true if UAV is connectable by AV terminal(s). - https://community.bistudio.com/wiki/disableDebriefingStats + https://community.bistudio.com/wiki/isUAVConnectable - disableDebriefingStats + Object isUAVConnectable Array - disableDebriefingStats + object isUAVConnectable [uav, checkAllItems] - $Code$disableDebriefingStats ;$/Code$ + $Code$connectable = unit isUAVConnectable [uav,true];$/Code$ undefined / undefined @@ -19831,318 +20899,268 @@ - Nothing + Boolean + - disableNVGEquipment + getElevationOffset - Enables or disables transport NV (Night Vision). To disable TI (Thermal Imaging) use disableTIEquipment. + Returns the map elevation offset from [map]/config.cpp. + Returns 0 if there's no elevationOffset defined in the config of the current world. - https://community.bistudio.com/wiki/disableNVGEquipment + https://community.bistudio.com/wiki/getElevationOffset - Object disableNVGEquipment Boolean + getElevationOffset - vehicle disableNVGEquipment state + getElevationOffset - $Code$myTank disableNVGEquipment true ;$/Code$ + $Code$_offset = getElevationOffset ;$/Code$ - global / global + undefined / undefined - Nothing + Number + - disableRemoteSensors + openYoutubeVideo - This command will halt raycasting calculations (on the local machine only) for all groups which don't contain any local entities. If a group contains a single local entity then calculations will still be performed for the entire group. - These raycasts are used to determine what other entities an entity can see, and they take a lot of CPU time. This is of course a bit of a trick, because rather than a true optimization, it disables part of the simulation. However, there are certainly types of scenarios where these raycasts are not needed. An example is a fully Player-versus-Player scenario, where the visibility between every combination of player entity is not needed. So why not disable this by default? There are cases where you do require these raycasts, for example in stealth scenarios. Without them, commands like knowsAbout, nearTargets and targetKnowledge will only function for local units! The commands themselves are local, can be used on servers and clients, and the state is reset when the scenario ends. So, carefully consider whether your scenario can benefit from this method. + Opens Steam overlay with given YT video. Video URL is the end part of the YT URL, starting with watch?v=.... If the user has Steam overlay disabled, the command will display appropriate message to the user and return false. - https://community.bistudio.com/wiki/disableRemoteSensors + https://community.bistudio.com/wiki/openYoutubeVideo - disableRemoteSensors Boolean + openYoutubeVideo String - disableRemoteSensors state + openYoutubeVideo youTubeUrl - $Code$disableRemoteSensors false;$/Code$ + $Code$//Open http://www.youtube.com/watch?v=UBIAbm7Rt78 + _isOpened = openYoutubeVideo "watch?v=UBIAbm7Rt78";$/Code$ - undefined / local + undefined / undefined - Nothing + Boolean + - disableSerialization + inRangeOfArtillery - Disable saving of script containing this command. After this, the script can work with data types which do not support serialization (UI types). - NOTE : When using spawn command, if the argument passed to it is Display or Control, an error will show asking to consider to disable serialization because of use of _this variable. What's more neither disableSerialization no use of uiNamespace will solve this. Passing Display or Control as part of an array however, will do the job: - $Code$ findDisplay 46 spawn { hint str _this}; // serialization error - [ findDisplay 46] spawn { hint str (_this select 0)}; // OK $/Code$ + Returns true if all given units are able to fire at given position with given magazineType. - https://community.bistudio.com/wiki/disableSerialization + https://community.bistudio.com/wiki/inRangeOfArtillery - disableSerialization + Position inRangeOfArtillery Array - disableSerialization + pos inRangeOfArtillery [[unit], magazineType] - $Code$disableSerialization ; - _display = findDisplay 46;$/Code$ + $Code$_isInRange = getMarkerPos "myTarget" inRangeOfArtillery [[myArty], "32Rnd_155mm_Mo_shells"]$/Code$ - undefined / undefined + global / undefined - (19 June, 2010) - Can be used to detecting load. Scope with disabled serialization is discontinued after load, even if there's endless loop inside. - _loaded = [] spawn { disableSerialization ; waitUntil { false };}; - waitUntil { scriptDone _loaded;}; - hint "Game was loaded!" - Works for all possible load types - loading user save, loading autosave and resuming mission from main menu. - Use with caution, as it handles two threads in memory, having impact at overall scripting time. - - (23 October, 2013) - If you do not store UI elements ( Display, Control ) in variables, you do not need disableSerialization ; UI elements are usually returned by scripting commands such as findDisplay or passed as params in UI event handler scripts ( displayAddEventHandler, ctrlAddEventHandler ). - This code will require disableSerialization : $Code$ disableSerialization ; - _display = findDisplay 123; - _ctrl = _display displayCtrl -1; - _ctrl ctrlSetText "LOL";$/Code$ - This code will not: $Code$ findDisplay 123 displayCtrl -1 ctrlSetText "LOL";$/Code$ - - (July 25, 2017) - In ArmA 3 1.72.142223, a scripted FSM does somehow not work with disableSerialization. As a workaround, store a display inside an array. - Example: $Code$_d = [ findDisplay idd ];$/Code$ + (July 10, 2015) + Using an empty artillery vehicle will return false. - Nothing + Boolean + - disableTIEquipment + set3DENIconsVisible - Disables TI (Thermal Imaging) equipment for given vehicle. In older versions of Arma this command would also disable NV (Night Vision), but since Arma 3 v1.52.132676 this command disables only TI. Use disableNVGEquipment to disable NV. + Toggle visibility of Eden Editor icons. - https://community.bistudio.com/wiki/disableTIEquipment + https://community.bistudio.com/wiki/set3DENIconsVisible - Object disableTIEquipment Boolean + set3DENIconsVisible Array - vehicle disableTIEquipment state + set3DENIconsVisible [showMap, showScene] - $Code$vehicle player disableTIEquipment true ;$/Code$ - - $Code$_tank disableTIEquipment true ;$/Code$ + $Code$set3DENIconsVisible [ false, false ]; + // Hide all icons$/Code$ - global / global + undefined / undefined - Nothing + Nothing + - disableUAVConnectability + removeMenuItem - Disables unit's AV terminal(s) connecting to UAV. + Removes a previously added menu item. + i + Some Old Editor Command - https://community.bistudio.com/wiki/disableUAVConnectability + https://community.bistudio.com/wiki/removeMenuItem - Object disableUAVConnectability Array + Control removeMenuItem Number - object disableUAVConnectability [uav, checkAllItems] + map removeMenuItem index - $Code$unit disableUAVConnectability [uav,true];$/Code$ - + undefined / undefined - Nothing + Nothing + - disableUserInput + debriefingText - Disable and enable the keyboard and mouse input, usually used during cutscenes. - Be careful with the usage of this command, always remember to enable the user input again, as once the user input is disabled, you can only shut down OFP but not exit the mission with escape. + Returns debriefing text. - https://community.bistudio.com/wiki/disableUserInput + https://community.bistudio.com/wiki/debriefingText - disableUserInput Boolean + debriefingText String - disableUserInput state + debriefingText end - $Code$disableUserInput true - ; cutscene - disableUserInput false$/Code$ + $Code$_deathText = debriefingText "endDeath";$/Code$ - undefined / local + undefined / undefined - (14 March 2014) - Sometimes, when disableUserInput true command is invoked while the user is holding a button, when disableUserInput false is called and the user is no longer holding the button, the input will resume as if the user is still holding the button. To reset this behaviour, disable and enable user input again in the same frame: - $Code$ disableUserInput true ; - //do something - disableUserInput false ; - disableUserInput true ; - disableUserInput false ;$/Code$ - Unfortunately, if the user is moving mouse when disableUserInput true command is invoked, the mouse input will get stuck for the whole duration of disabled user input but will reset as soon as disableUserInput false is called. I was unable to find workaround for this one. - Nothing + String + - displayAddEventHandler + gearSlotAmmoCount - Adds an event handler to the given display. Returns the ID of the event handler, or -1 when failed. - Returning true in EH code will override default engine handling for keyboard events. - See User Interface Event Handlers for the full list of event names. - If applicable, see DIK_KeyCodes for a list of key code constants, which are relevant to key related user interface events like: KeyDown & KeyUp. - NOTE: Display EHs are processed in reversed order, i.e. last added: first, first added: last. So if you have an override it should be set up in the 1st added EH. + Returns ammo count of assigned magazine. - https://community.bistudio.com/wiki/displayAddEventHandler + https://community.bistudio.com/wiki/gearSlotAmmoCount - Display displayAddEventHandler Array + gearSlotAmmoCount Control - display displayAddEventHandler [eventName, code] + gearSlotAmmoCount control - $Code$moduleName_keyDownEHId = ( findDisplay 46) displayAddEventHandler ["KeyDown", " hint str _this;"];$/Code$ - - $Code$moduleName_keyDownEHId = findDisplay 46 displayAddEventHandler ["KeyDown", { hint str _this}];$/Code$ + $Code$ammo = gearSlotAmmoCount _control;$/Code$ undefined / undefined - (October 30, 2013) - As of Arma 3 v1.05.111658 ctrlAddEventHandler and displayAddEventHandler support script Code in addition to String [1] - - (March 10, 2014) - From within an Addon, you must assign the events from a spawned script. eg $Code$[] spawn { (findDisplay 46) displayAddEventHandler["KeyDown","_this call my_KeyDownFunctionhandler"]; };$/Code$ - - (January 22, 2016) - Be sure to wait until the main display is initialized before using this command by using: $Code$waituntil {!isnull (finddisplay 46)};$/Code$ - - (May 28, 2017) - use #define if you want the displayEventHandler to use data that is defined in the same file in which the command is executed. - However, that does not work if you use STRING as 'code'. In case of STRING, use the format command around it. - - (August 7, 2017) - Using KeyUp you can't override default engine action by returning true ( A3 1.72.142342 ) - Number + Number + - displayCtrl + preloadCamera - Return child control with specified idc. + Preload all textures and models around given Position to avoid visual artifacts after camera is moved. + Should be used before any abrupt camera change/cut. + Returns true once all data is ready. - https://community.bistudio.com/wiki/displayCtrl + https://community.bistudio.com/wiki/preloadCamera - Display displayCtrl Number + preloadCamera Array - display displayCtrl idc + preloadCamera position - $Code$_ChildControl = _ParentDisplay displayCtrl 101;$/Code$ + $Code$waitUntil { preloadCamera markerPos "cam_location_2"};$/Code$ undefined / undefined - (May 1, 2017) - Since Arma 3 1.42 you can also return a control inside a controls group using controlsGroupCtrl (created with ctrlCreate or inside a controls[] of a control config). Example: - $Code$((uiNamespace getVariable "RscUnitInfo") displayCtrl 2303) controlsGroupCtrl 154; // Display - Controls Group - Control$/Code$ - Note that control inside controls group having -1 IDC currently cannot be returned in any way. - Control + Boolean + - displayNull + isInstructorFigureEnabled - A non-existing Display. To compare non-existent displays use isNull or isEqualTo : - displayNull == displayNull ; // false - isNull displayNull ; // true - displayNull isEqualTo displayNull ; // true + Returns the status of INSTRUCTOR FIGURE setting in UI (OPTIONS GAME GENERAL INSTRUCTOR FIGURE). - https://community.bistudio.com/wiki/displayNull + https://community.bistudio.com/wiki/isInstructorFigureEnabled - displayNull + isInstructorFigureEnabled - displayNull + isInstructorFigureEnabled - $Code$! isNull displayNull ; // false$/Code$ - - $Code$str displayNull ; // No display$/Code$ + $Code$hint str isInstructorFigureEnabled ;$/Code$ undefined / undefined @@ -20150,79 +21168,89 @@ - Display + Boolean + - displayParent + missionName - Returns parent display of the given display. + Return currently loaded mission file (path to mission.pbo, relative to game exe). - https://community.bistudio.com/wiki/displayParent + https://community.bistudio.com/wiki/missionName - displayParent Display + missionName - displayParent display + missionName - $Code$_display = displayParent findDisplay 49; // Display #46$/Code$ - + undefined / undefined + (2nd August, 2010) + Only works in SP and on the MP Host/DS. It returns the mission pboprefix if available, otherwise the pboname. For clients it returns '__cur_mp'. + + (September 25, 2014) + In OFP (up to v1.96) it returns the mission filename. In CWA (since v1.99), it returns the briefing name instead when in multiplayer. The string displayed is that set in the Intel section of the mission editor. - Display + String + - displayRemoveAllEventHandlers + camPrepareRelPos - Remove all event handlers from the given display. + Prepares the camera position relative to the current position of the currect target (see camPrepareTarget ). - https://community.bistudio.com/wiki/displayRemoveAllEventHandlers + https://community.bistudio.com/wiki/camPrepareRelPos - Display displayRemoveAllEventHandlers String + Object camPrepareRelPos Array - display displayRemoveAllEventHandlers handlerName + camera camPrepareRelPos position - + $Code$_camera camPrepareRelPos [10,5,-2]$/Code$ + undefined / undefined - Nothing + Nothing + - displayRemoveEventHandler + findEditorObject - Remove a given event handler from the given display. + Return object that matches the provided reference. + i + Some Old Editor Command - https://community.bistudio.com/wiki/displayRemoveEventHandler + https://community.bistudio.com/wiki/findEditorObject - Display displayRemoveEventHandler Array + Control findEditorObject Any_Value - display displayRemoveEventHandler [handler name,id] + map findEditorObject value @@ -20230,268 +21258,223 @@ undefined / undefined - (April 19, 2015) - If you for example used this code to add the eventHandler: - $Code$_myEH = (findDisplay 46) displayAddEventHandler ["KeyDown", "hint str _this"];$/Code$ - Then this would be the correct code to remove that eventHandler again: - $Code$(findDisplay 46) displayRemoveEventHandler ["KeyDown", _myEH];$/Code$ - Nothing + String + - displaySetEventHandler + ctrlScale - Sets given event handler of given display. - The return code of the provided function should indicate whether this event was handled correctly. This implies telling the engine whether it's default code should be executed. - See User Interface Event Handlers for the full list of handler names. - If applicable, see DIK_KeyCodes for a list of key code constants, which are relevant to key related user interface events like: KeyDown & KeyUp. + Returns the current scale of the control. - https://community.bistudio.com/wiki/displaySetEventHandler + https://community.bistudio.com/wiki/ctrlScale - Display displaySetEventHandler Array + ctrlScale Control - display displaySetEventHandler [handlerName, function] + ctrlScale controlName - $Code$_control displaySetEventHandler ["KeyDown", ""]$/Code$ - - $Code$init.sqf - keyspressed = compile preprocessFile "keyspressed.sqf"; - _display = findDisplay 46; - _display displaySetEventHandler ["KeyDown","_this call keyspressed"]; - keyspressed.sqf - private['_handled']; - _handled = false; - switch (_this select 1) do - { - //F key - case 33: - { - // code here - _handled = true; - }; - }; - _handled;$/Code$ + $Code$_scale = ctrlScale _control$/Code$ undefined / undefined - (Nov 25, 2009) - Always use displayAddEventHandler instead, as DSetEH overwrites other (peoples') DEH. - Nothing + Number + - dissolveTeam + visibleCompass - Dissolves the given team. All members become members of the main team. Possible team values are: "RED", "GREEN", "BLUE" or "YELLOW". + Checks if the player has compass opened and visible - https://community.bistudio.com/wiki/dissolveTeam + https://community.bistudio.com/wiki/visibleCompass - dissolveTeam String + visibleCompass - dissolveTeam teamColor + visibleCompass - $Code$dissolveTeam "RED"$/Code$ + $Code$if ( visibleCompass ) then { hint "Compass is visible"};$/Code$ - local / undefined + undefined / undefined - Nothing + Boolean + - distance2D + enableRopeAttach - Returns a 2D distance ( distance projected to X,Y plane) in meters between two Objects or two Positions or Object and Position. + Enable/disable ability to attach or be attached to ropes for given vehicle - https://community.bistudio.com/wiki/distance2D + https://community.bistudio.com/wiki/enableRopeAttach - Object/Array distance2D Object/Array + Object enableRopeAttach Boolean - param1 distance2D param2 + vehicle enableRopeAttach enable - $Code$_meters = player distance2D heli;$/Code$ + $Code$( vehicle player ) enableRopeAttach false ;$/Code$ - global / undefined + undefined / undefined + (05 April, 2014) + Attachable nearby vehicles may not update on Sling Load Assistant until re-opened. - Number + Nothing + - distanceSqr + removeWeaponTurret - Computes the squared distance between two objects or positions. + Removes weapon from the turret. Use turret path [-1] for driver's turret. - https://community.bistudio.com/wiki/distanceSqr + https://community.bistudio.com/wiki/removeWeaponTurret - Object/Position distanceSqr Object/Position + Object removeWeaponTurret Array - var1 distanceSqr var2 + vehicle removeWeaponTurret [weaponName, turretPath] - $Code$player distanceSqr ( leader player )$/Code$ + $Code$_tank removeWeaponTurret ["LMG_M200",[0,0]];$/Code$ - $Code$_distance = sqrt ((x2 - x1) ^ 2 + (y2 - y1) ^ 2 + (z2 - z1) ^ 2); - _distanceSqr = (x2 - x1) ^ 2 + (y2 - y1) ^ 2 + (z2 - z1) ^ 2; - _distance = [x1, y1, z1] distance [x2, y2, z2]; - _distanceSqr = [x1, y1, z1] distanceSqr [x2, y2, z2]; - _distance = sqrt ([x1, y1, z1] distanceSqr [x2, y2, z2]); - _distanceSqr = ([x1, y1, z1] distance [x2, y2, z2]) ^ 2;$/Code$ + $Code$vehicle player removeWeaponTurret ["SportCarHorn",[-1]];$/Code$ - undefined / undefined + local / global - Number + Nothing + - distance + sideEmpty - Returns a distance in meters between Objects, Positions or Locations. - NOTE: If positions are supplied as arguments, the coordinates are treated as PositionATL if over the land and as PositionASLW if over the sea. If 2D position is supplied, z is assumed 0. + Returns empty side, for example static buildings in Eden Editor. - https://community.bistudio.com/wiki/distance + https://community.bistudio.com/wiki/sideEmpty - Object/Array distance Object/Array - - Location/Array distance Location/Array + sideEmpty - param1 distance param2 - - location1 distance location2 + sideEmpty - $Code$_meters = player distance _object;$/Code$ - - $Code$_meters = player distance [1,2,3];$/Code$ - - $Code$_meters = [1,2,3] distance [4,5,6];$/Code$ - - $Code$_meters = position player distance nearestLocation [ position player, "hill"];$/Code$ + $Code$_sideEmpty = sideEmpty ;$/Code$ - global / undefined + undefined / undefined - (Feb 14, 2007) - distance to position3D (array) doesnt work with OFP, only objects - Armed Assault: - position3D (array) and object works - - (Mar 10, 2010) - This returns the map distance, not the vector distance, [0,0,0] distance [0,0,1] can be 1 or 1, not exactly 1; unlike the vector math. - - (Aug 03, 2012) - If a position in format [x, y, z] is provided for both arguments, distance also checks the z dimension as well. Ie: - player distance [0,0,200] - will return 200, if the player is at this position at ground/sea level. - - (March 22, 2014) - When objects are supplied as arguments, distance is calculated from their model center (object modelToWorld [0,0,0]), and not the position returned by getPos/ATL/ASL. - However, this is not relevant for units, as their model center matches their world position. - Number - Number + Side + - distributionRegion + addWaypoint - Returns the numerical index for the distribution region of this copy of ArmA. - 1 - US - 2 - Rest of the world + Adds (or inserts when index is given) a new waypoint to a group. + The waypoint is placed randomly within a circle with the given center and radius. + The function returns a waypoint with format [group, index]. - https://community.bistudio.com/wiki/distributionRegion + https://community.bistudio.com/wiki/addWaypoint - distributionRegion + Group addWaypoint Array - distributionRegion + groupName addWaypoint [center, radius, index, name] - $Code$distributionRegion == 1$/Code$ + $Code$_wp =_grp addWaypoint [ position player, 0];$/Code$ - undefined / undefined + global / global + (November 26, 2009) + In game versions prior to Arma 3 v1.22: + If you add a waypoint to your group and then want them to start moving to that waypoint, make sure to call setWaypointType "MOVE" on your waypoint. + + (18:23, 28 April 2011 (CEST)) + In VBS2 1.30, the randomization of addWaypoint doesn't seem to work correctly all of the time. + The alternative syntax of addWaypoint with a specified index doesn't seem to work correctly. + + (June 21, 2014) + if you want to create a waypoint of type "MOVE" and set it as actual waypoint, you can use the move command that does everything for you with only one line of code ! Be aware that move command intercepts multiple waypoints and it will not line up in waypoints queue. In other word it is a quick solution if you want your group to get only one waypoint, but for several waypoints you'll have to use addwaypoint and all setwaypointXXXXXX commands around. see move command. + + (August 4, 2014) + The waypoint may not be created exactly at the center position even if radius is zero. The position will be moved away if there are e.g. rocks at the center position or if it is placed at the edge of water on a shore. - Number + Array + - do + leaderboardGetRows - Executes code. Used as part of construct, such as while, with, for and switch. The code is always executed in missionNamespace unless do is used with with as an argument. + Returns an array with values for the given leaderboard, the array is in format: [[player1Name, score, rank], [player2Name, score, rank], [player3Name, score, rank]... ]; This can be called after the one of the row request function has been called and successfully finished! - https://community.bistudio.com/wiki/do + https://community.bistudio.com/wiki/leaderboardGetRows - While_Type/With_Type/For_Type/Switch_Type do Code + leaderboardGetRows String - construct do code + leaderboardGetRows boardName - $Code$while {b a} do {a = a + 1};$/Code$ - - $Code$// A practical example: Repair all members of a group to such a level that they are able to stand up: - { - while {! canStand _x && alive _x } do { - _x setDamage ( damage _x - 0.01); - }; - } forEach units group unitname;$/Code$ + $Code$leaderboardGetRows "TT01"$/Code$ undefined / undefined @@ -20499,418 +21482,452 @@ - Anything + Array + - do3DENAction + visibleMap - Performs given Eden Editor action. - See the list of all actions. + Return true if the main map is shown (active). - https://community.bistudio.com/wiki/do3DENAction + https://community.bistudio.com/wiki/visibleMap - do3DENAction String + visibleMap - do3DENAction action + visibleMap - $Code$do3DENAction "MissionSave";// saves the scenario$/Code$ + $Code$if (visibleMap) then {hint "You're showing the map !"}$/Code$ undefined / undefined + (13 November 2017) + visibleMap does not work in all cases where a map might be part of a dialog like in a uav terminal or in a artillery computer dialog. Some of these cases can be covered with an addMissionEventHandler of type "Map". Just use the two magic variables 'mapIsOpened' and 'mapIsForced'. Skeleton might look something like + // update marker as long as map is open (works for uav stations as well) + J_myGPSEH = addMissionEventHandler ["Map", { + params ["_mapIsOpened", "_mapIsForced"]; + if (_mapIsOpened) then { + systemChat "GPS aktiv"; + J_var_GPSOn = true; + // no sheduled environment - create one + /* Triggered when map is opened or closed either by user action or script command openMap. */ + [] spawn { + waitUntil{ + ... // do something as long as map is open; + not J_var_GPSOn + }; + }; + } else { + J_var_GPSOn = false; + systemChat "GPS inaktiv"; + }; + }]; - Nothing + Boolean + - doArtilleryFire + allowFileOperations - Orders a unit to reload defined magazine commence fire burst on the given position (silently). + Allow/dissallow file ops (load/save etc). + i + Some Old Editor Command - https://community.bistudio.com/wiki/doArtilleryFire + https://community.bistudio.com/wiki/allowFileOperations - Object doArtilleryFire Array + Control allowFileOperations Boolean - unit doArtilleryFire [position, type, rounds] + map allowFileOperations bool - $Code$mortar1 doArtilleryFire [[3000, 120, 1000], "8Rnd_82mm_Mo_shells", 3];$/Code$ - + undefined / undefined - Nothing + Nothing + - doFSM + assignToAirport - Orders a unit to process command defined by FSM file (silently). - Unlike with execFSM where _this is passed to the FSM, the following parameters are passed when using doFSM/commandFSM: - _leader - leader of subgroup with this command - _destination - command destination/position - _target - command target - _units - list of all persons in subgroup + Not correctly implemented yet, currently it does the same as landAt. As the implementation may get fixed sometime, please do not use this command until then. - https://community.bistudio.com/wiki/doFSM + https://community.bistudio.com/wiki/assignToAirport - Object/Array doFSM Array + Object assignToAirport Number + + Object assignToAirport Object - unit doFSM [fsmName, position, target] + plane assignToAirport id + + plane assignToAirport target - $Code$_soldierOne doFSM ["move.fsm", position player, player ];$/Code$ + $Code$plane1 assignToAirport 0$/Code$ undefined / undefined - (August 4, 2010) - Do not doStop a unit in a FSM called with doFSM or commandFSM. Doing so nevertheless will halt your FSM, since no links are followed anymore (doing so in an end state should be fine though). Also this may crash your game in certain mysterious circumstances. - You may design your FSM so that they may be called with doFSM/commandFSM and execFSM likewise by checking if _units or _this is nil and then init the variables accordingly. Just remember that you should use the low level moveTo (together with moveToCompleted, moveToFailed ) if do-/commandFSM'd, and doMove or commandMove (together with unitReady ) if execFSM'd. A moveTo in an FSM started with execFSM won't do anything, likewise doMove in a FSM started with doFSM or commandFSM wont work either. Think about it for a minute and you will see why. (hint: a unit running a FSM called with doFSM or commandFSM will _never_ return true for (unitReady _unit) ) - Anyway, if you want to be able to call your FSM either way, a "ready" condition might look light this: (moveToCompleted _unit) || (moveToFailed _unit) || (unitReady _unit), assuming you have a moveTo or a doMove (depending on how the fsm is called) in the prior state. - - (February 14, 2015) - Adding to Rübe's note, doFSM can be checked if it has finished by unitReady as of 2015 and it will return true when your FSM has completed. - Nothing + Nothing - Nothing + - doFire + setSimpleTaskAlwaysVisible - Order the given unit(s) to fire on the given target (without radio messages). - The target is set with doTarget or commandTarget. - The target can be a unit or a vehicle, but not an object. + Makes the given task allways visible or not. - https://community.bistudio.com/wiki/doFire + https://community.bistudio.com/wiki/setSimpleTaskAlwaysVisible - Object/Array doFire Object + Task setSimpleTaskAlwaysVisible Boolean - unitName doFire target + taskID setSimpleTaskAlwaysVisible state - $Code$_ESoldier1 doFire _WSoldier1;$/Code$ + $Code$getWarka setSimpleTaskAlwaysVisible true ;$/Code$ - local / global + undefined / undefined - (August 3, 2006) - Notes from before the conversion: - It is often helpful to use doTarget first. - - (March 25, 2007) - A unit will not execute this command when his behaviour is set to "careless". - - (Feb 18, 2012) - Board dofire not working in arma2 1.11. an entity he throws he shoots not only. - - (June 7, 2012) - Unitname dofire objnull does not work like it does in commandfire. Target var has to be real (Arma2 AO) might be different in other versions. - Nothing + Nothing + - doFollow + enginesRpmRTD - Order the given unit(s) to follow the given other unit or vehicle eg (without radio messages). Also is used to resume unit formation after doStop, just doFollow leader even if it is the leader himself you want to resume (see Example 2). + Returns all engines RPM - https://community.bistudio.com/wiki/doFollow + https://community.bistudio.com/wiki/enginesRpmRTD - Object/Array doFollow Object + enginesRpmRTD Object - unitName doFollow unitName2 + enginesRpmRTD RTD_helicopter - $Code$_soldier1 doFollow _soldier2$/Code$ - - $Code$units _group doFollow leader _group;$/Code$ + $Code$_UH80_E1 = ( enginesRpmRTD _UH80) select 0;//engine 1 RPM + _UH80_E2 = ( enginesRpmRTD _UH80) select 1;//engine 2 RPM$/Code$ - local / global + undefined / undefined - These commands ( doFollow or commandFollow ) work only if the two units are in the same group. - - (August 29, 2016) - The name of this command is a bit misleading, it is used to make a unit return to the formation of its group or subformation. - Nothing + Array + - doGetOut + isRemoteExecutedJIP - Orders a unit or units to get out from the vehicle (silently). + Returns true if the code context is being remote executed from the JIP queue by remoteExec or remoteExecCall (when JIP param was set). It is a subset of isRemoteExecuted : + Normal remote execution: + isRemoteExecuted - true + isRemoteExecutedJIP - false + Remote execution from JIP queue: + isRemoteExecuted - true + isRemoteExecutedJIP - true + In SP always returns false. - https://community.bistudio.com/wiki/doGetOut + https://community.bistudio.com/wiki/isRemoteExecutedJIP - doGetOut Object/Array + isRemoteExecutedJIP - doGetOut unit + isRemoteExecutedJIP - $Code$doGetOut _unitOne$/Code$ + $Code$_remoteExecutedJIP = isRemoteExecutedJIP ;$/Code$ - local / global + undefined / undefined - Nothing + Boolean + - doMove + createSimpleTask - Order the given unit(s) to move to the given position (without radio messages). After reaching his destination, the unit will immediately return to formation (if in a group); or order his group to form around his new position (if a group leader). Use doStop to stop units returning to formation. + Creates a new Task. The task effect is local, it will only exist on PC it was added. - https://community.bistudio.com/wiki/doMove + https://community.bistudio.com/wiki/createSimpleTask - Object/Array doMove Array + Object createSimpleTask Array - unit doMove position + person createSimpleTask [name, parentTask ] - $Code$_soldier1 doMove ( position _officer);$/Code$ + $Code$_currentTask = player createSimpleTask ["NewTask"];$/Code$ - $Code$this doMove ( getMarkerPos "Marker1");$/Code$ + $Code$_childTask = player createSimpleTask ["ChildTask", _currentTask];$/Code$ - local / global + global / local - (February 9, 2008) - If doMove is to be used in conjunction with waypoint behavior commands (e.g. setSpeedMode ), then those have to be issued after the move command to have an effect. Otherwise the move will be done with the default settings. - - (February 3, 2009) - If a unit is part of a group, and is not the leader, the unit will fall back into formation soon after the domove is completed. This does not happen for units that are in a group alone (because they are their own leader). - There is no single command to get a unit to move to a position and stay there. The best way to do this is to issue a domove, then wait for the unit to reach his destination, then disable his movement AI. VBS2 users can use the fn_vbs_doMoveEx function. + (July 02, 2011) + Creating child will position the new task just under the parent task. + Creating another "normal" (parent) task will create a new line above the others. Think of it if you want ordered objectives. + Succeeding parent task will automatically succeed childs, whatever their taskState was set to. (I.E. If a task is set as a child to another, it will be completed when its parent is complete.. no matter if the child task really was or not). + This command has to be executed again for it to be applied for JIP players - no server sync + Full step by step code from beginning to end: + Step 1: create a new simpleTask + $Code$ + A_SIMPLE_TASK = player createSimpleTask [( localize "STR_aSimpleTask")]; + $/Code$ + You may create a task at any given point in time. You just need to be aware of the fact, that you've created the task for a single unit (the player). So if you make use of teamSwitch, respawn or similiar, you need to think about how to manage this, so all of these units will have up to date tasks assigned to them. + Second, it's a good practice to use a stringtable, even if you do not plan (yet) to offer translations. + Step 2: task destination + $Code$ + A_SIMPLE_TASK setSimpleTaskDestination _destination; + $/Code$ + variable/pointer-to-your-task setSimpleTaskDestination some-position. That's it. + Step 3: task description + $Code$ + A_SIMPLE_TASK setSimpleTaskDescription [ + ( localize "STR_aSimpleTaskLongText"), + ( localize "STR_aSimpleTask"), + ( localize "STR_aSimpleTaskWaypointLabel") + ]; + $/Code$ + Again, no magic involved here. You take your task, the command setSimpleTaskDescription an pass an array with three strings in it. The first string is the long description text, the second is the name/title of the task and the last one will show up on-screen on the waypoint in cadet mode. + Step 4: set and update task states + $Code$ + A_SIMPLE_TASK setTaskState "CREATED"; + $/Code$ + And that's it. Here a minimal working example: + $Code$ + A_SIMPLE_TASK = player createSimpleTask ["simple task title"]; + A_SIMPLE_TASK setSimpleTaskDestination ( position player ); + A_SIMPLE_TASK setSimpleTaskDescription [ + "simple task long description", + "simple task title", + "simple task waypoint label" + ]; + A_SIMPLE_TASK setTaskState "CREATED"; + $/Code$ + And then later in the mission: + $Code$ + A_SIMPLE_TASK setTaskState "SUCCEEDED"; + $/Code$ + If you want to keep the player in the loop about the status of tasks, you may always do this: + $Code$ + [ objNull, objNull, A_SIMPLE_TASK, "SUCCEEDED"] execVM "CA\Modules\MP\data\scriptCommands\taskHint.sqf"; + $/Code$ - Nothing + Task + - doStop + getDirVisual - Order the given unit(s) to stop (without radio messages). The units stopped in this way will leave the groups formation. It will prevent them from moving around with their group (or formation leader), while still being able to turn around and even move to a new position if they see fit. The units will still respond to orders from their group leader (like engage, rearm, board a vehicle), but all of their actions will be separate from the group formation. To resume group default behaviour, use doFollow command. For example: units _group doFollow leader _group; + Returns object's heading in the range from 0 to 360 in render time scope. - https://community.bistudio.com/wiki/doStop + https://community.bistudio.com/wiki/getDirVisual - doStop Object/Array + getDirVisual Object - doStop unit + getDirVisual object - $Code$doStop _soldier1;$/Code$ - - $Code$doStop [_soldier1, _soldier2];$/Code$ - - $Code$doStop ( units player );$/Code$ + $Code$_dir = getDirVisual player ;$/Code$ - global / global + global / undefined - (August 3, 2006) - Notes from before the conversion: - This command will make the unit stop where he is until the unit's group engages the enemy. At that time, the unit will move and fight the enemy. One good use for this is to place a bunch of units in the same group around a campfire or in some other place "for looks", and make them sit down or have their weapon on their back. When the enemy is spotted, they will get up and attack. Note that you cannot do something like place somebody behind sandbags and keep him there during a fight with this command. For that you will need disableAI "move". - - In ArmA 1.14, this command will not stop a unit that has been given a move order by selecting the unit, then clicking on the in game map (or ground). - - doStop'ed units WILL return to formation if their leader's behaviour isn't set to "COMBAT". The squad leader will also order everyone to return to formation if there are no enemies nearby in a set period of time, overwriting the doStop command. doStop can be best used to simply stop the unit from doing whatever he is currently doing without radio messages. - - (December 23, 2016) - When a unit reaches position given with doMove, unitReady becomes true. If doStop command is not executed, unit will start wondering on its own soon after, especially if unit is under fire. doStop will keep unit at the given position, but watch out for unitReady as it will become false since unit is holding position indefinitely. - - (December 27, 2016) - Although it is possible to resume group default behaviour by joining units into own group like this units _group joinSilent _group there is a risk that the leader will change. Instead use doFollow command as explained in the description. - Nothing + Number + - doSuppressiveFire + joinString - Order the given unit to suppress a given position or target (without radio messages). + Joins array into String with provided separator. Array can be of mixed types, all elements will be converted to String prior to joining, but the fastest operation is on the array of Strings. - https://community.bistudio.com/wiki/doSuppressiveFire + https://community.bistudio.com/wiki/joinString - Object/Array doSuppressiveFire Object/Array + Array joinString String - unitName doSuppressiveFire target + array joinString separator - $Code$_soldier doSuppressiveFire [1869.508,5760.962,0.000]$/Code$ + $Code$_str = "- This, is a sample string." splitString "-,. "; // ["This","is","a","sample","string"] + _str joinString " "; // "This is a sample string"$/Code$ - $Code$_soldier doSuppressiveFire cursorTarget$/Code$ + $Code$["This","is","sparta"] joinString " ~ "; // "This ~ is ~ sparta"$/Code$ + + $Code$["1",2, text "3"] joinString ""; // "123"$/Code$ + + $Code$["test","test"] joinString toString [12345] splitString toString [12345]; // ["test","test"]$/Code$ + + $Code$"Japa is the best!" splitString "" joinString " "; // "J a p a i s t h e b e s t !"$/Code$ + + $Code$// Remove all \r\n from file: + loadFile "somefile.txt" splitString toString [13,10] joinString " "$/Code$ - local / local + undefined / undefined - (October 8, 2016) - Command expects position as second argument in format ASL in A3 1.64.138497. - Nothing + String + - doTarget + setLightDayLight - Order the given unit(s) to target the given target (without radio messages). + Sets if light can be used during the day. - https://community.bistudio.com/wiki/doTarget + https://community.bistudio.com/wiki/setLightDayLight - Object/Array doTarget Object + Object setLightDayLight Boolean - unit doTarget target + light setLightDayLight bool - $Code$_ESoldier1 doTarget _WSoldier1;$/Code$ + $Code$myLight setLightDayLight true;$/Code$ - local / global + local / local - It appears doTarget objNull can not be used to stop a unit targeting a previously assigned target. Using doWatch objNull will achieve the desired result. (ArmA v1.12Beta) - - (July 2, 2015) - To expand on ceeeb's note, commandWatch objNull will also unassign target; - - (March 28, 2017) - Targeting may not work as expected when trying to target a unit on the same side (friendly). - Nothing + Nothing + - doWatch + vectorDirVisual - Order the given unit(s) to watch the given position or target (without radio messages). Use objNull as the target to order a unit to stop watching a position/target. + Return object's normalized direction vector in world space ( [x,y,z] ) in render time scope. + A unit facing North would return [0,1,0] + A unit facing East would return [1,0,0] + A unit facing South would return [0,-1,0] + A unit facing West would return [-1,0,0] - https://community.bistudio.com/wiki/doWatch + https://community.bistudio.com/wiki/vectorDirVisual - Object/Array doWatch Array - - Object/Array doWatch Object + vectorDirVisual Object - unit doWatch position - - unit doWatch target + vectorDirVisual objectName - $Code$_soldierOne doWatch markerPos "MarkerMoveOne" - // The unit named "soldierOne" will watch the position where the marker "MarkerMoveOne" is placed.$/Code$ - - $Code$_soldierOne doWatch _eastSoldier - // The unit named "soldierOne" will watch the unit named "eastSoldier".$/Code$ + $Code$_dirVector = vectorDirVisual _unit;$/Code$ - local / global + global / undefined - (April 18, 2015) - Also controls where a vehicle gunner aims. - Nothing - Nothing + Array + - doorPhase + setAirportSide - Return animation phase of door on vehicle. + Set owning side of the airport. ID is the number to identify which airport on the island you want to check. - https://community.bistudio.com/wiki/doorPhase + https://community.bistudio.com/wiki/setAirportSide - Object doorPhase String + Number setAirportSide Side + + Object setAirportSide Side - object doorPhase door + id setAirportSide side + + target setAirportSide side - $Code$_phase = heli doorPhase "door_L";$/Code$ + $Code$0 setAirportSide east$/Code$ undefined / undefined @@ -20918,671 +21935,604 @@ - Number + Nothing - Nothing + - drawArrow + isPlayer - Draws a single line arrow on the map. To draw a color filled arrow of custom shape see BIS_fnc_drawArrow + Checks if given person is player. Returns true for headless clients as well. + In some cases, the identity of certain player units might fail to propagate to other clients and the server, which causes isPlayer and getPlayerUID to incorrectly return false and "", respectively, where the affected units are not local. [1] Therefore, beware of false negatives. - https://community.bistudio.com/wiki/drawArrow + https://community.bistudio.com/wiki/isPlayer - Control drawArrow Array + isPlayer Object - map drawArrow [from, to, color] + isPlayer person - $Code$findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", - { - _this select 0 drawArrow [ - player, player getRelPos [100, 0], [1,0,0,1] - ]; - }];$/Code$ + $Code$if ( isPlayer _Soldier1) then { + _Soldier1 setDamage 1; + };$/Code$ + + $Code$_playerCount = { isPlayer _x} count playableUnits ;$/Code$ - undefined / undefined + global / undefined - (July 7, 2015) - Be careful when using this command. Unlike map markers, the draw commands can decrease your framerate. + (1 August, 2006) + This is not the same as testing object == player, because in MP it tests for any player, not only for the local one. If object is a vehicle, the test is done for the vehicle commander. - Nothing + Boolean + - drawEllipse + linearConversion - Draws an ellipse on the map. Just like with marker or trigger area, negative a and b will result in hexagon. + Converts given value from given "from" range to wanted "to" range. If clipping is set to true, the resulting value is guaranteed to be within "to" range no matter what. Say given range is 0 to 1 and wanted range is 0 to 100 (percent calculation). Given value 0.55 then will be linearConversion [0,1,0.55,0,100]; //55 but if given value is 1.1 linearConversion [0,1,1.1,0,100, false ]; //110 or if clipping is true linearConversion [0,1,1.1,0,100, true ]; //100 - https://community.bistudio.com/wiki/drawEllipse + https://community.bistudio.com/wiki/linearConversion - Control drawEllipse Array + linearConversion Array - map drawEllipse [c, a, b, angle, color, fill] + linearConversion [minFrom, maxFrom, value, minTo, maxTo, clip] - $Code$findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", + $Code$linearConversion [4, 8, 5, 0, 1, false ];$/Code$ + + $Code$// Calculate days from 1/1/1970: + fnc_daysFromEpoc = { - _this select 0 drawEllipse [ - player, 10, 10, 0, [1, 0, 0, 1], "" - ]; - _this select 0 drawEllipse [ - player, -10, -10, 0, [1, 1, 1, 1], "#(rgb,8,8,3)color(1,0.6,0,1)" - ]; - _this select 0 drawEllipse [ - player, -10, -10, 90, [0, 0, 1, 1], "" - ]; - }];$/Code$ + private _year = param [0]; + private _days = 0; + for "_i" from 1970 to _year - 1 do + { + _days = _days + round linearConversion [0, 1, dateToNumber [_i, 12, 31, 23, 59], 0, 365, false ]; + }; + _days + linearConversion [0, 1, dateToNumber _this, 0, 365, false ]; + }; + hint str ( date call fnc_daysFromEpoc);$/Code$ undefined / undefined - (July 7, 2015) - Be careful when using this command. Unlike map markers, the draw commands can decrease your framerate. + (Mar 29, 2014) + (A3 0.50) It is recommended to use linearConversion instead of BIS_fnc_linearConversion : + $Code$ linearConversion [0,100,50,0,50, true ]; //same as [[0,100],50,[0,50]] call BIS_fnc_linearConversion $/Code$ + As for clamp, true will disable new value out of its range while false won't: + $Code$ linearConversion [0,100,150,0,50, true ]; //return 50 + linearConversion [0,100,150,0,50, false ]; //return 75 + $/Code$ - Nothing + Number + - drawIcon3D + setLightUseFlare - Draws an ingame icon at a given position. Command has to be executed each frame. Use onEachFrame or addMissionEventHandler "Draw3D" + Sets if light has flare. - https://community.bistudio.com/wiki/drawIcon3D + https://community.bistudio.com/wiki/setLightUseFlare - drawIcon3D Array + Object setLightUseFlare Boolean - drawIcon3D [texture, color, pos, width, height, angle, text, shadow, textSize, font, textAlign, drawSideArrows] + light setLightUseFlare bool - $Code$// Icon and text: - onEachFrame { - drawIcon3D ["targetIcon.paa", [1,1,1,1], getPos cursorTarget, 1, 1, 45, "Target", 1, 0.05, "TahomaB"]; - };$/Code$ - - $Code$// Just text: - addMissionEventHandler ["Draw3D", { - drawIcon3D ["", [1,0,0,1], position cursorTarget, 0, 0, 0, "Target", 1, 0.05, "PuristaMedium"]; - }];$/Code$ + $Code$myLight setLightUseFlare true ;$/Code$ - undefined / undefined + local / local - (August 31, 2013) - As command syntax indicates, this command expects icon position in format PositionAGL meaning that over the land it expects PositionATL and over the sea PositionASLW. Use additional ASLToAGL if needed. - To draw smooth moving icon for a moving object use visiblePosition and visiblePositionASL accordingly. - - (September 23, 2013) - This command works well with addon textures, however getting it to display mission textures is a bit tricky. Follow this guide : - - (April 19, 2014) - Just a little precision to KK's first comment, this command expects PositionASLW over the sea, not regular ASL. Luckily, modelToWorld returns ATL over land and ASLW over sea, so if you want the icon to stay the the same place, you should use this snippet to find the correct position: - $Code$_pos = visiblePositionASL _object; - _pos set [2, (_object modelToWorld [0,0,0]) select 2];$/Code$ - - (October 23, 2014) - drawIcon3D and BIS_fnc_addStackedEventHandler work well together. - Using formatting commands with drawIcon3D will not work, instead, they will be added to the string. - $Code$["uniqueID", "onEachFrame", - { - drawIcon3D["myIcon.jpg", [1,1,1,0.5], getPos player, 1, 1, 0, format["%1\n%2", "Dreaded", "Entity"]]; - }] call BIS_fnc_addStackedEventHandler;$/Code$ - Shown text will be Dreaded\nEntity. (A3 1.32.127785) - The "text" parameter must be a string. You cannot use Structured_Text. - $Code$["uniqueID", "onEachFrame", - { - drawIcon3D - [ - "myIcon.jpg", - [1,1,1,0.5], - getPos player, - 1, - 1, - 0, - parseText format[" t size='1.25' font='PuristaLight' color='#ff0000' %1%2 /t ", Dreaded, Entity] - ]; - }] call BIS_fnc_addStackedEventHandler;$/Code$ - (A3 1.32.127785) - - (November 13 (2014)) - Here's a practical example combining both drawLine3D and drawIcon3D. Note: You may want to use visiblePosition instead of getPos for moving objects. - $Code$DEADPILOTS = []; - { - if (getText (configfile "CfgVehicles" typeOf _x "textSingular") == "pilot") then { - DEADPILOTS pushBack _x; - }; - } forEach allDeadMen; - addMissionEventHandler ["Draw3D", { - if ( - { - player distance _x = 15 - } count DEADPILOTS 0 - ) then { - { - _corpsePos = getPos _x; - if (player distance _corpsePos = 15) then { - _line1_start = _corpsePos; - _line1_end = [(_line1_start select 0), (_line1_start select 1), 0.5]; - _line2_start = [(_line1_end select 0), (_line1_end select 1) + 0.5, (_line1_end select 2)]; - drawLine3D [_line1_start, _line1_end, [0,0,0,0.5]]; - drawLine3D [_line1_end, _line2_start, [0,0,0,0.5]]; - drawIcon3D ["\a3\ui_f\data\gui\cfg\hints\BasicLook_ca.paa", [0,0,0,0.5], _line2_start, 0.75, 0.75, 0]; - }; - } forEach DEADPILOTS; - }; - }]; - $/Code$ - - (April 11, 2015) - Doesn't work when showHUD false, textAlign is broken, drawSideArrows will turn if angle is not 0 [1] - - (February 11, 2016) - You can also use getPosWorld, which works splendid in script performance. Here is an example: - $Code$addMissionEventHandler ["Draw3D", { _pos = getPosWorld player; drawIcon3D ["a3\ui_f\data\gui\Rsc\RscDisplayArsenal\radio_ca.paa", [1,1,1,1], [(_pos select 0),(_pos select 1), 1], 0.8, 0.8, 0, (name player), 1, 0.0315, "EtelkaMonospacePro"]; }];$/Code$ + (Mar 25, 2014) + 1. In ArmA3 ver 1.14 flare color can be changed via setLightColor. + 2. Flare won't have visual presentation in daytime. + 3. setLightUseFlare needs to be used together with setLightFlareSize and setLightFlareMaxDistance so that a flare can be seen. - Nothing + Nothing + - drawIcon + lineBreak - Draw an icon on the map. The command needs to be called every frame, preferably with "Draw" control event handler ctrlAddEventHandler. + Creates a structured text containing a line break. - https://community.bistudio.com/wiki/drawIcon + https://community.bistudio.com/wiki/lineBreak - Control drawIcon Array + lineBreak - map drawIcon [texture, color, position, width, height, angle, text, shadow, textSize, font, align] + lineBreak - $Code$findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", " - _this select 0 drawIcon [ - 'iconStaticMG', - [1,0,0,1], - getPos player, - 24, - 24, - getDir player, - 'Player Vehicle', - 1, - 0.03, - 'TahomaB', - 'right' - ] - "];$/Code$ + $Code$_txt = composeText ["First line", lineBreak, "Second line"];$/Code$ undefined / undefined - (July 03, 2013) - Support of paremeters textSize, font and align is in the game since Arma 3 version 0.72. - - (March 22, 2014) - icon will always remain the same width and height, if you want an icon scaled to the map, use: $Code$( sizeInMeters * 0.15) * 10^(abs log (ctrlMapScale _ctrl))$/Code$ for width and height (guessimated). - - (July 20, 2014) - If you want only text with no icon, you can use "#(argb,8,8,3)color(0,0,0,0)" as texture. - - (July 7, 2015) - Be careful when using this command. Unlike map markers, the draw commands can decrease your framerate. - - (January 4, 2016) - Arma 3 1.54 - This command doesn't seem to play nice with onEachFrame. It seems to draw on the main screen while maintaing position relative to the map position - Example: - $Code$ onEachFrame { - findDisplay 12 displayCtrl 51 drawIcon ['iconStaticMG',[1,0,0,1], getPos player,24,24, getDir player,'Player Vehicle',1,0.03,'TahomaB','right']; - };$/Code$ - - (October 13, 2016) - If you unPBO the following addon: - $Code$@ui_f_data.pbo $/Code$ - You can find the possible icons inside this folder: - $Code$ui_f_data\map\vehicleicons$/Code$ - For example: - If you want to use "iconman_ca.paa" you will write "iconman" on the texture string. - Nothing + Structured_Text + - drawLine3D + addUniform - Draws a line of a given color between two 3D positions. Command has to be executed each frame. Use onEachFrame or addMissionEventHandler "Draw3D". + Create a new uniform and try to link it into uniform slot (given uniform has to be supported by allowedUniforms list of target soldier). To check if uniform is allowed use isUniformAllowed and to force add incompatible uniform use forceAddUniform - https://community.bistudio.com/wiki/drawLine3D + https://community.bistudio.com/wiki/addUniform - drawLine3D Array + Object addUniform String - drawLine3D [start, end, color] + unit addUniform type - $Code$onEachFrame { - drawLine3D [ getPos player, getPos cursorTarget, [1,1,1,1]]; - };$/Code$ + $Code$_unit addUniform "U_B_CombatUniform_mcam";$/Code$ - undefined / undefined + global / global - (August 31, 2013) - As command syntax indicates, this command expects starting and ending position in format PositionAGL meaning that over the land it expects PositionATL and over the sea PositionASLW. Use additional ASLToAGL and AGLToASL commands wherever is necessary. - $Code$ addMissionEventHandler ["Draw3D", { - drawLine3D [ ASLToAGL eyePos soldier1, ASLToAGL eyePos soldier2, [1,0,0,1]]; - }];$/Code$ - - (February 18, 2015) - Visible through fog and past draw distance. - Nothing + Nothing + - drawLine + ctrlSetFade - Draw a line on the map. + Sets wanted transparency for control animation. Requires ctrlCommit to commit changes. - https://community.bistudio.com/wiki/drawLine + https://community.bistudio.com/wiki/ctrlSetFade - Control drawLine Array + Control ctrlSetFade Number - map drawLine [position1, position2, color] + controlName ctrlSetFade fade - + $Code$_control ctrlSetFade 1; + _control ctrlCommit 5;$/Code$ + undefined / undefined - (March 22, 2014) - Map example: $Code$( findDisplay 12 displayCtrl 51) ctrlAddEventHandler ["Draw"," - ( _this select 0) drawLine [ - getPos player, - [0,0,0], - [0,0,1,1] - ]; - "];$/Code$ - Be careful when using this command. Unlike map markers, the draw commands can decrease your framerate. - - - Nothing - - - - - drawLink + (March 10, 2015) + This command sets the amount of fade. For example: + $Code$ + _ctrl ctrlSetFade 1; // hides the control + _ctrl ctrlSetFade 0.5; // control is 50% visible + _ctrl ctrlSetFade 0; // control is fully visible + $/Code$ + + (August 28, 2017) + The resulting fade speed seems like is not exactly what ctrlCommit commands it to be, as is dependant on your current framerate. Example: + $Code$_ctrl ctrlSetFade 0.5; + _ctrl ctrlCommit 1; + $/Code$ + Will actually result in: + $Code$ [60 FPS and higher] = ~1.0 seconds + [30 FPS and around] = ~1.2 seconds + [10 FPS and anything lower] = ~5-10 seconds + $/Code$ + This phenomenon probably occurs because of engine time simulation disruption caused by performance damage. + + + Nothing + + + + + + tvCount - The editor will draw a line between the two specified editor objects. Line type can be LINE or ARROW. - i - Some Old Editor Command + Returns childrens count of item on given path. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/drawLink + https://community.bistudio.com/wiki/tvCount - Control drawLink Array + tvCount Array + + Control tvCount Array - map drawLink [from,to,param type,line type,color] + tvCount [idc, [path]] + + _ctrl tvCount [path] - + $Code$tvCount [101, [0]];$/Code$ + + $Code$_ctrl tvCount [1,0];$/Code$ + - undefined / undefined + local / local + (Sep 11 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Nothing + Number - Number + - drawLocation + get3DENAttribute - Unknown effect. + Returns value of a given entity's attribute in Eden Editor. + An attribute is identified by its property ( data when it's engine-drive attribute) value in config. For the list of all attributes with their properties, see Setting Attributes. + ! + Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! - https://community.bistudio.com/wiki/drawLocation + https://community.bistudio.com/wiki/get3DENAttribute - Control drawLocation Location + EdenEntity get3DENAttribute String - control drawLocation location + entity get3DENAttribute attribute - + $Code$systemChat str (( get3DENMouseOver select 1) get3DENAttribute "name"); + // returns variable name of object under cursor$/Code$ + undefined / undefined - Unknown + Array + - drawPolygon + getMissionLayerEntities - Draws given polygon on the given map control with given color. The polygon must consist of at least 3 points. Unlike with other draw shape commands and due to complexity, this command does not support filling of the polygon with color. Use drawTriangle command to construct and fill polygon shape as a workaround. + Returns all entities within specific Eden Editor layer. To be used when the scenario is running, not in the editor workspace. + Useful for disabling / enabling whole parts of the scenario which you add to specific layer while editing. - https://community.bistudio.com/wiki/drawPolygon + https://community.bistudio.com/wiki/getMissionLayerEntities - Control drawPolygon Array + getMissionLayerEntities String - map drawPolygon [polygon, color] + getMissionLayerEntities layerName - $Code$test_polygon = []; - for "_i" from 1 to 12 do - { - test_polygon pushBack ( player getPos [10 + random 100, 360/_i]); - }; - findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", + $Code$_base = getMissionLayerEntities "Base";$/Code$ + + $Code$waitUntil {( player distance _someObject) 800}; { - _this select 0 drawPolygon [test_polygon, [0,0,1,1]]; - }];$/Code$ + deleteVehicle _x ; + } forEach (( getMissionLayerEntities "Simple Objects") select 0);//Deletes all objects within that layer after the player is over 800m away from _someObject$/Code$ undefined / undefined + (October 26, 2016) + After an object was deleted from a layer, getMissionLayerEntities will return NULL-object for the deleted object. + Version: 1.65 + Build: 139010 - Nothing + Array + - drawRectangle + unassignCurator - Draws a rectangle on the map. + Unassign curator (will destroy both sides of connection). - https://community.bistudio.com/wiki/drawRectangle + https://community.bistudio.com/wiki/unassignCurator - Control drawRectangle Array + unassignCurator Object - map drawRectangle [c, a, b, angle, color, fill] + unassignCurator curatorObj - $Code$_ctrl drawRectangle [ - getPos player, - 20, - 20, - getDir player, - [0,0,1,1], - "" - ];$/Code$ - - $Code$_ctrl drawRectangle [ - player, - 10, - 20, - getDir player, - [1,1,1,1], - "#(rgb,8,8,3)color(1,0,0,1)" - ];$/Code$ + $Code$unassignCurator myCurator;$/Code$ undefined / undefined - (March 22, 2014) - Map example: $Code$( findDisplay 12 displayCtrl 51) ctrlAddEventHandler ["Draw",{ - (_this select 0) drawRectangle [ - getPos player, - 20, - 20, - getDir player, - [0,0,1,1], - "" - ]; - }];$/Code$ - Be careful when using this command. Unlike map markers, the draw commands can decrease your framerate. + This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - drawTriangle + tvCurSel - Draws a single triangle or multiple triangles on the map. Triangle is defined by 3 positions of its verticies: p0, p1, p2 in a single array [ p0, p1, p2 ]. Next 3 positions in the same array [p0, p1, p2, p0, p1, p2 ] will be used to draw second triangle, another 3 positions [p0, p1, p2, p0, p1, p2, p0, p1, p2 ] to draw 3rd and so on. - NOTE : when fill param is absent or is an empty string "", the triangle is drawn with lines of the color set in color param. In order to draw color filled triangle of the same color as color param, set fill param to opaque white procedural texture "#(rgb,1,1,1)color(1,1,1,1)". + Returns path to currently selected item. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/drawTriangle + https://community.bistudio.com/wiki/tvCurSel - Control drawTriangle Array + tvCurSel Number + + tvCurSel Control - map drawTriangle [vertices, color, fill] + tvCurSel idc + + tvCurSel control - $Code$findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", - { - _this select 0 drawTriangle - [ - [ - player getRelPos [100, 0], - player getRelPos [100, -135], - player getRelPos [100, 135] - ], - [1,0,0,0.5], - "#(rgb,1,1,1)color(1,1,1,1)" - ]; - }];$/Code$ + $Code$tvCurSel 101;$/Code$ + + $Code$tvCurSel _ctrl;$/Code$ - undefined / undefined + local / local - (July 16, 2017) - Example youtube video: [1] $Code$_ctrl = findDisplay 12 displayCtrl 51; - _ctrl setVariable ["data", [1, "#(rgb,1,1,1)color(1,1,1,1)", 1000, position player, - { - params ["_p", "_r", "_a", "_sr", "_ba"]; - _sr = _r * 0.382; - _pb = _p getPos [_sr, _a + 180]; - [ - _p getPos [_r, _a], _p getPos [_sr, _a + 36], _p getPos [_sr, _a - 36], - _pb, _p getPos [_r, _a - 72], _p getPos [_r, _a + 72], - _p getPos [_r, _a - 144], _p getPos [_sr, _a - 108], _pb, - _p getPos [_r, _a + 144], _p getPos [_sr, _a + 108], _pb - ] - }]]; - _ctrl ctrlRemoveAllEventHandlers "Draw"; - _ctrl ctrlAddEventHandler ["Draw", - { - _map = _this select 0; - _data = _map getVariable "data"; - _data params ["_i", "_fill", "_dist", "_pos", "_fn"]; - _data set [0, _i + 1]; - _size = _i % _dist; - if (_size == 0) then - { - _data set [0, 1]; - _data set [1, ["#(rgb,1,1,1)color(1,1,1,1)", ""] select (random 1 0.3)]; - _data set [2, 250 + round random 750]; - }; - _alpha = linearConversion [_dist, 0, _dist - _size, 1, 0]; - _map drawEllipse [_pos, _size * 2, _size * 2, 0, [0,0,1,_alpha], _fill]; - _map drawTriangle [[_pos getPos [_size, -_size], _size, _size] call _fn, [1,0,0,_alpha], _fill]; - _map drawTriangle [[_pos getPos [_size, -_size + 120], _size, _size] call _fn, [0,1,0,_alpha], _fill]; - _map drawTriangle [[_pos getPos [_size, -_size - 120], _size, _size] call _fn, [1,1,0,_alpha], _fill]; - }]; - openMap true;$/Code$ + (Sep 11 2014) + (A3 1.28)tv command fmily overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Nothing + Array - Array + - driver + ctrlVisible - Returns the driver of a vehicle. + Returns if a control of the currently active user dialog is shown or not. Read Dialog Control for more information about user dialogs and controls. - https://community.bistudio.com/wiki/driver + https://community.bistudio.com/wiki/ctrlVisible - driver Object + ctrlVisible Number - driver vehicle + ctrlVisible idc - $Code$( driver _tank) action ["getout", _tank];$/Code$ + $Code$_bool = ctrlVisible 100;$/Code$ - global / undefined + local / undefined - (August 3, 2006) - Notes from before the conversion: - It is also possible to find the driver of a vehicle by placing a D after the name of the vehicle so Tank1D and driver Tank1 both refer to the same unit, providing the original driver has not got out of the tank. - The difference between the two is Tank1D is always the unit that was driver of the tank when the mission started, whilst driver Tank1 is the driver which is now there. - Object + Boolean + - drop + turretLocal - Creates a particle effect. - This command is used to create smoke, fire and similar effects. - The particles are single polygons with single textures that always face the player. - They can be set to dynamically change their position, size, direction, can be set to different weights and more or less dependant on the wind. + Checks if a turret is local. + Some info on turrets: A vehicle turret will change locality when player gunner gets in it, just like vehicle changes locality when player driver gets in it. Many commands for turrets work only where turret is local. When gunner leaves turret it is supposed to change locality to the locality of the vehicle. - https://community.bistudio.com/wiki/drop + https://community.bistudio.com/wiki/turretLocal - drop Array + Object turretLocal Array - drop array + vehicle turretLocal turretPath - $Code$drop ["cl_basic", "", "Billboard", 1, 1, [-3.5*( sin ( direction xural)), - -3.5*( cos ( direction xural)),0], [ random 0.1, random 0.1, random 0.5], 1, 0.005, 0.0042, - 0.7, [0.3,3], [[0.5,0.5,0.5,0],[0.7,0.7,0.7,0.5],[0.9,0.9,0.9,0]], [0,1,0,1,0,1], - 0.2, 0.2, "", "", xural]$/Code$ + $Code$_isLocal = vehicle player turretLocal [0];$/Code$ + + $Code$if (heli turretLocal [1]) then {heli setVehicleAmmo 1};$/Code$ + + $Code$if ( isNil {heli turretLocal [5]}) then { hint "Turret 5 is non-existent"};$/Code$ - undefined / local + global / undefined - Nothing + Boolean/Nothing + - dynamicSimulationDistanceCoef + eyeDirection - A getter for setDynamicSimulationDistanceCoef + Returns the direction object is watching (eyes, or a vehicle primary observer). - https://community.bistudio.com/wiki/dynamicSimulationDistanceCoef + https://community.bistudio.com/wiki/eyeDirection - dynamicSimulationDistanceCoef String + eyeDirection Object - dynamicSimulationDistanceCoef class + eyeDirection unit - $Code$hint str dynamicSimulationDistanceCoef "IsMoving";$/Code$ + $Code$can = "Land_Can_V3_F" createVehicle position player ; + onEachFrame { + can setPosASL [ + ( eyePos player select 0) + ( eyeDirection player select 0), + ( eyePos player select 1) + ( eyeDirection player select 1), + ( eyePos player select 2) + ( eyeDirection player select 2) + ] + }$/Code$ + + $Code$// Draw AI eye direction (green) and weapon direction (red) in 3D: + bob = createGroup east createUnit ["O_Soldier_F", [0,0,0], [], 0, "NONE"]; + bob setVehiclePosition [ player modelToWorld [0,100,0], [], 0, "NONE"]; + onEachFrame + { + _beg = ASLToAGL eyePos bob; + _endE = (_beg vectorAdd ( eyeDirection bob vectorMultiply 100)); + drawLine3D [ _beg, _endE, [0,1,0,1]]; + _endW = (_beg vectorAdd (bob weaponDirection currentWeapon bob vectorMultiply 100)); + drawLine3D [_beg, _endW, [1,0,0,1]]; + };$/Code$ - undefined / undefined + global / undefined + (May 26, 2014) + This command should have really been named headDirection instead of eyeDirection as one could mistakenly think that eyes direction of your avatar correspond to the direction of the centre of your screen. Play with the script in example 1 to find out limitations. If you need centre of screen direction, use positionCameraToWorld instead. - Number + Array + - dynamicSimulationDistance + objectParent - A getter for setDynamicSimulationDistance + Returns parent of an object if the object is proxy, otherwise objNull. In case of backpack, the parent is a weaponholder or a cargo space of a vehicle or the unit carrying it. Unit in a vehicle will return the vehicle as parent. + Another good use of objectParent is when a static weapon is known and one needs to check if it is assembled or not. objectParent _staticWeapon will return objNull if weapon is unpacked, or backpack object if packed. - https://community.bistudio.com/wiki/dynamicSimulationDistance + https://community.bistudio.com/wiki/objectParent - dynamicSimulationDistance String + objectParent Object - dynamicSimulationDistance category + objectParent object - $Code$hint str dynamicSimulationDistance "Prop";$/Code$ + $Code$_weaponholder = objectParent _mybackpack;$/Code$ + + $Code$// Create and place created backpack in front of player: + _backpackContainer = "B_TacticalPack_rgr" createVehicle [0,0,0]; + _weaponHolder = objectParent _backpackContainer; + _weaponHolder setPos ( player modelToWorld [0,5,0]);$/Code$ + + $Code$// Check if player is on foot: + _isOnFoot = isNull objectParent player ;$/Code$ + + $Code$// Detect if player is in commander turret of a vehicle: + _isVehicleCommander = player isEqualTo commander objectParent player ;$/Code$ undefined / undefined @@ -21590,55 +22540,125 @@ - Number + Object + - dynamicSimulationEnabled + count - A getter for enableDynamicSimulation + Can be used to count: + the number of elements in array + the number of elements in array with condition + the number of sub-entries in a config object + the number of characters in a string (since ["Arma 3","Arma3",127,126674,"Development"]) - https://community.bistudio.com/wiki/dynamicSimulationEnabled + https://community.bistudio.com/wiki/count - dynamicSimulationEnabled Object/Group + count Array + + Code count Array + + count Config + + count String - dynamicSimulationEnabled object + count array + + condition count array + + count configname + + count string - $Code$hint str dynamicSimulationEnabled _myObject;$/Code$ + $Code$_cnt = count [0,0,1,2]; // returns 4 + _cnt = count units group player ; // returns number of units in player group$/Code$ + + $Code$_cnt = { _x == 4} count [1,9,8,3,4,4,4,5,6]; // returns 3 + _cnt = { alive _x } count allUnits ; // returns the number of alive units$/Code$ + + $Code$_cnt = count ( configFile "CfgVehicles");$/Code$ + + $Code$hint str count "japa is the man!"; //16$/Code$ - undefined / undefined + local / undefined + (April 28, 2007) + This conditional count command only works if all the elements in the tested array are of the same type as the tested element. + For example, the following code will created an error, since the elements are of different types (object, number, string): + $Code$_arr = [ player,100,"one"]; {_x == "one"} count _arr;$/Code$ + Alternatively, to avoid the error use isEqualTo instead of ==. --KK + This one, on the other hand, where all elements are strings, just like the tested element, will return the correct result of 1: + $Code$_arr = ["one","two","three"]; {_x == "one"} count _arr;$/Code$ + + (August 3, 2006) + Notes from before the conversion: + Use this to calculate how many "M16" mags a soldier has left. + $Code${_x == "M16"} count magazines soldier1;$/Code$ + Take care when using count to determine how many units are left alive in a group: count units group player or count units groupname Will return the number of units the leader of the group thinks are alive. If some units have been killed out of sight of other members of the group then it may take sometime for this to be the actual numbers in the group. To determine exactly how many units are really alive in a group use: + $Code${ alive _x} count units group player ;$/Code$ + or + $Code${ alive _x} count units groupname;$/Code$ + + (December 15, 2014) + count can be (ab)used for a very fast and simple check if at least one element in an array fulfills a certain condition: + $Code$if({if( _x fulfills condition ) exitWith {1}; false} count _array isEqualTo 1) then + { + //do whatever here + };$/Code$ + This code will exit the count loop as soon as it finds an element fulfilling the condition, leaving the count with the value of 1, hence make the larger if-condition be true. + If no array element fulfills the condition, the count will be 0 and the if-condition will be false. + + (December 29, 2014) + Quit loop at first fulfilled condition (same as above but faster): + $Code$0 = { if (_x == 4) exitWith { + //do something when we reach 4 + }} count [1,2,3,4,5,6];$/Code$ + + (January 2, 2015) + Using exitWith inside a count loop will overwrite the default functionality and make count return whatever the exitWith returns: + $Code$_result = { + if(_x isEqualTo 3) exitWith {"Hello"} + } count [1,2,3,4,5]; + //_result = "Hello"$/Code$ + + (August 22, 2016) + With the alternative syntax each iteration should result in an interior return of bool or nothing. Example: + $Code$createDialog "RscFunctionsViewer"; + { lbAdd [292901,_x]; } count ["first","second","third"];$/Code$ + lbAdd returns a number, so this throws "Error Type Number, expected Bool". Tested in A2OA 1.63.131129 - Boolean + Number - Number - Number - Number + - dynamicSimulationSystemEnabled + buildingExit - A getter for enableDynamicSimulationSystem + Returns the given indexed exit in a building. The returned value is in format Position. - https://community.bistudio.com/wiki/dynamicSimulationSystemEnabled + https://community.bistudio.com/wiki/buildingExit - dynamicSimulationSystemEnabled + Object buildingExit Number - dynamicSimulationSystemEnabled + building buildingExit index - $Code$hint str dynamicSimulationSystemEnabled ;$/Code$ + $Code$_building buildingExit 0$/Code$ undefined / undefined @@ -21646,91 +22666,97 @@ - Boolean + Array + - east + updateMenuItem - Pre-defined variable for the eastern side. + Sets the text and command for the menu item. index is index as returned from addMenuItem command. command is optional. + i + Some Old Editor Command - https://community.bistudio.com/wiki/east + https://community.bistudio.com/wiki/updateMenuItem - east + Control updateMenuItem Array - east + map updateMenuItem [menu item index,text,command] - $Code$// SQS: - ?((side _unit) == east ) : hint "This is a eastern unit!"$/Code$ - - $Code$// SQF: - if (( side _unit) == east ) then { - hint "This is a eastern unit!"; - };$/Code$ - + undefined / undefined - (April 17, 2007) - In ArmA terms OPFOR, BLUFOR, Independents and Civilians are used in the front end UI. - Side + Nothing + - echo + currentWeaponMode - Sends any text into the debugger console or the logfile. Present in internal version only, not working in the retail version. + Returns current weapon mode of unit's weapon. Result can be: "Single", "Burst", "FullAuto", "manual", "player" + This command will return 0 Number if given object is a vehicle instead of a person. - https://community.bistudio.com/wiki/echo + https://community.bistudio.com/wiki/currentWeaponMode - echo String + currentWeaponMode Object - echo text + currentWeaponMode gunner - $Code$echo "Text in logfile"$/Code$ + $Code$_weaponMode = currentWeaponMode player ;$/Code$ + + $Code$_weaponMode = currentWeaponMode gunner vehicle player ;$/Code$ undefined / undefined + (September 27, 2014) + - Be careful using this in script. This function returns these strings but also: + - 0 if unit is in a vehicle (pax), + - absolutely nothing if AH-99 helo driver or all weapons removed, + - "truckhorn2" if Hunter driver... + Absolutely nothing means: if you use a hint to display the returned value, you obtain absolutely no text,no black box, no error! Hint isn't displayed and there is no error in rpt file with compile preprocessFileLineNumbers. + On the other hand, returned value 0 when unit is pax of a vehicle, could lead to a variable error type if your script is waiting for a string. - Nothing + String + - edit3DENMissionAttributes + enableAimPrecision - Open a window with scenario attribute in given section. + Set whether animation's aim precision affects weapon sway. - https://community.bistudio.com/wiki/edit3DENMissionAttributes + https://community.bistudio.com/wiki/enableAimPrecision - edit3DENMissionAttributes String + Object enableAimPrecision Boolean - edit3DENMissionAttributes section + unit enableAimPrecision enable - $Code$edit3DENMissionAttributes "Multiplayer";$/Code$ + $Code$player enableAimPrecision false ;$/Code$ undefined / undefined @@ -21738,178 +22764,218 @@ - Nothing + Nothing + - editObject + hideObject - Show the edit object dialog for the given object. - i - Some Old Editor Command + Hide entity. Can be used on soldiers and vehicles, also on static objects. - https://community.bistudio.com/wiki/editObject + https://community.bistudio.com/wiki/hideObject - Control editObject String - - - map editObject object - - - - - undefined / undefined - - - - - Any_Value - - - - - editorSetEventHandler - - - Sets given event handler of given editor. - i - Some Old Editor Command - - - https://community.bistudio.com/wiki/editorSetEventHandler - - - Control editorSetEventHandler Array + hideObject Object + + Object hideObject Boolean - map editorSetEventHandler [handler name,function] + hideObject object + + object hideObject hidden - $Code$_map editorSetEventHandler ["SelectObject",""]$/Code$ + $Code$hideObject unitName;$/Code$ + + $Code$objectName hideObject true;$/Code$ - undefined / undefined + global / local + (July 15, 2010) + This command will hide a unit, but he will still shoot enemies. Unit will be invisible, but weapon muzzle are visible. + + Use MP framework to activate this comand on all players from server or any other maschine + $Code$_nic = [nil, mantohide, "per", rHideObject, true ] call RE; //In A3 use hideObjectGlobal instead.$/Code$ + + you can use code as in example 2, where true = ON and false = OFF, if using it like in example 1, you can only turn it ON + + using this locally causes the player/object disappear only locally; has to be executed serverside if used in MP. Hidden Vehicles still emit smoke/rotor blade dust and (probably) still emit engine sounds. Usefull for creating objects the map-creator doesn't want to be seen, like Units that protect a certain Area (like a safe-zone) against teamkillers or enemy units. + + The above comment is partially incorrect, if the effects of the command are local then it must be executed in every machine so it has global effect. If it is run only on the server machine, it will only be hidden on the server, while clients still see it. + + (March 5, 2014) + As of today this now finally has a Global counterpart, just released on the Stable branch. Added it's link under See also. + + (October 30, 2014) + When used on player, it only has an effect on third person mode. First person LOD is still visible. (A3 Dev 1.33) + + (June 27, 2015) + hideObject and hideObjectGlobal disable object collision in addition to rendering. A3 1.45.131175 + (tested by hiding buildings and running through, driving through, flying through, and shooting through where the building used to be) + + (January 26, 2016) + Sometimes it´s easier to teleport the object about 100m under the ground (also JiP Support): + $Code$_obj setPosATL [getPosATL _obj select 0, getPosATL _obj select 1, (getPosATL _obj select 2)-100];$/Code$ + And to unhide: + $Code$_obj setPosATL [getPosATL _obj select 0, getPosATL _obj select 1, (getPosATL _obj select 2)+100];$/Code$ - Nothing + Nothing - Nothing + - effectiveCommander + displayAddEventHandler - Returns the effective commander of the vehicle. Effective commander is the player whom driver AI will listen to. So if in a tank there is a gunner and a commander and AI driver, if the effectiveCommander is gunner, then gunner pressing WASD will give AI orders to move. If gunner jumps out and then enters tank again, the effectiveCommander role most likely has changed to commander that remained in tank. Also the assignment seems to work on first come first served basis. + Adds an event handler to the given display. Returns the ID of the event handler, or -1 when failed. + Returning true in EH code will override default engine handling for keyboard events. + See User Interface Event Handlers for the full list of event names. + If applicable, see DIK_KeyCodes for a list of key code constants, which are relevant to key related user interface events like: KeyDown & KeyUp. + NOTE: Display EHs are processed in reversed order, i.e. last added: first, first added: last. So if you have an override it should be set up in the 1st added EH. - https://community.bistudio.com/wiki/effectiveCommander + https://community.bistudio.com/wiki/displayAddEventHandler - effectiveCommander Object + Display displayAddEventHandler Array - effectiveCommander vehicle + display displayAddEventHandler [eventName, code] - $Code$_commander = effectiveCommander tank;$/Code$ + $Code$moduleName_keyDownEHId = ( findDisplay 46) displayAddEventHandler ["KeyDown", " hint str _this;"];$/Code$ + + $Code$moduleName_keyDownEHId = findDisplay 46 displayAddEventHandler ["KeyDown", { hint str _this}];$/Code$ undefined / undefined + (October 30, 2013) + As of Arma 3 v1.05.111658 ctrlAddEventHandler and displayAddEventHandler support script Code in addition to String [1] + + (March 10, 2014) + From within an Addon, you must assign the events from a spawned script. eg $Code$[] spawn { (findDisplay 46) displayAddEventHandler["KeyDown","_this call my_KeyDownFunctionhandler"]; };$/Code$ + + (January 22, 2016) + Be sure to wait until the main display is initialized before using this command by using: $Code$waituntil {!isnull (finddisplay 46)};$/Code$ + + (May 28, 2017) + use #define if you want the displayEventHandler to use data that is defined in the same file in which the command is executed. + However, that does not work if you use STRING as 'code'. In case of STRING, use the format command around it. + + (August 7, 2017) + Using KeyUp you can't override default engine action by returning true ( A3 1.72.142342 ) - Object + Number + - else + setDynamicSimulationDistance - Executes else code when if condition returns false + Sets activation distance of Arma_3_Dynamic_Simulation for given category - https://community.bistudio.com/wiki/else + https://community.bistudio.com/wiki/setDynamicSimulationDistance - Code else Code + String setDynamicSimulationDistance Number - ifCode else elseCode + category setDynamicSimulationDistance distance - $Code$if (a b) then { c = 0 } else { c = 1 };$/Code$ - - $Code$if (a b) then { - hint "B is greater than A"; - } else { - hint "A is greater than B"; - };$/Code$ + $Code$"Group" setDynamicSimulationDistance 1000;$/Code$ undefined / undefined + (March 19, 2017) + Desired distances for "Group" and "Vehicle" must be based on viewDistance and fog to exclude any rendering problems with frequently moving objects. Example: + $Code$"Group" setDynamicSimulationDistance (( viewDistance * 0.8) - ( viewDistance * fog)) + // 80% of maximum rendering and fog distance$/Code$ + But that might impair objects simulations if you are using long-scope optics, so there's a even better solution using cameraView with it: + $Code$[] spawn { + while { true } do { + if ( cameraView isEqualTo "GUNNER") then { + "Group" setDynamicSimulationDistance ( viewDistance - ( viewDistance * fog )); + // Scoped + } else { + "Group" setDynamicSimulationDistance (( viewDistance * 0.8) - ( viewDistance * fog )); + // Not scoped + }; + uiSleep 0.25; + }; + }; + $/Code$ - Array + Nothing + - emptyPositions + unitPos - Returns the number of given positions in the vehicle. - Positions can be "Commander", "Driver", "Gunner" or "Cargo" + Return the unit position rules. + The return value is always "Auto" unless the unit has gotten a setUnitPos command. In that case the value is the last stance the unit was ordered to. + Available modes are listed at setUnitPos. - https://community.bistudio.com/wiki/emptyPositions + https://community.bistudio.com/wiki/unitPos - Object emptyPositions String + unitPos Object - vehicle emptyPositions position + unitPos unit - $Code$_freeCargoPositions = vehicle player emptyPositions "cargo";$/Code$ + $Code$hint str unitPos _unit;$/Code$ - undefined / undefined + global / undefined - Number + String + - enableAIFeature + enableSatNormalOnDetail - Enable/disable given AI feature. Feature may be one of: - "AwareFormationSoft", "CombatFormationSoft". + Enables/Disables satellite normal map od detail maps. - https://community.bistudio.com/wiki/enableAIFeature + https://community.bistudio.com/wiki/enableSatNormalOnDetail - String enableAIFeature Boolean + enableSatNormalOnDetail Boolean - feature enableAIFeature enabled + enableSatNormalOnDetail state - $Code$"AwareFormationSoft" enableAIFeature true$/Code$ + $Code$enableSatNormalOnDetail true;$/Code$ undefined / undefined @@ -21917,56 +22983,55 @@ - Nothing + Nothing + - enableAI + && - Enables parts of the AI behavior that was disabled by disableAI. - NOTE: When player switches and leaves behind AI unit, you need to enable "TeamSwitch" AI on it _unit enableAI "TeamSwitch" so that the unit continues with waypoints + Returns true only if both conditions are true. In case of the alternative syntax (code as right argument), lazy evaluation is used (if left operand is false, evaluation of the right side is skipped completely). Identical to: a and b - https://community.bistudio.com/wiki/enableAI + https://community.bistudio.com/wiki/a_%26%26_b - Object enableAI String + Boolean && Boolean/Code - unit enableAI skilltype - + - $Code$_soldierOne enableAI "Move";$/Code$ - + - local / global + undefined / undefined - Nothing + Boolean + - enableAimPrecision + profileNameSteam - Set whether animation's aim precision affects weapon sway. + Returns name of the current Steam profile. - https://community.bistudio.com/wiki/enableAimPrecision + https://community.bistudio.com/wiki/profileNameSteam - Object enableAimPrecision Boolean + profileNameSteam - unit enableAimPrecision enable + profileNameSteam - $Code$player enableAimPrecision false ;$/Code$ + $Code$_mySteamProfileName = profileNameSteam ;$/Code$ undefined / undefined @@ -21974,55 +23039,66 @@ - Nothing + String + - enableAttack + ctrlSetModelDirAndUp - Set if leader can issue attack commands to the soldiers in his group. + Sets orientation of 3D control model. It is similar to setVectorDirAndUp command for an object. - https://community.bistudio.com/wiki/enableAttack + https://community.bistudio.com/wiki/ctrlSetModelDirAndUp - Object/Group enableAttack Boolean + Control ctrlSetModelDirAndUp Array - group enableAttack enable + control ctrlSetModelDirAndUp [dir, up] - $Code$_group1 enableAttack true$/Code$ + $Code$_ctrl3D ctrlSetModelDirAndUp [[0,1,0],[0,0,1]]; //default orientation$/Code$ - local / global + undefined / undefined - Nothing + Nothing + - enableAudioFeature + teamMemberNull - Enable/disable an audio feature, features are: "lowpass", "building_interior". Return previous state + A non-existent Team Member. To compare non-existent team members use isNull or isEqualTo : + teamMemberNull == teamMemberNull ; // false + isNull teamMemberNull ; // true + teamMemberNull isEqualTo teamMemberNull ; // true - https://community.bistudio.com/wiki/enableAudioFeature + https://community.bistudio.com/wiki/teamMemberNull - enableAudioFeature Array + teamMemberNull - enableAudioFeature [feature, enable] + teamMemberNull - $Code$prevState = enableAudioFeature ["lowpass", true ];$/Code$ + $Code$! isNull teamMemberNull ; // false$/Code$ + + $Code$str teamMemberNull ; // NULL - team member$/Code$ + + $Code$if (_teamMember isEqualTo teamMemberNull ) then { + hint "is null member"; + };$/Code$ undefined / undefined @@ -22030,28 +23106,28 @@ - Boolean + Team_Member + - enableCamShake + importance - Allows camera shake effects via addCamShake. If set to false, then a currently active shake effect will stop immediately. - By default, shake effects are enabled, but once they have been disabled by this command, they will have to be enabled first, in order to be visible. + Returns a location's importance value. - https://community.bistudio.com/wiki/enableCamShake + https://community.bistudio.com/wiki/importance - enableCamShake Boolean + importance Location - enableCamShake value + importance location - $Code$enableCamShake false ;$/Code$ + $Code$_locationImportance = importance myLocation$/Code$ undefined / undefined @@ -22059,204 +23135,229 @@ - Nothing + Number + - enableCaustics + removeCuratorAddons - Enable/disable caustics drawing. + Restrict curator use of given addons. - https://community.bistudio.com/wiki/enableCaustics + https://community.bistudio.com/wiki/removeCuratorAddons - enableCaustics Boolean + Object removeCuratorAddons Array - enableCaustics bool + curatorObj removeCuratorAddons addons - + $Code$curatorModule removeCuratorAddons [addon1,addon2]$/Code$ + undefined / undefined + This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - enableChannel + tvExpand - Enables/disables UI functionality which is responsible for sending text or voice chat to the given chat channel. If the channel was disabled in description.ext, it can be enabled with this command, however the UI functionality changes will be local to the PC executing this command. What this command cannot do: - It cannot disable incoming text or voice - It cannot interrupt own client's transmission in progress - It cannot affect any Custom Radio channels, only channels 0-5 - It cannot persist, so if user is logged out, the changes are reset - It has no effect on chat related scripting commands, such as vehicleChat, globalChat, globalRadio, sideRadio, etc. - So in short, just like with getPlayerChannel, this command provides a nice ability to hack into chat UI with some limitations. And the reason why it is possible to disable entire channels (except Group) in description.ext, is because no one can talk or text, therefore no transmission is happening. NOTE: Group channel cannot be disabled, neither with enableChannel, nor with description.ext param. Channel / Number correspondence: - 0 = Global - 1 = Side - 2 = Command - 3 = Group - 4 = Vehicle - 5 = Direct - 6-15 = Custom Radio (Is not supported by enableChannel ) + Expands tree item pointed to by the path. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/enableChannel + https://community.bistudio.com/wiki/tvExpand - Number enableChannel Boolean + tvExpand Array - Number enableChannel Array + Control tvExpand Array - channel enableChannel enable + tvExpand [idc, path] - channel enableChannel [chat, VoN] + control tvExpand path - $Code$0 enableChannel false ; // Disable user ability to send voice and text on global channel$/Code$ + $Code$tvExpand [101, [0]];$/Code$ - $Code$0 enableChannel [ true, false ]; // Enable user ability to send text but disable voice on global channel$/Code$ + $Code$_ctrl tvExpand [1];$/Code$ - undefined / local + local / local - (June 17, 2016) - If the user is admin, global channel is fully enabled, regardless of this command. - - (July 30, 2016) - Alternative Syntax supports Custom Radio Channels + (Sep 11 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Nothing - Nothing + Nothing - Nothing + - enableCollisionWith + animationNames - Enable collision between vehicles. + Returns Array of Strings where elements are the names of model animations, which should theoretically be available for use with animate command. However in practice this depends on whether animation is also made available for use in scripts via config. - https://community.bistudio.com/wiki/enableCollisionWith + https://community.bistudio.com/wiki/animationNames - Object enableCollisionWith Object + animationNames Object - vehicle enableCollisionWith vehicle + animationNames object - + $Code$_names = animationNames static_AT; + // Returns: ["MainTurret", "MainGun", "MainTurret_destructX", "MainTurret_destructY", "MainTurret_destructZ", "MainGun_destructX", "MainGun_destructY", "MainGun_destructZ", "magazine_destruct", "ammo_belt_destruct", "bolt_destruct", "charging_handle_destruct", "damagehideVez_destruct", "damagehideHlaven_destruct", "damagehideRecoil_destruct", "Turret_shake", "Turret_shake_aside", "Magazine_hide", "Ammo_belt_hide", "muzzleFlash", "AddAutonomous_unhide", "bullet001_reload_hide", "bullet002_reload_hide", "bullet003_reload_hide", "bullet004_reload_hide", "bullet005_reload_hide", "bullet006_reload_hide", "bullet007_reload_hide", "bullet008_reload_hide"]$/Code$ + - local / global + undefined / undefined - (April 5, 2015) - enableCollisionWith is a script that when you apply it to an object, it will be solid and the player will not be able to go through it. However, if you want your unit to go through it, you may want to use the disableCollisionWith command. An example for this is: - $Code$//name of unit in editor such as player1 - //name of object in editor such as car1 - car1 enableCollisionWith player1; - //to make your unit go through the car, use the below and make sure you know what your doing! - car1 disableCollisionWith player1; - $/Code$ - Both commands enableCollisionWith and disableCollisionWith, are very handy codes and could be used for example: map testing, mission editing and even animation cutscenes. - Nothing + Array + - enableCopilot + getDammage - Enables copilot actions. + Returns the object damage in the range from 0 to 1. Alias of damage. - https://community.bistudio.com/wiki/enableCopilot + https://community.bistudio.com/wiki/getDammage - Object enableCopilot Boolean + getDammage Object - vehicle enableCopilot enable + getDammage object - $Code$if (! isCopilotEnabled myHeli) then { - myHeli enableCopilot true ; - };$/Code$ + $Code$_damage = getDammage player ;$/Code$ - local / global + undefined / undefined - (February 17, 2014) - Only enables the user actions, not who is in control - pilot can lock or unlock co-pilot controls in multiplayer while still true. - Actions: LockVehicleControl, UnlockVehicleControl, SuspendVehicleControl and TakeVehicleControl - You can use the Arma 3 Event Handler - ControlsShifted to detect Take and Release actions + (, May 9, 2011) + getDammage and damage works fine when used on damaged vehicles after a repair from a repairtruck when used in A2 CO patch 1.59. + + Vehicles repaired in game with the Repair trucks e.t.c never get completely repaired. After being repaired, rather than returning 0 when the damage command is called. They return a value equal to or less than 0.09. + Consequently any vehicle flagged as immobile (as indicated by the canMove command), remains so. At least as far as the AI are concerned. The AI will refuse to board an immobile vehicle or eject straight after boarding. Players remain unaffected and can drive the vehicle as normal. To circumvent this, use setDamage 0 on the vehicle in question, to allow the AI to board. + + In OFP 1.96, it is possible for a unit to be dead and still return a getDammage value well below 1. Use ! alive to check if a unit is dead. - Nothing + Number + - enableDebriefingStats + setCuratorCoef - enable debrifing score table. + Sets coef for some action (coef have to be bigger than -1 000 000, anything lower is considered as disabled action). - https://community.bistudio.com/wiki/enableDebriefingStats + https://community.bistudio.com/wiki/setCuratorCoef - enableDebriefingStats Array + Object setCuratorCoef Array - enableDebriefingStats [left, top, width, height] + curatorObj setCuratorCoef [action,coef] - $Code$enableDebriefingStats [0.1, 0.1, 0.8, 0.8];$/Code$ + $Code$curatorModule setCuratorCoef ["Place", 1]$/Code$ + + $Code$curatorModule setCuratorCoef ["Delete", -1e10]$/Code$ undefined / undefined + This scripting command must be executed on the server to work properly in multiplayer + + (March 25, 2015) + Possible actions are: + place + edit + delete + destroy + group + synchronize - Nothing + Nothing + - enableDiagLegend + surfaceNormal - Enable or disable the legend for diagnostics. Internal dev only + Returns surface normal on given position. - https://community.bistudio.com/wiki/enableDiagLegend + https://community.bistudio.com/wiki/surfaceNormal - enableDiagLegend Boolean + surfaceNormal Array - enableDiagLegend Bool + surfaceNormal position - $Code$enableDiagLegend false$/Code$ + $Code$_normal = surfaceNormal [300, 500];$/Code$ + + $Code$_normal = surfaceNormal position player ;$/Code$ undefined / undefined @@ -22264,27 +23365,29 @@ - Nothing + Array + - enableDynamicSimulation + load - Enables or disables Arma_3_Dynamic_Simulation for given non AI object + Returns current sum of mass from items stored in all unit's containers. Load is calculated by the following formula: + $Code$_loadPlayer = loadAbs player / getNumber ( configFile "CfgInventoryGlobalVariable" "maxSoldierLoad");$/Code$ - https://community.bistudio.com/wiki/enableDynamicSimulation + https://community.bistudio.com/wiki/load - Object/Group enableDynamicSimulation Boolean + load Object - object enableDynamicSimulation enable + load unit - $Code$_myObject enableDynamicSimulation true ;$/Code$ + $Code$load player ;$/Code$ undefined / undefined @@ -22292,432 +23395,479 @@ - Nothing + Number + - enableDynamicSimulationSystem + drawLocation - Enables or disables the whole Arma_3_Dynamic_Simulation system + Unknown effect. - https://community.bistudio.com/wiki/enableDynamicSimulationSystem + https://community.bistudio.com/wiki/drawLocation - enableDynamicSimulationSystem Boolean + Control drawLocation Location - enableDynamicSimulationSystem enable + control drawLocation location - $Code$enableDynamicSimulationSystem true ;$/Code$ - + undefined / undefined - Nothing + Unknown + - enableEndDialog + closeOverlay - Enables the execution of a custom camera sequence after the players death, coded in the script onPlayerKilled.sqs. + Closes the current overlay without committing. + i + Some Old Editor Command - https://community.bistudio.com/wiki/enableEndDialog + https://community.bistudio.com/wiki/closeOverlay - enableEndDialog + closeOverlay Control - enableEndDialog + closeOverlay map - undefined / local + undefined / undefined - Nothing + Nothing + - enableEngineArtillery + setObjectMaterial - Enable/disable the artillery engine. This allows the user to use the artillery computer on mortar/artillery, and for AI to use it for indirect fire. + Sets material of object selection. The selection number is defined through the hiddenselection []={} array in the vehicle's config (starting with 0). - https://community.bistudio.com/wiki/enableEngineArtillery + https://community.bistudio.com/wiki/setObjectMaterial - enableEngineArtillery Boolean + Object setObjectMaterial Array - enableEngineArtillery enabled + obj setObjectMaterial [selectionNumber, material] - $Code$enableEngineArtillery false;$/Code$ + $Code$car setObjectMaterial [0,"A3\Structures_F\Data\Windows\window_set.rvmat"]; + car setObjectMaterial [1,"A3\Structures_F\Data\Windows\window_set.rvmat"];$/Code$ - undefined / local + global / local - Nothing + Nothing + - enableEnvironment + waypointForceBehaviour - Enable/disable environmental effects: ambient life and/or ambient sound. + Returns true if the waypoint behavior is forced. - https://community.bistudio.com/wiki/enableEnvironment + https://community.bistudio.com/wiki/waypointForceBehaviour - enableEnvironment Boolean - - enableEnvironment Array + waypointForceBehaviour Waypoint - enableEnvironment enabled - - enableEnvironment [ambientLife, ambientSound] + waypointForceBehaviour waypoint - $Code$enableEnvironment false ;$/Code$ - - $Code$enableEnvironment [ false, true ];$/Code$ + $Code$_isForced = waypointForceBehaviour [groupOne, 1];$/Code$ undefined / undefined - (28 October, 2013) - This command has to be executed after mission start to have an effect. So if you add this command in init.sqf make sure you wait until mission is running: - $Code$//init.sqf - waitUntil { time 0}; - enableEnvironment false ;$/Code$ - Nothing - Nothing + Boolean + - enableFatigue + htmlLoad - Enables/Disables the person's fatigue. + Load HTML-Files from file or Uri using given control. + File path is relative to current mission dir or an absolute path (with drive letter etc.). + The command is subject to restrictions, imposed by CfgCommands class. - https://community.bistudio.com/wiki/enableFatigue + https://community.bistudio.com/wiki/htmlLoad - Object enableFatigue Boolean + Control htmlLoad String - unit enableFatigue enable + control htmlLoad filename - $Code$player enableFatigue false ;$/Code$ + $Code$_control htmlLoad "briefing.html";$/Code$ - $Code${ _x enableFatigue false ; } forEach ( units group player );$/Code$ + $Code$_control htmlLoad "http://www.bistudio.com/newsfeed/arma3_news.php?build=main // [1]$/Code$ + + $Code$// Display news item: + 0 = 0 spawn { + disableSerialization ; + _html = findDisplay 46 createDisplay "RscCredits" ctrlCreate ["RscHTML", -1]; + _html ctrlSetBackgroundColor [0,0,0,0.8]; + _html ctrlSetPosition [ safeZoneX, safeZoneY, safeZoneW, safeZoneH ]; + _html ctrlCommit 0; + _html htmlLoad "http://www.bistudio.com/newsfeed/arma3_news.php?build=main + };$/Code$ - local / global + undefined / undefined - (March 24, 2015) - When the player dies enableFatigue is set to true after the respawn + (September 7, 2014) + htmlLoad works with URL's as well as html files. - (January 27, 2016) - To precise the note of Harmdhast, this command is not persistent (after respawn). So, in MP, you'll have to enableFatigue false, also in onPlayerRespawn.sqf or through the MP eventHandler MPRespawn. - - - Nothing - - - - - enableGunLights - - - Force the AI to use gun lights - - - https://community.bistudio.com/wiki/enableGunLights - - - Object/Group enableGunLights Boolean - - - thing enableGunLights value - - - $Code$_grp enableGunLights true$/Code$ - - $Code$_unit enableGunLights true$/Code$ - - - local / global - - - (27 July, 2011) - This command can be used to force lights on, but not to force lights off. ( Source ) + (September 7, 2014) + While surprisingly htmlLoad does work with URLs as pointed above, the operation is blocking, meaning the whole game will freeze until the operation is complete. Therefore it is not recommended to use this command in such way. - (17 April, 2013) - In order for this command to work in ARMA 3 you should use groupname enableGunLights "AUTO" or soldierOne enableGunLights "AUTO". Other options are "forceOn" or "forceOff". ( Source ) + (April 21, 2015) + Example use of URL can be found in BIS_fnc_GUInewsfeed with the function browser. + + (October 7, 2015) + (Arma 3) In order to use URLs, they must be included in CfgCommands - allowedHTMLLoadURIs. In order to use URIs with params a wildcard * character is supported + Script Example : + $Code$_newsOnline = "http://alivemod.com/alive_news.php?map=" + _map + "&mission=" + _mission + "&player=" + _player; + _ctrlHTML htmlLoad _newsOnline;$/Code$ + Config Example: + $Code$class CfgCommands { + allowedHTMLLoadURIs[] += { + "http://alivemod.com/alive_news.php*" + }; + };$/Code$ - Nothing + Nothing + - enableIRLasers + isText - Allows the AI to use IR lasers + Check if config entry represents text. - https://community.bistudio.com/wiki/enableIRLasers + https://community.bistudio.com/wiki/isText - Object/Group enableIRLasers Boolean + isText Config - thing enableIRLasers value + isText config - $Code$(units group player) enableIRLasers true$/Code$ + $Code$_ok = isText (configFile "CfgVehicles") + // Result is false$/Code$ - local / global + undefined / undefined - Nothing + Boolean + - enableMimics + onPlayerDisconnected - Enables/disables mimics on a given unit. + This command will execute attached code whenever a player is leaving an MP session. The code will receive a number of special variables: + _id : Number - is the unique DirectPlay ID. Quite useless as the number is too big for in-built string representation and gets rounded. It is also the same id used for user placed markers. + _uid : String - is getPlayerUID of the leaving player. In Arma 3 it is also the same as Steam ID. + _name : String - is profileName of the leaving player. + _jip : ( since Arma 3 v1.49 ) Boolean - is a flag that indicated whether or not the player joined after the mission has started ( J oined I n P rogress). true - if the player was JIP, otherwise false. + _owner : ( since Arma 3 v1.49 ) Number - is owner id of the leaving player. Can be used for kick or ban purposes or just for publicVariableClient. + i + Since Arma 3 v1.57 a stackable version of this EH is available: PlayerDisconnected + In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. - https://community.bistudio.com/wiki/enableMimics + https://community.bistudio.com/wiki/onPlayerDisconnected - Object enableMimics Boolean + onPlayerDisconnected String/Code - unit enableMimics enabled + onPlayerDisconnected code - $Code$cursorTarget enableMimics false ;$/Code$ + $Code$onPlayerDisconnected " diag_log [_id, _uid, _name]";$/Code$ + + $Code$onPlayerDisconnected { + if ( count allPlayers == 0) then { + endMission "END1"; + }; + };$/Code$ undefined / undefined + This scripting command must be executed on the server to work properly in multiplayer + + (January 14, 2015) + For Arma 3 v1.32 and onward, one might want to consider using instead the HandleDisconnect mission event handler for greater flexibility. - Nothing + Nothing + - enablePersonTurret + owner - Enables or disables firing from a vehicle cargo position. To get the turret path use assignedVehicleRole or getCargoIndex command. + On server machine, returns the ID of the client where the object is local. Otherwise returns 0. For use on clients clientOwner command is available. To find out the owner of a Group, use groupOwner. - https://community.bistudio.com/wiki/enablePersonTurret + https://community.bistudio.com/wiki/owner - Object enablePersonTurret Array + owner Object - vehicle enablePersonTurret [turretPath, enable] + owner object - $Code$heli enablePersonTurret [[1], true ];$/Code$ + $Code$_clientID = owner _someobject;$/Code$ - undefined / undefined + global / undefined + This scripting command must be executed on the server to work properly in multiplayer - Nothing + Number + - enableRadio + cutObj - Enable and disable radio messages to be heard and shown in the left lower corner of the screen. This command can be helpful during cutscenes. + Displays an object defined in the global config in CfgTitles. + For greater efficiency and ease of modability it is recommended to use named layers available with alternative syntax since Arma 3 v1.57.134673 - https://community.bistudio.com/wiki/enableRadio + https://community.bistudio.com/wiki/cutObj - enableRadio Boolean + cutObj Array + + Number cutObj Array + + String cutObj Array - enableRadio state + cutObj [class, type, speed, showInMap] + + layer cutObj [class, type, speed, showInMap] + + layerName cutObj [class, type, speed, showInMap] - $Code$enableRadio false$/Code$ + $Code$cutObj ["TVSet", "PLAIN"]; + cutObj ["TVSet", "PLAIN", 2]$/Code$ + + $Code$2 cutObj ["Sphere", "PLAIN"];$/Code$ + + $Code$_layer = "layer1" cutObj ["BISLogo", "PLAIN"];$/Code$ undefined / local - (7 August, 2008) - This command doesn't disable text-chat in multiplayer. - - (11 September, 2008) - Does not affect VON. - Nothing + Nothing - Nothing - Number + - enableReload + setVariable - Enable / disable reload when magazine is empty. + Set variable to given value in the variable space of given element. + To remove a variable, set it to nil (e.g. player setVariable ["varname", nil ];$/Code$ ). + When variable is set on Task, it is not actually set on task itself, but on FSM attached to the task. So if there is no FSM setVariable will not work. + All available variable spaces which support setVariable : + Namespace setVariable Array + Object setVariable Array + Group setVariable Array + Team_Member setVariable Array + Task setVariable Array + Location setVariable Array + Control setVariable Array (since Arma 3 v1.55.133553) + Display setVariable Array (since Arma 3 v1.55.133553) + In Arma 3 it is possible to broadcast nil value - https://community.bistudio.com/wiki/enableReload + https://community.bistudio.com/wiki/setVariable - Object enableReload Boolean + Namespace/Object/Group/Team_Member/Task/Location/Control/Display setVariable Array + + Namespace/Object/Group setVariable Array - object enableReload enable + varspace setVariable [name, value] + + varspace setVariable [name, value, public] - $Code$_vehicle enableReload false ;$/Code$ + $Code$_myTruck setVariable ["myPublicVariable", 123, true ];$/Code$ + + $Code$_myTruck setVariable ["myLocalVariable", ["321", _var], false ];$/Code$ + + $Code$missionNamespace setVariable ["myName", "KK"]; + hint myName; //KK$/Code$ + + $Code$// Get current value of a variable and if it is undefined, define it and get the defined value: + private _var = missionNamespace getVariable "varName"; + if ( isNil "_var") then + { + missionNamespace setVariable ["varName", 123]; + _var = 123; + }; + // _var here will contain current value of the variable varName$/Code$ - undefined / undefined + global / local + (December 9, 2015) + This command does not work with CfgAmmo or CfgNonAIVehicles objects, like bullets, mines or butterflies (probably because they are local objects Killzone Kid ( talk ) 11:25, 9 July 2017 (CEST)). - Nothing + Nothing - Nothing + - enableRopeAttach + tvSetPictureRightColorDisabled - Enable/disable ability to attach or be attached to ropes for given vehicle + Sets the color of the right picture of a tree item defined by path when item is disabled - https://community.bistudio.com/wiki/enableRopeAttach + https://community.bistudio.com/wiki/tvSetPictureRightColorDisabled - Object enableRopeAttach Boolean + Control tvSetPictureRightColorDisabled Array - vehicle enableRopeAttach enable + control tvSetPictureRightColorDisabled [path, color] - $Code$( vehicle player ) enableRopeAttach false ;$/Code$ + $Code$_control tvSetPictureRightColorDisabled [[0], [1,0,1,1]]$/Code$ undefined / undefined - (05 April, 2014) - Attachable nearby vehicles may not update on Sling Load Assistant until re-opened. - Nothing + Nothing + - enableSatNormalOnDetail + getPosATLVisual - Enables/Disables satellite normal map od detail maps. + Returns an object's rendered 3D position ATL (z value above ground) in render time scope. - https://community.bistudio.com/wiki/enableSatNormalOnDetail + https://community.bistudio.com/wiki/getPosATLVisual - enableSatNormalOnDetail Boolean + getPosATLVisual Object - enableSatNormalOnDetail state + getPosATLVisual object - $Code$enableSatNormalOnDetail true;$/Code$ + $Code$_playerRenderedPosATL = getPosATLVisual player ;$/Code$ - undefined / undefined + global / undefined - Nothing + Array + - enableSaving + getModelInfo - Enable / disable saving of the game. - When disabled, the autosave is created (if not forbidden by save == false). + Returns object's model info in format [modelName, modelPath, hasSkeleton]. Model path is suitable for use with createSimpleObject command. - https://community.bistudio.com/wiki/enableSaving + https://community.bistudio.com/wiki/getModelInfo - enableSaving Boolean - - enableSaving Array + getModelInfo Object - enableSaving enable - - enableSaving [enable, save] + getModelInfo object - $Code$enableSaving false ; // Saving disabled and make autosave. - enableSaving true ; // Saving enabled without autosave. - enableSaving [ false, false ]; // Saving disabled without autosave. - enableSaving [ false, true ]; // Saving disabled and make autosave. - enableSaving [ true, false ]; // Saving enabled without autosave. - enableSaving [ true, true ]; // Saving enabled and make autosave.$/Code$ + $Code$_modelInfo = getModelInfo player ;$/Code$ + + $Code$_modelInfo = getModelInfo cursorObject ;$/Code$ undefined / undefined @@ -22725,155 +23875,147 @@ - Nothing - Nothing + Array + - enableSentences + vectorMultiply - Enables radio transmissions to be heard and seen on screen. It does not affect KBTell conversations. + Multiplies 3D vector by a scalar. - https://community.bistudio.com/wiki/enableSentences + https://community.bistudio.com/wiki/vectorMultiply - enableSentences Boolean + Array vectorMultiply Number - enableSentences enable + vector vectorMultiply scalar - $Code$enableSentences false;$/Code$ + $Code$_newVector = [1,2,3] vectorMultiply 3; //[3,6,9]$/Code$ - undefined / local + undefined / undefined + (28 Jun, 2014) + (ArmA3 1.22)Algorithm: + $Code$ + Vector = [x,y,z]; scalar = a; + Result = [(x * a),(y * a),(z * a)]; + $/Code$ + It is recommended to use vectorMultiply instead of BIS_fnc_vectorMultiply. This is a very useful function, as it can be used with the velocity command to move an object from one position to another. (ie vector1 to vector2 ) - ensure both positions are found using getPosASL. + $Code$ + _obj setVelocity ((( getPosASL _target) vectorDiff ( getPosASL _obj)) vectorMultiply 2); + $/Code$ - Nothing + Array + - enableSimulationGlobal + createTeam - MP command. Enable or disable simulation for given entity, globally. Call this only from the server. Has the same effect as enableSimulation when used in SP. + Create a team and name it. - https://community.bistudio.com/wiki/enableSimulationGlobal + https://community.bistudio.com/wiki/createTeam - Object enableSimulationGlobal Boolean + createTeam Array - entity enableSimulationGlobal enable + createTeam [type, name] - $Code$_myObject enableSimulationGlobal false;$/Code$ + $Code$_team = createTeam ["USMC_Team", "Fire Team Red"];$/Code$ - global / global + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - - (October 21, 2014) - Units that have been previously subjected to enableSimulation false; or enableSimulationGlobal false; may stay unrecognised for a long time even after simulation was re-enabled, returning objNull as cursorTarget. Force revealing units with reveal command usually solves the problem. For example: $Code${ player reveal _x} forEach allUnits ;$/Code$ - Nothing + Team_Member + - enableSimulation + faction - Enable / disable simulation for given entity. + Gets unit faction. Factions are defined under CfgFactionClasses. If the given faction is not defined, the command returns empty string. Standard Factions include: + West: "USMC", "CDF" + East: "RU", "INS" + Guer: "GUE" + Civ: "CIV", "CIV_RU" + West: "BIS_US", "BIS_CZ", "BIS_GER" + East: "BIS_TK", "BIS_TK_INS" + Guer: "BIS_TK_GUE", "BIS_UN" + Civ: "BIS_TK_CIV", "BIS_CIV_special" + British Armed Forces DLC + West: "BIS_BAF" + Private Military Company DLC + Guer: "PMC_BAF" + West: "BLU_F" (NATO), "BLU_G_F" (FIA) + East: "OPF_F" (CSAT), "OPF_G_F" (FIA) + Guer: "IND_F" (AAF), "IND_G_F" (FIA) + Civ: "CIV_F" (Civilians) + Arma 3 - APEX + West: "BLU_T_F" (Pacific NATO), "BLU_CTRG_F" (Pacific CTRG), "BLU_GEN_F" (Gendarmerie) + East: "OPF_T_F" + Guer: "IND_C_F" (Syndikat) + "CIV_IDAP_F" - https://community.bistudio.com/wiki/enableSimulation + https://community.bistudio.com/wiki/faction - Object enableSimulation Boolean + faction Object - entity enableSimulation state + faction unitName - $Code$player enableSimulation false;$/Code$ + $Code$_playersFaction = faction player ;$/Code$ - global / local + global / undefined - (15 July, 2009) - enableSimulation will "freeze" the unit, including animations, eye blinking, etc ; you cannot switchMove or playMove. - the unit can still take damages and report status and enemies by radio. - - (19 July, 2011) - Nou/Jaynus have discovered something quite important about the Arma2 engine: - Orient yourself to the enableSimulation command in ARMA 2: - If simulation is disabled on objects (this enablesimulation false), they do not send updates across the network, drastically reducing traffic across the network by an order of magnitude. What this means in practicality is that it is possible to have huge mission maker created cities with no or negligible impact on mission performance. Mission placed objects is the most common cause of performance woes - so this is huge news, and was previously undocumented, both on the BIS wiki and elsewhere. - There are some quirks. - While an object which has enableSimulation false set on it will take damage, it will not display any animations or damage states until enableSimulation is enabled back onto it. If you want to disable simulation on a unit and then show it as dieing once it is hit or damaged, add an eventhandler onto it which enables simulation on the object when it is hit or killed. Hit handler for best visual, killed handler for best performance. - This discovery will be the basis of a new unit caching script by Jaynus. - This also has importance in a technical sense: bandwith is the most significant factor in mission performance. The lower the server bandwith, the better the performance. - - (9 Sept, 2011) - Objects with disabled simulation are not calculated for lightsources beyond the global light (moon/sun), so any light sources you create will not light them. - - (12 Nov, 2011) - Contrary to Krause's suggestions above, using "this enableSimulation False" on static objects has no effect on a dedicated server's bandwidth usage or FPS (as per current 1.59 Release version). - - (8 May, 2012) - re: Homer. - Yep. That's because this functionality is now part of the basic arma netcode. Pretty nice :) - - (October 3, 2014) - Units with disabled simulation will not be affected by gravity. - - (October 21, 2014) - Units that have been previously subjected to enableSimulation false; or enableSimulationGlobal false; may stay unrecognised for a long time even after simulation was re-enabled, returning objNull as cursorTarget. Force revealing units with reveal command usually solves the problem. For example: $Code${ player reveal _x} forEach allUnits ;$/Code$ - - (May 23, 2015) - After using enableSimulation false or enableSimulationGlobal false on an object, setPos will still update its position across the network in MP. - - (December 2, 2015) - After using enableSimulation false or enableSimulationGlobal false on a vehicle (car, helo), don't forget to re-enable simulation on this vehicle before a player jumps into it. Otherwise, he will be stick in it, with a black screen and no way to escape! - - (February 5, 2016) - cursorTarget returns a null_object for objects with disabled simulation. But you can find them with other commands such nearEntities. - - (September 1, 2016) - Since Arma 3 1.56 the object can also be returned with cursorObject even if the simulation is not enabled + Faction behaves slightly differently to side. Side can refer to the pilot or commander of a vehicle, but faction never changes. It always returns the 'country of manufacture'. - Nothing + String + - enableStamina + fogParams - Enable/disable stamina system + A getter for setFog (Alt Syntax). Returns extended params for the fog - https://community.bistudio.com/wiki/enableStamina + https://community.bistudio.com/wiki/fogParams - Object enableStamina Boolean + fogParams - unit enableStamina enabled + fogParams - $Code$player enableStamina true;$/Code$ + $Code$_fog = fogParams$/Code$ undefined / undefined @@ -22881,54 +24023,62 @@ - Nothing + Array + - enableTeamSwitch + resize - Enable / disable Team Switch. The default setting is enabled. + Changes the size of the given array. The command does not return new array, it resizes the source array to the desired number of elements. If the new size is bigger than the current size, the new places are filled with nils. - https://community.bistudio.com/wiki/enableTeamSwitch + https://community.bistudio.com/wiki/resize - enableTeamSwitch Boolean + Array resize Number - enableTeamSwitch enable + array resize count - + $Code$_arrayNum = [0,1,2,3,4]; + _arrayNum resize 2; // _arrayNum is now [0,1]$/Code$ + undefined / undefined + (November 13, 2014) + Use this number to resize the array to the number of elements desired, not the desired index of the final element. + resize cannot be used to create a new array. - Nothing + Nothing + - enableUAVConnectability + asin - Enables unit's AV terminal(s) connecting to UAV. + Arcsine of a number, result in Degrees. - https://community.bistudio.com/wiki/enableUAVConnectability + https://community.bistudio.com/wiki/asin - Object enableUAVConnectability Array + asin Number - object enableUAVConnectability [uav, checkAllItems] + asin x - $Code$unit enableUAVConnectability [uav,true];$/Code$ + $Code$_degrees=asin 0.5 + returns 30$/Code$ undefined / undefined @@ -22936,28 +24086,28 @@ - Nothing + Number + - enableUAVWaypoints + isIRLaserOn - Enables/disables the option for player to set waypoints for UAV in AV terminal. + Returns true if there is a linked and enabled IR on the given weapon. - https://community.bistudio.com/wiki/enableUAVWaypoints + https://community.bistudio.com/wiki/isIRLaserOn - Object enableUAVWaypoints Boolean + Object isIRLaserOn String - uav enableUAVWaypoints enable + unit isIRLaserOn weapon - $Code$_uav enableUAVWaypoints false ; - hint str waypointsEnabledUAV _uav; // returns false$/Code$ + $Code$player isIRLaserOn currentWeapon player ;$/Code$ undefined / undefined @@ -22965,129 +24115,225 @@ - Nothing + Boolean + - enableVehicleCargo + addPublicVariableEventHandler - Enable/disable option to transport other vehicles (if configured) or be transported. + 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 select 0: String - broadcast variable name (same variable name EH is attached to) + _this select 1: Anything - broadcast variable value + _this select 2: Object, Group - target the variable got set on with setVariable (see: alternative syntax) + Please note: + * EH works only in Multiplayer environment. + * EH will not fire on the machine that executed broadcast 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. + Alt syntax of this command doesn't work as intended - https://community.bistudio.com/wiki/enableVehicleCargo + https://community.bistudio.com/wiki/addPublicVariableEventHandler - Object enableVehicleCargo Boolean + String addPublicVariableEventHandler Code + + String addPublicVariableEventHandler Array - vehicle enableVehicleCargo enable + varName addPublicVariableEventHandler code + + varName addPublicVariableEventHandler [target, code] - $Code$vehicle enableVehicleCargo true ;$/Code$ + $Code$"publicThis" addPublicVariableEventHandler { + hint format [ + "%1 has been updated to: %2", + _this select 0, + _this select 1 + ] + };$/Code$ + + $Code$// Client: + "'^:)123BURP,+=lol" addPublicVariableEventHandler { hint ("NUTS are " + (_this select 1))}; + // Server: missionNamespace setVariable ["'^:)123BURP,+=lol", "craZZZZy"]; + publicVariable "'^:)123BURP,+=lol";$/Code$ - undefined / undefined + global / local - (June 20, 2016) - Setting enableVehicleCargo to true does not mean a vehicle can now load vehicles as cargo. They are still required to be correctly setup as shown on the Vehicle in Vehicle Transport page. + (22 Dec, 2007) + 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. + + (27 Feb, 2014 00:57) + 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. + + (27 Feb, 2014 08:40) + 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 scheduled script from it. + $Code$//script with preInit = 1; in CfgFunctions + 0 = 0 spawn { + "someVar" addPublicVariableEventHandler { + //yourcode + }; + };$/Code$ + + (November 23, 2015) + 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 { + "OnServer" addPublicVariableEventHandler { hint "This event handler still fired!"; }; + publicVariableServer "OnServer"; + };$/Code$ + $Code$// 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!"; }; + client ID publicVariableClient "OnClient"; + $/Code$ - Nothing + Nothing - Nothing + - enableVehicleSensor + append - Enable/disable given sensor + Appends array2 to the back of array1 modifying array1. + NOTE: append does not return array, it modifies existing array. If you need to return a copy, use "+": + $Code$array3 = array1 + array2;$/Code$ - https://community.bistudio.com/wiki/enableVehicleSensor + https://community.bistudio.com/wiki/append - Object enableVehicleSensor Array + Array append Array - vehicle enableVehicleSensor [componentName, state] + array1 append array2 - $Code$vehicle player enableVehicleSensor ["PassiveRadarSensorComponent",false]; // disables passive radar$/Code$ + $Code$_arr = [1,2,3]; + _arr append [4,5,6]; + hint str _arr; //[1,2,3,4,5,6]$/Code$ undefined / undefined + (March 9, 2015) + $Code$_array1 append _array2$/Code$ is roughly 1.2x faster (depending on array size) than $Code$_array1 = _array1 + _array2$/Code$ (Averaged over 10.000 iterations with two identical arrays containing the numbers 0 through 9) + The larger the arrays to append, the faster append is as it does not create a new array, which happens with array addition. + + (May 21, 2015) + Array "unshift" implementation using append, a faster alternative to BIS_fnc_arrayUnShift : + $Code$KK_fnc_unshift = { + private ["_arr", "_tmp"]; + _arr = _this select 0; + _tmp = [_this select 1]; + _tmp append _arr; + _arr resize 0; + _arr append _tmp; + _arr + }; + // Example + arr = [1,2,3]; + [arr, 0] call KK_fnc_unshift; //both arr and return of function are [0,1,2,3] + $/Code$ + + (May 21, 2015) + Array "insert" implementation using append, much faster alternative to BIS_fnc_arrayInsert : + $Code$KK_fnc_insert = { + private ["_arr", "_i", "_res"]; + _arr = _this select 0; + _i = _this select 2; + _res = []; + _res append (_arr select [0, _i]); + _res append (_this select 1); + _res append (_arr select [_i, count _arr - _i]); + _res + }; + // Example + arr = [1,2,3,4]; + [arr, ["a","b"], 2] call KK_fnc_insert; //[1,2,"a","b",3,4]$/Code$ + + (May 21, 2015) + A faster alternative to BIS_fnc_arrayPushStack using append : + $Code$KK_fnc_pushStack = { + _this select 0 append (_this select 1); + _this select 0 + }; + // Example + arr = [1,2,3]; + [arr,[4,5,6]] call KK_fnc_pushStack; //both arr and function return are [1,2,3,4,5,6]$/Code$ - Nothing - - - - - enableWeaponDisassembly - - - Enables or disables disassembly of static weapons. Could be applied to local player, to another unit or to static weapon directly. - - - https://community.bistudio.com/wiki/enableWeaponDisassembly - - - enableWeaponDisassembly Boolean - - Object enableWeaponDisassembly Boolean - - - enableWeaponDisassembly enable - - entity enableWeaponDisassembly enable - - - $Code$enableWeaponDisassembly false ;$/Code$ - - $Code$soldier1 enableWeaponDisassembly false ;$/Code$ - - $Code$mortar1 enableWeaponDisassembly false ;$/Code$ - - - global / global - - - - - Nothing - Nothing + Nothing + - endLoadingScreen + getCompatiblePylonMagazines - Finishes loading screen started by startLoadingScreen. + Get array of compatible pylon magazines - https://community.bistudio.com/wiki/endLoadingScreen + https://community.bistudio.com/wiki/getCompatiblePylonMagazines - endLoadingScreen + Object getCompatiblePylonMagazines Number + + String getCompatiblePylonMagazines Number - endLoadingScreen + vehicle getCompatiblePylonMagazines pylon + + vehicleClass getCompatiblePylonMagazines pylon - $Code$startLoadingScreen ["Loading My Mission"]; - //Batch of code - //Batch of code - //Batch of code - progressLoadingScreen 0.5; - //Batch of code - //Batch of code - //Batch of code - endLoadingScreen ;$/Code$ + $Code$vehicle player getCompatiblePylonMagazines 0; // returns array of arrays containing all compatible magazines$/Code$ + + $Code$"Plane_Fighter_01_Base_F" getCompatiblePylonMagazines 3; // returns array of compatible magazines for the 3rd pylon$/Code$ + + $Code$jet1 getCompatiblePylonMagazines "pylon1"; // returns array of compatible magazines for the 1st pylon$/Code$ + + $Code$// Get all pylon names for "Plane_Fighter_01_Base_F" + private _allPylons = "true" configClasses ( + configFile + + "CfgVehicles" + + "Plane_Fighter_01_Base_F" + + "Components" + + "TransportPylonsComponent" + + "pylons" + ) apply { configName _x}; + hint str _allPylons; + /* return: + [ + "pylon1", + "pylon2", + "pylon3", + "pylon4", + "pylonBayRight1", + "pylonBayLeft1", + "pylonBayCenter1", + "pylonBayCenter2", + "pylonBayCenter3", + "pylonBayCenter4", + "pylonBayCenter5", + "pylonBayCenter6" + ]*/$/Code$ undefined / undefined @@ -23095,75 +24341,59 @@ - Nothing + Array - Array + - endMission + markerType - Finish the mission. - The end type can be: - "CONTINUE" - "KILLED" - "LOSER" - "END1" - "END2" - "END3" - "END4" - "END5" - "END6" - Mission saves are deleted. Use failMission if they should not. - To maintain Arma 3 visual style, it's recommended to use BIS_fnc_endMission instead. + Get type of marker. Note: This function is identical to getMarkerType. See cfgMarkers for a list of standard markers. - https://community.bistudio.com/wiki/endMission + https://community.bistudio.com/wiki/markerType - endMission String + markerType String - endMission endType + markerType markerName - $Code$endMission "END1";$/Code$ + $Code$if ( markerType "Marker1" == "Empty") then { hint "Marker1 is not an icon!"}$/Code$ - local / local + global / undefined + (March 17, 2014) + Using markerType is a good method to determine if a string is a valid marker name, unless the marker type isn't set. $Code$if (markerType "mark1" != "") then {hint "valid marker"}$/Code$ - Nothing + String + - endl + lockedTurret - Creates a string containing a line break, similar to lineBreak for text. The name is inspired by c++ std::endl (line end). The command returns "\r\n", which contains control characters rather than printable characters: - hint str count "\r\n"; // 4 - hint str count endl ; // 2 - The line break works for diag_log and ctrlSetText. It doesn't work with the hint because hint interprets printable "\n" as line break instead. Alternatively one can use toString command to get other characters. + Check whether gunner position of the vehicle turret is locked. - https://community.bistudio.com/wiki/endl + https://community.bistudio.com/wiki/lockedTurret - endl + Object lockedTurret Array - endl + vehicle lockedTurret turretPath - $Code$diag_log ("line1" + endl + "line2");$/Code$ - - $Code$_ctrl = findDisplay 46 ctrlCreate ["RscTextMulti", -1]; - _ctrl ctrlSetPosition [0,0,1,1]; - _ctrl ctrlCommit 0; - _ctrl ctrlSetText format ["line1%1line2%1line3", endl ];$/Code$ + $Code$_locked = tank lockedTurret [0];$/Code$ undefined / undefined @@ -23171,70 +24401,62 @@ - String + Boolean + - engineOn + createGuardedPoint - Activates and deactivates the engine of a vehicle. This command has to be executed where vehicle is local. - NOTE: Executed on a remote vehicle this command may turn the engine on but then it will get turned off by itself after a short while. + Adds a point guarded by the given side (scripted way of adding equivalent of "GUARDED BY" trigger in Editor ). A closest AI group in the given side with assigned "GUARD" waypoint will attempt to secure this guard point. The actual guarded position is determined via the following rules: + Given "position" is always considered. It could be Object, Group, Position2D or Position3D. In every case, z coordinate will be ignored and point will be placed on nearest surface. + If "objectMapID" is not negative, the position of the object with the given ID is used (Overrides "position"). -1 to ignore this argument. z of the object position will be intact. + If the given "vehicle" is valid, the position of the vehicle is extracted and guarded (Overrides both "position" and "objectMapID"). objNull to ignore. z of the vehicle position will be intact. + For use with "GUARD" waypoint. How does "GUARD" waypoint work: Waypoint:Guard - https://community.bistudio.com/wiki/engineOn + https://community.bistudio.com/wiki/createGuardedPoint - Object engineOn Boolean + createGuardedPoint Array - vehicle engineOn state + createGuardedPoint [side, position, objectMapID, vehicle] - $Code$if (! isEngineOn _jeep) then {_jeep engineOn true };$/Code$ - - $Code$if ( local vehicle player ) then { - vehicle player engineOn true ; - } else { - hint "Get in the driver seat, soldier!"; - };$/Code$ + $Code$createGuardedPoint [ east, [0,0], -1, vehicle player ];$/Code$ - local / global + undefined / undefined - (August 25, 2014) - To switch engine off can also use setFuel and fuel : - $Code$ private "_gas"; - _gas = fuel heli; - heli setFuel 0; - sleep 0.01; - heli setFuel _gas;$/Code$ - Also sets helicopter fuel back to original quantity. Works on every other vehicle. - Nothing + Nothing + - enginesIsOnRTD + set3DENLinesVisible - Returns which engines are producing some work. + Toggle visibility of Eden Editor lines. - https://community.bistudio.com/wiki/enginesIsOnRTD + https://community.bistudio.com/wiki/set3DENLinesVisible - enginesIsOnRTD Object + set3DENLinesVisible Array - enginesIsOnRTD RTD_helicopter + set3DENLinesVisible [showMap, showScene] - $Code$_enginesTaru = enginesIsOnRTD _taru// Returns [true,true]$/Code$ + $Code$set3DENLinesVisible [ false, false ]; + // Hide all lines$/Code$ undefined / undefined @@ -23242,28 +24464,33 @@ - Array + Nothing + - enginesRpmRTD + waypointSpeed - Returns all engines RPM + Gets the waypoint speed. + Possible values are: + "UNCHANGED" + "LIMITED" + "NORMAL" + "FULL" - https://community.bistudio.com/wiki/enginesRpmRTD + https://community.bistudio.com/wiki/waypointSpeed - enginesRpmRTD Object + waypointSpeed Array - enginesRpmRTD RTD_helicopter + waypointSpeed waypoint - $Code$_UH80_E1 = ( enginesRpmRTD _UH80) select 0;//engine 1 RPM - _UH80_E2 = ( enginesRpmRTD _UH80) select 1;//engine 2 RPM$/Code$ + $Code$_speed = waypointSpeed [groupOne,1];$/Code$ undefined / undefined @@ -23271,107 +24498,113 @@ - Array + String + - enginesTorqueRTD + setTriggerText - Torque produced by engines in N·m (Newton*meter) + Sets the text label attached to the trigger object. This is used for example as a radio slot label for radio activated triggers. - https://community.bistudio.com/wiki/enginesTorqueRTD + https://community.bistudio.com/wiki/setTriggerText - enginesTorqueRTD Object + Object setTriggerText String - enginesTorqueRTD RTD_helicopter + trigger setTriggerText text - $Code$_UH80_E1 = ( enginesTorqueRTD _UH80) select 0;//engine 1 Torque - _UH80_E2 = ( enginesTorqueRTD _UH80) select 1;//engine 2 Torque$/Code$ + $Code$trigger setTriggerText "Call for support"$/Code$ - undefined / undefined + global / local - Array + Nothing + - entities + editorSetEventHandler - Returns a list of all alive and dead entities of the given type or deriving from the given type. Units in vehicles are ignored. When empty string "" is passed for the type, all entity types are returned. - Alternative syntax introduced in Arma 3 v1.65.138685 allows to filter entities by type and alive status as well as to return entities currently in vehicles. Optimisation tip : Keep number of types in both includeTypes and excludeTypes arrays to a minimum by possibly using parent/base classes. If you have to use several types, arrange them in order so that the more common types go at the beginning of the array. + Sets given event handler of given editor. + i + Some Old Editor Command - https://community.bistudio.com/wiki/entities + https://community.bistudio.com/wiki/editorSetEventHandler - entities String - - entities Array + Control editorSetEventHandler Array - entities type - - entities [typesInclude, typesExclude, includeCrews, excludeDead] + map editorSetEventHandler [handler name,function] - $Code$_allcars = entities "Car";$/Code$ - - $Code$// Return all alive entities on the map: - _allalive = entities [[], [], true, true ];$/Code$ - - $Code$// Return dead and alive entities but logic: - _notlogic = entities [[], ["Logic"], true ];$/Code$ - - $Code$// Return all alive west soldiers on foot: - _footsoldiers = entities [["SoldierWB"], [], false, true ];$/Code$ + $Code$_map editorSetEventHandler ["SelectObject",""]$/Code$ undefined / undefined - (Mar 27, 2014) - In ArmA3 ver 1.14 type (string) can be any children class under configfile "CfgVehicles". e.g. $Code$ entities "All"; //or entities "CAManBase"; etc.$/Code$ - - (July 12, 2016) - In A3 1.62 $Code$entities "CAManBase"$/Code$ does not include entities inside vehicles (crew). - - (May 2, 2017) - You can have multiple classnames in both the include and exclude arrays. - $Code$entities [["SoldierWB", "SoldierEB"],[]] $/Code$ - Array - Array + Nothing + - environmentEnabled + scriptNull - Returns status of enableEnvironment command + A non-existing Script or script that has finished ( scriptDone ). To compare non-existent scripts use isNull or isEqualTo : + scriptNull == scriptNull ; // ERROR! == cannot be used with script object + isNull scriptNull ; // true + scriptNull isEqualTo scriptNull ; // true - https://community.bistudio.com/wiki/environmentEnabled + https://community.bistudio.com/wiki/scriptNull - environmentEnabled + scriptNull - environmentEnabled + scriptNull - $Code$_enabled = environmentEnabled ;$/Code$ + $Code$// Wait until previous script is finished before starting a new one: + [] spawn + { + _script = scriptNull ; + for "_i" from 1 to 10 do { + waitUntil { isNull _script}; + _script = _i spawn { + hint format ["script %1 started", _this]; + sleep 1; + hint format ["script %1 finished", _this]; + sleep 0.2; + }; + }; + };$/Code$ + + $Code$if ( scriptDone (_obj getVariable ["objScript", scriptNull ])) then { + _obj setVariable ["objScript", _obj spawn { + waitUntil { damage _this 0.9}; + hint "Critical Damage!"; + }]; + };$/Code$ + + $Code$str scriptNull ; // NULL-script$/Code$ undefined / undefined @@ -23379,93 +24612,129 @@ - Array + Script_Handle + - estimatedEndServerTime + saveIdentity - Estimated end of MP game in seconds converted to serverTime. + Saves person's identity to Objects.sav file in campaign directory as entry name. - https://community.bistudio.com/wiki/estimatedEndServerTime + https://community.bistudio.com/wiki/saveIdentity - estimatedEndServerTime + Object saveIdentity String - estimatedEndServerTime + unitName saveIdentity name - $Code$// Estimated minutes left: - _min = ( ceil ( estimatedEndServerTime - serverTime ) / 60);$/Code$ + $Code$player saveIdentity "playerid"$/Code$ undefined / undefined + (August 12, 2006) + Can be also used in singleplayer missions to save player status before cutscenes and load it to player's double. - Number + Boolean + - estimatedTimeLeft + orderGetIn - Sets the estimated time left in the game. Using this function the designer can provide a "time left" estimate that is shown in the "Game in progress" screen or in the master browser. This command works in MP only and must be executed on the server only. NOTE that since Arma 3 v1.69 the max value that can be set is 10 hours (36000 seconds) + Force all units in the array to get in or out of their assigned vehicles. Units must be assigned to a vehicle before this command will do anything. - https://community.bistudio.com/wiki/estimatedTimeLeft + https://community.bistudio.com/wiki/orderGetIn - estimatedTimeLeft Number + Array orderGetIn Boolean - estimatedTimeLeft seconds + unitArray orderGetIn order - $Code$estimatedTimeLeft 600; //10 min$/Code$ + $Code$[_unitOne, _unitTwo] orderGetIn true$/Code$ - $Code$// For missions with a hard set limit adjusted via Param1, the following example can be used in the init.sqs file: - estimatedTimeLeft Param1;$/Code$ + $Code$[_unitOne, _unitTwo] orderGetIn false$/Code$ - undefined / global + local / global - This scripting command must be executed on the server to work properly in multiplayer + (8 May, 2014) + (ArmA3 ver 1.18), here's a quick reference to unit's embarkation and disembarkation. + Command + Remote Control + Behavior + Role Unassigning + orderGetIn + false + orderGetIn won't take effect on player controlled AI units, and which needs to be used together with assaignAs command family. Generally speaking, orderGetIn is a Role Excuator. + When orderGetIn was disabled it won't automatically unassign unit's vehicle role but will force the unit get out of the vehicle and stop him re-entering until it was enabled again. orderGetIn false won't stop a unit when he is embarking a vehicle in the half way but unassignVehicle will do. orderGetIn false will wait to fire until the unit enter a vehicle. + allowGetIn + false + allowGetIn won't take effect on player controlled AI units. Different from orderGetIn, this command is a Role Holder, it can control the unit's movement in the half way set by orderGetIn but not by setWaypointType, unit will be forced to get out from a vehicle by allowGetIn false and won't automatically re-enter the vehicle until allowGetIn true + allowGetIn won't do anything with unit's vehicle role + doGetOut + true + Works on player controlled ai silently, unit will automatically get back to the vehicle after disembarkation. (Unit won't get out until vehicle is stopped or landed) + false + commandGetOut + true + Same as doGetOut with radio message. (Unit won't get out until vehicle is stopped or landed) + false + leaveVehicle + false + leaveVehicle can't force a player controlled AI disembark + true + action ["GetOut",_veh] + true + Eject immediately without parachute + false + action ["Eject",_veh] + true + Eject immediately with parachute if needed + false + setWaypointType "GETIN" + false + Waypoint won't be affected by orderGetIn false or allowGetIn false until the unit is on the vehicle. + N/A - Nothing + Nothing + - evalObjectArgument + sendUDPMessage - Return argument in mission editor of a given object. - i - Some Old Editor Command + Send message to given address using UDP protocol. Returns false if the message has not been delivered + Note: Not implemented (see talk page for more info). - https://community.bistudio.com/wiki/evalObjectArgument + https://community.bistudio.com/wiki/sendUDPMessage - Control evalObjectArgument Array + sendUDPMessage Array - map evalObjectArgument [object, argument] + sendUDPMessage [ip, port, message] - $Code$// returns string "[1009.0351, 1319.4928]" - ( findDisplay 128 displayCtrl 51) getObjectArgument ["_unit_1", "POSITION"] - // returns array [1009.0351, 1319.4928] - ( findDisplay 128 displayCtrl 51) evalObjectArgument ["_unit_1", "POSITION"]$/Code$ + $Code$_bool = sendUDPMessage ["192.168.0.1", 2302, "Here goes you message..."];$/Code$ undefined / undefined @@ -23473,135 +24742,133 @@ - Any_Value + Boolean + - everyBackpack + action - Returns array of backpacks stored in given crate or vehicle. Used for accessing backpack content of a backpack on ground. + Make a unit to perform an action. Use the List of Actions for reference about the available actions and their syntax. + NOTES: + While this command should be executed where unit is local, it is not always the case. Actions such as "Eject", "GetOut", "GetInXXXX", "MoveToXXXX", etc can be executed on remote units. + In SP, when user Alt+Tabs the simulation is paused and so the action will also halt until user returns to the game. For example, player action ["GetInDriver", car] executed while user is Alt+Tabbed will result in user seeing the action happening when he returns to the game screen. This doesn't happen in MP. - https://community.bistudio.com/wiki/everyBackpack + https://community.bistudio.com/wiki/action - everyBackpack Object + Object action Array - everyBackpack box + unit action actionArray - $Code$everyBackpack cursorTarget ;$/Code$ + $Code$player action ["SitDown", player ];$/Code$ - $Code$_vehicleBackpacks = everyBackpack vehicle player ;$/Code$ + $Code$_soldier action ["Eject", vehicle _soldier];$/Code$ - undefined / undefined + local / global - (Apr 29, 2014) - (ArmA3 ver 1.16), here's a quick reference to backpack command family. - Command - Operand type - Return - Example - firstBackpack - Object (WeaponHolder, AmmoCrate, VehicleCrate) - Object (eg 2bba9d00# 163957: backpack_compact.p3d) - firstBackpack ( getPos player nearestObject "weaponholder") - backpackContainer - Unit( Object ) - Object (eg 2bba9d00# 163957: backpack_compact.p3d) - backpackContainer player //Currently same as unitBackpack - unitBackpack - Unit( Object ) - Object (eg 2bba9d00# 163957: backpack_compact.p3d) - unitBackpack player //Currently same as backpackContainer - backpack - Unit( Object ) - String (eg 2bba9d00# 163957: backpack_compact.p3d) - backpack player //See also ( typeOf backpackContainer player ) or ( typeOf unitBackpack player ) - backpackCargo - Object (WeaponHolder, AmmoCrate, VehicleCrate) - Array of String (eg ["Backpack0","Backpack1"]) - backpackCargo _AmmoCrate - getBackpackCargo - Object (WeaponHolder, AmmoCrate, VehicleCrate) - Array of Array (eg [["Backpack0","Backpack1"],[1,1]]) - getBackpackCargo _AmmoCrate - everyBackpack - Object (WeaponHolder, AmmoCrate, VehicleCrate) - Array of Object (eg [22504f00# 163960: backpack_fast.p3d...]) - everyBackpack _AmmoCrate + (28 Aug, 2009) + In ArmA 2, you can place a unique unit (for example a boat, far of all combats) and use it for all command lines with action. + + (March 27, 2015) + This command has no effect when a dead unit is used as input. + + (June 27, 2017) + $Code$player action ["SWITCHWEAPON",player,player,-1]$/Code$ + Switching weapon to the back. + + (July 20, 2017) + Some of the actions (such as "DropWeapon") do not always execute, and there should be a set of conditions for them to run. + The unit must be able to perform the dropping animation in order for the action to properly execute. + So, if for example we spawn a unit at [0,0,0] and make it perform a "DropWeapon" action - it won't work if [0,0,0] is water (which it is, if the current map is an island) because the unit will be swimming. + Also, you cannot stack up actions right after the other. If you run a "DropWeapon" action when the current action animation is still going - it will not perform. + There are a few more conditions for an action to perform, but relying on a hundred percent success of the action is not a good practice. - Array + Nothing + - everyContainer + lock - Returns array of all containers (uniforms, vests, backpacks) stored in given crate or vehicle. Used for accessing containers content stored in ammo box or ground holder. + Lock vehicle (disable mounting / dismounting) for player. Similar to setVehicleLock when number is used as param. - https://community.bistudio.com/wiki/everyContainer + https://community.bistudio.com/wiki/lock - everyContainer Object + Object lock Boolean + + Object lock Number - everyContainer box + vehicleName lock locked + + vehicleName lock lockstate - $Code$everyContainer cursorTarget ; - // [ - //["V_PlateCarrier1_rgr",2bc06b00# 163955: dummyweapon.p3d], - //["U_B_CombatUniform_mcam",2bc07900# 163954: dummyweapon.p3d] - //]$/Code$ + $Code$_jeepOne lock true ;$/Code$ + + $Code$heli lock true ; + locked heli; //2 + heli lock false ; + locked heli; //0 + heli lock 1; + locked heli; //1$/Code$ - undefined / undefined + local / global - (July 20, 2017) - The returned array is in the following format: - $Code$[ - [containerClassname1, containerObject1], - [containerClassname2, containerObject2], - .... - [containerClassnameN, containerObjectN] - ] - $/Code$ - Please do note that typeOf containerObjectN does not return containerClassnameN but rather the containerClass configured in config (usually "supplyN") + (January 9, 2010) + Lock prevents AI persons mounting or dismounting vehicles when ordered to do so and players are prevented from doing both too, but AI will dismount when a vehicle is damaged. + + (September 22, 2010) + If an AI group (eg Mechanized Infantry) has its vehicule locked with its crew in it, it will mount or dismount it anyway. But a player in this group won't be able to enter the vehicle. + + (April 2, 2013) + From Arma 3 version 0.50 can be used Number as lock parameter : + 0 - Unlocked + 1 - Default + 2 - Locked + 3 - Locked for player + + (March 4, 2015) + 1 - is DEFAULT lock for vehicle placed in editor. Player that is not the leader in a group of AIs will not be able to enter this vehicle. - Array + Nothing - Nothing + - execEditorScript + pitch - Execute an editor script for the specified object. - i - Some Old Editor Command + Returns the pitch of a persons voice. - https://community.bistudio.com/wiki/execEditorScript + https://community.bistudio.com/wiki/pitch - Control execEditorScript Array + pitch Object - map execEditorScript [object,script] + pitch person - $Code$_map execEditorScript ["_team_1","create"]$/Code$ + $Code$pitch player$/Code$ undefined / undefined @@ -23609,35 +24876,36 @@ - Any_Value + Number + - execFSM + text - Executes scripted FSM and returns the FSM handle or 0 when failed. The FSM file is first searched in the mission folder, then in the campaign scripts folder and finally in the global scripts folder. Argument (if any) are available in _this variable inside FSM. In Arma 3 FSM handle is also available in _thisFSM variable. + Creates a structured text containing the given plain text if argument is String or returns location's text value if argument is Location (see Alt Syntax) - https://community.bistudio.com/wiki/execFSM + https://community.bistudio.com/wiki/text - Anything execFSM String + text String - execFSM String + text Location - arguments execFSM filename + text string - execFSM filename + text location - $Code$_id = player execFSM "test.fsm";$/Code$ + $Code$_stxt2 = text "Hello world.";$/Code$ - $Code$_handle = [_a, _b, _c] execFSM "test.fsm";$/Code$ + $Code$_townName = text myTownLocation;$/Code$ - $Code$_handle = execFSM "test.fsm";$/Code$ + $Code$_loc = text nearestLocation [ position player, "NameMarine"]; //"Marina Bay"$/Code$ undefined / undefined @@ -23645,85 +24913,68 @@ - Number - Number + Structured_Text - String + - execVM + say2D - Compiles and adds SQF Script to the scheduler queue and returns script handle. The script is first searched for in the mission folder, then in the campaign scripts folder and finally in the global scripts folder. The script does not execute immediately upon running execVM command, but with some delay. How much delay is unknown as it largely depends on how many other scripts there are in the queue and how busy is VM. The optional argument is passed to the script in private variable _this. In Arma 3 the script handle is also passed to the script in _thisScript variable. - In order to understand execVM consider the following comparison: - $Code$ private _handle = _args execVM "someFile.sqf"; - // is practically identical to - private _handle = _args spawn compile preprocessFileLineNumbers "someFile.sqf";$/Code$ - So if you need multiple execution of the same file, you might want to store it in a function ( Functions Library ), otherwise, for a single execution, execVM is a good choice. + Plays given sound in 2D - https://community.bistudio.com/wiki/execVM + https://community.bistudio.com/wiki/say2D - Anything execVM String + Object say2D String - execVM String + Object say2D Array + + Array say2D String + + Array say2D Array - arguments execVM filename + from say2D sound - execVM filename + from say2D [sound, maxTitlesDistance, speed] + + [from, to] say2D sound + + [from, to] say2D [sound, maxTitlesDistance, speed] - $Code$_handle = execVM "test.sqf";$/Code$ - - $Code$_handle = player execVM "test.sqf"; - waitUntil { scriptDone _handle};$/Code$ - - $Code$// In Arma 3 this is also possible: - _handle = execVM "123.sqf"; - waitUntil { isNull _handle};$/Code$ - - $Code$[4] execVM "showDamage.sqf"; - // showDamage.sqf - _damage = _this select 0; - hint format ["%1", _damage];$/Code$ - + - undefined / undefined + global / local - (November 23, 2010) - Passing variables to the script file - To pass multiple variables to the script file, use an array e.g: - null = [myunit,1234] execVM "test.sqf"; - Now within test.sqf to access the elements, use the following: - _myunit = _this select 0; - _myvar = _this select 1; - Script_Handle - Script_Handle + Nothing - Nothing - Nothing - Nothing + - exec + assignedDriver - Execute a script using (the deprecated but still available).sqs syntax. The argument is passed to the script in the "_this" variable, and magic variable "_time" within the script contains the time in seconds that the script has been running. - Alternatively use execVM command in combination with.sqf syntax. - Learn more about scripts under Scripts. + Returns the soldier assigned to the given vehicle as a driver. - https://community.bistudio.com/wiki/exec + https://community.bistudio.com/wiki/assignedDriver - Any_Value exec String + assignedDriver Object - argument exec script + assignedDriver vehicle - $Code$[player, _jeep] exec "getin.sqs"$/Code$ + $Code$_driver= assignedDriver vehicleName$/Code$ undefined / undefined @@ -23731,162 +24982,142 @@ - Nothing + Object + - exitWith + getAllOwnedMines - Exits current scope {...} it is executed from if condition evaluates true, creates new scope {...code...} and executes the given code in it. Often used for exiting do, for, count or forEach. Simply exiting waitUntil or onEachFrame scopes with exitWith will have no effect as these scopes are called repeatedly by the engine and require different handling to terminate (see Example 3). + Gets all mine objects this unit has ownership over. - https://community.bistudio.com/wiki/exitWith + https://community.bistudio.com/wiki/getAllOwnedMines - If_Type exitWith Code + getAllOwnedMines Object - ifType exitWith code + getAllOwnedMines unit - $Code$if (_x 5) exitWith { echo "_x is too big"; _x} - // When _x is greater than 5, outputs message and terminates code in current level with value of _x.$/Code$ - - $Code$for "_j" from 1 to 10 do - { - player sideChat format ["%1",_j]; - if (_j==5) exitWith { player sideChat "5 is enough"}; - }; - player sideChat "Complete"; - // Only the "for" loop will exit when the exitWith condition has been fulfilled (not the whole script). Execution will continue after the end of the loop (player sideChat "Complete").$/Code$ - - $Code$// Most loops will also terminate when their scope exited. To exit and terminate scopes which are called every frame such as onEachFrame and waitUntil use the following examples: - onEachFrame { - if (! alive player ) exitWith { - onEachFrame {} - } - } - _time = time + 10; - waitUntil { - if ( time _time) exitWith { - true - } - }$/Code$ + $Code$_mines = getAllOwnedMines player ;$/Code$ undefined / undefined - (May 28, 2010) - Since ArmA2 uses Blocks in FSM as any ordinary Handle like while, for etc. in Scripts, ExitWith also only closes the Block in the FSM. - - (August 04, 2013) - The command will exit the current scope - no ifs no buts. If the current scope is a loop, it will exit the loop. If the current scope is the main body of a script, it will exit the script. For more understanding of scopes and exitWith have a look at this resource. - - (January 06, 2014) - To further explain Killzone_Kid 's above statement, exitWith does not work as described within any subsequent inner scopes of a loop - it will only simply exit the current scope. For example, this code will not exit the while loop: - $Code$ while { true } do { // 'while' scope - if ( player == ( leader player )) then { // 'if-then' scope - if ( time (5 * 60)) exitWith {}; // This will only exit the 'if-then' scope - }; - sleep 1; - }; - hint "Mission Started"; // This code will never execute$/Code$ - - (March 10, 2016) - exitWith cannot be used in event handlers with override ability to simply exit with override value. The following is incorrect: - $Code$// INCORRECT USAGE - onMapSingleClick { if (! isServer ) exitWith { true }};$/Code$ - The override value must be returned in the main scope of EH, but since it is exited with exitWith, it never happens. The correct way in this case would be: - $Code$// CORRECT USAGE - onMapSingleClick { call { if (! isServer ) exitWith { true }}};$/Code$ - exitWith will exit current call scope only and override value therefore will appear in the main scope of the EH, right where we want it. - - (October 12, 2016) - exitWith does not use standard "if-then" syntax, but a unique "if-exitWith" structure. - Anything + Array + - exit + cutText - Stops the execution of a SQS script. - It's ignored in SQF Scripts. + Displays a text message in the center of the screen. The text can be displayed on multiple lines by using "\n" new line characters: cutText ["line1\nline2\nline3", "PLAIN"];. Since Arma 3 v1.73.142260 this command supports Structured Text formatting. + For greater efficiency and ease of modability it is recommended to use named layers available with alternative syntax since Arma 3 v1.57.134673 - https://community.bistudio.com/wiki/exit + https://community.bistudio.com/wiki/cutText - exit + cutText Array + + Number cutText Array + + String cutText Array - exit + cutText [text, type, speed, showInMap, isStructuredText] + + layer cutText [text, type, speed, showInMap, isStructuredText] + + layerName cutText [text, type, speed, showInMap, isStructuredText] - $Code$exit$/Code$ + $Code$cutText ["","BLACK OUT"]; + cutText ["Hello World!","PLAIN",2];$/Code$ + + $Code$2 cutText ["Hello World!","PLAIN",2];$/Code$ + + $Code$_layer1 = "normal" cutText ["In The Centre","PLAIN"]; + _layer2 = "down" cutText ["At The Bottom","PLAIN DOWN"];$/Code$ + + $Code$// Since Arma 3 v1.73.142260: + cutText [" t color='#ff0000' size='5' RED ALERT! /t br/ ***********", "PLAIN", -1, true, true ];$/Code$ undefined / local + (September 20, 2013) + In Arma 3 "PLAIN" param will display your text where the crosshair is, "PLAIN DOWN" will push the text further down, closer to the bottom of the screen. + + (July 6, 2016) + The value for speed has to be greater 0. If 0 is used as speed the default value (1) will be used. + If you want to create an "instant" effect you can use a really small value (e.g. 0.001) - Nothing + Nothing - Nothing - Number + - expectedDestination + forceMap - Return expected destination of unit as an array with format: [ Position, planningMode, forceReplan]. + Opens non-interactive main map in background that overrides user screen. The user is able to fire but cannot see the world just the map. To force open interactive map use openMap command. - https://community.bistudio.com/wiki/expectedDestination + https://community.bistudio.com/wiki/forceMap - expectedDestination Object + forceMap Boolean - expectedDestination person + forceMap show - + $Code$forceMap true$/Code$ + - local / undefined + undefined / local - (16:24, 3 March 2007 (CET)) - For AI units I have found the following values: planningMode is "LEADER PLANNED" when the unit is ordered by the group leader to go somewhere or if the unit is the group leader and it follows a waypoint. Otherwise planningMode it is "DoNotPlan". Units moving in formation have "DoNotPlan" as long as they don't receive orders by the group leader. Units also have "DoNotPlan" when they don't move. Units executing special formation tasks like engaging or return to formation have "FORMATION PLANNED" as long they haven't fulfilled the task. + In OFP v1.96, the mapAnim series of commands, together with forceMap can only be used in the intro and mission, as it is not possible to access the map from the outro. (not checked, sourced from an old copy of the OFPEC comref) + + Manually opening the map afterwards won't close the map. Actually it will open the "real" map on top of the forced map, and closing the (top) map with the m -key again will still show the forcefully opened map. (ArmA 1.05) - Array + Nothing + - exportJIPMessages + mineDetectedBy - Export list of JIP to a file. Special: BattlEye's RCON variant of this command is #exportJIPqueue (see also Multiplayer_Server_Commands ) + Returns true if mine has been detected by a given side - https://community.bistudio.com/wiki/exportJIPMessages + https://community.bistudio.com/wiki/mineDetectedBy - exportJIPMessages String + Object mineDetectedBy Side - exportJIPMessages fileName + mine mineDetectedBy faction - $Code$exportJIPMessages "myFileNameWithoutExtension";$/Code$ + $Code$( allMines select 0) mineDetectedBy west ;$/Code$ undefined / undefined @@ -23894,342 +25125,356 @@ - Nothing + Boolean + - exp + lbSetText - Let x be a number, then exp (x) is equal to e to the power of x (or e^x) + Sets the text on the left side of the item with the given index of the listbox or combobox with id idc of the topmost user dialog. - https://community.bistudio.com/wiki/exp + https://community.bistudio.com/wiki/lbSetText - exp Number + lbSetText Array + + Control lbSetText Array - exp x + lbSetText [idc, index, name] + + control lbSetText [index, name] - $Code$_result = exp 1 - // returns 2.7182$/Code$ + $Code$lbSetText [101, 0, "iskoda"];$/Code$ + + $Code$_control lbSetText [0, "iskoda"];$/Code$ - undefined / undefined + local / local - Note that you cannot exponent a value greater than 88.72283554077147726999 (999 repeating), as this is beyond what the game can calculate. + More information on the LB command family can be found here - Number + Nothing - Nothing + - eyeDirection + camSetDive - Returns the direction object is watching (eyes, or a vehicle primary observer). + Sets camera dive angle. Does not commit changes. + This command is non-functional ! - https://community.bistudio.com/wiki/eyeDirection + https://community.bistudio.com/wiki/camSetDive - eyeDirection Object + Object camSetDive Number - eyeDirection unit + camera camSetDive dive - $Code$can = "Land_Can_V3_F" createVehicle position player ; - onEachFrame { - can setPosASL [ - ( eyePos player select 0) + ( eyeDirection player select 0), - ( eyePos player select 1) + ( eyeDirection player select 1), - ( eyePos player select 2) + ( eyeDirection player select 2) - ] - }$/Code$ - - $Code$// Draw AI eye direction (green) and weapon direction (red) in 3D: - bob = createGroup east createUnit ["O_Soldier_F", [0,0,0], [], 0, "NONE"]; - bob setVehiclePosition [ player modelToWorld [0,100,0], [], 0, "NONE"]; - onEachFrame - { - _beg = ASLToAGL eyePos bob; - _endE = (_beg vectorAdd ( eyeDirection bob vectorMultiply 100)); - drawLine3D [ _beg, _endE, [0,1,0,1]]; - _endW = (_beg vectorAdd (bob weaponDirection currentWeapon bob vectorMultiply 100)); - drawLine3D [_beg, _endW, [1,0,0,1]]; - };$/Code$ + $Code$_camera camSetDive -0.1$/Code$ - global / undefined + undefined / undefined - (May 26, 2014) - This command should have really been named headDirection instead of eyeDirection as one could mistakenly think that eyes direction of your avatar correspond to the direction of the centre of your screen. Play with the script in example 1 to find out limitations. If you need centre of screen direction, use positionCameraToWorld instead. + (Apr 15, 2010) + Command is non-functional. Instead, use fn vbs setPitchBank in VBS2, or setVectorUp or this user function in Arma. - Array + Nothing + - eyePos + createDiaryRecord - Returns the object's eyes / main turret position. + creates a diary entry. + Supported tags and their parameters: + All + image : String - path to image. When present, any element with it will be displayed as image. + width : Number - image width in pixels. + height : Number - image height in pixels. + font + color : String - HTML color in format #aarrggbb or #rrggbb + size : Number - font height in pixels. + face : String - font type (class from CfgFontFamilies) + br + marker + name : String - marker name + execute + expression : String - executed code + executeClose + expression : String - executed code, diary is closed afterwards + log + subject : String - subject name. + record : String - record name (e.g. "Record6" or "Unit1059524") + gear + unit : Number - unit ID + teamSwitch + unit : Number - unit ID + kick + id : Number - player ID + ban + id : Number - player ID + mute + id : Number - player ID + currentTask + id : Number - task ID - https://community.bistudio.com/wiki/eyePos + https://community.bistudio.com/wiki/createDiaryRecord - eyePos Object + Object createDiaryRecord Array - eyePos object + unitName createDiaryRecord [subject, text, task, state] + + unitName createDiaryRecord [subject, [title, text], task, state] - $Code$eyePos player$/Code$ + $Code$player createDiaryRecord ["Diary", ["Intel", "Enemy base is on grid marker name='enemyBase' 161170 /marker "]]$/Code$ + + $Code$player createDiaryRecord ["Diary", "Information gathered. br / img image='wellDone_ca.paa' / "]$/Code$ - global / undefined + undefined / local + (14:54, 15 January 2011‎) + To insert a link into a diary record that executes code instead of jumping to a marker, use the tag + execute expression=" Code to execute " Text /execute + + (March 24, 2017) + When adding multiple diary records, be aware that they appear in reverse order. ie the first one you add will appear last and the last one you add will be first. - Array + String + - face + addBackpackGlobal - Returns the face of a person. + Adds a backpack to a unit (even non-local) - https://community.bistudio.com/wiki/face + https://community.bistudio.com/wiki/addBackpackGlobal - face Object + Object addBackpackGlobal String - face person + unit addBackpackGlobal backpack - $Code$face player$/Code$ + $Code$player addBackpackGlobal "B_AssaultPack_khk";$/Code$ - undefined / undefined + global / global - String + Nothing + - faction + cancelSimpleTaskDestination - Gets unit faction. Factions are defined under CfgFactionClasses. If the given faction is not defined, the command returns empty string. Standard Factions include: - Arma 2 : - West: "USMC", "CDF" - East: "RU", "INS" - Guer: "GUE" - Civ: "CIV", "CIV_RU" - Arma 2: Operation Arrowhead : - West: "BIS_US", "BIS_CZ", "BIS_GER" - East: "BIS_TK", "BIS_TK_INS" - Guer: "BIS_TK_GUE", "BIS_UN" - Civ: "BIS_TK_CIV", "BIS_CIV_special" - DLC Factions - Arma 2: British Armed Forces : - West: "BIS_BAF" - Arma 2: Private Military Company : - Guer: "PMC_BAF" - Arma 3 : - West: "BLU_F" (NATO), "BLU_G_F" (FIA) - East: "OPF_F" (CSAT), "OPF_G_F" (FIA) - Guer: "IND_F" (AAF), "IND_G_F" (FIA) - Civ: "CIV_F" (Civilians) + Cancels a simple task destination. - https://community.bistudio.com/wiki/faction + https://community.bistudio.com/wiki/cancelSimpleTaskDestination - faction Object + cancelSimpleTaskDestination Task - faction unitName + cancelSimpleTaskDestination task - $Code$_faction = faction _object;$/Code$ + $Code$cancelSimpleTaskDestination myTask;$/Code$ - global / undefined + undefined / undefined - Faction behaves slightly differently to side. Side can refer to the pilot or commander of a vehicle, but faction never changes. It always returns the 'country of manufacture'. - String + Nothing + - fadeMusic + needReload - Changes the music volume smoothly within the given time. + Return how much vehicle wants to reload its weapons. - https://community.bistudio.com/wiki/fadeMusic + https://community.bistudio.com/wiki/needReload - Number fadeMusic Number + needReload Object - time fadeMusic volume + needReload vehicle - $Code$5 fadeMusic 0$/Code$ + $Code$_seriousness = needReload _vehicle;$/Code$ + + $Code$if ( needReload player == 1) then { reload player };$/Code$ - undefined / local + undefined / undefined - Nothing + Number + - fadeRadio + ctrlHTMLLoaded - Causes a smooth change in the radio volume. The change duration is given by time, the target volume by volume. The default radio volume is 1.0. + Returns true when HTML content was successfully loaded. - https://community.bistudio.com/wiki/fadeRadio + https://community.bistudio.com/wiki/ctrlHTMLLoaded - Number fadeRadio Number + ctrlHTMLLoaded Control - time fadeRadio volume + ctrlHTMLLoaded control - $Code$5 fadeRadio 0.1$/Code$ + $Code$_control htmlLoad "test.html"; + if (! ctrlHTMLLoaded _control) then { + hint "Loading test.html failed!"; + };$/Code$ - undefined / local + undefined / undefined - (September 11, 2008) - Does not affect VON - - (September 13, 2016) - Also influences audibility of the missile warning in helicopters. - Nothing + Boolean + - fadeSound + ctrlEnabled - Changes the sound volume smoothly within the given time. + Returns if a control on the currently active user dialog is enabled. Disabled controls cannot be focused. + Read Dialog Control for more information about user dialogs and controls. - https://community.bistudio.com/wiki/fadeSound + https://community.bistudio.com/wiki/ctrlEnabled - Number fadeSound Number + ctrlEnabled Number + + ctrlEnabled Control - time fadeSound volume + ctrlEnabled idc + + ctrlEnabled controlName - $Code$5 fadeSound 0$/Code$ + $Code$if (!(ctrlEnabled 100)) then + { + ctrlEnable [100, true] + };$/Code$ + + $Code$_enabled = ctrlEnabled _control$/Code$ - undefined / local + local / undefined - (January 19, 2010) - This command doesn't work, in Arma 2 1.05. - Nothing + Boolean - Boolean + - fadeSpeech + showLegend - Cause a smooth change in the master speech volume. The change duration is given by time, the target volume by volume. The default master is 1.0. + Show/hide map legend. + i + Some Old Editor Command - https://community.bistudio.com/wiki/fadeSpeech + https://community.bistudio.com/wiki/showLegend - Number fadeSpeech Number + Control showLegend Boolean - time fadeSpeech volume + map showLegend bool - $Code$5 fadeSpeech 0.1;$/Code$ - + - undefined / local + undefined / undefined - Nothing + Nothing + - failMission + canTriggerDynamicSimulation - Finish the mission. If the server is set to run persistent mission, failMission will not end the mission when last player gets kicked to the lobby. Use endMission to end the mission. - The end type can be: - "CONTINUE" - "KILLED" - "LOSER" - "END1" - "END2" - "END3" - "END4" - "END5" - "END6" - Mission saves won't be deleted. - To maintain Arma 3 visual style, it's recommended to use BIS_fnc_endMission instead. + A getter for triggerDynamicSimulation - https://community.bistudio.com/wiki/failMission + https://community.bistudio.com/wiki/canTriggerDynamicSimulation - failMission String + canTriggerDynamicSimulation Object - failMission endtype + canTriggerDynamicSimulation unit - $Code$failMission "LOSER";$/Code$ + $Code$hint str canTriggerDynamicSimulation player ;$/Code$ undefined / undefined @@ -24237,28 +25482,28 @@ - Nothing + Boolean + - false + addSwitchableUnit - Always false. + Adds a unit into the list of units available for Team Switch. Units marked as playable in editor are automatically switchable. This command allows to add non-playable unit into array of switchableUnits and make them available for teamSwitch. SP only. - https://community.bistudio.com/wiki/false + https://community.bistudio.com/wiki/addSwitchableUnit - false + addSwitchableUnit Object - false + addSwitchableUnit unitName - $Code$_var = false ; - systemChat str _var; //false$/Code$ + $Code$addSwitchableUnit bob$/Code$ undefined / undefined @@ -24266,186 +25511,141 @@ - Boolean + Nothing + - fillWeaponsFromPool + say3D - Adds magazines from the campaign pool to the given unit, depending on his weapons. + Unit or object will say given sound in 3D Space. This allows broadcasting of positional music or sound from a source, without having to script a fade sound or music command. Compare this with say2D which will always play a sound at the location of the player after he has been in the vicinity of a broadcasting sound. Sound is defined in "CfgSounds" of the Description.ext or main config. + NOTE : You can stop say3D sound currently playing in 2 ways: delete the source of the sound (from) with deleteVehicle or kill the source with setDamage for example. - https://community.bistudio.com/wiki/fillWeaponsFromPool + https://community.bistudio.com/wiki/say3D - fillWeaponsFromPool Object + Object say3D String + + Object say3D Array + + Array say3D String + + Array say3D Array - fillWeaponsFromPool unitName + from say3D sound + + from say3D [sound, maxDistance, pitch] + + [from, to] say3D sound + + [from, to] say3D [sound, maxDistance, pitch] - $Code$fillWeaponsFromPool _soldier$/Code$ + $Code$helicopter1 say3D "Fortunateson"$/Code$ - undefined / undefined + global / local + (7 March 2013) + The only difference with this command and say is during cutscenes (when some camera effect is active). In cutscenes, say3D is 3D, say is not. + + (July 19, 2015) + In Arma 2 1.63, the object this command is assigned to must be alive for the sound to broadcast. If the object is killed while the sound is still playing, the sound will stop immediately. + Here is a link to the forum to get around this issue: [1] + I have not tested this in Arma 3 yet. + + (October 13, 2016) + This command is local. + + (March 11, 2017) + This command creates sound object "#soundonvehicle" which can be detected with allMissionObjects : + $Code$ onEachFrame { hintSilent str allMissionObjects "#soundonvehicle"}; + [] spawn { sleep 1; player say3D "Alarm"};$/Code$ - Nothing + Nothing - Nothing - Nothing - Nothing + - findCover + diag_enabled - Returns the object around where the unit finds cover. The minDist, visibilityPosition and ignoreObject parameters are optional. Command is not functional since Arma 2. - This command is not implemented + Checks whether specific diagnostic mode is activated. + Only available in the Arma 3 Diagnostic exe - https://community.bistudio.com/wiki/findCover + https://community.bistudio.com/wiki/diag_enabled - Object findCover Array + diag_enabled String - object findCover [position, hidePosition, maxDist, minDist, visibilityPosition, ignoreObject] + diag_enabled diag_mode - + $Code$"Animation" diag_enable true ; + diag_enabled "Animation";//returns true$/Code$ + undefined / undefined - (17 Oct, 2009) - Arma 2: v1.04: Usage creates report log message: " MicroAI: Command findCover not implemented ( unit id ) " - - (07 Jan, 2011) - OA: v1.57: Still non functional. - - (12 July, 2011) - CO: v1.59: Still non functional. - - (13 February, 2014) - Arma 3: Still non functional. - - (July 4, 2015) - An alternative function in ArmA 3 might be BIS_fnc_findSafePos - Object + Boolean + - findDisplay + set3DENModelsVisible - Find display by its IDD (which is defined in the description.ext or config). - If the specified display can't be found displayNull ("No display") is returned, (which can be tested with the isNull command.) - The primary display uses IDD 46. (eg: findDisplay 46). This will return displayNull on a dedicated server (so be sure to check isDedicated if using this in a waitUntil condition). + Enables or disables lines visibility in 3DEN - https://community.bistudio.com/wiki/findDisplay + https://community.bistudio.com/wiki/set3DENModelsVisible - findDisplay Number + set3DENModelsVisible Array - findDisplay idd + set3DENModelsVisible [map, scene] - $Code$_display = findDisplay 1;$/Code$ - + undefined / undefined - (15 June 2008) - findDisplay does not find displays defined under RscTitles (even when they are visible). - To access those types of displays, either assign the resource to a global variable, or pass its this value to a script, during the onLoad event: - e.g. class RscTitles { - class MyRsc { - onLoad = "myDisplay = (_this select 0)"; // or - // onLoad = "_this execVM 'myDialog.sqf'"; - ... - You can then use the stored value as you would for regular dialogs: - $Code$(myDisplay displayCtrl 1111) ctrlSetText "hello there");$/Code$ - - (17 March 2010) - I posted a tutorial on finding and using displays here. - - (07 March 2014) - The Zeus Display uses IDD 312 - - (March 25, 2015) - Display 12 is map - - (June 25, 2017) - I have tested the behavior of this command and I found out that it [ findDisplay ] appears to only return the display AFTER any onLoad event handler of that display is done. So, using findDisplay inside an onLoad event handler is useless. - - (August 14, 2017) - There are some specific cases, where findDisplay will not be able to find an existing display. Here's the cases and how to act on them: - $Code$//Your display has IDD= -1. - class RscDisplayNew - { - idd=-1; - scriptName = "RscDisplayNew"; - ... - };$/Code$ - $Code$//Your display doesn't have IDD - class RscDisplayNew - { - scriptName = "RscDisplayNew"; - ... - };$/Code$ - $Code$//Your display doesn't have scriptname with IDD = -1 - class RscDisplayNew - { - idd=-1; - ... - };$/Code$ - $Code$//Your display doesn't have scriptname, neither IDD - class RscDisplayNew - { - ... - };$/Code$ - 1. - You actually can find a -1 display, but this means finding a display with this IDD might be a problem, when there are a few displays marked as -1. - So as you can see, theres an entry called scriptName. You can get a reference to this display by using uiNamespace : - $Code$(uiNamespace getVariable "RscDisplayNew")$/Code$ - NOTE : Variables are overwritten with a reference of the last declared display under the same scriptName entry. Take a look at case 3 for solution. - 2. - Displays without IDD's can actually exist. They can be manipulated only in a way described in the first case using uiNamespace. - 3. - You can really have this display seeking it manually in a allDisplays return. This is experimental, but working option. - 4. - You will have a problem finding this display, since this display doesn't exist even in allDisplays (?) return. Behaviour unknown. - Display + Nothing + - findEditorObject + forEachMemberTeam - Return object that matches the provided reference. - i - Some Old Editor Command + Executes the given command recursively for each team that is a member of the given team. For just agents use forEachMemberAgent. For both teams and agents use forEachMember. - https://community.bistudio.com/wiki/findEditorObject + https://community.bistudio.com/wiki/forEachMemberTeam - Control findEditorObject Any_Value + Code forEachMemberTeam Team_Member - map findEditorObject value + command forEachMemberTeam team @@ -24455,1276 +25655,1213 @@ - String + Nothing + - findEmptyPositionReady + netId - Check if findEmptyPosition command can be called without waiting for files. + Unique ID of object or group. As this command is MP only, you can use BIS_fnc_netId, which extends the use to SP as well. See also: BIS_fnc_objectVar - https://community.bistudio.com/wiki/findEmptyPositionReady + https://community.bistudio.com/wiki/netId - Array findEmptyPositionReady Array + netId Object/Group - center findEmptyPositionReady [radius,maxDistance] + netId var - + $Code$_playerNetId = netId player ;$/Code$ + undefined / undefined - Boolean + String + - findEmptyPosition + supportInfo - Searches for an empty position around specified position. The search starts looking for an empty position at a minimum distance of [minDistance] from the [center] and looks as far away as [maxDistance]. If a [vehicleType] parameter is specified, then the search will look for an empty positions that is big enough to hold that vehicle type. If an empty position isn't found, an empty array is returned. - This command ignores moving objects present within search area. + Creates a list of supported operators and type. Each field of array has the format: "x:name" Where x can be: + 't' - type + 'n' - null operator + 'u' - unary operator + 'b' - binary operator. + 'name' is the operator or type name (in case operator, type of input operands is included). + mask parameter can be an empty string, or one of field. In this case, function returns empty array, if operator is not included in the list. Limited wildcard support is available. Type x may be replaced with *, meaning all types. For the mask partial match may be used, like abc*, meaning any operators starting with 'abc' are reported, for example: *:name, t:*, t:name* or *:*. - https://community.bistudio.com/wiki/findEmptyPosition + https://community.bistudio.com/wiki/supportInfo - Array findEmptyPosition Array + supportInfo String - center findEmptyPosition [minDistance, maxDistance, vehicleType] + supportInfo mask - $Code$_position = ( getPosATL player ) findEmptyPosition [0,100];$/Code$ - - $Code$_position = _center findEmptyPosition [10,100,"UH60M_EP1"];$/Code$ + $Code$supportInfo "b:select*"; //Returns ["b:ARRAY select SCALAR","b:ARRAY select BOOL","b:CONFIG select SCALAR"]$/Code$ - $Code$// Check if exact position is empty: - _position = _center findEmptyPosition [0,0,"B_Boat_Armed_01_minigun_F"];$/Code$ + $Code$// Return all available commands: + _commands = supportInfo "";$/Code$ undefined / undefined - (November 6, 2013) - Keep search radius short and sweet, under 50 metres maybe. Searching big area takes long time and will result in your game stop responding until the search is over. isFlatEmpty is probably more suitable for a larger area search. + (July 22nd, 2012) + With CBA one can create a list of all available SQF commands in the RPT + [supportInfo ""] call cba_fnc_debug; + One can get CBA here. - (March 6, 2012) - I think the radius parameter should be treated as a 'minimum distance' from the centre position. I found that the parameter name radius wasn't very clear. Also, if radius is greater than max distance then the function will always return an empty array. - Here is an snippet of code I use to find a safe landing zone for an extraction helicopter. It may be useful for someone. - $Code$_centre = [ getMarkerPos "marker", random 150, random 360 ] call BIS_fnc_relPos; - _extraction_point = []; - _max_distance = 100; - while{ count _extraction_point 1 } do - { - _extraction_point = _centre findEmptyPosition[ 30, _max_distance, "UH60M_EP1" ]; - _max_distance = _max_distance + 50; - }; - $/Code$ - In the above example, make sure that "_max_distance" is greater than 30, otherwise the while loop will go forever. + (September 24, 2014) + To get the list of all supported commands in Arma 3 one can simply: + $Code${ diag_log _x} forEach supportInfo "";$/Code$ - Array + Array + - findNearestEnemy + targets - Finds the nearest enemy to the specified position. Returns a null object if the object's group does not know about any enemies. This command will return nearest object that is known to the unit and is considered enemy. An empty vehicle that is part of enemy group assets (see addVehicle ) can be returned as valid nearest target. + Retrives list of given unit targets matching specified filter. If the filter is not specified, all targets are returned. - https://community.bistudio.com/wiki/findNearestEnemy + https://community.bistudio.com/wiki/targets - Object findNearestEnemy Object/Array + Object targets Array - object findNearestEnemy position + unit targets [enemyOnly, maxDistance, sides, maxAge, alternateCenter] - $Code$_myNearestEnemy = ( units _myGroup select 0) findNearestEnemy player ;$/Code$ + $Code$_targets = _unit targets [false, 300, [east,sideEnemy]]; //all targets of east or renegade side in 300m$/Code$ - $Code$_myNearestEnemy = player findNearestEnemy player ;$/Code$ + $Code$_targets = _unit targets [true, 300]; //enemy targets in 300m$/Code$ + + $Code$_targets = _unit targets []; //all targets$/Code$ - undefined / undefined + global / undefined - Object + Array + - find + diag_lightNewLoad - Searches for an array element within array or a string within a string. Returns the 0 based index on success or -1 if not found. Test is cASe-seNsItiVE + Allows loading of lightning config during the gameplay (effectively changing the current scene lightning). Filename path can be either absolute or relative. The file must contain only the class LightningNew, which should contain lightning configuration. + Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. - https://community.bistudio.com/wiki/find + https://community.bistudio.com/wiki/diag_lightNewLoad - Array find Anything - - String find String + diag_lightNewLoad String - array find x - - string find x + diag_lightNewLoad path - $Code$["Apples","Oranges","Pears"] find "Oranges"; //result is 1 - [1,[2],[[3]]] find [[3]]; //result is 2$/Code$ - - $Code$if ( magazines player find "Strela" = 0) then { hint "You've got Strela!"};$/Code$ - - $Code$hint str ("japa is the man!" find "the man!"); //8$/Code$ + $Code$diag_lightNewLoad "o:\lighting.txt"$/Code$ undefined / undefined - (January 4, 2015) - Using nil on either side of find will make the whole statement return Nothing : - $Code$_array = [1,2, nil,4,5]; - _result = _array find nil; - hintSilent str ( isNil "_result"); //true - _result = nil find 1; - hintSilent str ( isNil "_result"); //true$/Code$ - - (April 10, 2015) - Find doesn't work with multidimensional arrays in OFP/CWA. It will always returns -1. - - (May 17, 2016) - This command is unreliable/broken when it comes to some non-ASCII characters (as of Arma 3 1.58): - $Code$"abcßdef" find "c" - - 2 - "abcßdef" find "ß" - - 3 - "abcßdef" find "d" - - 5$/Code$ - - (July 7, 2016 10:56 (UTC)) - Not quite unreliable, just unexpected! Strings are tracked in terms of bytes rather than in actual character positions; all strings are stored in UTF-8 format. In other words, the eszett character is in Unicode, which takes up two bytes rather than one as it is within the 128-255 range of Unicode. (Similar results would be expected for the division symbol, the umlaut, accented e's, etc.) Symbols that are particularly high in the Unicode range may take up three bytes, or even four for the truly exceptional characters, although Arma 3's default fonts are unlikely to render them. This definitely complicates any script which assumes any printable character is a single byte, however, and unfortunately I'm not skilled enough with internationalisation to recommend any robust fix. - Number - Number + Nothing + - finishMissionInit + getGroupIconParams - Finish world initialization before mission is launched. + Returns group icons params used for command bar drawing such as color, text, scale, visibility, waypoint visibility, waypoint color. - https://community.bistudio.com/wiki/finishMissionInit + https://community.bistudio.com/wiki/getGroupIconParams - finishMissionInit + getGroupIconParams Group - finishMissionInit + getGroupIconParams group - + $Code$_iconParams = getGroupIconParams group player ;$/Code$ + undefined / undefined - Nothing + Array + - finite + setLightFlareSize - True, if number is finite (not infinite and a valid number) + Sets relative size of the flare for the light. - https://community.bistudio.com/wiki/finite + https://community.bistudio.com/wiki/setLightFlareSize - finite Number + Object setLightFlareSize Number - finite x + light setLightFlareSize size - $Code$?!finite 10/0 : hint "Infinite"$/Code$ + $Code$myLight setLightFlareSize 5;$/Code$ - undefined / undefined + local / local - (27 Sep, 2013) - Don't get high hopes with this command thinking what a great way of catching divisions by zero, the command is pretty useless in this respect: - $Code$//ArmA 2 - hint str finite (10/0); //true... O_o Huh???? - hint str (10/0); //0... Weird, but that explains it. - //ArmA 3 - hint str finite (10/0); // Error Zero Divisor - hint str finite 10; //true - hint str finite 1000000000000000000000000000000000000000; //false$/Code$ - Boolean + Nothing + - fireAtTarget + scopeName - Remotely forces a unit to fire the given weapon. See also: BIS_fnc_fire + Defines name of current scope. Name is visible in debugger, and name is also used as reference in some commands like breakOut and breakTo. Scope name should be defined only once per scope. Trying to set a different name on the scope that has already defined scope name will result in error. - https://community.bistudio.com/wiki/fireAtTarget + https://community.bistudio.com/wiki/scopeName - Object fireAtTarget Array + scopeName String - sourceVehicle fireAtTarget [targetVehicle, weaponMuzzleName] + scopeName name - $Code$_handle = this fireAtTarget [groundtarget1,"HellfireLauncher"];$/Code$ - - $Code$_handle = Igla_AA_pod_TK_EP1 fireAtTarget [_helicopter, currentWeapon Igla_AA_pod_TK_EP1];$/Code$ - - $Code$_handle = Igla_AA_pod_TK_EP1 fireAtTarget [helicopter];$/Code$ + $Code$scopeName "main"; + while {true} do { + scopeName "loop1"; + while {true} do { + scopeName "loop2"; + ... + }; + };$/Code$ undefined / undefined - (Sep 16, 2010) - Most likely only for missiles and for interaction with player only. - - (Apr 8, 2014) - (A3 1.14) Source vehicle is only limited to manned vehicle while any other types won’t be able to active fireAtTarget handle, e.g. - $Code$ - _handle = _InfantryUnit fireAtTarget [_Infnatrytarget,( weapons _Infantryunit select 0)]; - //false & no bullet shoot - $/Code$ - Target has no limitation and can be any object: - $Code$ - _handle = ( vehicle _veh) fireAtTarget [ObjNull,( weapons ( vehicle _veh) select 0)]; - //true & a bullet shoot - $/Code$ - Handle returns false if weapon class name is inaccurate, e.g. - $Code$ - _Handle = ( vehicle _veh) fireAtTarget [ObjNull,”UnknownWeapon”]; - //false & no bullet shoot. - $/Code$ - Handle still returns true even though the vehicle is unavailable to shoot any bullet: - $Code$ - _weapon = weapons ( vehicle _veh) select 0; - ( vehicle _veh) setAmmo [_weapon,0]; - _Handle = ( vehicle _veh) fireAtTarget [ObjNull,_weapon]; - //true & no bullet shoot - $/Code$ - difference - command - Source - Target - Behavior - Workaround templets - fire - Either Unit or manned vehicle - N/A - Fired aiming at air for infantry rifle - Together with selectWeapon, - suggested to work with "throw","put" weapon type - for infantry, or vehicle entity indeed. - fireAtTarget - Manned vehicle only - Any object - Normal shoot, won’t aim at target automatically - _veh doWatch _target; - waitUntil {_veh aimedAtTarget [_target] 0}; - _veh fireAtTarget [_target]; - forceWeaponFire - Either Unit or manned aircraft (weapon operator) - N/A - Normal shoot, can change fire mode - //E.g. unit won't shoot until he is facing the target. - _unit doWatch _tar; - waitUntil { - _dir = direction _unit; - _relative = [_unit,_tar] call BIS_fnc_relativeDirTo ; - if (_dir == _relative) exitWith { - _unit forceWeaponFire [ currentWeapon _unit,"single"]; - }; - false - }; - doFire - Unit only - Either unit or vehicle - automatic aiming and shooting - No special example. - commandFire - Unit only - Either unit or vehicle - automatic aiming and shooting - No special example. - action ["UseWeapon"] - Either unit or manned vehicle - N/A - unexpected behavior - N/A - Boolean + Nothing + - fire + removeMagazineTurret - Forces a unit to fire the given weapon. - NOTE: Just like with forceWeaponFire it is possible to pass remote unit as argument, but this could be unreliable. Considering this command might need to be used in combination with selectWeapon, which takes only local arguments, it would make sense to execute fire command where unit is also local. See also: BIS_fnc_fire + Removes the magazine from the turret. Use turret path [-1] for driver's turret. + Note: you may create invalid combinations by using this function. When doing so, application behaviour is undefined. - https://community.bistudio.com/wiki/fire + https://community.bistudio.com/wiki/removeMagazineTurret - Object fire String - - Object fire Array + Object removeMagazineTurret Array - unit fire muzzle - - unit fire [muzzle, mode, magazine] + vehicle removeMagazineTurret [magazineName, turretPath] - $Code$_soldier fire "M16";$/Code$ - - $Code$_soldier fire "SmokeShellMuzzle";$/Code$ - - $Code$_soldier fire ["SmokeShellMuzzle","SmokeShellMuzzle","SmokeShell"];$/Code$ + $Code$vehicle player removeMagazineTurret ["60rnd_cmflaremagazine",[-1]]$/Code$ - $Code$player playActionNow "PutDown"; - player selectWeapon "DemoChargeMuzzle"; - player fire ["DemoChargeMuzzle", "DemoChargeMuzzle", "DemoCharge_Remote_Mag"]; - player setWeaponReloadingTime [ player, "DemoChargeMuzzle", 0];$/Code$ + $Code$_tank removeMagazineTurret ["20Rnd_120mmSABOT_M1A2",[0]]$/Code$ local / global - (August 17, 2006) - Sometimes AI won't shoot when you use this command. It can be fixed by placing selectWeapon command before it. - - (February 2, 2007) - In OFP v1.96, when a man class unit is given this command, he will aim up in the air before firing his weapon. This makes it rather useless if you want to make him shoot a target. It does work with vehicles, when the vehicle is first given a doWatch or doTarget command. - - (January 20, 2007) - In ArmA v1.02, this command is not working with weapons in the secondary turrets (like "DSHKM" in t72) - - (Jan 15, 2008) - To place a satchel (pipebomb) the syntax is: - OFP : unitname Fire ["put", "pipebomb"] - ArmA : unitname Fire ["pipebombmuzzle", "pipebombmuzzle", "pipebomb"]; - The triggering is done via a " TOUCHOFF " action. - - (March 18, 2010) - In Arma2 AI will automatically shoot straight up. Command seems to be broken. - - (November 24, 2010) - Command is broken - confirmed. Use action "USEWEAPON" instead. - Place a game logic in the editor. Name it MyGameLogic. - Use this code to make unit1 fire his primaryweapon: - MyGameLogic action ["useWeapon",primaryWeapon unit1,unit1,0]; - - (Feburary 25, 2011) - Command works just fine in A2/OA. Make sure to execute it on local AI. - - (April 06, 2012) - If it did work at one time, it does no longer. The AI (or player) is forced to look upwards or reacts to a massive recoil force before getting his shot off. - - (Feburary 16, 2013) - Command did not work with ACR 1.62. Used fireAtTarget instead. - - (June 4, 2014) - In Arma 3 in order for AI to place Claymore, for example, it is necessary to execute 3 statements - an animation, weapon select and the actual fire command. Animation is most likely for forcing unit to leave rest state, weapon select and fire kinda both go together anyway: $Code$_unit playActionNow "PutDown"; - _unit selectWeapon "DirectionalMineRemoteMuzzle"; - _unit fire [ - "DirectionalMineRemoteMuzzle", - "DirectionalMineRemoteMuzzle", - "ClaymoreDirectionalMine_Remote_Mag" - ];$/Code$ - Nothing - Nothing + Nothing + - firstBackpack + enableTeamSwitch - Returns the first stored backpack. + Enable / disable Team Switch. The default setting is enabled. - https://community.bistudio.com/wiki/firstBackpack + https://community.bistudio.com/wiki/enableTeamSwitch - firstBackpack Object + enableTeamSwitch Boolean - firstBackpack box + enableTeamSwitch enable - $Code$myVariable = firstBackpack myBox;$/Code$ - + undefined / undefined - Object + Nothing + - flagAnimationPhase + terrainIntersectAtASL - Returns flag position on the flag pole in range of 0..1, where 0 is bottom of the flag pole, 1 is the top of the flag pole. The result is local to the PC on which command is executed + Checks for intersection of terrain between two ASL positions. Same as terrainIntersectASL, only returns intersect position instead of Boolean - https://community.bistudio.com/wiki/flagAnimationPhase + https://community.bistudio.com/wiki/terrainIntersectAtASL - flagAnimationPhase Object + terrainIntersectAtASL Array - flagAnimationPhase flag + terrainIntersectAtASL [pos1, pos2] - $Code$flagAnimationPhase _flag1; //0.5$/Code$ + $Code$_posASL = terrainIntersectAtASL [ eyePos player, getPosASL chopper];$/Code$ - global / undefined + undefined / undefined - Number + Array + - flagOwner + setHUDMovementLevels - Returns the global owner of a flag. A getter for setFlagOwner. Note that owner of a flag is Object rather than Number, as how it is usually with other owner commands + Set min/max movement borders displayed in HUD gauges. Use -1 to skip some value. - https://community.bistudio.com/wiki/flagOwner + https://community.bistudio.com/wiki/setHUDMovementLevels - flagOwner Object + setHUDMovementLevels Array - flagOwner flag + setHUDMovementLevels [minSpeed, maxSpeed, minAlt, maxAlt, minDir, maxDir, targetOrPosition] - $Code$_person = flagOwner _flagOne;$/Code$ + $Code$setHUDMovementLevels [20,30,-1,-1,0.23,2.1,[0,0,0]]$/Code$ + + $Code$setHUDMovementLevels [20,30,-1,-1,0.23,2.1,player]$/Code$ - global / global + undefined / undefined - Object + Nothing + - flagSide + addWeaponCargo - Returns Side of the local instance of the flag. A getter for setFlagSide. + Add weapons to the cargo space of vehicles, which can be taken out by infantry units. Ignores available cargo space. + In Arma 3, arguments for this command must be local ( ). For global variant see addWeaponCargoGlobal - https://community.bistudio.com/wiki/flagSide + https://community.bistudio.com/wiki/addWeaponCargo - flagSide Object + Object addWeaponCargo Array - flagSide flag + vehicleName addWeaponCargo [weaponName, count] - $Code$_flagSide = flagSide flag;$/Code$ + $Code$_truck addWeaponCargo ["M16",5]$/Code$ global / local + (October 24, 2009) + Only works on clients. + + (July 10, 2010) + When players add/remove gear directly via the gear menu that gear is synchronized across the network. Since this command is local only, using it during a mission can cause all sorts of weird issues. To get proper synchronization use this command in the object's init line or in a script called from its init line with a call compile preprocessFile command (and not execVM ). - Side + Nothing + - flagTexture + getPilotCameraPosition - Returns texture of the local instance of the flag. A getter for setFlagTexture. It will not return flag textures applied using forceFlagTexture, use getForcedFlagTexture for that. + Returns model space coordinates of the object airplane or helicopter pilotCamera. - https://community.bistudio.com/wiki/flagTexture + https://community.bistudio.com/wiki/getPilotCameraPosition - flagTexture Object + getPilotCameraPosition Object - flagTexture flagCarrier + getPilotCameraPosition object - $Code$_flagTexture = flagTexture _flag1;$/Code$ + $Code$_pilotCamPos = getPilotCameraPosition vehicle player$/Code$ - global / local + global / undefined - String + Array + - flag + doFSM - Returns the original flag pole of the flag the unit is carrying. + Orders a unit to process command defined by FSM file (silently). + Unlike with execFSM where _this is passed to the FSM, the following parameters are passed when using doFSM/commandFSM: + _leader + leader of subgroup with this command + _destination + command destination/position + _target + command target + _units + list of all persons in subgroup - https://community.bistudio.com/wiki/flag + https://community.bistudio.com/wiki/doFSM - flag Object + Object/Array doFSM Array - flag unit + unit doFSM [fsmName, position, target] - $Code$_flag = flag _soldier;$/Code$ + $Code$_soldierOne doFSM ["move.fsm", position player, player ];$/Code$ - global / undefined + undefined / undefined + (August 4, 2010) + Do not doStop a unit in a FSM called with doFSM or commandFSM. Doing so nevertheless will halt your FSM, since no links are followed anymore (doing so in an end state should be fine though). Also this may crash your game in certain mysterious circumstances. + You may design your FSM so that they may be called with doFSM/commandFSM and execFSM likewise by checking if _units or _this is nil and then init the variables accordingly. Just remember that you should use the low level moveTo (together with moveToCompleted, moveToFailed ) if do-/commandFSM'd, and doMove or commandMove (together with unitReady ) if execFSM'd. A moveTo in an FSM started with execFSM won't do anything, likewise doMove in a FSM started with doFSM or commandFSM wont work either. Think about it for a minute and you will see why. (hint: a unit running a FSM called with doFSM or commandFSM will _never_ return true for (unitReady _unit) ) + Anyway, if you want to be able to call your FSM either way, a "ready" condition might look light this: (moveToCompleted _unit) || (moveToFailed _unit) || (unitReady _unit), assuming you have a moveTo or a doMove (depending on how the fsm is called) in the prior state. + + (February 14, 2015) + Adding to Rübe's note, doFSM can be checked if it has finished by unitReady as of 2015 and it will return true when your FSM has completed. - Object + Nothing + - fleeing + sideUnknown - Checks if a unit is fleeing. + The unknown side. + Used when the side of a unit is unknown, e.g. for spotted targets with insufficient information. - https://community.bistudio.com/wiki/fleeing + https://community.bistudio.com/wiki/sideUnknown - fleeing Object + sideUnknown - fleeing unitName + sideUnknown - $Code$? (fleeing _east_unit) : player sideChat "We have won!"$/Code$ + $Code$//soldier1 and soldier2 of different sides and out of sight + soldier1 reveal soldier2; + hint str (soldier1 nearTargets 1000); + //returns: [[[1557.96,5047.4,1.32402],"SoldierWB",UNKNOWN,0.0155183,soldier2,5]] + soldier1 reveal [soldier2,1.5]; + //returns: [[[1556.52,5050.08,1.32402],"SoldierWB",WEST,0.0211193,soldier2,5]]$/Code$ - global / undefined + undefined / undefined - Boolean + Side + - floor + isHidden - Returns the next lowest integer in relation to x. + Return whether the person is hidden (reached the hiding position). For command that tests general visibility of an object use isObjectHidden - https://community.bistudio.com/wiki/floor + https://community.bistudio.com/wiki/isHidden - floor Number + isHidden Object - floor x + isHidden person - $Code$floor 5.25 - Result is 5$/Code$ - - $Code$floor -5.25 - Result is -6$/Code$ - + - undefined / undefined + global / undefined + (January 1, 2017) + Tested in 1.67 DEV, seems to always return false - Number + Boolean + - flyInHeightASL + magazinesAmmoFull - Sets the minimal ASL height. Final height is max(flyInHeight, flyInHeightASL). + Returns array of arrays of all vehicle's magazines with extended information about them. + Output format : + [[magazine1],[magazine2],[magazine3]...[magazineN]] + Magazine format : + 0: Magazine class name + 1: Magazine current ammo count + 2: Magazine state (true - loaded, false - not loaded) + 3: Magazine type (-1 - n/a, 0 - grenade, 1 - primary weapon mag, 2 - handgun mag, 4 - secondary weapon mag, 65536 - vehicle mag) + 4: Magazine location ("Vest", "Uniform", "Backpack", "") or corresponding currentMuzzle - https://community.bistudio.com/wiki/flyInHeightASL + https://community.bistudio.com/wiki/magazinesAmmoFull - Object flyInHeightASL Array + magazinesAmmoFull Object - aircraft flyInHeightASL params + magazinesAmmoFull vehicle - $Code$cobraOne flyInHeightASL [200, 100, 400];$/Code$ + $Code$_magazinesAmmoFull = magazinesAmmoFull player ; + /* + [ + ["30Rnd_65x39_caseless_mag",30,false,-1,"Uniform"], + ["30Rnd_65x39_caseless_mag",30,false,-1,"Vest"], + ["16Rnd_9x21_Mag",16,false,-1,"Vest"], + ["SmokeShellGreen",1,true,0,"SmokeShellGreenMuzzle"], + ["Chemlight_green",1,true,0,"ChemlightGreenMuzzle"], + ["HandGrenade",1,true,0,"HandGrenadeMuzzle"], + ["30Rnd_65x39_caseless_mag",30,true,1,"arifle_MX_ACO_pointer_F"], + ["16Rnd_9x21_Mag",16,true,2,"hgun_P07_F"] + ] + */$/Code$ + + $Code$_magazinesAmmoFull = magazinesAmmoFull Mi_48; + /* + [ + ["250Rnd_30mm_APDS_shells",250,false,-1,""], + ["250Rnd_30mm_HE_shells",250,true,65536,"gatling_30mm"], + ["8Rnd_LG_scalpel",8,true,65536,"missiles_SCALPEL"], + ["38Rnd_80mm_rockets",38,true,65536,"rockets_Skyfire"] + ] + */$/Code$ undefined / undefined + (December 20, 2014) + When used on vehicles this will only return all magazines associated with a single turretPath (which one depends on the actual armament of the vehicle, usually the first armed turretPath or alternatively turretPath [-1]). + If you want to get all turrets' magazines, use allTurrets and magazinesTurret. + -- Actium ( talk ) 15:40, 20 December 2014 (CET) + + (February 10, 2015) + As Actium said, this function seems to extract data from: + configfile "CfgVehicles" _the_vehicle_you_want "Turrets" "MainTurret" "magazines". + Some vehicles return an empty field {} because magazines are in straight in: + configfile "CfgVehicles" _the_vehicle_you_want "magazines" (often dedicated to flares only). + This is the case of WY-55 Hellcat. This function returns an empty array. - Nothing + Array + - flyInHeight + max - Sets the flying altitude for aircraft relatively to the ground surface. Avoid too low altitudes, as helicopters and planes won't evade trees and obstacles on the ground. The default flying altitude is 100 meters. + The greater of a,b - https://community.bistudio.com/wiki/flyInHeight + https://community.bistudio.com/wiki/max - Object flyInHeight Number + Number max Number - aircraft flyInHeight altitude + a max b - $Code$_helicopter flyInHeight 40$/Code$ + $Code$3 max 2 + // Result is 3$/Code$ - local / global + undefined / undefined - (August 4, 2006) - Notes from before the conversion: - From version 1.80+ - flyInHeight now affects not only helicopters, but also planes. - - (August 4, 2006) - A planes flyInHeight, is restricted to a minimum of 20 meters. - - (December 15, 2008) - A flyInHeight of 0 will keep the chopper pinned to the ground, even when the engines have been started. - - (00:53, 11 April 2009 (CEST)) - If a helo has no waypoints, it will assume a low hover without regard to this setting. - Nothing + Number + - fogForecast + assignAsGunner - Returns the forecast fog value. A value of 0 means no fog, 1 means maximum fog. + Assign a unit as gunner of a vehicle. Used together with orderGetIn to order subordinate units to get in as gunner of a specific vehicle. Before usage of this command a subordinate unit hasn't got the option to get into the gunner place of the vehicle. - https://community.bistudio.com/wiki/fogForecast + https://community.bistudio.com/wiki/assignAsGunner - fogForecast + Object assignAsGunner Object - fogForecast + unitName assignAsGunner vehicleName - $Code$_level = fogForecast ;$/Code$ + $Code$_soldier1 assignAsGunner _tank + [_soldier1] orderGetIn true$/Code$ - undefined / undefined + global / global - Number + Nothing + - fogParams + lineIntersects - A getter for setFog (Alt Syntax). Returns extended params for the fog + Checks for object intersection with a virtual line between two positions. Returns true if intersects with an object. + NOTE: Doesn't work under water. Max harcoded distance is 1000m. - https://community.bistudio.com/wiki/fogParams + https://community.bistudio.com/wiki/lineIntersects - fogParams + lineIntersects Array - fogParams + lineIntersects [begPos, endPos, objIgnore1, objIgnore2] - $Code$_fog = fogParams$/Code$ + $Code$lineIntersects [ eyePos player, aimPos chopper, player, chopper]$/Code$ - undefined / undefined + global / undefined + (may 31, 2012) + Please note the difference : + terrainIntersect + terrainIntersectASL + lineIntersects + lineIntersectsWith + lineIntersectsObjs + intersect - Array + Boolean + - fog + unitAddons - A getter for setFog. Returns the current value of the fog in range 0...1. + Returns list with addons the unit belongs to. - https://community.bistudio.com/wiki/fog + https://community.bistudio.com/wiki/unitAddons - fog + unitAddons String - fog + unitAddons className - $Code$_foglevel = fog ;$/Code$ + $Code$hint str unitAddons typeOf player ; //["A3_Characters_F_BLUFOR"]$/Code$ undefined / undefined + (Mar 31, 2014) + 1. (A3 1.14) Old BIS function BIS_fnc_unitAddon has been deprecated, please always use unitAddons instead. + $Code$ hint str ([player] call BIS_fnc_unitAddon ) // same as unitAddons ( typeOf player )$/Code$ + 2. To return the addon that a weapon belongs to, use BIS_fnc_weaponAddon instead. E.g. + $Code$ + (( primaryWeapon player ) call BIS_fnc_weaponAddon ); //return: "A3_Weapons_F_Rifles_Khaybar" + $/Code$ - Number + Array + - forEachMemberAgent + ctrlCommit - Executes the given command recursively for each agent that is a member of the given team. For just teams use forEachMemberTeam. For both teams and agents use forEachMember. + Commit control animation. - https://community.bistudio.com/wiki/forEachMemberAgent + https://community.bistudio.com/wiki/ctrlCommit - Code forEachMemberAgent Team_Member + Control ctrlCommit Number - command forEachMemberAgent team + controlName ctrlCommit time - + $Code$_control ctrlCommit 2$/Code$ + undefined / undefined + (April 11, 2015) + Use this command if you want to for example change the position or size of a control. - Nothing + Nothing + - forEachMemberTeam + commandMove - Executes the given command recursively for each team that is a member of the given team. For just agents use forEachMemberAgent. For both teams and agents use forEachMember. + Order the given unit(s) to move to the given location (via the radio). Exactly the same as doMove, except this command displays a radio message. - https://community.bistudio.com/wiki/forEachMemberTeam + https://community.bistudio.com/wiki/commandMove - Code forEachMemberTeam Team_Member + Object/Array commandMove Array - command forEachMemberTeam team + unitName commandMove position - + $Code$_soldier1 commandMove ( getMarkerPos "Marker1")$/Code$ + - undefined / undefined + local / global - Nothing + Nothing + - forEachMember + agents - Executes the given command recursively for both teams and agents that are members of the given team. For teams only use forEachMemberTeam. For agents only use forEachMemberAgent. + Return a list of agents in the current mission. - https://community.bistudio.com/wiki/forEachMember + https://community.bistudio.com/wiki/agents - Code forEachMember Team_Member + agents - command forEachMember team + agents - + $Code${ agent _x moveTo position player } forEach agents ;$/Code$ + undefined / undefined + (April 4, 2012) + Note that agents returns a reference to the agent itself, not the object. For example: {alive _x} count agents; would return an error. But you can assign the agent a reference using setVariable, and then reference it, for example: {alive (_x getVariable ["agentObject",objNull]) count agents; would return the number of agents still alive - BUT you would need to define "agentObject" after you create the agent, for example: + _agent = createAgent [_type, _position, [], _radius, "NONE"];_agent setVariable["agentObject",_agent,true]; + + (August 1, 2013) + Alternatively, to get object from agent reference use agent command. - Nothing + Array + - forEach + hasWeapon - Executes the given command(s) on every item of an array. - The array items are represented by the magic variable _x. The array indices are represented by _forEachIndex. - In ArmA2 & VBS2, the variable _x is always local to the forEach block so it is safe to nest them. + Checks if a unit has the given weapon. - https://community.bistudio.com/wiki/forEach + https://community.bistudio.com/wiki/hasWeapon - String/Code forEach Array + Object hasWeapon String - script forEach array + unitName hasWeapon weaponName - $Code${ _x setDammage 1; } forEach units group player ;$/Code$ - - $Code$// This command can also easily be used to execute a single command multiple times without respect to the array items. - { player addMagazine "M16"; } forEach [1, 2, 3, 4];$/Code$ - - $Code$// You can also use multiple commands in the same block. - { - _x setCaptive true ; - removeAllWeapons _x ; - doStop _x ; - } forEach units group this ;$/Code$ - - $Code$// To get the index of a forEach loop, use _forEachIndex. - { systemChat format ["%1", _forEachIndex];} forEach [1,2,3]; - // Will return: "0", "1", "2" in systemChat messages.$/Code$ + $Code$?!( player hasWeapon "M16") : player addWeapon "M16"$/Code$ - undefined / undefined + global / undefined - (July 20, 2010) - If arrays are used in forEach loops, _x uses them by reference, so any changes to _x will be applied to the original: - $Code$_arr1 = [1,2,3]; - _arr2 = [6,7,8]; - {_x set [1,"x"]} forEach [_arr1,_arr2];$/Code$ - will change _arr1 to [1,"x",3], and _arr2 to [6,"x",8]. - - (August 29, 2014) - forEach returns any (the last passed value will be the return value or just Nothing, depends on the function called). - $Code$ - _var = {_x} forEach [ nil,"s", objNull, configFile ]; // return bin\config.bin - _var = {_x setCaptive true } forEach allUnits ; // return nothing - $/Code$ - - (September 20, 2014) - Using the foreach loop, since there are no variable for the index like say the for-do loop, there is a variable that you can use to check the index of the foreach loop. - $Code${ - if ( _forEachIndex == 1) then { - // Copilot - _x addUniform "U_B_Soldier_VR"; - } else { - // Adams - [_x, "B_Soldier_TL_F"] call BIS_fnc_loadInventory ; - _x addUniform "U_B_Soldier_VR"; - _x setIdentity "Bootcamp_B_Adams"; - }; - } forEach _crew; - $/Code$ - So when the array is past from _crew to the loop, index 1 (which is the second element) is the copilot of the "B_Heli_Light_01_F" and he will get "U_B_Soldier_VR" as a uniform. While the pilot which is index 0 (first element), will get the same uniform but will get the loadout of "B_Soldier_TL_F" and the identity of "Bootcamp_B_Adams". - - (January 2, 2015) - Using exitWith inside a forEach loop will make forEach actually return something, namely whatever the exitWith returns: - $Code$_result = { - if(_x isEqualTo 3) exitWith {"Hello"} - } forEach [1,2,3,4,5]; - //_result = "Hello"$/Code$ - - (June 17, 2016) - To be more precise, _forEachIndex represents NOT the index of the current array element, but the number of the loop iteration. If array is modified by reference while it is iterated through with forEach loop, _forEachIndex will NOT change to reflect that. For example: - $Code$_array = ["1","2","3","4","5","6","7","8","9"]; - { - systemChat str [_x, _forEachIndex, _array]; - _array deleteAt _forEachIndex; - } - forEach _array; - /*result: - [_x, _forEachIndex, _array] - ["1",0,["1","2","3","4","5","6","7","8","9"]] - ["3",1,["2","3","4","5","6","7","8","9"]] - ["5",2,["2","4","5","6","7","8","9"]] - ["7",3,["2","4","6","7","8","9"]] - ["9",4,["2","4","6","8","9"]]*/ - $/Code$ + (September 11, 2014) + This command doesn't work for Items in Arma 3, use this instead. + $Code$" ItemGPS " in ( items player + assignedItems player ) OR ' ItemGPS ' in ( items player + assignedItems player ) $/Code$ + Returns true if unit has gps in inventory, assigned or not. - Anything + Boolean + - forceAddUniform + menuDelete - Create a new uniform and hard link it into slot (without any restrictions). + Deletes menu entry on given path. - https://community.bistudio.com/wiki/forceAddUniform + https://community.bistudio.com/wiki/menuDelete - Object forceAddUniform String + menuDelete Array - unit forceAddUniform type + menuDelete [idc, path, text] - $Code$_unit forceAddUniform "U_B_CombatUniform_mcam";$/Code$ - + - global / global + undefined / undefined - Nothing + Number + - forceEnd + distanceSqr - Sets the flag which tells engine that the mission end was forced. Might need additional endMission execution. Can be used in an "END" trigger to force end conditions in the editor. + Computes the squared distance between two objects or positions. - https://community.bistudio.com/wiki/forceEnd + https://community.bistudio.com/wiki/distanceSqr - forceEnd + Object/Position distanceSqr Object/Position - forceEnd + var1 distanceSqr var2 - $Code$if (_TerritoryLost) then { forceEnd }$/Code$ + $Code$player distanceSqr ( leader player )$/Code$ + + $Code$_distance = sqrt ((x2 - x1) ^ 2 + (y2 - y1) ^ 2 + (z2 - z1) ^ 2); + _distanceSqr = (x2 - x1) ^ 2 + (y2 - y1) ^ 2 + (z2 - z1) ^ 2; + _distance = [x1, y1, z1] distance [x2, y2, z2]; + _distanceSqr = [x1, y1, z1] distanceSqr [x2, y2, z2]; + _distance = sqrt ([x1, y1, z1] distanceSqr [x2, y2, z2]); + _distanceSqr = ([x1, y1, z1] distance [x2, y2, z2]) ^ 2;$/Code$ - undefined / local + undefined / undefined - Nothing + Number + - forceFlagTexture + breakOut - Forces a flag texture onto a flag carrier (unit, vehicle or flag pole). No flag holder is required. If "" is used as texture, the texture is removed. This will override regularly owned flags. This type of flag texture cannot be retrieved using flagTexture. - Note : Forced flag texture is an additional flag texture, which visually overrides original flag texture and therefore is very expensive to simulate, so please use the functionality sparingly. + Breaks the code execution out of scope {} named name. nil is returned. Scope name can be assigned using scopeName command. + Since Arma 3 v1.47, breakOut can be used to return a value. It is the closest SQF comes to having "return" like operation. - https://community.bistudio.com/wiki/forceFlagTexture + https://community.bistudio.com/wiki/breakOut - Object forceFlagTexture String + breakOut String + + Anything breakOut String - object forceFlagTexture texture + breakOut name + + value breakOut name - $Code$player forceFlagTexture "\A3\Data_F\Flags\Flag_red_CO.paa";$/Code$ + $Code$scopeName "main"; + while { true } do { + scopeName "loop1"; + while { true } do { + scopeName "loop2"; + if (condition1) then { breakTo "main"}; // Breaks all scopes and return to "main" + if (condition2) then { breakOut "loop2"}; // Breaks scope named "loop2" + sleep 1; + }; + sleep 1; + };$/Code$ + + $Code$call { + scopeName "main"; + call { + 123 breakOut "main" + }; + 345 + }; // call returns 123$/Code$ - global / global + undefined / undefined + (19 Aug, 2008) + When "name" is nil, the command is ignored. + When "name" is an undefined scope name or "", the script quits current scope. + $Code$if (true) then { + hint "1"; + breakOut nil; + hint "2"; + }; //result "2" + if (true) then { + hint "1"; + breakOut ""; + hint "2"; + }; //result "1" + if (true) then { + hint "1"; + breakOut "dskfhdsklfh"; + hint "2"; + }; //result "1" + $/Code$ + + (August 27, 2015) + breakOut can still be used if multiple scopes share identical names. It will simply break out of the nearest scope that matches the name parameter you've used. For example: + $Code$call { + scopeName "Main"; //Parent Main + call { + scopeName "Main"; //Child Main + "String" breakOut "Main"; //Will break out of child main and return "String" to parent main + }; + }; + $/Code$ + Therefore you are able to consistently reuse scope names such as "Main", "Child", "Primary", "Secondary", etc throughout functions without worrying about having to ensure you create unique names for each scope. - Nothing + Nothing - Anything + - forceMap + entities - Opens non-interactive main map in background that overrides user screen. The user is able to fire but cannot see the world just the map. To force open interactive map use openMap command. + Returns a list of all alive and dead entities of the given type or deriving from the given type. Units in vehicles are ignored. When empty string "" is passed for the type, all entity types are returned. + Alternative syntax introduced in Arma 3 v1.65.138685 allows to filter entities by type and alive status as well as to return entities currently in vehicles. Optimisation tip : Keep number of types in both includeTypes and excludeTypes arrays to a minimum by possibly using parent/base classes. If you have to use several types, arrange them in order so that the more common types go at the beginning of the array. - https://community.bistudio.com/wiki/forceMap + https://community.bistudio.com/wiki/entities - forceMap Boolean + entities String + + entities Array - forceMap show + entities type + + entities [typesInclude, typesExclude, includeCrews, excludeDead] - $Code$forceMap true$/Code$ + $Code$_allcars = entities "Car";$/Code$ + + $Code$// Return all alive entities on the map: + _allalive = entities [[], [], true, true ];$/Code$ + + $Code$// Return dead and alive entities but logic: + _notlogic = entities [[], ["Logic"], true ];$/Code$ + + $Code$// Return all alive west soldiers on foot: + _footsoldiers = entities [["SoldierWB"], [], false, true ];$/Code$ - undefined / local + undefined / undefined - In OFP v1.96, the mapAnim series of commands, together with forceMap can only be used in the intro and mission, as it is not possible to access the map from the outro. (not checked, sourced from an old copy of the OFPEC comref) + (Mar 27, 2014) + In ArmA3 ver 1.14 type (string) can be any children class under configfile "CfgVehicles". e.g. $Code$ entities "All"; //or entities "CAManBase"; etc.$/Code$ - Manually opening the map afterwards won't close the map. Actually it will open the "real" map on top of the forced map, and closing the (top) map with the m -key again will still show the forcefully opened map. (ArmA 1.05) + (July 12, 2016) + In A3 1.62 $Code$entities "CAManBase"$/Code$ does not include entities inside vehicles (crew). - Nothing + Array - Array + - forceRespawn + resetSubgroupDirection - Forces unit to respawn. The effect as if the player pressed RESPAWN button in the game pause menu, the unit is killed only there is no "so and so was killed" message and no score adjustment. + Resets direction of subgroup. - https://community.bistudio.com/wiki/forceRespawn + https://community.bistudio.com/wiki/resetSubgroupDirection - forceRespawn Object + resetSubgroupDirection Object - forceRespawn unit + resetSubgroupDirection unit - $Code$forceRespawn player ;$/Code$ + $Code$resetSubgroupDirection myUnit;$/Code$ - local / global + undefined / undefined - Nothing + Nothing + - forceWalk + setFlagTexture - Forces unit to walk even if run or sprint is selected. + Sets flag texture. + If texture is "", flag is not drawn. + Custom texture can be used, as long as it is in *.jpg format, and has dimensions of 200px*200px. + The page Flag Textures shows which textures are available in each game. + NOTE : In MP this command has to be executed where Flag Pole is local. If you add Flag Pole in the editor, it will be local to the server, so executing setFlagTexture on the server will change flag texture on all clients. The command is also persistent and is synchronised for JIP clients. - https://community.bistudio.com/wiki/forceWalk + https://community.bistudio.com/wiki/setFlagTexture - Object forceWalk Boolean + Object setFlagTexture String - unit forceWalk value + flag setFlagTexture texture - $Code$player forceWalk true ;$/Code$ + $Code$_flagE setFlagTexture "\ca\misc\data\sever_vlajka.paa";$/Code$ + + $Code$_flagW setFlagTexture "\ca\misc\data\usa_vlajka.paa";$/Code$ + + $Code$flag1 setFlagTexture "\A3\Data_F\Flags\Flag_red_CO.paa";$/Code$ + + $Code$flagARMA3 setFlagTexture "\a3\ui_f\data\Logos\arma3_expansion_ca.paa";$/Code$ + + $Code$// Capturable OPFOR flag: + private _flag = "FlagPole_F" createVehicle position player ; + _flag setFlagTexture "\A3\Data_F\Flags\Flag_CSAT_CO.paa"; + _flag setFlagSide east ;$/Code$ - local / undefined + local / global - Nothing + Nothing + - forceWeaponFire + enableSentences - The unit will be forced to fire weapon from the given muzzle. The weapon will not fire if firemode passed as parameter is not supported by the given muzzle. The muzzle could belong to a vehicle weapon and unit in this case will be the unit operating this weapon. Doesnt't seem to work for units in FFV positions. See also: BIS_fnc_fire + Enables radio transmissions to be heard and seen on screen. It does not affect KBTell conversations. - https://community.bistudio.com/wiki/forceWeaponFire + https://community.bistudio.com/wiki/enableSentences - Object forceWeaponFire Array + enableSentences Boolean - unit forceWeaponFire [muzzle, firemode] + enableSentences enable - $Code$soldierOne forceWeaponFire ["arifle_MX_F", "Single"];$/Code$ - - $Code$player forceWeaponFire ["hgun_ACPC2_F", "hgun_ACPC2_F"];$/Code$ - - $Code$_unit forceWeaponFire ["HandGrenadeMuzzle","HandGrenadeMuzzle"]; - _unit forceWeaponFire ["MiniGrenadeMuzzle","MiniGrenadeMuzzle"]; - _unit forceWeaponFire ["HandGrenade_Stone","HandGrenade_Stone"]; - _unit forceWeaponFire ["SmokeShellMuzzle","SmokeShellMuzzle"]; - _unit forceWeaponFire ["ChemlightGreenMuzzle","ChemlightGreenMuzzle"]; - _unit forceWeaponFire ["IRGrenade","IRGrenade"]; - _unit forceWeaponFire ["Laserdesignator","Laserdesignator"];$/Code$ - - $Code$gunner blackfoot forceWeaponFire ["gatling_20mm", "close"];$/Code$ + $Code$enableSentences false;$/Code$ - local / global + undefined / local - (August 25, 2013) - Here is a neat workaround trick for firemode change from a script: - $Code$_weapon = currentWeapon player ; - _ammo = player ammo _weapon; - player setAmmo [_weapon, 0]; - player forceWeaponFire [_weapon, "FullAuto"]; - player setAmmo [_weapon, _ammo];$/Code$ - - (April 14, 2014) - (A3 1.16) forceWeaponFire is no longer only limited to units, but can remote aircrafts weapon firing as well. Passed source unit should be the correct one who controls the weapon, if passed mode is "this", use the weapon name instead: - $Code$ - _weapon = ( weapons _veh) select 3; - _mode = ( getArray ( configFile "cfgweapons" _weapon "modes")) select 0; - if (_mode == "this") then {_mode = _weapon;}; - ( driver _veh) forceWeaponFire [_weapon, _mode]; - //Force a CAS fire a rocket. - $/Code$ - Currently this command is not available for land vehicle remote fire. - - (September 02, 2014) - Similar to Killzone Kid's note, This fires the units current weapon in its current firemode. - $Code$_unit forceWeaponFire [ weaponState _unit select 1, weaponState _unit select 2];$/Code$ - - (January 3, 2015) - fireAtTarget command can be used to force fire gunner weapon in vehicles. A gunner must be present. $Code$_veh fireAtTarget [ objNull ];$/Code$ Will fire one shot even if player is gunner. - fire command can also be used to fire vehicle weapon, like smoke launcher for example: $Code$ vehicle player fire "SmokeLauncher";$/Code$ And if this doesn't work, it is possible to force fire via action $Code$tank action ["UseWeapon", tank, commander tank, 0];$/Code$ - Nothing + Nothing + - forceWeatherChange + hcRemoveGroup - Forces saved wanted settings for weather to be actual (BEWARE: Will cause lag). - NOTE The engine has own idea about the weather and will interfere with your scripted weather at every opportunity it gets. So don't give it the opportunity. In the editor's Intel there are Manual Override setting for many aspects of the weather. Select them to disable engine interference. Some commands such as setWaves and setLightnings will not even work until their respective settings are set to manual. + Removes group from unit's high command bar. - https://community.bistudio.com/wiki/forceWeatherChange + https://community.bistudio.com/wiki/hcRemoveGroup - forceWeatherChange + Object hcRemoveGroup Group - forceWeatherChange + unit hcRemoveGroup group - $Code$240 setOvercast 1; - 360 setRain 1; - forceWeatherChange ; comment "force immediate change overriding smooth transition";$/Code$ - + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - forcedMap + add3DENLayer - Returns if map was forced by using forceMap command or openMap command with force option + Add an editing layer in Eden Editor. - https://community.bistudio.com/wiki/forcedMap + https://community.bistudio.com/wiki/add3DENLayer - forcedMap + Number add3DENLayer String - forcedMap + parentLayerID add3DENLayer name - $Code$_forceMapForced = forcedMap select 0; - _openMapForced = forcedMap select 1;$/Code$ + $Code$_myLayer = -1 add3DENLayer "Enemy Base"; + _myLayerFort = _myLayer add3DENLayer "Fortifications"; + _myLayerPatrol = _myLayer add3DENLayer "Patrols";$/Code$ undefined / undefined @@ -25732,27 +26869,31 @@ - Array + Number + - forgetTarget + hcShowBar - Resets info group has about target + Shows or hides high command bar. + There must be some groups under HC command to show HC bar. - https://community.bistudio.com/wiki/forgetTarget + https://community.bistudio.com/wiki/hcShowBar - Group/Object forgetTarget Object + hcShowBar Boolean - group forgetTarget target + hcShowBar bool - $Code$soldier1 forgetTarget soldier2;$/Code$ + $Code$hcShowBar true ;$/Code$ + + $Code$hcShowBar false ;$/Code$ undefined / undefined @@ -25760,341 +26901,386 @@ - Nothing + Nothing + - for + setParticleRandom - This operator creates a For Type which is used in the for-constructs (There is the for forspec and the for var syntax available for this construct) + Sets randomization of particle source parameters. Correspondence between CfgCloudlets class param names and command array of params: + $Code$particleSource setParticleRandom + [ + lifeTimeVar, + positionVar, + moveVelocityVar, + rotationVelocityVar, + sizeVar, + colorVar, + randomDirectionPeriodVar, + randomDirectionIntensityVar, + angleVar, + bounceOnSurfaceVar + ];$/Code$ - https://community.bistudio.com/wiki/for + https://community.bistudio.com/wiki/setParticleRandom - for String/Array + Object setParticleRandom Array - for arg + particleSource setParticleRandom [lifeTime, position, moveVelocity, rotationVelocity, size, color, randomDirectionPeriod, randomDirectionIntensity, angle, bounceOnSurface] - $Code$for "_i" from 1 to 10 do { debugLog _i;};$/Code$ - - $Code$for "_i" from 9 to 1 step -2 do { debugLog _i;};$/Code$ - - $Code$for [{_i=0}, {_i 10}, {_i = _i + 1}] do {hint str _i};$/Code$ + $Code$_PS setParticleRandom [0, [0.1, 0.1, 0.1], [0, 0, 0.5], 0, 0.1, [0, 0, 0, 0], 0, 0];$/Code$ undefined / undefined + (July 03, 2013) + Support of parameter bounceOnSurface ( Number - 0-1) is in the game since Arma 3 version 0.74. It's variability in speed's loosing in collision with ground. Requires collisions with ground enabled by script command setParticleParams. - For_Type + Nothing + - forceSpeed + worldToModel - Force the speed limit on given object (object will never attempt to move faster than given by forceSpeed). Use negative value to return to default behaviour. Used unit is m/s. + Converts position from world space to object model space. - https://community.bistudio.com/wiki/forceSpeed + https://community.bistudio.com/wiki/worldToModel - Object forceSpeed Number + Object worldToModel Array - object forceSpeed speed + model worldToModel position - $Code$_helicopter forceSpeed 150;$/Code$ + $Code$_relPos = myObject worldToModel [0,0,0];$/Code$ + + $Code$_relPos = player worldToModel position car;$/Code$ + + $Code$_relPos = car worldToModel [12000,5000];$/Code$ undefined / undefined - (17:02, 2 March 2007 (CET)) - - (9 February 2008) - Does not seem to do anything at the current time (V1.08.5163) - - (14 December 2011) - If a unit (man) has forceSpeed set to anything under jogging (walking only) the unit will refuse to get into vehicles. He will automatically be unassigned from a vehicle everytime he is ordered to get in (via scripts or direct action) - Nothing + Array + - formLeader + waypointStatements - Returns the formation leader of a given unit. This is often the same as the group leader, but not always, for example in cases when a unit is ordered to follow another unit. + Gets the waypoint statements. - https://community.bistudio.com/wiki/formLeader + https://community.bistudio.com/wiki/waypointStatements - formLeader Object + waypointStatements Array - formLeader unitName + waypointStatements waypoint - $Code$? (formLeader player != leader player) : - hint "The formation leader is different to the group leader!" - returns X$/Code$ + $Code$waypointStatements [groupOne,1]$/Code$ - global / undefined + undefined / undefined - Object + Array + - formation + simpleTasks - Returns the current formation of a group. + Return all simple tasks assigned to given person. - https://community.bistudio.com/wiki/formation + https://community.bistudio.com/wiki/simpleTasks - formation Object/Group + simpleTasks Object - formation grp + simpleTasks person - $Code$formation group player$/Code$ - + - global / undefined + undefined / undefined - (January 9, 2007) - Additional ARMA Formations: "File" - Column Compact. "DIAMOND" - Delta. - String + Array + - format + ctrlAngle - Composes a string containing other variables or other variable types. Converts any variable type to a string. If you want to convert a string back to a number, use parseNumber. NOTE that output of this command is limited to ~8Kb. joinString on the other hand doesn't have such limit. + Gets rotation info of an ST_PICTURE control. - https://community.bistudio.com/wiki/format + https://community.bistudio.com/wiki/ctrlAngle - format Array + ctrlAngle Control - format [formatString, var1, var2] + ctrlAngle control - $Code$format ["Player:%1, player's side:%2", player, side player ]; - // returns "Player:WEST 1-1-A:1 (Username), player's side:WEST"$/Code$ - - $Code$player addEventHandler ["HandleDamage", { - hint format ["You just sustained %1%2 damage!", ceil (( _this select 2) * 100), "%"]; - }]; - // hints "You just sustained 20% damage!"$/Code$ + $Code$ctrlAngle _control;$/Code$ undefined / undefined - The maximum number of characters returned by the format command seems to depend on the total byte count. For plain ASCII strings the limit is 2048 characters. - - In Arma 3 the max length of String returned by format command seems to be 8191 characters. formatText doesn't seem to have this limitation. - - (March 28, 2015) - In addition to the note above, formatTexted strings are Structured Text, hence cannot be used like formatted strings (with most scripting commands). A workaround to get strings of type String with more than 8191 characters is: $Code$ str formatText ["%1", _string]$/Code$ - - (January 2, 2016) - In addition to the note above, you may consider using joinString instead of format or formatText workaround. joinString is a fraction faster than format and it has no limit on the length of the string (apart from global String limit obviously) - String + Array + - formatText + find - Creates a structured text by replacing %1, %2, etc. in format with plain or structured texts given as arguments. + Searches for an array element within array or a string within a string. Returns the 0 based index on success or -1 if not found. Search is cASe-seNsItiVE - https://community.bistudio.com/wiki/formatText + https://community.bistudio.com/wiki/find - formatText Array + Array find Anything + + String find String - formatText [format, arg1, arg2,] + array find x + + string find x - $Code$_text = formatText ["Image: %1", image "data\isniper.paa"];$/Code$ + $Code$["Apples","Oranges","Pears"] find "Oranges"; //result is 1 + [1,[2],[[3]]] find [[3]]; //result is 2$/Code$ + + $Code$if ( magazines player find "Strela" = 0) then { hint "You've got Strela!"};$/Code$ + + $Code$hint str ("japa is the man!" find "the man!"); //8$/Code$ undefined / undefined + (January 4, 2015) + Using nil on either side of find will make the whole statement return Nothing : + $Code$_array = [1,2, nil,4,5]; + _result = _array find nil; + hintSilent str ( isNil "_result"); //true + _result = nil find 1; + hintSilent str ( isNil "_result"); //true$/Code$ + + (April 10, 2015) + Find doesn't work with multidimensional arrays in OFP/CWA. It will always returns -1. + + (May 17, 2016) + This command is unreliable/broken when it comes to some non-ASCII characters (as of Arma 3 1.58): + $Code$"abcßdef" find "c" + - 2 + "abcßdef" find "ß" + - 3 + "abcßdef" find "d" + - 5$/Code$ + + (July 7, 2016 10:56 (UTC)) + Not quite unreliable, just unexpected! Strings are tracked in terms of bytes rather than in actual character positions; all strings are stored in UTF-8 format. In other words, the eszett character is in Unicode, which takes up two bytes rather than one as it is within the 128-255 range of Unicode. (Similar results would be expected for the division symbol, the umlaut, accented e's, etc.) Symbols that are particularly high in the Unicode range may take up three bytes, or even four for the truly exceptional characters, although Arma 3's default fonts are unlikely to render them. This definitely complicates any script which assumes any printable character is a single byte, however, and unfortunately I'm not skilled enough with internationalisation to recommend any robust fix. - Structured_Text + Number - Number + - formationDirection + sliderSetPosition - Return the direction in degrees of the 'unit' watching in formation. + Set current thumb position of slider idc of topmost user dialog. - https://community.bistudio.com/wiki/formationDirection + https://community.bistudio.com/wiki/sliderSetPosition - formationDirection Object + sliderSetPosition Array + + Control sliderSetPosition Number - formationDirection unitName + sliderSetPosition [idc, pos] + + control sliderSetPosition pos - $Code$_degrees = FormationDirection _unit$/Code$ + $Code$sliderSetPosition [101, 50];$/Code$ - local / undefined + undefined / undefined - Number + Nothing - Nothing + - formationLeader + ctRowControls - Return leader of the formation. + Returns array of controls on the row with the given index. - https://community.bistudio.com/wiki/formationLeader + https://community.bistudio.com/wiki/ctRowControls - formationLeader Object + Control ctRowControls Number - formationLeader unitName + Control ctRowControls Number - $Code$? (formationLeader player != leader player) : - hint "Formation leader is not the group leader."$/Code$ + $Code$_array = _control ctRowControls 0;$/Code$ - undefined / undefined + local / local - (December 2, 2006) - Return value is NULL-OBJECT if no group members exist. - Object + Array + - formationMembers + setUnitTrait - Return list of units (drivers) in the formation. + Enables or disables a trait or alters a trait of the given unit. Custom trait can only be a bool. + Default traits are: + audibleCoef (scalar) + camouflageCoef (scalar) + engineer (bool) - Ability to repair vehicles and defuse mines using toolkit + explosiveSpecialist (bool) - Ability to defuse mines using toolkit + loadCoef (scalar) - Equipment weight multiplier affecting fatigue and stamina + medic (bool) - Ability to use medikit on self and others + UAVHacker (bool) - https://community.bistudio.com/wiki/formationMembers + https://community.bistudio.com/wiki/setUnitTrait - formationMembers Object + Object setUnitTrait Array - formationMembers person + unit setUnitTrait [skill_name, value, isCustom] - $Code$_drivers=FormationMembers _person$/Code$ + $Code$player setUnitTrait ["Medic", true ];$/Code$ - undefined / undefined + local / global + (April 27, 2016) + The higher the value for the loadCoef the less stamina a unit has. Negative values will dramatically increase the stamina actually to a point where it extends the stamina bar. + + (October 20, 2017) + explosive specialists can defuse mines (ie satchel charges), whilst engineers cannot. - Array + Nothing + - formationPosition + clearBackpackCargo - Return position of unit in the formation + Removes all backpacks from ammo box (or any general weapon holder container). - https://community.bistudio.com/wiki/formationPosition + https://community.bistudio.com/wiki/clearBackpackCargo - formationPosition Object + clearBackpackCargo Object - formationPosition person + clearBackpackCargo box - $Code$_pos=FormationPosition _person$/Code$ + $Code$clearBackpackCargo myBox;$/Code$ undefined / undefined + (July 6, 2017) + This will remove not only backpacks, but vests and uniforms as well. - Array + Nothing + - formationTask + setWaypointLoiterRadius - Return the current task of the unit in the formation. - You can't use it in ArmA 2, it will always returns "NOTHING" + Assignes loiter radius to waypoint - https://community.bistudio.com/wiki/formationTask + https://community.bistudio.com/wiki/setWaypointLoiterRadius - formationTask Object + Waypoint setWaypointLoiterRadius Number - formationTask person + waypoint setWaypointLoiterRadius radius - $Code$_CurrentTask = FormationTask _person$/Code$ + $Code$[_grp, 2] setWaypointLoiterRadius 200;$/Code$ undefined / undefined @@ -26102,267 +27288,330 @@ - String + Nothing + - freeLook + sort - Returns true if freelook is active. + Attempts to sort given array either in ascending ( true ) or descending ( false ) order. All array elements should be one of the following types: + String - array of strings (["a","b","c"...]) + Number - array of numbers ([1,2,3...]) + Array - array of subarrays ([["a",1,2],["b",3,4],["c",5,6]...]). Subarrays should be of the same structure. Subarray elements other than String or Number will be ignored during sorting. + Mixed arrays (["a",1,[true]...]) are not supported and results are undefined. - https://community.bistudio.com/wiki/freeLook + https://community.bistudio.com/wiki/sort - freeLook + Array sort Boolean - freeLook + array sort order - $Code$systemChat (if freeLook then {"Quit looking around player!"} else {""});$/Code$ + $Code$_arr = [5.21725,1.30859,4,5.03028,1]; + _arr sort true ; + hint str _arr; //[1,1.30859,4,5.03028,5.21725]$/Code$ + + $Code$_dev = ["ja","pa","pa","tram","tara"]; + _dev sort false ; + hint str _dev; //["tram","tara","pa","pa","ja"]$/Code$ + + $Code$#define ASC true + #define DESC false + _scores = [[123,"bob",15],[123,"bill",20],[200,"dave",21],[200,"steve",11]]; + _scores sort DESC; + hint str _scores; //[[200,"steve",11],[200,"dave",21],[123,"bob",15],[123,"bill",20]]$/Code$ + + $Code$// Sort buildings by distance and return position of the most distant building: + _buildings = player nearObjects ["Land_Cargo_Patrol_V1_F", 500]; + _buildings = _buildings apply { [_x distance player, _x] }; + _buildings sort false ; + hint format [ + "Most distant building is at %1, distance %2 m", + getPos (_buildings select 0 select 1), + round (_buildings select 0 select 0) + ];$/Code$ undefined / undefined + (April 16, 2015) + The algorithm for sorting subarrays: compare 1st element, if equal compare 2nd, if equal compare 3rd...etc. - Boolean + Nothing + - fromEditor + enableChannel - Return if given team was inserted directly from mission editor. + Enables/disables UI functionality which is responsible for sending text or voice chat to the given chat channel. If the channel was disabled in description.ext, it can be enabled with this command, however the UI functionality changes will be local to the PC executing this command. What this command cannot do: + It cannot disable incoming text or voice + It cannot interrupt own client's transmission in progress + It cannot affect any Custom Radio channels, only channels 0-5 + It cannot persist, so if user is logged out, the changes are reset + It has no effect on chat related scripting commands, such as vehicleChat, globalChat, globalRadio, sideRadio, etc. + So in short, just like with getPlayerChannel, this command provides a nice ability to hack into chat UI with some limitations. And the reason why it is possible to disable entire channels (except Group) in description.ext, is because no one can talk or text, therefore no transmission is happening. NOTE: Group channel cannot be disabled, neither with enableChannel, nor with description.ext param. Channel / Number correspondence: + 0 = Global + 1 = Side + 2 = Command + 3 = Group + 4 = Vehicle + 5 = Direct + 6-15 = Custom Radio (Is not supported by enableChannel ) - https://community.bistudio.com/wiki/fromEditor + https://community.bistudio.com/wiki/enableChannel - fromEditor Team_Member + Number enableChannel Boolean + + Number enableChannel Array - fromEditor teamMember + channel enableChannel enable + + channel enableChannel [chat, VoN] - $Code$_fromEditor = fromEditor _member$/Code$ + $Code$0 enableChannel false ; // Disable user ability to send voice and text on global channel$/Code$ + + $Code$0 enableChannel [ true, false ]; // Enable user ability to send text but disable voice on global channel$/Code$ - undefined / undefined + undefined / local + (June 17, 2016) + If the user is admin, global channel is fully enabled, regardless of this command. + + (July 30, 2016) + Alternative Syntax supports Custom Radio Channels - Boolean + Nothing - Nothing + - from + lineIntersectsWith - Continue sequence of for var construct. It sets the start value of the index variable. + Returns objects intersecting with the virtual line from begPos to endPos. By default resulting array of intersecting objects is unsorted. To sort by distance set sortByDistance param to true. NOTE: Doesn't work under water. Max hardcoded distance is 1000m. - https://community.bistudio.com/wiki/from + https://community.bistudio.com/wiki/lineIntersectsWith - For_Type from Number + lineIntersectsWith Array - for from b + lineIntersectsWith [begPos, endPos, objIgnore1, objIgnore2, sortByDistance] - $Code$for "_x" from 10 to 20 do {..code..}$/Code$ + $Code$_objects = lineIntersectsWith [ eyePos player, AGLtoASL screenToWorld [0.5,0.5]];$/Code$ + + $Code$// Sort by distance: + _objects = lineIntersectsWith [ eyePos player, AGLtoASL screenToWorld [0.5,0.5], objNull, objNull, true ];$/Code$ + + $Code$// Ignore objects: + _objects = lineIntersectsWith [ eyePos player, aimPos chopper, player, chopper];$/Code$ - undefined / undefined + global / undefined + (may 31, 2012) + Please note the difference : + terrainIntersect + terrainIntersectASL + lineIntersect s + lineIntersect s With + lineIntersect s Objs + intersect - For_Type + Array + - fuel + lbColor - Checks how much fuel is left in the gas tank of a vehicle. + Returns the text color of the item with the given index of the listbox or combobox with id idc of the topmost user dialog. + The color is returned in format Color. - https://community.bistudio.com/wiki/fuel + https://community.bistudio.com/wiki/lbColor - fuel Object + lbColor Array + + Control lbColor Number - fuel vehicle + lbColor [idc, index] + + control lbColor index - $Code$if ( fuel vehicle player == 0) then { hint "The vehicle is out of fuel!"};$/Code$ + $Code$_colour = lbColor [101, 0];$/Code$ + + $Code$_color = _control lbColor 0;$/Code$ - global / undefined + local / local - Vehicles refuelled in game with the Fuel trucks e.t.c never get completely refuelled. After refuelling, rather than returning a value of 1 when the fuel command is called. They return a value greater than 0.98 and less than 1. + More information on the LB command family can be found here - Number + Array - Array + - fullCrew + allDeadMen - Returns array with all crew inside given vehicle. Since Arma 3 v1.55.133810 it is possible to return empty seats as well. - NOTE that with introduction of person turrets, the cargo indexes listed in the return are true for moveInCargo command but incompatible with actions such as "GetInCargo" and "MoveToCargo". To find out seats compatible with cargo action commands, execute command with "cargo" filter: - $Code$ fullCrew [heli, "cargo", true ];$/Code$ - The return array is ordered according to cargo index compatible with action cargo commands, i.e. 1st element has index 0, second - index 1, etc. For example armed WY-55 Hellcat reports: - [[ NULL-object,"cargo",2,[],false],[ NULL-object,"cargo",3,[],false],[ NULL-object,"cargo",4,[],false],[ NULL-object,"cargo",5,[],false]] - for cargo positions. The following commands will put player in the same seat: - $Code$ player moveInCargo [heli, 2]; - player action ["GetInCargo", heli, 0];$/Code$ + Return a list of dead units including agents. Dead unit might be inside vehicle. - https://community.bistudio.com/wiki/fullCrew + https://community.bistudio.com/wiki/allDeadMen - fullCrew Object - - fullCrew Array + allDeadMen - fullCrew vehicle - - fullCrew [vehicle, type, includeEmpty] + allDeadMen - $Code$_list = fullCrew vehicle player ;$/Code$ - - $Code$_list = fullCrew [ vehicle player, "turret"];$/Code$ + $Code${ deleteVehicle _x } forEach allDeadMen;$/Code$ - global / undefined + undefined / undefined - (December 13, 2014) - Be aware that the returned role may or may not be in lowercase. E.g. it's "driver" for the driver, but "Turret" for turret units. - As of Arma 3 version 1.36, the alternative syntax of this command returns all crew members if the filter is anything except "driver", "commander", "gunner", "turret" or "cargo" - The filter is not case sensitive. + (17 Oct, 2009) + As dead men are civilian side, don't try to count them with {side _x isEqualTo EAST} count allDeadMen; result will always be 0. + Use the configfile "side" instead: + 0 = [] spawn {while {true} do {sleep 0.1; _westScore = {getNumber (configfile "CfgVehicles" typeOf _x "side") == 0} count allDeadMen; hintSilent format ["East killed: %1",_westScore]};}; - Array - Array + Array + - gearIDCAmmoCount + doFire - Returns ammo count of assigned magazine. + Order the given unit(s) to fire on the given target (without radio messages). + The target is set with doTarget or commandTarget. + The target can be a unit or a vehicle, but not an object. - https://community.bistudio.com/wiki/gearIDCAmmoCount + https://community.bistudio.com/wiki/doFire - gearIDCAmmoCount Number + Object/Array doFire Object - gearIDCAmmoCount idc + unitName doFire target - $Code$ammo = gearIDCAmmoCount _control;$/Code$ + $Code$_ESoldier1 doFire _WSoldier1;$/Code$ - undefined / undefined + local / global + (August 3, 2006) + Notes from before the conversion: + It is often helpful to use doTarget first. + + (March 25, 2007) + A unit will not execute this command when his behaviour is set to "careless". + + (Feb 18, 2012) + Board dofire not working in arma2 1.11. an entity he throws he shoots not only. + + (June 7, 2012) + Unitname dofire objnull does not work like it does in commandfire. Target var has to be real (Arma2 AO) might be different in other versions. - Number + Nothing + - gearSlotAmmoCount + markerSize - Returns ammo count of assigned magazine. + Returns marker size. This command is identical to getMarkerSize. - https://community.bistudio.com/wiki/gearSlotAmmoCount + https://community.bistudio.com/wiki/markerSize - gearSlotAmmoCount Control + markerSize String - gearSlotAmmoCount control + markerSize markerName - $Code$ammo = gearSlotAmmoCount _control;$/Code$ + $Code$_mSize = markerSize "Marker1";$/Code$ - undefined / undefined + global / undefined - Number + Array + - gearSlotData + ctrlChecked - Returns gear slot item name. + Returns the current state of given checkbox in checkboxes control (CT_CHECKBOXES, type = 7; ). Since Arma 3 v1.71.141591 it is possible to query multiple checkboxes by providing checkbox index. For more information see DialogControls-CheckBoxes. + Note: The "onCheckBoxesSelChanged" control EH returns the control, index of changed checkbox and its current checked state. The checked state however is not a Boolean but Number 0 or 1. To convert ctrlChecked command output into number as well, use parseNumber command. - https://community.bistudio.com/wiki/gearSlotData + https://community.bistudio.com/wiki/ctrlChecked - gearSlotData Control + ctrlChecked Control + + Control ctrlChecked Number - gearSlotData control + ctrlChecked control + + control ctrlChecked index - $Code$Open any ammobox and click by any gear slots - private "_dspl"; - disableSerialization; - waitUntil { - _dspl = findDisplay 106; - ! isNull _dspl; - }; - uiNamespace setVariable ["/VDMJ/RscDisplayGear/SlotDataEH", { - _self = _this select 0; - _weaponName = gearSlotData _self; - _conf = configFile _confSection _weaponName; - _name = getText(_conf "displayName"); - _desc = getText(_conf "Library" "libTextDesc"); - _image = getText(_conf "picture"); - hint parseText format[ - ' t size="1.3" align="center" shadow="true" shadowColor="#000000" %1 /t br / img image="%2" size="6" align="center" / br / %3 br / %4', - _name, _image, _desc - ]; - }]; - for "_i" from 107 to 145 do { - _dspl displayCtrl _i ctrlAddEventHandler ["ButtonClick", - format [ - '_confSection = "%1"; _this call (uiNamespace getVariable "/VDMJ/RscDisplayGear/SlotDataEH");', - if( _i = 109 && _i = 129 ) then { "CfgMagazines" } else { "CfgWeapons" } - ] - ]; - };$/Code$ + $Code$ctrlChecked _control;$/Code$ + + $Code$_control ctrlChecked 3;$/Code$ undefined / undefined @@ -26370,28 +27619,28 @@ - String + Boolean - Boolean + - get3DENActionState + dynamicSimulationDistanceCoef - Returns state of given action in the Eden Editor. - See the list of all actions. + A getter for setDynamicSimulationDistanceCoef - https://community.bistudio.com/wiki/get3DENActionState + https://community.bistudio.com/wiki/dynamicSimulationDistanceCoef - get3DENActionState String + dynamicSimulationDistanceCoef String - get3DENActionState action + dynamicSimulationDistanceCoef class - $Code$if ( get3DENActionState "ToggleMap" == 1) then { systemChat "Editor map is open!"};$/Code$ + $Code$hint str dynamicSimulationDistanceCoef "IsMoving";$/Code$ undefined / undefined @@ -26399,31 +27648,28 @@ - Number + Number + - get3DENAttribute + isTurnedOut - Returns value of a given entity's attribute in Eden Editor. - An attribute is identified by its property ( data when it's engine-drive attribute) value in config. For the list of all attributes with their properties, see Setting Attributes. - ! - Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! + Returns true if given unit is turned out, otherwise false. The output changes to true after unit finished turning out, however will change to false almost immediately after unit is ordered to turn in. - https://community.bistudio.com/wiki/get3DENAttribute + https://community.bistudio.com/wiki/isTurnedOut - EdenEntity get3DENAttribute String + isTurnedOut Object - entity get3DENAttribute attribute + isTurnedOut unit - $Code$systemChat str (( get3DENMouseOver select 1) get3DENAttribute "name"); - // returns variable name of object under cursor$/Code$ + $Code$_commanderOut = isTurnedOut (tank turretUnit [0,0]);$/Code$ undefined / undefined @@ -26431,43 +27677,29 @@ - Array + Boolean + - get3DENCamera + true - Returns the camera Object used by the Eden Editor. + Always true - https://community.bistudio.com/wiki/get3DENCamera + https://community.bistudio.com/wiki/true - get3DENCamera + true - get3DENCamera + true - $Code$// set exact yaw, pitch, and roll - _y = 45; _p = -80; _r = 0; - get3DENCamera setVectorDirAndUp [ - [ sin _y * cos _p, cos _y * cos _p, sin _p], - [ [ sin _r,- sin _p, cos _r * cos _p],-_y] call BIS_fnc_rotateVector2D - ];$/Code$ - - $Code$//Look at player - _a = positionCameraToWorld [0,0,0] vectorFromTo ( getPosATL player ); - _y = asin (_a select 0); - _b = [_a,_y] call BIS_fnc_rotateVector2D ; - _z = _b select 2; - _p = asin (_z / sqrt ((_b select 1)^2 + _z^2)); - get3DENCamera setVectorDirAndUp [ - _a, - [ [0,- sin _p, cos _p],-_y] call BIS_fnc_rotateVector2D - ];$/Code$ + $Code$_var = true ; + systemChat str _var; //true$/Code$ undefined / undefined @@ -26475,54 +27707,59 @@ - Object + Boolean + - get3DENConnections + weaponLowered - Return all connections currently present on an entity. + True if given soldier's weapon is lowered. - https://community.bistudio.com/wiki/get3DENConnections + https://community.bistudio.com/wiki/weaponLowered - get3DENConnections EdenEntity + weaponLowered Object - get3DENConnections entity + weaponLowered unit - + $Code$isWeaponLowered = weaponLowered player;$/Code$ + undefined / undefined + (November 11, 2016) + This command seems to work for player only, not for AI. - Array + Boolean + - get3DENEntity + position - Returns Eden Entity based on its unique ID. If the ID points to a layer, the ID will be returned instead. + Synonym for getPos. - https://community.bistudio.com/wiki/get3DENEntity + https://community.bistudio.com/wiki/position - get3DENEntity Number + position Object/Location - get3DENEntity id + position object - $Code$myEntity = get3DENEntity 1$/Code$ + $Code$_pos = position player ;$/Code$ undefined / undefined @@ -26530,59 +27767,63 @@ - EdenEntity + Array + - get3DENEntityID + setWaypointSpeed - Returns unique index of an Eden Entity. This number remains the same even after saving and loading the scenario. + Switches the group speed mode when the waypoint becomes active. + Possible values are: + "UNCHANGED" + "LIMITED" + "NORMAL" + "FULL" - https://community.bistudio.com/wiki/get3DENEntityID + https://community.bistudio.com/wiki/setWaypointSpeed - get3DENEntityID EdenEntity + Array setWaypointSpeed String - get3DENEntityID entity + waypoint setWaypointSpeed mode - $Code$myID = get3DENEntityID player$/Code$ + $Code$[_grp, 2] setWaypointSpeed "FULL";$/Code$ - undefined / undefined + undefined / global + This scripting command must be executed on the server to work properly in multiplayer - Number + Nothing + - get3DENGrid + waypointLoiterType - Returns the grid increment for the given transformation type. - Transformation types: - Rotation - "r" - Translation - "t" - Scale - "s" + Gets the waypoint loiter type. Waypoint uses format Waypoint. - https://community.bistudio.com/wiki/get3DENGrid + https://community.bistudio.com/wiki/waypointLoiterType - get3DENGrid String + waypointLoiterType Waypoint - get3DENGrid type + waypointLoiterType Waypoint - $Code$currentMovementIncrement = get3DENGrid "t";// returns 1$/Code$ + $Code$_type = waypointLoiterType [groupOne, 1]$/Code$ undefined / undefined @@ -26590,57 +27831,61 @@ - Number + String + - get3DENIconsVisible + cadetMode - Get visibility state of Eden Editor icons. + Returns if the player is currently playing in cadet or veteran mode. - https://community.bistudio.com/wiki/get3DENIconsVisible + https://community.bistudio.com/wiki/cadetMode - get3DENIconsVisible + cadetMode - get3DENIconsVisible + cadetMode - $Code$if ( get3DENIconsVisible select 0) then { hint "Icons are visible in the map.";};$/Code$ + $Code$? ( cadetMode ) : _AIsoldier setSkill 0.1 //sqs$/Code$ + + $Code$if ( cadetMode ) then {_AIsoldier setSkill 0.1}; //sqf$/Code$ undefined / undefined + (December 1, 2009) + In ArmA II, this command will return true if the difficulty level is set to "Recruit" or "Regular". It returns false for the "Veteran" and "Expert" difficulty levels. - Array + Boolean + - get3DENLayerEntities + diag_activeScripts - Return all entities and sub-layer in Eden Entity layer. + Returns 4 element array with numbers of currently running scripts in format: [ spawn -ed, execVM -ed, exec -ed, execFSM -ed] - https://community.bistudio.com/wiki/get3DENLayerEntities + https://community.bistudio.com/wiki/diag_activeScripts - get3DENLayerEntities Number + diag_activeScripts - get3DENLayerEntities layerID + diag_activeScripts - $Code$_myLayer = -1 add3DENLayer "CTRG"; - player set3DENLayer _myLayer; - _entities = get3DENLayerEntities _myLayer;$/Code$ + $Code$hint str diag_activeScripts ; //[0,0,0,1]$/Code$ undefined / undefined @@ -26648,136 +27893,168 @@ - Array + Array + - get3DENLinesVisible + removeMPEventHandler - Get visibility state of Eden Editor lines. + Removes MP event handler added by addMPEventHandler. Format of handler is [type,index]. Index is returned by addMPEventHandler. When any handler is removed, all handler indices highter than the deleted one should decremented - https://community.bistudio.com/wiki/get3DENLinesVisible + https://community.bistudio.com/wiki/removeMPEventHandler - get3DENLinesVisible + Object removeMPEventHandler Array - get3DENLinesVisible + unitName removeMPEventHandler [event, index] - $Code$if ( get3DENLinesVisible select 0) then { hint "Lines are visible in the map.";};$/Code$ + $Code$player removeMPEventHandler ["killed", 0];$/Code$ - undefined / undefined + global / global + (25 July, 2011) + At least for MPKilled it needs to be executed where the target unit is local. The effect (the removal) is global. - Array + Nothing + - get3DENMissionAttribute + setTitleEffect - Return value of scenario attribute. - ! - Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! + Defines the title effect via [Type, Effect, Text] where + 'Type' can be + "NONE", + "OBJECT", + 'Text' defines the shown object, a subclass of CfgTitles. + "RES" + 'Text' defines a resource class, a subclass of RscTitles. + "TEXT" + The 'Text' is shown as text itself. 'Effect' defines a subtype: "PLAIN", "PLAIN DOWN", "BLACK", "BLACK FADED", "BLACK OUT", "BLACK IN", "WHITE OUT" or "WHITE IN". - https://community.bistudio.com/wiki/get3DENMissionAttribute + https://community.bistudio.com/wiki/setTitleEffect - String get3DENMissionAttribute String + Object setTitleEffect Array + + Array setTitleEffect Array - section get3DENMissionAttribute class + trigger setTitleEffect [type, effect, text] + + waypoint setTitleEffect [type, effect, text] - $Code$systemChat str ("Multiplayer" get3DENMissionAttribute "respawn");$/Code$ + $Code$_trigger setTitleEffect ["TEXT", "PLAIN DOWN", "Hello world."]$/Code$ undefined / undefined - (February 26, 2016) - The class names of the vanilla sections are: - General - Scenario - Environment - Intel - Multiplayer - Multiplayer - Garbage Collection - GarbageCollection - Preferences - Preferences - Anything + Nothing - Nothing + - get3DENMouseOver + ctrlMapScreenToWorld - Returns the Eden Entity the mouse is hovering over in Eden Editor. + Convert screen coordinates in map to world coordinates. - https://community.bistudio.com/wiki/get3DENMouseOver + https://community.bistudio.com/wiki/ctrlMapScreenToWorld - get3DENMouseOver + Control ctrlMapScreenToWorld Array - get3DENMouseOver + map ctrlMapScreenToWorld [x, y] - $Code$systemChat str get3DENMouseOver ;// returns: ["Object",B Alpha 1-1:1]$/Code$ + $Code$_WorldCoord = _Control ctrlMapScreenToWorld _ScreenCoord$/Code$ + + $Code$_WorldCoord = _Control ctrlMapScreenToWorld [_x,_y]$/Code$ + + $Code$_WorldCoord = (findDisplay 12 displayCtrl 51) ctrlMapScreenToWorld [_x,_y]$/Code$ undefined / undefined + (April 6, 2007) + Notes: + You can get the screen coordinates by the UI Event Handlers onMouseButtonDown, onMouseButtonUp, onMouseButtonClick, onMouseButtonDblClick. + The return Array is in 2-D, you can use it with all set-position commands. + _x = returnArray select 0; + _y = returnArray select 1; + + (December 2, 2009) + Notes: + In VBS2 1.23 this command does not seem to work properly. Therefore when defining UI Event Handlers onMouseButtonClick and onMouseButtonDblClick the functions onMapSingleClick and onDoubleClick (VBS2) can be used instead, these already provide access to the world coordinates of the click event. + + The command parameters are screen position coordinates, which may not equate to to the map control's coordinates. A map control's screen coordinates and size can be found use the ctrlPosition command. This is an issue when using the Arma 3 in-game map, which is not fullscreen (all previous titles used full screen map controls, so map control coords did equate to screen coords). + + (August 28, 2017) + This example creates a RscMapControl and hints you the [x,y] position where you clicked. + $Code$0 spawn { + disableSerialization; + _map = findDisplay 46 createDisplay "RscCredits" ctrlCreate ["RscMapControl", -1]; + _map ctrlSetPosition [0,0,1,1]; + _map ctrlCommit 0; + _map ctrlAddEventHandler ["mouseButtonDown", { + _ctrl = _this select 0; + _x = _this select 2; + _y = _this select 3; + _pos = _ctrl ctrlMapScreenToWorld [_x, _y]; + hint format ["pos: %1", _pos]; + }]; + };$/Code$ - Array + Array + - get3DENSelected + isEqualTypeArray - Returns an array of all selected Eden Editor Entities, including groups, waypoints, and markers. + Compares types of all elements of one array to types of all elements of another array. - https://community.bistudio.com/wiki/get3DENSelected + https://community.bistudio.com/wiki/isEqualTypeArray - get3DENSelected String + Array isEqualTypeArray Array - get3DENSelected type + arr1 isEqualTypeArray arr2 - $Code$systemChat str ( get3DENSelected ""); - /* outputs: [ - [B Alpha 2-1:1],//objects - [B Alpha 2-1],//groups - [164494: no shape ],//triggers - [ No center Charlie 1-2:4],//logic - [ [B Alpha 2-1,0] ],//waypoints - ["Hotel_Whiskey"]//markers - ]*/$/Code$ + $Code$_arr = [1,true,"three"]; + _arr isEqualTypeArray [0,objNull,""]; // false + _arr isEqualTypeArray [0,false,""]; // true$/Code$ - $Code$systemChat str ( get3DENSelected "object"); - // outputs: [B Alpha 2-1:1]$/Code$ + $Code$_arr = [1,2]; + _arr isEqualTypeArray [0]; // false + _arr isEqualTypeArray [0,0]; // true + _arr isEqualTypeArray [0,0,0]; // false$/Code$ undefined / undefined @@ -26785,149 +28062,232 @@ - Array + Boolean + - getAimingCoef + isRemoteExecuted - Get current aiming coefficient (higher ~ less precise, default is 1) + Returns true if the code context is being remote executed by remoteExec or remoteExecCall. In SP always returns false. See also isRemoteExecutedJIP - https://community.bistudio.com/wiki/getAimingCoef + https://community.bistudio.com/wiki/isRemoteExecuted - getAimingCoef Object + isRemoteExecuted - getAimingCoef unit + isRemoteExecuted - $Code$_coef = getAimingCoef player$/Code$ + $Code$_remoteExecuted = isRemoteExecuted ;$/Code$ undefined / undefined + (September 11, 2017) + NOTE : When remoteExec / remoteExecCall is called from a headless client to client, this will always return as false. + This effect also occurs with remoteExecutedOwner - it will return always return 0 from a headless client.. - Number + Boolean + - getAllHitPointsDamage + everyContainer - Returns 3 arrays for easy cross reference: 1st - array of hit point names, 2nd - array of hit selection names, 3rd - array of damage values. All values in all arrays are ordered accordingly to hit part index for convenience and for use in setHitIndex and getHitIndex. Levels of damage are: - 0: no damage - 1: full damage + Returns array of all containers (uniforms, vests, backpacks) stored in given crate or vehicle. Used for accessing containers content stored in ammo box or ground holder. - https://community.bistudio.com/wiki/getAllHitPointsDamage + https://community.bistudio.com/wiki/everyContainer - getAllHitPointsDamage Object + everyContainer Object - getAllHitPointsDamage entity + everyContainer box - $Code$getAllHitPointsDamage player ; - //[ - //["HitFace","HitNeck","HitHead","HitPelvis","HitAbdomen","HitDiaphragm","HitChest","HitBody","HitArms","HitHands","HitLegs"], - //["","neck","head","pelvis","spine1","spine2","spine3","body","","hands","legs"], - //[0,0.0939002,0.0319932,0.0858595,0.174491,1,1,0.168495,1,0.5,0.195907] + $Code$everyContainer cursorTarget ; + // [ + //["V_PlateCarrier1_rgr",2bc06b00# 163955: dummyweapon.p3d], + //["U_B_CombatUniform_mcam",2bc07900# 163954: dummyweapon.p3d] //]$/Code$ - global / undefined + undefined / undefined + (July 20, 2017) + The returned array is in the following format: + $Code$[ + [containerClassname1, containerObject1], + [containerClassname2, containerObject2], + .... + [containerClassnameN, containerObjectN] + ] + $/Code$ + Please do note that typeOf containerObjectN does not return containerClassnameN but rather the containerClass configured in config (usually "supplyN") - Array + Array + - getAllOwnedMines + forEach - Gets all mine objects this unit has ownership over. + Executes the given command(s) on every item of an array. + The array items are represented by the magic variable _x. The array indices are represented by _forEachIndex. + In ArmA2 & VBS2, the variable _x is always local to the forEach block so it is safe to nest them. - https://community.bistudio.com/wiki/getAllOwnedMines + https://community.bistudio.com/wiki/forEach - getAllOwnedMines Object + String/Code forEach Array - getAllOwnedMines unit + script forEach array - $Code$_mines = getAllOwnedMines player ;$/Code$ + $Code${ _x setDammage 1; } forEach units group player ;$/Code$ + + $Code$// This command can also easily be used to execute a single command multiple times without respect to the array items. + { player addMagazine "M16"; } forEach [1, 2, 3, 4];$/Code$ + + $Code$// You can also use multiple commands in the same block. + { + _x setCaptive true ; + removeAllWeapons _x ; + doStop _x ; + } forEach units group this ;$/Code$ + + $Code$// To get the index of a forEach loop, use _forEachIndex. + { systemChat format ["%1", _forEachIndex];} forEach [1,2,3]; + // Will return: "0", "1", "2" in systemChat messages.$/Code$ undefined / undefined + (July 20, 2010) + If arrays are used in forEach loops, _x uses them by reference, so any changes to _x will be applied to the original: + $Code$_arr1 = [1,2,3]; + _arr2 = [6,7,8]; + {_x set [1,"x"]} forEach [_arr1,_arr2];$/Code$ + will change _arr1 to [1,"x",3], and _arr2 to [6,"x",8]. + + (August 29, 2014) + forEach returns any (the last passed value will be the return value or just Nothing, depends on the function called). + $Code$ + _var = {_x} forEach [ nil,"s", objNull, configFile ]; // return bin\config.bin + _var = {_x setCaptive true } forEach allUnits ; // return nothing + $/Code$ + + (September 20, 2014) + Using the foreach loop, since there are no variable for the index like say the for-do loop, there is a variable that you can use to check the index of the foreach loop. + $Code${ + if ( _forEachIndex == 1) then { + // Copilot + _x addUniform "U_B_Soldier_VR"; + } else { + // Adams + [_x, "B_Soldier_TL_F"] call BIS_fnc_loadInventory ; + _x addUniform "U_B_Soldier_VR"; + _x setIdentity "Bootcamp_B_Adams"; + }; + } forEach _crew; + $/Code$ + So when the array is past from _crew to the loop, index 1 (which is the second element) is the copilot of the "B_Heli_Light_01_F" and he will get "U_B_Soldier_VR" as a uniform. While the pilot which is index 0 (first element), will get the same uniform but will get the loadout of "B_Soldier_TL_F" and the identity of "Bootcamp_B_Adams". + + (January 2, 2015) + Using exitWith inside a forEach loop will make forEach actually return something, namely whatever the exitWith returns: + $Code$_result = { + if(_x isEqualTo 3) exitWith {"Hello"} + } forEach [1,2,3,4,5]; + //_result = "Hello"$/Code$ + + (November 28, 2017) + Be careful when deleting ( deleteAt ) elements from an Array while you iterate over it. + _forEachIndex will not move to reflect your change. + The forEach code is doing the same as + $Code$ + _forEachIndex = 0; + while {_forEachIndex count _array} do { + (_array select _forEachIndex) call code; + _forEachIndex = _forEachIndex + 1; + } + $/Code$ + So if you delete your current element from the array the other elements will shift forward. Meaning you skip one element. + Example: + $Code$_array = [1,2,3,4,5,6]; + {_array deleteAt _forEachIndex} forEach _array; + $/Code$ + After the first iteration your Array will be [2,3,4,5,6] and the _forEachIndex will be 1. + So on next iteration you get the element at index 1 which will be 3. So you've just skipped the 2. + So in the end you will only iterate over 1,3 and 6 - Array + Anything + - getAmmoCargo + menuExpand - Returns the amount of ammo resources in the cargo space of a rearm vehicle. + Expands given menu entry on given path and all its parents so entry is visible. - https://community.bistudio.com/wiki/getAmmoCargo + https://community.bistudio.com/wiki/menuExpand - getAmmoCargo Object + menuExpand Array - getAmmoCargo vehicle + menuExpand [idc, path] - $Code$value = getAmmoCargo myVehicleName;$/Code$ - + - global / undefined + undefined / undefined - (December 22, 2014) - If the vehicle is not alive, it always returns Nothing, which you should check for using isNil. - If the vehicle is unable to carry that type of cargo, it returns -1.#IND, which you should check for using finite. - Number + Nothing + - getAnimAimPrecision + clearItemCargo - Returns aim precision for current animation + Removes all items from ammo box (or any general weapon holder container). - https://community.bistudio.com/wiki/getAnimAimPrecision + https://community.bistudio.com/wiki/clearItemCargo - getAnimAimPrecision Object + clearItemCargo Object - getAnimAimPrecision unit + clearItemCargo box - $Code$getAnimAimPrecision player;$/Code$ + $Code$clearItemCargo myBox;$/Code$ undefined / undefined @@ -26935,290 +28295,278 @@ - Number + Nothing + - getAnimSpeedCoef + magazinesTurret - Get coefficient for animation speed. + Returns all magazines of given turret. Use turret path [-1] for driver's turret. Alternatively, use magazinesAllTurrets - https://community.bistudio.com/wiki/getAnimSpeedCoef + https://community.bistudio.com/wiki/magazinesTurret - getAnimSpeedCoef Object + Object magazinesTurret Array - getAnimSpeedCoef unit + vehicle magazinesTurret turretPath - $Code$getAnimSpeedCoef player ;$/Code$ + $Code$_mags = vehicle player magazinesTurret [0, 0];$/Code$ + + $Code$_mags = _tank magazinesTurret [0];$/Code$ - undefined / undefined + global / undefined - Number + Array + - getArray + setDriveOnPath - Extract array from config entry. + Sets the path to follow for AI driver - https://community.bistudio.com/wiki/getArray + https://community.bistudio.com/wiki/setDriveOnPath - getArray Config + Object setDriveOnPath Array - getArray config + vehicleName setDriveOnPath [points] - $Code$_array = getArray (configFile "CfgVehicles" "Thing" "threat")$/Code$ + $Code$myVehicle setDriveOnPath [[1000,10,1000],[1100,10,1000]]$/Code$ undefined / undefined - (Mar 28, 2014) - (ArmA3 1.14) It's recommended to use BIS_fnc_GetCfgData or BIS_fnc_returnConfigEntry to get variable cfg data rather than conditioning via isNumber, isText, isArray, getNumber, getText and getArray combination. - Traditional workaround: - $Code$ - _cfg = configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type" - switch ( true ) do - { - case ( isNumber _cfg): { getNumber _cfg}; - case ( isText _cfg): { getText _cfg}; - case ( isArray _cfg): { getArray _cfg;}; - default { nil }; - }; - $/Code$ - Recommended workaround: - $Code$ - ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_GetCfgData ; - $/Code$ - To return default value once entry was not found, we can use BIS_fnc_returnConfigEntry instead of BIS_fnc_GetCfgData. - $Code$ - [( configFile "CannonFire" "LightExp"),"lifeTime",0] call BIS_fnc_returnConfigEntry ;//0.5 - $/Code$ - Array + Nothing + - getArtilleryAmmo + lbIsSelected - Get list of all available magazines of artillery units on the list. Command returns only unique magazine types and doesn't contain any information about which unit has which magazine. + Check whether given row of the given listbox is selected. - https://community.bistudio.com/wiki/getArtilleryAmmo + https://community.bistudio.com/wiki/lbIsSelected - getArtilleryAmmo Array + Control lbIsSelected Number - getArtilleryAmmo [unit1, unit2, unit3] + control lbIsSelected index - $Code$if ("8Rnd_82mm_Mo_Flare_white" in getArtilleryAmmo [ - _mortar1, - _mortar2, - _mortar3, - _mortar4 - ]) then { - hint "Sir, we have white flares, sir!"; - };$/Code$ + $Code$_selected = _control lbIsSelected 0;$/Code$ - global / undefined + local / local + More information on the LB command family can be found here - Array + Boolean + - getArtilleryComputerSettings + magazines - Returns settings from artillery computer currently opened by player. + Returns array of type names of all vehicle's magazines. + When applied to a unit (soldier), the command behaves differently and will omit magazines already loaded into unit's weapons. Use currentMagazine to get this information for a currently loaded magazine. - https://community.bistudio.com/wiki/getArtilleryComputerSettings + https://community.bistudio.com/wiki/magazines - getArtilleryComputerSettings + magazines Object - getArtilleryComputerSettings + magazines vehicle - $Code$hint str getArtilleryComputerSettings ; //["Semi (medium)","HE Mortar Shells",0]$/Code$ + $Code$_mags = magazines player$/Code$ undefined / undefined + In OFP v1.96, if a weapon is loaded with an empty magazine, that magazine will still be counted by this command. The ammo command can be used to check if a unit has any ammunition into it's last magazine. + + (25 November 2011) + This command does not include non-turret weapon magazines, such as smoke, flare or chaff magazines which are usually declared in the root of the vehicle's class, rather than in the Turrets hierarchy. - Array + Array + - getArtilleryETA + triggerAttachVehicle - Returns ETA to the target in seconds for given artillery unit based on target position and used magazine, -1 if target can't be hit. + Specifies the entity which will activate the selected trigger. + If [] is given, the trigger is decoupled from the assigned vehicle (example 2). + If the activation source is "VEHICLE", "GROUP", "LEADER" or "MEMBER", it's changed to "NONE". + If [vehicle] is given, the trigger is coupled to the vehicle or its group. + When the source is "GROUP", "LEADER" or "MEMBER", it's coupled to the group, otherwise it's coupled to the vehicle and the source is changed to "VEHICLE". - https://community.bistudio.com/wiki/getArtilleryETA + https://community.bistudio.com/wiki/triggerAttachVehicle - Object getArtilleryETA Array + Object triggerAttachVehicle Array - unit getArtilleryETA [targetPosition, magazineType] + triggerName triggerAttachVehicle objects - $Code$_mortar getArtilleryETA [ getPos _target, getArtilleryAmmo [_mortar] select 0];$/Code$ + $Code$trigger triggerAttachVehicle [ player ];$/Code$ - $Code$_mortar getArtilleryETA [ position _target, currentMagazine _mortar];$/Code$ + $Code$trigger triggerAttachVehicle [];$/Code$ - global / undefined + global / local - (August 26, 2013) - To avoid wrong ETA readings, position of the target should only be obtained via position or getPos - Number + Nothing + - getAssignedCuratorLogic + loadAbs - Returns curator logic to which given player has access. + Returns current sum of mass from items stored in all unit's containers, linked items and weapons. - https://community.bistudio.com/wiki/getAssignedCuratorLogic + https://community.bistudio.com/wiki/loadAbs - getAssignedCuratorLogic Object + loadAbs Object - getAssignedCuratorLogic player + loadAbs unit - $Code$( getAssignedCuratorLogic player ) removeCuratorEditableObjects [ allDead, true ];$/Code$ + $Code$// Player weight: + _weight = loadAbs player;$/Code$ undefined / undefined - (August 17, 2014) - This command will return objNull if used immediately after the curator logic is assigned to the unit in question (this includes at mission time 0). To avoid problems use the following beforehand: $Code$ waitUntil {! isNull ( getAssignedCuratorLogic unit)};$/Code$ - Object + Number + - getAssignedCuratorUnit + setAutonomous - Returns unit assigned to curator logic. + Sets UAV autonomous mode. - https://community.bistudio.com/wiki/getAssignedCuratorUnit + https://community.bistudio.com/wiki/setAutonomous - getAssignedCuratorUnit Object + Object setAutonomous Boolean - getAssignedCuratorUnit curatorObj + uav setAutonomous bool - $Code$_curatorUnit = getAssignedCuratorUnit ( allCurators select 0); - _curatorUnit joinAs [ createGroup civilian, 0];$/Code$ + $Code$uav setAutonomous true ;$/Code$ undefined / undefined - (August 17, 2014) - This command will return objNull if used immediately after the curator unit is assigned to the logic in question (this includes at mission time 0). To avoid problems use the following beforehand: $Code$ waitUntil {! isNull ( getAssignedCuratorUnit logic)};$/Code$ - Object + Nothing + - getBackpackCargo + camSetRelPos - Returns all backpack types and count from the cargo space + Sets the position of the given camera relative to its target, set with camSetTarget. Needs a call to camCommit to be conducted. Note, that since it sets relative position to the target, the camSetTarget command should be executed already, before camSetRelPos. - https://community.bistudio.com/wiki/getBackpackCargo + https://community.bistudio.com/wiki/camSetRelPos - getBackpackCargo Object + Object camSetRelPos Array - getBackpackCargo object + camera camSetRelPos position - $Code$_content = getBackpackCargo carName;$/Code$ - - $Code$_content = getBackpackCargo ammoBoxName;$/Code$ + $Code$_cam camSetTarget _car; + _cam camSetRelPos [0,10,8];$/Code$ - undefined / undefined + local / local + The location of the camera will depend on the direction the target object is facing. + The camera does not bank with the target (bug?). - Array + Nothing + - getBleedingRemaining + armoryPoints - Returns how many seconds injured unit will continue leaving blood trail. If unit damage is 0.1, the return value is 0 and unit doesn't leave any blood trail. Use setBleedingRemaining to set different remaining time. + Returns, stored in [USERNAME].ArmaXProfile, value of armoryPoints entry. If the entry doesn't exist, it returns 0. - https://community.bistudio.com/wiki/getBleedingRemaining + https://community.bistudio.com/wiki/armoryPoints - getBleedingRemaining Object + armoryPoints - getBleedingRemaining unit + armoryPoints - $Code$_bleedingRemaining = getBleedingRemaining _unit;$/Code$ + $Code$_points = armoryPoints ;$/Code$ undefined / undefined @@ -27226,194 +28574,168 @@ - Number + Number + - getBurningValue + tvSetPictureRightColorSelected - Returns amount of damage from fire. + Sets the color of the right picture of a tree item defined by path when item is selected - https://community.bistudio.com/wiki/getBurningValue + https://community.bistudio.com/wiki/tvSetPictureRightColorSelected - getBurningValue Object + Control tvSetPictureRightColorSelected Array - getBurningValue unit + control tvSetPictureRightColorSelected [path, color] - + $Code$_control tvSetPictureRightColorSelected [[0], [1,0,1,1]]$/Code$ + undefined / undefined - Number + Nothing + - getCameraViewDirection + setVehiclePosition - Returns the direction unit is looking in render time scope. While for AI the origin for the view direction vector can be taken from eyePos unit, for human player the origin should be taken from player camera position positionCameraToWorld [0,0,0] + Moves the object to a given position (same as createVehicle placement algorithm). Uses either the position that's defined by the position param, or one of the marker positions from the markers array. The object is placed inside a circle with position as its center and placement as its radius. The type of placement could also be controlled with special. + If position is in water and vehicle can float, it is placed on water surface, otherwise it is placed on the ground, even if ground is under water. If roof surfaces support walking, units will be placed on roofs if such position is given. - https://community.bistudio.com/wiki/getCameraViewDirection + https://community.bistudio.com/wiki/setVehiclePosition - getCameraViewDirection Object + Object setVehiclePosition Array - getCameraViewDirection unit + object setVehiclePosition [position, markers, placement, special] - $Code$// Draw AI eye direction (green), weapon direction (red) and camera direction (blue) in 3D: - bob = createGroup east createUnit ["O_Soldier_F", [0,0,0], [], 0, "NONE"]; - bob setVehiclePosition [ player modelToWorld [0,100,0], [], 0, "NONE"]; - onEachFrame - { - _beg = ASLToAGL eyePos bob; - _endE = (_beg vectorAdd ( eyeDirection bob vectorMultiply 100)); - drawLine3D [ _beg, _endE, [0,1,0,1]]; - _endW = (_beg vectorAdd (bob weaponDirection currentWeapon bob vectorMultiply 100)); - drawLine3D [_beg, _endW, [1,0,0,1]]; - _endV = (_beg vectorAdd ( getCameraViewDirection bob vectorMultiply 100)); - drawLine3D [_beg, _endV, [0,0,1,1]]; - };$/Code$ + $Code$player setVehiclePosition [[1000,2000], ["Pos1","Pos2","Pos3"], 0, "CAN_COLLIDE"]; + // Will place the player at either [1000,2000], or one of the three markers positions.$/Code$ + + $Code$heli setVehiclePosition [ player, [], 0, "FLY"];$/Code$ + + $Code$_cam = "camera" camCreate [0,0,0]; + _cam setDir random 360; + _cam setVehiclePosition [[5000,5000], [], 1000, "NONE"]; + _cam setPosWorld ( getPosWorld _cam vectorAdd [0,0,1.8]); + _cam cameraEffect ["Internal", "Back"];$/Code$ + + $Code$private _tablePos = player getRelPos [3, 0]; + private _table = "Land_CampingTable_F" createVehicle [0,0,0]; + private _laptop = "Land_Laptop_unfolded_F" createVehicle [0,0,0]; + _table setPos _tablePos; + _laptop setVehiclePosition [_tablePos vectorAdd [0.5, 0.2, 10], [], 0, "CAN_COLLIDE"]; + _laptop attachTo [_table];$/Code$ - global / undefined + global / global + (June 24, 2015) + If you need to set direction as well, set it before using setVehiclePosition. The command will use existing dir of the object for its calculations. + $Code$ player setDir random 360; + player setVehiclePosition [ player, [], 100, "none"];$/Code$ - Array + Boolean + - getCargoIndex + removeCuratorCameraArea - Returns index of the unit in cargo. 0,1,2... or -1 if not in cargo. + Removes curator camera area. - https://community.bistudio.com/wiki/getCargoIndex + https://community.bistudio.com/wiki/removeCuratorCameraArea - Object getCargoIndex Object + Object removeCuratorCameraArea Number - vehicle getCargoIndex unit + curatorObj removeCuratorCameraArea cameraAreaID - $Code$player moveInCargo heli; - hint str (heli getCargoIndex player );$/Code$ + $Code$myCurator removeCuratorCameraArea 3;$/Code$ - global / undefined + undefined / undefined - Number + Nothing + - getCenterOfMass + modelToWorldWorld - Returns center of mass of an object. + Converts position from object model space to world space (usable by setPosWorld for example). - https://community.bistudio.com/wiki/getCenterOfMass + https://community.bistudio.com/wiki/modelToWorldWorld - getCenterOfMass Object + Object modelToWorldWorld Array - getCenterOfMass object + obj modelToWorldWorld modelPos - $Code$_com = getCenterOfMass _myCar;$/Code$ + $Code$( getPos player ) modelToWorldWorld [0,1,0]$/Code$ - global / undefined + undefined / undefined + (May 28, 2017) + This command produces identical result to modelToWorld command used in conjunction with AGLToASL + $Code$obj modelToWorldWorld [1,2,3] isEqualTo AGLToASL (obj modelToWorld [1,2,3]); // true$/Code$ - Array + Array + - getClientStateNumber + ropeAttachTo - Returns client state in network game. Works on both, client and dedicated server. The following states are possible: - getClientStateNumber - getClientState - 0 - "NONE" - No client (or singleplayer) - 1 - "CREATED" - Client is created - 2 - "CONNECTED" - Client is connected to server, message formats are registered - 3 - "LOGGED IN" - Identity is created - 4 - "MISSION SELECTED" - Mission is selected - 5 - "MISSION ASKED" - Server was asked to send / not send mission - 6 - "ROLE ASSIGNED" - Role was assigned (and confirmed) - 7 - "MISSION RECEIVED" - Mission received - 8 - "GAME LOADED" - Island loaded, vehicles received - 9 - "BRIEFING SHOWN" - Briefing was displayed - 10 - "BRIEFING READ" - Ready to play mission - 11 - "GAME FINISHED" - Game was finished - 12 - "DEBRIEFING READ" - Debriefing read, ready to continue with next mission + Attach vehicle to rope with optional offset - https://community.bistudio.com/wiki/getClientStateNumber + https://community.bistudio.com/wiki/ropeAttachTo - getClientStateNumber + Array ropeAttachTo Object - getClientStateNumber + [veh, toPoint, ropeEndDownDir] ropeAttachTo rope - $Code$_state = getClientStateNumber ;$/Code$ - - $Code$_inGame = getClientStateNumber 8;$/Code$ + $Code$[veh1,[0,0,0],[0,0,-1]] ropeAttachTo ( ropes heli1 select 0);$/Code$ undefined / undefined @@ -27421,222 +28743,209 @@ - Number + Nothing + - getClientState + saveJoysticks - Returns client state in network game. Works on both, client and dedicated server. The following states are possible: - getClientStateNumber - getClientState - 0 - "NONE" - No client (or singleplayer) - 1 - "CREATED" - Client is created - 2 - "CONNECTED" - Client is connected to server, message formats are registered - 3 - "LOGGED IN" - Identity is created - 4 - "MISSION SELECTED" - Mission is selected - 5 - "MISSION ASKED" - Server was asked to send / not send mission - 6 - "ROLE ASSIGNED" - Role was assigned (and confirmed) - 7 - "MISSION RECEIVED" - Mission received - 8 - "GAME LOADED" - Island loaded, vehicles received - 9 - "BRIEFING SHOWN" - Briefing was displayed - 10 - "BRIEFING READ" - Ready to play mission - 11 - "GAME FINISHED" - Game was finished - 12 - "DEBRIEFING READ" - Debriefing read, ready to continue with next mission + Saves joysticks key mappings into the joysticks.cfg file. Engine add these joysticks to the Joystick Scheme mapping dialog in options controls section. - https://community.bistudio.com/wiki/getClientState + https://community.bistudio.com/wiki/saveJoysticks - getClientState + saveJoysticks - getClientState + saveJoysticks - $Code$_state = getClientState ;$/Code$ - - $Code$if ( getClientState == "BRIEFING READ") then { hint "Let the show begin!"};$/Code$ - + undefined / undefined - String + Nothing + - getCompatiblePylonMagazines + lbSort - Get array of compatible pylon magazines + Sorts listbox entries alphabetically ascending by their lbText - https://community.bistudio.com/wiki/getCompatiblePylonMagazines + https://community.bistudio.com/wiki/lbSort - Object getCompatiblePylonMagazines Number + lbSort Control - String getCompatiblePylonMagazines Number + lbSort Array + + lbSort Number - vehicle getCompatiblePylonMagazines pylon + lbSort control - vehicleClass getCompatiblePylonMagazines pylon + lbSort [control, sortOrder] + + lbSort idc + + lbSort [idc, sortOrder] - $Code$vehicle player getCompatiblePylonMagazines 0; // returns array of arrays containing all compatible magazines$/Code$ + $Code$lbSort _myControl;$/Code$ - $Code$"Plane_Fighter_01_Base_F" getCompatiblePylonMagazines 3; // returns array of compatible magazines for the 3rd pylon$/Code$ + $Code$lbSort [_myControl, "DESC"];$/Code$ - $Code$jet1 getCompatiblePylonMagazines "pylon1"; // returns array of compatible magazines for the 1st pylon$/Code$ + $Code$lbSort 101;$/Code$ - $Code$// Get all pylon names for "Plane_Fighter_01_Base_F" - private _allPylons = "true" configClasses ( - configFile - - "CfgVehicles" - - "Plane_Fighter_01_Base_F" - - "Components" - - "TransportPylonsComponent" - - "pylons" - ) apply { configName _x}; - hint str _allPylons; - /* return: - [ - "pylon1", - "pylon2", - "pylon3", - "pylon4", - "pylonBayRight1", - "pylonBayLeft1", - "pylonBayCenter1", - "pylonBayCenter2", - "pylonBayCenter3", - "pylonBayCenter4", - "pylonBayCenter5", - "pylonBayCenter6" - ]*/$/Code$ + $Code$lbSort [101, "DESC"];$/Code$ undefined / undefined + More information on the LB command family can be found here - Array - Array + Nothing - Nothing - Nothing + - getConnectedUAV + spawn - Returns UAV if unit has connection to some UAV. + Adds given code to the scheduler. Exactly when the code will be executed is unknown, it depends on how busy is the engine and how filled up is the scheduler. Therefore spawn does not wait for the supplied code to finish, instead, spawn returns a Script handle to the scheduler task. scriptDone command can be used to check the code completion. Additional arguments are passed to the code in local variable _this. Since Arma 3 v1.55 the script handle also exists inside the code in _thisScript variable. - https://community.bistudio.com/wiki/getConnectedUAV + https://community.bistudio.com/wiki/spawn - getConnectedUAV Object + Any_Value spawn Code - getConnectedUAV unit + arguments spawn code - + $Code$_handle = [] spawn { player globalChat "Hello world!"};$/Code$ + + $Code$// There is no guarantee that spawned scripts will be executed in the same order they spawned: + for "_i" from 0 to 100 do + { + _null = _i spawn + { + diag_log _this; + }; + }; + // // Result: 51,1,2...49,50,0,52,53...100$/Code$ + undefined / undefined + (5 March, 2009) + spawn cannot call other local functions on the same scope as itself. + It can, however, call other global functions: + $Code$_addOne = {TST=TST+1}; + TST_addOne = {TST=TST+1}; + _add = { + TST=TST+1; + player sideChat format ["added: %1",TST]; + [] call _addOne; + player sideChat format ["called local: %1",TST]; + [] call TST_addOne; + player sideChat format ["called global: %1",TST]; + }; + TST=0; + [] call _add; + [] spawn _add;$/Code$ + The call of _addOne from the spawned function does not do anything. + + (October 21, 2014) + spawn requires a script handle when used in the 2D editor. (A3) + In scripts and in the debug console, it is not required, but very useful for keeping track of running scripts. Having a script handle also makes it easy to terminate scripts at any time. + Since spawn creates a new scheduled environment, having an excess of open threads can make the scheduler queue extremely long, significantly increasing the execution time of each thread. (it takes an extremely large amount of threads, though) + + (August 25, 2015) + If you want to call a local function which has NOT been created inside a spawned function, then do this: + $Code$_fncOne = { systemChat"This is _fncOne" }; _fncTwo = { call (_this select 0) }; [_fncOne] spawn _fncTwo;$/Code$ - Object + Script_Handle + - getContainerMaxLoad + groupChat - Returns max load value of given container. Currently works only with uniform, vest and backpack classes. + Types text to the group radio channel. Must have assigned "ItemRadio" to see or transmit the messages. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) - https://community.bistudio.com/wiki/getContainerMaxLoad + https://community.bistudio.com/wiki/groupChat - getContainerMaxLoad String + Object groupChat String - getContainerMaxLoad containerClass + unitName groupChat chatText - $Code$_maxLoadUniform = getContainerMaxLoad uniform player ; - _maxLoadVest = getContainerMaxLoad vest player ; - _maxLoadBackpack = getContainerMaxLoad backpack player ;$/Code$ - - - undefined / undefined - - - + $Code$_soldierOne groupChat "Show this text";$/Code$ + + $Code$driver vehicle player sideChat "sideChat"; + driver vehicle player globalChat "globalChat"; + driver vehicle player groupChat "groupChat"; + vehicle player vehicleChat "vehicleChat"; + driver vehicle player commandChat "commandChat"; + driver vehicle player customChat [1, "customChat"]; + systemChat "systemChat";$/Code$ + + + global / local + + + - Number + Nothing + - getCursorObjectParams + boundingBoxReal - Returns object and named selections under cursor and distance to object's surface (to the point cursor points at). If object surface is further away then 50 meters, selections are always an empty array and distance is 1e10 (10^10). + Returns a bounding box of given object in model coordinates space. This command is similar to boundingBox but gives more precise measurements. - https://community.bistudio.com/wiki/getCursorObjectParams + https://community.bistudio.com/wiki/boundingBoxReal - getCursorObjectParams + boundingBoxReal Object - getCursorObjectParams + boundingBoxReal obj - $Code$hint str getCursorObjectParams ;$/Code$ + $Code$_bbr = boundingBoxReal vehicle player ; + _p1 = _bbr select 0; + _p2 = _bbr select 1; + _maxWidth = abs ((_p2 select 0) - (_p1 select 0)); + _maxLength = abs ((_p2 select 1) - (_p1 select 1)); + _maxHeight = abs ((_p2 select 2) - (_p1 select 2));$/Code$ undefined / undefined @@ -27644,243 +28953,218 @@ - Array + Array + - getCustomAimCoef + diag_frameNo - Returns aimPrecision from animation state with custom value that will directly affects weapon sway size and speed. + Returns number of frame currently displayed. - https://community.bistudio.com/wiki/getCustomAimCoef + https://community.bistudio.com/wiki/diag_frameNo - getCustomAimCoef Object + diag_frameNo - getCustomAimCoef unit + diag_frameNo - $Code$_coef = getCustomAimCoef player$/Code$ + $Code$_currFrameNo = diag_frameNo ;$/Code$ - global / undefined + undefined / undefined + (November 19, 2014) + Avoid using hard-coded frame-specific events, the total amount of drawn frames is persistent across all missions. It does not get reset until the game is closed. - Number + Number + - getDLCs + backpack - Returns array of appIDs of DLCs. Use filter param to get specific type of DLCs: - 0 - all - 1 - owned - 2 - not owned + Returns a class of a backpack. - https://community.bistudio.com/wiki/getDLCs + https://community.bistudio.com/wiki/backpack - getDLCs Number + backpack Object - getDLCs filter + backpack unit - $Code$_ownedDLCs = getDLCs 1;$/Code$ - - $Code$// Is the Karts DLC owned by this client? - hintSilent str (288520 in ( getDLCs 1));$/Code$ + $Code$_classname = backpack player ;$/Code$ undefined / undefined - (May 30, 2014) - Current list of IDs that correspond to the available DLCs: - 275700 - Arma 3 Zeus - 249860 - Arma 3 Soundtrack - 304400 - Arma 3 DLC Bundle - 249861 - Arma 3 Maps - 249862 - Arma 3 Tactical Guide - 288520 - Arma 3 Karts - 304380 - Arma 3 Helicopters - 332350 - Arma 3 Marksmen - - (April 7, 2015) - To add to the note above, app ID can be found in CfgMods. Here is an example path from zeus using the Splendid Config Viewer: - $Code$ configFile "CfgMods" "Curator" "appId"$/Code$ - This method can be used to find app IDs without having to find a list like the one above. - I am also pretty sure you are able to define your own app ID for your own mods using this method. - - (July 1, 2016) - The required DLC-IDs equal to the Steam App-IDs of each obtainable DLC. - To extend Sniperwolfs list: - 395180 - Arma 3 Apex - Array + String + - getDammage + addScore - Returns the object damage in the range from 0 to 1. Alias of damage. + Add a number to the score of a unit. This score is shown in multiplayer in the "I" ("P" in Arma 3) screen. Negative values will remove from the score. Server execution only. + See also: Arma_3:_Event_Handlers#HandleScore - https://community.bistudio.com/wiki/getDammage + https://community.bistudio.com/wiki/addScore - getDammage Object + Object addScore Number - getDammage object + unit addScore score - $Code$_damage = getDammage player ;$/Code$ + $Code$unit addScore 10;$/Code$ - undefined / undefined + global / global - (, May 9, 2011) - getDammage and damage works fine when used on damaged vehicles after a repair from a repairtruck when used in A2 CO patch 1.59. - - Vehicles repaired in game with the Repair trucks e.t.c never get completely repaired. After being repaired, rather than returning 0 when the damage command is called. They return a value equal to or less than 0.09. - Consequently any vehicle flagged as immobile (as indicated by the canMove command), remains so. At least as far as the AI are concerned. The AI will refuse to board an immobile vehicle or eject straight after boarding. Players remain unaffected and can drive the vehicle as normal. To circumvent this, use setDamage 0 on the vehicle in question, to allow the AI to board. - - In OFP 1.96, it is possible for a unit to be dead and still return a getDammage value well below 1. Use ! alive to check if a unit is dead. + This scripting command must be executed on the server to work properly in multiplayer - Number + Nothing + - getDescription + expectedDestination - Returns the string representation of unit as an four slots array. + Return expected destination of unit as an array with format: [ Position, planningMode, forceReplan]. - https://community.bistudio.com/wiki/getDescription + https://community.bistudio.com/wiki/expectedDestination - getDescription Object + expectedDestination Object - getDescription unit + expectedDestination person - undefined / undefined + local / undefined - Return value fixed in revision 0.51.103185. - - (September 21, 2014) - Pretty useless command tbh, return is something like this: - ["B_Soldier_F","Combat Fatigues (MTP)","Carrier Lite (Green)",""] or ["ERROR","ERROR","ERROR","ERROR"] + (16:24, 3 March 2007 (CET)) + For AI units I have found the following values: planningMode is "LEADER PLANNED" when the unit is ordered by the group leader to go somewhere or if the unit is the group leader and it follows a waypoint. Otherwise planningMode it is "DoNotPlan". Units moving in formation have "DoNotPlan" as long as they don't receive orders by the group leader. Units also have "DoNotPlan" when they don't move. Units executing special formation tasks like engaging or return to formation have "FORMATION PLANNED" as long they haven't fulfilled the task. - Array + Array + - getDirVisual + drawLine - Returns object's heading in the range from 0 to 360 in render time scope. + Draw a line on the map. - https://community.bistudio.com/wiki/getDirVisual + https://community.bistudio.com/wiki/drawLine - getDirVisual Object + Control drawLine Array - getDirVisual object + map drawLine [position1, position2, color] - $Code$_dir = getDirVisual player ;$/Code$ - + - global / undefined + undefined / undefined + (March 22, 2014) + Map example: $Code$( findDisplay 12 displayCtrl 51) ctrlAddEventHandler ["Draw"," + ( _this select 0) drawLine [ + getPos player, + [0,0,0], + [0,0,1,1] + ]; + "];$/Code$ + Be careful when using this command. Unlike map markers, the draw commands can decrease your framerate. - Number + Nothing + - getDir + addTorque - Returns the object heading in the range from 0 to 360. - Since Arma 3 v1.55.133361, an alternative syntax is added that allows to get heading from one object or position to another object or position, the equivalent of BIS_fnc_dirTo + Applies torque (rotation momentum) to the center of mass of the given object. Torque force is defined as vector [x, y, z] applied in world space. If you need to define torque in model space, convert the torque vector first by vectorModelToWorld or vectorModelToWorldVisual command. The torque applied as impulse. Diagram below explain which way the object would rotate. For more information see NVIDIA docs - https://community.bistudio.com/wiki/getDir + https://community.bistudio.com/wiki/addTorque - getDir Object - - Object/Position2D/Position3D getDir Object/Position2D/Position3D + Object addTorque Array - getDir object - - pos1 getDir pos2 + object addTorque torque - $Code$_azimuth = getDir player ;$/Code$ + $Code$// Apply torque [1000,0,0] to object not factoring object positioning: + _wheel addTorque [1000,0,0];$/Code$ - $Code$_azimuth = player getDir tank;$/Code$ + $Code$// Apply torque [1000,0,0] relative to object: + _wheel addTorque (_wheel vectorModelToWorld [1000,0,0]);$/Code$ - global / undefined + global / global - (October 23, 2013) - Be careful when using this command in conjunction with BIS_fnc_rotateVector2D ; the latter rotates vectors counterclockwise (mathematically correct), while getDir returns a clockwise angle. - To counter this, simply negate the output of getDir: - $Code$[[0,1,0], -( getDir _object ) ] call BIS_fnc_rotateVector2D ;$/Code$ - Number - Number + Nothing + - getEditorCamera + drawLink - Fetches a reference to the mission editor camera. + The editor will draw a line between the two specified editor objects. Line type can be LINE or ARROW. i Some Old Editor Command - https://community.bistudio.com/wiki/getEditorCamera + https://community.bistudio.com/wiki/drawLink - getEditorCamera Control + Control drawLink Array - getEditorCamera map + map drawLink [from,to,param type,line type,color] @@ -27890,790 +29174,932 @@ - Object + Nothing + - getEditorMode + setCameraInterest - Returns the current mode of the editor. - i - Some Old Editor Command + Set camera interest for given entity. Camera interest is by default 0. Any unit which is speaking has its camera interest raised to 50. Camera interest is used to focus camera to control depth of field in cutscenes. Combination of camera interest, unit position of the screen, unit movement, unit type, and some other properties is used to determine which unit to focus at. Higher camera interest increases the chance of the unit being focused. - https://community.bistudio.com/wiki/getEditorMode + https://community.bistudio.com/wiki/setCameraInterest - getEditorMode Control + Object setCameraInterest Number - getEditorMode map + entity setCameraInterest interest - + $Code$_soldier setCameraInterest 50;$/Code$ + undefined / undefined - String + Nothing + - getEditorObjectScope + selectionPosition - Returns the editor object scope of the specified editor object. - i - Some Old Editor Command + Search for selection in the object model (first in the memory level, then in geometry LODs). + Returns position in model space. In A1 it returns the initial position of the selection, in A2/3 position of the selection (e.g. when it is animated) in render time scope. If a selection does not exist [0,0,0] is returned. - https://community.bistudio.com/wiki/getEditorObjectScope + https://community.bistudio.com/wiki/selectionPosition - Control getEditorObjectScope String + Object selectionPosition String + + Object selectionPosition Array - map getEditorObjectScope object + object selectionPosition selectionName + + object selectionPosition [selectionName, LODName] - + $Code$_inModelPosition = player selectionPosition "head_hit";$/Code$ + + $Code$_inModelPosition = player selectionPosition "pelvis";$/Code$ + + $Code$_inModelPosition = player selectionPosition "head";$/Code$ + + $Code$_inModelPosition = player selectionPosition "camera";$/Code$ + - undefined / undefined + global / undefined + (January 5, 2007) + To know more selections simply create an eventHandler damage on an object. + + (July 29, 2015) + Since 1.49.131660, you can use an alternative syntax: + object selectionPosition [selectionName, lodName] + lodName: "Memory", "Geometry", "FireGeometry", "LandContact", "HitPoints" + If the given selectionName is not found in the given lod, [0,0,0] is returned. + + (June 25, 2017) + Do use the filter that comes with Alt Syntax to suit your needs. For example player has 3 selections called "head" and their selectionPositions are quite different from each other: + $Code$ player selectionPosition ["head", "Memory"]; // [0.173798,0.330415,1.37783] + player selectionPosition ["head", "FireGeometry"]; // [0.14375,0.206039,1.44689] + player selectionPosition ["head", "HitPoints"]; // [0.144257,0.306769,1.53471]$/Code$ - String + Array - Array + - getElevationOffset + joinAsSilent - Returns the map elevation offset from [map]/config.cpp. - Returns 0 if there's no elevationOffset defined in the config of the current world. + Joins the unit to the given group, if position id is available, this one is used. Avoid any radio communication related to joining. - https://community.bistudio.com/wiki/getElevationOffset + https://community.bistudio.com/wiki/joinAsSilent - getElevationOffset + Object joinAsSilent Array - getElevationOffset + unit joinAsSilent [group, id] - $Code$_offset = getElevationOffset ;$/Code$ + $Code$player joinAsSilent [_group, 4];$/Code$ + + $Code$// To get the position id: + getUnitPositionId = { + private ["_vvn", "_str"]; + _vvn = vehicleVarName _this; + _this setVehicleVarName ""; + _str = str _this; + _this setVehicleVarName _vvn; + parseNumber (_str select [(_str find ":") + 1]) + }; + player joinAsSilent [ createGroup west, 5]; + _id = player call getUnitPositionId; + hint str _id; //5$/Code$ - undefined / undefined + global / global + I haven't done a thorough test but this function doesn't seem to work for Civilians, use joinSilent instead. - Number + Nothing + - getFSMVariable + showMap - Return the value of variable in the variable space of given FSM. The FSM handle is the number returned by the execFSM command. + Enable Map (default true ) - https://community.bistudio.com/wiki/getFSMVariable + https://community.bistudio.com/wiki/showMap - Number getFSMVariable String - - Number getFSMVariable Array + showMap Boolean - FSMhandle getFSMVariable name - - FSMhandle getFSMVariable [name, defaultValue] + showMap show - $Code$_handle getFSMVariable "_foo";$/Code$ - - $Code$_handle getFSMVariable ["_foo", 123];$/Code$ + $Code$showMap false$/Code$ undefined / undefined + In ArmA 2 - This command no longer works. The map is now an inventory item. It is kept under the weapon class name "itemmap". + Example: $Code$unitname removeweapon "itemmap"$/Code$ To add again use $Code$unitname addweapon "itemmap"$/Code$. - Anything - Anything + Nothing + - getFatigue + allUnits - Returns fatigue of given unit. + Return a list of all units (all persons except agents) created on the following sides east, west, resistance / independent and civilian only. Does not contain units of sideLogic. Dead units and units awaiting for respawn are also excluded. - https://community.bistudio.com/wiki/getFatigue + https://community.bistudio.com/wiki/allUnits - getFatigue Object + allUnits - getFatigue unit + allUnits - $Code$value = getFatigue player ;$/Code$ - - $Code$if ( getFatigue player 0.5) then { player sideChat "I'm good to go!" };$/Code$ + $Code${_x setDamage 0.5; _x groupChat "Braaains"} forEach allUnits ;$/Code$ - global / undefined + undefined / undefined - getFatigue can be applied to remote unit however it will not read the changes made to unit's fatigue with setFatigue command. Only natural changes resulting from unit moving will be counted. When applied to local unit, it will read resulting value of natural fatigue combined with artificial changes added locally by setFatigue. In short, the server wouldn't know the correct value of remote unit's fatigue if you used setFatigue on the unit prior. + (July 15, 2011) + It returns infantry outside and inside vehicles. - Number + Array + - getForcedFlagTexture + parseNumber - A getter for forceFlagTexture. Forced texture is different from your normal flag texture, which can be retrieved with flagTexture + An SQF equivalent of C++ atof function. Parses the string, interpreting its content as a floating point number. + The command first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes as many characters as possible that are valid following a syntax resembling that of floating point literals, and interprets them as a numerical value. The rest of the string after the last valid character is ignored and has no effect on the behavior of this command. + If the first sequence of non-whitespace characters in string does not form a valid floating-point number, or if no such sequence exists because either string is empty or contains only whitespace characters, no conversion is performed and the command returns 0. - https://community.bistudio.com/wiki/getForcedFlagTexture + https://community.bistudio.com/wiki/parseNumber - getForcedFlagTexture Object + parseNumber String + + parseNumber Boolean - getForcedFlagTexture object + parseNumber string + + parseNumber boolean - $Code$getForcedFlagTexture player ;$/Code$ + $Code$_number = parseNumber "0.125"; //0.125$/Code$ + + $Code$_number = parseNumber "2 abc"; //2$/Code$ + + $Code$_number = parseNumber true ; //1$/Code$ undefined / undefined + (Aug 28, 2014) + (A3 1.26)It only detects the first occurrence of a number in the string, return 0 by default. + $Code$ parseNumber "2s4f"; // 2 + parseNumber "s2f4"; // 0$/Code$ + parse config or code, currently BIS_fnc_parseNumber, occurrence is only limited with number, return -1 by default. + $Code${s3s4f} call BIS_fnc_parseNumber ; // -1$/Code$ - String + Number - Number + - getFriend + createVehicleLocal - Returns if sides are friendly or hostile. For a value smaller than 0.6 it results in being enemy, otherwise it's friendly. See also Side relations. + Creates an object of the given type. Created object is not transferred through network in MP games. netId of such vehicle in multiplayer will be "0:0". To disable local vehicle creation, use CfgDisabledCommands to blacklist this command - https://community.bistudio.com/wiki/getFriend + https://community.bistudio.com/wiki/createVehicleLocal - Side getFriend Side + String createVehicleLocal Position - side1 getFriend side2 + type createVehicleLocal position - $Code$value = west getFriend east ;$/Code$ - - $Code$_isEnemy = side _killer getFriend side _victim 0.6;$/Code$ + $Code$_lightsource = "#lightpoint" createVehicleLocal _pos;$/Code$ - global / undefined + undefined / local + (07:18, 5 June 2008 (CEST)) + If the object that is created is of the type ammo, then it will created on all clients ( tested only on VBS2 ). + + (18:04, 5 September 2013 (CEST)) + Indeed the type of Ammo is transfered to ALL clients, but apparently also the muzzle effects (firing sound, light, etc.); this includes muzzles from Horns (Truck or Car Horn, Bicycle bells, etc.) as well as any other weapon. Tested on Arma 1 - Arma 2 OA (latest patch). - Number + Object + - getFuelCargo + captiveNum - Returns the fuel amount (between 0 and 1) in the cargo space of a refuelling vehicle. + Checks whether the unit is a captive. If the unit is a vehicle, its commander is checked instead. + If a unit's captivity level was set as a Boolean, then the returned number is either 0 (for false ) or 1 (for true ). - https://community.bistudio.com/wiki/getFuelCargo + https://community.bistudio.com/wiki/captiveNum - getFuelCargo Object + captiveNum Object - getFuelCargo vehicle + captiveNum unit - $Code$value = getFuelCargo myVehicleName;$/Code$ + $Code$_captivity = captiveNum _unit;$/Code$ + + $Code$_unit setCaptive 1024; + hint str captive _unit; //true + hint str captiveNum _unit; //1024$/Code$ global / undefined - (December 22, 2014) - If the vehicle is not alive, it always returns Nothing, which you should check for using isNil. - If the vehicle is unable to carry that type of cargo, it returns -1.#IND, which you should check for using finite. - Number + Number + - getGroupIconParams + onBriefingNotes - Returns group icons params used for command bar drawing such as color, text, scale, visibility, waypoint visibility, waypoint color. + Select a sound declared in the Description.ext of the mission to be played the first time the Notes tab is selected in the briefing. - https://community.bistudio.com/wiki/getGroupIconParams + https://community.bistudio.com/wiki/onBriefingNotes - getGroupIconParams Group + onBriefingNotes String - getGroupIconParams group + onBriefingNotes soundName - $Code$_iconParams = getGroupIconParams group player ;$/Code$ + $Code$onBriefingNotes "NotesVoiceOver";$/Code$ undefined / undefined + (8 Feb, 2007) + In OFP it works only with the sound files defined in the mission's description.ext - Array + Nothing + - getGroupIcons + fire - Returns all group icons. [id,icon,[offsetx,offsety],[..],..] + Forces a unit to fire the given weapon. + NOTE: Just like with forceWeaponFire it is possible to pass remote unit as argument, but this could be unreliable. Considering this command might need to be used in combination with selectWeapon, which takes only local arguments, it would make sense to execute fire command where unit is also local. See also: BIS_fnc_fire - https://community.bistudio.com/wiki/getGroupIcons + https://community.bistudio.com/wiki/fire - getGroupIcons Group + Object fire String + + Object fire Array - getGroupIcons group + unit fire muzzle + + unit fire [muzzle, mode, magazine] - + $Code$_soldier fire "M16";$/Code$ + + $Code$_soldier fire "SmokeShellMuzzle";$/Code$ + + $Code$_soldier fire ["SmokeShellMuzzle","SmokeShellMuzzle","SmokeShell"];$/Code$ + + $Code$player playActionNow "PutDown"; + player selectWeapon "DemoChargeMuzzle"; + player fire ["DemoChargeMuzzle", "DemoChargeMuzzle", "DemoCharge_Remote_Mag"]; + player setWeaponReloadingTime [ player, "DemoChargeMuzzle", 0];$/Code$ + - global / undefined + local / global + (August 17, 2006) + Sometimes AI won't shoot when you use this command. It can be fixed by placing selectWeapon command before it. + + (February 2, 2007) + In OFP v1.96, when a man class unit is given this command, he will aim up in the air before firing his weapon. This makes it rather useless if you want to make him shoot a target. It does work with vehicles, when the vehicle is first given a doWatch or doTarget command. + + (January 20, 2007) + In ArmA v1.02, this command is not working with weapons in the secondary turrets (like "DSHKM" in t72) + + (Jan 15, 2008) + To place a satchel (pipebomb) the syntax is: + OFP : unitname Fire ["put", "pipebomb"] + ArmA : unitname Fire ["pipebombmuzzle", "pipebombmuzzle", "pipebomb"]; + The triggering is done via a " TOUCHOFF " action. + + (March 18, 2010) + In Arma2 AI will automatically shoot straight up. Command seems to be broken. + + (November 24, 2010) + Command is broken - confirmed. Use action "USEWEAPON" instead. + Place a game logic in the editor. Name it MyGameLogic. + Use this code to make unit1 fire his primaryweapon: + MyGameLogic action ["useWeapon",primaryWeapon unit1,unit1,0]; + + (Feburary 25, 2011) + Command works just fine in A2/OA. Make sure to execute it on local AI. + + (April 06, 2012) + If it did work at one time, it does no longer. The AI (or player) is forced to look upwards or reacts to a massive recoil force before getting his shot off. + + (Feburary 16, 2013) + Command did not work with ACR 1.62. Used fireAtTarget instead. + + (June 4, 2014) + In Arma 3 in order for AI to place Claymore, for example, it is necessary to execute 3 statements - an animation, weapon select and the actual fire command. Animation is most likely for forcing unit to leave rest state, weapon select and fire kinda both go together anyway: $Code$_unit playActionNow "PutDown"; + _unit selectWeapon "DirectionalMineRemoteMuzzle"; + _unit fire [ + "DirectionalMineRemoteMuzzle", + "DirectionalMineRemoteMuzzle", + "ClaymoreDirectionalMine_Remote_Mag" + ];$/Code$ + + (November 25th, 2017) + In ArmA 3, as of version 1.76, examples 2 and 3 in the section above for smoke grenades are no longer working. As a workaround (throwing green smoke grenades for example), you can use: $Code$[_soldier, "SmokeShellGreenMuzzle"] call BIS_fnc_fire;$/Code$ - Array + Nothing - Nothing + - getGroupIcon + moonIntensity - Get group icon properties. + Returns the intensity of the moon's brightness in range 0...1. - https://community.bistudio.com/wiki/getGroupIcon + https://community.bistudio.com/wiki/moonIntensity - Group getGroupIcon Number + moonIntensity - group getGroupIcon ID + moonIntensity - $Code$_grpIconId = _group getVariable "BIS_MARTA_ICON_TYPE"; - _grpIcon = _group getGroupIcon _grpIconId;$/Code$ + $Code$_intensity = moonIntensity ;$/Code$ - global / undefined + undefined / undefined - Array + Number + - getHideFrom + ctrlModel - Returns the Position where object believes the enemy to be. If there is no direct line of sight between the object and the enemy, this position is extrapolated based on the last known position and speed of the enemy. A returned position of [0,0,0] implies that object does not knowAbout enemy. If enemy is null it is some position in front of the object or enemy position. + Returns model used in 3D Dialog Control. - https://community.bistudio.com/wiki/getHideFrom + https://community.bistudio.com/wiki/ctrlModel - Object getHideFrom Object + ctrlModel Control - object getHideFrom enemy + ctrlModel control - + $Code$_model = ctrlModel _control3D;$/Code$ + undefined / undefined - (April 25, 2015) - This command is definatlely not broken, at least not in A3 1.42. It functions exactly as the description says it does. The reason why the Z value is elevated is because it represents the units torso. When the unit is prone and spotted, the Z value is much less. Here you can see a perfectly working example of this command Talk:getHideFrom#Operation Script Sample - Array + String + - getHitIndex + doSuppressiveFire - Return current level of damage for a specific Hit Point (specified by its hit part index). All hit points can be obtained with getAllHitPointsDamage command. - 0: no damage - 1: full damage + Order the given unit to suppress a given position or target (without radio messages). - https://community.bistudio.com/wiki/getHitIndex + https://community.bistudio.com/wiki/doSuppressiveFire - Object getHitIndex Number + Object/Array doSuppressiveFire Object/Array - vehicle getHitIndex hitPartIndex + unitName doSuppressiveFire target - $Code$vehicle player getHitIndex 3;$/Code$ + $Code$_soldier doSuppressiveFire [1869.508,5760.962,0.000]$/Code$ + + $Code$_soldier doSuppressiveFire cursorTarget$/Code$ - global / undefined + local / local + (October 8, 2016) + Command expects position as second argument in format ASL in A3 1.64.138497. - Number/Nothing + Nothing + - getHit + getAssignedCuratorUnit - Returns selection damage. Same as getHitPointDamage only argument is selection part instead of hit point. Note: Some part names are in Czech; see translation table. + Returns unit assigned to curator logic. - https://community.bistudio.com/wiki/getHit + https://community.bistudio.com/wiki/getAssignedCuratorUnit - Object getHit String + getAssignedCuratorUnit Object - vehicle getHit selection + getAssignedCuratorUnit curatorObj - $Code$player getHit "head";$/Code$ - - $Code$_car getHit "motor";$/Code$ + $Code$_curatorUnit = getAssignedCuratorUnit ( allCurators select 0); + _curatorUnit joinAs [ createGroup civilian, 0];$/Code$ - global / undefined + undefined / undefined + (August 17, 2014) + This command will return objNull if used immediately after the curator unit is assigned to the logic in question (this includes at mission time 0). To avoid problems use the following beforehand: $Code$ waitUntil {! isNull ( getAssignedCuratorUnit logic)};$/Code$ - Number/Nothing + Object + - getHitPointDamage + onGroupIconOverEnter - Return current level of damage for a specific Hit Point (specified by its config class). If you need to get damage of a selection instead of hit point, use getHit. - 0: no damage - 1: full damage + Defines an action performed when player moves pointer over group marker (3D or in a map). The code will execute continuously while pointer is over icon. + i + Since Arma 3 v1.57 a stackable version of this EH is available: GroupIconOverEnter - https://community.bistudio.com/wiki/getHitPointDamage + https://community.bistudio.com/wiki/onGroupIconOverEnter - Object getHitPointDamage String + onGroupIconOverEnter String/Code - vehicle getHitPointDamage hitPointName + onGroupIconOverEnter command - $Code$(vehicle player) getHitPointDamage "hitEngine";$/Code$ + $Code$onGroupIconOverEnter + { + // Passed values for _this are: + _is3D = _this select 0; + _group = _this select 1; + _wpID = _this select 2; + _posx = _this select 3; + _posy = _this select 4; + _shift = _this select 5; + _ctrl = _this select 6; + _alt = _this select 7; + _message = format ["____ Info ____"]; + {_message = _message + format ["\n %1",_x]} forEach _this; + hint _message; + }$/Code$ - global / undefined + undefined / undefined - Common ObjectRTD TKOH Hit Points: - HitEngine (engine #1) - HitEngine2 (engine #2) - HitEngine3 (engine #3) - HitHRotor (main rotor) - HitVRotor (tail rotor) - HitBatteries (electrical systems) - HitLight (landing light) - HitHydraulics (entire hydraulics system) - HitTransmission (engine transmission) - HitGear (landing gear) - HitFuel (all fuel tanks) - HitHStabilizerL1 (first left horizontal stabilizer) - HitHStabilizerR1 (first right horizontal stabilizer) - HitVStabilizer1 (first vertical stabilizer) - HitTail (tail boom) - HitPitotTube (all pitot tubes) - HitStaticPort (all static ports) - HitStarter1 (starter for engine #1) - HitStarter2 (starter for engine #2) - HitStarter3 (starter for engine #3) - HitAvionics - HitHull - HitMissiles - HitRGlass - HitLGlass - HitGlass1 - HitGlass2 - HitGlass3 - HitGlass4 - HitGlass5 - HitGlass6 - - (March 4, 2017) - Note that vehicles with multiple turrets have multiple HitTurret and HitGun classes that can't be distinguished based on the Hitpoint class name. They can only be distinguished by their selection names. The selection names do not necessarily correspond to a common nomenclature, especially for mod vehicles. There can also be multiple empty Hitpoint Class names on a vehicle or infantry unit. They can be hitpoints for vehicle headlights or be the result of a bad config/model, as hitpoints that have an undefined named selection in their config class or are missing their named selection in the model will result in an empty HitPoint class name. - Number/Nothing + Nothing + - getItemCargo + configFile - Returns all items names and count from ammo box (or any general weapon holder container). + Return root of config entries hierarchy. + See AllInOne Config for a full config extract as example. - https://community.bistudio.com/wiki/getItemCargo + https://community.bistudio.com/wiki/configFile - getItemCargo Object + configFile - getItemCargo box + configFile - $Code$hint str getItemCargo cursorTarget ;$/Code$ + $Code$_isMyClassActive = isClass ( configFile / "CfgPatches" / "MyClass");$/Code$ - global / undefined + undefined / undefined + (Jul 19, 2014) + (ArmA3 1.24) It is recommended to use configClasses instead of BIS_fnc_getCfgSubClasses and BIS_fnc_uniqueClasses on subclasses collection or conditional selection. + $Code$ + _faces = " true " configClasses ( configFile "Cfgfaces"); + //same as: _faces = (configfile "CfgFaces") call BIS_fnc_getCfgSubClasses ; + $/Code$ + $Code$ + //Extract all animals: + animals = "(( configName _x) isKindOf 'animal')" configClasses ( configFile "CfgVehicles"); + /*same as: + aniamls = []; + [( configFile "CfgVehicles"),{ + if (( configName _this) isKindOf “animal”) then { + animals set [ count animals, _this] + } + } + ] call BIS_fnc_uniqueClasses ;*/ + $/Code$ + Return nested subclasses, currently still BIS_fnc_returnChildren + $Code$ + //Return all nested config classes. + [( configFile "CfgFaces"),1, true, true ] call BIS_fnc_returnChildren ; + $/Code$ - Array + Config + - getMagazineCargo + setWaypointForceBehaviour - Returns all magazines types and count from the cargo space + Forces the behavior of waypoint, disables AUTOCOMBAT. - https://community.bistudio.com/wiki/getMagazineCargo + https://community.bistudio.com/wiki/setWaypointForceBehaviour - getMagazineCargo Object + Waypoint setWaypointForceBehaviour Boolean - getMagazineCargo object + waypoint setWaypointForceBehaviour state - $Code$_content = getMagazineCargo carName;$/Code$ - - $Code$_content = getMagazineCargo ammoBoxName;$/Code$ - - $Code$hint str getMagazineCargo unitBackpack cursorTarget ;$/Code$ + $Code$[grp, 2] setWaypointForceBehaviour true ;$/Code$ - global / undefined + undefined / undefined - Array + Nothing + - getMarkerColor + shownCompass - Returns marker color for given marker. See setMarkerColor. Note: This function is identical to markerColor. + Checks if client has Compass enabled in description.ext ( showCompass param) or force enabled with showCompass command. - https://community.bistudio.com/wiki/getMarkerColor + https://community.bistudio.com/wiki/shownCompass - getMarkerColor String + shownCompass - getMarkerColor markerName + shownCompass - $Code$"MarkerOne" setMarkerColor "ColorBlack"; - _color = getMarkerColor "MarkerOne"; //returns "ColorBlack"$/Code$ + $Code$if ( shownCompass ) then { hint "You have Compass enabled"};$/Code$ - global / undefined + undefined / undefined - String + Boolean + - getMarkerPos + configSourceModList - Returns the position of a given marker in format [x,y,0]. Array element 3 (height above ground) is always zero. If a non-existing marker is referenced the values returned are [0,0,0]. + Returns an array of mods (CfgMods) in which the given config class is defined. - https://community.bistudio.com/wiki/getMarkerPos + https://community.bistudio.com/wiki/configSourceModList - getMarkerPos String + configSourceModList Config - getMarkerPos markerName + configSourceModList config - $Code$"MarkerOne" setMarkerPos [200,100]; - _pos = getMarkerPos "MarkerOne" - // _pos is [200,100,0]$/Code$ + $Code$_mods = configSourceModList ( configFile "CfgVehicles" "Man"); + hint str _mods; // ["A3","curator","heli"]$/Code$ undefined / undefined - (September 1, 2016) - To acomplish getting the altitude of a marker you can do workaround using setMarkerDir as it accepts any number (above 360 or below -360): - $Code$"Marker" setMarkerPos [200,200]; - "Marker" setMarkerDir 1640; - $/Code$ - After, setting player position as an example: - $Code$player setPosASL [(getMarkerPos "Marker") select 0, (getMarkerPos "Marker") select 1,(markerDir "Marker")]$/Code$ - Array + Array + - getMarkerSize + ctrlSetAutoScrollSpeed - Returns the size of the given marker. A getter for setMarkerSize and an alias of markerSize. + Sets number of second required to scroll to next line. If speed 0, auto-scroll is disabled. Setter for ctrlAutoScrollSpeed. + Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. - https://community.bistudio.com/wiki/getMarkerSize + https://community.bistudio.com/wiki/ctrlSetAutoScrollSpeed - getMarkerSize String + Control ctrlSetAutoScrollSpeed Number - getMarkerSize markerName + control ctrlSetAutoScrollSpeed speed - $Code$"MarkerOne" setMarkerSize [100,200]; - _size = getMarkerSize "MarkerOne"; //returns [100,200]$/Code$ + $Code$_ctrlGroup ctrlSetAutoScrollSpeed 0.1;$/Code$ - global / undefined + undefined / undefined - Array + Nothing + - getMarkerType + allMapMarkers - Returns the type of a given marker. See cfgMarkers for a list of standard markers. + Return all markers in map including user placed markers (_USER_DEFINED #). + Since Arma 3 v1.57.134377 User defined markers have the following name format: _USER_DEFINED # PlayerID / MarkerID / ChannelID where: + PlayerID - unique network id of the player (same as _id in onPlayerConnected ) + MarkerID - a marker counter id + ChannelID - id of the chat channel on which marker was placed (see currentChannel ) - https://community.bistudio.com/wiki/getMarkerType + https://community.bistudio.com/wiki/allMapMarkers - getMarkerType String + allMapMarkers - getMarkerType markerName + allMapMarkers - $Code$"MarkerOne" setMarkerType "Destroy" - _type = getMarkerType "MarkerOne" - returns "Destroy"$/Code$ + $Code$_markers = allMapMarkers ; + // returns: ["marker1","_USER_DEFINED #2/0"]$/Code$ + + $Code${ + private "_a"; + _a = toArray _x; + _a resize 15; + if ( toString _a == "_USER_DEFINED #") then { + deleteMarker _x; + } + } forEach allMapMarkers ;$/Code$ + + $Code$if (_someString in allMapMarkers ) then { + hint (_someString + " is a valid marker name"); + };$/Code$ - global / undefined + undefined / undefined + (March 17, 2014) + A3 1.12 : Markers placed in editor will be in the array as a string of their name. Markers placed by the player will begin with "_USER_DEFINED #." + + (March 17, 2014) + To expand on the comment above. In Multiplayer, user created marker will appear in allMapMarkers as _USER_DEFINED #ID/Number, where ID is unique id related to _id param from onPlayerConnected and Number is sequential integer incremented by 1 with each marker placement by the IDed user. - String + Array + - getMass + currentZeroing - Returns mass of a PhysX object. + Returns zeroing of unit's weapon. - https://community.bistudio.com/wiki/getMass + https://community.bistudio.com/wiki/currentZeroing - getMass Object + currentZeroing Object - getMass object + currentZeroing gunner - $Code$_mass = getMass _myCar$/Code$ + $Code$_zeroing = currentZeroing player ;$/Code$ - global / undefined + undefined / undefined - (April 15, 2015) - This function will return 0 for infantry AI units. That means a manned Blufor Hunter has the same mass than an empty one (8306.63). - Crates return their initial mass, but if you empty them or load items, magazines and weapons, the mass remains the same. In fact, none of these (non-physx) objects has a mass. - Number + Number + - getMissionConfig + clearGroupIcons - Returns Config entry for the given scenario attribute from the 1st tier. The attribute can be config class or config property. If it is defined in multiple places, the command checks them in the following order: - External Description.ext file - Eden Editor scenario attribute - So if attribute exists in both places, attribute from description.ext is used. Previously, scenario attributes were extracted from Description.ext using missionConfigFile. That still works, but it ignores attributes set directly in the editor and it should not be used anymore. + Removes all icon from group. - https://community.bistudio.com/wiki/getMissionConfig + https://community.bistudio.com/wiki/clearGroupIcons - getMissionConfig String + clearGroupIcons Group - getMissionConfig attribute + clearGroupIcons group - $Code$_header = getMissionConfig "Header" - // Returns scenario header config. Replaces the previous approach which would scan only the external Description.ext file, but ignore the value set in the Eden Editor:_header = missionConfigFile "Header"; // Old approach$/Code$ - + undefined / undefined - Config + Nothing + - getMissionConfigValue + lbSetColorRight - Returns value of the given scenario attribute from the 1st tier. Since only config properties have values, the attribute should be config property. If it is not found or config class is given, the return is nil. If the attribute defined in multiple places, the command checks them in the following order: - External Description.ext file - Eden Editor scenario attribute - So if attribute exists in both places, attribute from description.ext is used. Previously, scenario attributes were extracted from Description.ext using missionConfigFile. That still works, but it ignores attributes set directly in the editor and it should not be used anymore. + Sets the color of the item (right) with the given index of the listbox or combobox with id idc of the topmost user dialog to color. + Colour is in format Color. - https://community.bistudio.com/wiki/getMissionConfigValue + https://community.bistudio.com/wiki/lbSetColorRight - getMissionConfigValue String + lbSetColorRight Array - getMissionConfigValue Array + Control lbSetColorRight Array - getMissionConfigValue attribute + lbSetColorRight [idc, index, color] - getMissionConfigValue [attribute, defaultValue] + control lbSetColorRight [index, color] - $Code$_respawnDelay = getMissionConfigValue ["respawnDelay",0] - // Returns respawn delay value. Replaces the previous approach which would scan only the external Description.ext file, but ignore the value set in the Eden Editor:_respawnDelay = getNumber ( missionConfigFile "respawnDelay"); // Old approach$/Code$ + $Code$lbSetColorRight [101, 0, [0, 1, 0, 0.5]];$/Code$ + + $Code$_control lbSetColorRight [0, [0, 1, 0, 0.5]];$/Code$ - undefined / undefined + local / local + More information on the LB command family can be found here - Number/String/Array - Number/String/Array + Nothing - Nothing + - getMissionDLCs + setRandomLip - Returns list of DLCs that are used in the mission. List is created only from units listed in mission.sqm and doesn't detect units created by scripts! + Enables/Disables random lip. When enabled, the unit continuously moves its lips as if it's talking. - https://community.bistudio.com/wiki/getMissionDLCs + https://community.bistudio.com/wiki/setRandomLip - getMissionDLCs + Object setRandomLip Boolean - getMissionDLCs + unit setRandomLip bool - $Code$_list = getMissionDLCs$/Code$ + $Code$player setRandomLip true ;$/Code$ undefined / undefined @@ -28681,377 +30107,443 @@ - Array + Nothing + - getMissionLayerEntities + ctCurSel - Returns all entities within specific Eden Editor layer. To be used when the scenario is running, not in the editor workspace. - Useful for disabling / enabling whole parts of the scenario which you add to specific layer while editing. + Returns index of the selected row. Will take only rows, but not headers into account. - https://community.bistudio.com/wiki/getMissionLayerEntities + https://community.bistudio.com/wiki/ctCurSel - getMissionLayerEntities String + ctCurSel Control - getMissionLayerEntities layerName + ctCurSel Control - $Code$_base = getMissionLayerEntities "Base";$/Code$ - - $Code$waitUntil {( player distance _someObject) 800}; - { - deleteVehicle _x ; - } forEach (( getMissionLayerEntities "Simple Objects") select 0);//Deletes all objects within that layer after the player is over 800m away from _someObject$/Code$ + $Code$_curSel = ctCurSel _control;$/Code$ - undefined / undefined + local / local - (October 26, 2016) - After an object was deleted from a layer, getMissionLayerEntities will return NULL-object for the deleted object. - Version: 1.65 - Build: 139010 - Array + Number + - getModelInfo + gunner - Returns object's model info in format [modelName, modelPath, hasSkeleton]. Model path is suitable for use with createSimpleObject command. + Returns the gunner of a vehicle. - https://community.bistudio.com/wiki/getModelInfo + https://community.bistudio.com/wiki/gunner - getModelInfo Object + gunner Object - getModelInfo object + gunner vehicle - $Code$_modelInfo = getModelInfo player ;$/Code$ - - $Code$_modelInfo = getModelInfo cursorObject ;$/Code$ + $Code$(gunner _tank1) action ["getout",_tank1]$/Code$ - undefined / undefined + global / undefined + (2 January, 2007) + The gunner command will only return a single gunner. If the vehicle has occupied, multiple turrets. See this discussion on the official forums, for an alternative: + Need an array with a vehicle's cargo units - Array + Object + - getMousePosition + reloadEnabled - Returns mouse position in UI coordinates. + Check whether magazine is reloaded whenever emptied. - https://community.bistudio.com/wiki/getMousePosition + https://community.bistudio.com/wiki/reloadEnabled - getMousePosition + reloadEnabled Object - getMousePosition + reloadEnabled unitName - $Code$_pos = getMousePosition ;$/Code$ - + undefined / undefined - Array + Boolean + - getNumber + lnbAddRow - Extract number from config entry. + Adds a row of strings. - https://community.bistudio.com/wiki/getNumber + https://community.bistudio.com/wiki/lnbAddRow - getNumber Config + lnbAddRow Array + + Control lnbAddRow Array - getNumber config + lnbAddRow [IDC,[ String, String ]] + + _ctrl lnbAddRow [ String, String ] - $Code$_value = getNumber ( configFile "CfgVehicles" "Thing" "maxSpeed");$/Code$ + $Code$lnbAddRow [1,["COL1","COL2"]];$/Code$ + + $Code$_ctrl lnbAddRow ["COL1","COL2"];$/Code$ - undefined / undefined + local / local - (04:45, 3 March 2007 (CET)) - Use getNumber to get boolean values from a config file. 1 equals true, 0 equals false and if no value is found (when a valid variable is undefined) 0.67 is returned. - - (13 September 2011) - With an not existing entry, getNumber returns 0. - - (Mar 28, 2014) - (ArmA3 1.14), It's recommended to use BIS_fnc_getCfgData or BIS_fnc_returnConfigEntry to get variable cfg data rather than conditioning via isNumber, isText, isArray, getNumber, getText and getArray combination. - Traditional workaround: - $Code$ - _cfg = configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type" - switch ( true ) do - { - case ( isNumber _cfg): { getNumber _cfg}; - case ( isText _cfg): { getText _cfg}; - case ( isArray _cfg): { getArray _cfg;}; - default {nil}; - }; - $/Code$ - Recommended workaround: - $Code$ - ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_getCfgData ; - $/Code$ - To return default value once entry was not found, we can use BIS_fnc_returnConfigEntry instead of BIS_fnc_getCfgData. - $Code$ - [( configFile "CannonFire" "LightExp"),"lifeTime",0] call BIS_fnc_returnConfigEntry ;//0.5 - $/Code$ - To compose collected Number into Array, use BIS_fnc_getCfgDataArray instead. + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: $Code$ - ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_getCfgDataArray ; + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 $/Code$ - To retype collected Number into Boolean, use BIS_fnc_getCfgDataBool. Anything bigger than 0 is true, otherwise false. + For a direct visible control over CT_LISTNBOX: $Code$ - ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_getCfgDataBool ; + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Number + Number - Number + - getObjectArgument + unitReady - Return name of object argument in mission editor. - i - Some Old Editor Command + Check if the unit is ready. Unit is busy when it is given some command like move, until the command is finished. - https://community.bistudio.com/wiki/getObjectArgument + https://community.bistudio.com/wiki/unitReady - Control getObjectArgument Array + unitReady Object - map getObjectArgument [object, argument] + unitReady unitName - $Code$// returns string "[1009.0351, 1319.4928]" - ( findDisplay 128 displayCtrl 51) getObjectArgument ["_unit_1", "POSITION"] - // returns array [1009.0351, 1319.4928] - ( findDisplay 128 displayCtrl 51) evalObjectArgument ["_unit_1", "POSITION"]$/Code$ + $Code$_it = unitReady _soldierOne;$/Code$ undefined / undefined + (August 26, 2010) + Keep in mind that a) dead units are unitReady and b) that it takes a while until it get's known to group members that a unit is not alive anymore, which leads to c) the current leader of a group might be actually dead (until another group member takes command). + Why this is important? I'll give you an example: if you're using unitReady as a condition inside one of your fsm to advance whatever the fsm/group is doing, you really might wanna check that this unit is actually still alive. Otherwise you might end up with really fast and nasty loops in your fsm, eventually accompanied by a stream of radio commands that will last until finally a living leader is in command again.. and that could take a while... nasty, I tell you :) + + Regarding vehicles, there is only one single unit (from the vehicle crew) whose unitReady-status is affected by giving that vehicle (or that unit) commands. While it's the driver unit for a truck, it is the gunner unit for a mg-jeep or the commander for a tank. Generally it's always the unit "in control" of the vehicle. (because it's only that unit, that is seen as "full unit" to the "outside world". Only he can be adressed with commands.) + In consequence you can't just send vehicles around and check if they've arrived with something like: + waitUntil{(unitReady (driver _vehicle))}; // don't do this! + Because it's not guaranteed, that the driver is in command of the vehicle and only that unit will have it's unitReady status affected. + So in conclusion, if you need to check if a vehicle is ready, try something like this: _vehicleReady = { + private ["_veh", "_ready"]; + _veh = _this; + _ready = true; + { + if (!(isNull _x)) then + { + _ready = _ready && (unitReady _x); + }; + } forEach [ + (commander _veh), + (gunner _veh), + (driver _veh) + ]; + _ready + }; + + (November 21, 2015) + To check readiness of a vehicle, don't check it's crew, driver, gunner, commander, etc., but the vehicle itself, e.g.: + $Code$unitReady (vehicle driver _YourVehicle);$/Code$ + Only tested 11/21/2015 by me with A2 1.63.131129 and A3 1.52.132676 but possibly true since 1964. :P - String + Boolean + - getObjectChildren + playableUnits - Return a list of all the children of the specified object. - i - Some Old Editor Command + Returns a list of playable units in a multiplayer game (occupied by both AI or players), created on the following sides east, west, resistance / independent and civilian only. Does not contain units of sideLogic. This does not include dead players awaiting for respawn. - https://community.bistudio.com/wiki/getObjectChildren + https://community.bistudio.com/wiki/playableUnits - Control getObjectChildren String + playableUnits - map getObjectChildren object + playableUnits - + $Code${_x groupChat "I'm a playable unit.";} forEach playableUnits ;$/Code$ + + $Code$// All playable units in a group: + _playableInGroup = units group player arrayIntersect playableUnits ;$/Code$ + + $Code$// All non-playable units in a group: + _playableInGroup = units group player - playableUnits ;$/Code$ + undefined / undefined - + (July 13, 2009) + In single-player missions, this command will return an empty array. + + (December 23, 2014) + To get a list of all player-controlled units: + $Code$_allPlayers = []; + { + if ( isPlayer _x) then + { + _allPlayers pushBack _x; + }; + } forEach playableUnits ;$/Code$ + + (April 15, 2015) + Quote: $Code$ Killswitch + In single-player missions, this command will return an empty array.$/Code$ + Use the switchableUnits command instead + + (August 16, 2015) + playableUnits will not return dead players, use allPlayers instead. + + (February 14, 2017) + Using the Editor (multiplayer attributes) for unchecking "enable AI", or disabling AI(s) in lobby, will make playableUnits as a public variable, updated by each JIP on disabled slot. So, if all slots are diabled AI, playableunits is same as allPlayers + Furthermore, in this case, non-played slot (playable and disabled AI) units simply don't exist! i.e. If you name 8 playable units: u1..to u8, then 2 players in game: u3 & u6 + playableUnits will return [u3,u6], and true for isNil "u1", isNil "u2"... until another player takes the slot. + - Array + Array + - getObjectDLC + enableUAVConnectability - Returns appID of the DLC the object belongs to or nil if object is vanilla. + Enables unit's AV terminal(s) connecting to UAV. - https://community.bistudio.com/wiki/getObjectDLC + https://community.bistudio.com/wiki/enableUAVConnectability - getObjectDLC Object + Object enableUAVConnectability Array - getObjectDLC obj + object enableUAVConnectability [uav, checkAllItems] - $Code$_appID = getObjectDLC cursorTarget ; - if (! isNil "_appID") then { - hint format ["This object belongs to DLC with id: %1", _appID]; - } else { - hint "This object is vanilla"; - };$/Code$ + $Code$unit enableUAVConnectability [uav,true];$/Code$ - global / undefined + undefined / local - Number/Nothing + Nothing + - getObjectMaterials + endMission - Gets all custom materials associated with the object. + Finish the mission. + The end type can be: + "CONTINUE" + "KILLED" + "LOSER" + "END1" + "END2" + "END3" + "END4" + "END5" + "END6" + Mission saves are deleted. Use failMission if they should not. + To maintain Arma 3 visual style, it's recommended to use BIS_fnc_endMission instead. - https://community.bistudio.com/wiki/getObjectMaterials + https://community.bistudio.com/wiki/endMission - getObjectMaterials Object + endMission String - getObjectMaterials obj + endMission endType - $Code$_materials = getObjectMaterials car;$/Code$ + $Code$endMission "END1";$/Code$ - global / undefined + local / local - Array + Nothing + - getObjectProxy + markerDir - Return the proxy object associated with the given editor object. - i - Some Old Editor Command + Get marker direction. - https://community.bistudio.com/wiki/getObjectProxy + https://community.bistudio.com/wiki/markerDir - Control getObjectProxy String + markerDir String - map getObjectProxy object + markerDir markerName - $Code$( findDisplay 128 displayCtrl 51) getObjectProxy "_unit_1" - // returns the object 'B 1-1-A:1 (Sean Johnson)'$/Code$ + $Code$_mPos = markerDir "markerOne"$/Code$ - undefined / undefined + global / undefined - classWorks in BIS RTE only? + (April 18, 2010) + The direction of the marker is the same as displayed in the editor, so it can both be negative, and be 360 degrees or greater. - Object + Number + - getObjectTextures + assignAsCargo - Gets all custom textures (hiddenSelectionsTextures) associated with the object. + Assign a unit as cargo of a vehicle. Used together with orderGetIn to order a unit to get in as cargo into a specific vehicle. Before usage of this command a subordinate unit hasn't got the option to get into the cargo space of the vehicle. - https://community.bistudio.com/wiki/getObjectTextures + https://community.bistudio.com/wiki/assignAsCargo - getObjectTextures Object + Object assignAsCargo Object - getObjectTextures obj + unitName assignAsCargo vehicleName - $Code$_textures = getObjectTextures player ;$/Code$ + $Code$_soldier1 assignAsCargo _truck + [_soldier1] orderGetIn true$/Code$ - global / undefined + global / global - Array + Nothing + - getObjectType + setEffectCondition - Returns object type as a number: - 1 - Primary - Normal object placed in Visitor, part of landscape - 2 - Network - Road placed in Visitor, part of landscape - 4 - Temporary - Temporary object (like tracks) - 8 - TypeVehicle - Some entity added by game - 16 - TypeTempVehicle - Temporary entity - 32 - LandDecal - Land decal + The statement is executed when the trigger or waypoint is activated and the effects are launched depending on the result. + If the result is a boolean and true, the effect is launched. + If the result is an object, the effect is launched if the result is the player or the player vehicle. + If the result is an array, the effect is launched if the result contains the player or the player vehicle. - https://community.bistudio.com/wiki/getObjectType + https://community.bistudio.com/wiki/setEffectCondition - getObjectType Object + Object setEffectCondition String + + Waypoint setEffectCondition String - getObjectType object + trigger setEffectCondition statement + + waypoint setEffectCondition statement - $Code$_objType = getObjectType player ;$/Code$ - - $Code$_objType = getObjectType cursorObject ;$/Code$ + $Code$_triggerObj setEffectCondition "thisList";$/Code$ undefined / undefined @@ -29059,27 +30551,28 @@ - Number + Nothing - Nothing + - getObjectViewDistance + nearSupplies - Gets the values of rendering distances of objects and shadows. + Find supplies (weapon holders, ammo crates, fuel feeds, other units) in the sphere with given radius. - https://community.bistudio.com/wiki/getObjectViewDistance + https://community.bistudio.com/wiki/nearSupplies - getObjectViewDistance + Object/Array nearSupplies Number - getObjectViewDistance + origin nearSupplies radius - $Code$_arr = getObjectViewDistance ;$/Code$ + $Code$_list = player nearSupplies 50;$/Code$ undefined / undefined @@ -29087,239 +30580,296 @@ - Array + Array + - getOxygenRemaining + firstBackpack - Returns amount of remaining oxygen. + Returns the first stored backpack. - https://community.bistudio.com/wiki/getOxygenRemaining + https://community.bistudio.com/wiki/firstBackpack - getOxygenRemaining Object + firstBackpack Object - getOxygenRemaining unit + firstBackpack box - $Code$_oxygen = getOxygenRemaining player;$/Code$ + $Code$myVariable = firstBackpack myBox;$/Code$ undefined / undefined - (October 24, 2014) - Unit will die instantly at 0 oxygen unlike some other games that permit a certain amount of time after oxygen is depleted. - Number + Object + - getPersonUsedDLCs + configNull - Returns a list of all DLCs objects the unit is currently using. For example if a unit is inside a vehicle from DLC, it will return the code of that DLC. - This command is broken and doesnt work on dedicated server + A non-existing Config. + configNull == configNull ; // true + isNull configNull ; // true + configNull isEqualTo configNull ; // true - https://community.bistudio.com/wiki/getPersonUsedDLCs + https://community.bistudio.com/wiki/configNull - getPersonUsedDLCs Object + configNull - getPersonUsedDLCs unit + configNull - $Code$_objects = getPersonUsedDLCs player ;$/Code$ + $Code$_config = missionNamespace getVariable ["myConfig", configNull ];$/Code$ + + $Code$str configNull ; // ""$/Code$ - global / undefined + undefined / undefined - Array + Config + - getPilotCameraDirection + getPlateNumber - Returns model space vector of the object airplane or helicopter pilotCamera. + Get the license plates from any vehicle which has plates configured. - https://community.bistudio.com/wiki/getPilotCameraDirection + https://community.bistudio.com/wiki/getPlateNumber - getPilotCameraDirection Object + getPlateNumber Object - getPilotCameraDirection object + getPlateNumber vehicle - $Code$_pilotCamVector = getPilotCameraDirection vehicle player$/Code$ + $Code$getPlateNumber vehicle player$/Code$ - local / undefined + undefined / undefined - Array + String + - getPilotCameraPosition + moveInDriver - Returns model space coordinates of the object airplane or helicopter pilotCamera. + Move soldier into vehicle driver position (Immediate, no animation). - https://community.bistudio.com/wiki/getPilotCameraPosition + https://community.bistudio.com/wiki/moveInDriver - getPilotCameraPosition Object + Object moveInDriver Object - getPilotCameraPosition object + unitName moveInDriver vehicle - $Code$_pilotCamPos = getPilotCameraPosition vehicle player$/Code$ + $Code$_soldierOne moveInDriver _tankOne$/Code$ - global / undefined + local / global + (August 4, 2006) + Notes from before the conversion: + MP Note Functions MoveInDriver can only be called for local soldiers. They will be ignored for remote soldiers. (see Locality in Multiplayer ) + + In OFP v1.96, the moveIn commands will not trigger an associated getIn event. To ensure the getIn event is fired, use the "getIn Driver" action command. - Array + Nothing + - getPilotCameraRotation + setVehicleReportOwnPosition - Returns rotation (relative to the centered camera position) of the object airplane or helicopter pilotCamera. + Sets that the vehicle will share its own position via datalink to the Side center. - https://community.bistudio.com/wiki/getPilotCameraRotation + https://community.bistudio.com/wiki/setVehicleReportOwnPosition - getPilotCameraRotation Object + Object setVehicleReportOwnPosition Boolean - getPilotCameraRotation object + vehicle setVehicleReportOwnPosition report - $Code$_pilotCamRot = getPilotCameraRotation vehicle player$/Code$ + $Code$( vehicle player ) setVehicleReportOwnPosition true;$/Code$ - local / undefined + undefined / undefined - Array + Nothing + - getPilotCameraTarget + toFixed - Returns the target of the object airplane or helicopter pilotCamera tracking. + Converts a number into a string, keeping the specified number of decimals. If the desired number of decimals is higher than the actual number, nulls are added to create the desired decimal length. This command is almost identical in behaviour to JavaScript toFixed() + NOTE: Converted number is never presented in scientific notation unlike with other number to string commands. Also Arma's default string conversion limits numbers to 6 significant figures, whereas with this command it is possible to preserve some extra precision. + $Code$ str ( pi /100000); //"3.14159e-005" - scientific notation + ( pi /100000) toFixed 10; //"0.0000314159" - no scientific notation + str pi ; //"3.14159" - 6 significant figures (default) + pi toFixed 6; //"3.141593" - forced to 7 significant figures + pi toFixed 7; //"3.1415927" - forced to 8 significant figures$/Code$ + Since Arma 3 v1.71.141859 an alternative syntax is added, which takes no number and returns Nothing. Instead it acts as keyword and switches engine Number to String global conversion into desired format, from the moment it is applied until the end of script. To reset output back to default at any time, use toFixed -1. For example: + $Code$ systemChat str position player ; + call + { + toFixed 6; + systemChat str position player ; + }; + systemChat str position player ; + toFixed -1; + systemChat str position player ;$/Code$ + The result is: + [11580.3,11797.7,0.00146675] + [11580.341797,11797.737305,0.001467] + [11580.341797,11797.737305,0.001467] + [11580.3,11797.7,0.00146675] + Ideal to be used when saving data to a database when more precise positioning is required. - https://community.bistudio.com/wiki/getPilotCameraTarget + https://community.bistudio.com/wiki/toFixed - getPilotCameraTarget Object + Number toFixed Number + + toFixed Number - getPilotCameraTarget object + number toFixed decimals + + toFixed decimals - $Code$_pilotCamTrack = ( getPilotCameraTarget vehicle player ) select 0; - _pilotCamTargetPos = ( getPilotCameraTarget vehicle player ) select 1; - _pilotCamTarget = ( getPilotCameraTarget vehicle player ) select 2;$/Code$ + $Code$123 toFixed 2; //"123.00"$/Code$ + + $Code$2.34 toFixed 1; //"2.3" + 2.35 toFixed 1; //"2.4"$/Code$ + + $Code$// Convert position to string preserving position precision: + fn_posToString = + { + format [ + "[%1,%2,%3]", + _this select 0 toFixed 8, + _this select 1 toFixed 8, + _this select 2 toFixed 8 + ] + }; + str getPos player ; // "[3231.05,171.802,0.00143862]" + getPos player call fn_posToString; // "[3231.04882813,171.80192566,0.00143862]"$/Code$ + + $Code$// Same as Example 3 only using new alternative syntax: + str getPos player ; // "[3231.05,171.802,0.00143862]" + toFixed 8; + str getPos player ; // "[3231.04882813,171.80192566,0.00143862]"$/Code$ - local / undefined + undefined / undefined + (September 2, 2016) + parseNumber (3.56346 toFixed 4); //0.0026 ms (10000 cycles) + [3.5634,4] call BIS_fnc_cutDecimals ; //0.0111 ms (10000 cycles) - Array + String - Nothing + - getPlayerChannel + createCenter - Returns channel number for given player, provided that player is speaking, otherwise -1. Having mic on is not enough, player has to make a sound. There are several limitations to this command: - It does not work on dedicated server, the return is always -1, only client can detect other client talking. - It does not detect when someone talks on direct chat at all anywhere. - The client on which command is executed has to able to receive transmission before the transmission channel can be detected. For example if a player is not in the same group as a speaker and the speaker speaks on Group Channel, the player cannot hear the speaker and therefore cannot detect what channel the speaker is on. - In short, this command mimics the speaking icon from the UI. Correspondence between channel and number: - 0 = Global - 1 = Side - 2 = Command - 3 = Group - 4 = Vehicle - 5 = Direct (Is not detected by getPlayerChannel ) - 6-15 = Custom Radio (see radioChannelCreate ) + In a nutshell, this command creates game Side. Without side it is not possible to create Groups. So if center for particular side is undefined, no groups can be created for this side. A Unit needs a group to be able to spawn in. So if no center for particular side exists, no groups for this side can be created and therefore no units for this side can be spawned. In Arma 3, the centers for all sides are created for you. An attempt to create center for existing side is ignored. Center can only be created for: east, west, resistance, civilian and sideLogic. These are the only sides groups can be created for. + Old description : Creates a new AI HQ for the given side. An 'HQ ' is something each side needs to have to be able to communicate. By default, all centers for units which are present in the mission are created before the mission is started. This command can be used to initialize a side which has no units present in the Mission.sqm, so that you can spawn groups and units for it. + For the available sides see Side. - https://community.bistudio.com/wiki/getPlayerChannel + https://community.bistudio.com/wiki/createCenter - getPlayerChannel Object + createCenter Side - getPlayerChannel player + createCenter side - $Code$_channel = getPlayerChannel player ;$/Code$ + $Code$_SideHQ = createCenter east$/Code$ - global / undefined + undefined / global + (17:15, 22 June 2007 (CEST)) + You need to set the new sides friendly status using the setFriend command, once you have created your Center. Otherwise the newly created AI will not engage you, if you're on the opposing side. - Number + Side + - getPlayerScores + min - In MP: returns the unit's table of scores (infantry kills, soft vehicle kills, armor kills, air kills, deaths, total score). In SP: empty array [] + The smaller of a,b - https://community.bistudio.com/wiki/getPlayerScores + https://community.bistudio.com/wiki/min - getPlayerScores Object + Number min Number - getPlayerScores unitName + a min b - $Code$getPlayerScores BIS_player1;$/Code$ + $Code$3 min 2 + // Result is 2$/Code$ undefined / undefined @@ -29327,995 +30877,1057 @@ - Array + Number + - getPlayerUID + rankId - Return an uniqueID of the given unit as string if it's player and empty value if it's AI. The unique ID may be up to 100 characters long and may contain numbers, uppercase letters and underscores (the value can be used to construct a valid variable name by appending to another valid variable name). - Note: while for ArmA 2 or ArmA 2: Operation Arrowhead until version 1.60 the result always contains a number, it should be always handled as an opaque string. Converting it to a Number can cause precision problems, as Number cannot accurately represent integers above 16777216 (2^24). Moreover, game versions since ArmA 2: Operation Arrowhead 1.61 provide a non-numeric value as a result. + Return the rank of the given unit for comparison. + Value may be : + 0 - Private + 1 - Corporal + 2 - Sergeant + 3 - Lieutenant + 4 - Captain + 5 - Major + 6 - Colonel - https://community.bistudio.com/wiki/getPlayerUID + https://community.bistudio.com/wiki/rankId - getPlayerUID Object + rankId Object - getPlayerUID unit + rankId unit - $Code$_uid = getPlayerUID player ;$/Code$ + $Code$_myIdRank = rankId player;$/Code$ undefined / undefined - (April 17, 2014) - In Arma 3 the returned string is the steamID64 of the player. $Code$ _steamProfileUrl = "http://steamcommunity.com/profiles/" + ( getPlayerUID player );$/Code$ - String + Number + - getPosASLVisual + getVariable - Returns an object's rendered 3D position ASL (z value above sea level) in render time scope. Alias of visiblePositionASL. + Return the value of variable in the variable space assigned to various data types. In case of Alt Syntax usage in Arma 3, the default value will be returned if: + Requested variable is either undefined or nil + Variable namespace is null ( objNull, grpNull, etc.) + All available data types combinations: + Namespace getVariable String + Namespace getVariable Array (since Arma 2 1.60) + Object getVariable String + Object getVariable Array + Group getVariable String + Group getVariable Array + Team_Member getVariable String + Team_Member getVariable Array + Task getVariable String + Task getVariable Array (Since Arma 3 v1.67) + Location getVariable String + Location getVariable Array (Since Arma 3 v1.67) + Control getVariable String (since Arma 3 v1.55.133553) + Control getVariable Array (since Arma 3 v1.55.133553) + Display getVariable String (since Arma 3 v1.55.133553) + Display getVariable Array (since Arma 3 v1.55.133553) + When variable is set on Task, it is not actually set on task itself, but on FSM attached to the task. So if there is no FSM getVariable will not work. - https://community.bistudio.com/wiki/getPosASLVisual + https://community.bistudio.com/wiki/getVariable - getPosASLVisual Object + Namespace/Object/Display/Control/Group/Location/Task/Team_Member getVariable String + + Namespace/Object/Display/Control/Group/Location/Task/Team_Member getVariable Array - getPosASLVisual object + varspace getVariable name + + varspace getVariable [name, defaultValue] - $Code$_playerRenderedPosASL = getPosASLVisual player ;$/Code$ + $Code$_thePublicVariable = _myTruck getVariable "myPublicVariable";$/Code$ + + $Code$_aLocalVariable = _myTruck getVariable ["myLocalVariable", ["Not set", _var]] select 1;$/Code$ + + $Code$for "_i" from 0 to 5 do { + _car = missionNamespace getVariable ("car" + str _i); + _car setDamage 0; + }; + // Sets damage of car0, car1,..., car5 to 0.$/Code$ + + $Code$myMissionVar = 2015; + missionNamespace getVariable "myMissionVar";//Returns 2015$/Code$ + + $Code$// WARNING when using dynamic default value: + missionNamespace getVariable ["var", 123 call fnc_abc]; + /// fnc_abc is always called even when var is defined$/Code$ + + $Code$// Get current value of a variable and if it is undefined, define it and get the defined value: + private _var = missionNamespace getVariable "varName"; + if ( isNil "_var") then + { + missionNamespace setVariable ["varName", 123]; + _var = 123; + }; + // _var here will contain current value of the variable varName$/Code$ global / undefined + (August 13, 2016) + NOTE: Arma 2 ONLY! In Arma 3 this will return default value. + Warning: the alternative syntax returns undefined when the varspace is an object and that object is null. Example: + $Code$_test = objNull getVariable ["test","0"]; + systemChat _test;$/Code$ + Errors because _test is undefined. Tested in A2OA 1.63.131129 + + (August 31, 2017) + You can do typechecking using param : + $Code$private _myVar = [player getVariable "myVar"] param [0,"",[""]];$/Code$ + and params : + $Code$[player getVariable "myVar"] params [["_myVar","",[""]]];$/Code$ - Array + Anything/Nothing - Anything + - getPosASLW + modelToWorld - Returns the object position height above sea surface (waves included). + Translates relative position from object model space into world position. This command will take into account vectorUp of the object when calculating relative coordinates. For ASL version see modelToWorldWorld - https://community.bistudio.com/wiki/getPosASLW + https://community.bistudio.com/wiki/modelToWorld - getPosASLW Object + Object modelToWorld Array - getPosASLW obj + model modelToWorld position - $Code$_pos = getPosASLW _diver;$/Code$ + $Code$_aboveAndBehindPlayer = player modelToWorld [0,-1,3];$/Code$ - global / undefined + undefined / undefined + (16 Feb, 2007) + The worldPos parameter appears to be a relative offset to the position of object, so it can often simply be [0,0,0]. + Example: to position an object _obj relative to the position of another object _RelObj with on offset of _Offset, try: + _Offset = [_x,_y,_z]; + _worldPos = _RelObj modelToWorld _Offset; + _obj setPos _worldPos; + + (16 Feb, 2007) + The object model space has got its Z-Axis along the object's vectorUp, its Y-Axis along the object's vectorDir, while its X-Axis goes along vectorDir x VectorUp (meaning as the X-Axis in a right-handed cartesian coordiante system ). + + (8 May, 2008) + If your object requires a new direction, ensure you call setDir prior to setPos when using modelToWorld. Calling setDir afterwards will skew its position otherwise. + _ladder setDir _angle; + _ladder setPos (_building modelToWorld [_x, _y, _z]); + + (6 Feb, 2011) + The z height returned changes dynamically with the height of waves beneath the object, if the object is located over sea. The z height returned by getPosATL and getPosASL does not change like this. This was tested by continuously retrieving the position of a static object, like the cross in the empty/corpses category, placed over sea or land. + modelToWorld behaves similar to + getPos _obj + but it does not give the same result, therefore + (_obj modelToWorld [0.0, 0.0, 0.0]) is not the same as (getPos _obj). - Array + Array + - getPosASL + remove3DENEventHandler - Returns the object position height above sea level. + Removes Eden Editor event handler of given type and ID. + See the list of all Eden Editor Event Handlers. - https://community.bistudio.com/wiki/getPosASL + https://community.bistudio.com/wiki/remove3DENEventHandler - getPosASL Object + remove3DENEventHandler Array - getPosASL object + remove3DENEventHandler [type,id] - $Code$_AslPos = getPosASL player ;$/Code$ - - $Code$hint format ["position above sea level: %1", ( getPosASL player ) select 2];$/Code$ + $Code$eh = add3DENEventHandler ["onUndo",{ systemChat "Zip..."}]; + remove3DENEventHandler ["onUndo",eh];$/Code$ - global / undefined + undefined / undefined - (23 Feb, 2007) - $Code$ getPosASL _obj select 2;$/Code$ - might sometimes return the vertical position above sea level, but over land for stacked objects, it returns the vertical position above the object beneath it or at least affected by this offset. The same problem exists for getPos. There was a discussion thread in the BIS forums which suggested the use of the command modelToWorld instead to get around this issue where an absolute vertical position is required. ArmA Ver 1.02. - - (27 Mar, 2014) - According to Code Optimisation, this function is the fastest (2x) and should be used instead of getPos, getPosATL and position. - Conversion keep this speed ratio and is structured like: $Code$ ASLtoATL getPosASL Object ;$/Code$ - Array + Nothing + - getPosATLVisual + ropeCut - Returns an object's rendered 3D position ATL (z value above ground) in render time scope. + Cut rope and detach rope from vehicle - https://community.bistudio.com/wiki/getPosATLVisual + https://community.bistudio.com/wiki/ropeCut - getPosATLVisual Object + ropeCut Array - getPosATLVisual object + ropeCut [rope, distance] - $Code$_playerRenderedPosATL = getPosATLVisual player ;$/Code$ + $Code$ropeCut [ ropes heli1 select 0, 5];$/Code$ - global / undefined + undefined / undefined - Array + Nothing + - getPosATL + curatorCoef - Returns the position of an object relative to the terrain. + Returns current coeficient setting. - https://community.bistudio.com/wiki/getPosATL + https://community.bistudio.com/wiki/curatorCoef - getPosATL Object + Object curatorCoef String - getPosATL object + curatorObj curatorCoef action - $Code$_objPosition = getPosATL player$/Code$ + $Code$curatorModule curatorCoef "Place"$/Code$ - global / undefined + undefined / undefined - (December 18, 2015) - If one desires to retrieve an object from an array of object, be sure to wrap your array information in parenthesis. e.g. getPosATL ( myArray select 0 ) ; - Array + Number + - getPosVisual + curatorEditingArea - Returns an object's rendered 3D position (z value above sea when over sea, or above ground when over land) in render time scope. Alias of visiblePosition. + Returns all curator editing areas. - https://community.bistudio.com/wiki/getPosVisual + https://community.bistudio.com/wiki/curatorEditingArea - getPosVisual Object + curatorEditingArea Object - getPosVisual object + curatorEditingArea curatorObj - $Code$_playerRenderedPos = getPosVisual player ;$/Code$ + $Code$_editingArea = curatorEditingArea myCurator;$/Code$ - global / undefined + undefined / undefined - Array + Array + - getPosWorld + findEmptyPosition - Returns PositionWorld, which is PositionASL of the model centre [0,0,0] of an object, rather than transformed boundingCenter or LandContact vertices. + Searches for an empty position around specified position. The search starts looking for an empty position at a minimum distance of [minDistance] from the [center] and looks as far away as [maxDistance]. If a [vehicleType] parameter is specified, then the search will look for an empty positions that is big enough to hold that vehicle type. If an empty position isn't found, an empty array is returned. + This command ignores moving objects present within search area. - https://community.bistudio.com/wiki/getPosWorld + https://community.bistudio.com/wiki/findEmptyPosition - getPosWorld Object + Array findEmptyPosition Array - getPosWorld object + center findEmptyPosition [minDistance, maxDistance, vehicleType] - $Code$_obj setPosWorld getPosWorld _obj;$/Code$ + $Code$_position = ( getPosATL player ) findEmptyPosition [0,100];$/Code$ - $Code$ATLToASL (_groundObj modelToWorld [0,0,0]) isEqualTo getPosWorld _groundObj; //true$/Code$ + $Code$_position = _center findEmptyPosition [10,100,"UH60M_EP1"];$/Code$ - $Code$// Wave height under a boat: - _h = ((boat modelToWorld [0,0,0]) vectorDiff getPosWorld boat) select 2;$/Code$ + $Code$// Check if exact position is empty: + _position = _center findEmptyPosition [0,0,"B_Boat_Armed_01_minigun_F"];$/Code$ - global / undefined + undefined / undefined + (November 6, 2013) + Keep search radius short and sweet, under 50 metres maybe. Searching big area takes long time and will result in your game stop responding until the search is over. isFlatEmpty is probably more suitable for a larger area search. + + (March 6, 2012) + I think the radius parameter should be treated as a 'minimum distance' from the centre position. I found that the parameter name radius wasn't very clear. Also, if radius is greater than max distance then the function will always return an empty array. + Here is an snippet of code I use to find a safe landing zone for an extraction helicopter. It may be useful for someone. + $Code$_centre = [ getMarkerPos "marker", random 150, random 360 ] call BIS_fnc_relPos; + _extraction_point = []; + _max_distance = 100; + while{ count _extraction_point 1 } do + { + _extraction_point = _centre findEmptyPosition[ 30, _max_distance, "UH60M_EP1" ]; + _max_distance = _max_distance + 50; + }; + $/Code$ + In the above example, make sure that "_max_distance" is greater than 30, otherwise the while loop will go forever. - Array + Array + - getPos + removeUniform - Returns the object position in format PositionAGLS. Z value is height over the surface underneath. - Since Arma 3 v1.55.133361, an alternative syntax is added that allows to get position given distance and heading away from original object or position, the equivalent of BIS_fnc_relPos + Removes uniform from unit. - https://community.bistudio.com/wiki/getPos + https://community.bistudio.com/wiki/removeUniform - getPos Object/Location - - Object/Position2D/Position3D getPos Array + removeUniform Object - getPos object - - origin getPos [distance, heading] + removeUniform unit - $Code$hintSilent str getPos player ;$/Code$ - - $Code$// getPos vs. other methods (over sea) - diag_log getPos ship; // [2412.01, 6036.33, -0.839965] - diag_log getPosATL ship; // [2412.01, 6036.33, 19.4266] - diag_log getPosASL ship; // [2412.01, 6036.33, -0.920066] - diag_log getPosASLW ship; // [2412.01, 6036.33, -0.865981] - diag_log visiblePosition ship; // [2412.02, 6036.33, -0.837952] - diag_log visiblePositionASL ship; // [2412.02, 6036.33, -0.91798] - diag_log position ship; // [2412.01, 6036.33, -0.839965]$/Code$ - - $Code$// getPos vs. other methods (over land) - diag_log getPos car; // [2508.64, 5681.47, 0.0609589] - diag_log getPosATL car; // [2508.64, 5681.47, 0.0356369] - diag_log getPosASL car; // [2508.64, 5681.47, 71.718] - diag_log getPosASLW car; // [2508.64, 5681.47, 71.718] - diag_log visiblePosition car; // [2508.64, 5681.47, 0.0609512] - diag_log visiblePositionASL car; // [2508.64, 5681.47, 71.718] - diag_log position car; // [2508.64, 5681.47, 0.0609589]$/Code$ - - $Code$// Find position 100 metres and 45 degrees from player position: - player getPos [100,45];$/Code$ + $Code$removeUniform player ;$/Code$ - global / undefined + global / global - (16 Feb, 2007) - getPos obj select 2 - might return the vertical position above ground level, but for a stacked object, it returns the vertical position above the object beneath it. The same problem exists for getPosASL. There was a discussion thread in the BIS forums which suggested the use of the command modelToWorld instead to get around this issue where an absolute vertical position is required. ArmA Ver 1.02. - - (6 Feb, 2011) - The z height returned changes dynamically with the height of waves beneath the object, if the object is located over sea. The z height returned by getPosATL and getPosASL does not change like this. This was tested by continuously retrieving the position of a static object, like the cross in the empty/corpses category, placed over sea or land. - getPos behaves similar to - _obj modelToWorld [0.0, 0.0, 0.0] - but it does not give the same result, therefore - (_obj modelToWorld [0.0, 0.0, 0.0]) is not the same as (getPos _obj). - - (23 Nov, 2011) - You can use getPos and setPos on triggers. - Array - Array + Nothing + - getPylonMagazines + remoteControl - Return array of magazines on pylons + Switches on remote control of the unit. Command needs to be executed locally to the player. If driver is remote it will get transferred to players PC. - https://community.bistudio.com/wiki/getPylonMagazines + https://community.bistudio.com/wiki/remoteControl - getPylonMagazines Object + Object remoteControl Object - getPylonMagazines vehicle + who remoteControl whom - $Code$getPylonMagazines ( vehicle player )$/Code$ + $Code$// Set player remote control of driver: + player remoteControl driver UAV; + driver UAV switchCamera "Internal"; //switchCamera required + //sometimes switchCamera is not needed + player remoteControl driver UAV;$/Code$ + + $Code$// Return control to player: + objNull remoteControl driver UAV;$/Code$ - undefined / undefined + local / global - (May 12, 2017) - The indexes of the returned array's elements are relative to the pylon IDs, such that element 0 is pylon 1, element 1 is pylon 2, etc. + You must use switchCamera in order to remote control the unit and. + You can only remoteControl characters, e.g. if yo want to remote control a car, you have + to add a driver and use + "player remoteControl driver someVehicle". + + (Jan 25, 2010) + Arma 1.05 : + You can remoteControl multiple units at the same time. + It is not needed to switchCamera to the unit to be able to control it - it is needed to be able to fire with. + The switchCamera is fixed : the player can't change internal/external/optics view. + Do not think about it like a selectPlayer : it is used to give the control to the vehicle role the unit is in. + SwitchCamera to the vehicle the unit is in ; the camera will go depending the role you are remoteControlling. + The AI driver won't follow your vehicle move orders. + If the player dies, the death screen will appear, not automatically turning back to the player. + If you want to stop the remote control, use objNull as remote controller. + Example : + player remoteControl driver jeep1; // will remoteControl it, you still will have full control of the player + jeep1 switchCamera "internal"; // fix the camera to the ''vehicle'' and not to (driver jeep1) ! + waitUntil { !(alive jeep1) || !(alive player) }; + objNull remoteControl driver jeep1; // removes the remoteControlling + player switchCamera "internal"; // returns to the player - Array + Nothing + - getRelDir + configClasses - Returns direction, which is relative to object's current direction, from given object to another object or position in the range from 0 to 360, the equivalent of BIS_fnc_relativeDirTo. + Returns an array of config entries which meet criteria in condition code. Command iterates through all available config sub classes of the given config class. Current looked at config is stored in _x variable (similar to alternative count command implementation). Condition has to return true in order for the looked at config to be added to the resulting array. Slightly faster than configProperties, but doesn't account for config properties or inherited entries. + The condition code passed to configClasses should only be used for simple filter expressions and nothing more - https://community.bistudio.com/wiki/getRelDir + https://community.bistudio.com/wiki/configClasses - Object getRelDir Object/Position2D/Position3D + String configClasses Config - object getRelDir position + condition configClasses config - $Code$_reldir = player getRelDir tank;$/Code$ + $Code$// collect all CfgVehicles configs: + _configs = " true " configClasses ( configFile "CfgVehicles");$/Code$ + + $Code$// Return all classes that can transport 10 and more soldiers: + _transporters = " getNumber (_x 'transportSoldier') = 10" configClasses ( configFile "CfgVehicles");$/Code$ + + $Code$// Return all classes that inherit from 'RscText': + hint str (" inheritsFrom _x == ( configFile 'RscText')" configClasses configFile );$/Code$ - global / undefined + undefined / undefined + (oct 19, 2014) + A fantastic way to filter stuff. eg; Create an array of west vehicles and spawn then in front of the player in rows of 5 + $Code$ + private ["_cfgArray","_xPos","_yPos","_veh"]; + _cfgArray = "( + (getNumber (_x 'scope') = 2) && + {getNumber (_x 'side') == 1 && + {getText (_x 'vehicleClass') in ['Armored', 'Car', 'Air'] + } + } + )" configClasses (configFile "CfgVehicles"); + _xPos = 0; + _yPos = 0; + { + _yPos = _yPos + 20; + _veh = createVehicle [ ( configName _x ), player modelToWorld [_xPos, _yPos, 0], [], 0, "None"]; + if (_yPos = 100) then { + _yPos = 0; + _xPos = _xPos + 20; + }; + } forEach _cfgArray; + $/Code$ + + (May 28, 2016) + configClasses does not account for inherited subclasses, use configProperties with isClass filter instead + $Code$ configProperties [_config, " isClass _x", true ];$/Code$ + + (May 28, 2017) + this will get a list of ALL locations on the currently loaded world + $Code$( "true" configClasses ( configFile "CfgWorlds" worldName "names" ) ) apply { + // change each config entry into a location + nearestLocation [ + getArray ( _x "position" ), + getText ( _x "type" ) + ] + };$/Code$ - Number + Array + - getRelPos + isStaminaEnabled - Returns position, which is given distance and relative direction away from original object. + Check if stamina depletion is enabled - https://community.bistudio.com/wiki/getRelPos + https://community.bistudio.com/wiki/isStaminaEnabled - Object getRelPos Array + isStaminaEnabled Object - object getRelPos [distance, direction] + isStaminaEnabled unit - $Code$// Find position 100 metres away at player's 3 o'clock: - _relpos = player getRelPos [100, 90];$/Code$ + $Code$isStaminaEnabled player;$/Code$ global / undefined - getPos vs getRelPos: getRelPos operates similarly to getPos except in getRelPos the direction is calculated 'relative' to the current object direction whereas getPos's direction is from North. Thus while getPos can take a position array as it's starting point, getRelPos requires an object with its own azithmus heading. - - (3 March, 2016) - Array + Boolean + - getRemoteSensorsDisabled + tvPicture - Get status of disabled raycasts for remote entities. See disableRemoteSensors for detailed description. + Returns name of picture from item pointed to by path. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/getRemoteSensorsDisabled + https://community.bistudio.com/wiki/tvPicture - getRemoteSensorsDisabled + tvPicture Array + + Control tvPicture Array - getRemoteSensorsDisabled + tvPicture [idc, [path]] + + _ctrl tvPicture [path] - $Code$_status = getRemoteSensorsDisabled ;$/Code$ + $Code$tvPicture [101, [0]];$/Code$ + + $Code$_ctrl tvPicture [0,0,0];$/Code$ - undefined / undefined + local / local + (Sep 11 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Boolean + String - String + - getRepairCargo + setDropInterval - Returns the amount of repair resources from empty (0) to full (1) in the cargo space of a repair vehicle. + Set interval of emitting particles from particle source. In Arma 3 hardcoded limit of how many particles can exist at the same time is 18000. Correspondence between CfgCloudlets class param name and command param: + $Code$particleSource setDropInterval interval;$/Code$ - https://community.bistudio.com/wiki/getRepairCargo + https://community.bistudio.com/wiki/setDropInterval - getRepairCargo Object + Object setDropInterval Number - getRepairCargo vehicle + particleSource setDropInterval interval - $Code$value = getRepairCargo vehicleName;$/Code$ + $Code$_source setDropInterval 0.05;$/Code$ - global / undefined + undefined / undefined - (December 22, 2014) - If the vehicle is not alive, it always returns Nothing, which you should check for using isNil. - If the vehicle is unable to carry that type of cargo, it returns -1.#IND, which you should check for using finite. - Number + Nothing + - getResolution + get3DENActionState - Returns an array containing all information about resolution. - The returned Array is as follow: [width, height, 2D viewport width, 2D viewport height, aspect ratio, UI scale] - Note: aspect ratio and UI scale are returned as coefficients and not 16:9 for example. + Returns state of given action in the Eden Editor. + See the list of all actions. - https://community.bistudio.com/wiki/getResolution + https://community.bistudio.com/wiki/get3DENActionState - getResolution + get3DENActionState String - getResolution + get3DENActionState action - $Code$_res = getResolution ; //some single monitor setup[ - 1360,//width - 768,//height - 867,//2D viewport width - 653,//2D viewport height - 1.77778,//aspect ratio - 0.85//UI scale - ]$/Code$ - - $Code$_res = getResolution ; //dedicated server[ - 160,//width - 120,//height - 136,//2D viewport width - 102,//2D viewport height - 1.33333,//aspect ratio - 0.85//UI scale - ]$/Code$ - - $Code$_res = getResolution ; //some triple monitor setup[ - 5760,//width - 1080,//height - 792,//2D viewport width - 594,//2D viewport height - 5.33333,//aspect ratio - 0.55//UI scale - ]$/Code$ + $Code$if ( get3DENActionState "ToggleMap" == 1) then { systemChat "Editor map is open!"};$/Code$ undefined / undefined - (05:38, 20 December 2010) - This command can be usefull to play a video (see this function BIS_fnc_playVideo ) in the given format if you've compiled it for different UI scale. - Array + Number + - getShadowDistance + selectDiarySubject - Gets the shadows rendering distance. + Select the subject page in a log. - https://community.bistudio.com/wiki/getShadowDistance + https://community.bistudio.com/wiki/selectDiarySubject - getShadowDistance + Object selectDiarySubject String - getShadowDistance + person selectDiarySubject subject - $Code$_value = getShadowDistance;$/Code$ - + undefined / undefined - Number + Nothing + - getShotParents + openMap - Returns shot information Array for the given projectile in format [vehicle, instigator], where vehicle is the vehicle the shot was fired from, and the instigator is the person who pulled the trigger. If shot was fired by a soldier on foot or in FFV position in vehicle, the soldier is returned for the vehicle. + Shows in-game map. If forced, cannot be closed. - https://community.bistudio.com/wiki/getShotParents + https://community.bistudio.com/wiki/openMap - getShotParents Object + openMap Boolean + + openMap Array - getShotParents projectile + openMap show + + openMap [show, forced] - $Code$_shotParents = getShotParents myProjectile;$/Code$ + $Code$openMap true ;$/Code$ - $Code$tank addEventHandler ["Fired", { systemChat str getShotParents (_this select 6)}];$/Code$ + $Code$openMap [ true, true ];$/Code$ - undefined / undefined + undefined / local - Array + Boolean - Boolean + - getSlingLoad + setPilotCameraTarget - Return object which is sling loaded by vehicle + Sets an area or target to be tracked by the object airplane or helicopter pilotCamera. + To track an object the vehicle has to have appropriate sensors ( scanners ) that can detect the given target type. + Using objNull will unlock the camera - https://community.bistudio.com/wiki/getSlingLoad + https://community.bistudio.com/wiki/setPilotCameraTarget - getSlingLoad Object + Object setPilotCameraTarget Object/Array - getSlingLoad vehicle + object setPilotCameraTarget target - $Code$_cargo = getSlingLoad heli1;$/Code$ + $Code$_pilotCamTrack = vehicle player setPilotCameraTarget [2100,4200,4.2];$/Code$ + + $Code$_pilotCamTrack = vehicle player setPilotCameraTarget BIS_Edita;$/Code$ - undefined / undefined + local / undefined - (05 April, 2014) - Returns objNull when nothing is sling loaded. - Object + Boolean + - getSpeed + selectMin - Get the speed for the given speed mode. - SpeedMode can be: - "AUTO" - "SLOW" - "NORMAL" - "FAST" + Returns the array element with minimum numerical value. Engine solution to BIS_fnc_lowestNum and BIS_fnc_findExtreme. Therefore it is expected that supplied array consists of Numbers only. Booleans however are also supported and will be evaluated as Numbers : true - 1, false - 0. nil value treated as 0. Other non Number elements (not recommended) will be evaluated as 0 and Bad conversion: scalar message will be logged into. rpt. - https://community.bistudio.com/wiki/getSpeed + https://community.bistudio.com/wiki/selectMin - Object getSpeed String + selectMin Array - object getSpeed speedMode + selectMin array - $Code$_spd = player getSpeed "FAST";$/Code$ + $Code$_min = selectMin [1,2,3,4,5]; //1$/Code$ + + $Code$// Same as, for example: + _min = _a min _b min _c min _d; + // Only faster: + _min = selectMin [_a,_b,_c,_d];$/Code$ - global / undefined + undefined / undefined - Number + Anything + - getStamina + setWaypointVisible - Get current stamina (~ seconds until depletion) + Sets the visibility of the waypoint. - https://community.bistudio.com/wiki/getStamina + https://community.bistudio.com/wiki/setWaypointVisible - getStamina Object + Array setWaypointVisible Boolean - getStamina unit + waypoint setWaypointVisible visible - $Code$getStamina player;$/Code$ + $Code$[grp, 2] setWaypointVisible false ;$/Code$ + + $Code$[ group player, currentWaypoint ( group player )] setWaypointVisible false ;$/Code$ - undefined / undefined + undefined / global + (September 23, 2015) + This does not apply to Zeus/Curator view... so this command won't hide the Waypoint lines and icons from your view as a Zeus when units are in your EditableAddons list. - Number + Nothing + - getStatValue + addPrimaryWeaponItem - Returns value of the given stat. + Adds weapon item to the weapon cargo space. This is used for infantry weapons. + As of Arma 3 DEV 1.37, this command also supports weapon magazines. - https://community.bistudio.com/wiki/getStatValue + https://community.bistudio.com/wiki/addPrimaryWeaponItem - getStatValue String + Object addPrimaryWeaponItem String - getStatValue name + unit addPrimaryWeaponItem item - $Code$getStatValue "ExpWarlockDown"; //Checks if the "Warlock Down" Achivement was already aquired$/Code$ + $Code$player addPrimaryWeaponItem "muzzle_snds_H";$/Code$ - undefined / undefined + local / global + (June 22, 2014) + If the item being added is not supported by the unit's weapon then the command will simply fail silently. The item is also not added to the unit's inventory in such a case. - Number + Nothing + - getSuppression + face - Gets the suppression value of given unit. Returns SCALAR between 0 and 1. Suppression is not calculated for player entities. + Returns the face of a person. - https://community.bistudio.com/wiki/getSuppression + https://community.bistudio.com/wiki/face - getSuppression Object + face Object - getSuppression unit + face person - $Code$getSuppression AI_unit_1;$/Code$ + $Code$face player$/Code$ - local / undefined + undefined / undefined - Number + String + - getTerrainHeightASL + diag_captureFrame - Returns the terrain height above the sea for the given position. + This command starts counting frames from the moment it is executed and when the count reaches the number passed as param, the current frame is captured and captured data UI dialog appears, similar to diag_captureSlowFrame. + This can also be executed on a dedicated Server and because a Server has no UI it will behave like diag_captureFrameToFile. + Special: BattlEye's RCON variant of this command is #captureFrame + Note : Only available in specific builds. See Performance Profiling for details. - https://community.bistudio.com/wiki/getTerrainHeightASL + https://community.bistudio.com/wiki/diag_captureFrame - getTerrainHeightASL Position2D/Position3D + diag_captureFrame Number - getTerrainHeightASL position + diag_captureFrame frame - $Code$_height = getTerrainHeightASL ( position player );$/Code$ - - $Code$_height = getTerrainHeightASL [5213,3245];$/Code$ + $Code$diag_captureFrame 1; //capture the first frame after command execution$/Code$ - $Code$_seadepth = abs ( getTerrainHeightASL getPos player ); // sea depth at players position;$/Code$ + $Code$diag_captureFrame 24; //capture 24th frame after command execution$/Code$ undefined / undefined - (June 6, 2017) - This command can usefully return the depth of water at the given position when in water. Note that the number it returns is the depth, albiet expressed as a negative number. Use abs to always return a positive number. See example 3 - Number + Nothing + - getText + ctrlFade - Extract text from config entry. + Returns the current fade factor of control. - https://community.bistudio.com/wiki/getText + https://community.bistudio.com/wiki/ctrlFade - getText Config + ctrlFade Control - getText config + ctrlFade controlName - $Code$_text = getText ( configFile "CfgVehicles" "Thing" "icon");$/Code$ + $Code$_scale = ctrlFade _control$/Code$ undefined / undefined - (Mar 28, 2014) - (ArmA3 1.14) It's recommended to use BIS_fnc_GetCfgData or BIS_fnc_returnConfigEntry to get variable cfg data rather than conditioning via isNumber, isText, isArray, getNumber, getText and getArray combination. - Traditional workaround: - $Code$ - _cfg = configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type" - switch ( true ) do - { - case ( isNumber _cfg): { getNumber _cfg}; - case ( isText _cfg): { getText _cfg}; - case ( isArray _cfg): { getArray _cfg;}; - default { nil }; - }; - $/Code$ - Recommended workaround: - $Code$ - ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_GetCfgData ; - $/Code$ - To return default value once entry was not found, we can use BIS_fnc_returnConfigEntry instead of BIS_fnc_GetCfgData. e.g. - $Code$ - [( configFile "CannonFire" "LightExp"),"lifeTime",0] call BIS_fnc_returnConfigEntry ;//0.5 - $/Code$ - To compose collected String into Array, use BIS_fnc_getCfgDataArray instead. E.g. - $Code$ - ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_getCfgDataArray ; - $/Code$ - String + Number + - getUnitLoadout + ctRemoveHeaders - Returns an array with all assigned items, weapons, containers and their stored items. - Detailed explanation of the returned array: Talk:getUnitLoadout - This command is not final and might be changed in a near future. + Takes array of header indices as a parameter and removes headers with those indices. Indices of remaining headers will be recomputed. - https://community.bistudio.com/wiki/getUnitLoadout + https://community.bistudio.com/wiki/ctRemoveHeaders - getUnitLoadout Object - - getUnitLoadout String/Config + Control ctRemoveHeaders Array - getUnitLoadout unit - - getUnitLoadout class + Control ctRemoveHeaders Array - $Code$getUnitLoadout player ;$/Code$ - - $Code$getUnitLoadout "B_Soldier_F";$/Code$ - - $Code$getUnitLoadout ( configFile "CfgVehicles" "B_Soldier_F");$/Code$ + $Code$_control ctRemoveHeaders [0, 1, 2];$/Code$ - undefined / undefined + local / local - Array - Array + Nothing + - getUnitTrait + ctrlMapScale - Gets the current value of a trait of the given unit. - Default traits are: - audibleCoef (scalar) - camouflageCoef (scalar) - engineer (bool) - explosiveSpecialist (bool) - loadCoef (scalar) - medic (bool) - UAVHacker (bool) + Returns the current scale of given map control. - https://community.bistudio.com/wiki/getUnitTrait + https://community.bistudio.com/wiki/ctrlMapScale - Object getUnitTrait String + ctrlMapScale Control - unit getUnitTrait skill_name + ctrlMapScale ctrl - $Code$player getUnitTrait "Medic";$/Code$ + $Code$_control = ( findDisplay 12) displayCtrl 51; //Arma 3 + _scale = ctrlMapScale _control; //returns number from 1 to 0.001$/Code$ - global / undefined + undefined / undefined - Boolean/Number + Number + - getVariable + agent - Return the value of variable in the variable space assigned to various data types. In case of Alt Syntax usage in Arma 3, the default value will be returned if: - Requested variable is either undefined or nil - Variable namespace is null ( objNull, grpNull, etc.) - All available data types combinations: - Namespace getVariable String - Namespace getVariable Array (since Arma 2 1.60) - Object getVariable String - Object getVariable Array - Group getVariable String - Group getVariable Array - Team_Member getVariable String - Team_Member getVariable Array - Task getVariable String - Task getVariable Array (Since Arma 3 v1.67) - Location getVariable String - Location getVariable Array (Since Arma 3 v1.67) - Control getVariable String (since Arma 3 v1.55.133553) - Control getVariable Array (since Arma 3 v1.55.133553) - Display getVariable String (since Arma 3 v1.55.133553) - Display getVariable Array (since Arma 3 v1.55.133553) - When variable is set on Task, it is not actually set on task itself, but on FSM attached to the task. So if there is no FSM getVariable will not work. + Return a person for a given agent. - https://community.bistudio.com/wiki/getVariable + https://community.bistudio.com/wiki/agent - Namespace/Object/Display/Control/Group/Location/Task/Team_Member getVariable String - - Namespace/Object/Display/Control/Group/Location/Task/Team_Member getVariable Array + agent Team_Member - varspace getVariable name - - varspace getVariable [name, defaultValue] + agent teamMember - $Code$_thePublicVariable = _myTruck getVariable "myPublicVariable";$/Code$ - - $Code$_aLocalVariable = _myTruck getVariable ["myLocalVariable", ["Not set", _var]] select 1;$/Code$ - - $Code$for "_i" from 0 to 5 do { - _car = missionNamespace getVariable ("car" + str _i); - _car setDamage 0; - }; - // Sets damage of car0, car1,..., car5 to 0.$/Code$ - - $Code$myMissionVar = 2015; - missionNamespace getVariable "myMissionVar";//Returns 2015$/Code$ - - $Code$// WARNING when using dynamic default value: - missionNamespace getVariable ["var", 123 call fnc_abc]; - /// fnc_abc is always called even when var is defined$/Code$ - - $Code$// Get current value of a variable and if it is undefined, define it and get the defined value: - private _var = missionNamespace getVariable "varName"; - if ( isNil "_var") then - { - missionNamespace setVariable ["varName", 123]; - _var = 123; - }; - // _var here will contain current value of the variable varName$/Code$ - + - global / undefined + undefined / undefined - (August 13, 2016) - NOTE: Arma 2 ONLY! In Arma 3 this will return default value. - Warning: the alternative syntax returns undefined when the varspace is an object and that object is null. Example: - $Code$_test = objNull getVariable ["test","0"]; - systemChat _test;$/Code$ - Errors because _test is undefined. Tested in A2OA 1.63.131129 - Anything/Nothing - Anything + Object + - getVehicleCargo + safeZoneWAbs - Gets a list of vehicles loaded as cargo inside this vehicle. The returned array is in the order the cargo vehicles were added to containing vehicle. + Returns SafeZone width (of all monitors, in case there's more than one) - https://community.bistudio.com/wiki/getVehicleCargo + https://community.bistudio.com/wiki/safeZoneWAbs - getVehicleCargo Object + safeZoneWAbs - getVehicleCargo vehicle + safeZoneWAbs - $Code$// Blackfish with no cargo vehicles - _vehicleCargo = getVehicleCargo blackfish; //returns []$/Code$ - - $Code$// Blackfish with cargo vehicles loaded in the order quad_3, quad_1, quad_2 - _vehicleCargo = getVehicleCargo blackfish; //returns [quad_3, quad_1, quad_2]$/Code$ + $Code$_szW = safeZoneWAbs;$/Code$ undefined / undefined @@ -30323,119 +31935,119 @@ - Array + Number + - getWPPos + deActivateKey - Returns the position of a selected waypoint of a given group. Waypoints include only those which were placed in the mission editor. + Deactivates the given keyname for the current user profile. The keys are used to unlock missions or campaigns. + See keys, keysLimit and doneKeys in the description.ext file of the missions. - https://community.bistudio.com/wiki/getWPPos + https://community.bistudio.com/wiki/deActivateKey - getWPPos Array + deActivateKey String - getWPPos [group, index] + deActivateKey keyname - $Code$[_group1,1] setWPPos [200,600,0]; _pos = getWPPos [_group1,1]; - // returns [200,600,0]$/Code$ + $Code$deActivateKey "Mission04Key"$/Code$ - global / undefined + undefined / undefined - Array + Nothing + - getWeaponCargo + flagSide - Returns all weapons types and count from the cargo space + Returns Side of the local instance of the flag. A getter for setFlagSide. - https://community.bistudio.com/wiki/getWeaponCargo + https://community.bistudio.com/wiki/flagSide - getWeaponCargo Object + flagSide Object - getWeaponCargo object + flagSide flag - $Code$_content = getWeaponCargo carName;$/Code$ - - $Code$_content = getWeaponCargo ammoBoxName; - // Sample result returns: - [["arifle_Katiba_F","launch_B_Titan_short_F"],[2,1]]$/Code$ + $Code$_flagSide = flagSide flag;$/Code$ - global / undefined + global / local - Array + Side + - getWeaponSway + ctrlSetFocus - Returns current size of weapon sway of a given unit, in radians + Set the input focus on given control. - https://community.bistudio.com/wiki/getWeaponSway + https://community.bistudio.com/wiki/ctrlSetFocus - getWeaponSway Object + ctrlSetFocus Control - getWeaponSway unit + ctrlSetFocus controlName - $Code$_sway = getWeaponSway player ;$/Code$ + $Code$ctrlSetFocus _control$/Code$ undefined / undefined + (June 30, 2017) + This command seems to only work on controls that accept any input from keyboard or mouse. - Number + Nothing + - glanceAt + ctrlAutoScrollSpeed - Control what the unit is glancing at (target or Position ). - How frequently the unit is glancing there depends on behaviour. + Returns number of seconds to auto-scroll one line. -1 if auto-scroll is disabled. -2 if scrollbar not present. + Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. - https://community.bistudio.com/wiki/glanceAt + https://community.bistudio.com/wiki/ctrlAutoScrollSpeed - Object/Array glanceAt Object/Array + ctrlAutoScrollSpeed Control - unit glanceAt position + ctrlAutoScrollSpeed control - $Code$_someSoldier glanceAt _otherSoldier$/Code$ - - $Code$_otherSoldier glanceAt markerPos "markerOne"$/Code$ + $Code$_ctrlSpeed = ctrlAutoScrollSpeed _ctrlGroup;$/Code$ undefined / undefined @@ -30443,212 +32055,188 @@ - Nothing + Number + - globalChat + lbSelection - Types text to the global radio channel. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) + Returns Array of selected rows indices in the given listbox of style LB_MULTI (multi-selection). For single selection listbox use lbCurSel instead. - https://community.bistudio.com/wiki/globalChat + https://community.bistudio.com/wiki/lbSelection - Object globalChat String + lbSelection Control - unitName globalChat chatText + lbSelection control - $Code$_soldierOne globalChat "Show this text";$/Code$ - - $Code$driver vehicle player sideChat "sideChat"; - driver vehicle player globalChat "globalChat"; - driver vehicle player groupChat "groupChat"; - vehicle player vehicleChat "vehicleChat"; - driver vehicle player commandChat "commandChat"; - driver vehicle player customChat [1, "customChat"]; - systemChat "systemChat";$/Code$ + $Code$_indices = lbSelection _control;$/Code$ - global / local + undefined / undefined - In OFP 1.96, this command can be used by a Game_Logic unit, which will result in the text being displayed on screen without any indication of the side of radio source, or quotation marks. For example : gamelogic1 globalchat "hello world" will create the text hello world in the radio log. + (April 10, 2016) + This command works fine with listboxs of style LB_MULTI and should not be marked as obsolete as lbCurSel does not provide the same functionality. - Nothing + Array + - globalRadio + effectiveCommander - Sends the audio message to the global radio channel. The message is defined in CfgRadio in the description.ext file or config radio protocol. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). - Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. + Returns the effective commander of the vehicle. Effective commander is the player whom driver AI will listen to. So if in a tank there is a gunner and a commander and AI driver, if the effectiveCommander is gunner, then gunner pressing WASD will give AI orders to move. If gunner jumps out and then enters tank again, the effectiveCommander role most likely has changed to commander that remained in tank. Also the assignment seems to work on first come first served basis. - https://community.bistudio.com/wiki/globalRadio + https://community.bistudio.com/wiki/effectiveCommander - Object globalRadio String + effectiveCommander Object - unit globalRadio radioName + effectiveCommander vehicle - $Code$_soldierOne globalRadio "messageOne";$/Code$ - - $Code$player globalRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ + $Code$_commander = effectiveCommander tank;$/Code$ - global / local + undefined / undefined - (December 3, 2016) - To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: - $Code$ player globalRadio "#MySound.ogg";$/Code$ - Nothing + Object + - goggles + setBehaviour - Returns name of currently used goggles (for NVGoggles use hmd ). + Sets group behaviour mode. If a unit is given as argument, behaviour is set for the unit's group. Behaviour is one of: + "CARELESS" + "SAFE" + "AWARE" + "COMBAT" + "STEALTH". + See AIBehaviour for details of the effect of this command on AI units. For Arma 3 see Arma 3 AI Behavior. - https://community.bistudio.com/wiki/goggles + https://community.bistudio.com/wiki/setBehaviour - goggles Object + Group/Object setBehaviour String - goggles unit + groupName setBehaviour behaviour - $Code$_goggles = goggles assaultDiver; //G_Diving$/Code$ - - $Code$_goggles = goggles reconTeamLeader; //G_Shades_Black$/Code$ + $Code$_group1 setBehaviour "SAFE";$/Code$ - global / undefined + local / global + Warning! Since ArmA v.1.14 the command setBehaviour "COMBAT" do not work correctly any loger. + Units ( Groups ) which are using this behaviour and then get a move order, will not move to the given position. + + Although setBehaviour can be called on an individual unit, the entire group will be affected. + + If setting a behaviour on an individual unit is required, it can be achieved by creating a temporary group, use joinSilent to make the individual unit belong to that group, then change his behaviour, use joinSilent into the original group, then delete the temporary group. - String + Nothing + - goto + formationMembers - In SQS scripts only: Go to given label. - String argument is used here. - Be sure to use double quotes around label name in goto. Define the label with #. Note that Labels are not case sensitive and that labels are searched for from the top of the script, so multiple occurrences of a label will only result in the top most one ever being found. + Return list of units (drivers) in the formation. - https://community.bistudio.com/wiki/goto + https://community.bistudio.com/wiki/formationMembers - goto String + formationMembers Object - goto label + formationMembers person - + $Code$_drivers=FormationMembers _person$/Code$ + undefined / undefined - (August 4, 2006) - Notes from before the conversion: - This function works only inside of SQS script. - The search for labels always begins at the top of the script so that if there are multiple occurrences of a label the first occurrence will always be the one found. - Because of the searching order, it is faster to place loops which are executed often at the top of a script. - Labels are not case sensitive. - Loops which look something like the example below should be avoided as many of them could cause the mission to slow down: - #wait - if (condition) then { goto "wait"} - It is better to use the @ command to wait for a condition to be true, or put a small delay into the wait loop. - Example - While it is not required to include a delay in a loop, such a loop without a delay can cause the script to slow the game down, as the loop will be executed many times before the game engine interrupts the script. - Unless you really want the loop to execute multiple times during a frame, you should include a small delay. - You would need to have many scripts running for this to be a significant issue. - Deciding whether to use a script with a loop or a trigger or even a @ statement to detect a condition is a complicated matter and should be subject to experimentation. - - (August 4, 2006) - A goto command called within a forEach loop, will only execute a single jump to goto, once the forEach loop has finished: - { goto "wait"} forEach [0,1,2,3,4] - Nothing + Array + - groupChat + setFormationTask - Types text to the group radio channel. Must have assigned "ItemRadio" to see or transmit the messages. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) + Set the current task of the formation member. - https://community.bistudio.com/wiki/groupChat + https://community.bistudio.com/wiki/setFormationTask - Object groupChat String + Object setFormationTask String - unitName groupChat chatText + object setFormationTask task - $Code$_soldierOne groupChat "Show this text";$/Code$ - - $Code$driver vehicle player sideChat "sideChat"; - driver vehicle player globalChat "globalChat"; - driver vehicle player groupChat "groupChat"; - vehicle player vehicleChat "vehicleChat"; - driver vehicle player commandChat "commandChat"; - driver vehicle player customChat [1, "customChat"]; - systemChat "systemChat";$/Code$ - + - global / local + undefined / undefined + (16:57, 2 March 2007 (CET)) + The argument for task can be any String value. This can effectively be used to store a property in String format an retrieve it with formationTask in FSM scripts. By using it outside of FSM scripts you're risking to get it overwritten by other running FSM scripts. - Nothing + Nothing + - groupFromNetId + dynamicSimulationEnabled - Get group with given unique ID. For objects use objectFromNetId. As this command is MP only, you can use BIS_fnc_groupFromNetId, which extends the use to SP as well. + A getter for enableDynamicSimulation - https://community.bistudio.com/wiki/groupFromNetId + https://community.bistudio.com/wiki/dynamicSimulationEnabled - groupFromNetId String + dynamicSimulationEnabled Object/Group - groupFromNetId id + dynamicSimulationEnabled object - $Code$_group = groupFromNetId "4:45";$/Code$ + $Code$hint str dynamicSimulationEnabled _myObject;$/Code$ undefined / undefined @@ -30656,186 +32244,188 @@ - Group + Boolean + - groupIconSelectable + setWindDir - Return if groups icon raises onClick and onOver events. + Changes the wind direction smoothly during the given time (in seconds). A time of zero means there will be an immediate change. + NOTE : Effect is global only when executed on the server. On clients wind direction will sync to server value in a while. - https://community.bistudio.com/wiki/groupIconSelectable + https://community.bistudio.com/wiki/setWindDir - groupIconSelectable + Number setWindDir Number - groupIconSelectable + time setWindDir value - + $Code$60 setWindDir 180$/Code$ + - undefined / undefined + undefined / global + (April 12, 2014) + Seems to make wind [0,0] in MP. (ArmA 3 1.00) - Boolean + Nothing + - groupIconsVisible + setMarkerTypeLocal - Return group icons are visible. + Set marker type. See cfgMarkers for a list of standard markers. - https://community.bistudio.com/wiki/groupIconsVisible + https://community.bistudio.com/wiki/setMarkerTypeLocal - groupIconsVisible + String setMarkerTypeLocal String - groupIconsVisible + markerName setMarkerTypeLocal type - $Code$// HC bar active - if (isNil "BIS_HC_visible") then {BIS_HC_visible = groupIconsVisible}; - setGroupIconsVisible [true,true];$/Code$ + $Code$"MarkerOne" setMarkerTypeLocal "Warning";$/Code$ - undefined / undefined + undefined / local - Array + Nothing + - groupId + doTarget - Returns group name. + Order the given unit(s) to target the given target (without radio messages). - https://community.bistudio.com/wiki/groupId + https://community.bistudio.com/wiki/doTarget - groupId Group + Object/Array doTarget Object - groupId group + unit doTarget target - $Code$_name = groupId ( group player );$/Code$ + $Code$_ESoldier1 doTarget _WSoldier1;$/Code$ - global / undefined + local / global + It appears doTarget objNull can not be used to stop a unit targeting a previously assigned target. Using doWatch objNull will achieve the desired result. (ArmA v1.12Beta) + + (July 2, 2015) + To expand on ceeeb's note, commandWatch objNull will also unassign target; + + (March 28, 2017) + Targeting may not work as expected when trying to target a unit on the same side (friendly). - String + Nothing + - groupOwner + setMarkerShapeLocal - Returns ID of client to which the group is local. Can be run only from server. When called from client, it always returns 0 + Selects the shape (type) of the marker. + Shape can be "ICON", "RECTANGLE" or "ELLIPSE". - https://community.bistudio.com/wiki/groupOwner + https://community.bistudio.com/wiki/setMarkerShapeLocal - groupOwner Group + String setMarkerShapeLocal String - groupOwner group + markerName setMarkerShapeLocal shape - $Code$_clientID = groupOwner _someGroup;$/Code$ + $Code$"Marker1" setMarkerShapeLocal "RECTANGLE";$/Code$ - global / undefined + undefined / local - This scripting command must be executed on the server to work properly in multiplayer - Number + Nothing + - groupRadio + ASLToATL - Sends the audio message to the group radio channel. Must have assigned "ItemRadio" to send or receive the transmission. The message is defined in CfgRadio in the description.ext file or config radio protocol. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). - Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. + Converts a position from PositionASL to PositionATL - https://community.bistudio.com/wiki/groupRadio + https://community.bistudio.com/wiki/ASLToATL - Object groupRadio String + ASLToATL PositionASL - unit groupRadio radioName + ASLToATL pos - $Code$_soldierOne groupRadio "messageOne";$/Code$ - - $Code$player groupRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ + $Code$ASLToATL ( getPosASL player ) isEqualTo getPosATL player$/Code$ - global / local + undefined / undefined - (December 3, 2016) - To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: - $Code$ player groupRadio "#MySound.ogg";$/Code$ - Nothing + PositionATL + - groupSelectUnit + setGroupIcon - Selects a unit from player's group. If player is the leader, the effect of this command is similar to player pressing F1, F2, F3... buttons to highlight units in his squad, after which the unit command menu is shown. If leader is AI, player will get usual communication menu to interact with the leader. + Set group icons properties. - https://community.bistudio.com/wiki/groupSelectUnit + https://community.bistudio.com/wiki/setGroupIcon - Object groupSelectUnit Array + Group setGroupIcon Array - player groupSelectUnit [unit, select] + group setGroupIcon [id, icon, offset] - $Code$// After leaving menu, deselect all units (command menu is not opened - no selection) - { - player groupSelectUnit [_x, false ]; - } forEach ( groupSelectedUnits player );$/Code$ - - $Code$// Select all units when player is the leader: - { - player groupSelectUnit [_x, true ]; - } forEach units player ;$/Code$ - - $Code$// Open communication with group leader: - player groupSelectUnit [ leader player, true ];$/Code$ + $Code$_target setGroupIcon [_icon,"hc_selectedEnemy"]; + _target setGroupIcon [_icon,"flag"]; + _grp setGroupIcon [_iconsize,_iconsizeclass,_offset]; + _grp setGroupIcon [_newid,_icon,_offset]; + _grp setGroupIcon [_icon,_iconclass];$/Code$ undefined / undefined @@ -30843,587 +32433,771 @@ - Nothing + Nothing + - groupSelectedUnits + enableCopilot - Returns selected units in source group for normal commanding mode (individual units). For the High Command equivalent, see hcSelected. + Enables copilot actions. - https://community.bistudio.com/wiki/groupSelectedUnits + https://community.bistudio.com/wiki/enableCopilot - groupSelectedUnits Object + Object enableCopilot Boolean - groupSelectedUnits unit + vehicle enableCopilot enable - $Code$_selectedUnits = groupSelectedUnits player ;$/Code$ + $Code$if (! isCopilotEnabled myHeli) then { + myHeli enableCopilot true ; + };$/Code$ - undefined / undefined + local / global + (February 17, 2014) + Only enables the user actions, not who is in control - pilot can lock or unlock co-pilot controls in multiplayer while still true. + Actions: LockVehicleControl, UnlockVehicleControl, SuspendVehicleControl and TakeVehicleControl + You can use the Arma 3 Event Handler - ControlsShifted to detect Take and Release actions - Array + Nothing + - group + pixelGridBase - Returns the group a unit is assigned to. + Returns grid size based on screen resolution. - https://community.bistudio.com/wiki/group + https://community.bistudio.com/wiki/pixelGridBase - group Object + pixelGridBase - group object + pixelGridBase - $Code$_playerGrp = group player$/Code$ + $Code$_gridBaseHeight = pixelH * pixelGridBase ;$/Code$ - global / undefined + undefined / undefined - (August 19, 2006) - Few rules about group in OFP:R. - 1) When last man in group die or is moved to other group, group will be destroyed, and it can't be used anymore. - 2) 1st man joined to empty group will be group leader. - Group + Number + - grpNull + createDialog - A non-existing Group. To compare non-existent groups use isNull or isEqualTo : - grpNull == grpNull ; // false - isNull grpNull ; // true - grpNull isEqualTo grpNull ; // true + Create a dialog which is defined either in the mission's description.ext, in the campaign's description.ext or in the global resource.cpp. The given name has to be the class name used in one of these files. If another dialog is already opened, the desired dialog is created as a child dialog of the one already opened. - https://community.bistudio.com/wiki/grpNull + https://community.bistudio.com/wiki/createDialog - grpNull + createDialog String - grpNull + createDialog dialogName - $Code$! isNull grpNull ; // false$/Code$ - - $Code$str grpNull ; // NULL-group$/Code$ + $Code$_ok = createDialog "RscDisplayGame"; + if (!_ok) then { hint "Dialog couldn't be opened!"};$/Code$ - undefined / undefined + undefined / local + (July 29, 2017) + A user dialog created with createDisplay over mission display ( findDisplay 46) will stop display event handlers added to mission display from firing. However if it is created with createDialog then the event handlers continue to work. - Group + Boolean + - gunner + fadeRadio - Returns the gunner of a vehicle. + Causes a smooth change in the radio volume. The change duration is given by time, the target volume by volume. The default radio volume is 1.0. - https://community.bistudio.com/wiki/gunner + https://community.bistudio.com/wiki/fadeRadio - gunner Object + Number fadeRadio Number - gunner vehicle + time fadeRadio volume - $Code$(gunner _tank1) action ["getout",_tank1]$/Code$ + $Code$5 fadeRadio 0.1$/Code$ - global / undefined + undefined / local - (2 January, 2007) - The gunner command will only return a single gunner. If the vehicle has occupied, multiple turrets. See this discussion on the official forums, for an alternative: - Need an array with a vehicle's cargo units + (September 11, 2008) + Does not affect VON + + (September 13, 2016) + Also influences audibility of the missile warning in helicopters. - Object + Nothing + - gusts + setParticleCircle - Return the current gusts value. Scale is 0 to 1. + Updates particle source, creates particles in circle with given radius. Velocity is transformed and added to total velocity. Correspondence between CfgCloudlets class param names and command array of params: + $Code$particleSource setParticleCircle + [ + circleRadius, + circleVelocity + ];$/Code$ - https://community.bistudio.com/wiki/gusts + https://community.bistudio.com/wiki/setParticleCircle - gusts + Object setParticleCircle Array - gusts + particleSource setParticleCircle [radius, velocity] - $Code$_gustsval = gusts ;$/Code$ - + undefined / undefined - Number + Nothing + - HUDMovementLevels + itemsWithMagazines - Returns movement borders for HUD [min speed, max speed, min alt, max alt, min dir, max dir, position[x,y,z] or target] + Returns combined array including all unit's items and all unit's magazines. Loaded magazines such as currentMagazine, primaryWeaponMagazine, secondaryWeaponMagazine, handgunMagazine as well as assignedItems are excluded. - https://community.bistudio.com/wiki/HUDMovementLevels + https://community.bistudio.com/wiki/itemsWithMagazines - HUDMovementLevels + itemsWithMagazines Object - HUDMovementLevels + itemsWithMagazines unit - $Code$HUDMovementLevels;//[0,0,0,0,0,0,[0,0,0]]$/Code$ + $Code$itemsWithMagazines player + //is essentially the same as + items player + magazines player [ + "FirstAidKit",//item + "30Rnd_65x39_caseless_mag",//magazine + "16Rnd_9x21_Mag",//magazine + "Chemlight_green",//magazine + "HandGrenade",//magazine + "ToolKit",//item + "MineDetector"//item + ]$/Code$ - undefined / undefined + global / undefined - Array + Array + - halt + goggles - Stops the program into a debugger. In retail version using halt results in error. + Returns name of currently used goggles (for NVGoggles use hmd ). - https://community.bistudio.com/wiki/halt + https://community.bistudio.com/wiki/goggles - halt + goggles Object - halt + goggles unit - $Code$? _DbugWanted :halt$/Code$ + $Code$_goggles = goggles assaultDiver; //G_Diving$/Code$ + + $Code$_goggles = goggles reconTeamLeader; //G_Shades_Black$/Code$ - undefined / undefined + global / undefined - Nothing + String + - handgunItems + worldToModelVisual - Returns array with all items assigned to the handgun. This command is used for infantry weapons only. + Converts position from world space to object model space in render time scope. - https://community.bistudio.com/wiki/handgunItems + https://community.bistudio.com/wiki/worldToModelVisual - handgunItems Object + Object worldToModelVisual Array - handgunItems unit + object worldToModelVisual worldPosition - $Code$handgunItems player ; - /* - [ - "muzzle_snds_L",//silencer - "",//laser - "",//optics - ""//bipod - ] - */$/Code$ + $Code$_relPos = myObject worldToModelVisual [0,0,0];$/Code$ + + $Code$_relPos = player worldToModelVisual position car;$/Code$ + + $Code$_relPos = car worldToModelVisual [12000,5000];$/Code$ + + $Code$_relPos = unit worldToModelVisual position tank;$/Code$ - global / undefined + undefined / undefined - Array + Array + - handgunMagazine + ppEffectEnabled - Returns either single element array, containing class name of currently loaded in the handgun magazine, or an empty array if unit has no handgun or handgun is not loaded. This command is used for infantry weapons only. + Checks whether given post process effect is enabled - https://community.bistudio.com/wiki/handgunMagazine + https://community.bistudio.com/wiki/ppEffectEnabled - handgunMagazine Object + ppEffectEnabled Number - handgunMagazine unit + ppEffectEnabled effect - $Code$hint handgunMagazine player ; //["16Rnd_9x21_Mag"]$/Code$ - - $Code$_array = handgunMagazine player ; - if ( count _array 0) then { - hint ("Handgun is loaded with " + (_array select 0) + "!"); - } else { - if ( handgunWeapon player != "") then { - hint "Handgun is not loaded!"; - } else { - hint "Player doesn't have a handgun!"; - }; - };$/Code$ + $Code$_enabled = ppEffectEnabled _hndl;$/Code$ - global / undefined + undefined / undefined - Array + Boolean + - handgunWeapon + useAISteeringComponent - Returns the name of a unit's handgun (an empty string if there is none). + Enable the new AI driving, used to test the old and new AI driving. - https://community.bistudio.com/wiki/handgunWeapon + https://community.bistudio.com/wiki/useAISteeringComponent - handgunWeapon Object + useAISteeringComponent Boolean - handgunWeapon unit + useAISteeringComponent state - $Code$hint handgunWeapon player ; //"hgun_P07_F"$/Code$ + $Code$useAISteeringComponent true$/Code$ - global / undefined + undefined / global - String + Nothing + - handsHit + setCombatMode - Checks if a soldier's hands are hit, which results in inaccurate aiming. + Set group combat mode (engagement rules). + Mode may be one of: + "BLUE" = Never fire + "GREEN" = Hold fire - defend only + "WHITE" = Hold fire, engage at will + "YELLOW" = Fire at will + "RED" = Fire at will, engage at will + See Arma AI Engagement rules for more informations on combat modes. - https://community.bistudio.com/wiki/handsHit + https://community.bistudio.com/wiki/setCombatMode - handsHit Object + Object/Group setCombatMode String - handsHit unitName + groupName setCombatMode mode - $Code$? (handsHit player == 1) : player globalChat "Ouch! Don't shoot at my hands dammit!"$/Code$ + $Code$_group1 setCombatMode "BLUE";$/Code$ - global / undefined + local / global - Number + Nothing + - hasInterface + knowsAbout - Returns true if the computer has an interface (a real player). False for a dedicated server or for a headless client. + Checks if a group or a side knows about target. If who is a unit, unit's group is considered, if who is a vehicle, commander's group is considered. - https://community.bistudio.com/wiki/hasInterface + https://community.bistudio.com/wiki/knowsAbout - hasInterface + Object/Group knowsAbout Object + + Side knowsAbout Object - hasInterface + who knowsAbout target + + side knowsAbout target - $Code$headless = !( hasInterface || isDedicated );$/Code$ + $Code$_kv = _soldierOne knowsAbout _jeepOne;$/Code$ - $Code$_isHC = ! hasInterface && ! isDedicated ;$/Code$ + $Code$_kv = ( side player ) knowsAbout _target;$/Code$ - undefined / undefined + global / undefined - (December 21, 2014) - $Code$ if ( isDedicated ) then { - //run on dedicated server only - }; - if ( isServer ) then { - //run on dedicated server or player host - }; - if ( hasInterface ) then { - //run on all player clients incl. player host - }; - if (! isDedicated ) then { - //run on all player clients incl. player host and headless clients - }; - if (! isServer ) then { - //run on all player clients incl. headless clients but not player host - }; - if (! hasInterface ) then { - //run on headless clients and dedicated server - }; - if (! hasInterface && ! isDedicated ) then { - //run on headless clients only - };$/Code$ + (August 4, 2006) + Notes from before the conversion: + With Resistance (1.91) : No matter what class of unit the target is and no matter what the skill/class of the enemy AI, the magic 'knowsAbout' number is 0.105. + With CWC (1.46) : No matter what class of unit the target is and no matter what the skill/class of the enemy AI, the magic 'knowsAbout' number is 0.7. + What this means is, the AI will not fire on an enemy soldier until his 'knowsAbout' level of that enemy has reached the 'magic number' or higher. + This suggests that the knowsabout level must reach the magic threshold before a unit knows if another unit is an enemy or a friendly unit. + Triggers and knowsabout level: "Detected by xxx" triggers also follow the above rules. For a detected trigger to be set off, the knowsAbout level must reach the magic number. + Also... As soon as An AI unit gets hit with a bullet his knowsAbout level for the unit that shot him will instantly jump to 1.5, even if the shooter is 1000m away. Vice versa is also true. If An AI soldier's knowsAbout level for an enemy is 0.7 and the soldier fires and hits the enemy, his knowsAbout level about the enemy will instantly jump to 1.5. Some editors have found, whilst using this command over the years, that the following characteristics have cropped up: + AI enemies have a very limited amount of peripheral vision, it's not nearly as good as a human player's. A target must be in front of the unit for him to be noticed, so if you sprint right behind an enemy, this value doesn't increase. + Depending on the units skill level, it can take a little time for the unit to notice a target. So if you run right past a unit, this value might not increase. + Bushes between the unit and the target seem to have little effect on this value, and trees definitely have no affect. You may be in a forest, and can't see the unit, but he can see you. + MP Note knowsAbout returns a viable result only if left-hand parameter unit is local. + + (January 15, 2007) + In OFP v1.96, KnowsAbout return values range from 0 to 4. + All units in a group have equal knowsAbout for any given target. All units in a group always return knowsAbout 4 about each other. This suggests groups share a single knowledge base. + Without any contact with the target, the knowsAbout value decays at a linear rate so that it halves over 120 seconds. After this time is up knowsAbout drops instantly to 0. + If the distance between the all of unit's group and the target exceeds the viewdistance setting, knowsAbout instantly drops to 0. This is not changed by fog or daylight. + Note that in OFP unit see all the targets that his group members see. The data is processed between teammembers freely. + + the magic 'knowsAbout' number is 0.105. It's not that simple.Maybe true for infantry but not all vehicles. "Reveal" command sets knowsAbout to 1, but planes still won't fire at soldiers on the ground. There's only one known way to pass through this - designate target with another fake infantry unit near the target. As soon as this fake unit see the target knowsAbout lifts up to 2.5-4 and even single enemy soldiers are attacked rom the air (of course if plane has suitable munition :)) + + (July 05, 2009) + In ArmA (other not tested), KnowsAbout value will stay at its highest value during approximately 2-3 min and then reinitialized. + + (January 14, 2012) + Notes are for OA 1.60 : + The KnowsAbout value drops immediately back to zero, if the distance between both units is larger than the local viewDistance value. + After 110 seconds without (visible?) contact, the KnowsAbout value drops to zero again. While it seemed to take longer the higher the KnowsAbout value is (at least for a value of 4 it took almost six minutes at one point), I was unable to reproduce/confirm that. It is 110 seconds no matter how high the KnowsAbout value it seems. + + (June 13, 2012) + By Suma ( source ): + All friendly units within a view distance to each unit [are revealed (to the player? or each friendly?)] on the mission start. The code is half broken, as it does not make the units known, it only sets the "accuracy" value for them. Note: This is not affecting enemy units at all. + + (March 27, 2013) + Arma-II OA (1.62.101.480 @ACE), tests with infantry: + It is still true, that the command returns values between 0 (lowest) and 4 (most). Freshly Spotted units will have at least 1.5, slowly decreasing when the target disappeared. + The following Table shows my test results on a clear day at Takistan using the Vector. Please note that the returned values vary considerably depending on weather and time. Moonlight however seems to not have any considerable effect. + 12:00, sunlight, clear sky + Distance + knowsAbout + 1530 + 1.5 + 1370 + 1.5 + 1250 + 1.5 + 1135 + 1.5 + 1055 + 1.52 + 1022 + 1.64 + 990 + 1.74 + 833 + 2.5 + 720 + 3.37 + 600 + 3.81 + 505 + 3.86 + 400 + 3.92 + 380 + 4 + 365 + 4 + 21:00, bright half moon, clear sky + Distance + knowsAbout + 285 + 1.5 + 120 + 1.5 + 88 + 1.89 + 75 + 2.3 + 61 + 3.9 + 23:00, pitch black, clear sky, NVG on + Distance + knowsAbout + 600 + 1.5 + 487 + 1.5 + 390 + 1.5 + 289 + 2.22 + 278 + 2.4 + + (May 31, 2014) + Can also use SIDE in place of UNIT. For example: + $Code$EAST knowsAbout player ;$/Code$ - Boolean + Number - Number + - hasPilotCamera + titleFadeOut - Returns true if the object airplane or helicopter has a pilotCamera. + Terminate the title effect and set duration of the fade out phase to the given time. - https://community.bistudio.com/wiki/hasPilotCamera + https://community.bistudio.com/wiki/titleFadeOut - hasPilotCamera Object + titleFadeOut Number - hasPilotCamera object + titleFadeOut duration - $Code$hasPilotCamera vehicle player$/Code$ + $Code$titleText ["Hi", "plain"]; titleFadeOut 2$/Code$ - global / undefined + undefined / undefined - Boolean + Nothing + - hasWeapon + magazineTurretAmmo - Checks if a unit has the given weapon. + Returns ammo count of given type from given turret + Broken when vehicle has multiple magazines of the same type - https://community.bistudio.com/wiki/hasWeapon + https://community.bistudio.com/wiki/magazineTurretAmmo - Object hasWeapon String + Object magazineTurretAmmo Array - unitName hasWeapon weaponName + vehicle magazineTurretAmmo [magazineClass, turretPath] - $Code$?!( player hasWeapon "M16") : player addWeapon "M16"$/Code$ + $Code$vehicle player magazineTurretAmmo ["cls", [0]]$/Code$ - global / undefined + undefined / undefined - (September 11, 2014) - This command doesn't work for Items in Arma 3, use this instead. - $Code$" ItemGPS " in ( items player + assignedItems player ) OR ' ItemGPS ' in ( items player + assignedItems player ) $/Code$ - Returns true if unit has gps in inventory, assigned or not. - Boolean + Number + - hcAllGroups + actionKeysNames - Returns selected groups in high command. + Returns a list of button names assigned to the given user action. You can find the action names in config class ControllerSchemes or user action names. - https://community.bistudio.com/wiki/hcAllGroups + https://community.bistudio.com/wiki/actionKeysNames - hcAllGroups Object + actionKeysNames String + + actionKeysNames Array - hcAllGroups unit + actionKeysNames userAction + + actionKeysNames [userAction, maxKeys] + + actionKeysNames [userAction, maxKeys, inputDevicePriority] - + $Code$_list = actionKeysNames "ReloadMagazine"; //"R"$/Code$ + undefined / undefined + (20:14, 20 January 2010 (CET)) + The return type is a stacked string. A string inside a string. To compare use first single and inside double quotes: + if ((actionKeysNames "User1") == '"W"') then... + + (October 26, 2014) + inputDevicePriority 'Controler' is not a spelling mistake in description. - Array + String - String + - hcGroupParams + admin - Returns parameters describing group in high command bar. - Return value is [string, float[4]] + This is dedicated server command, which queries the admin state of any client on the network by their client ( owner ) id. Possible results are: + 1 - client is admin that is voted in + 2 - client is admin that is logged in + In all other cases it returns 0. To self check the admin state of a local client, use BIS_fnc_admin. - https://community.bistudio.com/wiki/hcGroupParams + https://community.bistudio.com/wiki/admin - Object hcGroupParams Group + admin Number - unit hcGroupParams group + admin ownerID - + $Code$_isLoggedInAdmin = admin 3 == 2;$/Code$ + + $Code$_adminState = admin owner unit1;$/Code$ + undefined / undefined + This scripting command must be executed on the server to work properly in multiplayer - Array + Number + - hcLeader + setObjectTexture - Returns group's high command commander. + Textures object selection with texture named in array. + Array has the form [selectionNumber, "Texture"]. + The selection number is defined through the hiddenselection []={} array in the vehicle's config (starting with 0). + NOTES : + Not all objects could be textured this way. To find out, run getObjectTextures command on an object. Empty array [] usually indicates it cannot be textured. + All textures must have resolution 2^x / 2^y (e.g. 16 / 16, 16 / 32, 64 / 256, 512 / 512, etc). The largest texture size commonly supported by graphics cards and RV engine is 4096x4096 + Supported formats:.pac,.paa,.jpg,.jpeg,.ogg,.ogv - https://community.bistudio.com/wiki/hcLeader + https://community.bistudio.com/wiki/setObjectTexture - hcLeader Group + Object setObjectTexture Array - hcLeader group + object setObjectTexture [selectionNumber,texture] - $Code$_leader = hcLeader groupName;$/Code$ + $Code$_objectname setObjectTexture [0, "\pboname\texture.paa"]; + _objectname setObjectTexture [1, "\pboname\texture2.paa"];$/Code$ + + $Code$_obj setObjectTexture [0, "#(rgb,8,8,3)color(1,0,0,1)"];$/Code$ + + $Code$_obj setObjectTexture [0, "#(argb,512,512,1)r2t(rendersurface,1.333)"];$/Code$ + + $Code$// When applying custom texture in Editor on vehicles that have randomization enabled ( Arma 3 Assets ), disable randomization first: + this setVariable ["BIS_enableRandomization", false ]; + this setObjectTexture [0,"#(rgb,8,8,3)color(1,0,0,1)"];$/Code$ - undefined / undefined + global / local - (September 2, 2009) - hcLeader returns 'NULL_OBJECT' if you use it on your HC commander's group in a HC setup with subordinates. It seems to work as expected if you don't use subordinates. + (Aug 4, 2006) + In MP this command has only local effect. If you want to change a texture on all clients, you have to execute this command on each client (or setObjectTextureGlobal ). This command has also a bug: when a saved game is loaded the texture you have set will disappear and needs to be reset. + + (December 19, 2009) + Instead of bitmaps, procedural textures can be used. + The syntax for those is #(argb,8,8,3)color(R,G,B,A), where R,G,B stands for Red, Green, Blue, and A stands for Alpha, all values can be anything between 0 and 1 (including decimals). e.g. + $Code$_obj setObjectTexture [0,'#(argb,8,8,3)color(0,1,0,1)']$/Code$ + would color myObj in flat green. See Procedural Textures for more details. + + (August 25, 2014) + Also works with absolute path and.jpg files. + $Code$_obj setObjectTexture [0, "C:\Folder\Folder\Texture.paa"]; + _obj setObjectTexture [0, "C:\Folder\Folder\Texture.jpg"];$/Code$ + Texture can also be blank: + $Code$_obj setObjectTexture [2,""];$/Code$ + This will make the texture selection invisible on certain units without an error message. In some cases this is a desirable effect + + (March 18, 2015) + It is also possible to apply texture to unit's backpack, as it also has hidden selection (unfortunately does not work for vests) + $Code$(backpackContainer player) setObjectTexture [0,'#(argb,8,8,3)color(0,0,0,1)']$/Code$ + Also keep in mind that player's custom texture is being reset when you open BIS Arsenal (even without changing any gear) + + (May 13, 2015) + You can also use the gameinternal skins: List of MH9 Skins $Code$_obj setObjectTexture [0, "\a3\air_f\heli_light_01\data\skins\heli_light_01_ext_digital_co.paa"];$/Code$ + + (October 24, 2016) + Sometimes it could be necessary to set default material on an object for the texture to take effect: + $Code$_block = createVehicle ["Land_VR_Block_02_F", player getPos [20, getDir player ], [], 0, "CAN_COLLIDE"]; + _block setObjectMaterial [0, "\a3\data_f\default.rvmat"]; + _block setObjectTexture [0, "#(rgb,8,8,3)color(1,0,0,1)"];$/Code$ + Courtesy of Larrow - Object + Nothing + - hcRemoveAllGroups + ctrlEnable - Remove all groups from unit's high command bar. + Enable or disable a control of the currently active user dialog. Disabled controls cannot be clicked onto. + Read Dialog Control for more information about user dialogs and controls. - https://community.bistudio.com/wiki/hcRemoveAllGroups + https://community.bistudio.com/wiki/ctrlEnable - hcRemoveAllGroups Object + ctrlEnable Array + + Control ctrlEnable Boolean - hcRemoveAllGroups unit + ctrlEnable [idc, enable] + + controlName ctrlEnable enable - + $Code$ctrlEnable [100, false]$/Code$ + + $Code$_ctrl ctrlEnable false$/Code$ + - undefined / undefined + local / local + (July 20, 2017) + Please do note that enabled controls can gain focus upon click. Therefore do not enable background controls or else they will cover any controls on top of them. + As a general rule of thumb, enabled controls should only be already on the top of the GUI. - Nothing + Nothing - Nothing + - hcRemoveGroup + teamSwitchEnabled - Removes group from unit's high command bar. + Check if Team Switch is currently enabled. + Team Switch is enabled by default. - https://community.bistudio.com/wiki/hcRemoveGroup + https://community.bistudio.com/wiki/teamSwitchEnabled - Object hcRemoveGroup Group + teamSwitchEnabled - unit hcRemoveGroup group + teamSwitchEnabled @@ -31433,54 +33207,58 @@ - Nothing + Boolean + - hcSelectGroup + setGroupIconParams - Select given group in high command bar. + Set group icons parameters. [color,string,float,bool] - https://community.bistudio.com/wiki/hcSelectGroup + https://community.bistudio.com/wiki/setGroupIconParams - Object hcSelectGroup Array + Group setGroupIconParams Array - unit hcSelectGroup array + group setGroupIconParams properties - + $Code$_grp setGroupIconParams [_color,_text,_scale,_visible]; + _grp setGroupIconParams [[0,0,0,0],"",1,false];$/Code$ + undefined / undefined - Nothing + Nothing + - hcSelected + tvSetPictureColorDisabled - Returns selected groups in high command. + Sets the color of left picture of a tree item defined by path when item is disabled - https://community.bistudio.com/wiki/hcSelected + https://community.bistudio.com/wiki/tvSetPictureColorDisabled - hcSelected Object + Control tvSetPictureColorDisabled Array - hcSelected unit + control tvSetPictureColorDisabled [path, color] - $Code$array = hcSelected unit;$/Code$ + $Code$_control tvSetPictureColorDisabled [[0], [1,0,1,1]]$/Code$ undefined / undefined @@ -31488,62 +33266,60 @@ - Array + Nothing + - hcSetGroup + waypoints - Add group to unit's high command bar. - Array parameters are group, group-name and team (teammain, teamred, teamgreen, teamblue, teamyellow). - Group is the only necessary parameter. + Returns an array of waypoints for the specified unit/group. - https://community.bistudio.com/wiki/hcSetGroup + https://community.bistudio.com/wiki/waypoints - Object hcSetGroup Array + waypoints Group - unit hcSetGroup array + waypoints groupName - $Code$unit hcSetGroup [group, "HQ", teamred];$/Code$ + $Code$waypoints player ;$/Code$ - $Code$player hcSetGroup [group];$/Code$ + $Code$_wPosArray = waypoints group10; + // could return [[EAST 1-1-A,0],[EAST 1-1-A,1],[EAST 1-1-A,2]]$/Code$ - undefined / undefined + global / undefined - Nothing + Array + - hcShowBar + speed - Shows or hides high command bar. - There must be some groups under HC command to show HC bar. + Object speed (in km/h). Returns relative speed of given object along Y axis. An equivalent to: 3.6 * ( velocityModelSpace _obj select 1) - https://community.bistudio.com/wiki/hcShowBar + https://community.bistudio.com/wiki/speed - hcShowBar Boolean + speed Object - hcShowBar bool + speed object - $Code$hcShowBar true ;$/Code$ - - $Code$hcShowBar false ;$/Code$ + $Code$if ( speed _truck1 = 100) then { hint "You're going too fast!"};$/Code$ undefined / undefined @@ -31551,1431 +33327,1266 @@ - Nothing + Number + - hcShownBar + turretOwner - Return true if the high command bar is shown/active. + Returns id of the owner of the turret. Server only. Returns 0 on non-server and SP. + Some info on turrets: A vehicle turret will change locality when player gunner gets in it, just like vehicle changes locality when player driver gets in it. Many commands for turrets work only where turret is local. When gunner leaves turret it is supposed to change locality to the locality of the vehicle. A vehicle can have one owner while turrets have different owners. - https://community.bistudio.com/wiki/hcShownBar + https://community.bistudio.com/wiki/turretOwner - hcShownBar + Object turretOwner Array - hcShownBar + vehicle turretOwner turretPath - $Code$if ( hcShownBar ) then { hint "HC bar is active";};$/Code$ + $Code$_ownerId = vehicle player turretOwner [0];$/Code$ - undefined / undefined + global / undefined + This scripting command must be executed on the server to work properly in multiplayer - Boolean + Number + - headgear + setPosASL - Returns headgear of unit. + Sets the object position above sea level. The pos array uses the PositionASL format. - https://community.bistudio.com/wiki/headgear + https://community.bistudio.com/wiki/setPosASL - headgear Object + Object setPosASL Array - headgear unit + object setPosASL pos - $Code$hint headgear player ; //H_HelmetB$/Code$ + $Code$player setPosASL [ getPosASL player select 0, ( getPosASL player select 1) + 10, getPosASL player select 2];$/Code$ + + $Code$this setPosASL [ position this select 0, position this select 1, 9]; //[ X, Y, Z]$/Code$ - global / undefined + global / global - String + Nothing + - hideBody + setText - Hides dead body of the given unit. After a short delay, the body slowly sinks into the ground. After awhile, when group of the unit becomes grpNull, the body gets deleted and becomes objNull. If applied to alive unit, nothing happens until unit dies, then the unit's body gets hidden. If a dead unit is human player, the body is hidden but not deleted until player respawns. + Sets the text associated with a location. This text will be displayed on the game map at the location's position. - https://community.bistudio.com/wiki/hideBody + https://community.bistudio.com/wiki/setText - hideBody Object + Location setText String - hideBody unit + location setText text - $Code$hideBody player1;$/Code$ + $Code$myLocation setText "Rahmadi Village"$/Code$ - local / global + undefined / undefined - Nothing + Nothing + - hideObjectGlobal + setVelocity - This command is designed for MP. Hides object on all connected clients as well as JIP. Call on the server only. Can be used on all objects with class names, i.e. ( typeOf object != ""). In SP this command behaves just like hideObject. + Set velocity (speed vector) of a vehicle. Units are in metres per second. - https://community.bistudio.com/wiki/hideObjectGlobal + https://community.bistudio.com/wiki/setVelocity - hideObjectGlobal Object - - Object hideObjectGlobal Boolean + Object setVelocity Array - hideObjectGlobal object - - object hideObjectGlobal hidden + vehicleName setVelocity [x, y, z] - $Code$hideObjectGlobal nearestBuilding [2500,2500,0];$/Code$ + $Code$_truck1 setVelocity [20, 0, 0];$/Code$ - $Code$objectname hideObjectGlobal true;$/Code$ + $Code$// Advanced method used for relative acceleration: + _vel = velocity _vehicle; + _dir = direction _vehicle; + _speed = 10; comment "Added speed"; + _vehicle setVelocity [ + (_vel select 0) + ( sin _dir * _speed), + (_vel select 1) + ( cos _dir * _speed), + (_vel select 2) + ];$/Code$ - global / global + local / global - This scripting command must be executed on the server to work properly in multiplayer - - (June 27, 2015) - hideObject and hideObjectGlobal disable object collision in addition to rendering. A3 1.45.131175 - (tested by hiding buildings and running through, driving through, flying through, and shooting through where the building used to be) - - (September 1, 2016) - As of A3 1,62.134494 running hideObjectGlobal in big loop may cause some objects not to be hidden for a players already connected or passed JIP. To avoid players rendering desync consider running that in preInit schedule of a server. - - (August 7, 2017) - In A3 1.72.142342 when you hide object via hideObjectGlobal, model sounds still be audible. - For e.g. if you delete apex house from map, you still hear a conditioner sound at this spot + (20 Jun, 2014) + (ArmA3 1.22) setVelocity will be affected by setDir and setVectorDirAndUp. So use it after them. - Nothing - Nothing + Nothing + - hideObject + setOwner - Hide entity. Can be used on soldiers and vehicles, also on static objects. + From server machine, change the ownership of an object to a given client. Returns true if locality was changed. + Since Arma 3 v1.40, this command should not be used to transfer ownership of units with AI ( agents are an exception to this rule). + Using command in an unintended way will display an on-screen warning and log a message to.rpt file. + To transfer ownership of all AI units in a group properly, use setGroupOwner instead. - https://community.bistudio.com/wiki/hideObject + https://community.bistudio.com/wiki/setOwner - hideObject Object - - Object hideObject Boolean + Object setOwner Number - hideObject object - - object hideObject hidden + object setOwner clientID - $Code$hideObject unitName;$/Code$ + $Code$_someObject setOwner 12;$/Code$ - $Code$objectName hideObject true;$/Code$ + $Code$_someObject setOwner ( owner _playerObject);$/Code$ - global / local + undefined / undefined - (July 15, 2010) - This command will hide a unit, but he will still shoot enemies. Unit will be invisible, but weapon muzzle are visible. - - Use MP framework to activate this comand on all players from server or any other maschine - $Code$_nic = [nil, mantohide, "per", rHideObject, true ] call RE; //In A3 use hideObjectGlobal instead.$/Code$ - - you can use code as in example 2, where true = ON and false = OFF, if using it like in example 1, you can only turn it ON - - using this locally causes the player/object disappear only locally; has to be executed serverside if used in MP. Hidden Vehicles still emit smoke/rotor blade dust and (probably) still emit engine sounds. Usefull for creating objects the map-creator doesn't want to be seen, like Units that protect a certain Area (like a safe-zone) against teamkillers or enemy units. - - The above comment is partially incorrect, if the effects of the command are local then it must be executed in every machine so it has global effect. If it is run only on the server machine, it will only be hidden on the server, while clients still see it. - - (March 5, 2014) - As of today this now finally has a Global counterpart, just released on the Stable branch. Added it's link under See also. - - (October 30, 2014) - When used on player, it only has an effect on third person mode. First person LOD is still visible. (A3 Dev 1.33) + This scripting command must be executed on the server to work properly in multiplayer - (June 27, 2015) - hideObject and hideObjectGlobal disable object collision in addition to rendering. A3 1.45.131175 - (tested by hiding buildings and running through, driving through, flying through, and shooting through where the building used to be) + (January 7, 2015) + The ownership can only be given from server to client. For some reason the server cannot return ownership back with this command. This is fixed in Arma 3 1.40 - (January 26, 2016) - Sometimes it´s easier to teleport the object about 100m under the ground (also JiP Support): - $Code$_obj setPosATL [getPosATL _obj select 0, getPosATL _obj select 1, (getPosATL _obj select 2)-100];$/Code$ - And to unhide: - $Code$_obj setPosATL [getPosATL _obj select 0, getPosATL _obj select 1, (getPosATL _obj select 2)+100];$/Code$ + (August 22, 2017) + NOTE : There are some interesting behaviour about the specific owner digits like 0 -2 and 2 : + 1. Any mission objects (generated from SQM) initially have 0 owner state, but it is not local to ANYONE (0) like it is expected to be, but actually only to a SERVER (2). You can't make any object owner to be 0 once it was changed. + 2. Trying to change ownership to any negative digit will always result in attempt to transfer ownership to SERVER (2). Once it is unit (non-agent) it will fail and revert* to initial ownership. + 3. *Changing ownership of a unit (non-agent) actually gives a result for a brief time after this action is performed. What actually happens next - ownership is getting reverted with a message to RPT of a server. This can be seen by reading results of (owner _object) in really fast cycle. - Nothing - Nothing + Boolean + - hideSelection + lnbDeleteRow - Hides or enables the given selection for the object + Removes row with the given index from the given listbox or combobox. - https://community.bistudio.com/wiki/hideSelection + https://community.bistudio.com/wiki/lnbDeleteRow - object hideSelection Array + Control lnbDeleteRow Number - object hideSelection [selection, hidden] + _ctrl lnbDeleteRow row - + $Code$_ctrl lnbDeleteRow 1;$/Code$ + - local / global + undefined / undefined - (April 28, 2016) - Only seems to work for objects created with createSimpleObject, and will only work for certain selections. + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Nothing + Nothing + - hintCadet + enableAttack - Shows a text hint only when in cadetMode. - The text can contain several lines. \n is used to indicate the end of a line. + Set if leader can issue attack commands to the soldiers in his group. - https://community.bistudio.com/wiki/hintCadet + https://community.bistudio.com/wiki/enableAttack - hintCadet String + Object/Group enableAttack Boolean - hintCadet text + group enableAttack enable - $Code$hintCadet "Press W to move forward";$/Code$ + $Code$_group1 enableAttack true$/Code$ - undefined / local + local / global - hintCadet can be used with formatting like this: - $Code$ hintCadet format ["Hello %1", player ]$/Code$ - Nothing + Nothing + - hintC + soundVolume - Displays attractive hint in the center of the screen. Player control is taken away until user presses "Continue". After user confirmation, the content of the hintC is repeated again in a normal hint. This type of hint can also have a title. It is also possible to drag this type of hint around the screen. + Check current sound volume (set by fadeSound ). - https://community.bistudio.com/wiki/hintC + https://community.bistudio.com/wiki/soundVolume - hintC String - - String hintC Array - - String hintC Structured_Text - - String hintC String + soundVolume - hintC content - - title hintC [content1, content2,] - - title hintC content - - title hintC content + soundVolume - $Code$hintC "Press W to move forward";$/Code$ - - $Code$// Same as the above in Arma3 but without second hint displayed: - hintC "Press W to move forward"; - hintC_EH = findDisplay 57 displayAddEventHandler ["unload", { - 0 = _this spawn { - _this select 0 displayRemoveEventHandler ["unload", hintC_EH]; - hintSilent ""; - }; - }];$/Code$ - - $Code$"Instructions" hintC [ - "Press W to move forward.", - "Press S to move backwards.", - "Use the mouse to turn right or left.", - "Press V for weapon sights." - ];$/Code$ - - $Code$// Same as the above in Arma3 but without second hint displayed: - "Instructions" hintC [ - "Press W to move forward.", - "Press S to move backwards.", - "Use the mouse to turn right or left.", - "Press V for weapon sights." - ]; - hintC_arr_EH = findDisplay 72 displayAddEventHandler ["unload", { - 0 = _this spawn { - _this select 0 displayRemoveEventHandler ["unload", hintC_arr_EH]; - hintSilent ""; - }; - }];$/Code$ - - $Code$_separator1 = parseText " br / ------------------------ br / "; - _image = "\ca\ui\textures\aus_flag.paa"; - _txt = composeText [ image _image, "Heading Text", _separator1, "Content"]; - "" hintC _txt;$/Code$ + $Code$_vol = soundVolume$/Code$ - undefined / local + undefined / undefined - This command must be executed after mission start. If you place it into init.sqs or init field of some unit, it will not work. Just add a little delay (~0.001) and the place the command. - - To display multiple messages after another you have to add a small delay in between. Otherwise only the first message will be displayed. hintC "foo"; sleep 0.1; hintC "bar"; Without a sleep statement hintC will not suspend the script it has been called from. - - HintC can be used with formatting like this: HintC format["Hello %1",player]. - - (March 19, 2015) - "Titled" hintC all use display #72 while "untitled" one uses display #57. If you are trying examples in Arma 3 debug console, add little delay like this: $Code$[] spawn {sleep 0.5;....your example code goes here...};$/Code$ or no hintC will be displayed. - Nothing - Nothing - Nothing - Nothing + Number + - hintSilent + showWaypoint - Same as hint, but without a sound. + Sets the condition determining when the waypoint is shown. + Possible values are: + "NEVER" - never show it + "EASY" - show only in cadet mode + "ALWAYS" - always show it - https://community.bistudio.com/wiki/hintSilent + https://community.bistudio.com/wiki/showWaypoint - hintSilent String/Structured_Text + Array showWaypoint String - hintSilent text + waypoint showWaypoint show - $Code$hintSilent "You texte comes here !"$/Code$ + $Code$[_grp, 2] showWaypoint "ALWAYS";$/Code$ - undefined / local + undefined / undefined - Nothing + Nothing + - hint + getPersonUsedDLCs - Outputs a multi-line hint message in the left upper corner of the screen (in the right upper corner in Arma). This version of hint is supposed to play a sound when hint is shown, but this varies between games and versions. Use hintSilent for soundless hint. - The effect of this command is local, i.e. the hint will only show on the computer command was executed. + Returns a list of all DLCs objects the unit is currently using. For example if a unit is inside a vehicle from DLC, it will return the code of that DLC. + This command is broken and doesnt work on dedicated server - https://community.bistudio.com/wiki/hint + https://community.bistudio.com/wiki/getPersonUsedDLCs - hint String/Structured_Text + getPersonUsedDLCs Object - hint text + getPersonUsedDLCs unit - $Code$hint "Press W to move forward. \nPress S to move backwards." - outputs the following message: - Press W to move forward. - Press S to move backwards. - Known Problems: Avoid hint messages that exceed the screen, as this may lead to crashes.$/Code$ + $Code$_objects = getPersonUsedDLCs player ;$/Code$ - undefined / local + global / undefined - Hint can be used with formatting like this: - $Code$ hint format ["Hello %1", player ]$/Code$ - - To remove the hint box from the screen, pass a null string ( "" ) to the command. - $Code$ hint ""$/Code$ - - hint happily accepts structured text : - $Code$_starL = " img image='\ca\ui\data\debr_star.paa' align='left'/ "; - _starL = _starL + _starL + _starL; - _starR = " img image='\ca\ui\data\debr_star.paa' align='right'/ "; - _starR = _starR + _starR + _starR; - _title = " t color='#ff0000' size='1.2' shadow='1' shadowColor='#000000' align='center' TITLE /t "; - _text = "Bla bla bla bla bla..."; - hint parseText (_starL + _starR + _title + _text); - $/Code$ - (Tested with 1.14, 1.15 beta and 1.16 beta) - - (October 20, 2014) - Be careful when using hints to visualize the effects of commands using the Debug Console. Hint can accept an undefined variable and neither the error nor the hint is shown, the command simply fails. Also notice how the hint command should be "hint str _o;" - $Code$for "_i" from 0 to 50 do - { - hint _o; - };$/Code$ - tested in A3 1.32.127785 In a script, an "undefined variable" error will be shown as expected. - - (October 21, 2014) - Contrary to what's written under "Examples", Arma 3 will happily display hints that far exceed screen space. However, as hints get longer, FPS suffers tremendously. - (tested in Debug Console, A3 1.32.127785, using: - $Code$hint str (( nearestObjects [player, ["BUILDING"], 100]) - [player]); [] spawn { sleep 5; systemChat str diag_fps;}; - hint str (( nearestObjects [player, ["BUILDING"], 1000]) - [player]); [] spawn { sleep 5; systemChat str diag_fps;};$/Code$ - Results were: 59.7015 and 5.17297, respectively. Drawing a hint even longer than this, such as nearestObjects with a radius of 10,000 or 100,000 reduces your FPS so much Arma 3 appears to crash, though it doesn't. - Unrelated: Hints will stay on screen for 30 seconds, then fade away over the course of 5 seconds. Tested with: (A3 1.32.127785) - $Code$hint "a";[] spawn{_counter = 0;while {true} do{sleep 1;_counter = _counter + 1;systemChat str _counter;};};$/Code$ - - (February 17, 2015) - An open dialog will pause the 30-second hint fade timer. - (A3 1.38.128937) - - (March 25, 2017) - The hint sound is audible only when you have the music volume turned up above 0 in the audio settings. Otherwise, it seems to act the same as hintSilent. - This is important because if you are running a hint that fires at 30 fps or more, the hint will slow down machines that have the music volume turned up but won't slow down machines that have the music volume turned off. - Best practice is to use hint for an alert to the player and use hintSilent for a makeshift display of data to the player that is updated fairly often. - Nothing + Array + - hmd + apply - Returns class name of currently used Head Mounted Display. Returns an empty string if the slot is empty. + Applies given code to each element of the array and returns resulting array. The value of the current array element, to which the code will be applied, is stored in variable _x. - https://community.bistudio.com/wiki/hmd + https://community.bistudio.com/wiki/apply - hmd Object + Array apply Code - hmd unit + array apply code - $Code$_nvgs = hmd player ; //NVGoggles$/Code$ + $Code$_arr = [1,2,3,4,5,6,7,8,9,0] apply {[1,0] select (_x % 2 == 0)}; //[1,0,1,0,1,0,1,0,1,0]$/Code$ + + $Code$_arr = [1,2,3,4,5,6,7,8,9,0] apply {_x ^ _x}; //[1,4,27,256,3125,46656,823543,16777216,387420480,1]$/Code$ + + $Code$_arr1 = []; + _arr1 resize 20; + _arr2 = _arr1 apply {0}; //[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]$/Code$ - global / undefined + undefined / undefined + (February 18, 2016) + (to anyone else wondering, I took a minute to get it): This is Array.map() is JavaScript + + (February 11, 2018) + if performance really is an issue, apply seems to be (very) slightly faster than forEach (by more or less one percent, 0.7-1.5% in my tests to be precise). - String + Array + - hostMission + addMagazineTurret - Host the mp mission described by config class. Should be called as reaction to some UI action in some dialog. - For example you can start a MP scenario from a button. It creates a host and takes you to the lobby with the scenario loaded. - You need to provide the display which is active when the hostMission command is called. + Adds a magazine to the turret. Use turret path [-1] for driver's turret. + Note: you may create invalid combinations by using this function, for example by adding 20 grenades. When doing so, application behaviour is undefined. Since Arma 3 v1.55.133817 it is possible to set custom ammo count in added magazine. - https://community.bistudio.com/wiki/hostMission + https://community.bistudio.com/wiki/addMagazineTurret - hostMission Array + Object addMagazineTurret Array - hostMission [pConfig, pDisplay] + vehicle addMagazineTurret [magazineName, turretPath, ammoCount] - $Code$hostMission [configMissionName, display];$/Code$ - - $Code$hostMission [ configFile /"CfgMissions"/"MPMissions"/_scenarioClassName, _currentlyActiveDisplay];$/Code$ + $Code$_tank addMagazineTurret ["SmokeLauncherMag",[0,0]];$/Code$ - $Code$// Launch host mission dialog in Arma 3 from a client on dedicated server - hostMission [ - configFile "CfgMissions" "MPmissions" "MP_COOP_m01", - findDisplay 46 - ];$/Code$ + $Code$_tank addMagazineTurret ["20Rnd_120mmSABOT_M1A2",[0]];$/Code$ - undefined / undefined + local / global - (January 03, 2011) - The command must be called in the main menu or something similar menu it seems. - Nothing + Nothing + - htmlLoad + addVest - Load HTML from file to given control. File path is relative to current mission dir or an absolute path (with drive letter etc.). The command is subject to restrictions, imposed by CfgCommands class. + Create a new vest and try to link it into vest slot. - https://community.bistudio.com/wiki/htmlLoad + https://community.bistudio.com/wiki/addVest - Control htmlLoad String + Object addVest String - control htmlLoad filename + unit addVest type - $Code$_control htmlLoad "briefing.html";$/Code$ - - $Code$_control htmlLoad "http://www.bistudio.com/newsfeed/arma3_news.php?build=main // [1]$/Code$ - - $Code$// Display news item: - 0 = 0 spawn { - disableSerialization ; - _html = findDisplay 46 createDisplay "RscCredits" ctrlCreate ["RscHTML", -1]; - _html ctrlSetBackgroundColor [0,0,0,0.8]; - _html ctrlSetPosition [ safeZoneX, safeZoneY, safeZoneW, safeZoneH ]; - _html ctrlCommit 0; - _html htmlLoad "http://www.bistudio.com/newsfeed/arma3_news.php?build=main - };$/Code$ + $Code$player addVest "V_TacVest_blk_POLICE";$/Code$ undefined / undefined - (September 7, 2014) - htmlLoad works with URL's as well as html files. - - (September 7, 2014) - While surprisingly htmlLoad does work with URLs as pointed above, the operation is blocking, meaning the whole game will freeze until the operation is complete. Therefore it is not recommended to use this command in such way. - - (April 21, 2015) - Example use of URL can be found in BIS_fnc_GUInewsfeed with the function browser. - - (October 7, 2015) - (Arma 3) In order to use URLs, they must be included in CfgCommands - allowedHTMLLoadURIs. In order to use URIs with params a wildcard * character is supported - Script Example : - $Code$_newsOnline = "http://alivemod.com/alive_news.php?map=" + _map + "&mission=" + _mission + "&player=" + _player; - _ctrlHTML htmlLoad _newsOnline;$/Code$ - Config Example: - $Code$class CfgCommands { - allowedHTMLLoadURIs[] += { - "http://alivemod.com/alive_news.php*" - }; - };$/Code$ - Nothing + Nothing + - humidity + createMine - Returns the current humidity value. 0 is no humidity and 1 is 100% humidity. Humidity value quickly changes from 0 to 1 when rain starts, then slowly changes from 1 to 0 when rain stops. + Creates a mine of the given type (type is the name of the subclass of CfgVehicles). If the markers array contains several marker names, the position of a random one is used, otherwise, the given position is used. The mine is placed inside a circle with this position as its center and placement as its radius. - https://community.bistudio.com/wiki/humidity + https://community.bistudio.com/wiki/createMine - humidity + createMine Array - humidity + createMine [type, position, markers, placement] - $Code$currentHumidity = humidity ;$/Code$ - - $Code$skipTime -24; - 86400 setOvercast 1; - skipTime 24; - [] spawn { - 10 setRain 1; - sleep 10; - 10 setRain 0; - }; - onEachFrame { - hintSilent str [ round ( rain * 10) / 10, round ( humidity * 10) / 10]; - };$/Code$ + $Code$_mine = createMine ["MineMine", position player, [], 0];$/Code$ undefined / undefined + (June 5, 2017) + Note that this command uses AGL (very similar to ASL) positions, so if you want to use the moored or seabed mine, you'll have to find the appropriate negative z value that is underwater and convert that to ASL. + Also note that you can't adjust the positions of sea mines after they've been created. The command is either ignored or not propagated across the network to clients. - Number + Object + - if + showCuratorCompass - This operator creates a If Type which is used in the if-construct as described here. + Hides or shows compass in curator interface. - https://community.bistudio.com/wiki/if + https://community.bistudio.com/wiki/showCuratorCompass - if Boolean + showCuratorCompass Boolean - if condition + showCuratorCompass bool - $Code$_retVal = if (1 0) then { "It's true" } else { "It's false" }; - hint str _retVal$/Code$ - - $Code$_val = if ( true ) then [ { "true" }, { "false" } ]; - hint _val;$/Code$ + $Code$showCuratorCompass true;$/Code$ undefined / undefined - (Jan 31, 2007) - Any _local variables you declare within the body of an if / then statement (ie between the curly braces) are local to that 'if' statement, and are destroyed at the end of the statement. If you know you want to use the variable outside the 'if' statement, make sure your declare it before the 'if' statement. - - (Jan 17, 2010) - (A2 1.05) If the condition is nil then neither the "then" nor the "else" section get executed, but the script will proceed with no error messages. - Example code: - $Code$ - hint "script started"; //will get executed - if (nil) then - { - hint "true"; // will never get executed - } - else - { - hint "false"; // will never get executed - }; - sleep 3; - hint "script ended"; //will get executed$/Code$ - - (June 5, 2015) - If you only need to choose between 2 raw values, it is possible to use the following trick to avoid using code blocks, as required by the if command, which results in greater atomicity and faster execution: - $Code$_result = [falseValue, trueValue] select condition;$/Code$ - The select command treats "false" as 0 and "true" as 1, therefore you can feed it a condition determining the array index of the value to be returned. Here is another example: - $Code$_result = [1,-1] select (_this 0); // If _this is less than 0, _result will be equal to -1, otherwise it will be 1$/Code$ - This feature was added in Arma 3. - If_Type + Nothing + - image + lbColorRight - Creates a structured text containing the given image. + Returns the text color of the item (right) with the given index of the listbox or combobox with id idc of the topmost user dialog. + The color is returned in format Color. - https://community.bistudio.com/wiki/image + https://community.bistudio.com/wiki/lbColorRight - image String + lbColorRight Array + + Control lbColorRight Number - image filename + lbColorRight [idc, index] + + control lbColorRight index - $Code$_txt1 = image "data\isniper.paa";$/Code$ + $Code$_colour = lbColorRight [101, 0];$/Code$ + + $Code$_color = _control lbColorRight 0;$/Code$ - undefined / undefined + local / local - (March 21, 2009) - Although there is a dedicated image command, parseText gives more options: - $Code$_imageText = parseText " img size='5' color='#ff0000' image='fish.paa'/ "$/Code$ + More information on the LB command family can be found here - Structured_Text + Array - Array + - importAllGroups + setFriend - Imports all groups into the RTE. - i - Some Old Editor Command + Sets how friendly side1 is with side2. For a value smaller than 0.6 it results in being enemy, otherwise it's friendly. + Intended to be used on mission start. Changing value during mission can cause unexpected errors in AI behavior. See also Side relations. - https://community.bistudio.com/wiki/importAllGroups + https://community.bistudio.com/wiki/setFriend - importAllGroups Control + Side setFriend Array - importAllGroups map + side1 setFriend [side2, value] - + $Code$west setFriend [ resistance, 0];$/Code$ + - undefined / undefined + undefined / global + This scripting command must be executed on the server to work properly in multiplayer + + (18:49, 28 December 2006) + This command might be buggy in ArmA (or the description regarding enemy status is wrong). See this discussion. + + (11:25, 30 November 2007) + Setting the civilian side to be the enemy of any other side will result in the other side attacking inanimate mission editor placed objects such as empty vehicles and static objects, since these objects belong to the civilian side. + + (15:57, 27 February 2008) + Be aware that this command only sets the friendliness of one side. If you want to have both sides attacking each other, you have to set both: $Code$Resistance setFriend [East, 0]; + East setFriend [Resistance, 0];$/Code$ + + (October 11, 2014) + (Arma 3 1.30 stable) It is possible to make a side hostile towards itself. + $Code$ west setFriend [ west, 0]; $/Code$ + It is only possible to do so with west / blufor, east / opfor, independent / resistance and civilian. This essentially creates a free for all deathmatch. Affects AI behaviour too. - Nothing + Nothing + - importance + comment - Returns a location's importance value. + Define a comment. + Mainly used in SQF Syntax, as you're able to introduce comment lines with semicolons in a SQS script. - https://community.bistudio.com/wiki/importance + https://community.bistudio.com/wiki/comment - importance Location + comment String - importance location + comment commentMsg - $Code$_locationImportance = importance myLocation$/Code$ + $Code$// script.sqs + comment "This is a commented line"$/Code$ + + $Code$// function.sqf + comment "This is a commented line";$/Code$ undefined / undefined + (September 12, 2009) + Like ArmA, you can't use brackets to make a multi-lines comment. But, in a sqf file, you can make a comment as follow : + $Code$ comment " + first line + seconde line";$/Code$ + + (November 4, 2016) + If a file is loaded with preprocessFile, execVM or spawn (but not loadFile), you may also define C-like comments using //... and /*...*/. + + (November 4, 2016) + comment can also be used to create comments inside trigger activation fields where // or */...*/ does not work. - Number + Nothing + - inAreaArray + step - Filters given list of Objects and/or Positions in relation to the given area, defined by a trigger, marker, location or array. Returns array of Objects and/or Positions from the list that are inside the area + Optionally can set step. If you want to count down, step must be specified, and set negative. Default value is 1. - https://community.bistudio.com/wiki/inAreaArray + https://community.bistudio.com/wiki/step - Array inAreaArray Object - - Array inAreaArray String - - Array inAreaArray Location - - Array inAreaArray Array + For_Type step Number - positions inAreaArray trigger - - positions inAreaArray marker - - positions inAreaArray location - - positions inAreaArray [center, a, b, angle, isRectangle, c] + for step stepSize - $Code$vehicles inAreaArray trigger_1;$/Code$ - - $Code$allUnits inAreaArray marker_1;$/Code$ - - $Code$allPlayers inAreaArray location_1;$/Code$ - - $Code$allDead inAreaArray [[100, 100, 0], 20, 30, 45, false, 10];$/Code$ + $Code$for "_x" from 20 to 10 step -2 do {..code..}$/Code$ undefined / undefined - (June 11, 2017) - The array you send the command can be filtered. For example: - $Code$ vehicles inAreaArray "mymarker" select {_x isKindOf "StaticWeapon"}$/Code$ - Will return only the statics inside the given marker - Array - Array - Array - Array + For_Type + - inArea + setPosATL - Checks whether given position is inside given area. The area is usually a rectangle or an ellipse defined similar to triggerArea format. Hence argument for this command could be a trigger, a marker, a location or an array in format [center, a, b, angle, isRectangle, c]. This command also supports hexagon area which can be created from ellipse when both a and b are negative. Hexagon ellipses are also supported by both marker creation and drawEllipse. - Alternatively, use inAreaArray to check multiple positions/objects within area. + Sets the position of an object relative to the terrain. - https://community.bistudio.com/wiki/inArea + https://community.bistudio.com/wiki/setPosATL - Array/Object inArea Object - - Array/Object inArea String - - Array/Object inArea Location - - Array/Object inArea Array + Object setPosATL Array - position inArea trigger - - position inArea marker - - position inArea location - - position inArea [center, a, b, angle, isRectangle, c] + object setPosATL pos - $Code$_playerIsInside = player inArea _myTrigger;$/Code$ - - $Code$_positionIsInside = _myPosition inArea [[100, 100, 0], 20, 30, 45, false ];$/Code$ + $Code$player setPosATL [ getPosATL player select 0, ( getPosATL player select 1) - 10, getPosATL player select 2];$/Code$ - undefined / undefined + global / global + (Feb 26, 2012) + Please Note : this command demands PositionATL format ; one does not simply give 2D position, as this function won't do anything. + + (November 11, 2014) + If you plan on creating bases through script, setPosATL and getPosATL will be your friends. Other commands like getPos or getPosASL will return the position relative to any objects that are underneath. I wrote a base building helper script and through multiple tests, I have found that getPosATL is the absolute best way to get position for objects that are over land. - Boolean - Boolean - Boolean - Boolean + Nothing + - inGameUISetEventHandler + preloadTitleObj - Sets given event handler of in-game UI. If EH function returns true, performed action is overridden. Event handlers available are: - "PrevAction" - mouse scroll up - "Action" - action key press - "NextAction" - mouse scroll down - This is "set" type EH, which means it will replace previously set EH of the same type. So to remove EH, set another one with empty string "" for the function. - Since Arma 3 v1.49.131743 this EH returns array of params for selected/activated action in _this variable: - 0: Object - target object to which action is attached - 1: Object - caller object, basically player - 2: Number - index of the action in action menu (0 - top most) - 3: String - engine based action name ("User" for user added actions) - 4: String - localized action plain text as seen by the caller - 5: Number - action priority value - 6: Boolean - action showWindow value - 7: Boolean - action hideOnUse value - 8: String - action shortcut name or "" - 9: Boolean - action menu visibility (on first scroll or action press the menu is still invisible, so no action is performed, only menu is shown) - 10: String - EH event name + Object title - Preload data the object can be defined in the Description.ext file. - https://community.bistudio.com/wiki/inGameUISetEventHandler + https://community.bistudio.com/wiki/preloadTitleObj - inGameUISetEventHandler Array + preloadTitleObj Array - inGameUISetEventHandler [handlerName, function] + preloadTitleObj [name, type] + + preloadTitleObj [name, type, speed, showInMap] - $Code$inGameUISetEventHandler ["Action","hint 'Lights, Camera, Action!'; true "];$/Code$ - - $Code$inGameUISetEventHandler ["PrevAction", " hint str _this; false "]; - inGameUISetEventHandler ["NextAction", " hint str _this; false "]; - inGameUISetEventHandler ["Action", " hint str _this; false "];$/Code$ - - $Code$// Deny any weapon disassembly: - inGameUISetEventHandler ["Action", " - if (_this select 3 == 'DisAssemble') then { - hint 'You are not allowed to do this'; - true - } - "];$/Code$ - - $Code$// Detect explosive/mine placement: - onMagazineUse = ' - params ["_target", "", "", "_action", "", "", "", "", "", "", "_event"]; - if (_action == "UseMagazine") then { - if (_event == "Action") then { - 0 = _target spawn { - waitUntil {!(all_magazines isEqualTo magazines _this)}; - { - 0 = all_magazines deleteAt (all_magazines find _x); - } count magazines _this; - hint format ["Magazine Used: %1", all_magazines select 0]; - } - } else { - all_magazines = magazines _target; - }; - }; - false - '; - inGameUISetEventHandler ["PrevAction", onMagazineUse]; - inGameUISetEventHandler ["NextAction", onMagazineUse]; - inGameUISetEventHandler ["Action", onMagazineUse];$/Code$ + $Code$_ok=preloadTitleObj ["BISLogo","plain"]$/Code$ - undefined / local + undefined / undefined - (May 12, 2016) - In case of the "Action" event, (param 6 || param 9) also denotes if the action is performed or not. For example, if the action menu is closed or fading off, pressing Spacebar will bring it up and trigger an "Action" event; in that case, param 9 (action menu visibility) is false. But if the action menu is open, and Spacebar is pressed to perform the selected action, then param 9 will be true. If param 6 (showWindow) is true, then it means the action was performed, regardless of param 9. - - (February 08, 2017) - This powerful command can override the actions (previous/next/action), depending on true/false return. But, the command overrides itself, no matter of the returned value. That means, if two mods or scripts are using the same command parameter, say 'action', the last inGameUISetEventHandler 'action' will override the first one. Example: trigger1 : - $Code$inGameUISetEventHandler ["Action","hint 'action for mod 1';true "];// true or false doesn't matter here$/Code$ - trigger2 (delayed): - $Code$inGameUISetEventHandler ["Action","false "];// true or false doesn't matter here$/Code$ - trigger2 will run after trigger1, then, you'll never see the hint, what ever the trigger2 action code could be. What ever could be the last code, it will override all previous ones. You have to group these codes in a same event handler. But, beyond this, inGameUISetEventHandler is not stackable and implies a competition between scripts (or mods) using it. - Nothing + Boolean + - inPolygon + ctSetRowTemplate - Checks whether position is inside given polygon + Takes config path to the new row template. Clears the whole RscControlsTable and sets the new row template (Deleting all rows and headers is easier to implement than replacing the rows and filling them with new data. IDCs could overflow etc.). - https://community.bistudio.com/wiki/inPolygon + https://community.bistudio.com/wiki/ctSetRowTemplate - Array inPolygon Array + Control ctSetRowTemplate Config - position inPolygon polygon + Control ctSetRowTemplate Config - $Code$_isInside = [100,100,0] inPolygon [[0,0,0],[1000,1000,0],[1000,0,0]];$/Code$ + $Code$_control ctSetRowTemplate _configPath;$/Code$ - undefined / undefined + local / local - Boolean + Nothing + - inRangeOfArtillery + setFormDir - Returns true if all given units are able to fire at given position with given magazineType. + Set group formation heading. Accepted heading range is 0 to 360. Formation is facing this direction unless enemy is seen. When group is moving, this value is overriden by movement direction. - https://community.bistudio.com/wiki/inRangeOfArtillery + https://community.bistudio.com/wiki/setFormDir - Position inRangeOfArtillery Array + Object/Group setFormDir Number - pos inRangeOfArtillery [[unit], magazineType] + group setFormDir heading - $Code$_isInRange = getMarkerPos "myTarget" inRangeOfArtillery [[myArty], "32Rnd_155mm_Mo_shells"]$/Code$ + $Code$_group1 setFormDir 180;$/Code$ + + $Code$_unit1 setFormDir random 360;$/Code$ + + $Code$//center the main turret + ( group BIS_Crew1) setFormDir ( getDir BIS_Armor);$/Code$ - global / undefined + local / global - (July 10, 2015) - Using an empty artillery vehicle will return false. + (November 22, 2014) + When applied to AI, setFormDir will set unit formation direction, which in turn will force unit to change direction to match formation direction, however unit will stop turning as soon as unit direction is +/- 30 degrees of the formation direction. To precisely match formation direction, additional setDir is required: + $Code$_unit setFormDir 45; + _unit setDir 45; + hint str direction _unit; //45$/Code$ - Boolean + Nothing + - incapacitatedState + mod - Returns the incapacitated state of the given unit. + Remainder of a divided by b. - https://community.bistudio.com/wiki/incapacitatedState + https://community.bistudio.com/wiki/mod - incapacitatedState Object + Number mod Number - incapacitatedState person + a mod b - $Code$_result = incapacitatedState player;$/Code$ + $Code$_rem = 3 mod 2; + // Result is 1$/Code$ undefined / undefined + (01:34, 16 April 2006) + Remainder is calculated in real domain. + mod is identical to a % b + You can use mod to round a decimal number down to the nearest whole number. For example: If you wanted to use the command random to generate a whole number between 0 and 5, you could put this in a script: + $Code$_rand = random 6; + _num = _rand - (_rand mod 1); + $/Code$ + In A1, the new commands round, floor or ceil would be the easier way to round. - String + Number + - independent + setAnimSpeedCoef - Pre-defined variable for the independent side. - Alias for resistance. + Sets a coefficient for animation speed - https://community.bistudio.com/wiki/independent + https://community.bistudio.com/wiki/setAnimSpeedCoef - independent + Object setAnimSpeedCoef Number - independent + unit setAnimSpeedCoef coef - $Code$// SQF: - if (( side _unit) == independent ) then { - hint "This is a independent unit!"; - };$/Code$ + $Code$player setAnimSpeedCoef 0.75;$/Code$ undefined / undefined + (November 14, 2016) + Increasing animation speed of a unit also increases its run/walk speed (thanks to Killzone Kid ) + + (November 27, 2016) + Setting negative values with this makes animations act in reverse or make you stuck sliding in unknown directions. - Side + Nothing + - in + profileNamespace - Checks whether value is in array, unit in vehicle or position inside location. In case of value in array check, String values will be compared on CaSEseNsiTIve basis (see Example 2). Note: In Arma 2 you can not test for arrays within arrays using this command. + Returns the global namespace attached to the active user profile. Use setVariable and getVariable to save and load data to and from this Namespace. A variable can be deleted by setting its value to nil. By default the variables set in this namespace will exist while the game is running. In order to make variables save permanently, use saveProfileNamespace before the game is over. + The variables are stored next to the user profile in a file named myUsername.vars.GAMENAME (e.g. in the My Documents\Take On Helicopters folder). - https://community.bistudio.com/wiki/in + https://community.bistudio.com/wiki/profileNamespace - Anything in Array - - Object in Object - - Array in Location + profileNamespace - value in array - - unit in vehicle - - position in location + profileNamespace - $Code$1 in [0,1,2]; //true$/Code$ - - $Code$"lol" in ["Lol", "LOL", "loL"]; //false - "loL" in ["Lol", "LOL", "loL"]; //true$/Code$ - - $Code$// Arma 3: - [1,2,3] in [[1,2,3],[4,5,6]]; //true$/Code$ - - $Code$_isInCar = player in car;$/Code$ + $Code$_namespace = profileNamespace ;$/Code$ - $Code$_isInside = [1000,2000,0] in myLocation;$/Code$ + $Code$profileNamespace setVariable ["var_kills",10000]; + _playerKills = profileNamespace getVariable "var_kills";$/Code$ undefined / undefined - (15:58, 18 January 2007 (CET)) - For a case- insensitive test use count : - $Code${_x == "lol"} count ["Lol", "LOL", "loL"]; //returns 3.$/Code$ - Checking if an array (for example a position) is in another array doesn't produce an error, but it will always return false. e.g. - $Code$[0,0,0] in [[0,0,0],[1,4,3],[5,3,1]]; //returns: false.$/Code$ - - (August 23, 2014) - As of Arma 3 1.26: - $Code$[0,0,0] in [[0,0,0],[1,4,3],[5,3,1]]; //returns true - [1,2,3] in [[1,2,3],[4,5,6]]; //returns true - $/Code$ - Assuming it is now using comparison as found in isEqualTo + The variables are loaded when the user profile is loaded or changed. - Boolean - Boolean - Boolean + Namespace + - inflamed + tvSetPictureColorSelected - Checks if fireplace is inflamed (burning) or not. To check if a unit is receiving damage from fire, use isBurning command. + Sets the color of the left picture of a tree item defined by path when item is selected - https://community.bistudio.com/wiki/inflamed + https://community.bistudio.com/wiki/tvSetPictureColorSelected - inflamed Object + Control tvSetPictureColorSelected Array - inflamed fireplace + control tvSetPictureColorSelected [path, color] - $Code$_inflamed = inflamed _fireplaceOne;$/Code$ + $Code$_control tvSetPictureColorSelected [[0], [1,0,1,1]]$/Code$ - global / undefined + undefined / undefined - Boolean + Nothing + - inflame + switchCamera - Control fireplace burning. Set inflame to true (on) or false (off). + Switch camera to given vehicle / camera. Mode is one of: + "INTERNAL" : 1st person + "GUNNER" : optics / sights + "EXTERNAL" : 3rd person + "GROUP" : group + "CARGO" : same as "INTERNAL" + If you switch to a unit in a vehicle, this command uses the correct turret. Control over the unit is not given to the player. Use selectPlayer or a combination of switchCamera and remoteControl to achieve this. - https://community.bistudio.com/wiki/inflame + https://community.bistudio.com/wiki/switchCamera - Object inflame Boolean + Object switchCamera String + + switchCamera Object - fireplace inflame burn + target switchCamera mode + + switchCamera target - $Code$_fireplaceOne inflame true ;$/Code$ + $Code$player switchCamera "Gunner";$/Code$ + + $Code$vehicle player switchCamera "External";$/Code$ - global / global + undefined / undefined + (May 16, 2015) + Force top down view: $Code$cam = "Land_HandyCam_F" createVehicleLocal [0,0,0]; + cam hideObject true ; + cam attachTo [ player, [0,0,10]]; + cam setVectorUp [0,0.99,0.01]; + cam switchCamera "Internal"; + findDisplay 46 displayAddEventHandler ["MouseButtonDown", { + if (_this select 1 == 0) then { + player forceWeaponFire [ currentMuzzle player, currentWeaponMode player ]; + }; + false + }]; + findDisplay 46 displayAddEventHandler ["KeyDown", { + if (_this select 1 in actionKeys "ReloadMagazine") then { + reload player ; + }; + false + }];$/Code$ - Nothing + Nothing - Nothing + - inheritsFrom + drawLine3D - Returns base entry of config entry. + Draws a line of a given color between two 3D positions. Command has to be executed each frame. Use onEachFrame or addMissionEventHandler "Draw3D". - https://community.bistudio.com/wiki/inheritsFrom + https://community.bistudio.com/wiki/drawLine3D - inheritsFrom Config + drawLine3D Array - inheritsFrom config + drawLine3D [start, end, color] - $Code$_base = inheritsFrom ( configFile "CfgVehicles" "Car"); - // Result is Config entry for class "LandVehicle"$/Code$ - - $Code$// Print parent tree of given config class: - fnc_printParents = - { - disableSerialization ; - if (! isClass _this) exitWith { hint "Argument is not a config Class"}; - private _parents = []; - while {! isNull _this} do - { - _parents pushBack configName _this; - _this = inheritsFrom _this; - }; - reverse _parents; - private _tv = findDisplay 46 createDisplay "RscDisplayEmpty" ctrlCreate ["RscTree", -1]; - _tv ctrlSetPosition [0,0,1,1]; - _tv ctrlSetBackgroundColor [0,0,0,0.5]; - _tv ctrlCommit 0; - private _path = []; - { - _tv tvAdd [_path, _x]; - _path pushBack 0; - } - forEach _parents; - tvExpandAll _tv; - }; - // Example: - ( configFile "CfgVehicles" typeOf player ) call fnc_printParents;$/Code$ + $Code$onEachFrame { + drawLine3D [ getPos player, getPos cursorTarget, [1,1,1,1]]; + };$/Code$ undefined / undefined - (Apr 2, 2014) - (A3 1.14)Use BIS_fnc_returnParents if a parents' collection of the given entry is needed. - $Code$ - [( configFile "CfgVehicles" "Land_Atm_02_F"), true ] call BIS_fnc_returnParents ; - //return: ["Land_Atm_02_F","House_Small_F","House_F","House","HouseBase","NonStrategic","Building","Static","All"] - $/Code$ - Not all entries have parent, and please differ parents from path. - $Code$ - inheritsFrom ( configFile "CfgUIColors" "IGUI" "Presets" "PresetA1" "Variables"); - //return: Nothing - $/Code$ + (August 31, 2013) + As command syntax indicates, this command expects starting and ending position in format PositionAGL meaning that over the land it expects PositionATL and over the sea PositionASLW. Use additional ASLToAGL and AGLToASL commands wherever is necessary. + $Code$ addMissionEventHandler ["Draw3D", { + drawLine3D [ ASLToAGL eyePos soldier1, ASLToAGL eyePos soldier2, [1,0,0,1]]; + }];$/Code$ + + (February 18, 2015) + Visible through fog and past draw distance. - Config + Nothing + - initAmbientLife + ctrlText - Initialize the ambient life. + Returns the text of a control of the currently active user dialog. This command can be used on static texts, buttons, edit lines and active texts as well as for images, where it returns the image path. + Read Dialog Control for more information about user dialogs and controls. - https://community.bistudio.com/wiki/initAmbientLife + https://community.bistudio.com/wiki/ctrlText - initAmbientLife + ctrlText Number + + ctrlText Control - initAmbientLife + ctrlText idc + + ctrlText controlName - - - undefined / undefined + $Code$_text = ctrlText 100$/Code$ + + $Code$_text = ctrlText _control$/Code$ + + + local / undefined - Nothing + String - String + - inputAction + nearestObjects - Return the state of input devices mapped to given input action. - For Arma 3 inputActions see: inputAction/actions. - For Arma 3 inputActions bindings see: inputAction/actions/bindings. - For earlier Arma editions see Category:Key Actions. + Returns a list of nearest objects of the given types to the given position or object, within the specified distance. If more than one object is found they will be ordered by proximity, the closest one will be first in the array. Alternatively, you use nearObjects command, which doesn't sort results. + position can use the format: + [[x,y,z], ["ClassName",...], radius] + or + [object, ["ClassName",...], radius] + To use it without any ClassName filter: + [object or position, [], radius]. + A list of ClassName types (Tanks eg) can be found in CfgVehicles + Since Arma 3 v1.65.138818 it is possible to switch search and sorting mode between 2D and 3D - https://community.bistudio.com/wiki/inputAction + https://community.bistudio.com/wiki/nearestObjects - inputAction String + nearestObjects Array - inputAction name + nearestObjects [position, types, radius, 2Dmode] - $Code$inputAction "leanLeft" - // Returns 1 if the button mapped to "leanLeft" is pressed currently else 0.$/Code$ + $Code$nearestObjects [ player, ["Car","Tank"], 200];$/Code$ - $Code$[] spawn { - waitUntil { inputAction "reloadMagazine" 0}; - hint "Reload Key Pressed"; - };$/Code$ + $Code$nearestObjects [ player, ["house"], 200];$/Code$ + + $Code$nearestObjects [[2716,2949,0], ["Car","Truck"], 100];$/Code$ + + $Code$// Return every object in 50 metres radius around player: + nearestObjects [ player, [], 50]$/Code$ undefined / undefined - (07:38, 15 October 2010 (CEST)) - This command also returns values other than 0 and 1 (like 0.02 or 1.3). Any value greater than zero usually signals that the key or button is pressed. inputAction does not work reliably when used in RscDisplayMission's onKeyDown event handler (the same is probably true for other input related event handlers). + (unknown) + To get a list with alive targets for various situations use this construct: + $Code$_nearestTargets = nearestObjects [_submunScanPos, ["VBS2_TANK","TANK"], _scanArea]; + _validNearestTargets = []; + { if ( alive _x) then {_validNearestTargets set [( count _validNearestTargets),_x];};} forEach _nearestTargets; + $/Code$ + results in _validNearestTargets being filled with targets == alive.. (you could use other conditions there, of course!) + -- Vigilante - (May 8, 2014) - inputAction does not return the actual state of the queried key when a dialog screen is open. Instead, it will always return 0. + (10. Aug. 2010) + Passing an empty array to define the types will also return objects with no class at all (such as trees, bushes, stones,...). + Example: + $Code$_objects = nearestObjects [_position, [], _radius];$/Code$ + Passing the array ["All"] is not the same and will only return objects that have some sort of class. - (July 31, 2015) - inputAction is capable of returning the state of analog inputs. This includes mouse, joystick, and even TrackIR. A joystick axis will return a value from 0 to 1, while mouse movement returns the rate of change, which can be 1. - Right mouse click is currently not supported, but right mouse hold is. http://feedback.arma3.com/view.php?id=25015 + (11.09.2013) + If you want to detect nearby grenades for the position of a unit, for example, using 'nearestObjects' won't work. You have to use + 'nearObjects' instead. + $Code$ count ( nearestObjects [_unit, ["GrenadeHand"], 30]) // WON'T WORK$/Code$ + Won't ever return anything but 0. + $Code$ count (_unit nearObjects ["GrenadeHand", 30]) // WORKS!$/Code$ + Will work. + + (March 22, 2014) + The distance from which an object is determined to be inside the radius is calculated from its model center (object modelToWorld [0,0,0]), and not the position returned by getPos/ATL/ASL. If an object is used as the origin from which to scan, distance is calculated from its model center as well. + + (October 26, 2014) + Return all trees in 100m radius around player: + $Code$trees = []; + { + if ( str _x find ": t_" -1) then { + trees pushBack _x; + }; + } forEach nearestObjects [ player, [], 100];$/Code$ + + (August 27, 2015) + If you use "Man" as the class to look for, it will only find dismounted men. IE, men in vehicles will NOT be found. + + (January 8, 2016) + The first call to this command can take significantly longer then consecutive calls. But even after the objects in given radius were cached, the sorting this command performs could be quite expensive. For example to sort ~7000 object it might take up to 100ms. For performance reasons you can use nearObjects instead, which is basically the same command but without added sorting. + + (March 2, 2016) + In Arma 3, nearestObjects is partially broken and is unable to return nearby placed explosive charges or mines when searching by classnames. Use nearObjects, nearestObject or allMines instead. + Example of non-functional code: + $Code$//always returns nothing, even if there are objects that should be returned + nearestObjects [position player, ["APERSMine_Range_Ammo", "SatchelCharge_Remote_Ammo"], 10]$/Code$ + + (October 31, 2016) + Since Arma 3 v1.65.138818 the default sorting is done according to 3D distance not distance2D as before. This is an attempt to correct some very old bug in implementation. - Number + Array + - insertEditorObject + removePrimaryWeaponItem - Insert an object to the editor and assign arguments. Create script is,not called. Returns the ID of the new EditorObject. Subtype class is,optional. - i - Some Old Editor Command + Removes given weapon item from the primary weapon cargo space. + As of Arma 3 DEV 1.37, this command also supports weapon magazines. - https://community.bistudio.com/wiki/insertEditorObject + https://community.bistudio.com/wiki/removePrimaryWeaponItem - Control insertEditorObject Array + Object removePrimaryWeaponItem String - map insertEditorObject [type,value,[name1,value1,],subtype class] + unit removePrimaryWeaponItem item - + $Code$player removePrimaryWeaponItem "acc_flashlight";$/Code$ + - undefined / undefined + local / global - (May 7, 2015) - "This works only in the old 3D editor" - KM - String + Nothing + - intersect + setHitIndex - Finds named selections in object which are in specified LOD, intersected by given section of a line. Return value is in the form of [selection, distance]. Multiple returned arrays are nested within a single array. No intersection returns []. lodName could be one of the following: - "FIRE" - "VIEW" - "GEOM" - "IFIRE" - ("I" stands for Indirect, almost the same as FIRE) + Set the current level of damage for a specific Hit Point (specified by its hit part index). All hit points can be obtained with getAllHitPointsDamage command. + 0: no damage + 1: full damage - https://community.bistudio.com/wiki/intersect + https://community.bistudio.com/wiki/setHitIndex - Array intersect Array + Object setHitIndex Array - [object, lodName] intersect [begPos, endPos] + vehicle setHitIndex [hitPartIndex, damage, useEffects] - $Code$[_tank, "VIEW"] intersect [[1500, 1500, 2], [1550, 1500, 2]];$/Code$ + $Code$vehicle player setHitIndex [1, 1];$/Code$ - $Code$sphere = "Sign_Sphere10cm_F" createVehicle [0,0,0]; - onEachFrame { - _begPos = positionCameraToWorld [0,0,0]; - _begPosASL = AGLToASL _begPos; - _endPos = positionCameraToWorld [0,0,1000]; - _endPosASL = AGLToASL _endPos; - _ins = lineIntersectsSurfaces [_begPosASL, _endPosASL, player, objNull, true, 1, "FIRE", "NONE"]; - if (_ins isEqualTo []) exitWith {sphere setPosASL [0,0,0]}; - _ins select 0 params ["_pos", "_norm", "_obj", "_parent"]; - if !( getModelInfo _parent select 2) exitWith {sphere setPosASL [0,0,0]}; - _ins2 = [_parent, "FIRE"] intersect [_begPos, _endPos]; - if (_ins2 isEqualTo []) exitWith {sphere setPosASL [0,0,0]}; - _ins2 select 0 params ["_name", "_dist"]; - _posASL = _begPosASL vectorAdd ((_begPosASL vectorFromTo _endPosASL) vectorMultiply _dist); - drawIcon3D ["", [1,1,1,1], ASLToAGL _posASL, 0, 0, 0, _name, 1, 0.03, "PuristaMedium"]; - sphere setPosASL _posASL; - };$/Code$ + $Code$player setHitIndex [7, 0.5];$/Code$ - global / undefined + local / global - (Jul 25, 2007) - The most common LOD is " FIRE ", which identifies the most detailled hitbox used for ammunition. - - (Mar 27, 2014) - Example (In ArmA3 ver 1.14) display returned arrays on cursor entities: - $Code$ - Sto = []; - Fn = { - { - Sto set [_foreachindex,[cursortarget,_x] intersect [(asltoagl (eyepos player)),(screentoworld [0.5,0.5])]]; - } foreach ["FIRE","VIEW","GEOM","IFIRE"]; - hintsilent format ["FIRE: %1, VIEW: %2, GEOM: %3, IFIRE: %4",Sto select 0,Sto select 1,Sto select 2,Sto select 3]; - }; - ["sample_id","onEachFrame","Fn"] call BIS_fnc_addStackedEventHandler; - $/Code$ - Return FIRE: [something], VIEW: [something], GEOM: [something], IFIRE: [something]. - - (August 20, 2015) - intersect will spam.rpt if passed to it object has no skeleton. Use getModelInfo to filter out those objects. - Array + Nothing + - is3DENMultiplayer + currentNamespace - Returns true if the Eden Editor is in multiplayer mode. Returns true in the following cases: - Multiplayer Preview launched directly from 3DEN - true in preview and only for the creator - MP mission is chosen for editing when creating a server: Multiplayer - Server Browser - Host Server. When 3D EDITOR button is clicked for selected mission and 3DEN is launched, command returns true within the editor environment. (see also is3DEN ) + Returns current global namespace the script runs in. - https://community.bistudio.com/wiki/is3DENMultiplayer + https://community.bistudio.com/wiki/currentNamespace - is3DENMultiplayer + currentNamespace - is3DENMultiplayer + currentNamespace - $Code$if is3DENMultiplayer then { systemChat "Your hosting a test server!"};$/Code$ + $Code$if ( currentNamespace isEqualTo uiNamespace ) then { hint "This is uiNamespace"};$/Code$ undefined / undefined @@ -32983,52 +34594,134 @@ - Boolean + Namespace + - is3DEN + setSpeaker - Returns true if the Eden Editor is currently being used. true when inside editor environment, false during preview. (see also is3DENMultiplayer ) + Sets the speaker of a person. In order to setSpeaker dynamically in MP, the command needs to run on every computer with exactly the same params otherwise the speaking unit could appear silent on other PCs. Run this on server: + [bob, "Male02GRE"] remoteExecCall ["setSpeaker", 0]; - https://community.bistudio.com/wiki/is3DEN + https://community.bistudio.com/wiki/setSpeaker - is3DEN + Object setSpeaker String - is3DEN + person setSpeaker speaker - $Code$if is3DEN then { systemChat "Welcome to Eden Editor!"};$/Code$ + $Code$unit1 setSpeaker "Male02GRE";$/Code$ - undefined / undefined + local / local + (September 19, 2013) + speaker can be any of the following: + Male01ENG + Male01ENGB + Male01GRE + Male01PER + Male02ENG + Male02ENGB + Male02GRE + Male02PER + Male03ENG + Male03ENGB + Male03GRE + Male03PER + Male04ENG + Male04ENGB + Male04GRE + Male05ENG + Male06ENG + Male07ENG + Male08ENG + Male09ENG + + (January 12, 2014) + speakers available in Arma 3 (v1.08) : + Gender + Profile setting + US English (B) for EN-GB available + Greek + Persian + Male + Male01_F + Male01ENG(B) + Male01GRE + Male01PER + Male02_F + Male02ENG(B) + Male02GRE + Male02PER + Male03_F + Male03ENG(B) + Male03GRE + Male03PER + Male04_F + Male04ENG(B) + Male04GRE + Male01PER + Male05_F + Male05ENG + Male05GRE + Male02PER + Male06_F + Male06ENG + Male02GRE + Male03PER + Male07_F + Male07ENG + Male03GRE + Male01PER + Male08_F + Male08ENG + Male04GRE + Male02PER + Male09_F + Male09ENG + Male01GRE + Male03PER + Female + - + - + - + - + + (November 10, 2014) + In order to stop a unit from talking you can use: + $Code$_unit setSpeaker "NoVoice"$/Code$ + This will have no negative effect on the ability to command the unit. - Boolean + Nothing + - isAbleToBreathe + deleteEditorObject - If unit is diving and doesn't have a re-breather, it returns false. Diving means the unit's head is underwater. If unit is underwater and has a re-breather, the command returns true. + Delete the editor object. Requires all editor object links to be removed prior. + i + Some Old Editor Command - https://community.bistudio.com/wiki/isAbleToBreathe + https://community.bistudio.com/wiki/deleteEditorObject - isAbleToBreathe Object + Control deleteEditorObject String - isAbleToBreathe unit + map deleteEditorObject object @@ -33038,24 +34731,25 @@ - Boolean + Any_Value + - isAgent + menuURL - Check if team member is an agent. + Returns current URL set in entry on given path. - https://community.bistudio.com/wiki/isAgent + https://community.bistudio.com/wiki/menuURL - isAgent Team_Member + menuURL Array - isAgent teamMember + menuURL [idc, path] @@ -33063,33 +34757,35 @@ undefined / undefined - (May 19, 2017) - One can check if a unit is an agent via - $Code$ isAgent teamMember _unit$/Code$ - Boolean + String + - isArray + taskNull - Check if config entry represents array. + A non-existing Task. To compare non-existent tasks use isNull or isEqualTo : + taskNull == taskNull ; // false + isNull taskNull ; // true + taskNull isEqualTo taskNull ; // true - https://community.bistudio.com/wiki/isArray + https://community.bistudio.com/wiki/taskNull - isArray Config + taskNull - isArray config + taskNull - $Code$_ok = isArray (configFile "CfgVehicles") - // Result is false$/Code$ + $Code$! isNull taskNull ; // false$/Code$ + + $Code$str taskNull ; // No task$/Code$ undefined / undefined @@ -33097,27 +34793,28 @@ - Boolean + Task + - isAutoHoverOn + setVehicleReportRemoteTargets - Return true if vehicle has enabled auto hover. (always returns false if the vehicle can't set auto hover) + Sets that the vehicle will share targets that were acquired by its own sensors via datalink to the Side center. - https://community.bistudio.com/wiki/isAutoHoverOn + https://community.bistudio.com/wiki/setVehicleReportRemoteTargets - isAutoHoverOn Object + Object setVehicleReportRemoteTargets Boolean - isAutoHoverOn vehicle + vehicle setVehicleReportRemoteTargets bool - $Code$status = isAutoHoverOn vehicle player;$/Code$ + $Code$( vehicle player ) setVehicleReportRemoteTargets true;$/Code$ undefined / undefined @@ -33125,112 +34822,142 @@ - Boolean + Nothing + - isAutonomous + setWindForce - Returns true if UAV is in autonomous mode. + Set max. wind overall wind changes in time. A time of zero means there will be an immediate change. A wind level of zero is minimal changes and a wind level of one means that wind can change rapidly. - https://community.bistudio.com/wiki/isAutonomous + https://community.bistudio.com/wiki/setWindForce - isAutonomous Object + Number setWindForce Number - isAutonomous uav + time setWindForce wind - $Code$bool = isAutonomous uav;$/Code$ + $Code$1800 setWindForce 0.5$/Code$ - global / undefined + undefined / undefined - Boolean + Nothing + - isAutotest + setFog - Returns true if game was started with autotest parameter + Changes the fog smoothly over the the given TransitionTime (in seconds). A time of zero means there will be an immediate change. A fog intensity of zero is minimum fog and a fog level of one is maximum fog. + NOTE : Since Arma 3 this command is MP synchronised, if executed on server, the changes will propagate globally. If executed on client effect is temporary as it will soon change to the server setting. + A little information about how Alt Syntax works. The fogValue is normal fog value that could be set independently with original setFog command. fogBase is the ASL altitude at which the fog will start. 0 is the sea level. fogDecay is how defined the fog start is. The more defined, the denser is the fog. 1 (or -1) are the max values. If it is positive the fog will be generated below fogBase line, if negative, above it. If fogDecay is small, the fog will transition more smoothly from no fog to full fog, and because of that it will cross fogBase line by quite a lot, depending on how small is fogDecay value. Current values of fogDecay and fogBase can be retrieved with fogParams - https://community.bistudio.com/wiki/isAutotest + https://community.bistudio.com/wiki/setFog - isAutotest + Number setFog Number + + Number setFog Array - isAutotest + time setFog fog + + time setFog [fogValue, fogDecay, fogBase] - $Code$_bool = isAutotest$/Code$ + $Code$15 setFog 0.5;$/Code$ + + $Code$// Force no fog: + 0 setFog 0; + forceWeatherChange ; + 999999 setFog 0;$/Code$ + + $Code$0 setFog [1, 0.01, 0];$/Code$ + + $Code$// Mountain fog, starts from 70m ASL and thickens more the higher you climb: + 0 setFog [1, -1, 70];$/Code$ + + $Code$// Valley fog, starts from 60m ASL and thickens more the lower you descend: + 0 setFog [1, 1, 60];$/Code$ + + $Code$// Fooooog on the waaaater: + 0 setFog [1, 1, 0];$/Code$ - undefined / undefined + undefined / global + This scripting command must be executed on the server to work properly in multiplayer + + Only one script command induced weather change (either setOvercast or setFog) can be happening at a time. Starting a new weather change will immediately halt the current weather change. SetRain changes are independent and can occur simultaneously to a weather change. + + (December 15, 2015) + setTimeMultiplier DOES affect transition time. - Boolean + Nothing - Nothing + - isBleeding + setAirplaneThrottle - Returns whether the unit is bleeding. + Sets a wanted throttle position, works only on player's vehicle. - https://community.bistudio.com/wiki/isBleeding + https://community.bistudio.com/wiki/setAirplaneThrottle - isBleeding Object + Object setAirplaneThrottle Number - isBleeding unit + airplane setAirplaneThrottle value - $Code$if ( isBleeding player ) then { player groupChat "I'm bleeding!!"; }$/Code$ - + undefined / undefined - Boolean + Nothing + - isBurning + addMagazinePool - Returns whether the unit is burning. - This returns true only if unit is damaged by nearby fire, it does not check whether a fireplace is burning, use inflamed command for that. + Add magazines to the magazine pool, of which the player may choose in the following mission. Available in campaigns only. - https://community.bistudio.com/wiki/isBurning + https://community.bistudio.com/wiki/addMagazinePool - isBurning Object + addMagazinePool Array - isBurning unit + addMagazinePool [magazineName, count] - $Code$if ( isBurning player ) then { player groupChat "I'm burning!!"; }$/Code$ + $Code$addMagazinePool ["M16", 20];$/Code$ undefined / undefined @@ -33238,410 +34965,325 @@ - Boolean + Nothing + - isClass + waypointBehaviour - Check if config entry represents config class. + Gets the waypoint behavior. - https://community.bistudio.com/wiki/isClass + https://community.bistudio.com/wiki/waypointBehaviour - isClass Config + waypointBehaviour Array - isClass config + waypointBehaviour waypoint - $Code$_ok = isClass ( configFile "CfgVehicles"); - // Result is true.$/Code$ + $Code$waypointBehaviour [groupOne,1]$/Code$ undefined / undefined - (March 2, 2007) - This command allows you to check for the presence of an addon. - isClass (configFile "cfgVehicles" "MyCustomCar") - will return true if the addon "MyCustomCar" is installed, and false if it is not installed. - You will have to know under which class the addon is categorized (in this case "cfgVehicles") to be able to use the right config path. - - (Mar 31, 2014) - (ArmA3 ver 1.14) According to BI Dev Karel Mořický, BIS_fnc_getCfgIsClass provides a comfortable workaround with custom config under description.ext compared with isClass. (But as a function created specifically for A3 campaign, it is in no way intended as a replacement for isClass. So it is not suggested to use it for configFile classes. But isClass instead.) - E.g. - $Code$["Something1","Something2","Something3"] call bis_fnc_getCfgIsClass //Same as isClass (missionconfigfile "Something1" "Something2" "Something3")$/Code$ - Boolean + String + - isCollisionLightOn + saveVar - Returns true if vehicle collision lights are on otherwise false. + Save variable value into the campaign space. This variable is available to all following missions in the campaign. - https://community.bistudio.com/wiki/isCollisionLightOn + https://community.bistudio.com/wiki/saveVar - isCollisionLightOn Object + saveVar String - isCollisionLightOn vehicle + saveVar varname - $Code$_collisionLightOn = isCollisionLightOn heli;$/Code$ + $Code$saveVar "varOne"$/Code$ - global / undefined + undefined / undefined - (April 6, 2015) - Bind Collision light action to UserAction 2 - $Code$this addAction ["", { - _this select 1 action [ - ["CollisionLightOn", "CollisionLightOff"] select isCollisionLightOn (_this select 0), - _this select 0 - ]; - }, "", -10, false, true, "User2", "_this == driver _target"];$/Code$ + (January 28, 2009) + If you try to saveVar a vehicle saved in your variable (SavedVars = [Car1]; saveVar "SavedVars"), then Car1 will not be properly "saved", refering to ObjNull if you try to use it in subsequent missions, even if a vehicle with the same vehicle varname exists. To get around this, save the vehicle's varname as a string (SavedVars = [str(Car1)]) and then when you need it just use call compile to "unstring" the varname (_car = call compile (SavedVars select 0);). - Boolean + Nothing + - isCopilotEnabled + removeDrawLinks - Returns true if copilots actions are enabled. + Remove all drawn links for the given editor object for the given editor,object type. Pass an empty string as param type to remove all draw,links for an object. + i + Some Old Editor Command - https://community.bistudio.com/wiki/isCopilotEnabled + https://community.bistudio.com/wiki/removeDrawLinks - isCopilotEnabled Object + Control removeDrawLinks Array - isCopilotEnabled vehicle + map removeDrawLinks [from,param type] - $Code$if (! isCopilotEnabled myHeli) then { - myHeli enableCopilot true ; - };$/Code$ - + - global / undefined + undefined / undefined - (February 17, 2014) - Only returns whether or not the actions are enabled and shown to the pilot and co-pilot. This will still return TRUE if the pilot uses the 'Lock Controls' action to disable co-pilot controls. - You can use the Arma 3 Event Handler - Controls Shifted to detect 'Take Controls' or 'Release Controls' actions - Boolean + Nothing + - isDLCAvailable + benchmark - Returns true if the DLC is marked as available. (Steam) + Returns the value of "3D Performance" in OFP Preferences (flashpoint.cfg). This can be used to estimate the computer performance to adapt CPU and GPU demanding settings like view distance dynamically in missions. - https://community.bistudio.com/wiki/isDLCAvailable + https://community.bistudio.com/wiki/benchmark - isDLCAvailable Number + benchmark - isDLCAvailable appid + benchmark - $Code$_Karts = 288520; - isDLCAvailable _Karts;//Returns true$/Code$ + $Code$? (benchmark 2000) : setViewDistance 2000$/Code$ undefined / undefined - (October 19, 2014) - appid can be taken from Steam DLC url. - Karts url is http://store.steampowered.com/app/ 288520 / - Zeus url is http://store.steampowered.com/app/ 275700 / - DLC bundle url is http://store.steampowered.com/app/ 304400 / + (14 March 2014) + The command is obsolete, it was used in OFP to measure PC performance. In A3 it returns 2000. - Boolean + Number + - isDamageAllowed + resistance - A getter for allowDamage command. The command indicates if damage is allowed at current locality, hence local effect of the command. A complete solution for being able to tell whether or not an object can be damaged at current locality looks like this: - $Code$_canBeDamaged = local _obj && isDamageAllowed _obj;$/Code$ + Resistance side. + When used in a format statement ( hint format ["%1",resistance] ), the string returned is "GUER". - https://community.bistudio.com/wiki/isDamageAllowed + https://community.bistudio.com/wiki/resistance - isDamageAllowed Object + resistance - isDamageAllowed object + resistance - $Code$_isGod = ! isDamageAllowed player ;$/Code$ + $Code$// SQS: + ?((side _unit) == resistance ) : hint "This is a resistance unit!"$/Code$ + + $Code$// SQF: + if (( side _unit) == resistance ) then { + hint "This is a resistance unit!"; + };$/Code$ - global / local + undefined / undefined - Boolean + Side + - isDedicated + clearOverlay - Return true if the machine (executing the command) is a dedicated multiplayer server. In single player returns false. + Clear the current overlay. + i + Some Old Editor Command - https://community.bistudio.com/wiki/isDedicated + https://community.bistudio.com/wiki/clearOverlay - isDedicated + clearOverlay Control - isDedicated + clearOverlay map - $Code$if ( isDedicated ) then { diag_log "Dedicated Server on the run !";};$/Code$ + $Code$clearOverlay _map,$/Code$ undefined / undefined - (December 21, 2014) - $Code$ if ( isDedicated ) then { - //run on dedicated server only - }; - if ( isServer ) then { - //run on dedicated server or player host - }; - if ( hasInterface ) then { - //run on all player clients incl. player host - }; - if (! isDedicated ) then { - //run on all player clients incl. player host and headless clients - }; - if (! isServer ) then { - //run on all player clients incl. headless clients but not player host - }; - if (! hasInterface ) then { - //run on headless clients and dedicated server - }; - if (! hasInterface && ! isDedicated ) then { - //run on headless clients only - };$/Code$ - Boolean + Nothing + - isEngineOn + playMoveNow - Returns true if engine is on, false if it is off. - - - https://community.bistudio.com/wiki/isEngineOn - - - isEngineOn Object - - - isEngineOn vehicle - - - $Code$_OnOff = isEngineOn _carOne$/Code$ - - - global / undefined - - - (March 20, 2015) - isEngineOn returns true for static objects without an engine - - (April 6, 2015) - Bind Engine action to User Action 1 - $Code$this addAction ["", + When used on a person,a smooth transition to the given move will be initiated, but all previous playMove are discarded. + List of moves in ArmA 2 List of moves in Armed Assault List of moves in Operation Flashpoint: Resistance + The difference between playMove and playMoveNow is that playMove adds another move to the move queue, while playMoveNow replaces the whole move queue with new move: + $Code$ player switchMove "amovpercmstpsraswrfldnon"; + [] spawn { - _this select 1 action - [ - ["EngineOn", "EngineOff"] select isEngineOn (_this select 0), - _this select 0 - ]; - }, "", -10, false, true, "User1", "_this == driver _target"];$/Code$ - - - Boolean - - - - - isEqualTo - - - Performs strict comparison between var1 and var2 and returns true if equal, otherwise false. Strict means that it would check that both arguments are of the same data type and then compare the values. - Some differences between isEqualTo and == : - It performs case sensitive comparison on Strings - It doesn't throw error when comparing different types, i.e. ("eleven" isEqualTo 11) - It can compare Arrays, Scripts and Booleans ( alive player isEqualTo true ) - It can compare non-existent game objects ( grpNull isEqualTo grpNull ) - It can compare Namespaces ( As of Arma 3 v1.47 ) - It is slightly faster than ==, especially when comparing Strings + sleep 0.5; + player playMove "amovppnemstpsraswrfldnon"; // player goes prone + player playMove "amovpknlmstpsraswrfldnon"; // player gets up on one knee + };$/Code$ + Compared to: + $Code$ player switchMove "amovpercmstpsraswrfldnon"; + [] spawn + { + sleep 0.5; + player playMove "amovppnemstpsraswrfldnon"; // player never goes prone + player playMoveNow "amovpknlmstpsraswrfldnon"; // player goes down on one knee straight away + };$/Code$ - https://community.bistudio.com/wiki/isEqualTo + https://community.bistudio.com/wiki/playMoveNow - Anything isEqualTo Anything + Object playMoveNow String - val1 isEqualTo val2 + soldier playMoveNow moveName - $Code$_arr1 = [1,[2,[3]]]; - _arr2 = [1,[2,[3]]]; - if (_arr1 isEqualTo _arr2) then { hint "Arrays match!"}$/Code$ - - $Code$if (a isEqualTo b) then { hint "a is equal to b"}; - if !(a isEqualTo b) then { hint "a is not equal to b"};$/Code$ + $Code$player playMoveNow "AmovPercMevaSlowWrflDf"$/Code$ - undefined / undefined + local / global - (July 19, 2014) - The behavior of "var1 isEqualTo var2" is pretty much equivalent to "var1 in [var2]", plus the ability to compare arrays, and slightly better performance. - - (December 3, 2014) - Simply put, "isEqualTo" is a binary comparison. Therefor it is very fast but only accepts 100% identical matches. In some other languages this is known as "===" instead of "==". - - (November 3, 2016) - When comparing with nil result is Nothing. - "nil isEqualTo player" returns "Nothing" instead of expected "false" - $Code$diag_log [nil isEqualTo player];$/Code$ - Will print "[bool]" - $Code$diag_log (str (nil isEqualTo player)) + "test";$/Code$ - Will throw Generic error in expression - "+: Type Nothing, expected Number,Array,String,Not a Number" - Boolean + Nothing + - isEqualTypeAll + isBurning - Compares types of all elements of an array to the type of a single value. + Returns whether the unit is burning. + This returns true only if unit is damaged by nearby fire, it does not check whether a fireplace is burning, use inflamed command for that. - https://community.bistudio.com/wiki/isEqualTypeAll + https://community.bistudio.com/wiki/isBurning - Array isEqualTypeAll Anything + isBurning Object - arr isEqualTypeAll val + isBurning unit - $Code$_arr = [1,2,3,4,5,6,7,8,9,0]; - _arr isEqualTypeAll ""; //false - _arr isEqualTypeAll 0; //true$/Code$ + $Code$if ( isBurning player ) then { player groupChat "I'm burning!!"; }$/Code$ undefined / undefined - (November 25, 2015) - This command will return false if the array on the left side is empty ([]) regardless of the sample value. - $Code$[] isEqualTypeAll "" - - false - $/Code$ - Boolean + Boolean + - isEqualTypeAny + playAction - Compares type of given value to every type in the given array and if match is found, true is returned. + When used on a person, a smooth transition to the given action will be initiated. + For Arma 3 actions see: playAction/actions. - https://community.bistudio.com/wiki/isEqualTypeAny + https://community.bistudio.com/wiki/playAction - Anything isEqualTypeAny Array + Object playAction String - val isEqualTypeAny types + soldier playAction action - $Code$_var = [1,2,3]; - _var isEqualTypeAny [0,"", objNull ]; //false - _var isEqualTypeAny [0,"", objNull,[]]; //true$/Code$ + $Code$soldierOne playAction "SitDown"$/Code$ - undefined / undefined + local / global - Boolean + Nothing + - isEqualTypeArray + terminate - Compares types of all elements of one array to types of all elements of another array. + Terminate (abort) spawned or execVM 'd script. Note : The given script will not terminate immediately upon terminate command execution, it will do so the next time the script is processed by the scheduler. - https://community.bistudio.com/wiki/isEqualTypeArray + https://community.bistudio.com/wiki/terminate - Array isEqualTypeArray Array + terminate Script_Handle - arr1 isEqualTypeArray arr2 + terminate scriptHandle - $Code$_arr = [1,true,"three"]; - _arr isEqualTypeArray [0,objNull,""]; //false - _arr isEqualTypeArray [0,false,""]; //true$/Code$ + $Code$_script = [] execVM "script.sqf"; + sleep 5; + terminate _script; + hint "'script.sqf' has been terminated after 5 seconds";$/Code$ undefined / undefined @@ -33649,35 +35291,31 @@ - Boolean + Nothing + - isEqualTypeParams + currentMuzzle - Compares types of all elements of input array to types of all elements of template array. Similar to isEqualTypeArray however this command is designed for fast validation of functions params, so there are differences: - Input can be anything but will be expected to be an Array, otherwise false is returned - Input array can be longer but not shorter than template array, will return false if shorter - nil could be used in template type array as a wild card to allow any type match + Returns current muzzle of unit's weapon. + This command will return 0 Number if given object is a unit that is in a vehicle. - https://community.bistudio.com/wiki/isEqualTypeParams + https://community.bistudio.com/wiki/currentMuzzle - Anything isEqualTypeParams Array + currentMuzzle Object - input isEqualTypeParams template + currentMuzzle gunner - $Code$[1,2, player,"10"] isEqualTypeParams [0,0, objNull,""]; //true - 123 isEqualTypeParams [0,0, objNull,""]; //false - [] isEqualTypeParams [0,0, objNull,""]; //false - [1,2, player ] isEqualTypeParams [0,0, objNull,""]; //false - [1,2, player,"10", true ] isEqualTypeParams [0,0, nil,""]; //true - [1,2, getPos player,"10", true ] isEqualTypeParams [0,0, nil,""]; //true$/Code$ + $Code$_muzzle = currentMuzzle player ;$/Code$ + + $Code$_muzzle = currentMuzzle ( gunner ( vehicle player ));$/Code$ undefined / undefined @@ -33685,29 +35323,28 @@ - Boolean + String + - isEqualType + getShadowDistance - Compares 2 values by their type. A much faster alternative to typeName a == typeName b. + Gets the shadows rendering distance. - https://community.bistudio.com/wiki/isEqualType + https://community.bistudio.com/wiki/getShadowDistance - Anything isEqualType Anything + getShadowDistance - val1 isEqualType val2 + getShadowDistance - $Code$_var = [1,2,3]; - _var isEqualType 0; //false - _var isEqualType []; //true$/Code$ + $Code$_value = getShadowDistance;$/Code$ undefined / undefined @@ -33715,54 +35352,56 @@ - Boolean + Number + - isFilePatchingEnabled + clearItemCargoGlobal - Returns true if file patching is enabled otherwise false + Removes all items from ammo box (or any general weapon holder container). - https://community.bistudio.com/wiki/isFilePatchingEnabled + https://community.bistudio.com/wiki/clearItemCargoGlobal - isFilePatchingEnabled + clearItemCargoGlobal Object - isFilePatchingEnabled + clearItemCargoGlobal box - undefined / undefined + global / global - Boolean + Nothing + - isFlashlightOn + modelToWorldVisual - Returns true if there is a linked and enabled flashlight on a given weapon. + Converts position from object model space to world space in render time scope. For ASL version see modelToWorldVisualWorld. - https://community.bistudio.com/wiki/isFlashlightOn + https://community.bistudio.com/wiki/modelToWorldVisual - Object isFlashlightOn String + Object modelToWorldVisual Array - unit isFlashlightOn weapon + object modelToWorldVisual modelPos - $Code$player isFlashlightOn ( currentWeapon player );$/Code$ + $Code$_aboveAndBehindPlayer = player modelToWorldVisual [0,-1,3];$/Code$ undefined / undefined @@ -33770,109 +35409,63 @@ - Boolean + Array + - isFlatEmpty + camDestroy - Checks given position against given filter params. Filter includes checks for: - If there are any objects closer than given distance from given position (in 2D) - If the area around position is flat enough to match given gradient - If the given position is over water or land - If the given position is over shore line - The gradient seems to correlate with general hill steepness: 0.1 (10%) ~6 o, 0.5 (50%) ~27 o, 1.0 (100%) ~45 o, etc.There are also some oddities about this command that need to be noted: - Objects accounted for proximity check seem to be static objects. Nearby vehicles and units do not seem to affect the output - Given position will be magically transferred into given position + getTerrainHeightASL value - The second element must be -1 ( = 0 really) at all times, otherwise command becomes unusable - The command might be a bit heavy on computations so avoid frequent and large area checks - See also: BIS_fnc_findSafePos + Destroy an object created with camCreate. camDestroy is conducted immediately, the command doesn't wait for camCommit. + NOTE: Destroying camera object does not terminate camera effect automatically. - https://community.bistudio.com/wiki/isFlatEmpty + https://community.bistudio.com/wiki/camDestroy - Array isFlatEmpty Array + camDestroy Object - position isFlatEmpty [minDistance, mode, maxGradient, maxGradientRadius, overLandOrWater, shoreLine, ignoreObject] + camDestroy object - $Code$// Check if player position is over land: - _overLand = !( position player isFlatEmpty [-1, -1, -1, -1, 0, false ] isEqualTo []);$/Code$ - - $Code$// Check if player position is over shore line: - _overShore = !( position player isFlatEmpty [-1, -1, -1, -1, 0, true ] isEqualTo []);$/Code$ - - $Code$// Check if player position is over water: - _overWater = !( position player isFlatEmpty [-1, -1, -1, -1, 2, false ] isEqualTo []);$/Code$ - - $Code$// Check if no object is closer than 5m to player position: - _isEmpty = !( position player isFlatEmpty [5, -1, -1, -1, -1, false, player ] isEqualTo []);$/Code$ - - $Code$// Check if area 10m around player position is relatively flat: - _isFlat = !( position player isFlatEmpty [-1, -1, 0.3, 10, -1] isEqualTo []);$/Code$ + $Code$camDestroy _cam;$/Code$ - $Code$// Check if area 15m around player position is very flat and empty: - _isFlatEmpty = !( position player isFlatEmpty [15, -1, 0.1, 15, -1, false, player ] isEqualTo []);$/Code$ + $Code$_cam cameraEffect ["terminate","back"]; + camDestroy _cam;$/Code$ - undefined / undefined + local / local - (April 24, 2016) - When this command is instructed to check if area at given position is empty it takes into account the radius of the bounding sphere of surrounding objects. Because of this, the high voltage columns such as "Land_HighVoltageColumnWire_F" and such objects may appear extremely large to the calculations and the position will be rejected even if visually it doesn't look too bad. To avoid this, use findEmptyPosition command first to find guaranteed empty position, then pass the result to isFlatEmpty making sure you switched off proximity check by setting 1st param to -1. For example: - $Code$// Check if given position is flat and empty within 1m radius - [4274.66,12113,0.00139618] isFlatEmpty [1, -1, 0.1, 1, -1, false, objNull ]; //[]$/Code$ - The result suggests it is not flat and empty. - $Code$// Check if given position is flat within 1m radius - [4274.66,12113,0.00139618] isFlatEmpty [-1, -1, 0.1, 1, -1, false, objNull ]; //[4274.66,12113,48.3209]$/Code$ - The result suggests it is. - $Code$// Check if given position is empty within 1m radius - [4274.66,12113,0.00139618] isFlatEmpty [1, -1, -1, -1, -1, false, objNull ]; //[]$/Code$ - The result suggests it is not empty. But the position is in the middle of a road and there is nothing within 1m but there is "Land_HighVoltageColumnWire_F" not far. - $Code$// Check if given position is empty within 1m radius ignoring nearest "Land_HighVoltageColumnWire_F" - [4274.66,12113,0.00139618] isFlatEmpty [1, -1, -1, 1, -1, false, nearestObject [[4274.66,12113,0.00139618], "Land_HighVoltageColumnWire_F"]]; //[4274.66,12113,48.3209]$/Code$ - The result now suggests it is empty. So instead of relying on internal proximity check we can combine both commands: - $Code$fnc_isFlatEmpty = - { - params ["_pos", "_params"]; - _pos = _pos findEmptyPosition [0, _params select 0]; - if (_pos isEqualTo []) exitWith {[]}; - _params =+ _params; - _params set [0, -1]; - _pos = _pos isFlatEmpty _params; - if (_pos isEqualTo []) exitWith {[]}; - _pos - }; - // Test - [[4274.66,12113,0.00139618], [1, -1, 0.1, 1, -1, false, objNull ]] call fnc_isFlatEmpty; //[4274.53,12113,48.3175] - $/Code$ - Array + Nothing + - isForcedWalk + kbHasTopic - Returns true if player is forced to walk with forceWalk. + Check if conversation topic was registered to given person. See Conversations for more details. - https://community.bistudio.com/wiki/isForcedWalk + https://community.bistudio.com/wiki/kbHasTopic - isForcedWalk Object + Object kbHasTopic String - isForcedWalk unitName + person kbHasTopic topicName - $Code$_bool = isForcedWalk player ;$/Code$ + $Code$_obiHasTopic = player kbHasTopic "helloThereGeneralK";$/Code$ + + $Code$if ( player kbHasTopic "dontShoot") then { player kbRemoveTopic "dontShoot"; };$/Code$ undefined / undefined @@ -33880,27 +35473,28 @@ - Boolean + Boolean + - isFormationLeader + isAutotest - Returns true if the specified unit is subgroup leader. + Returns true if game was started with autotest parameter - https://community.bistudio.com/wiki/isFormationLeader + https://community.bistudio.com/wiki/isAutotest - isFormationLeader Object + isAutotest - isFormationLeader unit + isAutotest - $Code$_isLeader = isFormationLeader player ;$/Code$ + $Code$_bool = isAutotest$/Code$ undefined / undefined @@ -33908,293 +35502,401 @@ - Boolean + Boolean + - isGroupDeletedWhenEmpty + ctrlMapAnimCommit - Checks if the given group marked for auto-deletion when empty. See deleteGroupWhenEmpty. + Plays the map animation. - https://community.bistudio.com/wiki/isGroupDeletedWhenEmpty + https://community.bistudio.com/wiki/ctrlMapAnimCommit - isGroupDeletedWhenEmpty Group + ctrlMapAnimCommit Control - isGroupDeletedWhenEmpty group + ctrlMapAnimCommit controlName - $Code$_isMarked = isGroupDeletedWhenEmpty _group;$/Code$ + $Code$// Center map on player: + _ctrl ctrlMapAnimAdd [0, 0.05, player ]; + ctrlMapAnimCommit _ctrl;$/Code$ - undefined / undefined + local / local - Boolean + Nothing + - isHidden + lbSetCurSel - Return whether the person is hidden (reached the hiding position). For command that tests general visibility of an object use isObjectHidden + Selects the item with the given index of the listbox or combobox with id idc of the topmost user dialog. + To deselect all, use -1: _ctrl lbSetCurSel -1; For listbox of style LB_MULTI use lbSetSelected instead. - https://community.bistudio.com/wiki/isHidden + https://community.bistudio.com/wiki/lbSetCurSel - isHidden Object + lbSetCurSel Array + + Control lbSetCurSel Number - isHidden person + lbSetCurSel [idc, index] + + control lbSetCurSel index - + $Code$lbSetCurSel [101, 0];$/Code$ + + $Code$_control lbSetCurSel 0;$/Code$ + - global / undefined + undefined / undefined - (January 1, 2017) - Tested in 1.67 DEV, seems to always return false + More information on the LB command family can be found here + + (November 29, 2014) + lbSetCurSel -1 has no effect while the listbox is populated. You should use lbClear first, then lbSetCurSel -1, then re-populate the listbox. + + (March 1, 2015) + Keep in mind that running this command against control will fire attached 'onLBSelChanged' event handler. - Boolean + Nothing - Nothing + - isIRLaserOn + selectMax - Returns true if there is a linked and enabled IR on the given weapon. + Returns the array element with maximum numerical value. Engine solution to BIS_fnc_greatestNum and BIS_fnc_findExtreme. Therefore it is expected that supplied array consists of Numbers only. Booleans however are also supported and will be evaluated as Numbers : true - 1, false - 0. nil value treated as 0. Other non Number elements (not recommended) will be evaluated as 0 and Bad conversion: scalar message will be logged into. rpt. - https://community.bistudio.com/wiki/isIRLaserOn + https://community.bistudio.com/wiki/selectMax - Object isIRLaserOn String + selectMax Array - unit isIRLaserOn weapon + selectMax array - $Code$player isIRLaserOn currentWeapon player ;$/Code$ + $Code$_max = selectMax [1,2,3,4,5]; //5$/Code$ + + $Code$// Same as, for example: + _max = _a max _b max _c max _d; + // Only faster: + _max = selectMax [_a,_b,_c,_d];$/Code$ undefined / undefined + (December 19, 2016) + Returns either number or boolean value, in case max value in array 0, command will return either 0 or false, which ever comes first. + Same for 1 and true values. + $Code$selectMax [false,0] // returns false + selectMax [0,false] // returns 0 + selectMax [true,1] // returns true + selectMax [1,true] // returns 1 + $/Code$ + in case all values are equal or less than zero, command may also return other type of values + $Code$selectMax ["",false,0,-1] // returns "" + $/Code$ + if nil value appears in array, other values are equal or less than zero, command returns nil - Boolean + Anything + - isInRemainsCollector + uniform - Checks if unit or vehicle is queued for disposal after death. + Returns name of uniform. - https://community.bistudio.com/wiki/isInRemainsCollector + https://community.bistudio.com/wiki/uniform - isInRemainsCollector Object + uniform Object - isInRemainsCollector remain + uniform unit - $Code$if ( isInRemainsCollector unit1) then { hint "unit1 is queued for disposal"};$/Code$ + $Code$_uniform = uniform _unit$/Code$ - global / undefined + undefined / undefined - Boolean + String + - isInstructorFigureEnabled + setShadowDistance - Returns the status of INSTRUCTOR FIGURE setting in UI (OPTIONS GAME GENERAL INSTRUCTOR FIGURE). + Sets the shadows rendering distance. - https://community.bistudio.com/wiki/isInstructorFigureEnabled + https://community.bistudio.com/wiki/setShadowDistance - isInstructorFigureEnabled + setShadowDistance Number - isInstructorFigureEnabled + setShadowDistance value - $Code$hint str isInstructorFigureEnabled ;$/Code$ + $Code$setShadowDistance 1000$/Code$ - undefined / undefined + undefined / local - Boolean + Nothing + - isKeyActive + tvCollapseAll - Checks whether the given key is active in the current user profile. - See keys, keysLimit and doneKeys in the description.ext file of the missions. + Collapses all tree items for the given Tree View. - https://community.bistudio.com/wiki/isKeyActive + https://community.bistudio.com/wiki/tvCollapseAll - isKeyActive String + tvCollapseAll Number + + tvCollapseAll Control - isKeyActive keyName + tvCollapseAll idc + + tvCollapseAll control - $Code$_ok = isKeyActive "Mission04Key"$/Code$ + $Code$tvCollapseAll 101;$/Code$ + + $Code$tvCollapseAll _ctrl;$/Code$ - undefined / undefined + local / local - Boolean + Nothing - Nothing + - isKindOf + cutRsc - Checks whether the object is (a subtype) of the given type. While main syntax and alt syntax support only CfgVehicles, CfgAmmo and CfgNonAIVehicles, alt syntax 2 allows to specify any config, including mission config. + Display a resource defined in RscTitles of the mission's Description.ext, the campaign's description.ext or the global config. + For greater efficiency and ease of modability it is recommended to use named layers available with alternative syntax since Arma 3 v1.57.134673 - https://community.bistudio.com/wiki/isKindOf + https://community.bistudio.com/wiki/cutRsc - Object isKindOf String + cutRsc Array - String isKindOf String + Number cutRsc Array - String isKindOf Array + String cutRsc Array - object isKindOf typeName + cutRsc [class, type, speed, showInMap] - typeName1 isKindOf typeName2 + layer cutRsc [class, type, speed, showInMap] - typeName1 isKindOf [typeName2, targetConfig] + layerName cutRsc [class, type, speed, showInMap] - $Code$vehicle player isKindOf "Tank";$/Code$ + $Code$cutRsc ["binocular", "PLAIN"]; + cutRsc ["binocular", "PLAIN", 2]; + cutRsc ["binocular", "PLAIN", 2, false ];$/Code$ - $Code$"BMP2" isKindOf "Tank";$/Code$ + $Code$2 cutRsc ["binocular", "PLAIN", 2];$/Code$ - $Code$currentWeapon player isKindOf ["Rifle", configFile "CfgWeapons"];$/Code$ + $Code$_layer = "layer1" cutRsc ["binocular", "PLAIN", 2];$/Code$ + + $Code$// Create IGUI display: + "someLayer" cutRsc ["RscTitleDisplayEmpty", "PLAIN"]; + _display = uiNamespace getVariable "RscTitleDisplayEmpty";$/Code$ - undefined / undefined + undefined / local - (April 23, 2007) - This command can be used on the whole hierarchical class tree (i.e. when checking a HMMWV, one could test for "HMMWV50", "Car", "LandVehicle", etc., all of which would return true.) - - (16 Apr, 2008) - It appears isKindOf is limited to the CfgVehicles branch of the class hierachy. - So CfgWeapons, CfgMagazines, etc will return false for checks like: - ("M9" isKindOf "Pistol") returns false - - (8 Nov, 2009) - In a2 isKindOf also works for CfgAmmo in addition to CfgVehicles: ("M_9M311_AA" isKindOf "MissileBase") returns true. NOT for CfgWeapons, CfgMagazines and others.. - - (June 16, 2015) - In case you cannot use isKindOf because of the reasons stated, just use BIS fnc returnParents with class names as return value: - $Code$ _isKindOf = "Rifle" in [( configFile "CfgWeapons" "BWA3_G36K"), true ] call BIS_fnc_returnParents ; // is true$/Code$ + (30 Jun, 2008) + Using cutRsc (instead of titleRsc ) for a HUD has the benefits of: + having the HUD automatically hide itself when you access the map and redisplay itself after closing the map. + using the 'Direct communication' chat channel messages will not interfere with the HUD by hiding it. - (September 6, 2015) - In A3 isKindOf works well with CfgWeapons and CfgMagazines using the syntax from example 3. - It should be prefered to James' solution as it performs more than 25x faster. Tested in debug console with the following code snippets: - $Code$bool = "CA_Magazine" in ([( configFile "CfgMagazines" "HandGrenade"),true] call BIS_fnc_returnParents ); -- 0.12111ms$/Code$ - $Code$bool = "HandGrenade" isKindOf ["CA_Magazine", configFile "CfgMagazines"]; -- 0.00439453ms$/Code$ - When checking in CfgVehicles the syntax from example 2 performs a little faster. + (17 Oct, 2013) + Regarding removing current resource with cutRsc ["Default", "PLAIN"]. If it does't work and it gives you error message that "Default" is not found, add it by yourself to RscTitles in description.ext so it looks like this: + class RscTitles + { + class Default + { + idd = - 1 ; + fadein = 0 ; + fadeout = 0 ; + duration = 0 ; + }; + }; + Alternatively, you can use cutText, yes cutText command to cancel your resources. As Karel Moricky explains: "All 'cut' commands are in the same layer, the same as all 'title' commands are in another one." So to remove cutRsc resource execute cutText on the same layer: + $Code$ cutRsc ["myRsc", "PLAIN"]; //show + cutText ["", "PLAIN"]; //remove$/Code$ + $Code$10 cutRsc ["myRsc", "PLAIN"]; //show + 10 cutText ["", "PLAIN"]; //remove$/Code$ + Also if you use layers would be a good idea to register them with BIS_fnc_rscLayer to avoid possible clashes with other layers: + $Code$("myLayerName" call BIS_fnc_rscLayer ) cutRsc ["myRsc","PLAIN"]; //show + ("myLayerName" call BIS_fnc_rscLayer ) cutText ["","PLAIN"]; //remove$/Code$ + You can also immediately remove resource with cutFadeOut command: $Code$123 cutFadeOut 0;$/Code$ - Boolean - Boolean - Boolean + Nothing - Nothing - Number + - isLightOn + hintC - Returns true if vehicle headlights are on otherwise false. + Displays attractive hint in the center of the screen. Player control is taken away until user presses "Continue". After user confirmation, the content of the hintC is repeated again in a normal hint. This type of hint can also have a title. It is also possible to drag this type of hint around the screen. - https://community.bistudio.com/wiki/isLightOn + https://community.bistudio.com/wiki/hintC - isLightOn Object + hintC String + + String hintC Array + + String hintC Structured_Text + + String hintC String - isLightOn vehicle + hintC content + + title hintC [content1, content2,] + + title hintC content + + title hintC content - $Code$_lightsOn = isLightOn vehicle player ;$/Code$ + $Code$hintC "Press W to move forward";$/Code$ - $Code$_pilotLightOn = isLightOn heli;$/Code$ + $Code$// Same as the above in Arma3 but without second hint displayed: + hintC "Press W to move forward"; + hintC_EH = findDisplay 57 displayAddEventHandler ["unload", { + 0 = _this spawn { + _this select 0 displayRemoveEventHandler ["unload", hintC_EH]; + hintSilent ""; + }; + }];$/Code$ + + $Code$"Instructions" hintC [ + "Press W to move forward.", + "Press S to move backwards.", + "Use the mouse to turn right or left.", + "Press V for weapon sights." + ];$/Code$ + + $Code$// Same as the above in Arma3 but without second hint displayed: + "Instructions" hintC [ + "Press W to move forward.", + "Press S to move backwards.", + "Use the mouse to turn right or left.", + "Press V for weapon sights." + ]; + hintC_arr_EH = findDisplay 72 displayAddEventHandler ["unload", { + 0 = _this spawn { + _this select 0 displayRemoveEventHandler ["unload", hintC_arr_EH]; + hintSilent ""; + }; + }];$/Code$ + + $Code$_separator1 = parseText " br / ------------------------ br / "; + _image = "\ca\ui\textures\aus_flag.paa"; + _txt = composeText [ image _image, "Heading Text", _separator1, "Content"]; + "" hintC _txt;$/Code$ - global / undefined + undefined / local + This command must be executed after mission start. If you place it into init.sqs or init field of some unit, it will not work. Just add a little delay (~0.001) and the place the command. + + To display multiple messages after another you have to add a small delay in between. Otherwise only the first message will be displayed. hintC "foo"; sleep 0.1; hintC "bar"; Without a sleep statement hintC will not suspend the script it has been called from. + + HintC can be used with formatting like this: HintC format["Hello %1",player]. + + (March 19, 2015) + "Titled" hintC all use display #72 while "untitled" one uses display #57. If you are trying examples in Arma 3 debug console, add little delay like this: $Code$[] spawn {sleep 0.5;....your example code goes here...};$/Code$ or no hintC will be displayed. - Boolean + Nothing - Nothing - Nothing - Nothing + - isLocalized + setGroupIconsVisible - Checks whether given string name is localized. + Sets if group icons are visible. - https://community.bistudio.com/wiki/isLocalized + https://community.bistudio.com/wiki/setGroupIconsVisible - isLocalized String + setGroupIconsVisible Array - isLocalized stringName + setGroupIconsVisible array - $Code$if ( isLocalized "STR_DN_SNAKE") then { - hint localize "STR_DN_SNAKE"; - } else { - hint "STR_DN_SNAKE"; - diag_log "ToDo: STR_DN_SNAKE is not localized"; - };$/Code$ + $Code$setGroupIconsVisible [true,true];//[show markers on map, show markers on player hud] + setGroupIconsVisible [true,false]; //Show only 2D + setGroupIconsVisible [false,false];$/Code$ undefined / undefined @@ -34202,266 +35904,241 @@ - Boolean + Nothing + - isManualFire + progressPosition - Returns true if manual fire is on. Manual fire could either be selected in vehicle action menu (if available) or with action "ManualFire" and "ManualFireCancel". Always returns false for a soldier. + Returns the current position in the progress bar. - https://community.bistudio.com/wiki/isManualFire + https://community.bistudio.com/wiki/progressPosition - isManualFire Object + progressPosition Control - isManualFire vehicleName + progressPosition control - $Code$_bool = isManualFire vehicle player ;$/Code$ + $Code$_pos = progressPosition _control;$/Code$ - global / undefined + undefined / undefined - (February 5, 2017) - Manual fire means the effectiveCommander of the vehicle controls firing (but not aiming) of the gunner turret weapons (usually path [0]), while unable to fire his own weapons. - Boolean + Number + - isMarkedForCollection + enableReload - Checks whether the object is marked for weapons collection. + Enable / disable reload when magazine is empty. - https://community.bistudio.com/wiki/isMarkedForCollection + https://community.bistudio.com/wiki/enableReload - isMarkedForCollection Object + Object enableReload Boolean - isMarkedForCollection object + object enableReload enable - $Code$_marked = isMarkedForCollection _truck$/Code$ + $Code$_vehicle enableReload false ;$/Code$ - global / undefined + undefined / undefined - Boolean + Nothing + - isMultiplayerSolo + setUnitPos - Returns true when playing a game in solo multiplayer (for example Apex coop campaign PLAY SOLO option). + Set unit position rules. Mode may be one of: + "DOWN" - unit goes prone and stays prone. + "UP" - unit stands and stays standing. + "MIDDLE" - Kneel Position. ArmA version 1.04 (Unit will not kneel if it is unarmed ) + "AUTO" - unit chooses mode according to circumstances. + This command will not change the stance of the human player, even though it will change the output of unitPos command. To change player stance use playAction or playActionNow : + $Code$ player playAction "PlayerProne"; // DOWN + player playAction "PlayerStand"; // UP + player playAction "PlayerCrouch"; // MIDDLE$/Code$ - https://community.bistudio.com/wiki/isMultiplayerSolo + https://community.bistudio.com/wiki/setUnitPos - isMultiplayerSolo + Object setUnitPos String - isMultiplayerSolo + unit setUnitPos mode - + $Code$_soldier setUnitPos "UP";$/Code$ + - undefined / undefined + local / global + (18 September 2008‎) + Command most likely only works if run before join into group after createUnit. + + (11 March 2011) + The above comment by Dwarden about 'an additional join required' is no longer true for Operation Arrowhead. + + (26 September 2013‎) + A unit might not always go prone when ordered to setUnitPos "DOWN", if the unit doesn't agree with the command. To force the unit to go prone, stop the unit from firing by setCombatMode "BLUE" and then order the unit to prone. - Boolean + Nothing + - isMultiplayer + removeAllAssignedItems - Return true if multiPlayer. + Unassigns and deletes all linked items from inventory. The commands operates on assignedItems array, which doesnt include goggles or headgear. Use removeGoggles and removeHeadgear for those. - https://community.bistudio.com/wiki/isMultiplayer + https://community.bistudio.com/wiki/removeAllAssignedItems - isMultiplayer + removeAllAssignedItems Object - isMultiplayer + removeAllAssignedItems unit - $Code$if (isMultiplayer) then { - //...block - }$/Code$ + $Code$removeAllAssignedItems player ;$/Code$ - undefined / undefined + local / global - Boolean + Nothing + - isNil + setVectorUp - Tests whether the variable defined by the String argument is undefined, or whether an expression result passed as Code is undefined. - The command returns true if the variable or the expression result is undefined (i.e. the expression result is Void ), and false in all other cases. + Set object's up vector. Direction of the object remain unchanged. Default object's vectorUp is [0,0,1]. + In Multiplayer, setVectorUp must be executed on the machine where the object it applied to is local. - https://community.bistudio.com/wiki/isNil + https://community.bistudio.com/wiki/setVectorUp - isNil String - - isNil Code + Object setVectorUp Array - isNil variableName - - isNil code + object setVectorUp [x, y, z] - $Code$if ( isNil "_pokus") then {_pokus = 0};$/Code$ + $Code$// Turn object upside down: + _obj setVectorUp [0,0,-1];$/Code$ - $Code$isNil { player getVariable "someVar"};$/Code$ + $Code$// Align object with the terrain underneath: + _obj setVectorUp surfaceNormal position _obj;$/Code$ - undefined / undefined + local / global - I recently had a strange experience with this command. I forgot to wrap the name of the variable with quotes, and it returned the opposite of the true null status of the variable. Just something to watch out for. - - ^ If you don't wrap the name of the variable in quotes, then it will instead read the value of the variable itself. If that variable is a string or code, then the command will use that string or code held by the variable. Example: - _myvar = "_hisvar"; - isnil _myvar; - //will return true if _hisvar is null - _myvar = {tank1}; - sleep (random 50); - isnil _myvar; - //will return if tank1 is nil, at the time the isnil command is checked (not at the time _myvar is established) - -- General Barron 10:37, 30 December 2009 (CET) - - isNil is also able to check if an expression is undefined. As such, an alternative way to check variables would be: - isNil {variable} - you can use this method to also check if variables defined using setVariable exist as well: - isNil {player getVariable "Something"} - As well as testing if a function returns a value - func_ChangeVehicleName = - { - _this setVehicleVarName "newName"; - }; - if (isNil {player call func_ChangeVehicleName}) // returns true, because this function does not return anything - - (September 25, 2014) - While isNil isn't available in OFP/CWA you can easily emulate it with something like this: - _nil = format["%1",_nilstring]; - ?(format["%1",foo]==_nil): foo = "Hello World!" + setVectorUp can only influence an object's bank. It can not influence pitch. Example: + player setVectorUp [0,1,0] + If the player is facing 0 degrees (north), then this will do NOTHING. + If the player is facing 90 degrees (east), then this will make him bank 90 degrees to his left. - (October 25, 2014) - You can also use isNil to check if an array element exists or if a setVariable variable exists - $Code$_array = [0,1,2,3]; - if (isNil {_array select 4}) then {hint "Element does not exist";};$/Code$ - $Code$if ( isNil { missionNamespace getVariable "MY_VARIABLE"})$/Code$ - When trying to test array elements, you can only test elements that are 1 element out of range. Testing elements 2 or more elements out of range will result in a script error. + (March 22, 2007) + An in-depth discussion on the concept of vectors is available here. - (June 25, 2017) - isNil in combination with code will execute that code so be aware. + (March 16, 2008) + Command can be also used to rotate camera in all three axis (which also mean it's possible to set camera bank). - (July 18, 2017) - isNil CODE will execute the code in unscheduled environment + (October 3, 2013) + It is possible to change both pitch and bank of an object ( surfaceNormal application for instance). Assuming an ammo box in the following example is facing North (default direction is 0): $Code$_ammobox setVectorUp [0,1,0]; //box is pitched 90 degrees forward + _ammobox setVectorUp [1,0,0]; //box is banked 90 degrees to the right$/Code$ + However the above will stop working as soon as you attach the box to something. The following trick however will work in this case: + $Code$_ammobox attachTo [ player, [0,2,1]]; + _ammobox setVectorUp [0,0.99,0.01]; //box is pitched ~90 degrees forward + _ammobox setVectorUp [0.99,0,0.01]; //box is banked ~90 degrees to the right$/Code$ - Boolean - Boolean + Nothing + - isNull + magazinesAllTurrets - Checks whether the tested item is Null. - Which null type the item has to be equal to depends on the type of game entity tested: - Objects - objNull - Controls - controlNull - Displays - displayNull - Groups - grpNull - Locations - locationNull (since ARMA 2) - Tasks - taskNull (since ARMA 2) - Scripts - scriptNull (since Arma 3 1.29.127075) - Configs - configNull (since Arma 3 1.53.133130) - Note: A test via == does not work, because, for example, objNull is not equal to anything, not even to itself. Use isEqualTo. + Returns all magazines (including empty) from all vehicle turrets (including driver turret [-1]) and their ammo counts. - https://community.bistudio.com/wiki/isNull + https://community.bistudio.com/wiki/magazinesAllTurrets - isNull Object/Control/Display/Group + magazinesAllTurrets Object - isNull entity + magazinesAllTurrets vehicle - $Code$if ( isNull obj) then { hint "doesn't exist";};$/Code$ + $Code$_mags = magazinesAllTurrets vehicle player ;$/Code$ global / undefined - (December 9, 2015) - isNull does not work with the TEAM_MEMBER type. - Use this instead: - $Code$_tmember isEqualTo teamMemberNull$/Code$ - - (December 9, 2015) - The note in the description does not apply to the CONFIG type, probably due to backwards compatibility. - $Code$configNull == configNull - - true - $/Code$ - Boolean + Array + - isNumber + gusts - Check if config entry represents number. + Return the current gusts value. Scale is 0 to 1. - https://community.bistudio.com/wiki/isNumber + https://community.bistudio.com/wiki/gusts - isNumber Config + gusts - isNumber config + gusts - $Code$_ok = isNumber (configFile "CfgVehicles") - // Result is false$/Code$ + $Code$_gustsval = gusts ;$/Code$ undefined / undefined @@ -34469,113 +36146,184 @@ - Boolean + Number + - isObjectHidden + camSetFov - Checks visibility of a given object on the local machine. + Set the zoom level ( F ield O f V iew) of the given camera. + The zoom level is from 0.01 for the nearest and 8.5 for the furthest zoom value, with a default zoom level of 0.75 + The angle of the field of view is atan(FOV)*2 radians when in 4:3 aspect ratio. - https://community.bistudio.com/wiki/isObjectHidden + https://community.bistudio.com/wiki/camSetFov - isObjectHidden Object + Object camSetFov Number - isObjectHidden object + camera camSetFov level - $Code$_bobIsHidden = isObjectHidden bob;$/Code$ + $Code$_cam camSetFov 0.75;$/Code$ - global / local + local / local - Boolean + Nothing + - isObjectRTD + drawTriangle - Returns true if RTD model is loaded + Draws a single triangle or multiple triangles on the map. Triangle is defined by 3 positions of its verticies: p0, p1, p2 in a single array [ p0, p1, p2 ]. Next 3 positions in the same array [p0, p1, p2, p0, p1, p2 ] will be used to draw second triangle, another 3 positions [p0, p1, p2, p0, p1, p2, p0, p1, p2 ] to draw 3rd and so on. + NOTE : when fill param is absent or is an empty string "", the triangle is drawn with lines of the color set in color param. In order to draw color filled triangle of the same color as color param, set fill param to opaque white procedural texture "#(rgb,1,1,1)color(1,1,1,1)". - https://community.bistudio.com/wiki/isObjectRTD + https://community.bistudio.com/wiki/drawTriangle - isObjectRTD Object + Control drawTriangle Array - isObjectRTD helicopter + map drawTriangle [vertices, color, fill] - $Code$_heliRTD = isObjectRTD vehicle player ;$/Code$ + $Code$findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", + { + _this select 0 drawTriangle + [ + [ + player getRelPos [100, 0], + player getRelPos [100, -135], + player getRelPos [100, 135] + ], + [1,0,0,0.5], + "#(rgb,1,1,1)color(1,1,1,1)" + ]; + }];$/Code$ undefined / undefined + (July 16, 2017) + Example youtube video: [1] $Code$_ctrl = findDisplay 12 displayCtrl 51; + _ctrl setVariable ["data", [1, "#(rgb,1,1,1)color(1,1,1,1)", 1000, position player, + { + params ["_p", "_r", "_a", "_sr", "_ba"]; + _sr = _r * 0.382; + _pb = _p getPos [_sr, _a + 180]; + [ + _p getPos [_r, _a], _p getPos [_sr, _a + 36], _p getPos [_sr, _a - 36], + _pb, _p getPos [_r, _a - 72], _p getPos [_r, _a + 72], + _p getPos [_r, _a - 144], _p getPos [_sr, _a - 108], _pb, + _p getPos [_r, _a + 144], _p getPos [_sr, _a + 108], _pb + ] + }]]; + _ctrl ctrlRemoveAllEventHandlers "Draw"; + _ctrl ctrlAddEventHandler ["Draw", + { + _map = _this select 0; + _data = _map getVariable "data"; + _data params ["_i", "_fill", "_dist", "_pos", "_fn"]; + _data set [0, _i + 1]; + _size = _i % _dist; + if (_size == 0) then + { + _data set [0, 1]; + _data set [1, ["#(rgb,1,1,1)color(1,1,1,1)", ""] select (random 1 0.3)]; + _data set [2, 250 + round random 750]; + }; + _alpha = linearConversion [_dist, 0, _dist - _size, 1, 0]; + _map drawEllipse [_pos, _size * 2, _size * 2, 0, [0,0,1,_alpha], _fill]; + _map drawTriangle [[_pos getPos [_size, -_size], _size, _size] call _fn, [1,0,0,_alpha], _fill]; + _map drawTriangle [[_pos getPos [_size, -_size + 120], _size, _size] call _fn, [0,1,0,_alpha], _fill]; + _map drawTriangle [[_pos getPos [_size, -_size - 120], _size, _size] call _fn, [1,1,0,_alpha], _fill]; + }]; + openMap true;$/Code$ - Boolean + Nothing + - isOnRoad + nearObjects - Checks if given position is on road. Same as roadAt, only return is boolean instead of road object. + Find objects in a sphere with given radius. The first object in the returned array is not necessarily the closest one. If you need returned objects to be sorted by distance, use nearestObjects. If typeName is given, only objects of given type (or its subtype) are listed. - https://community.bistudio.com/wiki/isOnRoad + https://community.bistudio.com/wiki/nearObjects - isOnRoad Object/Array + Position/Position2D/Object nearObjects Number + + PositionAGL/Position2D/Object nearObjects Array - isOnRoad position + position nearObjects radius + + position nearObjects [typeName, radius] - $Code$_objOnRoad = isOnRoad player ;$/Code$ + $Code$_list = position player nearObjects 50;$/Code$ - $Code$_posOnRoad = isOnRoad ASLToAGL getPosASL player ;$/Code$ + $Code$_list = [_xpos,_ypos] nearObjects ["House", 20];$/Code$ + + $Code$_list = player nearObjects 20;$/Code$ - global / undefined + undefined / undefined + (June 30, 2007) + Units in vehicles are not detected via this command. + + (December 15, 2011) + In the second example, you can't omit the typeName parameter. It's required and you'll get an error if you don't supply it. Use "All" as an alternative to leaving it out. (CO 1.59) + + (January 3, 2013) + If you use the first example, it will return objects many more objects such as pollen, honeybees and crucially, triggers. Triggers will show in the returned array as "no shape" but you can use typeOf to get the classname, which will give "EmptyDetector". This will not return objects that don't have classnames such as plants, stones and some map objects like vehicle wrecks. nearestObjects will find objects without classnames. + + (August 8, 2017) + The example 2 means that the command will include all types which inherit from the given type. As an example, when using "Helipad_Base_F", the command will detect all types of helipads (Land_HelipadSquare_F, Land_HelipadCircle_F, Land_HelipadEmpty_F, etc) in the given radius. - Boolean + Array - Array + - isPipEnabled + copyWaypoints - Returns true if Picture in Picture (Render to Texture) is enabled. + Copy the chain of waypoints from source to target group. The target group will start to process waypoints from the first one. - https://community.bistudio.com/wiki/isPipEnabled + https://community.bistudio.com/wiki/copyWaypoints - isPipEnabled + Group copyWaypoints Group - isPipEnabled + groupTo copyWaypoints groupFrom - $Code$PIPon = isPipEnabled;$/Code$ + $Code$group1 copyWaypoints group2;$/Code$ undefined / undefined @@ -34583,206 +36331,187 @@ - Boolean + Nothing + - isPlayer + getCustomAimCoef - Checks if given person is player. Returns true for headless clients as well. + Returns aimPrecision from animation state with custom value that will directly affects weapon sway size and speed. - https://community.bistudio.com/wiki/isPlayer + https://community.bistudio.com/wiki/getCustomAimCoef - isPlayer Object + getCustomAimCoef Object - isPlayer person + getCustomAimCoef unit - $Code$if ( isPlayer _Soldier1) then { - _Soldier1 setDamage 1; - };$/Code$ - - $Code$_playerCount = { isPlayer _x} count playableUnits ;$/Code$ + $Code$_coef = getCustomAimCoef player$/Code$ global / undefined - (1 August, 2006) - This is not the same as testing object == player, because in MP it tests for any player, not only for the local one. If object is a vehicle, the test is done for the vehicle commander. - Boolean + Number + - isRealTime + addMPEventHandler - Returns true if the mission editor is operating in real time mode. - i - Some Old Editor Command + Adds MP event handler (EH) to the given object and returns EH handle. MP event handlers are added globally to every client on network in multiplayer and will fire on every client too upon event. If EH has some data to return upon event (e.g. the "MPKilled" EH will return an array with 2 elements: the killed unit, and the killer), it is passed in _this variable. Since Arma 3 v.1.63.137807 the EH handle is also stored in _thisEventHandler variable and is available during EH code execution. For more information see: Arma_3:_Event_Handlers#addMPEventHandler - https://community.bistudio.com/wiki/isRealTime + https://community.bistudio.com/wiki/addMPEventHandler - isRealTime Control + Object addMPEventHandler Array - isRealTime map + object addMPEventHandler [type, expression] - $Code$_isRealTime = isRealTime _map$/Code$ + $Code$_index = player addMPEventHandler ["mpkilled", {Null = _this execVM "playerkilled.sqf";}];$/Code$ - undefined / undefined + global / global + (May 8, 2015) + MP EHs are added on every PC and execute on every PC, apart from MPRespawn, that only executes at the locality where unit respawns. - Boolean + Number + - isRemoteExecutedJIP + ropeCreate - Returns true if the code context is being remote executed from the JIP queue by remoteExec or remoteExecCall (when JIP param was set). It is a subset of isRemoteExecuted : - Normal remote execution: - isRemoteExecuted - true - isRemoteExecutedJIP - false - Remote execution from JIP queue: - isRemoteExecuted - true - isRemoteExecutedJIP - true - In SP always returns false. + Create a rope (PhysX rope in Arma 3). - https://community.bistudio.com/wiki/isRemoteExecutedJIP + https://community.bistudio.com/wiki/ropeCreate - isRemoteExecutedJIP + ropeCreate Array - isRemoteExecutedJIP + ropeCreate [fromObject, fromPoint, toObject, toPoint, segments, length] + + ropeCreate [fromObject, fromPoint, length, segments, unroll] - $Code$_remoteExecutedJIP = isRemoteExecutedJIP ;$/Code$ + $Code$myRope = ropeCreate [ vehicle player, "slingload0", myCargo, [0, 0, 0], 10]; //A3 example$/Code$ + + $Code$myRope = ropeCreate [ vehicle player, "fastrope0", 10, 10, true ]; //TakeOn example$/Code$ + + $Code$myRope = ropeCreate [veh1, [0,0,-2], veh2, [0,0,0], 10] //A3 1.34$/Code$ undefined / undefined - - - Boolean - - + (November 8, 2014) + Doesn't work well for towing vehicles on the ground. + Their wheels don't turn freely and have a LOT of friction. You'll most likely end up flipping the vehicle over if you try to tow it. + Also note that ropes can be destroyed/cut by shooting at them. + + (January 4, 2015) + Pay special attention to what is your fromObject and what is your toObject as this will have an impact on the physics of the rope. + For example: If you want to tow an Assault CRRC from a heavier Speedboat Minigun, attach two boats together with a rope. If you drive the Speedboat Minigun and set the CRRC as the fromObject, the rope will have almost no elasticity and the CRRC will yank around as you tow it. However, if you set the CRRC as the toObject, the rope will have more elasticity and will be a little friendlier for the CRRC when you are towing it. + + (July 9, 2015) + Parameters segments and unroll are not supported in Arma 3. Segments are set automatically according the length of a rope. + + + Object + + + - isRemoteExecuted + showWarrant - Returns true if the code context is being remote executed by remoteExec or remoteExecCall. In SP always returns false. See also isRemoteExecutedJIP + Enable ID card (default false ). Obsolete command. - https://community.bistudio.com/wiki/isRemoteExecuted + https://community.bistudio.com/wiki/showWarrant - isRemoteExecuted + showWarrant Boolean - isRemoteExecuted + showWarrant show - $Code$_remoteExecuted = isRemoteExecuted ;$/Code$ - + undefined / undefined - Boolean + Nothing + - isServer + className - Returns true if the machine (executing the command) is the server in a multiplayer game or is running single player. isServer will return true for both, dedicated server and player hosted. Dedicated server could be detected with isDedicated command. Hosted by player server can be detected by presense of UI: isServer && hasInterface + Returns short name of location. - https://community.bistudio.com/wiki/isServer + https://community.bistudio.com/wiki/className - isServer + className Location - isServer + className loc - $Code$if (! isServer ) exitWith {};$/Code$ - + undefined / undefined - (April 8, 2011) - You can use isServer inside the condition of a trigger to have the trigger activate only for the server. All other conditions for the trigger will be checked across all machines, but it will only activate the trigger created on the server. For example: $Code$this && isServer $/Code$ - - (December 21, 2014) - $Code$ if ( isDedicated ) then { - //run on dedicated server only - }; - if ( isServer ) then { - //run on dedicated server or player host - }; - if ( hasInterface ) then { - //run on all player clients incl. player host - }; - if (! isDedicated ) then { - //run on all player clients incl. player host and headless clients - }; - if (! isServer ) then { - //run on all player clients incl. headless clients but not player host - }; - if (! hasInterface ) then { - //run on headless clients and dedicated server - }; - if (! hasInterface && ! isDedicated ) then { - //run on headless clients only - };$/Code$ - Boolean + String + - isShowing3DIcons + getBurningValue - Returns true if the editor is set to draw 3D icons. - i - Some Old Editor Command + Returns amount of damage from fire. - https://community.bistudio.com/wiki/isShowing3DIcons + https://community.bistudio.com/wiki/getBurningValue - isShowing3DIcons Control + getBurningValue Object - isShowing3DIcons map + getBurningValue unit @@ -34792,27 +36521,28 @@ - Boolean + Number + - isSimpleObject + leaderboardDeInit - Returns true if given object is simple object + Deletes internal class for the leaderboard with given name. Returns true if the board has been found and deinitialized. - https://community.bistudio.com/wiki/isSimpleObject + https://community.bistudio.com/wiki/leaderboardDeInit - isSimpleObject Object + leaderboardDeInit String - isSimpleObject object + leaderboardDeInit boardName - $Code$_isSimple = isSimpleObject _obj1;$/Code$ + $Code$leaderboardDeInit "TT01"$/Code$ undefined / undefined @@ -34820,55 +36550,61 @@ - Boolean + Boolean + - isSprintAllowed + getArtilleryETA - Returns true if player is allowed to sprint + Returns ETA to the target in seconds for given artillery unit based on target position and used magazine, -1 if target can't be hit. - https://community.bistudio.com/wiki/isSprintAllowed + https://community.bistudio.com/wiki/getArtilleryETA - isSprintAllowed Object + Object getArtilleryETA Array - isSprintAllowed unit + unit getArtilleryETA [targetPosition, magazineType] - $Code$isSprintAllowed player;$/Code$ + $Code$_mortar getArtilleryETA [ getPos _target, getArtilleryAmmo [_mortar] select 0];$/Code$ + + $Code$_mortar getArtilleryETA [ position _target, currentMagazine _mortar];$/Code$ - undefined / undefined + global / undefined + (August 26, 2013) + To avoid wrong ETA readings, position of the target should only be obtained via position or getPos - Boolean + Number + - isStaminaEnabled + groupSelectedUnits - Check if stamina depletion is enabled + Returns selected units in source group for normal commanding mode (individual units). For the High Command equivalent, see hcSelected. - https://community.bistudio.com/wiki/isStaminaEnabled + https://community.bistudio.com/wiki/groupSelectedUnits - isStaminaEnabled Object + groupSelectedUnits Object - isStaminaEnabled unit + groupSelectedUnits unit - $Code$isStaminaEnabled player;$/Code$ + $Code$_selectedUnits = groupSelectedUnits player ;$/Code$ undefined / undefined @@ -34876,91 +36612,97 @@ - Boolean + Array + - isSteamMission + <= - Returns true if the current mission is a Steam Workshop mission. + Checks if the left number is smaller than or equal to the right one - https://community.bistudio.com/wiki/isSteamMission + https://community.bistudio.com/wiki/a_less%3D_b - isSteamMission + Number <= Number - isSteamMission - + - $Code$if ( isSteamMission ) then - { - hint "Thank you for subscribing to my mission on Steam!"; - } - else - { - hint "Thank you for downloading my mission off the Internet!"; - };$/Code$ - + undefined / undefined - Boolean + Boolean + - isStreamFriendlyUIEnabled + camSetTarget - Returns the status of STREAM FRIENDLY UI setting in UI (OPTIONS GAME GENERAL STREAM FRIENDLY UI). + Set the target object or position where the given camera should point at. Needs the call of camCommit to be conducted. - https://community.bistudio.com/wiki/isStreamFriendlyUIEnabled + https://community.bistudio.com/wiki/camSetTarget - isStreamFriendlyUIEnabled + Object camSetTarget Object + + Object camSetTarget Array - isStreamFriendlyUIEnabled + camera camSetTarget target + + camera camSetTarget position - $Code$hint str isStreamFriendlyUIEnabled ;$/Code$ + $Code$_camera camSetTarget player ;$/Code$ + + $Code$_camera camSetTarget [2540,1503,26];$/Code$ + + $Code$_cam = "camera" camCreate ( player modelToWorld [0,100,10]); + _cam camSetTarget player ; + _cam camSetRelPos [0, 0.5, 1.5]; + _cam cameraEffect ["internal", "back"]; + _cam camCommit 1; + player setRandomLip true ;$/Code$ - undefined / undefined + local / local - Boolean + Nothing - Nothing + - isText + createDiarySubject - Check if config entry represents text. + Create a new subject page in a log. - https://community.bistudio.com/wiki/isText + https://community.bistudio.com/wiki/createDiarySubject - isText Config + Object createDiarySubject Array - isText config + person createDiarySubject [subject, displayName, picture] - $Code$_ok = isText (configFile "CfgVehicles") - // Result is false$/Code$ + $Code$_index = player createDiarySubject ["myPage","My page"];$/Code$ undefined / undefined @@ -34968,70 +36710,58 @@ - Boolean + Number + - isTouchingGround + enableCaustics - Returns true if object is touching the ground. + Enable/disable caustics drawing. - https://community.bistudio.com/wiki/isTouchingGround + https://community.bistudio.com/wiki/enableCaustics - isTouchingGround Object + enableCaustics Boolean - isTouchingGround object + enableCaustics bool - $Code$if ( isTouchingGround player ) then { hint "Terraferma!";};$/Code$ - + - global / undefined + undefined / undefined - (June 1, 2014) - If you are using this command as a validation method, it should not be the sole thing you are checking for, as the result is often inaccurate. For example, it returns false for some helicopters when landed on the roof of certain buildings, and it always returns false for boats, even if they are beached. - - (September 29, 2016) - In addition to previous statement: That behaviour is true, simply because isTouchingGround applied to a player unit (or any unit) is frozen to a last state when unit enters vehicle. - To get proper return from this command you should go for units vehicle : - $Code$_var = isTouchingGround player // Unreliable - _var = isTouchingGround (vehicle player) // Pretty reliable - $/Code$ - - (November 10, 2016) - This command returns always true if the falling object is attached to some other object with the command attachTo, like for vehicle air drop with parachute. - - (April 26, 2017) - Be aware: it's not reliable on remote objects. + (October 23, 2017) + Setting this to false will disable a light refraction on "liquid" objects like sea water. This has no effect on solid (static) objects. - Boolean + Nothing + - isTurnedOut + getObjectViewDistance - Returns true if given unit is turned out, otherwise false. The output changes to true after unit finished turning out, however will change to false almost immediately after unit is ordered to turn in. + Gets the values of rendering distances of objects and shadows. - https://community.bistudio.com/wiki/isTurnedOut + https://community.bistudio.com/wiki/getObjectViewDistance - isTurnedOut Object + getObjectViewDistance - isTurnedOut unit + getObjectViewDistance - $Code$_commanderOut = isTurnedOut (tank turretUnit [0,0]);$/Code$ + $Code$_arr = getObjectViewDistance ;$/Code$ undefined / undefined @@ -35039,27 +36769,28 @@ - Boolean + Array + - isTutHintsEnabled + atan - Returns the status of TUTORIAL HINTS setting in UI (OPTIONS GAME GENERAL TUTORIAL HINTS). + ArcTangent of a number, result in Degrees. - https://community.bistudio.com/wiki/isTutHintsEnabled + https://community.bistudio.com/wiki/atan - isTutHintsEnabled + atan Number - isTutHintsEnabled + atan x - $Code$hint str isTutHintsEnabled ;$/Code$ + $Code$_degrees = atan 1; //45$/Code$ undefined / undefined @@ -35067,27 +36798,28 @@ - Boolean + Number + - isUAVConnectable + teamType - Returns true if UAV is connectable by AV terminal(s). + Returns a type of given team. - https://community.bistudio.com/wiki/isUAVConnectable + https://community.bistudio.com/wiki/teamType - Object isUAVConnectable Array + teamType Team_Member - object isUAVConnectable [uav, checkAllItems] + teamType team - $Code$connectable = unit isUAVConnectable [uav,true];$/Code$ + $Code$_type = teamType _team;$/Code$ undefined / undefined @@ -35095,114 +36827,145 @@ - Boolean + String + - isUAVConnected + unitsBelowHeight - Returns true if UAV is connected to some terminal. + Returns units in group/array below given height Above The Land (ATL). Current unit height ATL could be found with + _height = ( getPosATL _unit) select 2; - https://community.bistudio.com/wiki/isUAVConnected + https://community.bistudio.com/wiki/unitsBelowHeight - isUAVConnected Object + Group/Array unitsBelowHeight Number - isUAVConnected uav + units unitsBelowHeight height - $Code$bool = isUAVConnected cursorTarget ;$/Code$ + $Code$_allOnGroudUnits = group player unitsBelowHeight 10;$/Code$ + + $Code$_units = allUnits unitsBelowHeight 30;$/Code$ - undefined / undefined + global / undefined + (Nov 12, 2009) + the height is calculated above terrain level (ATL), not water level or building level. - Boolean + Array + - isUIContext + ctrlSetTextColor - Returns true if the script originated from some UI control event, for example from "onButtonDown" EH. Exists within parent scope and immediate child scopes. + Sets text color of given control. Color is in format Color. As of Arma 3 v1.40 this command could also be used to change fill colour or the DialogControls-ProgressBar. - https://community.bistudio.com/wiki/isUIContext + https://community.bistudio.com/wiki/ctrlSetTextColor - isUIContext + Control ctrlSetTextColor Array - isUIContext + display ctrlSetTextColor color - $Code$if ( isUIContext ) then { hint "UI control event"};$/Code$ + $Code$_control ctrlSetTextColor [1, 0, 0, 1]$/Code$ undefined / undefined + (April 10, 2015) + When used on a RscProgress control, remove the configured "texture" first. The two will affect each other. - Arma 3 v1.42 + + (March 4, 2018) + This command can be used to change the color of the light that is illuminating a texture in a display. By default, textures are lit with white light at 100% [1,1,1,1]; - Boolean + Nothing + - isUniformAllowed + compileFinal - Check whether given uniform can be dressed by target soldier. + Compile expression and makes it final, preventing it from: + repeated compile or compileFinal + removal by nil + remote rewrite using publicVariable, publicVariableClient and publicVariableServer - https://community.bistudio.com/wiki/isUniformAllowed + https://community.bistudio.com/wiki/compileFinal - Object isUniformAllowed String + compileFinal String - unit isUniformAllowed type + compileFinal expression - $Code$_canUse = _unit isUniformAllowed "U_B_CombatUniform_mcam";$/Code$ + $Code$myCode = compileFinal "a = a + 1"; + call myCode; + //--- Repeated compile won't have any effect + myCode = compileFinal "a = a + 2"; + //--- Duplicate code will be final as well + myDuplicateCode = myCode;$/Code$ - global / undefined + undefined / local + (August 14, 2013) + 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. + + (May 27, 2017) + in ArmA 3 1.70.141838, compileFinal also works for profileNamespace and uiNamespace. But be careful with that. - Boolean + Code + - isVehicleCargo + tvTooltip - Return transporting vehicle if vehicle is loaded in one. + Gets the tooltip text associated with the specified tree view path. - https://community.bistudio.com/wiki/isVehicleCargo + https://community.bistudio.com/wiki/tvTooltip - isVehicleCargo Object + tvTooltip Array + + Control tvTooltip Array - isVehicleCargo vehicle + tvTooltip [idc, path] + + ctrl tvTooltip path - $Code$// Blackfish with given variable name blackfish, with a vehicle inside called quad - _transportingVehicle = isVehicleCargo quad; //returns blackfish - //Vehicle called quad that is not being transported as cargo - _transportingVehicle = getVehicleCargo quad; //returns objNull$/Code$ + $Code$_text = tvTooltip [101, [0,2]];$/Code$ + + $Code$_text = _treeCtrl tvTooltip [0,2];$/Code$ undefined / undefined @@ -35210,27 +36973,28 @@ - Object + String - String + - isVehicleRadarOn + from - Returns true if vehicle has active sensors on + Continue sequence of for var construct. It sets the start value of the index variable. - https://community.bistudio.com/wiki/isVehicleRadarOn + https://community.bistudio.com/wiki/from - isVehicleRadarOn Object + For_Type from Number - isVehicleRadarOn vehicle + for from b - $Code$isVehicleRadarOn vehicle player ; // returns true if radar is turned on$/Code$ + $Code$for "_x" from 10 to 20 do {..code..}$/Code$ undefined / undefined @@ -35238,443 +37002,475 @@ - Boolean + For_Type + - isVehicleSensorEnabled + lnbSetText - Returns class name (to identify list based on component name) and info if given sensor is enabled + Sets the additional text (invisible) in the item with the given position of the 2D listbox. - https://community.bistudio.com/wiki/isVehicleSensorEnabled + https://community.bistudio.com/wiki/lnbSetText - Object isVehicleSensorEnabled String + lnbSetText Array + + Control lnbSetText Array - vehicle isVehicleSensorEnabled componentName + lnbSetText [idc,[row,column],data] + + _ctrl lnbSetText [ [row,column],data] - $Code$vehicle player isVehicleSensorEnabled "PassiveRadarSensorComponent"; // [ ["PassiveRadarSensorComponent",true] ]$/Code$ + $Code$lnbSetText [101, [0,1], "#1"];$/Code$ + + $Code$_ctrl lnbSetText [ [0,1], "#1"];$/Code$ - undefined / undefined + local / local + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Array + Nothing - Nothing + - isWalking + onBriefingPlan - Returns true if walk is toggled (W+S in Arma 3). + Select a sound declared in the Description.ext of the mission to be played the first time the Plan tab is selected in the briefing. - https://community.bistudio.com/wiki/isWalking + https://community.bistudio.com/wiki/onBriefingPlan - isWalking Object + onBriefingPlan String - isWalking unitName + onBriefingPlan soundName - $Code$_bool = isWalking player ;$/Code$ + $Code$onBriefingPlan "PlanVoiceOver"$/Code$ - global / undefined + undefined / undefined - (March 8, 2015) - To expand on the limited description, this command doesn't necessarily say whether or not the unit is currently walking. All it says is that walking is toggled on or off. This command can still return true when the unit is sprinting. When walking is toggled on, the unit will return to walking pace when not sprinting. When walking is toggled off, the unit will return to jogging pace when not sprinting. This command is not intended to gauge a units current movement speed. + (January 20, 2007) + In OFP 1.96 only sound files defined in the mission description can be played in this way. - Boolean + Nothing + - isWeaponDeployed + setFuelCargo - Returns true if weapon is currently deployed. + Sets fuel amount in cargo space of refuel vehicle from empty (0) to full (1) + Note, the carrying capacity of each side's refuel trucks differ. - https://community.bistudio.com/wiki/isWeaponDeployed + https://community.bistudio.com/wiki/setFuelCargo - isWeaponDeployed Object + Object setFuelCargo Number - isWeaponDeployed unit + vehicle setFuelCargo amount - $Code$_dep = isWeaponDeployed player ;$/Code$ + $Code$_refuelTruckOne setFuelCargo 0;$/Code$ - global / undefined + local / global - (July 1, 2015) - You can force a unit out of bipod or resting with: - $Code$_unit playMove "";$/Code$ - - (March 4, 2017) - playMove, as well as switchMove, appear to not work when forcing a player out of being deployed. A more reliable method is: $Code$_player setPos (_player modelToWorld [0,0,0]);$/Code$ + (July 10, 2015) + (ArmA 3 1.44) setFuelCargo will have no effect if the vehicle doesn't support getFuelCargo. - Boolean + Nothing + - isWeaponRested + removeAllItems - Returns true if weapon is currently rested. + Removes all special items from the unit. - https://community.bistudio.com/wiki/isWeaponRested + https://community.bistudio.com/wiki/removeAllItems - isWeaponRested Object + removeAllItems Object - isWeaponRested unit + removeAllItems unit - $Code$_rest = isWeaponRested player ;$/Code$ + $Code$removeAllItems unitName;$/Code$ - local / undefined + local / global - (July 1, 2015) - You can force a unit out of bipod or resting with: - $Code$_unit playMove "";$/Code$ - - (July 12, 2015) - As of 1.49 $Code$ isWeaponRested player $/Code$ is the only current use of this command. You cannot detect remote player and you cannot detect local unit that is not a player. Might as well be a nullar command without argument. + (June 18, 2013) + Arma 3, version 0.70 - removes only items listed by command items. - Boolean + Nothing + - itemCargo + deleteGroupWhenEmpty - Get array with items from ammo box (or any general weapon holder container). + Marks given group for auto-deletion when group is empty. true will mark the group for auto-deletion, however false will only unmark the group that was marked previously. There are other engine group auto-deletion mechanisms in place, which are not affected by this. + NOTE: It might take up to a minute for the groups marked for auto-deletion when empty to get deleted when they become empty. - https://community.bistudio.com/wiki/itemCargo + https://community.bistudio.com/wiki/deleteGroupWhenEmpty - itemCargo Object + Group deleteGroupWhenEmpty Boolean - itemCargo box + group deleteGroupWhenEmpty delete - $Code$hint str itemCargo vestContainer player ;$/Code$ + $Code$_group deleteGroupWhenEmpty true ;$/Code$ - global / undefined + global / global + (February 8, 2018) + It seems, that the argument has to be local (like for deleteGroup). + So if you run it on a server and the group isn't local to the server this wouldn't work: + $Code$_group deleteGroupWhenEmpty true;$/Code$ + But this would work: + $Code$if (local _group) then { + _group deleteGroupWhenEmpty true; + } else { + [_group, true] remoteExec ["deleteGroupWhenEmpty", groupOwner _group]; + };$/Code$ - Array + Nothing + - itemsWithMagazines + removeDrawIcon - Returns combined array including all unit's items and all unit's magazines. Loaded magazines such as currentMagazine, primaryWeaponMagazine, secondaryWeaponMagazine, handgunMagazine as well as assignedItems are excluded. + Removes an icon for an editor object. + i + Some Old Editor Command - https://community.bistudio.com/wiki/itemsWithMagazines + https://community.bistudio.com/wiki/removeDrawIcon - itemsWithMagazines Object + Control removeDrawIcon Array - itemsWithMagazines unit + map removeDrawIcon [object,string identifier] - $Code$itemsWithMagazines player - //is essentially the same as - items player + magazines player [ - "FirstAidKit",//item - "30Rnd_65x39_caseless_mag",//magazine - "16Rnd_9x21_Mag",//magazine - "Chemlight_green",//magazine - "HandGrenade",//magazine - "ToolKit",//item - "MineDetector"//item - ]$/Code$ - + - global / undefined + undefined / undefined - Array + Nothing + - items + assignedVehicleRole - Returns an array of names of all special items of a vehicle or a soldier. - - - https://community.bistudio.com/wiki/items - - - items Object + Return the role a unit is assigned to within its assigned vehicle. + The array which is returned contains: + [] - Not assigned to any vehicle + ["Driver"] - Assigned as driver + ["Cargo"] (or ["Cargo", [turret path]] since Arma 3 1.31.127272) - Assigned as cargo + ["Turret", [turret path]] - Assigned to a turret + If no vehicle role is assigned, an empty array is returned. + + + https://community.bistudio.com/wiki/assignedVehicleRole + + + assignedVehicleRole Object - items unit + assignedVehicleRole unitName - $Code$_itemsplayer = items player ;$/Code$ + $Code$_RoleArray = assignedVehicleRole player ;$/Code$ - $Code$player sideChat format ["%1", items player ];$/Code$ + $Code$// Get weapons available to player at player occupied turret: + _weaponsTurret = vehicle player weaponsTurret ( assignedVehicleRole player select 1);$/Code$ global / undefined - (June 18, 2013) - Arma 3, version 0.70 - magazines, explosives, grenades and all items currently linked on the unit are not returned now. + (August 31, 2013) + When unit with unassigned vehicle role enters a vehicle, it gets assigned vehicle role automatically. The unit then will hold on to its assigned role after exiting the vehicle. To add, when player is in the group of AIs and is not the leader, assignedVehicleRole of the player could be unpredictable and absolutely not related to the position player occupies. In short, forget about this command, it is unreliable and has been broken too many times in the past. + + (November 15, 2014) + In multiplayer (tested in v1.34), this only works reliably on the server. + Behaviour is as follows: + On a client, the command will return empty arrays for every unit that is not local. + On the server, the command correctly returns the position, regardless of the units locality. - Array + Array + - joinAsSilent + == - Joins the unit to the given group, if position id is available, this one is used. Avoid any radio communication related to joining. + Check if one value is equal to another. Both values need to be of the same type. - https://community.bistudio.com/wiki/joinAsSilent + https://community.bistudio.com/wiki/a_%3D%3D_b - Object joinAsSilent Array + Anything == Anything - unit joinAsSilent [group, id] - + - $Code$player joinAsSilent [_group, 4];$/Code$ - - $Code$// To get the position id: - getUnitPositionId = { - private ["_vvn", "_str"]; - _vvn = vehicleVarName _this; - _this setVehicleVarName ""; - _str = str _this; - _this setVehicleVarName _vvn; - parseNumber (_str select [(_str find ":") + 1]) - }; - player joinAsSilent [ createGroup west, 5]; - _id = player call getUnitPositionId; - hint str _id; //5$/Code$ - + - global / global + undefined / undefined - I haven't done a thorough test but this function doesn't seem to work for Civilians, use joinSilent instead. - Nothing + Boolean + - joinAs + ppEffectDestroy - Joins the unit to the given group, if position id is available, this one is used. + Destroy Post process effects given by handle or array of handles. - https://community.bistudio.com/wiki/joinAs + https://community.bistudio.com/wiki/ppEffectDestroy - Object joinAs Array + ppEffectDestroy Number + + ppEffectDestroy Array - unit joinAs [group, id] + ppEffectDestroy effect + + ppEffectDestroy [effect1,] - $Code$player joinAs [_group, 4];$/Code$ + $Code$ppEffectDestroy _hndl;$/Code$ - $Code$// To get the position id: - getUnitPositionId = { - private ["_vvn", "_str"]; - _vvn = vehicleVarName _this; - _this setVehicleVarName ""; - _str = str _this; - _this setVehicleVarName _vvn; - parseNumber (_str select [(_str find ":") + 1]) - }; - player joinAs [ createGroup west, 5]; - _id = player call getUnitPositionId; - hint str _id; //5$/Code$ + $Code$ppEffectDestroy [_hndl0, _hndl1, _hndl2];$/Code$ - global / global + undefined / undefined - Nothing + Nothing - Nothing + - joinSilent + camPrepareTarget - Join all units in the array to given group silently (without radio message). To have a group member leave a group, join him with the grpNull group (e.g. [guy1] joinSilent grpNull ), but beware, as brand new group is created for the leaving unit and this could result in the number of groups in a mission growing out of control. + Prepares the camera target to a position or to a target. - https://community.bistudio.com/wiki/joinSilent + https://community.bistudio.com/wiki/camPrepareTarget - Array joinSilent Object/Group + Object camPrepareTarget Array + + Object camPrepareTarget Object - unitArray joinSilent group + camera camPrepareTarget position + + camera camPrepareTarget target - $Code$[_unitOne, _unitTwo] joinSilent ( group player );$/Code$ + $Code$_camera camPrepareTarget getPos player$/Code$ - $Code$[_unitOne, _unitTwo] joinSilent player ;$/Code$ + $Code$_camera camPrepareTarget player$/Code$ - global / global + undefined / undefined - (August 4, 2014) - If all units of a group are joined to another group then the first group will be NULL-group afterward. - Nothing + Nothing - Nothing + - joinString + combatMode - Joins array into String with provided separator. Array can be of mixed types, all elements will be converted to String prior to joining, but the fastest operation is on the array of Strings. + Returns the combat mode of the given unit. See setCombatMode for more information about combat modes. - https://community.bistudio.com/wiki/joinString + https://community.bistudio.com/wiki/combatMode - Array joinString String + combatMode Object/Group - array joinString separator + combatMode grp - $Code$_str = "- This, is a sample string." splitString "-,. "; // ["This","is","a","sample","string"] - _str joinString " "; // "This is a sample string"$/Code$ - - $Code$["This","is","sparta"] joinString " ~ "; // "This ~ is ~ sparta"$/Code$ - - $Code$["1",2, text "3"] joinString ""; // "123"$/Code$ - - $Code$["test","test"] joinString toString [12345] splitString toString [12345]; // ["test","test"]$/Code$ - - $Code$"Japa is the best!" splitString "" joinString " "; // "J a p a i s t h e b e s t !"$/Code$ - - $Code$// Remove all \r\n from file: - loadFile "somefile.txt" splitString toString [13,10] joinString " "$/Code$ + $Code$if (( combatMode _grp1) == "BLUE") then {_grp1 setCombatMode "GREEN"};$/Code$ - undefined / undefined + global / undefined + (August 3, 2006) + Notes from before the conversion: + Use setCombatMode to set the combat mode. The definitions of the colours are given under that command. + + In OFP v1.96, combatMode return value does not change when unit's combat mode is set with radio commands, ie troops under the player's command. - String + String + - join + flyInHeightASL - Join all units in the array to given group. - Maximum number of group members is: - OFP: 12 - Arma: ? - Arma 2: ? - Arma 3: "unlimited" (3000+) - VBS 2: "unlimited" (260+) - To have a group member leave a group, join him with the grpNull group (e.g. [guy1] join grpNull ), but beware, as brand new group is created for the leaving unit and this could result in the number of groups in a mission growing out of control. + Sets the minimal ASL height. Final height is max(flyInHeight, flyInHeightASL). - https://community.bistudio.com/wiki/join + https://community.bistudio.com/wiki/flyInHeightASL - Array join Group/Object + Object flyInHeightASL Array - unitArray join group + aircraft flyInHeightASL params - $Code$[_unitOne, _unitTwo] join player ;$/Code$ - - $Code$[_unitOne, _unitTwo] join ( group player );$/Code$ + $Code$cobraOne flyInHeightASL [200, 100, 400];$/Code$ - global / global + undefined / undefined - Nothing + Nothing + - kbAddDatabaseTargets + objStatus - Register target list knowledge base database to given person. + Sets the status of an objective that was defined in briefing.html. + Status may be one of: + "ACTIVE" + "FAILED" + "DONE" + "HIDDEN" + To refer to an objective that is named "OBJ_1", for example, use only the index number in this command (i.e. "1" objStatus "HIDDEN"). - https://community.bistudio.com/wiki/kbAddDatabaseTargets + https://community.bistudio.com/wiki/objStatus - Object kbAddDatabaseTargets String + String objStatus String - person kbAddDatabaseTargets filename + objectivenumber objStatus status - $Code$_unit kbAddDatabase "chat.txt"$/Code$ + $Code$"1" objStatus "DONE" + Marks the objective named "OBJ_1" as completed.$/Code$ undefined / undefined @@ -35682,262 +37478,286 @@ - Boolean + Nothing + - kbAddDatabase + taskCustomData - Register knowledge base database to given person. + Returns custom data attached to the local task or an empty array if there are no custom data attached. - https://community.bistudio.com/wiki/kbAddDatabase + https://community.bistudio.com/wiki/taskCustomData - Object kbAddDatabase String + taskCustomData Task - person kbAddDatabase filename + taskCustomData task - $Code$_unit kbAddDatabase "chat.txt"$/Code$ - + undefined / undefined - Boolean + Array + - kbAddTopic + setWaypointType - Register conversation topic to given person. + Changes the waypoint type. + Type can be: + "MOVE" + "DESTROY" + "GETIN" + "SAD" + "JOIN" + "LEADER" + "GETOUT" + "CYCLE" + "LOAD" + "UNLOAD" + "TR UNLOAD" + "HOLD" + "SENTRY" + "GUARD" (for use with GUARDED BY trigger or createGuardedPoint ) + "TALK" + "SCRIPTED" + "SUPPORT" + "GETIN NEAREST" + "DISMISS" + "LOITER" (new in Arma 3) + "AND" (only for game logics) + "OR" (only for game logics) + More details at Waypoint types. - https://community.bistudio.com/wiki/kbAddTopic + https://community.bistudio.com/wiki/setWaypointType - Object kbAddTopic Array + Array setWaypointType String - person kbAddTopic [TopicName, filenamebikb, filenamefsm, event_handler] + waypoint setWaypointType type - $Code$player kbAddtopic["myTest", "myTest.bikb", "myTest.fsm", {call compile preprocessFileLineNumbers "myTest.sqf"}];$/Code$ + $Code$[_grp, 2] setWaypointType "HOLD";$/Code$ undefined / undefined - .bikb extension is by convention only. It can be anything. - There is no default extension. - Even tho bikb's are standard class text they cannot be raPified. + (07:44, 23 November 2007) + For waypoint types description look at + ArmA: Mission_Editor + OFP: Mission_Editor + Using Move With a game logic group will move the logic to the set location just like setpos. In the editor only AND and OR type of waypoints are available for GAME LOGICS but you can use CYCLE type as well in setWaypointType. + $Code$_wp = group logic1 addWaypoint [ getPos player, 1]; + [ group logic1, 1] setWPPos getPos player ; + [ group logic1, 1] setWaypointType "move";$/Code$ + + (23:07, 18 October 2013 (CEST)) + To clear up any confusion regarding the syntax, follow this example where grp01 is the name of a group of AI units: + $Code$_wp = grp01 addWaypoint [[25295,21919,85], 0]; + _wp setWaypointType "MOVE"; + _wp1 = grp01 addWaypoint [[25381,21882,70], 0]; + _wp1 setWaypointType "MOVE"; + _wp2 = grp01 addWaypoint [[ 25332,21782,78], 0]; + _wp2 setWaypointType "CYCLE"; //Use the variable (_wp2), not [grp01, 0]$/Code$ + + (December 22, 2015) + To spawn a helicopter with troops inside and make them land and unload. + + (May 6, 2017) + To use the LAND function in a waypoint, you must set "A3\functions_f\waypoints\fn_wpLand.sqf" as the script for that waypoint. + + (May 30, 2017) + In ArmA3 1.70.141838, if you add a MOVE waypoint very soon after a LOITER waypoint, ( assuming that the index of the MOVE waypoint is HIGHER than the index of the LOITER waypoint ) + then the LOITER waypoint will be considered as a MOVE waypoint. + And, if you add another waypoint after ( for example ) more than 1 second after adding the LOITER waypoint, + then the LOITER waypoint will NOT complete even when its condition has been met. + There are two ways to quit an existing LOITER waypoint that was added more than about 1 second ago; use the setCurrentWaypoint command OR add a waypoint that has the same ID as the LOITER waypoint. + The difference between those two methods is that the lather prevents the LOITER waypoint from executing its statement. - Nothing + Nothing + - kbHasTopic + removeAction - Check if conversation topic was registered to given person. + Removes user added action with given id index. This only removes actions added with the addAction command. You cannot remove default game actions, such as reload. + This command has local effect. The action will only be removed on the computer that executes the command. - https://community.bistudio.com/wiki/kbHasTopic + https://community.bistudio.com/wiki/removeAction - Object kbHasTopic String + Object removeAction Number - person kbHasTopic TopicName + unit removeAction index - + $Code$player removeAction 0;$/Code$ + - undefined / undefined + global / local - Boolean + Nothing + - kbReact + setHorizonParallaxCoef - Pass a non-verbal communication to the receiver. + Sets coef used to shift horizon position based on camera height (use 0 to disable shifting). - https://community.bistudio.com/wiki/kbReact + https://community.bistudio.com/wiki/setHorizonParallaxCoef - Object kbReact Array + setHorizonParallaxCoef Number - person kbReact [receiver,topic,sentenceID,[argumentName,argumentValue,argumentText,argumentSpeech],] + setHorizonParallaxCoef coef - + $Code$setHorizonParallaxCoef 1;$/Code$ + undefined / undefined - Nothing + Nothing + - kbRemoveTopic + setGusts - Unregister conversation topic from given person. + Changes the gusts value smoothly during the given time (in seconds). A time of zero means there will be an immediate change. Value is 0 to 1. - https://community.bistudio.com/wiki/kbRemoveTopic + https://community.bistudio.com/wiki/setGusts - Object kbRemoveTopic String + Number setGusts Number - person kbRemoveTopic TopicName + time setGusts value - + $Code$60 setGusts 0.75;$/Code$ + - undefined / undefined + undefined / local - Nothing + Nothing + - kbTell + speaker - Make the person tell to the receiver the sentence. + Returns the speaker of a person. - https://community.bistudio.com/wiki/kbTell + https://community.bistudio.com/wiki/speaker - Object kbTell Array + speaker Object - person kbTell [receiver, TopicName, SentenceClass, [argumentName, argumentValue, argumentText, argumentSpeech],,forceRadio] + speaker person - + $Code$speaker player$/Code$ + undefined / undefined - // In Config file - class CfgIdentities - { - class SSMHQ - { - name = $STR_DN_WARFARE_HQ_BASE_UNFOLDED; - face = "Face97"; - glasses = "None"; - speaker = "MaleA0EN"; - pitch = 1.0; - }; - }; - // IN BIKB - class Sentences - { - class AirstrikeRequest - { - text = "%team requesting close air support at grid %location "; - speech[]={%Team,RequestingCloseAirSupportAtGrid,%Location}; - class Arguments - { - class Team {type = "simple";}; - class Location {type = "simple";}; - }; - }; - }; - class Arguments{}; - class Special {}; - startWithVocal[] = {}; - startWithConsonant[] = {}; - // In Script file - BIS_SSM_HQWEST = (createGroup west) createUnit ["Logic", [10,10,1000], [], 0, "NONE"]; - BIS_SSM_HQWEST setGroupId ["Headquaters", "SIX"]; - BIS_SSM_HQWEST setIdentity "SSMHQ_EN"; - player kbAddtopic["Airstrike", BIKB]; - BIS_SSM_HQWEST kbAddtopic["Airstrike", BIKB]; - player kbTell [BIS_SSM_HQWEST,"Airstrike","AirstrikeRequest", ["Team",{},"Anvil",["Anvil"]],["Location",{},"Strelka",["Strelka"]],true]; - - (may 02, 2010) - Jezuro help on BIforum : [1] - Nothing + String + - kbWasSaid + addToRemainsCollector - Check if given item was said by person to someone. + Adds an array of vehicles/units to disposal manager for automatic wreck/body removal. The disposal manager follows wreck/body removal values set in description.ext - https://community.bistudio.com/wiki/kbWasSaid + https://community.bistudio.com/wiki/addToRemainsCollector - Object kbWasSaid Array + addToRemainsCollector Array - person kbWasSaid [receiver, topic, sentenceID, maxAge] + addToRemainsCollector remains - $Code$myPlayer kbWasSaid [myReceiver, "myTopic", "mySentenceID", 3];$/Code$ + $Code$addToRemainsCollector [unit1, unit2, vehicle1];$/Code$ - undefined / undefined + global / global - Boolean + Nothing + - keyImage + commandArtilleryFire - Returns a structured text, containing an image or name (if no image is found) of the button, on the keyboard, mouse or joystick, with the given code. + Orders a unit to reload defined magazine commence fire burst on the given position (via the radio). - https://community.bistudio.com/wiki/keyImage + https://community.bistudio.com/wiki/commandArtilleryFire - keyImage Number + Object commandArtilleryFire Array - keyImage dikCode + unit commandArtilleryFire [position, type, rounds] - $Code$_name = keyImage 28; //result is "Enter"$/Code$ + $Code$mortar1 commandArtilleryFire [[3000, 120, 1000], "8Rnd_82mm_Mo_shells", 3];$/Code$ undefined / undefined @@ -35945,1493 +37765,1383 @@ - Structured_Text + Nothing + - keyName + removeGoggles - Returns the name of a button (on the keyboard, mouse or joystick) with the given code. + Removes goggles from unit (diver goggles for example). This command does not remove NVGoggles. Use unassignItem and removeItem or just unlinkItem for latter. - https://community.bistudio.com/wiki/keyName + https://community.bistudio.com/wiki/removeGoggles - keyName Number + removeGoggles Object - keyName dikCode + removeGoggles unit - $Code$_name = keyName 28; //result is "Enter"$/Code$ + $Code$removeGoggles assaultDiver;$/Code$ - undefined / undefined + global / global - String + Nothing + - knowsAbout + >= - Checks if a group or a side knows about target. If who is a unit, unit's group is considered, if who is a vehicle, commander's group is considered. + Checks if the left number is greater than or equal to the right one - https://community.bistudio.com/wiki/knowsAbout + https://community.bistudio.com/wiki/a_greater%3D_b - Object/Group knowsAbout Object - - Side knowsAbout Object + Number >= Number - who knowsAbout target - - side knowsAbout target - + - $Code$_kv = _soldierOne knowsAbout _jeepOne;$/Code$ - - $Code$_kv = ( side player ) knowsAbout _target;$/Code$ - + - global / undefined + undefined / undefined - (August 4, 2006) - Notes from before the conversion: - With Resistance (1.91) : No matter what class of unit the target is and no matter what the skill/class of the enemy AI, the magic 'knowsAbout' number is 0.105. - With CWC (1.46) : No matter what class of unit the target is and no matter what the skill/class of the enemy AI, the magic 'knowsAbout' number is 0.7. - What this means is, the AI will not fire on an enemy soldier until his 'knowsAbout' level of that enemy has reached the 'magic number' or higher. - This suggests that the knowsabout level must reach the magic threshold before a unit knows if another unit is an enemy or a friendly unit. - Triggers and knowsabout level: "Detected by xxx" triggers also follow the above rules. For a detected trigger to be set off, the knowsAbout level must reach the magic number. - Also... As soon as An AI unit gets hit with a bullet his knowsAbout level for the unit that shot him will instantly jump to 1.5, even if the shooter is 1000m away. Vice versa is also true. If An AI soldier's knowsAbout level for an enemy is 0.7 and the soldier fires and hits the enemy, his knowsAbout level about the enemy will instantly jump to 1.5. Some editors have found, whilst using this command over the years, that the following characteristics have cropped up: - AI enemies have a very limited amount of peripheral vision, it's not nearly as good as a human player's. A target must be in front of the unit for him to be noticed, so if you sprint right behind an enemy, this value doesn't increase. - Depending on the units skill level, it can take a little time for the unit to notice a target. So if you run right past a unit, this value might not increase. - Bushes between the unit and the target seem to have little effect on this value, and trees definitely have no affect. You may be in a forest, and can't see the unit, but he can see you. - MP Note knowsAbout returns a viable result only if left-hand parameter unit is local. - - (January 15, 2007) - In OFP v1.96, KnowsAbout return values range from 0 to 4. - All units in a group have equal knowsAbout for any given target. All units in a group always return knowsAbout 4 about each other. This suggests groups share a single knowledge base. - Without any contact with the target, the knowsAbout value decays at a linear rate so that it halves over 120 seconds. After this time is up knowsAbout drops instantly to 0. - If the distance between the all of unit's group and the target exceeds the viewdistance setting, knowsAbout instantly drops to 0. This is not changed by fog or daylight. - Note that in OFP unit see all the targets that his group members see. The data is processed between teammembers freely. - - the magic 'knowsAbout' number is 0.105. It's not that simple.Maybe true for infantry but not all vehicles. "Reveal" command sets knowsAbout to 1, but planes still won't fire at soldiers on the ground. There's only one known way to pass through this - designate target with another fake infantry unit near the target. As soon as this fake unit see the target knowsAbout lifts up to 2.5-4 and even single enemy soldiers are attacked rom the air (of course if plane has suitable munition :)) - - (July 05, 2009) - In ArmA (other not tested), KnowsAbout value will stay at its highest value during approximately 2-3 min and then reinitialized. - - (January 14, 2012) - Notes are for OA 1.60 : - The KnowsAbout value drops immediately back to zero, if the distance between both units is larger than the local viewDistance value. - After 110 seconds without (visible?) contact, the KnowsAbout value drops to zero again. While it seemed to take longer the higher the KnowsAbout value is (at least for a value of 4 it took almost six minutes at one point), I was unable to reproduce/confirm that. It is 110 seconds no matter how high the KnowsAbout value it seems. - - (June 13, 2012) - By Suma ( source ): - All friendly units within a view distance to each unit [are revealed (to the player? or each friendly?)] on the mission start. The code is half broken, as it does not make the units known, it only sets the "accuracy" value for them. Note: This is not affecting enemy units at all. - - (March 27, 2013) - Arma-II OA (1.62.101.480 @ACE), tests with infantry: - It is still true, that the command returns values between 0 (lowest) and 4 (most). Freshly Spotted units will have at least 1.5, slowly decreasing when the target disappeared. - The following Table shows my test results on a clear day at Takistan using the Vector. Please note that the returned values vary considerably depending on weather and time. Moonlight however seems to not have any considerable effect. - 12:00, sunlight, clear sky - Distance - knowsAbout - 1530 - 1.5 - 1370 - 1.5 - 1250 - 1.5 - 1135 - 1.5 - 1055 - 1.52 - 1022 - 1.64 - 990 - 1.74 - 833 - 2.5 - 720 - 3.37 - 600 - 3.81 - 505 - 3.86 - 400 - 3.92 - 380 - 4 - 365 - 4 - 21:00, bright half moon, clear sky - Distance - knowsAbout - 285 - 1.5 - 120 - 1.5 - 88 - 1.89 - 75 - 2.3 - 61 - 3.9 - 23:00, pitch black, clear sky, NVG on - Distance - knowsAbout - 600 - 1.5 - 487 - 1.5 - 390 - 1.5 - 289 - 2.22 - 278 - 2.4 - - (May 31, 2014) - Can also use SIDE in place of UNIT. For example: - $Code$EAST knowsAbout player ;$/Code$ - Number - Number + Boolean + - landAt + >> - Order an AI airplane to land at a given airport. ID is the number to identify which airport on the island you want. Since Arma 3 v1.68 it is possible to order a helicopter to land on designated helipad. + Returns subentry of config entry with given name. Identical to config/name. - https://community.bistudio.com/wiki/landAt + https://community.bistudio.com/wiki/config_greater_greater_name - Object landAt Number - - Object landAt Object + Config >> String - plane landAt id - - heli landAt helipad - + - $Code$_plane1 landAt 1;$/Code$ - - $Code$_heli1 land "LAND"; - _heli1 landAt _helipad;$/Code$ - + - local / global + undefined / undefined - ARMA 3: - Altis : - 0 = Airbase - 1 = AAC Airfield - 2 = Krya Nera Airstrip - 3 = Selakeno Airfield - 4 = Molos Airfield - 5 = Almyra Salt Lake Airstrip - Posted 17:56, 21 September 2010 (CEST) - - ARMA 2 OA: - Takistan : - 0 = Airport NorthWest - 1 = Airport SouthEast - Planes approach all airports from South West - ARMA 2: - Utes : - 0 = There is only one airport - Chernarus : - 0 = Airport NorthWest close to Grishno - 1 = Airport NorthEast close to Kranostav - 2 = Airport SouthWest close to Balota - 3 = Nearest Airport - Planes approach all airports from South East - ARMA: - Sahrani : - 0: - Paraiso - 1: - Rahmadi - 2: - Pita - 3: - Antigua - - (November 8, 2014) - In Arma 3 (1.34) landAt only works for fixed-wing aircraft. Rotary-wing craft ignore this command. - - (June 19, 2016) - ARMA 3 : Tanoa - 0 = Aeroport de Tanoa - 1 = Tuvanaka Airbase - 2 = Saint-George Airstrip - 3 = Bala Airstrip - 4 = La Rochelle Aerodome - ARMA 3 : Stratis - 0 = Stratis Airbase - Nothing - Nothing + Config + - landResult + move3DENCamera - Return the result of helicopter landing position searching (performed, after land command). The value can be "Found" (position found),"NotFound" (position not found), "NotReady" (position searching is,still in progress) or empty string when wrong argument given. + Moves Eden Editor camera to given position, with or without offset. + Default camera offset: [0,-25,25] - https://community.bistudio.com/wiki/landResult + https://community.bistudio.com/wiki/move3DENCamera - landResult Object + move3DENCamera Array - landResult helicopter + move3DENCamera [position,useOffset] - + $Code$move3DENCamera [ getPos player,true];$/Code$ + undefined / undefined - String + Nothing + - land + currentMagazineDetail - Force helicopter landing. Landing mode may be: - "LAND" (complete stop) - "GET IN" (hovering very low, for another unit to get in) - "GET OUT" (hovering low,for another unit to get out) - "NONE" (cancel a landing) Available since ArmA 2 57463 build. + Returns description of vehicle's currently loaded magazine, its ammo count (current/default) and its id. - https://community.bistudio.com/wiki/land + https://community.bistudio.com/wiki/currentMagazineDetail - Object land String + currentMagazineDetail Object - helicopter land mode + currentMagazineDetail vehicle - $Code$_cobraOne land "LAND"$/Code$ + $Code$_currentMagazineDetail = currentMagazineDetail player ; //"6.5mm 30Rnd STANAG Mag(30/30)[id:0]"$/Code$ + + $Code$_currentMagazineDetail = currentMagazineDetail Mi_48; //"30mm HE Shells(250/250)[id:21]"$/Code$ + + $Code$_cmd = currentMagazineDetail player ; //"9mm 16Rnd Mag(13/16)[id/cr:10000011/0]" + _cmd splitString "([ ]/:)"; //["9mm","16Rnd","Mag","13","16","id","cr","10000011","0"]$/Code$ - local / global + undefined / undefined - (August 4, 2006) - Notes from before the conversion: - Helos will land at the nearest "H" or "Invisible H", if there is one around (within 500m in ArmA). - - To make a helicopter LAND correctly and not hovering over the landing position use unitReady to check if the helicopter already has reached his destination. - You can fix a landing bug by using a short delay bevore checking the unitReady command. - _helicopter move (getPos _destination); - sleep 3; - while { ( (alive _helicopter) && !(unitReady _helicopter) ) } do - { - sleep 1; - }; - if (alive _helicopter) then - { - _helicopter land "LAND"; - }; - Nothing + String + - language + nameSound - Returns current game language. + Returns the nameSound of a person. - https://community.bistudio.com/wiki/language + https://community.bistudio.com/wiki/nameSound - language + nameSound Object - language + nameSound person - + $Code$nameSound player$/Code$ + undefined / undefined - String + String + - laserTarget + sunOrMoon - Returns laser target object created by given unit (gunner in vehicle or on foot) when using "Laserdesignator" or another laser targeting device. Laser target object is global and can be retrieved from any PC. + Returns the sun to moon transition state in range 0...1 - https://community.bistudio.com/wiki/laserTarget + https://community.bistudio.com/wiki/sunOrMoon - laserTarget Object + sunOrMoon - laserTarget unitName + sunOrMoon - $Code$_target = laserTarget gunner heli;$/Code$ - - $Code$_designatedPos = position laserTarget player;$/Code$ + $Code$_transitionState = sunOrMoon ;$/Code$ - global / undefined + undefined / undefined - (December 15, 2010) - Need to be try with a soldier and laser designator + (September 21, 2014) + Note that at a 0.99 value, the twilight is still quite dark. + Can be tested with : + $Code$//test + onEachFrame + { + systemchat format ["%1",sunOrMoon]; + };$/Code$ - (December 19, 2010) - Works with either infantry or vehicles. Returns objNull if no target is present + (May 18, 2017) + As of Arma 3 1.7, this returns either 1 for sun or 0 for moon. Nothing in between. - Object + Number + - lbAdd + forceWeaponFire - Adds an item with the given text to the listbox or combobox with id idc of the topmost user dialog. - It returns the index of the newly added item. + The unit will be forced to fire weapon from the given muzzle. The weapon will not fire if firemode passed as parameter is not supported by the given muzzle. The muzzle could belong to a vehicle weapon and unit in this case will be the unit operating this weapon. Doesnt't seem to work for units in FFV positions. Works on player. See also: BIS_fnc_fire - https://community.bistudio.com/wiki/lbAdd + https://community.bistudio.com/wiki/forceWeaponFire - lbAdd Array - - Control lbAdd String + Object forceWeaponFire Array - lbAdd [idc, text] - - control lbAdd text + unit forceWeaponFire [muzzle, firemode] - $Code$_index = lbAdd [101, "First item"];$/Code$ + $Code$_unit forceWeaponFire ["arifle_MX_F", "Single"]; + _unit forceWeaponFire ["hgun_ACPC2_F", "hgun_ACPC2_F"]; + _unit forceWeaponFire ["HandGrenadeMuzzle","HandGrenadeMuzzle"]; + _unit forceWeaponFire ["MiniGrenadeMuzzle","MiniGrenadeMuzzle"]; + _unit forceWeaponFire ["HandGrenade_Stone","HandGrenade_Stone"]; + _unit forceWeaponFire ["SmokeShellMuzzle","SmokeShellMuzzle"]; + _unit forceWeaponFire ["ChemlightGreenMuzzle","ChemlightGreenMuzzle"]; + _unit forceWeaponFire ["IRGrenade","IRGrenade"]; + _unit forceWeaponFire ["Laserdesignator","Laserdesignator"];$/Code$ - $Code$_index = _control lbAdd "First item";$/Code$ + $Code$gunner blackfoot forceWeaponFire ["gatling_20mm", "close"];$/Code$ - local / local + local / global - More information on the LB command family can be found here + (August 25, 2013) + Here is a neat workaround trick for firemode change from a script: + $Code$_weapon = currentWeapon player ; + _ammo = player ammo _weapon; + player setAmmo [_weapon, 0]; + player forceWeaponFire [_weapon, "FullAuto"]; + player setAmmo [_weapon, _ammo];$/Code$ - (April 12, 2015) - This command can be very very frustrating to use because it does not output any errors if unable to function. - Often, the 2nd provided syntax needs to be used like this: - $Code$_giveYourControlAname = (findDisplay 7) displayCtrl 9; - _addThisToListBox = "Option"; - _giveYourControlAname lbAdd _addThisToListBox;$/Code$ - Where "7" is the "idd" of the dialog you made in your ".hpp" file and where "9" is the "idc" of the RscListBox or RscComboBox. - The code above will add an option named "Option" to the ListBox or ComboBox. + (April 14, 2014) + (A3 1.16) forceWeaponFire is no longer only limited to units, but can remote aircrafts weapon firing as well. Passed source unit should be the correct one who controls the weapon, if passed mode is "this", use the weapon name instead: + $Code$_weapon = ( weapons _veh) select 3; + _mode = ( getArray ( configFile "cfgweapons" _weapon "modes")) select 0; + if (_mode == "this") then {_mode = _weapon;}; + ( driver _veh) forceWeaponFire [_weapon, _mode]; + //Force a CAS fire a rocket. + $/Code$ + Currently this command is not available for land vehicle remote fire. + + (September 02, 2014) + Similar to Killzone Kid's note, This fires the units current weapon in its current firemode. + $Code$_unit forceWeaponFire [ weaponState _unit select 1, weaponState _unit select 2];$/Code$ + + (January 3, 2015) + fireAtTarget command can be used to force fire gunner weapon in vehicles. A gunner must be present. $Code$_veh fireAtTarget [ objNull ];$/Code$ Will fire one shot even if player is gunner. + fire command can also be used to fire vehicle weapon, like smoke launcher for example: $Code$ vehicle player fire "SmokeLauncher";$/Code$ And if this doesn't work, it is possible to force fire via action $Code$tank action ["UseWeapon", tank, commander tank, 0];$/Code$ - Number - Number + Nothing + - lbClear + ctrlRemoveEventHandler - Clear all items in listbox or combobox with id idc of topmost user dialog. + Remove a given event handler from the given control. - https://community.bistudio.com/wiki/lbClear + https://community.bistudio.com/wiki/ctrlRemoveEventHandler - lbClear Number - - lbClear Control + Control ctrlRemoveEventHandler Array - lbClear idc - - lbClear control + control ctrlRemoveEventHandler [handler name,id] - $Code$lbClear 101;$/Code$ - - $Code$lbClear _ctrl;$/Code$ + $Code$_map ctrlRemoveEventHandler ["Draw", _id];$/Code$ - local / local + undefined / undefined - More information on the LB command family can be found here - Nothing - Nothing + Nothing + - lbColor + shownWarrant - Returns the text color of the item with the given index of the listbox or combobox with id idc of the topmost user dialog. - The color is returned in format Color. + Check if player has ID card enabled. Obsolete command. - https://community.bistudio.com/wiki/lbColor + https://community.bistudio.com/wiki/shownWarrant - lbColor Array - - Control lbColor Number + shownWarrant - lbColor [idc, index] - - control lbColor index + shownWarrant - $Code$_colour = lbColor [101, 0];$/Code$ - - $Code$_color = _control lbColor 0;$/Code$ - + - local / local + undefined / undefined - More information on the LB command family can be found here - Array - Array + Boolean + - lbCurSel + moveTime - Returns the index of the selected item of the listbox or combobox with id idc of the topmost user dialog. For listbox LB_MULTI (multi-selection) use lbSelection. + Returns the current time of the most important RTM animation currently being played on the soldier. - https://community.bistudio.com/wiki/lbCurSel + https://community.bistudio.com/wiki/moveTime - lbCurSel Number - - lbCurSel Control + moveTime Object - lbCurSel idc - - lbCurSel control + moveTime soldier - $Code$_index = lbCurSel 101;$/Code$ - - $Code$lbCurSel _ctrl;$/Code$ + $Code$moveTime player ;$/Code$ undefined / undefined - More information on the LB command family can be found here - - (July 11, 2014) - If nothing is selected this command returns -1 - Number - Number + Number + - lbData + missionStart - Returns the additional text (invisible) in an item with the given index of the listbox or combobox with id idc of the topmost user dialog. + Returns date and time when mission started in format [year, month, day, hour, minute, second]. + Works only in multiplayer, in singleplayer all values are equal to zero → [0,0,0,0,0,0] + NOTE : Because missionStart contains the time of the actual start of the mission, it might not be available in pre-init or init, but is guaranteed to be available in post-init when time 0. - https://community.bistudio.com/wiki/lbData + https://community.bistudio.com/wiki/missionStart - lbData Array - - Control lbData Number + missionStart - lbData [idc, index] - - control lbData index + missionStart - $Code$_data = lbData [101, 0];$/Code$ + $Code$setDate ( missionStart select [0,5]);$/Code$ - $Code$_data = _control lbData 0;$/Code$ + $Code$// Set real date: + //postInit = 1; + if ( isServer ) then { + waitUntil { time 0}; + setDate ( missionStart select [0,5]); + };$/Code$ - local / local + undefined / undefined - More information on the LB command family can be found here + (September 25, 2014) + Returns array with date indicating when the mission has started (after briefing screen). In OFP this command is bugged – it works only in multiplayer on a player‐hosted machine and on a client. In single player it would return [0,0,0,0,0,0] and on a dedicated server – [1970,1,1,0,0,0]. In CWA this command is fixed. + + (December 30, 2014) + In arma 3 this command returns [0,0,0,0,0,0] in SP, [1970,1,1,0,0,0] on dedicated server and [1970,1,1,0,0,0] initially and then server real time on local headless client. On player clients it shows client's local date and time. Since Arma 3 v1.49 the dedicated server also returns correct mission start date. + + (August 27, 2015) + ArmA 3 1.50: This command now returns the correct values on dedicated server. - String - String + Array + - lbDelete + disableMapIndicators - Removes the item with the given index from the listbox or combobox with id idc of the topmost user dialog. + Command allows suppressing visualization of FRIENDLY, ENEMY, MINES and/or PING map indicators from difficulty setting EXTENDED MAP CONTENT. - https://community.bistudio.com/wiki/lbDelete + https://community.bistudio.com/wiki/disableMapIndicators - lbDelete Array - - Control lbDelete Number + disableMapIndicators Array - lbDelete [idc, index] - - control lbDelete index + disableMapIndicators [disableFriendly,disableEnemy,disableMines,disablePing] - $Code$lbDelete [101, 0];$/Code$ - - $Code$_control lbDelete 0;$/Code$ + $Code$// Disable visualization of friendly and enemy units: + disableMapIndicators [true,true,false,false];$/Code$ - local / local + undefined / local - More information on the LB command family can be found here - Nothing - Nothing + Nothing + - lbIsSelected + sideRadio - Check whether given row of the given listbox is selected. + Sends the audio message to the side radio channel. Must have assigned "ItemRadio" to send or receive the transmission. The message is defined in CfgRadio in the description.ext file or config radio protocol. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). + Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. - https://community.bistudio.com/wiki/lbIsSelected + https://community.bistudio.com/wiki/sideRadio - Control lbIsSelected Number + Object sideRadio String + + Array sideRadio String - control lbIsSelected index + unit sideRadio radioName + + [side, identity] sideRadio radioName - $Code$_selected = _control lbIsSelected 0;$/Code$ + $Code$_soldierOne sideRadio "messageOne";$/Code$ + + $Code$player sideRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ + + $Code$[ west, "Base"] sideRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ - local / local + global / local - More information on the LB command family can be found here + (03:47, 12 February 2007) + In OFP v1.96, sideRadio messages can be sent from 2 abstract sources: "Papa_Bear" and "Base FireFly". Use sideRadio on an array in the form [SIDE,"base"],[SIDE,"HQ"],[SIDE,"Papa_bear"] or [SIDE,"airbase"], where SIDE is the side broadcasting. "HQ", "base" and "Papa_bear" seem to be the same object. The callsign strings can be re-defined using a stringTable.csv file, using STR_CFG_PAPABEAR and STR_CFG_FIREFLYBASE. Example : [EAST,"base"] sideRadio "returnToBase". + + (December 3, 2016) + To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: + $Code$ player sideRadio "#MySound.ogg";$/Code$ - Boolean + Nothing - Nothing + - lbPicture + vehicleReportRemoteTargets - Returns the picture name of the item with the given index of the listbox or combobox with id idc of the topmost user dialog. + Gets whether the vehicle shares acquired targets via datalink with the Side center. - https://community.bistudio.com/wiki/lbPicture + https://community.bistudio.com/wiki/vehicleReportRemoteTargets - lbPicture Array - - Control lbPicture Number + vehicleReportRemoteTargets Object - lbPicture [idc, index] - - control lbPicture index + vehicleReportRemoteTargets vehicle - $Code$_picture = lbPicture [101, 0];$/Code$ - - $Code$_picture = _control lbPicture 0;$/Code$ + $Code$vehicleReportRemoteTargets ( vehicle player );$/Code$ undefined / undefined - More information on the LB command family can be found here - String - String + Boolean + - lbSelection + deleteVehicle - Returns Array of selected rows indices in the given listbox of style LB_MULTI (multi-selection). For single selection listbox use lbCurSel instead. + Deletes an object. Only units inserted in the mission editor and units created during the game's progress can be deleted by this command. Island objects and player units cannot be removed. Deleting a vehicle, which is still being accessed by a running script, can result in a CTD. + NOTE : Actual object deletion, when object becomes objNull, happens on the next frame after command execution, but there are some object modifications that happen immediately. For example if the object is unit in a group, it immediately becomes groupless isNull group _unit; //true - https://community.bistudio.com/wiki/lbSelection + https://community.bistudio.com/wiki/deleteVehicle - lbSelection Control + deleteVehicle Object - lbSelection control + deleteVehicle object - $Code$_indices = lbSelection _control;$/Code$ + $Code$deleteVehicle _house1;$/Code$ + + $Code${ + _x action ["Eject", car]; + } forEach crew car; + deleteVehicle car;$/Code$ + + $Code$// Objects such as + //test_EmptyObjectForBubbles + //test_EmptyObjectForFireBig + //test_EmptyObjectForSmoke + //create additional emitters that needs to be deleted first before deleting the object itself: + ///--- function to delete test object (MP compatible) + fnc_deleteTestObj = { + _this addMPEventHandler ["MPKilled", { + _this = _this select 0; + { + deleteVehicle _x; + } forEach (_this getVariable ["effects", []]); + if ( isServer ) then { + deleteVehicle _this; + }; + }]; + _this setDamage 1; + }; + ///--- example + [] spawn { + _fire = "test_EmptyObjectForFireBig" createVehicle position player ; + sleep 5; + _fire call fnc_deleteTestObj; + };$/Code$ - undefined / undefined + global / global - (April 10, 2016) - This command works fine with listboxs of style LB_MULTI and should not be marked as obsolete as lbCurSel does not provide the same functionality. - Array + Nothing + - lbSetColor + shownCuratorCompass - Sets the color of the item with the given index of the listbox or combobox with id idc of the topmost user dialog to color. - Colour is in format Color. + Returns true if compass is shown. - https://community.bistudio.com/wiki/lbSetColor + https://community.bistudio.com/wiki/shownCuratorCompass - lbSetColor Array - - Control lbSetColor Array + shownCuratorCompass - lbSetColor [idc, index, color] - - control lbSetColor [index, color] + shownCuratorCompass - $Code$lbSetColor [101, 0, [0, 1, 0, 0.5]];$/Code$ - - $Code$_control lbSetColor [0, [0, 1, 0, 0.5]];$/Code$ - + - local / local + undefined / undefined - More information on the LB command family can be found here - Nothing - Nothing + Boolean + - lbSetCurSel + allCurators - Selects the item with the given index of the listbox or combobox with id idc of the topmost user dialog. - To deselect all, use -1: _ctrl lbSetCurSel -1; For listbox of style LB_MULTI use lbSetSelected instead. + Returns list of all curators. - https://community.bistudio.com/wiki/lbSetCurSel + https://community.bistudio.com/wiki/allCurators - lbSetCurSel Array - - Control lbSetCurSel Number + allCurators - lbSetCurSel [idc, index] - - control lbSetCurSel index + allCurators - $Code$lbSetCurSel [101, 0];$/Code$ - - $Code$_control lbSetCurSel 0;$/Code$ + $Code$_myVariable = allCurators;$/Code$ undefined / undefined - More information on the LB command family can be found here - - (November 29, 2014) - lbSetCurSel -1 has no effect while the listbox is populated. You should use lbClear first, then lbSetCurSel -1, then re-populate the listbox. - - (March 1, 2015) - Keep in mind that running this command against control will fire attached 'onLBSelChanged' event handler. + (June 20, 2015) + This returns all curator logic units, not the units assigned to the logic. - Nothing - Nothing + Array + - lbSetData + suppressFor - Sets the additional text (invisible) in the item with the given index of the listbox or combobox with id idc of the topmost user dialog to the given data. + Force suppressive fire from the unit. - https://community.bistudio.com/wiki/lbSetData + https://community.bistudio.com/wiki/suppressFor - lbSetData Array - - Control lbSetData Array + Object suppressFor Number - lbSetData [idc, index, data] - - control lbSetData [index, data] + unit suppressFor duration - $Code$lbSetData [101, 1, "#1"];$/Code$ - - $Code$_control lbSetData [1, "#1"];$/Code$ + $Code$_soldier1 suppressFor 10 + // Will force soldier1 to do suppressive fire to known enemies during 10 seconds$/Code$ undefined / undefined - More information on the LB command family can be found here - Nothing - Nothing + Nothing + - lbSetPictureColorDisabled + isFlashlightOn - Sets the disabled color of item's picture (left) with the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. + Returns true if there is a linked and enabled flashlight on a given weapon. - https://community.bistudio.com/wiki/lbSetPictureColorDisabled + https://community.bistudio.com/wiki/isFlashlightOn - lbSetPictureColorDisabled Array - - Control lbSetPictureColorDisabled Array + Object isFlashlightOn String - lbSetPictureColorDisabled [idc, index, color] - - control lbSetPictureColorDisabled [index, color] + unit isFlashlightOn weapon - $Code$lbSetPictureColorDisabled [101, 0, [1, 1, 1, 0.25]];$/Code$ - - $Code$_ctrl lbSetPictureColorDisabled [0, [1, 1, 1, 0.25]];$/Code$ + $Code$player isFlashlightOn ( currentWeapon player );$/Code$ undefined / undefined - More information on the LB command family can be found here - Nothing - Nothing + Boolean + - lbSetPictureColorSelected + showHUD - Sets the selected color of item's picture (left) with the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. + Enable / disable showing of HUD. Defines visibility of weapon crosshair and any informational tags that appear when pointing the weapon at an object as well as availability of the default action menu. Unfortunately, it also hides icons drawn with drawIcon3D. + Appearance of HUD can also be controlled with showHUD param in description.ext. NOTE: As of Arma 3 v1.49.131879 there is a showHUD[] array param, that is identical in format to the extended showHUD command. When showHUD[] array param is present in description.ext, it will disable showHUD command entirely, allowing mission makers to permanently alter visibility of some HUD elements. - https://community.bistudio.com/wiki/lbSetPictureColorSelected + https://community.bistudio.com/wiki/showHUD - lbSetPictureColorSelected Array + showHUD Boolean - Control lbSetPictureColorSelected Array + showHUD Array - lbSetPictureColorSelected [idc, index, color] + showHUD enable - control lbSetPictureColorSelected [index, color] + showHUD [hud, info, radar, compass, direction, menu, group, cursors, panels] - $Code$lbSetPictureColorSelected [101, 0, [0, 1, 0, 0.5]];$/Code$ + $Code$showHUD false ;$/Code$ - $Code$_ctrl lbSetPictureColorSelected [0, [1, 1, 1, 1]];$/Code$ + $Code$// Hide vehicle radar and compass: + showHUD [ true, true, false, false, true, true, true, true ];$/Code$ + + $Code$// Check if HUD visibility is hardcoded in mission config and showHUD command is overriden: + _disabledShowHUD = isArray ( missionConfigFile "showHUD");$/Code$ - undefined / undefined + undefined / local - More information on the LB command family can be found here + (August 17, 2015) + Last param, "cursors" controls visibility of the action menu as well as weapon cursors. However if 1st param "hud" hides and disables action menu, last param "cursors" only hides it. So you get invisible action menu that is fully operational. inGameUISetEventHandler will still fire on interaction, giving the information about selected item on the action menu even if you cannot see it. Unfortunately it also hides icons drawn with drawIcon3D. - Nothing - Nothing + Nothing - Nothing + - lbSetPictureColor + showCompass - Sets the color of item's picture (left) with the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. + Shows or hides the compass on the map screen, if enabled for the mission and you possess the item. (default true ) - https://community.bistudio.com/wiki/lbSetPictureColor + https://community.bistudio.com/wiki/showCompass - lbSetPictureColor Array - - Control lbSetPictureColor Array + showCompass Boolean - lbSetPictureColor [idc, index, color] - - control lbSetPictureColor [index, color] + showCompass show - $Code$lbSetPictureColor [101, 0, [0, 1, 0, 0.5]];$/Code$ - - $Code$_ctrl lbSetPictureColor [0, [1, 1, 1, 1]];$/Code$ + $Code$showCompass false ;$/Code$ undefined / undefined - More information on the LB command family can be found here - - (August 18, 2015) - (ArmA 3 1.48) To give an image on the right side of a listbox item: - $Code$_ctrl lbSetPictureRightColor [_index, [1,1,1,0.7]];$/Code$ + (16 Aug, 2009) + In Arma 2, the Compass is now an inventory item. Class path is CfgWeapons- ItemCompass. Use the commands addWeapon and removeWeapon to add or remove it from a unit's inventory. (example: player addweapon "ItemCompass") - Nothing - Nothing + Nothing + - lbSetPictureRightColorDisabled + setFeatureType - Sets the disabled color of second (right aligned) picture of the item with the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. + Enable/disable object as a feature/landmark. Possible feature types: + 0 - Feature disabled + 1 - Object is always visible within object view distance + 2 - Object is always visible within terrain view distance + The limit is 500 map/static objects and 200 dynamic objects including config features and auto features (flying helicopters, airplanes). When limit is reached, function returns false. - https://community.bistudio.com/wiki/lbSetPictureRightColorDisabled + https://community.bistudio.com/wiki/setFeatureType - lbSetPictureRightColorDisabled Array - - Control lbSetPictureRightColorDisabled Array + Object setFeatureType Number - lbSetPictureRightColorDisabled [idc, index, color] - - control lbSetPictureRightColorDisabled [index, color] + object setFeatureType type - $Code$lbSetPictureRightColorDisabled [101, 0, [1, 1, 1, 0.25]];$/Code$ - - $Code$_ctrl lbSetPictureRightColorDisabled [0, [1, 1, 1, 0.25]];$/Code$ + $Code$// Set a building to be always rendered: + building setFeatureType 2;$/Code$ - undefined / undefined + global / local - More information on the LB command family can be found here + (October 10, 2017) + For world objects, command effect persists after mission restart. Map must be reloaded to automatically revert setting. - Nothing - Nothing + Boolean + - lbSetPictureRightColorSelected + setFace - Sets the selected color of the second (right aligned) picture of the item with the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. + Set person's face. For a list of available faces, check Category:CfgIdentities. - https://community.bistudio.com/wiki/lbSetPictureRightColorSelected + https://community.bistudio.com/wiki/setFace - lbSetPictureRightColorSelected Array - - Control lbSetPictureRightColorSelected Array + Object setFace String - lbSetPictureRightColorSelected [idc, index, color] - - control lbSetPictureRightColorSelected [index, color] + person setFace face - $Code$lbSetPictureRightColorSelected [101, 0, [0, 1, 0, 0.5]];$/Code$ + $Code$soldier1 setFace "WhiteHead_02"$/Code$ - $Code$_ctrl lbSetPictureRightColorSelected [0, [1, 1, 1, 1]];$/Code$ + $Code$// Set persistent face for a unit in MP + if ( isServer ) then {[_unit, "AsianHead_A3_02"] remoteExec ["setFace", 0, _unit]};$/Code$ - undefined / undefined + global / local - More information on the LB command family can be found here + (September 19, 2013) + For ArmA 3 face can be any of the following: + AfricanHead_01 + AfricanHead_02 + AfricanHead_03 + AsianHead_A3_01 + AsianHead_A3_02 + AsianHead_A3_03 + GreekHead_A3_01 + GreekHead_A3_02 + GreekHead_A3_03 + GreekHead_A3_04 + GreekHead_A3_05 + GreekHead_A3_06 + GreekHead_A3_07 + GreekHead_A3_08 + GreekHead_A3_09 + PersianHead_A3_01 + PersianHead_A3_02 + PersianHead_A3_03 + NATOHead_01 + WhiteHead_02 + WhiteHead_03 + WhiteHead_04 + WhiteHead_05 + WhiteHead_06 + WhiteHead_07 + WhiteHead_08 + WhiteHead_09 + WhiteHead_10 + WhiteHead_11 + WhiteHead_12 + WhiteHead_13 + WhiteHead_14 + WhiteHead_15 + + (unknown) + For ArmA 2 the face value is a string from Face01 to Face107. Camo faces are available as well, 6 per face. For example the full set of class names for face value 77 would be: + Face77, Face77_camo1, Face77_camo2, Face77_camo3, Face77_camo4, Face77_camo5 and Face77_camo6 + All Armed Assault 1.08 faces plus tutorial, + Online gallery of 1.08 Armed Assault faces + a full list of Arma 2 faces - Nothing - Nothing + Nothing + - lbSetPictureRightColor + resources - Sets the color of the second (right aligned) picture of the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. + Returns the resources of a team member. Results are local to the PC on which command was executed. - https://community.bistudio.com/wiki/lbSetPictureRightColor + https://community.bistudio.com/wiki/resources - lbSetPictureRightColor Array - - Control lbSetPictureRightColor Array + resources Team_Member - lbSetPictureRightColor [idc, index, color] - - control lbSetPictureRightColor [index, color] + resources member - $Code$lbSetPictureRightColor [101, 0, [0, 1, 0, 0.5]];$/Code$ - - $Code$_ctrl lbSetPictureRightColor [0, [1, 1, 1, 1]];$/Code$ - + - undefined / undefined + global / local - More information on the LB command family can be found here - Nothing - Nothing + Array + - lbSetPictureRight + windDir - Sets the second (right aligned) picture in the item with the given index of the listbox or combobox with id idc of the topmost user dialog. Name is the picture name. The picture is searched for in the mission directory, the dtaExt subdirectory of the campaign directory and the dtaExt directory and the data bank (or directory). - In Arma 3 it might be necessary to set the color of the picture as well with lbSetPictureRightColor as default [0,0,0,0] color makes picture invisible. + Returns the current wind azimuth. - https://community.bistudio.com/wiki/lbSetPictureRight + https://community.bistudio.com/wiki/windDir - lbSetPictureRight Array - - Control lbSetPictureRight Array + windDir - lbSetPictureRight [idc, index, name] - - control lbSetPictureRight [index, name] + windDir - $Code$lbSetPictureRight [101, 0, "iskoda"];$/Code$ - - $Code$_control lbSetPictureRight [0, "iskoda"];$/Code$ + $Code$if ( windDir 45 || windDir 315) then { + hint "I feel a northern wind"; + };$/Code$ - local / local + undefined / undefined - More information on the LB command family can be found here - Nothing - Nothing + Number + - lbSetPicture + locationPosition - Sets the picture in the item (left) with the given index of the listbox or combobox with id idc of the topmost user dialog. Name is the picture name. The picture is searched for in the mission directory, the dtaExt subdirectory of the campaign directory and the dtaExt directory and the data bank (or directory). - In Arma 3 it might be necessary to set the color of the picture as well with lbSetPictureColor as default [0,0,0,0] color makes picture invisible. + Returns the position of a location. If the location is attached to an object, that object's position is returned. - https://community.bistudio.com/wiki/lbSetPicture + https://community.bistudio.com/wiki/locationPosition - lbSetPicture Array - - Control lbSetPicture Array + locationPosition Location - lbSetPicture [idc, index, name] - - control lbSetPicture [index, name] + locationPosition location - $Code$lbSetPicture [101, 0, "iskoda"];$/Code$ + $Code$_locationPos = locationPosition myLocation;$/Code$ - $Code$_control lbSetPicture [0, "iskoda"];$/Code$ + $Code$_location = nearestLocation [ getPos player, "nameCity"]; + _locationPos = locationPosition _location;$/Code$ - local / local + undefined / undefined - More information on the LB command family can be found here - - (August 18, 2015) - (ArmA 3) To place an image on the right end of the listItem: $Code$_ctrl lbSetPictureRight [_index, "A3\path\to\image.paa"];$/Code$ + (October 24, 2015) + locationPosition returns a position that is altitude zero ASL. - Nothing - Nothing + Array + - lbSetSelectColorRight + closeDialog - Sets the select color of the of the secondary text (right aligned) of the item with the given index of the listbox or combobox with id idc of the topmost user dialog to color. - Colour is in format Color. + Close the currently active user dialog with exit code. Most common exit codes are: + $Code$#define IDC_OK 1 //emulate "Ok" button$/Code$ + $Code$#define IDC_CANCEL 2 //emulate "Cancel" button$/Code$ - https://community.bistudio.com/wiki/lbSetSelectColorRight + https://community.bistudio.com/wiki/closeDialog - lbSetSelectColorRight Array - - Control lbSetSelectColorRight Array + closeDialog Number - lbSetSelectColorRight [idc, index, color] - - control lbSetSelectColorRight [index, color] + closeDialog exitcode - $Code$lbSetSelectColorRight [101, 0, [0, 1, 0, 0.5]];$/Code$ + $Code$closeDialog 2;$/Code$ - $Code$_control lbSetSelectColorRight [0, [0, 1, 0, 0.5]];$/Code$ + $Code$#define IDC_CANCEL 2 + closeDialog IDC_CANCEL;$/Code$ - undefined / undefined + local / local - More information on the LB command family can be found here - Nothing - Nothing + Nothing + - lbSetSelectColor + lockedCargo - Sets the select color of the item with the given index of the listbox or combobox with id idc of the topmost user dialog to color. - Colour is in format Color. + Check whether cargo position of the vehicle is locked. - https://community.bistudio.com/wiki/lbSetSelectColor + https://community.bistudio.com/wiki/lockedCargo - lbSetSelectColor Array - - Control lbSetSelectColor Array + Object lockedCargo Number - lbSetSelectColor [idc, index, color] - - control lbSetSelectColor [index, color] + vehicle lockedCargo cargoIndex - $Code$lbSetSelectColor [101, 0, [0, 1, 0, 0.5]];$/Code$ - - $Code$_control lbSetSelectColor [0, [0, 1, 0, 0.5]];$/Code$ + $Code$_result = vehicleName lockedCargo 0;$/Code$ undefined / undefined - More information on the LB command family can be found here + (May 4, 2016) + For some vehicles, the command returns nothing if the cargo index is invalid (i.e. -1) - Nothing - Nothing + Boolean + - lbSetSelected + verifySignature - Set the selection state of the given row of the given listbox of style LB_MULTI. For single selection listbox use lbSetCurSel instead. + Check if file is signed by any key present in game keys folders. Note: On client, it does not check against the keys accepted by server. - https://community.bistudio.com/wiki/lbSetSelected + https://community.bistudio.com/wiki/verifySignature - Control lbSetSelected Array + verifySignature String - control lbSetSelected [index, selected] + verifySignature filename - $Code$_control lbSetSelected [0, true ];$/Code$ + $Code$verifySignature "@MyAddon\Addons\SomeAddon.pbo";$/Code$ + + $Code$verifySignature "@MyAddon\Somefnc.dll";$/Code$ undefined / undefined - (April 10, 2016) - This command works fine with listboxs of style LB_MULTI and should not be marked as obsolete as lbSetCurSel does not provide the same functionality. - Nothing + Boolean + - lbSetTooltip + round - Sets tooltip for item with given index of the listbox or combobox with id idc of the topmost user dialog to the given data. + Rounds up or down to the closest integer. - https://community.bistudio.com/wiki/lbSetTooltip + https://community.bistudio.com/wiki/round - lbSetTooltip Array - - Control lbSetTooltip Array + round Number - lbSetTooltip [idc, index, tooltip] - - control lbSetTooltip [index, tooltip] + round x - $Code$lbSetTooltip [101, 1, "tooltip"];$/Code$ + $Code$_val= round 5.25, result is 5$/Code$ - $Code$_control lbSetTooltip [0, "another tooltip"];$/Code$ + $Code$_val= round 5.55, result is 6$/Code$ - local / local + undefined / undefined - More information on the LB command family can be found here - - (August 9, 2017) - [ ArmA 3 v1.75.142535 ] if you want to put linebreaks into a tooltip, use this method: - $Code$format [ "%1,%2%3", "hi", parseText "\n", "my name is Will" ]$/Code$ + (February 23, 2018) + If you want to round to a specific place past the decimal point, use toFixed and parseNumber together. For example: + $Code$ parseNumber (3.16666 toFixed 1); // 3.2$/Code$ - Nothing - Nothing + Number + - lbSetValue + createSimpleObject - Sets the additional integer value in the item with the given index of the listbox or combobox with id idc of the topmost user dialog to the given value. + Create object with given shape defined as path to.p3d model. Supported LODs include Geometry, Fire Geometry, Roadway, View Geometry and ShadowVolume. Supported features include collision, texturing, animation, penetration, AI spotting occlusion, and surface specific sounds (like footsteps). Unsupported features include PhysX, damage, AI pathfinding (causes walking through walls), and built in lights. + Given the simulation limitations, global decorative objects can be created with very little network traffic. Objects that could be exclusively created with this command are: trees, bushes, rocks, bridges, roads, vehicle wrecks, custom models in mission, and other objects without a class in config. The height of the placement position might need to be adjusted experimentally. Some of the model examples could be found here: createSimpleObject/objects + Guide: Arma 3 Simple Objects + One cannot attach actions to a simple object via addAction. + NOTES : + Objects created with Syntax 1 cannot be textured. Some objects may also have inverted default direction. + Objects created with Syntax 2 can be textured. The default direction should match the direction of the object if it was created with createVehicle. + Since Arma 3 v1.67 simple objects support setVariable and getVariable - https://community.bistudio.com/wiki/lbSetValue + https://community.bistudio.com/wiki/createSimpleObject - lbSetValue Array - - Control lbSetValue Array + createSimpleObject Array - lbSetValue [idc, index, value] + createSimpleObject [shapeName, positionWorld] - control lbSetValue [index, value] + createSimpleObject [className, positionASL] - $Code$lbSetValue [101, 0, 1];$/Code$ + $Code$_pos = player getRelPos [10, 0]; + _tank = createSimpleObject ["a3\armor_f_beta\apc_tracked_01\apc_tracked_01_rcws_f.p3d", _pos]; + _tank setPos (_pos vectorAdd ( getPosWorld _tank vectorDiff (_tank modelToWorld [0,0,0]))); + _tank hideSelection ["zasleh", true ]; + _tank hideSelection ["zasleh2", true ]; + _tank hideSelection ["clan", true ]; + _tank animate ["Wheel_podkoloL3", 0.5, true ]; + _tank animate ["Wheel_podkoloL6", 0.5, true ];$/Code$ - $Code$_control lbSetValue [0, 1];$/Code$ + $Code$_pos = player getRelPos [10, 0]; + _tank = createSimpleObject ["B_APC_Tracked_01_CRV_F", AGLtoASL _pos]; + _tank setObjectTexture [0, "#(rgb,8,8,3)color(0,1,0,0.01)"]; + _tank hideSelection ["zasleh", true ]; + _tank hideSelection ["zasleh2", true ]; + _tank hideSelection ["clan", true ]; + _tank animate ["Wheel_podkoloL3", 0.5, true ]; + _tank animate ["Wheel_podkoloL6", 0.5, true ];$/Code$ - undefined / undefined + undefined / global - More information on the LB command family can be found here + (April 18, 2016) + The easiest way to correctly place simple object is to create normal object of the same shape from class (if possible), then copy getPosWorld, vectorDir and vectorUp from it. Then create the simple object and apply copied values to it, this will position simple object exactly as normal object was positioned: + $Code$_heli = "B_Heli_Light_01_F" createVehicleLocal ( player getRelPos [10, 0]); + _position = getPosWorld _heli; + _vectorDirUp = [ vectorDir _heli, vectorUp _heli]; + _model = getModelInfo _heli select 1; + deleteVehicle _heli; + _simpleHeli = createSimpleObject [_model, _position]; + _simpleHeli setVectorDirAndUp _vectorDirUp;$/Code$ - (September 21, 2014) - lbSetValue only accepts integer, no decimal number. - Example: - CONTROL lbSetValue [index,10]; // value will be 10 - CONTROL lbSetValue [index,3.1]; // value will be 3 + (April 28, 2016) + Models from within the mission file/folder can be created, but full system path is needed. Use: + $Code$( str missionConfigFile select [0, count str missionConfigFile - 15]) + "myModel.p3d" + //mission folder path code from: http://killzonekid.com/arma-scripting-tutorials-mission-root/ $/Code$ + + (May 11, 2016) + simulationEnabled returns false. + + (September 5, 2016) + There is a section in function library dedicated to simple object creation and interaction. It's purpose is to simplify the operations: + BIS_fnc_createSimpleObject + creates simple object according to the supplied data + you can supply p3d path, class name or data you get from scanning a non-simple object + BIS_fnc_simpleObjectData + gathers and returns data about the non-simple object + data can be then used to create simple object + BIS_fnc_replaceWithSimpleObject + replaces non-simple object with simple object on the scene + do not use it in large scale in MP missions as it is not network efficient + BIS_fnc_adjustSimpleObject + adjusts simple object to looks as close to the non-simple object as possible + function is internally called from the 'bis_fnc_createSimpleObject', you won't probably need to call this function directly + Check the function headers for more info about the input parameters and possibilities. - Nothing - Nothing + Object + - lbSize + queryWeaponPool - Return number of items of listbox or combobox with id idc of topmost user dialog. + Return number of weapons of type name in weapon pool (used in campaign to transfer weapons into next mission). - https://community.bistudio.com/wiki/lbSize + https://community.bistudio.com/wiki/queryWeaponPool - lbSize Number - - lbSize Control + queryWeaponPool String - lbSize idc - - lbSize control + queryWeaponPool name - $Code$_size = lbSize 101;$/Code$ - - $Code$_size = lbSize _control;$/Code$ + $Code$_num=queryWeaponPool "M16"$/Code$ - local / local + undefined / undefined - More information on the LB command family can be found here - Number - Number + Number + - lbSortByValue + detach - Sorts the ListBox entries by lbValue. The entries are sorted in ascending order. Also note that this command will mix up the entries randomly if multiple entries have the same value. + Detaches previously attached with attachTo object. - https://community.bistudio.com/wiki/lbSortByValue + https://community.bistudio.com/wiki/detach - lbSortByValue Control - - lbSortByValue Number + detach Object - lbSortByValue control - - lbSortByValue idc + detach object - $Code$lbSortByValue _control;$/Code$ - - $Code$lbSortByValue 101;$/Code$ + $Code$obj1 attachTo [player]; + detach obj1;$/Code$ - undefined / undefined + global / global - A good way to avoid that this Command will mix your Listbox up is, to assign your Value summed up with the Index ID returned by lbAdd to your Listbox Entries. - Posted: Sep 10 2014 - - More information on the LB command family can be found here - Nothing - Nothing + Nothing + - lbSort + fleeing - Sorts listbox entries alphabetically ascending by their lbText + Checks if a unit is fleeing. - https://community.bistudio.com/wiki/lbSort + https://community.bistudio.com/wiki/fleeing - lbSort Control - - lbSort Array - - lbSort Number + fleeing Object - lbSort control - - lbSort [control, sortOrder] - - lbSort idc - - lbSort [idc, sortOrder] + fleeing unitName - $Code$lbSort _myControl;$/Code$ - - $Code$lbSort [_myControl, "DESC"];$/Code$ - - $Code$lbSort 101;$/Code$ - - $Code$lbSort [101, "DESC"];$/Code$ + $Code$? (fleeing _east_unit) : player sideChat "We have won!"$/Code$ - undefined / undefined + global / undefined - More information on the LB command family can be found here - Nothing - Nothing - Nothing + Boolean + - lbText + tvSortByValue - Returns the shown text in the item with the given index of the listbox or combobox with id idc of the topmost user dialog. + Sorts children of given item by tvValue from highest to lowest by default. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/lbText + https://community.bistudio.com/wiki/tvSortByValue - lbText Array + Control tvSortByValue Array - Control lbText Number + tvSortByValue Array - lbText [idc, index] + control tvSortByValue [path, reversed] - control lbText index + tvSortByValue [idc, path, reversed] - $Code$_text = lbText [101, 0];$/Code$ + $Code$control tvSortByValue [[0], false ];$/Code$ - $Code$_text = _control lbText 0;$/Code$ + $Code$tvSortByValue [102, [0], false ];$/Code$ - local / local + undefined / undefined - More information on the LB command family can be found here - String - String + Nothing - Nothing + - lbValue + doStop - Returns the additional integer value in the item with the given index of the listbox or combobox with id idc of the topmost user dialog. + Order the given unit(s) to stop (without radio messages). The units stopped in this way will leave the groups formation. It will prevent them from moving around with their group (or formation leader), while still being able to turn around and even move to a new position if they see fit. The units will still respond to orders from their group leader (like engage, rearm, board a vehicle), but all of their actions will be separate from the group formation. To resume group default behaviour, use doFollow command. For example: units _group doFollow leader _group; - https://community.bistudio.com/wiki/lbValue + https://community.bistudio.com/wiki/doStop - lbValue Array - - Control lbValue Number + doStop Object/Array - lbValue [idc, index] - - control lbValue index + doStop unit - $Code$_value = lbValue [101, 0];$/Code$ + $Code$doStop _soldier1;$/Code$ - $Code$_value = _control lbValue 0;$/Code$ + $Code$doStop [_soldier1, _soldier2];$/Code$ + + $Code$doStop ( units player );$/Code$ - local / local + global / global - More information on the LB command family can be found here + (August 3, 2006) + Notes from before the conversion: + This command will make the unit stop where he is until the unit's group engages the enemy. At that time, the unit will move and fight the enemy. One good use for this is to place a bunch of units in the same group around a campfire or in some other place "for looks", and make them sit down or have their weapon on their back. When the enemy is spotted, they will get up and attack. Note that you cannot do something like place somebody behind sandbags and keep him there during a fight with this command. For that you will need disableAI "move". + + In ArmA 1.14, this command will not stop a unit that has been given a move order by selecting the unit, then clicking on the in game map (or ground). + + doStop'ed units WILL return to formation if their leader's behaviour isn't set to "COMBAT". The squad leader will also order everyone to return to formation if there are no enemies nearby in a set period of time, overwriting the doStop command. doStop can be best used to simply stop the unit from doing whatever he is currently doing without radio messages. + + (December 23, 2016) + When a unit reaches position given with doMove, unitReady becomes true. If doStop command is not executed, unit will start wondering on its own soon after, especially if unit is under fire. doStop will keep unit at the given position, but watch out for unitReady as it will become false since unit is holding position indefinitely. + + (December 27, 2016) + Although it is possible to resume group default behaviour by joining units into own group like this units _group joinSilent _group there is a risk that the leader will change. Instead use doFollow command as explained in the description. - Number - Number + Nothing + - leaderboardDeInit + curatorCameraAreaCeiling - Deletes internal class for the leaderboard with given name. Returns true if the board has been found and deinitialized. + Returns ceiling height for curator camera. - https://community.bistudio.com/wiki/leaderboardDeInit + https://community.bistudio.com/wiki/curatorCameraAreaCeiling - leaderboardDeInit String + curatorCameraAreaCeiling Object - leaderboardDeInit boardName + curatorCameraAreaCeiling curatorObj - $Code$leaderboardDeInit "TT01"$/Code$ + $Code$curatorCameraAreCeiling BIS_curatorUnit;$/Code$ undefined / undefined @@ -37439,55 +39149,60 @@ - Boolean + Number + - leaderboardGetRows + addHandgunItem - Returns an array with values for the given leaderboard, the array is in format: [[player1Name, score, rank], [player2Name, score, rank], [player3Name, score, rank]... ]; This can be called after the one of the row request function has been called and successfully finished! + Adds weapon item to the weapon cargo space. This is used for infantry weapons. + As of Arma 3 DEV 1.37, this command also supports weapon magazines. - https://community.bistudio.com/wiki/leaderboardGetRows + https://community.bistudio.com/wiki/addHandgunItem - leaderboardGetRows String + Object addHandgunItem String - leaderboardGetRows boardName + unit addHandgunItem item - $Code$leaderboardGetRows "TT01"$/Code$ + $Code$player addHandgunItem "muzzle_snds_L";$/Code$ - undefined / undefined + local / global - Array + Nothing + - leaderboardInit + addGoggles - Initialize the leaderboard structure for board with given name. Returns true if board is already initialized. + Create a new item and try to link it into goggles slot. This command doesn't add NVGoggles. Use addItem and assignItem or just linkItem for latter. - https://community.bistudio.com/wiki/leaderboardInit + https://community.bistudio.com/wiki/addGoggles - leaderboardInit String + Object addGoggles String - leaderboardInit boardName + unit addGoggles type - $Code$leaderboardInit "TT01"$/Code$ + $Code$player addGoggles "G_Tactical_Clear";$/Code$ + + $Code$diver addGoggles "G_Diving";$/Code$ undefined / undefined @@ -37495,234 +39210,178 @@ - Boolean + Nothing + - leaderboardState + menuSetCheck - returns state of the board with given name. 0: Busy (async. operation in progress); 1: Async. operation ended with success; 2: Async. operation ended with error; 3: Invalid board (bad board name, not initialized etc.). + Sets item on given path to be checked or not. - https://community.bistudio.com/wiki/leaderboardState + https://community.bistudio.com/wiki/menuSetCheck - leaderboardState String + menuSetCheck Array - leaderboardState boardname + menuSetCheck [idc, path, checkedl] - $Code$leaderboardState ["TT01", 1234, [5,6,7,8]]$/Code$ - + undefined / undefined - Number + Nothing + - leaderboardsRequestUploadScoreKeepBest + setPosASL2 - Starts async. operation to upload score to board with given name, value is only stored to board if it's better than one already in the board. The details array is optional. The board has to be initialized before the call. + Sets the object position. The pos array uses the PositionASL format. The version of the command does not offset based on object center. + Appears to be broken - https://community.bistudio.com/wiki/leaderboardsRequestUploadScoreKeepBest + https://community.bistudio.com/wiki/setPosASL2 - leaderboardsRequestUploadScoreKeepBest Array + Object setPosASL2 Array - leaderboardsRequestUploadScoreKeepBest [boardName, score, [details]] + obj setPosASL2 pos - $Code$leaderboardsRequestUploadScoreKeepBest ["TT01", 1234, [5,6,7,8]]$/Code$ + $Code$player setPosASL2 [ getPosASL player select 0, ( getPosASL player select 1) + 10, getPosASL player select 2]$/Code$ undefined / undefined + (21 Aug, 2013) + This command appears to do nothing in both Arma 2 and Arma 3. Tested on 21-08-2013. - Boolean + Nothing + - leaderboardsRequestUploadScore + worldToScreen - Starts async. operation to upload score to board with given name, value always overwrite the current value in the board. The details array is optional. The board has to be initialized before the call. + Converts position in world space into screen (UI) space. If a specified position is not within the current screen view, an empty array is returned. - https://community.bistudio.com/wiki/leaderboardsRequestUploadScore + https://community.bistudio.com/wiki/worldToScreen - leaderboardsRequestUploadScore Array + worldToScreen Array - leaderboardsRequestUploadScore [boardName, score, [details]] + worldToScreen position - $Code$leaderboardsRequestUploadScore ["TT01", 1234, [5,6,7,8]]$/Code$ + $Code$_screenPos = worldToScreen getPos soldier1;$/Code$ + + $Code$_screenPos = worldToScreen ( player modelToWorld [0,10,0]);$/Code$ undefined / undefined + (august 19th, 2012) + please take safezones in consideration : the returned result can be out of the [0,0]..[1,1] range and can also be a filled array even if the position is not displayed on your monitor - this command thinks of triplescreens configurations as well. [] returned = not rendered - Boolean + Array + - leader + taskResult - Returns the group leader for the given unit or group. For dead units, objNull is returned. + Send a result of the task to the task sender. - https://community.bistudio.com/wiki/leader + https://community.bistudio.com/wiki/taskResult - leader Object/Group + taskResult Task - leader unitName + taskResult task - $Code$leader group player == leader player$/Code$ - - $Code$_GroupLeader = leader ( group ( vehicle player ))$/Code$ - - $Code$_UnitLeader = leader player$/Code$ - + - global / undefined + undefined / undefined - Object + Array + - leaveVehicle + getCursorObjectParams - Ceases the using of the vehicle by a group and unassigns vehicle from the group. If the argument is a single unit, the vehicle will be unassigned from unit's group. After vehicle is unassigned from the group, each individual crew member then unassigned from the vehicle. - In short the command could be hypothetically presented as: - leaveVehicle = un- addVehicle + unassignVehicle forEach crew - However, to make it more reliable, it is best to move unit out of the vehicle manually with moveOut command and force unassign the vehicle with unassignVehicle + Returns object and named selections under cursor and distance to object's surface (to the point cursor points at). If object surface is further away than 50 meters, selections are always an empty array and distance is 1e10 (10^10). - https://community.bistudio.com/wiki/leaveVehicle + https://community.bistudio.com/wiki/getCursorObjectParams - Group/Object leaveVehicle Object + getCursorObjectParams - group leaveVehicle vehicle + getCursorObjectParams - $Code$_unit leaveVehicle _vehicle$/Code$ - - $Code$_grp leaveVehicle _vehicle$/Code$ + $Code$hint str getCursorObjectParams ;$/Code$ - local / local + undefined / undefined - (August 31, 2013) - In ArmA 3 this command will not force a player to exit from a vehicle. It will unassign vehicle role for this player. AI crew however will also disembark. - Nothing + Array + - libraryCredits + score - Returns the credits for the libraries used by the game. + Returns the person's score in MP. - https://community.bistudio.com/wiki/libraryCredits + https://community.bistudio.com/wiki/score - libraryCredits + score Object - libraryCredits + score unit - $Code$hint str libraryCredits ; // as in Arma2 OA 1.62.95208 - /* - [ - [ - "Botan", - "1999-2012 Jack Lloyd, 2001 Peter J Jones, 2004-2007 Justin Karneges, 2004 Vaclav Ovsik, 2005 Matthew Gregan, 2005-2006 Matt Johnston, 2006 Luca Piccarreta, 2007 Yves Jerschow, 2007-2008 FlexSecure GmbH, 2007-2008 Technische Universitat Darmstadt, 2007-2008 Falko Strenzke, 2007-2008 Martin Doering, 2007 Manuel Hartl, 2007 Christoph Ludwig, 2007 Patrick Sona, 2010 Olivier de Gaalon" - ], - [ - "rapidjson", - "2011 Milo Yip" - ], - [ - "libcurl", - "Copyright (c) 1996 - 2012, Daniel Stenberg" - ], - [ - "GameSpy", - "2009 GameSpy Industries, Inc." - ], - [ - "Theora", - "2002-2009 by the Xiph.Org Foundation http://www.xiph.org/" - ], - [ - "OggVorbis", - "1994-2002 by the Xiph.Org Foundation http://www.xiph.org/" - ], - [ - "Intel JPEG Library", - "1998 Intel Corporation" - ], - [ - "Matrix Template Library", - "2001-2005 The Trustees of Indiana University" - ], - [ - "Matrix Template Library", - "1998-2001 University of Notre Dame" - ], - [ - "Speex", - "2002-2006 Jean-Marc Valin" - ], - [ - "LZO Professional", - "1996-2011 Markus Franz Xaver Johannes Oberhumer" - ], - [ - "NVIDIA FXAA by TIMOTHY LOTTES", - "2010, 2011 NVIDIA CORPORATION" - ], - [ - "Jimenez's MLAA", - "2012 2011 by Jorge Jimenez, Belen Masia, Jose I. Echevarria, Fernando Navarro and Diego Gutierrez" - ] - ] - */$/Code$ + $Code$_pScore = score player ;$/Code$ undefined / undefined @@ -37730,28 +39389,29 @@ - Array + Number + - libraryDisclaimers + rad - Returns the library disclaimers. + Convert x from Degrees to Radians. 360 degrees is equal to 2 multiplied with pi. - https://community.bistudio.com/wiki/libraryDisclaimers + https://community.bistudio.com/wiki/rad - libraryDisclaimers + rad Number - libraryDisclaimers + rad x - $Code$hint str libraryDisclaimers ; // as in Arma2 OA 1.62.95208 - // ["THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."]$/Code$ + $Code$_radians = rad 180 + // Result is 3.1415 (eg pi$/Code$ undefined / undefined @@ -37759,110 +39419,86 @@ - Array + Number + - lifeState + enablePersonTurret - Returns the life state of the given unit. Can be one of: - (Pre-Arma 3) - "ALIVE" - "DEAD" - "DEAD-RESPAWN" - "DEAD-SWITCHING" - "ASLEEP" - "UNCONSCIOUS" - (Arma 3) - "HEALTHY" - "DEAD" - "DEAD-RESPAWN" - "DEAD-SWITCHING" - "INCAPACITATED" - "INJURED" - In Arma 3 lifeState seems to change to "INJURED" when damage aliveUnit = 0.1 (0.1 seems to be the value defined in config under "InjuredTreshold"). + Enables or disables firing from a vehicle cargo position. To get the turret path use assignedVehicleRole or getCargoIndex command. - https://community.bistudio.com/wiki/lifeState + https://community.bistudio.com/wiki/enablePersonTurret - lifeState Object + Object enablePersonTurret Array - lifeState unit + vehicle enablePersonTurret [turretPath, enable] - $Code$_ls = lifeState loon;$/Code$ + $Code$heli enablePersonTurret [[1], true ];$/Code$ - global / undefined + undefined / undefined - String + Nothing + - lightAttachObject + removeAllCuratorEditingAreas - Attach light to given object at given position on object. + Delete all curator edit areas. - https://community.bistudio.com/wiki/lightAttachObject + https://community.bistudio.com/wiki/removeAllCuratorEditingAreas - Object lightAttachObject Array + removeAllCuratorEditingAreas Object - light lightAttachObject [object, position] + removeAllCuratorEditingAreas curatorObj - $Code$myLight lightAttachObject [myVehicle, [-0.5,-0.25,1]];$/Code$ + $Code$removeAllCuratorEditingAreas myCurator;$/Code$ - global / local + undefined / undefined - (Dec 1, 2006) - Light can be created with command createVehicleLocal with special vehicle class "#lightpoint" - for example: - $Code$_light = "#lightpoint" createVehicleLocal pos; - _light setLightBrightness 1.0; - _light setLightAmbient [0.0, 1.0, 0.0]; - _light setLightColor [0.0, 1.0, 0.0]; - _light lightAttachObject [_object, [0,0,0]]; - $/Code$ - - (March 31, 2015) - When attached, movement is slow to update (jumpy). Use attachTo when attaching a light to moving objects. - Nothing + Nothing + - lightDetachObject + assignedCargo - Detach light from object. + Returns the list of soldiers assigned to the given vehicle as a cargo. - https://community.bistudio.com/wiki/lightDetachObject + https://community.bistudio.com/wiki/assignedCargo - lightDetachObject Object + assignedCargo Object - lightDetachObject light + assignedCargo vehicle - $Code$LightDetachObject _light$/Code$ + $Code$_list = assignedCargo _vehicleName$/Code$ undefined / undefined @@ -37870,1739 +39506,1227 @@ - Nothing + Array + - lightIsOn + isDedicated - Check if lampost is on (shining). For working with CfgNonAIVehicles class "StreetLamp" only. Possible values are: - "ON" - "OFF" - "AUTO" (auto is only on during the night). - "ERROR" + Return true if the machine (executing the command) is a dedicated multiplayer server. In single player returns false. - https://community.bistudio.com/wiki/lightIsOn + https://community.bistudio.com/wiki/isDedicated - lightIsOn Object + isDedicated - lightIsOn lamppost + isDedicated - $Code$? lightIsOn nearestObject [ player, "StreetLamp"] == "ON" :hint "nightime"$/Code$ - - $Code$_it = lightIsOn object 159582$/Code$ - - $Code$if ( count allMissionObjects "StreetLamp" == 0) then { - hint "Objects compatible with 'lightIsOn' are not found."; - } else { - hint "'lightIsOn' compatible objects are found!"; - };$/Code$ + $Code$if ( isDedicated ) then { diag_log "Dedicated Server on the run !";};$/Code$ undefined / undefined - (August 4, 2006) - Notes from before the conversion: - Use switchLight to turn lamposts on and off. + (December 21, 2014) + $Code$ if ( isDedicated ) then { + //run on dedicated server only + }; + if ( isServer ) then { + //run on dedicated server or player host + }; + if ( hasInterface ) then { + //run on all player clients incl. player host + }; + if (! isDedicated ) then { + //run on all player clients incl. player host and headless clients + }; + if (! isServer ) then { + //run on all player clients incl. headless clients but not player host + }; + if (! hasInterface ) then { + //run on headless clients and dedicated server + }; + if (! hasInterface && ! isDedicated ) then { + //run on headless clients only + };$/Code$ - String + Boolean + - lightnings + deleteResources - Return the current lightnings value. + Delete (unregister) resources of the team member. Resources are deleted in the order they were added. Case insensitive. - https://community.bistudio.com/wiki/lightnings + https://community.bistudio.com/wiki/deleteResources - lightnings + Team_Member deleteResources Array - lightnings + teamMember deleteResources [resource1, resource2,] - $Code$// Get the current lightnings value: - _lightningsVal = lightnings ;$/Code$ + $Code$teamMember _agent deleteResources ["Legs"];$/Code$ - undefined / undefined + global / local - Number + Nothing + - limitSpeed + nearestObject - Limit speed of given vehicle or person to given value (in km/h). + Returns the nearest object of given type to given position within a sphere. Hardcoded radius is 50 meters. Unlike with nearestObjects, where distance is measured in 2D space, nearestObject will be closest object in 3D space. + If object class type is used, any object derived from the type is found as well (In OFP however, only objects with exactly the type given are found). If object ID passed as an argument (as in example 2) the search range is unlimited. - https://community.bistudio.com/wiki/limitSpeed + https://community.bistudio.com/wiki/nearestObject - Object limitSpeed Number + nearestObject Array + + nearestObject Position3D/Position2D/Object + + Position3D/Position2D nearestObject String + + Position3D/Position2D nearestObject Number - objectName limitSpeed speed + nearestObject [position, type] + + nearestObject position + + position nearestObject type + + position nearestObject id - $Code$// Adjust "speedLimit" variable to change limited speed. (A3 1.24 we don't need loop for a continus effect, limitSpeed alone is enough.) - _this setVariable ["speedLimit", 200]; - _nul = _this spawn { - while { canMove _this} do { - _this limitSpeed (_this getVariable "speedLimit"); - sleep 0.1; - }; - };$/Code$ + $Code$_nObject = nearestObject [2345,6789]; + _nObject = nearestObject [ player, "StreetLamp"];$/Code$ - $Code$["SpeedObserver","onEachFrame",{ hintSilent format ["%1", speed vehicle MyVehicle]},[]] call BIS_fnc_addStackedEventHandler ; - sleep 10; - MyVehicle limitSpeed 5; //Watch the effect of this command.$/Code$ + $Code$// Return the object with ID 123456: + _nObject = [0,0,0] nearestObject 123456;$/Code$ + + $Code$_nObject = getPos player nearestObject "StreetLamp";$/Code$ + + $Code$// Return the nearest object with ( typeOf _nObject == "#XXXX") - #mark, #slop, etc. Unlimited search range: + _nObject = _position nearestObject -1; + // Return the nearest object with ( typeOf _nObject != ""). Search range is 50m:_nObject = nearestObject _position;$/Code$ + + $Code$// (See also allMissionObjects ): + _blood = nearestObject [ player, "#slop"]; + _step = nearestObject [ player, "#mark"]; + _track = nearestObject [ player, "#track"]; + _crater = nearestObject [ player, "#crater"];$/Code$ undefined / undefined - (9 February 2008) - (A1 1.08.5163)Has only an temporary effect on the vehicle specified (i.e. vehicle goes back to its previous speed right away). So, in order for this command to have a real, noticeable effect, it would have to be issued continuously (e.g. via a script loop, but in A3 1.24 it's unnecessary). - - (29 July 2014) - (A3 1.24)To clarify, limitSpeed only do effect on non-player controlled AI units, it has continuous effect and AI won’t break through the speed limitation until one is contacted, engaged or regrouped. - Nothing + Object - Object - Object - Object + - lineBreak + moveObjectToEnd - Creates a structured text containing a line break. + Shifts an editor object to the end of the objects array. This means,that the object will be drawn last (after all other objects). + i + Some Old Editor Command - https://community.bistudio.com/wiki/lineBreak + https://community.bistudio.com/wiki/moveObjectToEnd - lineBreak + Control moveObjectToEnd String - lineBreak + map moveObjectToEnd object - $Code$_txt = composeText ["First line", lineBreak, "Second line"];$/Code$ - + undefined / undefined - Structured_Text + Nothing + - lineIntersects + missionDifficulty - Checks for object intersection with a virtual line between two positions. Returns true if intersects with an object. - NOTE: Doesn't work under water. Max harcoded distance is 1000m. + Return difficulty that has been forced for this mission, returns -1 if difficulty is not forced and it's used one from player's options. - https://community.bistudio.com/wiki/lineIntersects + https://community.bistudio.com/wiki/missionDifficulty - lineIntersects Array + missionDifficulty - lineIntersects [begPos, endPos, objIgnore1, objIgnore2] + missionDifficulty - $Code$lineIntersects [ eyePos player, aimPos chopper, player, chopper]$/Code$ + + + undefined / undefined + + + + + Number + + + + + + isAutoHoverOn + + + Return true if vehicle has enabled auto hover. (always returns false if the vehicle can't set auto hover) + + + https://community.bistudio.com/wiki/isAutoHoverOn + + + isAutoHoverOn Object + + + isAutoHoverOn vehicle + + + $Code$status = isAutoHoverOn vehicle player;$/Code$ - global / undefined + undefined / undefined - (may 31, 2012) - Please note the difference : - terrainIntersect - terrainIntersectASL - lineIntersects - lineIntersectsWith - lineIntersectsObjs - intersect - Boolean + Boolean + - lineIntersectsObjs + ctrlSetAutoScrollRewind - Returns list of objects intersected by given line from begPos to endPos. + Defines if scroll should rewind when auto-scroll reach end. Setter for ctrlAutoScrollRewind. + Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. - https://community.bistudio.com/wiki/lineIntersectsObjs + https://community.bistudio.com/wiki/ctrlSetAutoScrollRewind - lineIntersectsObjs Array + Control ctrlSetAutoScrollRewind Boolean - lineIntersectsObjs [begPos, endPos, withObj, ignoreObj, sortByDistance, flags] + control ctrlSetAutoScrollRewind set - + $Code$_ctrlGroup ctrlSetAutoScrollRewind true ;$/Code$ + - global / undefined + undefined / undefined - (Mar 27, 2014) - Example (in ArmA3 ver 1.14) display objects' array in the middle of the screen sorted by 6 flags: - $Code$ - Sto = []; - Fn = { - { - Sto set [_foreachindex, lineIntersectsObjs [( eyePos player ),( ATLtoASL screenToWorld [0.5,0.5]), objNull, objNull, false,_x]]; - } forEach [1,2,4,8,16,32]; - hintSilent format [" - ONLY_WATER: %1, - NEAREST_CONTACT: %2, - ONLY_STATIC: %3, - ONLY_DYNAMIC: %4, - FIRST_CONTACT: %5, - ALL_OBJECTS: %6", - Sto select 0,Sto select 1,Sto select 2,Sto select 3,Sto select 4,Sto select 5]; - }; - ["sample_id","onEachFrame","Fn"] call BIS_fnc_addStackedEventHandler ; - $/Code$ - - (March 29, 2016) - Distance sorting is relative to object model center, and not intersect position. - Array + Nothing + - lineIntersectsSurfaces + synchronizeWaypoint - Returns list of intersections with surfaces from begPosASL to endPosASL. If there is ground intersection, it is also included. Works on units. Works underwater. Doesn't return intersection with sea surface. Hardcoded max distance: 5000m. By default, for speed purposes, command will return only 1st intersection with unique objects. Since Arma 3 v1.69.140138, this could be tweaked with an optional param. NOTE: if begPosASL is under the ground and endPosASL is above it, the command will only return intersection with the ground, this is engine limitation and none of the intersectXXX commands will work when initiated from under the ground. - Since Arma v1.51.131920 it is possible to indicate primary and secondary LOD to look for intersection. Available options are: - "FIRE" - "VIEW" - "GEOM" - "IFIRE" - ("I" stands for Indirect, almost the same as FIRE) - "NONE" - Default LODs are "VIEW" and "FIRE" + Synchronizes the waypoint with other waypoints. Each waypoint is given as an array [group, index]. - https://community.bistudio.com/wiki/lineIntersectsSurfaces + https://community.bistudio.com/wiki/synchronizeWaypoint - lineIntersectsSurfaces Array + Array synchronizeWaypoint Array - lineIntersectsSurfaces [begPosASL, endPosASL, ignoreObj1, ignoreObj2, sortMode, maxResults, LOD1, LOD2, returnUnique] + waypoint synchronizeWaypoint [waypoint1, waypoint2,] - $Code$_intersections = lineIntersectsSurfaces [ eyePos player, aimPos chopper, player, chopper, true, -1];$/Code$ - - $Code$arrow = "Sign_Arrow_F" createVehicle [0,0,0]; - onEachFrame { - _ins = lineIntersectsSurfaces [ - AGLToASL positionCameraToWorld [0,0,0], - AGLToASL positionCameraToWorld [0,0,1000], - player - ]; - if ( count _ins == 0) exitWith {arrow setPosASL [0,0,0]}; - arrow setPosASL (_ins select 0 select 0); - arrow setVectorUp (_ins select 0 select 1); - hintSilent str _ins; - };$/Code$ - - $Code$// This should detect glass windows and wire fences (since Arma v1.51.131920): - wirefence = "Land_New_WiredFence_5m_F" createVehicle position player ; - arrow = "Sign_Arrow_F" createVehicle [0,0,0]; - onEachFrame { - _ins = lineIntersectsSurfaces [ - AGLToASL positionCameraToWorld [0,0,0], - AGLToASL positionCameraToWorld [0,0,1000], - player, - objNull, - true, - 1, - "GEOM", - "NONE" - ]; - if ( count _ins == 0) exitWith {arrow setPosASL [0,0,0]}; - arrow setPosASL (_ins select 0 select 0); - arrow setVectorUp (_ins select 0 select 1); - hintSilent str _ins; - };$/Code$ + $Code$[_group1, 2] synchronizeWaypoint [ [_group2, 3] ];$/Code$ - global / undefined + undefined / undefined - (August 27, 2015) - Fast check if object is in a house: $Code$KK_fnc_inHouse = { - lineIntersectsSurfaces [ - getPosWorld _this, - getPosWorld _this vectorAdd [0, 0, 50], - _this, objNull, true, 1, "GEOM", "NONE" - ] select 0 params ["","","","_house"]; - if (_house isKindOf "House") exitWith { true }; - false - }; - onEachFrame { hintSilent str ( player call KK_fnc_inHouse)};$/Code$ - - (January 30, 2016) - This command is useful to place weaponholder (and then spawned weapons) on floor of houses, correcting the spawn position (can_collide) to intersect with floor: - $Code$ - MGI_fnc_setPosAGLS = { - params ["_obj", "_pos"]; - _wh_pos = getPosASL _obj; - _pos set [2, ( ATLtoASL _pos select 2)-10]; - _ins = lineIntersectsSurfaces [_wh_pos, _pos,_obj, objNull, true,1,"VIEW","FIRE"]; - _surface_distance = if ( count _ins 0) then [{(_ins select 0 select 0) distance _wh_pos},{0}]; - _wh_pos set [2, ( getPosASL _obj select 2) - (_surface_distance)]; - _weaponholder setPosASL _wh_pos; - }; - $/Code$ - After the position (_pos) obtained in BIS_fnc_buidingPositions array: - $Code$ - _weaponholder = createVehicle ["groundWeaponHolder", _pos, [], 0, "CAN_COLLIDE"]; - [_weaponholder,_pos] call MGI_fnc_setPosAGLS; - Then fill your weapon holder. - $/Code$ + (March 31, 2008) + To 'unsynchronize' a waypoint use: Waypoint synchronizeWaypoint [] - Array + Nothing + - lineIntersectsWith + setPosWorld - Returns objects intersecting with the virtual line from begPos to endPos. By default resulting array of intersecting objects is unsorted. To sort by distance set sortByDistance param to true. NOTE: Doesn't work under water. Max hardcoded distance is 1000m. + Sets position of an object based on PositionWorld, which is PositionASL of the model centre [0,0,0]. - https://community.bistudio.com/wiki/lineIntersectsWith + https://community.bistudio.com/wiki/setPosWorld - lineIntersectsWith Array + Object setPosWorld PositionWorld - lineIntersectsWith [begPos, endPos, objIgnore1, objIgnore2, sortByDistance] + object setPosWorld position - $Code$_objects = lineIntersectsWith [ eyePos player, ATLtoASL screenToWorld [0.5,0.5]];$/Code$ - - $Code$// Sort by distance: - _objects = lineIntersectsWith [ eyePos player, ATLtoASL screenToWorld [0.5,0.5], objNull, objNull, true ];$/Code$ - - $Code$// Ignore objects: - _objects = lineIntersectsWith [ eyePos player, aimPos chopper, player, chopper];$/Code$ + $Code$_obj setPosWorld getPosWorld _obj;$/Code$ - global / undefined + global / global - (may 31, 2012) - Please note the difference : - terrainIntersect - terrainIntersectASL - lineIntersect s - lineIntersect s With - lineIntersect s Objs - intersect - Array + Nothing + - linearConversion + waitUntil - Converts given value from given "from" range to wanted "to" range. If clipping is set to true, the resulting value is guaranteed to be within "to" range no matter what. Say given range is 0 to 1 and wanted range is 0 to 100 (percent calculation). Given value 0.55 then will be linearConversion [0,1,0.55,0,100]; //55 but if given value is 1.1 linearConversion [0,1,1.1,0,100, false ]; //110 or if clipping is true linearConversion [0,1,1.1,0,100, true ]; //100 + Suspends execution of function or SQF based script until given condition is satisfied. This command will loop and call the code inside {} mostly every frame (depends on complexity of condition and overall engine load) until the code returns true. The execution of the rest of the script therefore will be suspended until waitUntil completes. + If the very first execution of the code returns true the command will exit immediately, therefore it will not produce any "Suspending not allowed in this context" error when used inside non-scheduled script. For all other uses it must be executed in environment that allows suspension ( canSuspend ), such as spawned or execVMed code. - https://community.bistudio.com/wiki/linearConversion + https://community.bistudio.com/wiki/waitUntil - linearConversion Array + waitUntil Code - linearConversion [minFrom, maxFrom, value, minTo, maxTo, clip] + waitUntil condition - $Code$linearConversion [4, 8, 5, 0, 1, false ];$/Code$ + $Code$waitUntil { not alive player };$/Code$ - $Code$// Calculate days from 1/1/1970: - fnc_daysFromEpoc = - { - private _year = param [0]; - private _days = 0; - for "_i" from 1970 to _year - 1 do - { - _days = _days + round linearConversion [0, 1, dateToNumber [_i, 12, 31, 23, 59], 0, 365, false ]; + $Code$_i = 0; waitUntil { _i = _i + 1; _i = 100 };$/Code$ + + $Code$waitUntil { sleep 0.1; not alive player };$/Code$ + + $Code$// An on-the-fly custom event handler : + _myEH = ["ZoomIn"] spawn { + while { true } do { + waitUntil { + inputAction ( _this select 0) == 1; }; - _days + linearConversion [0, 1, dateToNumber _this, 0, 365, false ]; + diag_log format ["%1 @ %2", _this select 0, diag_tickTime ]; }; - hint str ( date call fnc_daysFromEpoc);$/Code$ + }; + // Although perhaps better to use onEachFrame, depending on the application.$/Code$ undefined / undefined - (Mar 29, 2014) - (A3 0.50) It is recommended to use linearConversion instead of BIS_fnc_linearConversion : - $Code$ linearConversion [0,100,50,0,50, true ]; //same as [[0,100],50,[0,50]] call BIS_fnc_linearConversion $/Code$ - As for clamp, true will disable new value out of its range while false won't: - $Code$ linearConversion [0,100,150,0,50, true ]; //return 50 - linearConversion [0,100,150,0,50, false ]; //return 75 + (September 20, 2013) + In case you have more complex code inside waitUntil loop, to be on the safe side always return boolean at the end of the scope: + $Code$ player addEventHandler ["Fired", { + _null = (_this select 6) spawn { + _p = [0,0,0]; + waitUntil { + if ( isNull _this) exitWith { true }; + _p = getPos _this; + false // -- boolean at the end of the scope + }; + hint str _p; + }; + }];$/Code$ + + (December 20, 2006) + waitUntil suspends both SQF functions and SQF scripts. In functions, the calling script is still in suspension due to waiting for a return from the call command. The game engine will continue, however. See Function for more detail. + + (April 2, 2010) + If WaitUntil uses an undefined call code, WaitUntil won't release, even when this code is separated from other conditions through or. Be warned that this won't cause an error message. + + (Jan 07, 2011) + By default the cycle time for the condition check is per frame. Look at the example 3, how to set it at a lower rate yourself. + Often times one does not need per frame checking. Saves a lot CPU checks; especially when the condition is complex to compute. + + (December 13, 2014) + If you want to use waitUntil together with exitWith, remember that the loop only exits if the code block returns true. + It should look like this: + $Code$ + waitUntil { + // exit loop if the unit gets deleted + if (isNull _unit) exitWith {true}; // has to return true to continue + !alive _unit; + }; $/Code$ - Number + Nothing + - linkItem + campaignConfigFile - Create and assign item to the correct slot. If there is an item in the targeted slot, it gets replaced. + Return root of campaign description.ext entries hierarchy. - https://community.bistudio.com/wiki/linkItem + https://community.bistudio.com/wiki/campaignConfigFile - Object linkItem String + campaignConfigFile - unit linkItem item + campaignConfigFile - $Code$bluforUnit linkItem "NVGoggles"; - opforUnit linkItem "NVGoggles_OPFOR"; - independentUnit linkItem "NVGoggles_INDEP";$/Code$ - + - global / global + undefined / undefined - Nothing + Config + - listObjects + waypointName - Return the list of all objects of given type. - i - Some Old Editor Command + Gets the waypoint name. - https://community.bistudio.com/wiki/listObjects + https://community.bistudio.com/wiki/waypointName - Control listObjects String + waypointName Waypoint - map listObjects type + waypointName waypoint - + $Code$_wpName = waypointName [_grp,2];$/Code$ + undefined / undefined - Array + String + - listRemoteTargets + enableSimulationGlobal - Return list of datalink targets and time for which they will be/were known + MP command. Enable or disable simulation for given entity, globally. Call this only from the server. Has the same effect as enableSimulation when used in SP. - https://community.bistudio.com/wiki/listRemoteTargets + https://community.bistudio.com/wiki/enableSimulationGlobal - listRemoteTargets Side + Object enableSimulationGlobal Boolean - listRemoteTargets side + entity enableSimulationGlobal enable - $Code$listRemoteTargets east;$/Code$ + $Code$_myObject enableSimulationGlobal false;$/Code$ - undefined / undefined + global / global + This scripting command must be executed on the server to work properly in multiplayer + + (October 21, 2014) + Units that have been previously subjected to enableSimulation false; or enableSimulationGlobal false; may stay unrecognised for a long time even after simulation was re-enabled, returning objNull as cursorTarget. Force revealing units with reveal command usually solves the problem. For example: $Code${ player reveal _x} forEach allUnits ;$/Code$ - Array + Nothing + - listVehicleSensors + objectCurators - Returns an array of the sensors in the given vehicle's config (configfile CfgVehicles vehicle Components SensorsManagerComponent Components). + Returns array with all curators which can edit given object. - https://community.bistudio.com/wiki/listVehicleSensors + https://community.bistudio.com/wiki/objectCurators - listVehicleSensors Object + objectCurators Object - listVehicleSensors vehicle + objectCurators obj - $Code$_sensors listVehicleSensors ( vehicle player ); - hint str _sensors;$/Code$ - + undefined / undefined - Array + Array + - list + stop - List of units that would activate given Trigger. - It returns nothing before the simulation started, i.e. in (undelayed) init.sqf files. Returns a pointer to the trigger's list after the simulation started. Since this is just a reference this means that the value in your local variable will change as the content of the trigger area changes. To permanently copy the returned list to a different variable, use _mylist = +(list triggerOne). - The second example can be used inside the trigger (in that case, no need to name your trigger). - The list returned for trigger of type "Not present" is the same as that returned for type "present". - NOTE: While the command can query any trigger, local or remote, the result will be only for the trigger condition set on the local client. See createTrigger for more info. + Stop AI unit. Stopped unit will not be able to move, fire, or change its orientation to follow a watched object. It may still change the stance if deemed appropriate (e.g. under fire). Use disableAI to disable specific AI capabilities. - https://community.bistudio.com/wiki/list + https://community.bistudio.com/wiki/stop - list Object + Object stop Boolean - list trigger + unitName stop toggle - $Code$_tlist = list _triggerOne;$/Code$ - - $Code$hint format ["%1", thislist ];$/Code$ + $Code$loon1 stop true$/Code$ - global / local + local / global - (March 6, 2013) - Calling list immediately after creating a trigger via createTrigger (and setting up activation, area, statements, timeout, etc..), will return null instead of an array. It seems the trigger needs about 1 second to initialise, after which it will behave as expected: returning an array of all the objects inside the trigger (the ones matching the criteria), or an empty array. + (January 6, 2011) + This command appears to be local only. - Array/Nothing + Nothing + - lnbAddArray + diag_activeMissionFSMs - Adds list of rows of strings. + Returns array with active Mission FSMs. - https://community.bistudio.com/wiki/lnbAddArray + https://community.bistudio.com/wiki/diag_activeMissionFSMs - lnbAddArray Array + diag_activeMissionFSMs - lnbAddArray [idc, [[[text,text],[value,],[data,]],[[text,text],[value,],[data,]],]] + diag_activeMissionFSMs - $Code$lnbAddArray [102,[[["#1"],[1],["#1"]]]];$/Code$ + $Code${ systemChat str _x} forEach diag_activeMissionFSMs ;$/Code$ - local / local + undefined / undefined - Number + Array + - lnbAddColumn + commandGetOut - Adds an column at given position. It returns the index of the newly added column. + Orders the unit to get out from the vehicle (via the radio). - https://community.bistudio.com/wiki/lnbAddColumn + https://community.bistudio.com/wiki/commandGetOut - Control lnbAddColumn Number - - lnbAddColumn Array + commandGetOut Object/Array - _ctrl lnbAddColumn position - - lnbAddColumn [idc or Control,position] + commandGetOut unitName - $Code$_ctrl lnbAddColumn 0.8;$/Code$ - - $Code$lnbAddColumn [105,0.8];$/Code$ + $Code$commandGetOut _unitOne$/Code$ - local / local + local / global - (A3 1.28) Horizontal coordinates of columns were added relative to list width, in range from 0 to 1. - Number/Void - Number/Void + Nothing + - lnbAddRow + addMissionEventHandler - Adds a row of strings. + Adds event handler (EH) attached to the current mission and returns EH handle. If EH has some data to return upon event, it is passed in _this variable. Since Arma 3 v.1.63.137807 the EH handle is also stored in _thisEventHandler variable and is available during EH code execution. For the list of available mission event handlers see: Arma_3:_Event_Handlers/addMissionEventHandler - https://community.bistudio.com/wiki/lnbAddRow + https://community.bistudio.com/wiki/addMissionEventHandler - lnbAddRow Array - - Control lnbAddRow Array + addMissionEventHandler Array - lnbAddRow [IDC,[ String, String ]] - - _ctrl lnbAddRow [ String, String ] + addMissionEventHandler [type, command] - $Code$lnbAddRow [1,["COL1","COL2"]];$/Code$ - - $Code$_ctrl lnbAddRow ["COL1","COL2"];$/Code$ + $Code$// A script could be executed to stop custom scripts graciously, or save progress & stats, for example: + _id = addMissionEventHandler ["Ended",{ _this execVM "missionEnded.sqf" }];$/Code$ - local / local + undefined / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Number - Number + Number + - lnbClear + waypointShow - Clears all items in the given listbox or combobox. + Gets the waypoint show/hide status. + Possible values are: + "NEVER" - never show it + "EASY" - show only in cadet mode + "ALWAYS" - always show it + "ERROR" - when set to any different string - https://community.bistudio.com/wiki/lnbClear + https://community.bistudio.com/wiki/waypointShow - lnbClear Number - - lnbClear Control + waypointShow Array - lnbClear idc - - lnbClear ctrl + waypointShow waypoint - $Code$lnbClear _ctrl;$/Code$ + $Code$_wpShow = waypointShow [groupOne,1];$/Code$ undefined / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Nothing - Nothing + String + - lnbColor + setPosASLW - Returns the text color of the item with the given position of the 2D listbox. The color is returned in format Color. + Sets the object position above sea surface. The pos array uses the PositionASLW format. - https://community.bistudio.com/wiki/lnbColor + https://community.bistudio.com/wiki/setPosASLW - lnbColor Array - - Control lnbColor Array + Object setPosASLW Array - lnbColor [idc, [row, column]] - - control lnbColor [row, column] + obj setPosASLW pos - $Code$_ctrl lnbColor [0,0];$/Code$ + $Code$_diver setPosASLW [( position _diver) select 0, ( position _diver) select 1, -10];$/Code$ - undefined / undefined + global / global - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Array - Array + Nothing + - lnbCurSelRow + vehicleRadio - Returns the index of the selected row id 2D listbox. + Sends the audio message to the vehicle radio channel. The message is defined in CfgRadio in the description.ext file or config radio protocol. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). + Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. - https://community.bistudio.com/wiki/lnbCurSelRow + https://community.bistudio.com/wiki/vehicleRadio - lnbCurSelRow Number - - lnbCurSelRow Control + Object vehicleRadio String - lnbCurSelRow idc - - lnbCurSelRow ctrl + unit vehicleRadio radioName - $Code$lnbCurSelRow _ctrl;$/Code$ + $Code$_soldierOne vehicleRadio "messageOne";$/Code$ + + $Code$player vehicleRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ - undefined / undefined + global / local - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. + (December 3, 2016) + To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: + $Code$ player vehicleRadio "#MySound.ogg";$/Code$ - Number - Number + Nothing + - lnbData + groupSelectUnit - Returns the additional text (invisible) in an item with the given position of the 2D listbox. + Selects a unit from player's group. If player is the leader, the effect of this command is similar to player pressing F1, F2, F3... buttons to highlight units in his squad, after which the unit command menu is shown. If leader is AI, player will get usual communication menu to interact with the leader. - https://community.bistudio.com/wiki/lnbData + https://community.bistudio.com/wiki/groupSelectUnit - lnbData Array - - Control lnbData Array + Object groupSelectUnit Array - lnbData [idc, [row, column]] - - ctrl lnbData [row, column] + player groupSelectUnit [unit, select] - $Code$_ctrl lnbData [ lnbCurSelRow _ctrl,0]; //"#1"$/Code$ + $Code$// After leaving menu, deselect all units (command menu is not opened - no selection) + { + player groupSelectUnit [_x, false ]; + } forEach ( groupSelectedUnits player );$/Code$ + + $Code$// Select all units when player is the leader: + { + player groupSelectUnit [_x, true ]; + } forEach units player ;$/Code$ + + $Code$// Open communication with group leader: + player groupSelectUnit [ leader player, true ];$/Code$ - local / local + undefined / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - String - String + Nothing + - lnbDeleteColumn + gearIDCAmmoCount - Removes column with given index from ListNBox control. + Returns ammo count of assigned magazine. - https://community.bistudio.com/wiki/lnbDeleteColumn + https://community.bistudio.com/wiki/gearIDCAmmoCount - lnbDeleteColumn Array - - Control lnbDeleteColumn Number + gearIDCAmmoCount Number - lnbDeleteColumn [idc,index] - - ctrl lnbDeleteColumn index + gearIDCAmmoCount idc - $Code$_ctrl lnbDeleteColumn 1;$/Code$ + $Code$ammo = gearIDCAmmoCount _control;$/Code$ - local / local + undefined / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Nothing - Nothing + Number + - lnbDeleteRow + setMarkerType - Removes row with the given index from the given listbox or combobox. + Set marker type. See cfgMarkers for a list of standard markers. - https://community.bistudio.com/wiki/lnbDeleteRow + https://community.bistudio.com/wiki/setMarkerType - Control lnbDeleteRow Number + String setMarkerType String - _ctrl lnbDeleteRow row + markerName setMarkerType type - $Code$_ctrl lnbDeleteRow 1;$/Code$ + $Code$"MarkerOne" setMarkerType "Warning";$/Code$ - undefined / undefined + undefined / global - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Nothing + Nothing + - lnbGetColumnsPosition + addBackpackCargoGlobal - Returns relative screen X of ListNBox control columns position [0.1,0.3,0.6...]. Use lnbSetColumnsPos to set positions. + Add backpack(s) to the cargo space of vehicle. MP synchronized. Classname list of available backpacks is here - https://community.bistudio.com/wiki/lnbGetColumnsPosition + https://community.bistudio.com/wiki/addBackpackCargoGlobal - lnbGetColumnsPosition Control + Object addBackpackCargoGlobal Array - lnbGetColumnsPosition _ctrl + vehicle addBackpackCargoGlobal [packClassName, count] - $Code$lnbGetColumnsPosition _ctrl;$/Code$ + $Code$this addBackpackCargoGlobal ["TK_RPG_Backpack_EP1",2];$/Code$ + + $Code$_apc addBackpackCargoGlobal ["US_Patrol_Pack_EP1",4];$/Code$ - local / local + global / global - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Array + Nothing + - lnbPicture + handgunItems - Returns the picture name or path of the item with the given position of the 2D listbox. + Returns array with all items assigned to the handgun. This command is used for infantry weapons only. - https://community.bistudio.com/wiki/lnbPicture + https://community.bistudio.com/wiki/handgunItems - lnbPicture Array - - Control lnbPicture Array + handgunItems Object - lnbPicture [IDC, [row, column]] - - control lnbPicture [row, column] + handgunItems unit - $Code$lnbPicture [200, [1, 1]];$/Code$ - - $Code$_control lnbPicture [1, 1]; //"a3\ui_f\data\gui\cfg\ranks\corporal_gs.paa"$/Code$ + $Code$handgunItems player ; + /* + [ + "muzzle_snds_L",//silencer + "",//laser + "",//optics + ""//bipod + ] + */$/Code$ - local / local + global / undefined - String - String + Array + - lnbSetColor + ctrlShown - Sets the color of the item with the given position of the 2D listbox. Color is in format Color. + Returns whether given control is shown. - https://community.bistudio.com/wiki/lnbSetColor + https://community.bistudio.com/wiki/ctrlShown - lnbSetColor Array - - Control lnbSetColor Array + ctrlShown Control - lnbSetColor [idc,[row,column],color] - - _ctrl lnbSetColor [ [row,column],color] + ctrlShown controlName - $Code$_ctrl lnbSetColor [ [0,0], [1,0,0,1] ];$/Code$ + $Code$_bool = ctrlShown _ctrl;$/Code$ - local / local + undefined / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Nothing - Nothing + Boolean + - lnbSetColumnsPos + sleep - Sets relative screen X for ListNBox control columns positions. Setter for lnbGetColumnsPosition + Suspends code execution for given time in seconds. The sleep precision is given by a framerate, the delay given is the minimal delay expected. Must be called inside of a context which is interruptible, i.e. a script executed by execVM or spawn. - https://community.bistudio.com/wiki/lnbSetColumnsPos + https://community.bistudio.com/wiki/sleep - lnbSetColumnsPos Array - - Control lnbSetColumnsPos Array + sleep Number - lnbSetColumnsPos [idc, positions] - - ctrl lnbSetColumnsPos positions + sleep delay - $Code$lnbSetColumnsPos [101, [0.1,0.5,0.7]];$/Code$ - - $Code$_ctrl lnbSetColumnsPos [0.1,0.5,0.7];$/Code$ + $Code$[] spawn { sleep 5; hint "after 5 sec..."};$/Code$ undefined / undefined - (Sep 9 2014) - See: List Box#LISTNBOX + this command will suspend the script indefinitely if game simulation is paused in SP. To avoid this, use uiSleep. + + (December 20, 2006) + Sleep suspends both SQF functions and SQF scripts. In functions, the calling script is still in suspension due to waiting for a return from the call command. The game engine will continue, however. See Function for more detail. + + (February 12, 2007) + Sleep durations between.0005 and.02 will cause the same delay (roughly.02 seconds). Delays of.0005 and less have no effect (ie, the sleep call will return immediately). + + The comment above is a little misleading. The game engine appears to work by processing frames and then checking to see whether scripts are available to execute. Sleep causes the script/function to be suspended until at least the specified time has elapsed. To wait for the next frame, or give other scripts a chance to run, use Sleep 0.001. + + (July 16, 2007) + For scripts called by the Init Event Handler the first sleep command will suspend the script at the briefing screen at the start of a mission. The script will continue after the briefing screen, when actually "in game". + + (July 12, 2014) + Sleep will treat negative values as if they were 0. (Tested in Arma 3 v1.22) + + (October 18, 2014) + For server scripts, if you are creating "while true" timers, it is best to use uiSleep instead, as the sleep from that command is not slowed down by simulation / server lag, so the timers will execute at intervals that are much closer to real time, even under heavy lag. - Nothing - Nothing + Nothing + - lnbSetCurSelRow + ctrlSetFontHeight - Selects the row with the given index of the 2D listbox. + Sets the font size of given control. - https://community.bistudio.com/wiki/lnbSetCurSelRow + https://community.bistudio.com/wiki/ctrlSetFontHeight - lnbSetCurSelRow Array - - Control lnbSetCurSelRow Number + Control ctrlSetFontHeight Number - lnbSetCurSelRow [idc, index] - - ctrl lnbSetCurSelRow index + controlName ctrlSetFontHeight height - $Code$disableSerialization ; - _ctrl = ( findDisplay 300) displayCtrl 304; - _ctrl lnbSetCurSelRow 1;$/Code$ + $Code$_control ctrlSetFontHeight 0.05$/Code$ undefined / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Nothing - Nothing + Nothing + - lnbSetData + lbSetSelectColor - Sets the additional text (invisible) in the item with the given position of the 2D listbox. + Sets the select color of the item with the given index of the listbox or combobox with id idc of the topmost user dialog to color. + Colour is in format Color. - https://community.bistudio.com/wiki/lnbSetData + https://community.bistudio.com/wiki/lbSetSelectColor - lnbSetData Array + lbSetSelectColor Array - Control lnbSetData Array + Control lbSetSelectColor Array - lnbSetData [idc, [row, column], data] + lbSetSelectColor [idc, index, color] - ctrl lnbSetData [[row, column], data] + control lbSetSelectColor [index, color] - $Code$_ctrl lnbSetData [ [0,0],"#1"];$/Code$ + $Code$lbSetSelectColor [101, 0, [0, 1, 0, 0.5]];$/Code$ + + $Code$_control lbSetSelectColor [0, [0, 1, 0, 0.5]];$/Code$ - local / local + undefined / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. + More information on the LB command family can be found here - Nothing - Nothing + Nothing - Nothing + - lnbSetPicture + deleteRange - Sets the picture in the item with the given position of the 2D listbox. - Name is the picture name. - The picture is searched in the mission, directory, the dtaExt subdirectory of the campaign directory, and the dtaExt directory and the data bank (or directory). + Removes a range of array elements from the given array (modifies the original array, just like resize or set ). - https://community.bistudio.com/wiki/lnbSetPicture + https://community.bistudio.com/wiki/deleteRange - lnbSetPicture Array - - Control lnbSetPicture Array + Array deleteRange Array - lnbSetPicture [IDC, [Row, Column], PicturePathOrPictureName] - - _ctrl lnbSetPicture [ [Row, Column], PicturePathOrPictureName] + array deleteRange [from, count] - $Code$lnbSetPicture [1, [0, 0], "Picture"];$/Code$ - - $Code$_ctrl lnbSetPicture [ [0, 0], "\A3\Ui_f\data\GUI\Cfg\Ranks\lieutenant_gs.paa"];$/Code$ + $Code$_arr = [1,2,3,4,5,6]; + _arr deleteRange [1,4]; + hint str _arr; //[1,6]$/Code$ - local / local + undefined / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Nothing - Nothing + Nothing + - lnbSetText + addForce - Sets the additional text (invisible) in the item with the given position of the 2D listbox. + Applies force to given object at given position. Force is defined as vector [x, y, z] in world space, position is vector [x, y, z] in model space. If you need to define force in model space, use vectorModelToWorld or vectorModelToWorldVisual commands first. The force applied as impulse. For more information see NVIDIA docs - https://community.bistudio.com/wiki/lnbSetText + https://community.bistudio.com/wiki/addForce - lnbSetText Array - - Control lnbSetText Array + Object addForce Array - lnbSetText [idc,[row,column],data] - - _ctrl lnbSetText [ [row,column],data] + object addForce [force, position] - $Code$lnbSetText [101, [0,1], "#1"];$/Code$ + $Code$// Apply force [0,1000,0] defined in world space (not factoring object actual positioning) to object position [1,0,0]: + _object addForce [[0,1000,0],[1,0,0]];$/Code$ - $Code$_ctrl lnbSetText [ [0,1], "#1"];$/Code$ + $Code$// Apply force [0,1000,0] defined in model space (relative to object) to object position [1,0,0]: + _object addForce [_object vectorModelToWorld [0,1000,0],[1,0,0]];$/Code$ - local / local + global / global - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Nothing - Nothing + Nothing + - lnbSetValue + diag_drawMode - Sets the additional integer value in the item with the position index of the 2D listbox. + Activates specific debug visualization. + Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. - https://community.bistudio.com/wiki/lnbSetValue + https://community.bistudio.com/wiki/diag_drawMode - lnbSetValue Array - - Control lnbSetValue Array + diag_drawMode String - lnbSetValue [idc, [row, column], value] - - control lnbSetValue [[row, column], value] + diag_drawMode type - $Code$_ctrl lnbSetValue [[0,0],1];$/Code$ + $Code$diag_drawMode "normal"$/Code$ undefined / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. + (September 6, 2016) + Currently A3 dev branch, diag.exe, version 1.65.138249 has no drawModes available: + $Code$diag_list "drawMode" - []$/Code$ - Nothing - Nothing + Nothing + - lnbSize + addOwnedMine - Returns size of 2D listbox or combobox as [rows, columns]. + Sets ownership over a remotely detonatable mine to the unit. - https://community.bistudio.com/wiki/lnbSize + https://community.bistudio.com/wiki/addOwnedMine - lnbSize Control + Object addOwnedMine Object - lnbSize control + Unit addOwnedMine mine - $Code$lnbSize _ctrl;//[8,2]$/Code$ + $Code$player addOwnedMine SuperMine;$/Code$ - local / local + undefined / undefined - Array + Nothing + - lnbSortByValue + titleRsc - Sorts given multicolumn listbox by lnbValue in given column in ascending or descending order. + Display a resource defined in RscTitles. Also see cutRsc, with these two commands you can show two different resources at once. - https://community.bistudio.com/wiki/lnbSortByValue + https://community.bistudio.com/wiki/titleRsc - lnbSortByValue Array - - control lnbSortByValue Array + titleRsc Array - lnbSortByValue [idc, column, reversed] - - control lnbSortByValue [column, reversed] + titleRsc [text, type, speed, showInMap] - $Code$lnbSortByValue [1800, 1, false ];$/Code$ - - $Code$_ctl lnbSortByValue [1, true ]$/Code$ + $Code$titleRsc ["BIS", "PLAIN"]$/Code$ undefined / undefined + (30 Jun, 2008) + Using titleRsc (unlike cutRsc ) for a HUD will mean: + the HUD will remain visible when you access the map and overlay it. + using the 'Direct communication' chat channel messages will interfere with the HUD by hiding it, since it appears to use the same 'resource layer'. + + (September 25, 2014) + In OFP/CWA any x Rsc will hide all the elements of the HUD, including the map. - Nothing - Nothing + Nothing + - lnbSort + allowSprint - Sorts given multicolumn listbox by lnbText in given column in ascending or descending order. + Force player to run/jog if set to false. - https://community.bistudio.com/wiki/lnbSort + https://community.bistudio.com/wiki/allowSprint - lnbSort Array - - control lnbSort Array + Object allowSprint Boolean - lnbSort [idc, column, reversed] - - control lnbSort [column, reversed] + unit allowSprint state - $Code$lnbSort [1800, 1, false ];$/Code$ - - $Code$_ctl lnbSort [1, true ]$/Code$ + $Code$player allowSprint false$/Code$ undefined / undefined @@ -39610,158 +40734,93 @@ - Nothing - Nothing + Nothing + - lnbText + set3DENSelected - Returns the shown text in the item with the given position of the given 2D listbox. + Changes selection in 3den to what is inside entities array. - https://community.bistudio.com/wiki/lnbText + https://community.bistudio.com/wiki/set3DENSelected - Control lnbText Array + set3DENSelected Array - control lnbText [row,column] + set3DENSelected entities - $Code$_ctrl lnbText [0,0];$/Code$ - + - local / local + undefined / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - String + Nothing + - lnbValue + buttonAction - Returns the additional integer value in the item with the given position of the 2D listbox. + Return the action assigned to a control of the currently active user dialog. Can be used for buttons and active texts. Read Dialog Control for more information about user dialogs and controls. - https://community.bistudio.com/wiki/lnbValue + https://community.bistudio.com/wiki/buttonAction - lnbValue Array + buttonAction Number - Control lnbValue Array + buttonAction Control - lnbValue [idc,[row, column]] + buttonAction idc - ctrl lnbValue [row, column] + buttonAction control - $Code$_ctrl lnbValue [0,0];//1, default is 0 if value is String set by lnbSetValue$/Code$ + $Code$buttonSetAction [100, {player exec "reply.sqs"}] + _action = buttonAction 100 + returns {player exec "reply.sqs"}$/Code$ - undefined / undefined + local / undefined - (Sep 9 2014) - (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: - $Code$ - //Set same value to one position of a Control - _ctrl lnbSetData [ [0,0],"#1"]; - lnbSetColumnsPos [102, [0,1], 1]; - _ctrl lnbSetText [ [0,1], "#1"]; - _ctrl lnbSetValue [ [0,0],1]; - //Accessing the value disregard affecting one another. - _ctrl lnbData [0,0]; //"#1" - lnbGetColumnsPosition _ctrl //[1]; - _ctrl lnbText [0,0];//"#1" - _ctrl lnbValue [0,0];//1 - $/Code$ - For a direct visible control over CT_LISTNBOX: - $Code$ - 0 = [_CT_LISTNBOX] spawn { - private ["_CT_LISTNBOX","_color","_current","_pic"]; - disableSerialization ; - _CT_LISTNBOX = _this select 0; - { - _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; - _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; - } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); - _CT_LISTNBOX lnbSetCurSelRow 0; - _current = lnbCurSelRow _CT_LISTNBOX; - _color = _CT_LISTNBOX lnbColor [_current,0]; - _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; - _CT_LISTNBOX lnbDeleteColumn 0; - _CT_LISTNBOX lnbDeleteRow 1; - sleep 1; - lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. - }; - $/Code$ - A combined use of both invisible and visible data processing commands alive the Control. - Number - Number + String - String + - ln + getContainerMaxLoad - Natural logarithm of x. + Returns max load value of given container. Currently works only with uniform, vest and backpack classes. - https://community.bistudio.com/wiki/ln + https://community.bistudio.com/wiki/getContainerMaxLoad - ln Number + getContainerMaxLoad String - ln x + getContainerMaxLoad containerClass - $Code$_nlog = ln 10 - // Result is 2.302$/Code$ + $Code$_maxLoadUniform = getContainerMaxLoad uniform player ; + _maxLoadVest = getContainerMaxLoad vest player ; + _maxLoadBackpack = getContainerMaxLoad backpack player ;$/Code$ undefined / undefined @@ -39769,208 +40828,288 @@ - Number + Number + - loadAbs + getWPPos - Returns current sum of mass from items stored in all unit's containers, linked items and weapons. + Returns the position of a selected waypoint of a given group. Waypoints include only those which were placed in the mission editor. - https://community.bistudio.com/wiki/loadAbs + https://community.bistudio.com/wiki/getWPPos - loadAbs Object + getWPPos Array - loadAbs unit + getWPPos [group, index] - $Code$// Player weight: - _weight = loadAbs player;$/Code$ + $Code$[_group1,1] setWPPos [200,600,0]; _pos = getWPPos [_group1,1]; + // returns [200,600,0]$/Code$ - undefined / undefined + global / undefined - Number + Array + - loadBackpack + publicVariable - Returns current sum of mass from items stored in a backpack. + Broadcasts missionNamespace variable and its value to all computers. The data is sent consequently and reliably to all clients. Using publicVariable too frequently in a given period of time can cause other parts of the game to experience bandwidth problems. + Variables broadcast with publicVariable during a mission stay persistent for JIP (Join In Progress) clients. Such persistent variables are synced to the JIP client before the first batch of client side Event Scripts are ran. + The following Types of data are supported: + Number + Since OFP version 1.34 : + Boolean + Object + Group + Since ArmA version 1.00: + String + Text + Since ArmA version 1.09 : + Array + Code + Since Arma 3 version 1.26 : + Nothing ( nil ) + Limitations : Cannot use reserved names, such as " player " or " west " or " side ", etc. It is also not possible to transfer references to entities which are local, like scripts, displays, or local objects. Team Member is also not supported. - https://community.bistudio.com/wiki/loadBackpack + https://community.bistudio.com/wiki/publicVariable - loadBackpack Object + publicVariable String - loadBackpack unit + publicVariable varName - $Code$myVariable = loadBackpack myUnit;$/Code$ + $Code$publicVariable "CTFscoreOne";$/Code$ + + $Code$myPubVar = [123, "456", true ]; + publicVariable "myPubVar";$/Code$ - undefined / undefined + local / global + (3 Aug, 2006 23:03) + This command broadcasts a variable to all clients, but as soon as you change the variable again, you have to use publicVariable again, as it does not automatically synchronise it. + + (12 April, 2008) + Be sure to place your variable name in quotation marks. This may sound awfully simple, but many times I have forgotten to do this, and it has resulted in no end of headaches for me. + + (2 Feb, 2008) + When initialising a public variable to handle JIP, you will usually first want to check if the public variable has already been (broadcast, received and) set locally. Otherwise you may inadvertantly overwrite the broadcast value with your default value. + To perform this check, use code similar to the following to first check that the variable is nil: + if ( isNil "PV_abc") then + { + // set the nil variable with a default value for server and both JIP & 'join at mission start' + PV_abc = [7, 8, 9]; + }; + // else public variable has already been set due to a public variable broadcast. + + (14 July, 2011) + To make Dr_Eyeball's note even more clear: + For JIP players pV'ed variables are received and set BEFORE the init.sqf. + So to avoid the received variables getting overwritten by variable initialization normally done in the init.sqf, you HAVE TO to use the 'if ( isNil "PV_abc")' pattern. + It says literally: "Only initialize value it has not yet been set. And in a JIP this may already been the cause due to publicVariable use". + + (21 September, 2013) + To make Dr_Eyeball's and kju's notes even more clear, public variable is persistent. Once it has been broadcast it will be delivered to all clients, present and future. Therefore it is wise to check if the variable already exists on a client due to it being persistent before initialising its value. + + (23 February, 2014) + Just to clarify, when players JIP, they get the value of the variable from the last call to publicVariable, not the current value of the variable. Eg. with + $Code$SomeVar = 5; publicVariable "SomeVar"; SomeVar = 10;$/Code$ + Connecting players will receive 5, not the current value of 10. + + (October 19, 2014) + I'm pretty far down the notes list so I hope this doesn't get buried. + For clarity, after a variable has been publicVariable'd, scripts in all clients can use it as if it had been defined locally. + Variables that have been publicVariable'd do not need to be pre-defined on receiving clients. In fact, this could cause issues with JIP players overwriting a publicVariable value, as mentioned above. (tested in A3 1.32.127785) + Local variables cannot be publicVariable'd. (tested in A3 1.32.127785) (tested by having dedicated server publicVariable a local variable, then trying to hint it on client. Error was "Undefined variable in expression") - Number + Nothing + - loadFile + ctrlActivate - Return content of given filename. + Launch actions attached to given (button based) control. - https://community.bistudio.com/wiki/loadFile + https://community.bistudio.com/wiki/ctrlActivate - loadFile String + ctrlActivate Control - loadFile filename + ctrlActivate controlName - $Code$_contents = loadFile "myFunction.sqf";$/Code$ + $Code$ctrlActivate _control$/Code$ - undefined / local + undefined / undefined - (28 November 2006) - In Armed Assault, the 'loadfile' command must be preceded by the 'compile' command to work. - Ex OFP 1.96: _falarmEvent = loadfile ("syswarn\falarmEvent.sqf") - Ex ArmA 1.0: _falarmEvent = compile loadfile ("syswarn\falarmEvent.sqf") - - (11 July 2007) - The note by Pennywise is not entirely accurate. loadFile only needs to be preceded with compile when loading code (for example, a function contained in an.sqf file ). Using loadFile without compile will return a string, which, in some cases, is exactly what you want. - - (02 December 2012) - Please note that any comment you have within the file you load will be included, to get around that use preprocessFile instead. - - (25 January 2016) - Notice that you will have to activate file patching via -filePatching [ [1] ]. Otherwise, execVM and loadFile will *not* load any files outside your mission folder (like the global scripts). For more info see CMA:DevelopmentSetup (since Arma 3 1.49+). - String + Nothing + - loadIdentity + lnbAddColumn - Loads person's identity from Objects.sav file in campaign directory (from entry name). + Adds an column at given position. It returns the index of the newly added column. - https://community.bistudio.com/wiki/loadIdentity + https://community.bistudio.com/wiki/lnbAddColumn - Object loadIdentity String + Control lnbAddColumn Number + + lnbAddColumn Array - person loadIdentity name + _ctrl lnbAddColumn position + + lnbAddColumn [idc or Control,position] - $Code$_ok = player loadIdentity "playerIdentity"$/Code$ + $Code$_ctrl lnbAddColumn 0.8;$/Code$ + + $Code$lnbAddColumn [105,0.8];$/Code$ - undefined / undefined + local / local + (A3 1.28) Horizontal coordinates of columns were added relative to list width, in range from 0 to 1. - Boolean + Number/Void - Number/Void + - loadUniform + abs - Returns current sum of mass from items stored in a uniform. + Absolute value of a real number - https://community.bistudio.com/wiki/loadUniform + https://community.bistudio.com/wiki/abs - loadUniform Object + abs Number - loadUniform unit + abs n - + $Code$_n = abs -3; + // Returns 3$/Code$ + - undefined / undefined + local / undefined - Number + Number + - loadVest + selectPlayer - Returns current sum of mass from items stored in a vest. + Moves player into given unit. In Arma 3 it is now not possible to selectPlayer into unit occupied by another player. Also avoid selecting player into editor placed units in multiplayer, as it may, on occasion, lead to some undefined behaviour. If you need to selectPlayer into another unit, consider creatingUnit dynamically. - https://community.bistudio.com/wiki/loadVest + https://community.bistudio.com/wiki/selectPlayer - loadVest Object + selectPlayer Object - loadVest unit + selectPlayer unitName - + $Code$selectPlayer bob;$/Code$ + - undefined / undefined + local / global + This command has significant effects on locality + Notes on locality issues with selectPlayer in multiplayer environments: + 1) If you switch to a unit that's not local, control over movement will not be given to you immediately. For example, if you switch to an AI unit whose leader is a player, you will not be able to control the movement of your new avatar, as its control remains with the leader unit. You will however be able to look around while the unit walks automatically. + 2) The identity of units are not transferred properly: If your old unit dies, this will count for your stats. Your old unit might remain identifiable as you (if you aim at the unit you see your own name). Your new unit will keep it's name, face and voice (face can be set dynamically, but name, voice and glasses have to be defined before mission start in the description.ext). When chatting, not the name of your original identity, but the identity of the transferred to person will show. + Those 2 Points were for ArmA I, I am currently analyzing the behaviour in ArmA II with version 1.08 + OA 1.57 + So with ArmA II, you still have to keep an eye on locality (otherwise the AI will controll the unit you are), but there are cool possibilities now: if you do a "selectPlayer unitVarName",the unit takes your identity (with name, voice, face and glasses) - and your identity is also visible on other clients! + But you have to remember that your old unit will stay with your Identity. Dies the old unit, the stats count it. An other thing you have to pay attention is the Death for your new unit - you have to register an EventHandler, otherwise you will stay in your dead unit, and also the MenuOption Respawn won't help you out! 3.Jan. 2011 + 3) If you do a selectPlayer call, join,joinSilent,joinAs,joinAsSilent wont work anymore correctly. Means: Your unit joins the other group AND your unit will be local to the other group. so at the moment you can use selectPlayer only as a single human player in a group. In the later day I will try what happens if both human players are units by selectPlayer, and both join the same group (till yet tried with one selectPlayer unit and one originUnit) + 14.May 2011 + Tried to create ingame a group with a selectPlayer Unit (on both clients), and joint the new squad. The result was, the group was local to the client who created the group, so after that, all other units that join that Group are - as you may think already, local to that single client. 18.May 2011 + + 3) After switching to a unit that's not local, the unit will remain local to you after switching back. For example, if we have units A and B, and a client starts as unit A and unit B is AI under server control. If you switch to unit B, it will take some time, but eventually you can control the movement of unit B (see (1) above). Now if you switch back to unit A, unit B will remain local to you, the player. Any server-side scripts which try to execute local arguments -- such as doMove -- will fail. + + A working implementation can be found at A&S ProMode dev-heaven repo, acc guest, pw guest or at pastebin. + Be careful to learn all the pitfalls and things you need to take into consideration to have this working in MP. + + (09 March 2014) + Arma 3 (v1.13): In MP the Identity and the name carries over to the new Unit but not in SP. Use setName to set the name in SP. + + (June 24, 2015) + Most of the notes above do not apply to Arma 3 anymore. - Number + Nothing + - load + getBackpackCargo - Returns current sum of mass from items stored in all unit's containers. Load is calculated by the following formula: - $Code$_loadPlayer = loadAbs player / getNumber ( configFile "CfgInventoryGlobalVariable" "maxSoldierLoad");$/Code$ + Returns all backpack types and count from the cargo space - https://community.bistudio.com/wiki/load + https://community.bistudio.com/wiki/getBackpackCargo - load Object + getBackpackCargo Object - load unit + getBackpackCargo object - $Code$load player ;$/Code$ + $Code$_content = getBackpackCargo carName;$/Code$ + + $Code$_content = getBackpackCargo ammoBoxName;$/Code$ undefined / undefined @@ -39978,27 +41117,28 @@ - Number + Array + - loadGame + magazineCargo - Load a game from the autosave. If failed, restart the mission. + Get array with magazines from ammo box (or any general weapon holder container). - https://community.bistudio.com/wiki/loadGame + https://community.bistudio.com/wiki/magazineCargo - loadGame + magazineCargo Object - loadGame + magazineCargo box - $Code$loadGame ;$/Code$ + $Code$hint str magazineCargo uniformContainer cursorTarget ;$/Code$ undefined / undefined @@ -40006,85 +41146,107 @@ - Nothing + Array + - loadMagazine + setTriggerStatements - Initiates the loading action on given weapon of the turret of a transport. So the new magazine is not available instantly, yet according to the reloadTime. - The turret has to be manned. One can also change the magazine if its respective weapon is not selected. + Defines trigger condition, activation and deactivation statements. Trigger condition has to return Boolean. true will activate the trigger, false will deactivate it (only if activation is set to repeat). thisList returns the same result as list command, which includes all entities in the trigger area that are capable of activating the trigger. Dead entities are excluded as well as crew in vehicles, vehicles themselves are included. - https://community.bistudio.com/wiki/loadMagazine + https://community.bistudio.com/wiki/setTriggerStatements - Object loadMagazine Array + Object setTriggerStatements Array - transport loadMagazine [turretPath, weaponName, magazineName] + trigger setTriggerStatements [condition, activation, deactivation] - $Code$vehicle player loadMagazine [[0],"m256","20Rnd_120mmHE_M1A2"];$/Code$ + $Code$_trg setTriggerStatements ["this", " hint 'trigger on'", " hint 'trigger off'"]$/Code$ - undefined / undefined + global / local + (Mar 14, 2011) + An array with three arguments is mandatory for this function. + + (September 16, 2014) + Magic variable thisList does not contain dead units. - Nothing + Nothing + - loadOverlay + synchronizeObjectsRemove - Creates the load overlay dialog for the specified type of overlay. - i - Some Old Editor Command + Remove given objects from the unit's list of synchronized objects. - https://community.bistudio.com/wiki/loadOverlay + https://community.bistudio.com/wiki/synchronizeObjectsRemove - Control loadOverlay Config + Object synchronizeObjectsRemove Array - map loadOverlay config + unit synchronizeObjectsRemove [objects] - undefined / undefined + global / global - Nothing + Nothing + - loadStatus + setCamUseTI - Loads object's properties from Objects.sav file in campaign directory (from entry name). + Activates thermal vision. Mode index defines what sort of thermal vision it is: + 0 - White Hot + 1 - Black Hot + 2 - Light Green Hot / Darker Green cold + 3 - Black Hot / Darker Green cold + 4 - Light Red Hot /Darker Red Cold + 5 - Black Hot / Darker Red Cold + 6 - White Hot. Darker Red Cold + 7 - Thermal (Shade of Red and Green, Bodies are white) + This command only works with camCreate created camera that is currently the main camera for the player (see example). - https://community.bistudio.com/wiki/loadStatus + https://community.bistudio.com/wiki/setCamUseTI - Object loadStatus String + Boolean setCamUseTI Number - obj loadStatus entryName + Bool setCamUseTI modeIndex - $Code$_ok = player loadStatus "playerState";$/Code$ + $Code$true setCamUseTI 1;$/Code$ + + $Code$// "Preditor" vision: + _cam = "camera" camCreate [0,0,0]; + _cam camSetTarget player ; + _cam camSetRelPos [0,1,1.5]; + _cam cameraEffect ["Internal","Back"]; + _cam camCommit 0; + true setCamUseTI 7;$/Code$ undefined / undefined @@ -40092,725 +41254,634 @@ - Boolean + Nothing + - localize + nearObjectsReady - Used to internationalise text messages. A string is returned from Stringtable.csv (or Stringtable.xml ) which corresponds to the stringName. + Check whether all data are loaded to nearObjects will return in reasonable time. - https://community.bistudio.com/wiki/localize + https://community.bistudio.com/wiki/nearObjectsReady - localize String + Object/Array nearObjectsReady Number - localize stringName + position nearObjectsReady radius - $Code$hint localize "STR_WEST"; // - "BLUFOR" (in Arma2)$/Code$ - - $Code$hint format ["Go %1", localize "STR_Q_NORTH"]; // - "Go North"$/Code$ - - $Code$hint format [ localize "STR_ACTION_DROP_WEAPON", localize "STR_SN_RIFLE"]; // - "Drop Rifle" - // STR_ACTION_DROP_WEAPON contains "Drop %1", STR_SN_RIFLE contains "Rifle"$/Code$ + $Code$_twnpos nearObjectsReady 500;//from ALICE$/Code$ - undefined / local + undefined / undefined - (September 12, 2014) - The command localize will strip all HTML tags from your stringtable.xml entries, however there is a way to trick it by substituting tags with HTML code instead: - ?xml version = "1.0" encoding = "utf-8" ? - Key ID = "STR_TEST_KK" - Original ![CDATA[ t color='#ff0000' This doesn't work /t ]] /Original - /Key - Key ID = "STR_TEST_KK2" - Original t color='#ff0000' This works /t /Original - /Key - $Code$ hint parseText localize "str_test_kk"; //no change of colour$/Code$ - $Code$ hint parseText localize "str_test_kk2"; //hint content is in red$/Code$ - String + Boolean + - local + completedFSM - Check if given unit is local on the computer in Multiplayer games (see Locality in Multiplayer for general concepts). - This can be used when some activation fields or scripts need to be performed only on one computer. In Single player all objects are local. - Note1: Map created objects (those placed in Visitor ) are local everywhere. - Note2: Since Arma 3 v1.53.132932 keyword local has been renamed to private for consistency and to avoid any confusion. However, this just makes the third example obsolete. It's core functionality still remains. + Check whether the given FSM completes. + The FSM handle is the number returned by the execFSM command. - https://community.bistudio.com/wiki/local + https://community.bistudio.com/wiki/completedFSM - local Object/Group + completedFSM Number - local object + completedFSM fsmHandle - $Code$// SQS: - ?! local _unitName : hint "remote"$/Code$ - - $Code$// SQF: - if (! local _unitName) then { - hint "remote"; - };$/Code$ - - $Code$_isLocalGroup = local group _unit;$/Code$ + $Code$_completed = completedFSM _fsmHandle;$/Code$ - global / undefined + undefined / undefined - (August 4, 2006) - Notes from before the conversion: - In multiplayer, a game logic will always be local to the host computer. This works on both dedicated and player-hosted servers. - Boolean + Boolean + - locationNull + getSuppression - A non-existing Location. To compare non-existent locations use isNull or isEqualTo : - locationNull == locationNull ; // false - isNull locationNull ; // true - locationNull isEqualTo locationNull ; // true + Gets the suppression value of given unit. Returns SCALAR between 0 and 1. Suppression is not calculated for player entities. - https://community.bistudio.com/wiki/locationNull + https://community.bistudio.com/wiki/getSuppression - locationNull + getSuppression Object - locationNull + getSuppression unit - $Code$! isNull locationNull ; // false$/Code$ - - $Code$str locationNull ; // No location$/Code$ - - $Code$position locationNull ; // [0,0,0]$/Code$ + $Code$getSuppression AI_unit_1;$/Code$ - undefined / undefined + local / undefined - Location + Number + - locationPosition + assignAsDriver - Returns the position of a location. If the location is attached to an object, that object's position is returned. + Assign a unit as driver of a vehicle. Used together with orderGetIn to order subordinate units to get in as driver of a specific vehicle. Before usage of this command a subordinate unit hasn't got the option to get into the driver place of the vehicle. - https://community.bistudio.com/wiki/locationPosition + https://community.bistudio.com/wiki/assignAsDriver - locationPosition Location + Object assignAsDriver Object - locationPosition location + unitName assignAsDriver vehicleName - $Code$_locationPos = locationPosition myLocation;$/Code$ - - $Code$_location = nearestLocation [ getPos player, "nameCity"]; - _locationPos = locationPosition _location;$/Code$ + $Code$_soldier1 assignAsDriver _tank + [_soldier1] orderGetIn true$/Code$ - undefined / undefined + global / global - (October 24, 2015) - locationPosition returns a position that is altitude zero ASL. - Array + Nothing + - lockCameraTo + camConstuctionSetParams - Lock/Unlock stabilized camera (in vanilla used currently only for UAVs) to target. + Sets construction camera parameters. To work with "camconstruct" object. - https://community.bistudio.com/wiki/lockCameraTo + https://community.bistudio.com/wiki/camConstuctionSetParams - Object lockCameraTo Array + Object camConstuctionSetParams Array - vehicle lockCameraTo [target, turretPath] + camera camConstuctionSetParams [[x,y,z], radius, maxAboveLand] - $Code$uav lockCameraTo [vehicle, [0,0]];$/Code$ + $Code$_camera camConstuctionSetParams [ getPos player, 50, 20];$/Code$ undefined / undefined - (April 10, 2015) - The command also accepts a position (ASL) instead of an object. The vehicle has to have a stabilized optic for this command to work. - Nothing + Nothing + - lockCargo + ctrlClassName - Lock all cargo positions of a vehicle or lock by index. This command must be executed where vehicle is local. + Returns the class name of a Control as it is defined in config. If you need config class of a game created Display, it is stored on display itself: + $Code$_className = findDisplay 12 getVariable ["BIS_fnc_initDisplay_configClass", ""]; // "RscDiary"$/Code$ - https://community.bistudio.com/wiki/lockCargo + https://community.bistudio.com/wiki/ctrlClassName - Object lockCargo Boolean - - Object lockCargo Array + ctrlClassName Control - vehicle lockCargo lock - - vehicle lockCargo [index, lock] + ctrlClassName control - $Code$vehicleName lockCargo true ;$/Code$ - - $Code$vehicleName lockCargo [0, true ];$/Code$ + $Code$// List class names of all controls present on display 46: + _ctrls = ""; + for "_i" from -1 to 10000 do { + with uiNamespace do { + _ctrl = findDisplay 46 displayCtrl _i; + if (! isNull _ctrl) then { + _ctrls = _ctrls + format ["IDC: %1, Class Name: %2\n", _i, ctrlClassName _ctrl]; + }; + }; + }; + hint _ctrls;$/Code$ - local / global + undefined / undefined - Nothing - Nothing + String + - lock + ropeEndPosition - Lock vehicle (disable mounting / dismounting) for player. Similar to setVehicleLock when number is used as param. + Return rope end positions in Position3D format - https://community.bistudio.com/wiki/lock + https://community.bistudio.com/wiki/ropeEndPosition - Object lock Boolean - - Object lock Number + ropeEndPosition Object - vehicleName lock locked - - vehicleName lock lockstate + ropeEndPosition rope - $Code$_jeepOne lock true ;$/Code$ - - $Code$heli lock true ; - locked heli; //2 - heli lock false ; - locked heli; //0 - heli lock 1; - locked heli; //1$/Code$ + $Code$_ends = ropeEndPosition ( ropes heli1 select 0); + _end1 = _ends select 0; + _end2 = _ends select 1;$/Code$ - local / global + undefined / undefined - (January 9, 2010) - Lock prevents AI persons mounting or dismounting vehicles when ordered to do so and players are prevented from doing both too, but AI will dismount when a vehicle is damaged. - - (September 22, 2010) - If an AI group (eg Mechanized Infantry) has its vehicule locked with its crew in it, it will mount or dismount it anyway. But a player in this group won't be able to enter the vehicle. - - (April 2, 2013) - From Arma 3 version 0.50 can be used Number as lock parameter : - 0 - Unlocked - 1 - Default - 2 - Locked - 3 - Locked for player - - (March 4, 2015) - 1 - is DEFAULT lock for vehicle placed in editor. Player that is not the leader in a group of AIs will not be able to enter this vehicle. - Nothing - Nothing + Array + - lockDriver + removeMissionEventHandler - Lock the driver position of the vehicle. This command must be executed where vehicle is local. + Removes mission event handler added by addMissionEventHandler. + When any handler is removed, all handler indices higher that the deleted one should be decremented. - https://community.bistudio.com/wiki/lockDriver + https://community.bistudio.com/wiki/removeMissionEventHandler - Object lockDriver Boolean + removeMissionEventHandler Array - vehicle lockDriver lock + removeMissionEventHandler [type, index] - $Code$vehicleName lockDriver true ;$/Code$ + $Code$for "_i" from 0 to 4 do { + missionNamespace setVariable [ format ["handler%1",_i], addMissionEventHandler ["Loaded","hint ""_i"";"]]; + }; + removeMissionEventHandler ["Loaded",handler2]; //Remove the third index under type "Loaded"$/Code$ - local / global + undefined / undefined + (August 6, 2015) + As of Arma 3 version 1.38 you can safely remove mission event handlers without worrying about decrementing higher indices. - Nothing + Nothing + - lockIdentity + getAssignedCuratorLogic - Locks the identity of a person. This will disable default identity. + Returns curator logic to which given player has access. - https://community.bistudio.com/wiki/lockIdentity + https://community.bistudio.com/wiki/getAssignedCuratorLogic - lockIdentity Object + getAssignedCuratorLogic Object - lockIdentity unit + getAssignedCuratorLogic player - $Code$_success = lockIdentity player;$/Code$ + $Code$( getAssignedCuratorLogic player ) removeCuratorEditableObjects [ allDead, true ];$/Code$ undefined / undefined + (August 17, 2014) + This command will return objNull if used immediately after the curator logic is assigned to the unit in question (this includes at mission time 0). To avoid problems use the following beforehand: $Code$ waitUntil {! isNull ( getAssignedCuratorLogic unit)};$/Code$ - Boolean + Object + - lockTurret + taskDescription - Lock the gunner position of the vehicle turret. This command must be executed where vehicle is local. + Returns the sub-parts of the task description. The returned Array is in format [Task description, Task title, Task waypoint description]. - https://community.bistudio.com/wiki/lockTurret + https://community.bistudio.com/wiki/taskDescription - Object lockTurret Array + taskDescription Task - vehicle lockTurret [turret path,lock] + taskDescription task - $Code$vehicleName lockTurret [[0,0], true ];$/Code$ - - $Code$vehicle player lockTurret [[0], true ];$/Code$ + $Code$_taskDescArray = taskDescription _task;$/Code$ - local / global + undefined / undefined + (November 14, 2014) + Be careful if you want to use this to retrieve the title of a task. + If the task has no description set, then "taskDescription" will only return an array of empty Strings. + Therefor always use setSimpleTaskDescription directly after creating a new task, even if you set the Description to "". - Nothing + Array + - lockWP + aimedAtTarget - Disable switching to next waypoint (current waypoint will never complete while lockwp is used). Sometimes used during cut-scenes. + Returns how good the weapon of the vehicle is aimed at the target. - https://community.bistudio.com/wiki/lockWP + https://community.bistudio.com/wiki/aimedAtTarget - Object/Group lockWP Boolean + Object aimedAtTarget Array - groupName lockWP lock + vehicle aimedAtTarget [target, weapon] - $Code$_groupOne lockWP true ;$/Code$ - - $Code$_Soldier lockWP true ;$/Code$ + $Code$_aimingQuality = heli aimedAtTarget [target];$/Code$ - $Code$_MyTank lockWP false ;$/Code$ + $Code$_aimingQuality = heli aimedAtTarget [target,"M197"];$/Code$ - local / local + undefined / undefined + (November 19, 2013) + The command doesn't work with soldier weapons, only vehicle weapons (in Arma 3 at least). The return value is either 1 or 0, very rarely the value falls in between. 1 doesn't mean you are going to hit the target, while 0 means you're definitely off. - Nothing + Number + - lockedCargo + ctrlAutoScrollDelay - Check whether cargo position of the vehicle is locked. + Returns number of seconds auto-scroll will wait before scroll and/or rewind. -2 if scrollbar not present. + Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. - https://community.bistudio.com/wiki/lockedCargo + https://community.bistudio.com/wiki/ctrlAutoScrollDelay - Object lockedCargo Number + ctrlAutoScrollDelay Control - vehicle lockedCargo cargoIndex + ctrlAutoScrollDelay control - $Code$_result = vehicleName lockedCargo 0;$/Code$ + $Code$_ctrlDelay = ctrlAutoScrollDelay _ctrlGroup;$/Code$ undefined / undefined - (May 4, 2016) - For some vehicles, the command returns nothing if the cargo index is invalid (i.e. -1) - Boolean + Number + - lockedDriver + removeMagazine - Check whether driver position of the vehicle turret is locked. + Remove magazine from the unit. + Note: You may create invalid combinations with this function. When doing so, application behaviour is undefined. - https://community.bistudio.com/wiki/lockedDriver + https://community.bistudio.com/wiki/removeMagazine - lockedDriver Object + Object removeMagazine String - lockedDriver vehicle + unitName removeMagazine magazineName - + $Code$player removeMagazine "M16"$/Code$ + - undefined / undefined + local / undefined - Boolean + Nothing + - lockedTurret + setGroupIdGlobal - Check whether gunner position of the vehicle turret is locked. + A global equivalent of setGroupId - https://community.bistudio.com/wiki/lockedTurret + https://community.bistudio.com/wiki/setGroupIdGlobal - Object lockedTurret Array + Object/Group setGroupIdGlobal Array - vehicle lockedTurret turretPath + group setGroupIdGlobal [nameFormat, nameParam1,, nameParamN] - $Code$_locked = tank lockedTurret [0];$/Code$ - + - undefined / undefined + global / global - Boolean + Nothing + - locked + moveInCargo - Check if vehicle is locked for Persons. If it is locked, Persons cannot mount / dismount without order. + Move soldier into vehicle cargo position (Immediate, no animation). - https://community.bistudio.com/wiki/locked + https://community.bistudio.com/wiki/moveInCargo - locked Object + Object moveInCargo Object + + Object moveInCargo Array - locked vehicle + unitName moveInCargo vehicle + + unitName moveInCargo [vehicle, CargoIndex] - $Code$_locked = locked _jeepOne;$/Code$ + $Code$_soldierOne moveInCargo _jeepOne;$/Code$ + + $Code$_soldierOne moveInCargo [_jeepOne, 1];$/Code$ - global / undefined + local / global - (March 4, 2013) - From Arma 3 version 0.50 is return value Number : - -1 - Object is null - 0 - Unlocked - 1 - Default - 2 - Locked - 3 - Locked for player + (August 4, 2006) + Notes from before the conversion + If you place a soldier in a vehicle with the moveInCargo command, he wont "know" he's in the vehicle, and thus he won't disembark properly when the vehicle reaches a Transport Unload waypoint. Therefore you have to use the assignAsCargo command, in order for the AI to catch on. Something like this: moveInCargo helo1 this assignAsCargo helo1 + MP Note Functions MoveInCargo can only be called for local soldiers. They will be ignored for remote soldiers. (see Locality in Multiplayer ) + + In OFP v1.96, the moveIn commands will not trigger an associated getIn event. To ensure the getIn event is fired, use the "getIn Cargo" action command. + + In Arma 3 when using the alternative syntax of moveInCargo, it is necessary to call assignAsCargoIndex because it is not called automatically. + $Code$unit1 moveInCargo [heli, 3]; + unit1 assignAsCargoIndex [heli, 3];$/Code$ + Alternatively avoid this broken syntax all together and use: + $Code$unit1 assignAsCargoIndex [heli, 3]; + unit1 moveInCargo heli; + $/Code$ - Number + Nothing - Nothing + - logEntities + setMarkerSizeLocal - Creates a log file containing the list of all game entities in scene. - File is created in the same directory as.rpt file. - Special: BattlEye's RCON variant of this command is #logEntities (see also Multiplayer_Server_Commands ) + Set marker size. + Size is in format [a-axis, b-axis]. - https://community.bistudio.com/wiki/logEntities + https://community.bistudio.com/wiki/setMarkerSizeLocal - logEntities + String setMarkerSizeLocal Array - logEntities + markerName setMarkerSizeLocal [a-axis, b-axis] - $Code$logEntities ;$/Code$ + $Code$"MarkerOne" setMarkerSizeLocal [100, 200];$/Code$ - undefined / undefined + undefined / local - File name example: - logEntities_4688_12-04-2014_12-19-39.log - File content example: - ====================== Vehicles ======================= - Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:1, Out: 0, NetID:2:3, Pos: [2476.243896][73.782043], N:B_Soldier_F - Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2471.500977][62.477680], N:Snake_random_F - Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2489.192383][73.935181], N:Snake_random_F - Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2487.953857][73.828362], N:Snake_random_F - Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2800.174805][96.234093], N:Rabbit_F - Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2825.378418][2.068635], N:Rabbit_F - Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2888.919434][6.837101], N:Rabbit_F - Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:0:0, Pos: [2910.756104][16.089361], N:Rabbit_F - Loc:0, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 1, AnyPl:0, Out: 0, NetID:2:0, Pos: [9.000000][9.000000], N:Logic - Total objects: 9 - Statistics objects: 9 - IsLocal: 8 - IsMarkedToDelete: 0 - IsDestroyed: 0 - IsDamageDestroyed: 0 - IsDamageDead: 0 - IsNotSimulated: 9 - IsVisible: 1 - IsAnyPlayer: 1 - IsOutsideMap: 0 - =================== Slow vehicles ===================== - Total objects: 214 - Statistics objects: 0 - Static objects are accounted in total object count but not included in statistics - IsLocal: 0 - IsMarkedToDelete: 0 - IsDestroyed: 0 - IsDamageDestroyed: 0 - IsDamageDead: 0 - IsNotSimulated: 0 - IsVisible: 0 - IsAnyPlayer: 0 - IsOutsideMap: 0 - =================== Out vehicles ==================== - Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:2:1, Pos: [2476.243896][73.782043], N:Supply40 - Loc:1, ForDel:0, Dstr:0, DmgDstr:0, DmgDead:0, Sim:1, Inv: 0, AnyPl:0, Out: 0, NetID:2:2, Pos: [2476.243896][73.782043], N:Supply140 - Total objects: 2 - Statistics objects: 2 - IsLocal: 2 - IsMarkedToDelete: 0 - IsDestroyed: 0 - IsDamageDestroyed: 0 - IsDamageDead: 0 - IsNotSimulated: 2 - IsVisible: 0 - IsAnyPlayer: 0 - IsOutsideMap: 0 - Nothing + Nothing + - logNetwork + camPrepareDive - Registers new log file recording a network traffic and returns handle of the log. + Prepares the camera dive angle. + This command is non-functional ! - https://community.bistudio.com/wiki/logNetwork + https://community.bistudio.com/wiki/camPrepareDive - logNetwork String + Object camPrepareDive Number - logNetwork logFile + camera camPrepareDive dive - $Code$_handle = logNetwork "myLog.txt";$/Code$ + $Code$_camera camPrepareDive -0.1$/Code$ undefined / undefined - (March 15, 2016) - With his syntax i get an error... - logNetwork "networkLog.txt"; - $Code$ 5:37:06 Error in expression logNetwork "networkLog.txt"; - 5:37:06 Error position: logNetwork "networkLog.txt"; - 5:37:06 Error lognetwork: Typ Zeichenfolge(STRING), erwartet(except) Array - $/Code$ - Number + Nothing + - logNetworkTerminate + libraryDisclaimers - Terminates a network log file started with logNetwork with the given handle + Returns the library disclaimers. - https://community.bistudio.com/wiki/logNetworkTerminate + https://community.bistudio.com/wiki/libraryDisclaimers - logNetworkTerminate Number + libraryDisclaimers - logNetworkTerminate handle + libraryDisclaimers - + $Code$hint str libraryDisclaimers ; // as in Arma2 OA 1.62.95208 + // ["THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."]$/Code$ + undefined / undefined - Nothing + Array + - log + edit3DENMissionAttributes - Base-10 logarithm of x. + Open a window with scenario attribute in given section. - https://community.bistudio.com/wiki/log + https://community.bistudio.com/wiki/edit3DENMissionAttributes - log Number + edit3DENMissionAttributes String - log x + edit3DENMissionAttributes section - $Code$_log = log 10; // 1$/Code$ + $Code$edit3DENMissionAttributes "Multiplayer";$/Code$ undefined / undefined - (23:14, 16 Jun 2014) - (A3 1.20) To clarify: - $Code$y = 10 ^ x // x = log y$/Code$ - People use logarithm at the purpose of simplifying multiplication via exponents plus years before. - $Code$23456*45634 = 1.07039e+009 - log 23456 = 4.37025; log 45634 = 4.65929; ( log 23456) + ( log 45634) = 9.02954 - 10^(( log 23456) + ( log 45634)) = 10 ^ 9.02954 // same as 23456*45634 - $/Code$ - As modern usage, for instance, to evaluate another exponent when multiple is known (Which magnitude is 4 times stronger than 8.3 earthquake?): - $Code$//_Unknown = log x; 8.3 = log y - // x = 10 ^_Unknown; y = 10 ^8.3 - //x/y = (10 ^_Unknown)/(10 ^8.3) = log 4 - // x/y = _Unknown – 8.3 = 0.6 - //_result = 8.9 magnitude - _result = ( log 4) + 8.3 - $/Code$ - Number + Nothing + - lookAtPos + curatorAddons - Center the map on,and point the camera at,the position. - i - Some Old Editor Command + Returns list of addons allowed to given curator. - https://community.bistudio.com/wiki/lookAtPos + https://community.bistudio.com/wiki/curatorAddons - Control lookAtPos Array + curatorAddons Object - map lookAtPos position + curatorAddons curatorObj - $Code$(findDisplay 12) lookAtPos [0,0,0];$/Code$ + $Code$_addons = curatorAddons myCurator;$/Code$ undefined / undefined @@ -40818,29 +41889,28 @@ - Nothing + Array + - lookAt + waypointCompletionRadius - Control what the unit(s) is/are looking at (target or position). + Gets the radius around the waypoint where the waypoint is completed. - https://community.bistudio.com/wiki/lookAt + https://community.bistudio.com/wiki/waypointCompletionRadius - Object/Array lookAt Object/Array + waypointCompletionRadius Array - unit lookAt position + waypointCompletionRadius waypoint - $Code$_someSoldier lookAt _otherSoldier$/Code$ - - $Code$[_someSoldier, _otherSoldier] lookAt markerPos "markerOne"$/Code$ + $Code$_radius = waypointCompletionRadius [groupOne, 1];$/Code$ undefined / undefined @@ -40848,56 +41918,74 @@ - Nothing + Number + - magazineCargo + finite - Get array with magazines from ammo box (or any general weapon holder container). + True, if number is finite (not infinite and a valid number) - https://community.bistudio.com/wiki/magazineCargo + https://community.bistudio.com/wiki/finite - magazineCargo Object + finite Number - magazineCargo box + finite x - $Code$hint str magazineCargo uniformContainer cursorTarget ;$/Code$ + $Code$?!finite 10/0 : hint "Infinite"$/Code$ undefined / undefined + (27 Sep, 2013) + Don't get high hopes with this command thinking what a great way of catching divisions by zero, the command is pretty useless in this respect: + $Code$//ArmA 2 + hint str finite (10/0); //true... O_o Huh???? + hint str (10/0); //0... Weird, but that explains it. + //ArmA 3 + hint str finite (10/0); // Error Zero Divisor + hint str finite 10; //true + hint str finite 1000000000000000000000000000000000000000; //false$/Code$ - Array + Boolean + - magazineTurretAmmo + soldierMagazines - Returns ammo count of given type from given turret - Broken when vehicle has multiple magazines of the same type + Get array with all magazines of the given unit. - https://community.bistudio.com/wiki/magazineTurretAmmo + https://community.bistudio.com/wiki/soldierMagazines - Object magazineTurretAmmo Array + soldierMagazines Object - vehicle magazineTurretAmmo [magazineClass, turretPath] + soldierMagazines unit - $Code$vehicle player magazineTurretAmmo ["cls", [0]]$/Code$ + $Code$soldierMagazines player ;[ + "6.5mm 30Rnd STANAG Mag(30/30)[id/cr:1/0](5x)", + "9mm 16Rnd Mag(16/16)[id/cr:7/0](2x)", + "RGO Frag Grenade(1/1)[id/cr:10/0](2x)", + "Smoke Grenade (White)(1/1)[id/cr:12/0](1x)", + "Smoke Grenade (Green)(1/1)[id/cr:13/0](1x)", + "Chemlight (Green)(1/1)[id/cr:14/0](2x)", + "Titan AT Missile(1/1)[id/cr:16/0](2x)" + ]$/Code$ undefined / undefined @@ -40905,61 +41993,78 @@ - Number + Array + - magazinesAllTurrets + buildingPos - Returns all magazines (including empty) from all vehicle turrets (including driver turret [-1]) and their ammo counts. + Returns PositionAGL of a given indexed position in a building. The index is 0-based (i.e. the first possible position would be 0. So if a building has 5 positions listed in the editor, 4 would be the highest position index usable with this command). Command will return [0,0,0] if buildingPos with given index is non-existent. + Since Arma 3 v.155.133934 if index -1 is supplied, the command will return array with all available positions. - https://community.bistudio.com/wiki/magazinesAllTurrets + https://community.bistudio.com/wiki/buildingPos - magazinesAllTurrets Object + Object buildingPos Number - magazinesAllTurrets vehicle + building buildingPos index - $Code$_mags = magazinesAllTurrets vehicle player ;$/Code$ + $Code$_soldier setPosATL (_house1 buildingPos 2);$/Code$ + + $Code$_allpositions = nearestBuilding player buildingPos -1;$/Code$ global / undefined + (August 2, 2006) + Notes from before the conversion: + These examples will move a unit to the 1st position specified in a buildings model, in the second example - bunker1. + $Code$this move (building buildingPos 1); + this move (bunker1 buildingPos 1);$/Code$ + In the default game buildings, the buildingPos is usually right behind a window. This can make it easy to place units in the windows of buildings, by putting the unit near a building and putting this in its init field: + $Code$this setPosATL (( nearestBuilding this) buildingPos 1);$/Code$ + The location returned by buildingPos is not reliable after the player has exited and then resumed the mission. For code that is executed immediately after the mission starts there is no problem. + If buildingPos locations are to be accessed during the mission when the player may have exited and then resumed, save the locations you require at the start of the mission and use these saved locations in your subsequent scripts. + + (January 26, 2007) + The highest index is not necessarily the highest position in a building! Check the z-value to find out the absolute height of a position. + + (February 16, 2007) + (building buildingPos 1) will return [0,0,0] if buildingPos with this index does not exist. + + (January 08, 2011) + Almost all buildings loose their building positions when they get (visually) damaged or destroyed. Some debris do still have building positions though. So it is no technical limitation. Just most damaged/destructed buildings models do not (yet?) have building positions. Keep in mind that a damaged or destroyed building is a different object instance (and model). - Array + Array + - magazinesAmmoCargo + commandFSM - Returns an array of subarrays with the type names and ammo left of all the vehicle's cargo or container magazines. + Orders a unit to process command defined by FSM file (via the radio). - https://community.bistudio.com/wiki/magazinesAmmoCargo + https://community.bistudio.com/wiki/commandFSM - magazinesAmmoCargo Object + Object/Array commandFSM Array - magazinesAmmoCargo vehicle + unitName commandFSM [fsm name, position, target] - $Code$magazinesAmmoCargo vehicle player ;$/Code$ - - $Code$magazinesAmmoCargo uniformContainer player ;[ - ["30Rnd_65x39_caseless_mag",30], - ["30Rnd_65x39_caseless_mag",30], - ["Chemlight_green",1] - ]$/Code$ + $Code$_soldierOne commandFSM ["move.fsm", position player, player]$/Code$ undefined / undefined @@ -40967,181 +42072,157 @@ - Array + Nothing + - magazinesAmmo + getPosVisual - Returns array of arrays of all vehicle's magazines and their ammo count (also works on supply boxes). When applied to a unit (soldier), the command behaves differently and will omit magazines already loaded into unit's weapons. Use magazinesAmmoFull to return all magazines. - Output format : - [[magazine1],[magazine2],[magazine3]...[magazineN]] - Magazine format : - 0: Magazine class name - 1: Magazine current ammo count + Returns an object's rendered 3D position (z value above sea when over sea, or above ground when over land) in render time scope. Alias of visiblePosition. - https://community.bistudio.com/wiki/magazinesAmmo + https://community.bistudio.com/wiki/getPosVisual - magazinesAmmo Object + getPosVisual Object - magazinesAmmo vehicle + getPosVisual object - $Code$_magazinesAmmo = magazinesAmmo player ; - /* - [ - ["30Rnd_65x39_caseless_mag",30], - ["30Rnd_65x39_caseless_mag",30], - ["16Rnd_9x21_Mag",16], - ["SmokeShellGreen",1], - ["Chemlight_green",1], - ["HandGrenade",1] - ] - */$/Code$ - - $Code$_magazinesAmmo = magazinesAmmo Mi_48; - /* - [ - ["250Rnd_30mm_APDS_shells",250], - ["250Rnd_30mm_HE_shells",250], - ["8Rnd_LG_scalpel",8], - ["38Rnd_80mm_rockets",38] - ] - */$/Code$ + $Code$_playerRenderedPos = getPosVisual player ;$/Code$ - undefined / undefined + global / undefined - (December 20, 2014) - When used on vehicles this will only return all magazines associated with a single turretPath (which one depends on the actual armament of the vehicle, usually the first armed turretPath or alternatively turretPath [-1]). - If you want to get all turrets' magazines, use allTurrets and magazinesTurret. - -- Actium ( talk ) 15:41, 20 December 2014 (CET) - Array + Array + - magazinesAmmoFull + canAdd - Returns array of arrays of all vehicle's magazines with extended information about them. - Output format : - [[magazine1],[magazine2],[magazine3]...[magazineN]] - Magazine format : - 0: Magazine class name - 1: Magazine current ammo count - 2: Magazine state (true - loaded, false - not loaded) - 3: Magazine type (-1 - n/a, 0 - grenade, 1 - primary weapon mag, 2 - handgun mag, 4 - secondary weapon mag, 65536 - vehicle mag) - 4: Magazine location ("Vest", "Uniform", "Backpack", "") or corresponding currentMuzzle + Checks if given object can be stored in inventory of given object or any inventory container ( uniform, vest, backpack ) of given unit. - https://community.bistudio.com/wiki/magazinesAmmoFull + https://community.bistudio.com/wiki/canAdd - magazinesAmmoFull Object + Object canAdd String + + Object canAdd Array - magazinesAmmoFull vehicle + object canAdd item + + object canAdd [item, count] - $Code$_magazinesAmmoFull = magazinesAmmoFull player ; - /* - [ - ["30Rnd_65x39_caseless_mag",30,false,-1,"Uniform"], - ["30Rnd_65x39_caseless_mag",30,false,-1,"Vest"], - ["16Rnd_9x21_Mag",16,false,-1,"Vest"], - ["SmokeShellGreen",1,true,0,"SmokeShellGreenMuzzle"], - ["Chemlight_green",1,true,0,"ChemlightGreenMuzzle"], - ["HandGrenade",1,true,0,"HandGrenadeMuzzle"], - ["30Rnd_65x39_caseless_mag",30,true,1,"arifle_MX_ACO_pointer_F"], - ["16Rnd_9x21_Mag",16,true,2,"hgun_P07_F"] - ] - */$/Code$ + $Code$if ( player canAdd "FirstAidKit") then { + player addItem "FirstAidKit"; + } else { + hint "Not enough space"; + };$/Code$ - $Code$_magazinesAmmoFull = magazinesAmmoFull Mi_48; - /* - [ - ["250Rnd_30mm_APDS_shells",250,false,-1,""], - ["250Rnd_30mm_HE_shells",250,true,65536,"gatling_30mm"], - ["8Rnd_LG_scalpel",8,true,65536,"missiles_SCALPEL"], - ["38Rnd_80mm_rockets",38,true,65536,"rockets_Skyfire"] - ] - */$/Code$ + $Code$if (_box canAdd "FirstAidKit") then { + _box addWeaponCargo ["FirstAidKit", 1]; + } else { + hint "Not enough space"; + };$/Code$ + + $Code$car canAdd [ currentWeapon player, 50];$/Code$ undefined / undefined - (December 20, 2014) - When used on vehicles this will only return all magazines associated with a single turretPath (which one depends on the actual armament of the vehicle, usually the first armed turretPath or alternatively turretPath [-1]). - If you want to get all turrets' magazines, use allTurrets and magazinesTurret. - -- Actium ( talk ) 15:40, 20 December 2014 (CET) + (November 29, 2015) + Can also be used on any object that has inventory, not only player inventory containers. + Where _box is B_supplyCrate_F : + $Code$// Empty + _box canAdd "FirstAidKit"; + - true + // Full + _box canAdd "FirstAidKit"; + - false + $/Code$ - (February 10, 2015) - As Actium said, this function seems to extract data from: - configfile "CfgVehicles" _the_vehicle_you_want "Turrets" "MainTurret" "magazines". - Some vehicles return an empty field {} because magazines are in straight in: - configfile "CfgVehicles" _the_vehicle_you_want "magazines" (often dedicated to flares only). - This is the case of WY-55 Hellcat. This function returns an empty array. + (February 11, 2017) + This can also be used as alternative to canAddItemToBackpack, canAddItemToUniform, canAddItemToVest where container might not be strictly defined.In some cases it might be a good optimisation for your code, where you also don't need to perform checks on which type of player container this is. Example: + $Code$_i = [(uniformContainer player),(vestContainer player),(backpackContainer player)] call BIS_fnc_selectRandom; + if (_i canAdd "Rangefinder") then { + _i addItemCargoGlobal ["Rangefinder",1]; + }; + $/Code$ - Array + Boolean - Boolean + - magazinesDetailBackpack + clearWeaponCargo - Returns an array with the type names of all the unit's backpack magazines. + Remove all weapons from the given vehicle's weapon cargo space. - https://community.bistudio.com/wiki/magazinesDetailBackpack + https://community.bistudio.com/wiki/clearWeaponCargo - magazinesDetailBackpack Object + clearWeaponCargo Object - magazinesDetailBackpack unit + clearWeaponCargo vehicleName - $Code$magazinesDetailBackpack player$/Code$ + $Code$clearWeaponCargo _truck$/Code$ - undefined / undefined + global / local + (October 24, 2009) + Only works on clients. - Array + Nothing + - magazinesDetailUniform + actionKeysImages - Returns an array with the type names of all the unit's uniform magazines. + Returns a list of button images or names assigned to the given user action. A maximum of maxKeys keys is listed. You can find the action names in config class ControllerSchemes or user action names. - https://community.bistudio.com/wiki/magazinesDetailUniform + https://community.bistudio.com/wiki/actionKeysImages - magazinesDetailUniform Object + actionKeysImages String + + actionKeysImages Array - magazinesDetailUniform unit + actionKeysImages userAction + + actionKeysImages [userAction, maxKeys] - $Code$magazinesDetailUniform player$/Code$ + $Code$_text = actionKeysImages "ReloadMagazine"$/Code$ + + $Code$_reload = actionKeysImages ["ReloadMagazine",1] will return "R" (incl. the quotation marks!)$/Code$ undefined / undefined @@ -41149,76 +42230,108 @@ - Array + Structured_Text - Structured_Text + - magazinesDetailVest + moveInTurret - Returns an array with the type names of all the unit's vest magazines. + Moves the soldier into the vehicle's turret. (Immediately, without animation). turret path is an array of positions inside a turret, or positions inside a turret of a turret. + [0] means first turret. + [0,0] means first turret of first turret. + [0,1] means second turret of first turret. + [1] means second turret. + [1,0] means first turret of the second turret. + [2,0] means first turret of third turret. + And so on... - https://community.bistudio.com/wiki/magazinesDetailVest + https://community.bistudio.com/wiki/moveInTurret - magazinesDetailVest Object + Object moveInTurret Array - magazinesDetailVest unit + unitName moveInTurret [vehicle, turretPath] - $Code$magazinesDetailVest player$/Code$ + $Code$_soldierOne moveInTurret [_tank, [0, 0]]$/Code$ - undefined / undefined + local / global + (March 6, 2008) + To find out which turrets are available on a vehicle, and what the syntax is, you can use this little script. + + (February 13, 2014) + Examples for nested turrets: + MainTurret = $Code$_soldierOne moveInTurret [_tank, [0]] $/Code$ + CommanderTurret = $Code$_soldierOne moveInTurret [_tank, [0, 0]] $/Code$ + ... where: + MainTurret is the standard BIS MainTurret... e.g: + $Code$class Turrets + { + class MainTurret {}; + };$/Code$ + CommanderTurret is the standard BIS CommanderTurret located on the MainTurret... e.g: + $Code$class Turrets + { + class MainTurret + { + class Turrets + { + class CommanderTurret {}; + }; + }; + };$/Code$ + + (March 18, 2014) + Here is a small function to find available turret paths for a given vehicle. It will only search 2 levels deep, hence called commonTurrets : + $Code$KK_fnc_commonTurrets = { + private ["_arr","_trts"]; + _arr = []; + _trts = configFile / "CfgVehicles" / typeOf _this / "Turrets"; + for "_i" from 0 to count _trts - 1 do { + _arr set [ count _arr, [_i]]; + for "_j" from 0 to count ( + _trts / configName (_trts select _i) / "Turrets" + ) - 1 do { + _arr set [ count _arr, [_i, _j]]; + }; + }; + _arr + };$/Code$ + Example call: + $Code$ hint str ( vehicle player call KK_fnc_commonTurrets); //[[0],[0,0]]$/Code$ + See also allTurrets - Array + Nothing + - magazinesDetail + shownChat - Returns an array of strings with description of all vehicle's magazines, their ammo count (current/default) and their ids. - When applied to a unit (soldier), the command behaves differently and will omit magazines already loaded into unit's weapons. Use currentMagazineDetail to get this information for a currently loaded magazine. + Returns true if chat window is enabled. Chat window can be disabled with showChat command. - https://community.bistudio.com/wiki/magazinesDetail + https://community.bistudio.com/wiki/shownChat - magazinesDetail Object + shownChat - magazinesDetail vehicle + shownChat - $Code$_magazinesDetail = magazinesDetail player ; - /* - [ - "6.5mm 30Rnd STANAG Mag(30/30)[id:3]", - "6.5mm 30Rnd STANAG Mag(30/30)[id:9]", - "9mm 16Rnd Mag(16/16)[id:12]", - "Smoke Grenade (Green)(1/1)[id:14]", - "Chemlight (Green)(1/1)[id:16]", - "RGO Frag Grenade(1/1)[id:18]" - ] - */$/Code$ - - $Code$_magazinesDetail = magazinesDetail Mi_48; - /* - [ - "30mm APDS shells(250/250)[id:20]", - "30mm HE Shells(250/250)[id:21]", - "Scalpel E2(8/8)[id:22]", - "Skyfire(38/38)[id:23]" - ] - */$/Code$ + $Code$_bool = shownChat ;$/Code$ undefined / undefined @@ -41226,214 +42339,264 @@ - Array + Boolean + - magazinesTurret + groupIconsVisible - Returns all magazines of given turret. Use turret path [-1] for driver's turret. Alternatively, use magazinesAllTurrets + Return group icons are visible. - https://community.bistudio.com/wiki/magazinesTurret + https://community.bistudio.com/wiki/groupIconsVisible - Object magazinesTurret Array + groupIconsVisible - vehicle magazinesTurret turretPath + groupIconsVisible - $Code$_mags = vehicle player magazinesTurret [0, 0];$/Code$ - - $Code$_mags = _tank magazinesTurret [0];$/Code$ + $Code$// HC bar active + if (isNil "BIS_HC_visible") then {BIS_HC_visible = groupIconsVisible}; + setGroupIconsVisible [true,true];$/Code$ - global / undefined + undefined / undefined - Array + Array + - magazines + setPos - Returns array of type names of all vehicle's magazines. - When applied to a unit (soldier), the command behaves differently and will omit magazines already loaded into unit's weapons. Use currentMagazine to get this information for a currently loaded magazine. + Sets object position. - https://community.bistudio.com/wiki/magazines + https://community.bistudio.com/wiki/setPos - magazines Object + Object setPos Array - magazines vehicle + object setPos pos - $Code$_mags = magazines player$/Code$ + $Code$player setPos [ getPos player select 0, getPos player select 1, ( getPos player select 2) +10]; + //the same as above using modelToWorld : + player setPos ( player modelToWorld [0,0,10]); + //the same as above using vectorAdd : + player setPos ( getPos player vectorAdd [0,0,10]);$/Code$ + + $Code$_obj setPos [ getPos _obj select 0, getPos _obj select 1, -5];$/Code$ + + $Code$player setPos ( getPos _obj);$/Code$ - undefined / undefined + global / global - In OFP v1.96, if a weapon is loaded with an empty magazine, that magazine will still be counted by this command. The ammo command can be used to check if a unit has any ammunition into it's last magazine. + (6 Feb, 2011) + Calling setPos on an object can cause the object's orientation to change. This depends on the terrain and/or objects below the object. This was tested by calling setPos on a test object with the position of a helicopter ( modelToWorld with some offset). When flying over land the orientation of the test object would rapidly change depending on the slope of the ground and objects beneath it. + Comment applicable to Ver 1.96 and earlier : + obj1 setPos [x,y,z] + Will place most objects z metres above ground level (negative numbers for underground). But if obj1 is a trigger then it will be placed z metres above sea level. This can be very useful if you want to check a unit's height above sea level but it can be a problem if you want to move a trigger to create an explosion or a sound. To move a trigger to a location at ground level: + $Code$triggername setPos [x,y,0]; + triggername setPos [x,y, abs ( getPos triggername select 2)];$/Code$ + Note for Armed Assault: Using setPos for a trigger will work in exactly the same way that setPos works for other objects - namely that setPos [x,y,z] will place the trigger z metres above ground level. + SetPos for static objects like a ammo crate do not work in MP. - (25 November 2011) - This command does not include non-turret weapon magazines, such as smoke, flare or chaff magazines which are usually declared in the root of the vehicle's class, rather than in the Turrets hierarchy. + (23 Nov, 2011) + You can use getPos and setPos on triggers. - Array + Nothing + - mapAnimAdd + get3DENMissionAttribute - Add next frame to map animation. + Return value of scenario attribute. + ! + Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! - https://community.bistudio.com/wiki/mapAnimAdd + https://community.bistudio.com/wiki/get3DENMissionAttribute - mapAnimAdd Array + String get3DENMissionAttribute String - mapAnimAdd [time, zoom, position] + section get3DENMissionAttribute class - $Code$mapAnimAdd [1, 0.1, markerPos "anim1"]; - mapAnimCommit ;$/Code$ - - $Code$mapAnimAdd [3, 0.01, player ]; - mapAnimCommit ;$/Code$ + $Code$systemChat str ("Multiplayer" get3DENMissionAttribute "respawn");$/Code$ - local / local + undefined / undefined - (05:26, 2 February 2007) - In OFP v1.96, the mapAnim series of commands, together with forceMap can only be used in the intro and mission, as it is not possible to access the map from the outro. (not checked, sourced from an old copy of the OFPEC comref) + (February 26, 2016) + The class names of the vanilla sections are: + General + Scenario + Environment + Intel + Multiplayer + Multiplayer + Garbage Collection + GarbageCollection + Preferences + Preferences - Nothing + Anything + - mapAnimClear + UAVControl - Clear map animation. + Returns array with current operator of UAV and his vehicle role in UAV. - https://community.bistudio.com/wiki/mapAnimClear + https://community.bistudio.com/wiki/UAVControl - mapAnimClear + UAVControl Object - mapAnimClear + UAVControl uav - + $Code$UAVControl uav;$/Code$ + - local / local + undefined / undefined - In OFP v1.96, the mapAnim series of commands, together with forceMap can only be used in the intro and mission, as it is not possible to access the map from the outro. (not checked, sourced from an old copy of the OFPEC comref) - Nothing + Array + - mapAnimCommit + getAllSoundControllers - Play map animation. + Returns an array containing names and values of the sound controllers that can be used in simple expressions when configuring sounds. - https://community.bistudio.com/wiki/mapAnimCommit + https://community.bistudio.com/wiki/getAllSoundControllers - mapAnimCommit + getAllSoundControllers Object - mapAnimCommit + getAllSoundControllers vehicle - + $Code$getAllSoundControllers vehicle player ; + // Result: [["rpm",0],["randomizer",0.874332],["speed",0],["thrust",0],...]]$/Code$ + - local / local + undefined / undefined - In OFP v1.96, the mapAnim series of commands, together with forceMap can only be used in the intro and mission, as it is not possible to access the map from the outro. (not checked, sourced from an old copy of the OFPEC comref) - Nothing + Array + - mapAnimDone + setLightColor - Check if map animation is finished. + Set diffuse color of light. Illuminates surfaces that are facing the light. - https://community.bistudio.com/wiki/mapAnimDone + https://community.bistudio.com/wiki/setLightColor - mapAnimDone + Object setLightColor Array - mapAnimDone + light setLightColor [r, g, b] - + $Code$myLight setLightColor [0.5,0,0]; //produces red$/Code$ + local / local - In OFP v1.96, the mapAnim series of commands, together with forceMap can only be used in the intro and mission, as it is not possible to access the map from the outro. (not checked, sourced from an old copy of the OFPEC comref) - - - Boolean - + (Dec 1, 2006) + Light can be created with command createVehicleLocal with special vehicle class "#lightpoint" + for example: + $Code$_light = "#lightpoint" createVehicleLocal pos; + _light setLightBrightness 1.0; + _light setLightAmbient [0.0, 1.0, 0.0]; + _light setLightColor [0.0, 1.0, 0.0]; + _light lightAttachObject [_object, [0,0,0]]; + $/Code$ + + (Aug 17, 2007) + To clarify: + setLightAmbient - Terrain and surrounding objects are bathed in this colour. + setLightColor - Controls the "haze" seen around the lightsource (ex flares). + + (Mar 24, 2014) + 1. In ArmA3 ver 1.14 setLightColor will also change the color of the flare when setLightUseFlare, setLightFlareSize and setLightFlareMaxDistance were used on the same light source. For example: + $Code$ + _light setLightUseFlare true; + _light setLightFlareSize 2; + _light setLightFlareMaxDistance 60; + _light setLightColor [1, 1, 1]; + $/Code$ + 2. When both setLightAmbient and setLightColor were [0,0,0], there won’t be any visual presentation on the light source. + + + Nothing + + - mapCenterOnCamera + debugLog - control mapCenterOnCamera boolean syntax enables/disables continuous centering of the main map type control on the camera position. Needs to be executed once. - mapCenterOnCamera control syntax centers mini map type control on camera. The command returns world position of the camera. Needs to be executed each frame (preferably inside onDraw EH). + Dump argument type and value to debugging output. + This command is non-functional in the retail version - https://community.bistudio.com/wiki/mapCenterOnCamera + https://community.bistudio.com/wiki/debugLog - Control mapCenterOnCamera Boolean - - mapCenterOnCamera Control + debugLog Any_Value - mainmap mapCenterOnCamera enable - - mapCenterOnCamera minimap + debugLog anything - $Code$//--- Minimap update - (( uiNamespace getVariable "BIS_UAV_DISPLAY") displayCtrl 112410) mapCenterOnCamera true ;$/Code$ + $Code$debugLog player$/Code$ undefined / undefined @@ -41441,114 +42604,116 @@ - Nothing - Array + Nothing + - mapGridPosition + menuEnabled - Returns the map grid position of an object or position. The format is determined by the Grid format specified in the CfgWorlds for the current world. Eg: "024577" or "De82" or similar. + Returns if menu entry on given path is enabled or not. - https://community.bistudio.com/wiki/mapGridPosition + https://community.bistudio.com/wiki/menuEnabled - mapGridPosition Object/Position + menuEnabled Array - mapGridPosition param + menuEnabled [idc, path] - $Code$_gridPos = mapGridPosition player$/Code$ - - $Code$_gridPos = mapGridPosition getPos player$/Code$ - + undefined / undefined - String + Boolean + - markAsFinishedOnSteam + countUnknown - Marks current mission as finished on Steam. Returns true if Steam query is successfully started or false otherwise. + Count how many units in the array are unknown to the given unit. - https://community.bistudio.com/wiki/markAsFinishedOnSteam + https://community.bistudio.com/wiki/countUnknown - markAsFinishedOnSteam + Object countUnknown Array - markAsFinishedOnSteam + unitName countUnknown arrayName - $Code$markAsFinishedOnSteam ; - endMission "END1";$/Code$ + $Code$_num = player countUnknown list _triggerOne;$/Code$ - undefined / undefined + global / undefined - Boolean + Number + - markerAlpha + visibleWatch - Gets the marker alpha. See setMarkerAlpha. + Checks if the player has watch opened and visible - https://community.bistudio.com/wiki/markerAlpha + https://community.bistudio.com/wiki/visibleWatch - markerAlpha String + visibleWatch - markerAlpha markerName + visibleWatch - $Code$AlphaMarker = markerAlpha "myMarker;$/Code$ + $Code$if ( visibleWatch ) then { hint "Watch is visible"};$/Code$ - global / undefined + undefined / undefined - Number + Boolean + - markerBrush + exec - Gets the marker brush. See setMarkerBrush. + Execute a script using (the deprecated but still available).sqs syntax. The argument is passed to the script in the "_this" variable, and magic variable "_time" within the script contains the time in seconds that the script has been running. + Alternatively use execVM command in combination with.sqf syntax. + Learn more about scripts under Scripts. - https://community.bistudio.com/wiki/markerBrush + https://community.bistudio.com/wiki/exec - markerBrush String + Any_Value exec String - markerBrush name + argument exec script - $Code$if ( markerBrush "Marker1" == "Solid") then { hint "Marker1 is solid!"}$/Code$ + $Code$[player, _jeep] exec "getin.sqs"$/Code$ undefined / undefined @@ -41556,27 +42721,28 @@ - String + Nothing + - markerColor + getWeaponSway - Returns marker color for given marker. See setMarkerColor. Note: This function is identical to getMarkerColor. + Returns current size of weapon sway of a given unit, in radians - https://community.bistudio.com/wiki/markerColor + https://community.bistudio.com/wiki/getWeaponSway - markerColor String + getWeaponSway Object - markerColor markerName + getWeaponSway unit - $Code$if ( markerColor "Marker1" == "ColorRed") then { hint "Marker1 is red!"}$/Code$ + $Code$_sway = getWeaponSway player ;$/Code$ undefined / undefined @@ -41584,204 +42750,345 @@ - String + Number + - markerDir + private - Get marker direction. + Sets a variable to the innermost scope as demonstrated in Example 3. One other command that is capable of creating private variables is params. + Since Arma 3 v1.53.132932 private can be used as keyword as shown in Example 4. - https://community.bistudio.com/wiki/markerDir + https://community.bistudio.com/wiki/private - markerDir String + private String + + private Array - markerDir markerName + private variableName + + private variableNameList - $Code$_mPos = markerDir "markerOne"$/Code$ + $Code$private "_varname";$/Code$ + + $Code$private ["_varname1", "_varname2"];$/Code$ + + $Code$_myvar = 123; + systemChat str [_myvar]; // -- [123] + call { + systemChat str [_myvar]; // -- [123] + private "_myvar"; + systemChat str [_myvar]; // -- [any] + _myvar = 345; + systemChat str [_myvar]; // -- [345] + }; + systemChat str [_myvar]; // -- [123]$/Code$ + + $Code$// Usage of private as keyword: + private _myvar = 123; + //is the same as + private "_myvar"; + _myvar = 123;$/Code$ + + $Code$_lol = 123; call { hint str [_lol]}; // [123] + _lol = 123; call { private "_lol"; hint str [_lol]}; // [any]$/Code$ - global / undefined + undefined / undefined - (April 18, 2010) - The direction of the marker is the same as displayed in the editor, so it can both be negative, and be 360 degrees or greater. + (Sep 24, 2009 15:04) + The example provided is fairly worthless without a context. + Using the private command allows you to declare a variable in the current scope, without regards to variables in a higher scope with the same name. Note that if you try to declare a variable without an underscore (meaning it's global) with the private command, it will cause an error. Specifically: "Error Local variable in global space". + Here's a code example with output for your benefit. + $Code$ + _foo = 10; + if (true) then + { + private ["_foo"]; + _foo = 5; + player sideChat format ["%1", _foo]; + }; + player sideChat format ["%1", _foo]; + $/Code$ + In this example, the first sidechat (innermost) returns 5 while the second sidechat (outermost) returns 10. + $Code$ + if (true) then + { + private ["_bar"]; + _bar = 5; + player sideChat format ["%1", _bar]; + }; + $/Code$ + In this example, the private command does nothing and is simply a waste of code, assuming there is no higher level code to interfere with the if statement. + + (August 4, 2010) + The higher scope is also the script from which the function has been called. + If you've got in the script: + $Code$ + _a = 1; + call compile loadFile "function.sqf"; + hint format ["%1", _a]; + $/Code$ + And in the function.sqf : + $Code$ + _a = 2; + $/Code$ + Game will display 2. + Inserting private "_a" in the function prevents the change and so number 1 will be displayed on the screen. + + (February 25, 2015) + Recursive loops require the use of private. Without it, your variables will be overwritten. + + (January 31, 2018) + More examples! + $Code$ if ( true ) then { //new scope + _localVar = "some string"; + systemChat _localVar; // = "some string" + }; + systemChat _localVar; // = ERROR _localVar doesn't exist in the outer Scope + $/Code$ + $Code$_localVar = "bla"; + if ( true ) then { //new scope + _localVar = "some string"; + systemChat _localVar; // = "some string" + }; + systemChat _localVar; // = "some string" + $/Code$ + $Code$_localVar = "bla"; + if ( true ) then { + private _localVar = "some string"; + systemChat _localVar; // = "some string" + }; + systemChat _localVar; // = "bla" + $/Code$ + $Code$_localVar = "bla"; + if ( true ) then { //new scope + private _localVar = "some string"; + if ( true ) then { //new scope + private _localVar = "some other string"; + systemChat _localVar; // = "some other string" + }; + systemChat _localVar; // = "some string" + }; + systemChat _localVar; // = "bla" + $/Code$ + + (January 31, 2018) + This command has the same functionality as javascript's let keyword. + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let - Number + Nothing - Nothing + - markerPos + savingEnabled - Get marker Position. Note: This function is identical to getMarkerPos. + Check if saving the game is enabled. - https://community.bistudio.com/wiki/markerPos + https://community.bistudio.com/wiki/savingEnabled - markerPos String + savingEnabled - markerPos markerName + savingEnabled - $Code$_mPos = markerPos "markerOne";$/Code$ + $Code$if ( savingEnabled ) then { + hint "Saving is enabled!"; + };$/Code$ - global / undefined + undefined / undefined - (March 17, 2014) - Position's Z coordinate will always be 0." - Array + Boolean + - markerShape + lnbSetColumnsPos - Gets the marker shape. See setMarkerShape for a list of strings that can be returned. + Sets relative screen X for ListNBox control columns positions. Setter for lnbGetColumnsPosition - https://community.bistudio.com/wiki/markerShape + https://community.bistudio.com/wiki/lnbSetColumnsPos - markerShape String + lnbSetColumnsPos Array + + Control lnbSetColumnsPos Array - markerShape name + lnbSetColumnsPos [idc, positions] + + ctrl lnbSetColumnsPos positions - $Code$if ( markerShape "Marker1" == "RECTANGLE") then { hint "Marker1 is a rectangle!"}$/Code$ + $Code$lnbSetColumnsPos [101, [0.1,0.5,0.7]];$/Code$ + + $Code$_ctrl lnbSetColumnsPos [0.1,0.5,0.7];$/Code$ - global / undefined + undefined / undefined - (May 30, 2016) - Free hand drawn markers return "POLYLINE" + (Sep 9 2014) + See: List Box#LISTNBOX - String + Nothing - Nothing + - markerSize + isEqualTo - Returns marker size. This command is identical to getMarkerSize. + Performs strict comparison between var1 and var2 and returns true if equal, otherwise false. Strict means that it would check that both arguments are of the same data type and then compare the values. + Some differences between isEqualTo and == : + It performs case sensitive comparison on Strings + It doesn't throw error when comparing different types, i.e. ("eleven" isEqualTo 11) + It can compare Arrays, Scripts and Booleans ( alive player isEqualTo true ) + It can compare non-existent game objects ( grpNull isEqualTo grpNull ) + It can compare Namespaces ( As of Arma 3 v1.47 ) + It is slightly faster than ==, especially when comparing Strings - https://community.bistudio.com/wiki/markerSize + https://community.bistudio.com/wiki/isEqualTo - markerSize String + Anything isEqualTo Anything - markerSize markerName + val1 isEqualTo val2 - $Code$_mSize = markerSize "Marker1";$/Code$ + $Code$_arr1 = [1,[2,[3]]]; + _arr2 = [1,[2,[3]]]; + if (_arr1 isEqualTo _arr2) then { hint "Arrays match!"}$/Code$ + + $Code$if (a isEqualTo b) then { hint "a is equal to b"}; + if !(a isEqualTo b) then { hint "a is not equal to b"};$/Code$ - global / undefined + undefined / undefined + (July 19, 2014) + The behavior of "var1 isEqualTo var2" is pretty much equivalent to "var1 in [var2]", plus the ability to compare arrays, and slightly better performance. + + (December 3, 2014) + Simply put, "isEqualTo" is a binary comparison. Therefor it is very fast but only accepts 100% identical matches. In some other languages this is known as "===" instead of "==". + + (November 3, 2016) + When comparing with nil result is Nothing. + "nil isEqualTo player" returns "Nothing" instead of expected "false" + $Code$diag_log [nil isEqualTo player];$/Code$ + Will print "[bool]" + $Code$diag_log (str (nil isEqualTo player)) + "test";$/Code$ + Will throw Generic error in expression + "+: Type Nothing, expected Number,Array,String,Not a Number" - Array + Boolean + - markerText + setWaypointDescription - Get marker text. + Sets the description shown in the HUD while the waypoint is active. - https://community.bistudio.com/wiki/markerText + https://community.bistudio.com/wiki/setWaypointDescription - markerText String + Array setWaypointDescription String - markerText markerName + waypoint setWaypointDescription text - $Code$hint format ["Marker Text: %1", markerText "Marker1"];$/Code$ + $Code$[_grp, 2] setWaypointDescription "Move here.";$/Code$ - global / undefined + undefined / undefined - String + Nothing + - markerType + secondaryWeaponItems - Get type of marker. Note: This function is identical to getMarkerType. See cfgMarkers for a list of standard markers. + Returns array with all items assigned to the secondary weapon. This command is used for infantry weapons only. - https://community.bistudio.com/wiki/markerType + https://community.bistudio.com/wiki/secondaryWeaponItems - markerType String + secondaryWeaponItems Object - markerType markerName + secondaryWeaponItems unit - $Code$if ( markerType "Marker1" == "Empty") then { hint "Marker1 is not an icon!"}$/Code$ + $Code$secondaryWeaponItems player ; //["","","",""]$/Code$ - global / undefined + undefined / undefined - (March 17, 2014) - Using markerType is a good method to determine if a string is a valid marker name, unless the marker type isn't set. $Code$if (markerType "mark1" != "") then {hint "valid marker"}$/Code$ - String + Array + - max + timeMultiplier - The greater of a,b + Returns the value set with setTimeMultiplier. - https://community.bistudio.com/wiki/max + https://community.bistudio.com/wiki/timeMultiplier - Number max Number + timeMultiplier - a max b + timeMultiplier - $Code$3 max 2 - // Result is 3$/Code$ + $Code$_multiplier = timeMultiplier ;$/Code$ undefined / undefined @@ -41789,403 +43096,486 @@ - Number + Number + - members + vectorAdd - Return a list of members in given team. + Adds two 3D vectors. - https://community.bistudio.com/wiki/members + https://community.bistudio.com/wiki/vectorAdd - members Team_Member + Array vectorAdd Array - members team + vector1 vectorAdd vector2 - $Code$_members = members _team$/Code$ + $Code$hint str ( velocity unit1 vectorAdd velocity unit2);$/Code$ + + $Code$[5,10,5] vectorAdd [5,5,10]; //returns [10,15,15]$/Code$ undefined / undefined + (28 Jun, 2014) + (ArmA3 1.22)Algorithm: + $Code$ + Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; + Result = [x1 + x2,y1 + y2,z1 + z2;] + $/Code$ + It is recommended to use vectorAdd instead of BIS_fnc_vectorAdd. - Array + Array + - menuAction + ASLToAGL - Returns action stored in item on given path. + Converts position from PositionASL to PositionAGL - https://community.bistudio.com/wiki/menuAction + https://community.bistudio.com/wiki/ASLToAGL - menuAction Array + ASLToAGL PositionASL - menuAction [idc, path] + ASLToAGL posASL - + $Code$_playerPosAGL = ASLToAGL getPosASL player ;$/Code$ + undefined / undefined - String + PositionAGL + - menuAdd + kbAddDatabaseTargets - Adds new submenu entry into item on given path. + Register target list knowledge base database to given person. See Conversations for more details. - https://community.bistudio.com/wiki/menuAdd + https://community.bistudio.com/wiki/kbAddDatabaseTargets - menuAdd Array + Object kbAddDatabaseTargets String - menuAdd [idc, path, text] + person kbAddDatabaseTargets fileName - + $Code$_hasBeenAdded = _unit kbAddDatabaseTargets "chat.txt"$/Code$ + undefined / undefined - Number + Boolean + - menuChecked + setWaves - Returns if item on given path is checked or not. + Changes the waves value smoothly during the given time (in seconds). A time of zero means there will be an immediate change. + NOTE : This command will have no effect (even though the value of waves changes) unless Manual Override option is selected in the editor in the Intel, which is normally off. - https://community.bistudio.com/wiki/menuChecked + https://community.bistudio.com/wiki/setWaves - menuChecked Array + Number setWaves Number - menuChecked [idc, path] + time setWaves value - + $Code$180 setWaves.5;$/Code$ + + $Code$0 setWaves 1;$/Code$ + - undefined / undefined + undefined / local - Boolean + Nothing + - menuClear + preloadSound - Removes all entries from given menu strip. + Makes sure that a sound can start playing without any delay once it is needed. Command works in Arma 3, but might not be implemented in earlier Arma installments. - https://community.bistudio.com/wiki/menuClear + https://community.bistudio.com/wiki/preloadSound - menuClear Number + preloadSound String - menuClear idc + preloadSound soundName - + $Code${ + waitUntil { preloadSound _x}; + } forEach getArray ( missionConfigFile "CfgSounds" "sounds");$/Code$ + undefined / undefined - Nothing + Boolean + - menuCollapse + setRadioMsg - Collapses item on given path and all its childs. + Sets radio trigger menu title text (0 - 0 - map radio). Use "NULL" to disable radio slot. Use "" to restore default title - https://community.bistudio.com/wiki/menuCollapse + https://community.bistudio.com/wiki/setRadioMsg - menuCollapse Array + Number setRadioMsg String - menuCollapse [idc, path] + index setRadioMsg text - + $Code$1 setRadioMsg "Click meeeeeeeeee"; //changes title of radio Alpha$/Code$ + - undefined / undefined + undefined / local - Nothing + Nothing + - menuData + saveOverlay - Returns data stored in menu entry on given path. + Save the current overlay. + i + Some Old Editor Command - https://community.bistudio.com/wiki/menuData + https://community.bistudio.com/wiki/saveOverlay - menuData Array + saveOverlay Control - menuData [idc, path] + saveOverlay map - + $Code$saveOverlay _map$/Code$ + undefined / undefined - String + Nothing + - menuDelete + systemOfUnits - Deletes menu entry on given path. + Returns the currently selected system of units. + 0: Metric + 1: Mixed (ground vehicles use Metric / air vehicles use Imperial) + 2: Imperial - https://community.bistudio.com/wiki/menuDelete + https://community.bistudio.com/wiki/systemOfUnits - menuDelete Array + systemOfUnits - menuDelete [idc, path, text] + systemOfUnits - + $Code$_system = systemOfUnits;$/Code$ + undefined / undefined - Number + Number + - menuEnabled + weaponDirection - Returns if menu entry on given path is enabled or not. + Returns the direction that the vehicle weapon is aiming in. + For addons the weapon name must be an entry in CfgWeapons. + Returns an array in format [x, y, z] - https://community.bistudio.com/wiki/menuEnabled + https://community.bistudio.com/wiki/weaponDirection - menuEnabled Array + Object weaponDirection String - menuEnabled [idc, path] + vehicleName weaponDirection weaponName - + $Code$_weaponVectorDir = player weaponDirection currentWeapon player ;$/Code$ + + $Code$// Draw AI eye direction (green) and weapon direction (red) in 3D: + bob = createGroup east createUnit ["O_Soldier_F", [0,0,0], [], 0, "NONE"]; + bob setVehiclePosition [ player modelToWorld [0,100,0], [], 0, "NONE"]; + onEachFrame + { + _beg = ASLToAGL eyePos bob; + _endE = (_beg vectorAdd ( eyeDirection bob vectorMultiply 100)); + drawLine3D [ _beg, _endE, [0,1,0,1]]; + _endW = (_beg vectorAdd (bob weaponDirection currentWeapon bob vectorMultiply 100)); + drawLine3D [_beg, _endW, [1,0,0,1]]; + };$/Code$ + - undefined / undefined + global / undefined + (August 18, 2007) + Works great in multiplayer. + The numbers are representing offset as follows : [X axis,Y axis,Z axis] + The return array can be processed-converted into degrees as follows: + $Code$_array = _this weaponDirection "weapon class" ; + _dir_degrees = (_array select 0) atan2 (_array select 1);$/Code$ + + (November 11, 2007) + WeaponClass can only be the primary turret of the vehicle. For example it is not possible to get direction of commander's M2 on M1Abrams. + + (November 13, 2007) + For an alternative to the weaponDirection command, see the following post on the offical forums. On how to obtain the direction of multiple turrets on vehicles. + Turret Animations - new forum + + (December 9, 2014) + The suggestion above using atan2 and weaponDirection get the direction the barrel of a weapon is pointing, but this is not the same as the direction a shell will be fired (verify this by getting in an M4 Scorcher, parking it on a slope, elevating the barrel "across" the slope and watching the shell come out in third person). - Boolean + Array + - menuEnable + markAsFinishedOnSteam - Enables disabled menu entry on given path. + Marks current mission as finished on Steam. Returns true if Steam query is successfully started or false otherwise. - https://community.bistudio.com/wiki/menuEnable + https://community.bistudio.com/wiki/markAsFinishedOnSteam - menuEnable Array + markAsFinishedOnSteam - menuEnable [idc, path] + markAsFinishedOnSteam - + $Code$markAsFinishedOnSteam ; + endMission "END1";$/Code$ + undefined / undefined - Nothing + Boolean + - menuExpand + getFuelCargo - Expands given menu entry on given path and all its parents so entry is visible. + Returns the fuel amount (between 0 and 1) in the cargo space of a refuelling vehicle. - https://community.bistudio.com/wiki/menuExpand + https://community.bistudio.com/wiki/getFuelCargo - menuExpand Array + getFuelCargo Object - menuExpand [idc, path] + getFuelCargo vehicle - + $Code$value = getFuelCargo myVehicleName;$/Code$ + - undefined / undefined + global / undefined + (December 22, 2014) + If the vehicle is not alive, it always returns Nothing, which you should check for using isNil. + If the vehicle is unable to carry that type of cargo, it returns -1.#IND, which you should check for using finite. - Nothing + Number + - menuHover + morale - Returns path to menu entry mouse is currently hovering over. + Checks a current morale level of the unit (-1..+1). - https://community.bistudio.com/wiki/menuHover + https://community.bistudio.com/wiki/morale - menuHover Number + morale Object - menuHover idc + morale unit - + $Code$morale ( leader player );//result is 0.5$/Code$ + undefined / undefined - Array + Number + - menuPicture + ctClear - Returns picture set into item on given path + Removes all the lines from the RscControlsTable. Returns Nothing. - https://community.bistudio.com/wiki/menuPicture + https://community.bistudio.com/wiki/ctClear - menuPicture Array + ctClear Control - menuPicture [idc, path] + ctClear Control - + $Code$ctClear _control;$/Code$ + - undefined / undefined + local / local - String + Nothing + - menuSetAction + formationTask - Sets new action into menu entry on given path. + Return the current task of the unit in the formation. + You can't use it in ArmA 2, it will always returns "NOTHING" - https://community.bistudio.com/wiki/menuSetAction + https://community.bistudio.com/wiki/formationTask - menuSetAction Array + formationTask Object - menuSetAction [idc, path, action] + formationTask person - + $Code$_CurrentTask = FormationTask _person$/Code$ + undefined / undefined - Number + String + - menuSetCheck + textLogFormat - Sets item on given path to be checked or not. + Debugging output. + This command is non-functional in the retail version - https://community.bistudio.com/wiki/menuSetCheck + https://community.bistudio.com/wiki/textLogFormat - menuSetCheck Array + textLogFormat Array - menuSetCheck [idc, path, checkedl] + textLogFormat [format, arg1, arg2,] @@ -42195,358 +43585,496 @@ - Nothing + Nothing + - menuSetData + magazinesDetail - Sets new data into item on given path. + Returns an array of strings with description of all vehicle's magazines, their ammo count (current/default) and their ids. + When applied to a unit (soldier), the command behaves differently and will omit magazines already loaded into unit's weapons. Use currentMagazineDetail to get this information for a currently loaded magazine. - https://community.bistudio.com/wiki/menuSetData + https://community.bistudio.com/wiki/magazinesDetail - menuSetData Array + magazinesDetail Object - menuSetData [idc, path, data] + magazinesDetail vehicle - + $Code$_magazinesDetail = magazinesDetail player ; + /* + [ + "6.5mm 30Rnd STANAG Mag(30/30)[id:3]", + "6.5mm 30Rnd STANAG Mag(30/30)[id:9]", + "9mm 16Rnd Mag(16/16)[id:12]", + "Smoke Grenade (Green)(1/1)[id:14]", + "Chemlight (Green)(1/1)[id:16]", + "RGO Frag Grenade(1/1)[id:18]" + ] + */$/Code$ + + $Code$_magazinesDetail = magazinesDetail Mi_48; + /* + [ + "30mm APDS shells(250/250)[id:20]", + "30mm HE Shells(250/250)[id:21]", + "Scalpel E2(8/8)[id:22]", + "Skyfire(38/38)[id:23]" + ] + */$/Code$ + undefined / undefined - Nothing + Array + - menuSetPicture + ctrlSetTooltipColorShade - Sets new picture into menu entry on given path. + Sets tooltip background color of given control. Color is in format Color. - https://community.bistudio.com/wiki/menuSetPicture + https://community.bistudio.com/wiki/ctrlSetTooltipColorShade - menuSetPicture Array - - Control menuSetPicture Array + Control ctrlSetTooltipColorShade Array - menuSetPicture [idc, path, picture] - - control menuSetPicture [path, picture] + control ctrlSetTooltipColorShade color - + $Code$_control ctrlSetTooltipColorShade [1, 0, 0, 1];$/Code$ + undefined / undefined - Nothing - Nothing + Nothing + - menuSetValue + lbSetSelectColorRight - Sets new value into menu entry on given path. + Sets the select color of the of the secondary text (right aligned) of the item with the given index of the listbox or combobox with id idc of the topmost user dialog to color. + Colour is in format Color. - https://community.bistudio.com/wiki/menuSetValue + https://community.bistudio.com/wiki/lbSetSelectColorRight - menuSetValue Array + lbSetSelectColorRight Array + + Control lbSetSelectColorRight Array - menuSetValue [idc, path, value] + lbSetSelectColorRight [idc, index, color] + + control lbSetSelectColorRight [index, color] - + $Code$lbSetSelectColorRight [101, 0, [0, 1, 0, 0.5]];$/Code$ + + $Code$_control lbSetSelectColorRight [0, [0, 1, 0, 0.5]];$/Code$ + undefined / undefined + More information on the LB command family can be found here - Nothing + Nothing - Nothing + - menuShortcut + setTriggerArea - Returns shortcut related to menu entry on given path. + Defines the area monitored by the given trigger. The area could be either rectangular or elliptical. Since Arma 3 v1.59.135137 it is possible to define 3 dimensional area to monitor by specifying extra param for the area height (see pic). + Just like with a and b dimensions, c dimension will alter area in opposite directions from the trigger position along z axis. Therefore if the trigger position is on the surface, half of the trigger area will be above the surface and half below. To place the whole area above the surface, adjust trigger position (move it up c meters). If c is not specified or = 0, the trigger area considered infinitely tall, like in old triggers. - https://community.bistudio.com/wiki/menuShortcut + https://community.bistudio.com/wiki/setTriggerArea - menuShortcut Array + Object setTriggerArea Array - menuShortcut [idc, path] + trigger setTriggerArea [a, b, angle, isRectangle, c] - + $Code$_trigger setTriggerArea [100, 50, 45, false ];$/Code$ + + $Code$// Possible since Arma 3 v1.59.135137: + _trigger setTriggerArea [100, 50, 45, false, 100];$/Code$ + - undefined / undefined + global / local - Number + Nothing + - menuShortcutText + intersect - Returns a string containing shortcut text for menu item on the given path. + Finds named selections in object which are in specified LOD, intersected by given section of a line. Return value is in the form of [selection, distance]. Multiple returned arrays are nested within a single array. No intersection returns []. lodName could be one of the following: + "FIRE" + "VIEW" + "GEOM" + "IFIRE" - ("I" stands for Indirect, almost the same as FIRE) - https://community.bistudio.com/wiki/menuShortcutText + https://community.bistudio.com/wiki/intersect - menuShortcutText Array + Array intersect Array - menuShortcutText [idc, path] + [object, lodName] intersect [begPos, endPos] - + $Code$[_tank, "VIEW"] intersect [[1500, 1500, 2], [1550, 1500, 2]];$/Code$ + + $Code$sphere = "Sign_Sphere10cm_F" createVehicle [0,0,0]; + onEachFrame { + _begPos = positionCameraToWorld [0,0,0]; + _begPosASL = AGLToASL _begPos; + _endPos = positionCameraToWorld [0,0,1000]; + _endPosASL = AGLToASL _endPos; + _ins = lineIntersectsSurfaces [_begPosASL, _endPosASL, player, objNull, true, 1, "FIRE", "NONE"]; + if (_ins isEqualTo []) exitWith {sphere setPosASL [0,0,0]}; + _ins select 0 params ["_pos", "_norm", "_obj", "_parent"]; + if !( getModelInfo _parent select 2) exitWith {sphere setPosASL [0,0,0]}; + _ins2 = [_parent, "FIRE"] intersect [_begPos, _endPos]; + if (_ins2 isEqualTo []) exitWith {sphere setPosASL [0,0,0]}; + _ins2 select 0 params ["_name", "_dist"]; + _posASL = _begPosASL vectorAdd ((_begPosASL vectorFromTo _endPosASL) vectorMultiply _dist); + drawIcon3D ["", [1,1,1,1], ASLToAGL _posASL, 0, 0, 0, _name, 1, 0.03, "PuristaMedium"]; + sphere setPosASL _posASL; + };$/Code$ + - undefined / undefined + global / undefined + (Jul 25, 2007) + The most common LOD is " FIRE ", which identifies the most detailled hitbox used for ammunition. + + (Mar 27, 2014) + Example (In ArmA3 ver 1.14) display returned arrays on cursor entities: + $Code$ + Sto = []; + Fn = { + { + Sto set [_foreachindex,[cursortarget,_x] intersect [(asltoagl (eyepos player)),(screentoworld [0.5,0.5])]]; + } foreach ["FIRE","VIEW","GEOM","IFIRE"]; + hintsilent format ["FIRE: %1, VIEW: %2, GEOM: %3, IFIRE: %4",Sto select 0,Sto select 1,Sto select 2,Sto select 3]; + }; + ["sample_id","onEachFrame","Fn"] call BIS_fnc_addStackedEventHandler; + $/Code$ + Return FIRE: [something], VIEW: [something], GEOM: [something], IFIRE: [something]. + + (August 20, 2015) + intersect will spam.rpt if passed to it object has no skeleton. Use getModelInfo to filter out those objects. - String + Array + - menuSize + deleteCenter - Returns how many sub entries is in item on given path. + In a nutshell, this command removes gaming Side (see createCenter ). If a side has 0 Groups it cannot be deleted. Center can only be created for: east, west, resistance, civilian and sideLogic, therefore only centers from the mentioned sides can be deleted. + Old description: Destroys the AI center of the given side. - https://community.bistudio.com/wiki/menuSize + https://community.bistudio.com/wiki/deleteCenter - menuSize Array + deleteCenter Side - menuSize [idc, path] + deleteCenter side - + $Code$deleteCenter east$/Code$ + - undefined / undefined + undefined / global - Number + Nothing + - menuSort + channelEnabled - Sorts subentries of item on given path by their text. + Returns true or false depending on whether the given channel is enabled or disabled. For more information about enabling/disabling of chat channels see enableChannel. Channel / Number correspondence: + 0 = Global + 1 = Side + 2 = Command + 3 = Group + 4 = Vehicle + 5 = Direct + 6-15 = Custom Radio (Is not supported by channelEnabled ) + Please note that since Arma 3 v1.59.135661 the output of this command was changed from Boolean to Array in format [ Boolean, Boolean ] - https://community.bistudio.com/wiki/menuSort + https://community.bistudio.com/wiki/channelEnabled - menuSort Array + channelEnabled Number - menuSort [idc, path, reversed] + channelEnabled channel - + $Code$_isGlobalChatEnabled = ( channelEnabled 0) select 0; // Check if user can use text on global channel$/Code$ + + $Code$_isGlobalVoiceEnabled = ( channelEnabled 0) select 1; // Check if user can use the VoN on global channel$/Code$ + undefined / undefined - Nothing + Array + - menuText + setCamShakeDefParams - Returns current text set in menu entry on given path. + Sets camera shake default params, the default camshake when, for example, you freelook at your character shooting a 12.7mm sniper rifle or firing tank cannon. Would also work in 1st person. - https://community.bistudio.com/wiki/menuText + https://community.bistudio.com/wiki/setCamShakeDefParams - menuText Array + setCamShakeDefParams Array - menuText [idc, path] + setCamShakeDefParams [power, duration, frequency, minSpeed, minMass, caliberCoefHit, vehicleCoef] - + $Code$setCamShakeDefParams [1, 2, 3, 4, 5,.5,.5];$/Code$ + + $Code$setCamShakeDefParams [100, 10, 10, 4, 5, 1, 1];$/Code$ + undefined / undefined + (December 1, 2014) + Doesn't appear to have any effect in ArmA 3. - String + Nothing + - menuURL + camPrepareFov - Returns current URL set in entry on given path. + Prepares the camera field of view (zoom). The default zoom level is 0.75, 0.01 is the nearest and 2 the furthest zoom value. The angle of the field of view is atan(FOV)*2 radians when in 4:3 aspect ratio. Needs the call of camCommitPrepared to be conducted. - https://community.bistudio.com/wiki/menuURL + https://community.bistudio.com/wiki/camPrepareFov - menuURL Array + Object camPrepareFov Number - menuURL [idc, path] + camera camPrepareFov fieldOfView - + $Code$_camera camPrepareFov 0.1$/Code$ + undefined / undefined - String + Nothing + - menuValue + onPreloadFinished - Returns current value set in menu entry on given path. + Defines an action performed after the preload screen finished. Preload event occurs after briefing screen on mission start. + i + Since Arma 3 v1.57 a stackable version of this EH is available: PreloadFinished + In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. - https://community.bistudio.com/wiki/menuValue + https://community.bistudio.com/wiki/onPreloadFinished - menuValue Array + onPreloadFinished String/Code - menuValue [idc, path] + onPreloadFinished command - + $Code$onPreloadFinished {TAG_ReceivingScreenDone = true };$/Code$ + + $Code$//removes the event immediately after the first run again + onPreloadFinished {TAG_ReceivingScreenDone = true ; onPreloadFinished ""};$/Code$ + undefined / undefined + (July 24, 2009) + There is a bug in Arma2 that will make this command execute every time the screen with "Receiving..." has been displayed. + If this code is put in the Init.sqf it will run the startcam.sqf script when the loading screen has disappeared + onPreloadFinished '[fire1] execVM "scripts\startcam.sqf"'; + It will however also run every time a player change graphics settings, alt-tab or do anything else that will trigger the loading screen. + You will have to script around it with if statements to get it to run only in the beginning of the mission. - Number + Nothing + - mineActive + roadsConnectedTo - Checks if the given mine is active. + Find the road segments connected to the given road segment. - https://community.bistudio.com/wiki/mineActive + https://community.bistudio.com/wiki/roadsConnectedTo - mineActive Object + roadsConnectedTo Object - mineActive obj + roadsConnectedTo roadSegment - $Code$if ( mineActive _mine) then { hint "BOOM!"};$/Code$ + $Code$_road = ( player nearRoads 50) select 0; + _connectedRoads = roadsConnectedTo _road;$/Code$ - global / undefined + undefined / undefined - Boolean + Array + - mineDetectedBy + isWeaponRested - Returns true if mine has been detected by a given side + Returns true if weapon is currently rested. - https://community.bistudio.com/wiki/mineDetectedBy + https://community.bistudio.com/wiki/isWeaponRested - Object mineDetectedBy Side + isWeaponRested Object - mine mineDetectedBy faction + isWeaponRested unit - $Code$( allMines select 0) mineDetectedBy west ;$/Code$ + $Code$_rest = isWeaponRested player ;$/Code$ - undefined / undefined + local / undefined + (July 1, 2015) + You can force a unit out of bipod or resting with: + $Code$_unit playMove "";$/Code$ + + (July 12, 2015) + As of 1.49 $Code$ isWeaponRested player $/Code$ is the only current use of this command. You cannot detect remote player and you cannot detect local unit that is not a player. Might as well be a nullar command without argument. - Boolean + Boolean + - min + radioChannelSetCallSign - The smaller of a,b + Set the custom radio channel's call sign. + Available special parameters: + $KEY (reference to a localized text) + %CHANNEL_LABEL + %UNIT_SIDE + %UNIT_NAME + %UNIT_RANK + %UNIT_ID + %UNIT_REF + %UNIT_GRP_NAME + %UNIT_GRP_LEADER + %UNIT_VEH_NAME + %UNIT_VEH_POSITION - https://community.bistudio.com/wiki/min + https://community.bistudio.com/wiki/radioChannelSetCallSign - Number min Number + Number radioChannelSetCallSign String - a min b + index radioChannelSetCallSign callSign - $Code$3 min 2 - // Result is 2$/Code$ + $Code$4 radioChannelSetCallSign "%UNIT_NAME";$/Code$ undefined / undefined @@ -42554,118 +44082,98 @@ - Number + Nothing + - missionConfigFile + getDir - Return root of mission Description.ext entries hierarchy. - ! - Since introduction of the Eden Editor, scenario attributes can be configured in the editor itself, not only in the external Description.ext file. To access desired value independently on where it's stored, use the following commands instead: - getMissionConfigValue - getMissionConfig + Returns the object heading in the range from 0 to 360. + Since Arma 3 v1.55.133361, an alternative syntax is added that allows to get heading from one object or position to another object or position, the equivalent of BIS_fnc_dirTo - https://community.bistudio.com/wiki/missionConfigFile + https://community.bistudio.com/wiki/getDir - missionConfigFile + getDir Object + + Object/Position2D/Position3D getDir Object/Position2D/Position3D - missionConfigFile + getDir object + + pos1 getDir pos2 - $Code$for "_i" from (0) to (( count paramsArray ) - 1) do { - missionNamespace setVariable [ configName (( missionConfigFile /"Params") select _i), paramsArray select _i]; - };$/Code$ - - $Code$// To define custom values in description.ext : - class myMissionConfig - { - class mySetup - { - myNumber = 3; - myArray[] = { 1, 2, 3 }; - myText = "LOL"; - }; - }; - // To read defined custom values from a script:_myNumber = getNumber ( missionConfigFile "myMissionConfig" "mySetup" "myNumber"); - _myArray = getArray ( missionConfigFile "myMissionConfig" "mySetup" "myArray"); - _myText = getText ( missionConfigFile "myMissionConfig" "mySetup" "myText");$/Code$ - - $Code$// To get file path with description.ext to play sound via playSound3D : - _filePath = [( str missionConfigFile ), 0, -15] call BIS_fnc_trimString ;$/Code$ + $Code$_azimuth = getDir player ;$/Code$ - $Code$// Obtaining mission root using A3 substring functionality - MISSION_ROOT = str missionConfigFile select [0, count str missionConfigFile - 15];$/Code$ + $Code$_azimuth = player getDir tank;$/Code$ - undefined / undefined + global / undefined - (February 17, 2015) - missionConfigFile can be used to parse mission.sqm file data as well if it is included into description.ext : - class MissionSQM - { - #include "mission.sqm" - }; - Then mission.sqm data can be accessed like this: - $Code$ getNumber ( missionConfigFile "MissionSQM" "version"); //12 - version param in mission.sqm $/Code$ - (courtesy of Master85 ) + (October 23, 2013) + Be careful when using this command in conjunction with BIS_fnc_rotateVector2D ; the latter rotates vectors counterclockwise (mathematically correct), while getDir returns a clockwise angle. + To counter this, simply negate the output of getDir: + $Code$[[0,1,0], -( getDir _object ) ] call BIS_fnc_rotateVector2D ;$/Code$ - Config + Number - Number + - missionDifficulty + setMarkerSize - Return difficulty that has been forced for this mission, returns -1 if difficulty is not forced and it's used one from player's options. + Set marker size. + Size is in format [a-axis, b-axis]. - https://community.bistudio.com/wiki/missionDifficulty + https://community.bistudio.com/wiki/setMarkerSize - missionDifficulty + String setMarkerSize Array - missionDifficulty + markerName setMarkerSize [a-axis, b-axis] - + $Code$"MarkerOne" setMarkerSize [100, 200];$/Code$ + - undefined / undefined + undefined / global - Number + Nothing + - missionNamespace + radioChannelRemove - Returns the global namespace attached to mission. + Remove the units from the custom radio channel. - https://community.bistudio.com/wiki/missionNamespace + https://community.bistudio.com/wiki/radioChannelRemove - missionNamespace + Number radioChannelRemove Array - missionNamespace + index radioChannelRemove units - $Code$missionNamespace setVariable ["YourString",3];//Same as: YourString = 3; - _yourString = missionNamespace getVariable "YourString";$/Code$ + $Code$3 radioChannelRemove [blufor_unit_1, blufor_unit_2];$/Code$ undefined / undefined @@ -42673,358 +44181,320 @@ - Namespace + Nothing + - missionName + mineActive - Return currently loaded mission file (path to mission.pbo, relative to game exe). + Checks if the given mine is active. - https://community.bistudio.com/wiki/missionName + https://community.bistudio.com/wiki/mineActive - missionName + mineActive Object - missionName + mineActive obj - + $Code$if ( mineActive _mine) then { hint "BOOM!"};$/Code$ + - undefined / undefined + global / undefined - (2nd August, 2010) - Only works in SP and on the MP Host/DS. It returns the mission pboprefix if available, otherwise the pboname. For clients it returns '__cur_mp'. - - (September 25, 2014) - In OFP (up to v1.96) it returns the mission filename. In CWA (since v1.99), it returns the briefing name instead when in multiplayer. The string displayed is that set in the Intel section of the mission editor. - String + Boolean + - missionStart + saveProfileNamespace - Returns date and time when mission started in format [year, month, day, hour, minute, second]. - Works only in multiplayer, in singleplayer all values are equal to zero → [0,0,0,0,0,0] - NOTE : Because missionStart contains the time of the actual start of the mission, it might not be available in pre-init or init, but is guaranteed to be available in post-init when time 0. + Saves the variables stored in profileNamespace to the persistent active user profile. + Warning : this is a file operation, which makes it expensive! It is not recommended to do this at a high frequency in a loop for example. It is however also recommended not to change a large amount of variables and wait long before saving, because certain game crashes may cause a loss of data. + Warning : saving a lot of data can quickly increase the size of the profile variables file, so keep an eye on this. + Warning : TKOH's Heliport status (used in the Career mode for example) is stored in this file, so be mindful of working with this technology to avoid losing data and progress. - https://community.bistudio.com/wiki/missionStart + https://community.bistudio.com/wiki/saveProfileNamespace - missionStart + saveProfileNamespace - missionStart + saveProfileNamespace - $Code$setDate ( missionStart select [0,5]);$/Code$ - - $Code$// Set real date: - //postInit = 1; - if ( isServer ) then { - waitUntil { time 0}; - setDate ( missionStart select [0,5]); - };$/Code$ + $Code$saveProfileNamespace;$/Code$ undefined / undefined - (September 25, 2014) - Returns array with date indicating when the mission has started (after briefing screen). In OFP this command is bugged – it works only in multiplayer on a player‐hosted machine and on a client. In single player it would return [0,0,0,0,0,0] and on a dedicated server – [1970,1,1,0,0,0]. In CWA this command is fixed. - - (December 30, 2014) - In arma 3 this command returns [0,0,0,0,0,0] in SP, [1970,1,1,0,0,0] on dedicated server and [1970,1,1,0,0,0] initially and then server real time on local headless client. On player clients it shows client's local date and time. Since Arma 3 v1.49 the dedicated server also returns correct mission start date. - - (August 27, 2015) - ArmA 3 1.50: This command now returns the correct values on dedicated server. http://feedback.arma3.com/view.php?id=23373 + Variables are also saved when the game is quit. - Array + Nothing + - missionVersion + setLightBrightness - Returns the version of the current mission. - Mission from the 2D Editor : 12 - Mission from the Eden Editor : 15 and higher (for example current version for Eden Editor mission in Arma 3 v1.57 is 51) + Set brightness of light. - https://community.bistudio.com/wiki/missionVersion + https://community.bistudio.com/wiki/setLightBrightness - missionVersion + Object setLightBrightness Number - missionVersion + light setLightBrightness brightness - $Code$_version = missionVersion ;$/Code$ + $Code$myLight setLightBrightness 2;$/Code$ - undefined / undefined + local / local + (Dec 1, 2006) + Light can be created with command createVehicleLocal with special vehicle class "#lightpoint" + for example: + $Code$_light = "#lightpoint" createVehicleLocal pos; + _light setLightBrightness 1.0; + _light setLightAmbient [0.0, 1.0, 0.0]; + _light setLightColor [0.0, 1.0, 0.0]; + _light lightAttachObject [_object, [0,0,0]]; + $/Code$ + + (Mar 24, 2014) + In ArmA3 ver1.14 setLightBrightness will overwrite the previous effect processed by setLightIntensity on the same light source, vice versa. And both of them currently play the same role on brightness, for example: $Code$_light setLightBrightness 1;// same as _light setLightIntensity 3000;$/Code$ - Number + Nothing + - modParams + addMagazineCargoGlobal - Returns list of mod parameters according to given options, values are in same order as the given options. Available options: - "name" : String - name to be shown (Arma 3 instead of A3, etc.) - "picture" : String - picture shown in Mod Launcher - "logo" : String - logo to be shown in Main Menu - "logoOver" : String - logo to be shown in Main Menu when mouse is over - "logoSmall" : String - small version of logo, prepared for drawing small icons - "tooltip" : String - tooltip to be shown on mouse over - "tooltipOwned" : String - tooltip to be shown on mouse over the icon when DLC is owned by player - "action" : String - url to be triggered when mod button is clicked - "actionName" : String - what to put on Action Button - "overview" : String - overview text visible in expansion menu - "hidePicture" : Boolean - do not show mod picture icon in the main menu mod list - "hideName" : Boolean - do not show mod name in the main menu mod list - "defaultMod" : Boolean - default mods cannot be moved or disabled by Mod Launcher - "serverOnly" : Boolean - mod doesn't have to be installed on client in order to play on server with this mod running - "active" : Boolean - active mod (activated through command line or stored in profile by mod launcher) - NOTE that "active" does not actually tell you if a mod ( is running / pretends to be running ) + Add magazines to the cargo space of vehicles, which can be taken out by infantry units. + MP Synchronized - https://community.bistudio.com/wiki/modParams + https://community.bistudio.com/wiki/addMagazineCargoGlobal - modParams Array + Object addMagazineCargoGlobal Array - modParams [modClass, options] + vehicleName addMagazineCargoGlobal [magazineName, count] - $Code$_data = modParams ["Kart", ["name", "logo", "picture"]];$/Code$ + $Code$_truck addMagazineCargoGlobal ["M16", 5];$/Code$ - undefined / undefined + global / global - (April 24, 2017) - This command used to spam. rpt when queried mod didn't exist, making it little awkward to use for testing if mod is active. For example: - $Code$_superDuperModEnabled = modParams ["super_duper", ["active"]] param [0, false];$/Code$ - Since v1.69 the command would fail silently if mod doesn't exist. + (November 7, 2011) + Synchronized to JIP as well. - Array + Nothing + - modelToWorldVisualWorld + currentTasks - Converts position from object model space to world space in render time. + List all uncompleted tasks. - https://community.bistudio.com/wiki/modelToWorldVisualWorld + https://community.bistudio.com/wiki/currentTasks - Object modelToWorldVisualWorld Array + currentTasks Team_Member - obj modelToWorldVisualWorld modelPos + currentTasks member - $Code$player modelToWorldVisualWorld [0,1,0]$/Code$ + $Code$_playerTasks = currentTasks teamMember player$/Code$ undefined / undefined - (May 28, 2017) - This command produces identical result to modelToWorldVisual command used in conjunction with AGLToASL - $Code$obj modelToWorldVisualWorld [1,2,3] isEqualTo AGLToASL (obj modelToWorldVisual [1,2,3]); // true$/Code$ - Array + Array + - modelToWorldVisual + ctHeaderControls - Converts position from object model space to world space in render time scope. For ASL version see modelToWorldVisualWorld. + Returns array of controls on the header with the given index. - https://community.bistudio.com/wiki/modelToWorldVisual + https://community.bistudio.com/wiki/ctHeaderControls - Object modelToWorldVisual Array + Control ctHeaderControls Number - object modelToWorldVisual modelPos + Control ctHeaderControls Number - $Code$_aboveAndBehindPlayer = player modelToWorldVisual [0,-1,3];$/Code$ + $Code$_array = _control ctHeaderControls 0;$/Code$ - undefined / undefined + local / local - Array + Array + - modelToWorldWorld + forceSpeed - Converts position from object model space to world space (usable by setPosWorld for example). + Force the speed limit on given object (object will never attempt to move faster than given by forceSpeed). Use negative value to return to default behaviour. Used unit is m/s. - https://community.bistudio.com/wiki/modelToWorldWorld + https://community.bistudio.com/wiki/forceSpeed - Object modelToWorldWorld Array + Object forceSpeed Number - obj modelToWorldWorld modelPos + object forceSpeed speed - $Code$( getPos player ) modelToWorldWorld [0,1,0]$/Code$ + $Code$_helicopter forceSpeed 150;$/Code$ undefined / undefined - (May 28, 2017) - This command produces identical result to modelToWorld command used in conjunction with AGLToASL - $Code$obj modelToWorldWorld [1,2,3] isEqualTo AGLToASL (obj modelToWorld [1,2,3]); // true$/Code$ + (17:02, 2 March 2007 (CET)) + Setting forceSpeed to -1 will make the unit move according to the group speed mode (often specified by the waypoint) again. Setting forceSpeed to 0 will halt the unit ignoring waypoints or orders. + + (9 February 2008) + Does not seem to do anything at the current time (V1.08.5163) + + (14 December 2011) + If a unit (man) has forceSpeed set to anything under jogging (walking only) the unit will refuse to get into vehicles. He will automatically be unassigned from a vehicle everytime he is ordered to get in (via scripts or direct action) - Array + Nothing + - modelToWorld + removeAllPrimaryWeaponItems - Translates relative position from object model space into world position. This command will take into account vectorUp of the object when calculating relative coordinates. For ASL version see modelToWorldWorld + Removes all items from weapon except magazine. - https://community.bistudio.com/wiki/modelToWorld + https://community.bistudio.com/wiki/removeAllPrimaryWeaponItems - Object modelToWorld Array + removeAllPrimaryWeaponItems Object - model modelToWorld position + removeAllPrimaryWeaponItems unit - $Code$_aboveAndBehindPlayer = player modelToWorld [0,-1,3];$/Code$ - + - undefined / undefined + local / global - (16 Feb, 2007) - The worldPos parameter appears to be a relative offset to the position of object, so it can often simply be [0,0,0]. - Example: to position an object _obj relative to the position of another object _RelObj with on offset of _Offset, try: - _Offset = [_x,_y,_z]; - _worldPos = _RelObj modelToWorld _Offset; - _obj setPos _worldPos; - - (16 Feb, 2007) - The object model space has got its Z-Axis along the object's vectorUp, its Y-Axis along the object's vectorDir, while its X-Axis goes along vectorDir x VectorUp (meaning as the X-Axis in a right-handed cartesian coordiante system ). - - (8 May, 2008) - If your object requires a new direction, ensure you call setDir prior to setPos when using modelToWorld. Calling setDir afterwards will skew its position otherwise. - _ladder setDir _angle; - _ladder setPos (_building modelToWorld [_x, _y, _z]); - - (6 Feb, 2011) - The z height returned changes dynamically with the height of waves beneath the object, if the object is located over sea. The z height returned by getPosATL and getPosASL does not change like this. This was tested by continuously retrieving the position of a static object, like the cross in the empty/corpses category, placed over sea or land. - modelToWorld behaves similar to - getPos _obj - but it does not give the same result, therefore - (_obj modelToWorld [0.0, 0.0, 0.0]) is not the same as (getPos _obj). - Array + Nothing + - mod + secondaryWeapon - Remainder of a divided by b. + Returns name of a unit's secondary weapon (empty string if none). - https://community.bistudio.com/wiki/mod + https://community.bistudio.com/wiki/secondaryWeapon - Number mod Number + secondaryWeapon Object - a mod b + secondaryWeapon unit - $Code$_rem = 3 mod 2; - // Result is 1$/Code$ + $Code$_sWeap = secondaryWeapon player ;$/Code$ + + $Code$hint secondaryWeapon player ; //"launch_NLAW_F"$/Code$ undefined / undefined - (01:34, 16 April 2006) - Remainder is calculated in real domain. - mod is identical to a % b - You can use mod to round a decimal number down to the nearest whole number. For example: If you wanted to use the command random to generate a whole number between 0 and 5, you could put this in a script: - $Code$_rand = random 6; - _num = _rand - (_rand mod 1); - $/Code$ - In A1, the new commands round, floor or ceil would be the easier way to round. + (August 4, 2006) + Notes from before the conversion: + secondaryWeapon tells you what weapon the unit has irrespective of the status of the weapon. For example a unit that has a LAWLauncher on his back will still report a LAWLauncher as its secondary weapon. Use currentWeapon to detect the active weapon. - Number + String + - moonIntensity + get3DENEntity - Returns the intensity of the moon's brightness in range 0...1. + Returns Eden Entity based on its unique ID. If the ID points to a layer, the ID will be returned instead. - https://community.bistudio.com/wiki/moonIntensity + https://community.bistudio.com/wiki/get3DENEntity - moonIntensity + get3DENEntity Number - moonIntensity + get3DENEntity id - $Code$_intensity = moonIntensity ;$/Code$ + $Code$myEntity = get3DENEntity 1$/Code$ undefined / undefined @@ -43032,116 +44502,127 @@ - Number + EdenEntity + - moonPhase + atan2 - Returns the phase of the in-game Moon on the given date in range 0...1, where 0 - new Moon, 1 - full Moon. According to this command the fullest Moon in Arma 3 at midnight is on setDate [4804,7,13,0,0]; Use Moon Phase Utility to find out date for a mission with desired moon. + ArcTangent of x/y. Used to determine the angle of a vector [x,y]. Result in Degrees between -180 and 180. + Note that this command can handle y being 0, unlike when using atan, and will return 90 - https://community.bistudio.com/wiki/moonPhase + https://community.bistudio.com/wiki/atan2 - moonPhase Array + Number atan2 Number - moonPhase date + x atan2 y - $Code$_currentMoonPhase = moonPhase date ;$/Code$ + $Code$_xy = [5,3]; + _degrees = (_xy select 0) atan2 (_xy select 1); //59.0362$/Code$ - $Code$// Returns array of dates for given year when moon is at its fullest - fnc_fullMoonDates = - { - private _year = param [0, 2035]; - private ["_date", "_phase", "_fullMoonDate"]; - private _fullMoonPhase = 1; - private _waxing = false ; - private _fullMoonDates = []; - for "_i" from dateToNumber [_year, 1, 1, 0, 0] to dateToNumber [_year, 12, 31, 23, 59] step 1 / 365 do - { - _date = numberToDate [_year, _i]; - _phase = moonPhase _date; - call - { - if (_phase _fullMoonPhase) exitWith - { - _waxing = true ; - _fullMoonDate = _date; - }; - if (_waxing) exitWith - { - _waxing = false ; - _fullMoonDates pushBack _fullMoonDate; - }; - }; - _fullMoonPhase = _phase; - }; - _fullMoonDates - }; - //set random full moon date in year 1970 - setDate selectRandom (1970 call fnc_fullMoonDates);$/Code$ + $Code$// Get direction from _obj1 to _obj2: + _vd = getPosASL _obj2 vectorDiff getPosASL _obj1; + _dir = (_vd select 0) atan2 (_vd select 1); //_dir range from -180 to +180 + if (_dir 0) then {_dir = 360 + _dir}; //_dir range from 0 to 360$/Code$ + + $Code$// Get relative direction from _obj1 to _obj2: + _xy = _obj1 worldToModel getPosASL _obj2; + _dir = (_xy select 0) atan2 (_xy select 1); //_dir range from -180 to +180 + if (_dir 0) then {_dir = 360 + _dir}; //_dir range from 0 to 360$/Code$ undefined / undefined + (08:00, 18 November 2009) + To get the direction of an object from the player: + $Code$ + _dir = (( getPos _obj select 0) - ( getPos player select 0)) atan2 (( getPos _obj select 1) - ( getPos player select 1)); + //_dir will be from -180 to 180. + $/Code$ + If positive values are needed then use: + $Code$ + if (_dir 0) then {_dir = _dir + 360}; + $/Code$ + Or just use BIS_fnc_dirTo directly. - Number + Number + - morale + deleteWaypoint - Checks a current morale level of the unit (-1..+1). + Removes the specified waypoint. - https://community.bistudio.com/wiki/morale + https://community.bistudio.com/wiki/deleteWaypoint - morale Object + deleteWaypoint Array - morale unit + deleteWaypoint [group, index] - $Code$morale ( leader player );//result is 0.5$/Code$ + $Code$deleteWaypoint [_grp, 2]$/Code$ - undefined / undefined + global / global + (1 Feb, 2008) + In order to change the behavior of a unit currently following a string of waypoints, it is not enough to use deleteWaypoint. The path of the unit is calculated by the waypoints present at start, and the unit will continue according to the original waypoints even if you delete them by using this command. + To achieve the wanted effect, you should rather use setWPPos to the units current position (thereby stopping the unit), and (after a small delay) use deleteWaypoint to remove the waypoints. + + (15 Nov, 2008) + Another (more foolproof) method to avoid the problem of non-deleteable waypoints is to introduce another group (createGroup) and join all units of the present group. A new group will start without any preset waypoints so you can start setting new WPs all over again. + Old group is "_combatGroup", new group is "_combatGroup2" + $Code$_combatGroup2 = createGroup EAST; + {[_x] joinSilent _combatGroup2} forEach ( units _combatGroup); + _combatGroup2 addWaypoint [ getPos player, 25];$/Code$ + + (January 04, 2011) + When you want to remove all waypoints, do NOT iterate over waypoints _group while trying to delete them (an array is by reference!). Instead use an approach like this: + $Code$ + while {( count ( waypoints _group)) 0} do + { + deleteWaypoint (( waypoints _group) select 0); + };$/Code$ - Number + Nothing + - move3DENCamera + radioChannelAdd - Moves Eden Editor camera to given position, with or without offset. - Default camera offset: [0,-25,25] + Add the units to the custom radio channel. - https://community.bistudio.com/wiki/move3DENCamera + https://community.bistudio.com/wiki/radioChannelAdd - move3DENCamera Array + Number radioChannelAdd Array - move3DENCamera [position,useOffset] + index radioChannelAdd units - $Code$move3DENCamera [ getPos player,true];$/Code$ + $Code$2 radioChannelAdd [player, unit1];$/Code$ undefined / undefined @@ -43149,29 +44630,28 @@ - Nothing + Nothing + - moveInAny + setCollisionLight - Moves unit to the first available seat in a vehicle. The order of priorities is the same order used in squad command when you order subordinates to get in vehicle to any position and is the same order used in Zeus when you drag units to a vehicle. Seat assignment seems to use the following priority logic: - driver ( moveInDriver ) - commander turret ( moveInCommander ) - gunner turret ( moveInGunner ) - remaining turrets ( moveInTurret ) - cargo ( moveInCargo ). - NOTE : This command will move player into the locked vehicle or seat just as well. + Switches collision lights of a vehicle on/off. Note that the vehicle has to be local. - https://community.bistudio.com/wiki/moveInAny + https://community.bistudio.com/wiki/setCollisionLight - Object moveInAny Object + Object setCollisionLight Boolean - unit moveInAny vehicle + vehicle setCollisionLight set - $Code$player moveInAny tank;$/Code$ + $Code$heli setCollisionLight true ;$/Code$ local / global @@ -43179,526 +44659,475 @@ - Boolean + Nothing + - moveInCargo + ctrlIDC - Move soldier into vehicle cargo position (Immediate, no animation). + Returns control IDC. - https://community.bistudio.com/wiki/moveInCargo + https://community.bistudio.com/wiki/ctrlIDC - Object moveInCargo Object - - Object moveInCargo Array + ctrlIDC Control - unitName moveInCargo vehicle - - unitName moveInCargo [vehicle, CargoIndex] + ctrlIDC control - $Code$_soldierOne moveInCargo _jeepOne;$/Code$ - - $Code$_soldierOne moveInCargo [_jeepOne, 1];$/Code$ - + - local / global + undefined / undefined - (August 4, 2006) - Notes from before the conversion - If you place a soldier in a vehicle with the moveInCargo command, he wont "know" he's in the vehicle, and thus he won't disembark properly when the vehicle reaches a Transport Unload waypoint. Therefore you have to use the assignAsCargo command, in order for the AI to catch on. Something like this: moveInCargo helo1 this assignAsCargo helo1 - MP Note Functions MoveInCargo can only be called for local soldiers. They will be ignored for remote soldiers. (see Locality in Multiplayer ) - - In OFP v1.96, the moveIn commands will not trigger an associated getIn event. To ensure the getIn event is fired, use the "getIn Cargo" action command. - - In Arma 3 when using the alternative syntax of moveInCargo, it is necessary to call assignAsCargoIndex because it is not called automatically. - $Code$unit1 moveInCargo [heli, 3]; - unit1 assignAsCargoIndex [heli, 3];$/Code$ - Alternatively avoid this broken syntax all together and use: - $Code$unit1 assignAsCargoIndex [heli, 3]; - unit1 moveInCargo heli; - $/Code$ - Nothing - Nothing + Number + - moveInCommander + ctrlIDD - Move soldier into vehicle commander position (Immediate, no animation). + Returns display IDD. - https://community.bistudio.com/wiki/moveInCommander + https://community.bistudio.com/wiki/ctrlIDD - Object moveInCommander Object + ctrlIDD Display - unitName moveInCommander vehicle + ctrlIDD display - $Code$_soldierOne moveInCommander _tankOne$/Code$ + $Code$ctrlIDD findDisplay 46; //46$/Code$ - local / global + undefined / undefined - (August 4, 2006) - Notes from before the conversion: - MP Note Functions MoveInCommander can only be called for local soldiers. They will be ignored for remote soldiers. (see Locality in Multiplayer ) - - In OFP v1.96, the moveIn commands will not trigger an associated getIn event. To ensure the getIn event is fired, use the "getIn Commander" action command. - Nothing + Number + - moveInDriver + ceil - Move soldier into vehicle driver position (Immediate, no animation). + The ceil value of x. - https://community.bistudio.com/wiki/moveInDriver + https://community.bistudio.com/wiki/ceil - Object moveInDriver Object + ceil Number - unitName moveInDriver vehicle + ceil x - $Code$_soldierOne moveInDriver _tankOne$/Code$ + $Code$ceil 5.25 + Result is 6$/Code$ + + $Code$ceil -5.25 + Result is -5$/Code$ - local / global + undefined / undefined - (August 4, 2006) - Notes from before the conversion: - MP Note Functions MoveInDriver can only be called for local soldiers. They will be ignored for remote soldiers. (see Locality in Multiplayer ) - - In OFP v1.96, the moveIn commands will not trigger an associated getIn event. To ensure the getIn event is fired, use the "getIn Driver" action command. - Nothing + Number + - moveInGunner + createTask - Move soldier into vehicle gunner position (Immediate, no animation). + Create a new AI task (subtask of parentTask). Type is name of registered task type. - https://community.bistudio.com/wiki/moveInGunner + https://community.bistudio.com/wiki/createTask - Object moveInGunner Object + Team_Member createTask Array - unitName moveInGunner vehicle + teamMember createTask [[type, parentTask], priority, name1, value1nameN, valueN] - $Code$soldierOne moveInGunner tankOne$/Code$ - + - local / global + undefined / undefined - (August 4, 2006) - Notes from before the conversion: - MP Note Functions MoveInGunner can only be called for local soldiers. They will be ignored for remote soldiers. (see Locality in Multiplayer ) - - In OFP v1.96, the moveIn commands will not trigger an associated getIn event. To ensure the getIn event is fired, use the "getIn Gunner" action command. - Nothing + Task + - moveInTurret + exit - Moves the soldier into the vehicle's turret. (Immediately, without animation). turret path is an array of positions inside a turret, or positions inside a turret of a turret. - [0] means first turret. - [0,0] means first turret of first turret. - [0,1] means second turret of first turret. - [1] means second turret. - [1,0] means first turret of the second turret. - [2,0] means first turret of third turret. - And so on... + Stops the execution of a SQS script. + It's ignored in SQF Scripts. - https://community.bistudio.com/wiki/moveInTurret + https://community.bistudio.com/wiki/exit - Object moveInTurret Array + exit - unitName moveInTurret [vehicle, turretPath] + exit - $Code$_soldierOne moveInTurret [_tank, [0, 0]]$/Code$ + $Code$exit$/Code$ - local / global + undefined / local - (March 6, 2008) - To find out which turrets are available on a vehicle, and what the syntax is, you can use this little script. - - (February 13, 2014) - Examples for nested turrets: - MainTurret = $Code$_soldierOne moveInTurret [_tank, [0]] $/Code$ - CommanderTurret = $Code$_soldierOne moveInTurret [_tank, [0, 0]] $/Code$ - ... where: - MainTurret is the standard BIS MainTurret... e.g: - $Code$class Turrets - { - class MainTurret {}; - };$/Code$ - CommanderTurret is the standard BIS CommanderTurret located on the MainTurret... e.g: - $Code$class Turrets - { - class MainTurret - { - class Turrets - { - class CommanderTurret {}; - }; - }; - };$/Code$ - - (March 18, 2014) - Here is a small function to find available turret paths for a given vehicle. It will only search 2 levels deep, hence called commonTurrets : - $Code$KK_fnc_commonTurrets = { - private ["_arr","_trts"]; - _arr = []; - _trts = configFile / "CfgVehicles" / typeOf _this / "Turrets"; - for "_i" from 0 to count _trts - 1 do { - _arr set [ count _arr, [_i]]; - for "_j" from 0 to count ( - _trts / configName (_trts select _i) / "Turrets" - ) - 1 do { - _arr set [ count _arr, [_i, _j]]; - }; - }; - _arr - };$/Code$ - Example call: - $Code$ hint str ( vehicle player call KK_fnc_commonTurrets); //[[0],[0,0]]$/Code$ - See also allTurrets - Nothing + Nothing + - moveObjectToEnd + setBleedingRemaining - Shifts an editor object to the end of the objects array. This means,that the object will be drawn last (after all other objects). - i - Some Old Editor Command + Sets for how many seconds injured unit leaves blood trail. The unit damage must be = 0.1 for this command to have an effect, otherwise, the getBleedingRemaining will return 0 and no blood trail is left behind. - https://community.bistudio.com/wiki/moveObjectToEnd + https://community.bistudio.com/wiki/setBleedingRemaining - Control moveObjectToEnd String + Object setBleedingRemaining Number - map moveObjectToEnd object + unit setBleedingRemaining time - + $Code$_unit setBleedingRemaining 60;$/Code$ + + $Code$player setDamage 0.25; + player setBleedingRemaining 120;$/Code$ + undefined / undefined - Nothing + Nothing + - moveOut + isRealTime - Moves the soldier out of vehicle, immediately, without animation. + Returns true if the mission editor is operating in real time mode. + i + Some Old Editor Command - https://community.bistudio.com/wiki/moveOut + https://community.bistudio.com/wiki/isRealTime - moveOut Object + isRealTime Control - moveOut soldier + isRealTime map - $Code${ if ( lifeState _x == "UNCONSCIOUS") then { moveOut _x}} forEach crew cursorTarget ;$/Code$ - - $Code$// Move out player just before he dies: - player addEventHandler [ - "HandleDamage", - format [ - ' if ( switch (_this select 1) do { - case "": {_this select 2 = 1}; - case "head": {_this select 2 = %1}; - case "body": {_this select 2 = %2}; - default { false }; - }) then { moveOut player }', - getNumber ( configFile "CfgFirstAid" "CriticalHeadHit"), - getNumber ( configFile "CfgFirstAid" "CriticalBodyHit") - ] - ];$/Code$ + $Code$_isRealTime = isRealTime _map$/Code$ - global / global + undefined / undefined - (September 12, 2010) - Seems to work only for unconscious - NOT for dead bodies. setPos /ATL/ASL seems to the only working for dead bodies. - Nothing + Boolean + - moveTime + driver - Returns the current time of the most important RTM animation currently being played on the soldier. + Returns the driver of a vehicle. - https://community.bistudio.com/wiki/moveTime + https://community.bistudio.com/wiki/driver - moveTime Object + driver Object - moveTime soldier + driver vehicle - $Code$moveTime player ;$/Code$ + $Code$( driver _tank) action ["getout", _tank];$/Code$ + + $Code$( driver ( vehicle player )) isEqualTo player //check if player is driver of current vehicle$/Code$ - undefined / undefined + global / undefined + (August 3, 2006) + Notes from before the conversion: + It is also possible to find the driver of a vehicle by placing a D after the name of the vehicle so Tank1D and driver Tank1 both refer to the same unit, providing the original driver has not got out of the tank. + The difference between the two is Tank1D is always the unit that was driver of the tank when the mission started, whilst driver Tank1 is the driver which is now there. - Number + Object + - moveToCompleted + doWatch - Check if latest low level moveTo command is finished. + Order the given unit(s) to watch the given position or target (without radio messages). Use objNull as the target to order a unit to stop watching a position/target. - https://community.bistudio.com/wiki/moveToCompleted + https://community.bistudio.com/wiki/doWatch - moveToCompleted Object + Object/Array doWatch Array + + Object/Array doWatch Object - moveToCompleted person + unit doWatch position + + unit doWatch target - + $Code$_soldierOne doWatch markerPos "MarkerMoveOne" + // The unit named "soldierOne" will watch the position where the marker "MarkerMoveOne" is placed.$/Code$ + + $Code$_soldierOne doWatch _eastSoldier + // The unit named "soldierOne" will watch the unit named "eastSoldier".$/Code$ + - undefined / undefined + local / global + (April 18, 2015) + Also controls where a vehicle gunner aims. - Boolean + Nothing - Nothing + - moveToFailed + ctrlMapWorldToScreen - Check if latest low level moveTo command failed. + Transfers a map control world position to screen coordinates. - https://community.bistudio.com/wiki/moveToFailed + https://community.bistudio.com/wiki/ctrlMapWorldToScreen - moveToFailed Object + Control ctrlMapWorldToScreen Position - moveToFailed person + control ctrlMapWorldToScreen position - + $Code$_screenCoord = _control ctrlMapWorldToScreen _worldCoord;$/Code$ + + $Code$_screenCoord = _control ctrlMapWorldToScreen position player ;$/Code$ + undefined / undefined + (June 16, 2010) + Notes: + It returns a 2d array with the position on the active map display. Say the return [0.5.0.5] would mean that your input 3d world position, like [500,1000], is currently at the center of the active map display. + In other words you can make the actual world position (of an object for example), relative to your active map display. - Boolean + Array + - moveTo + ppEffectCommitted - Low level command to person to move to given position. + Check whether given post process effect is committed - https://community.bistudio.com/wiki/moveTo + https://community.bistudio.com/wiki/ppEffectCommitted - Object moveTo PositionATL + ppEffectCommitted String + + ppEffectCommitted Number - person moveTo position + ppEffectCommitted effect + + ppEffectCommitted effect - + $Code$ppEffectCommitted "colorCorrection";$/Code$ + + $Code$ppEffectCommitted _hndl;$/Code$ + + $Code$if ( ppEffectCommitted "colorCorrection") then { hint "alteration done !"};$/Code$ + - local / global + undefined / undefined - (August 14, 2010) - moveTo is a low-level command used in FSM called with doFSM or commandFSM. See doFSM for more information about this. Use doMove everywhere else - even in FSM executed with execFSM. - Nothing + Boolean - Boolean + - move + setLightnings - Let group move to given position (format Position or Position2D ) without waypoint. Active waypoints will be ignored when command is used. + Changes the lightnings value smoothly during the given time (in seconds). A time of zero means there will be an immediate change. + NOTE : This command will have no effect (even though the value of lightnings changes) unless Manual Override option is selected in the editor in the Intel, which is normally off. - https://community.bistudio.com/wiki/move + https://community.bistudio.com/wiki/setLightnings - Object/Group move Array + Number setLightnings Number - group move position + time setLightnings value - $Code$_groupOne move position player ;$/Code$ + $Code$1800 setLightnings 0.7;$/Code$ - local / global + undefined / undefined - Nothing + Nothing + - musicVolume + linkItem - Checks the current music volume (set by fadeMusic ) + Create and assign item to the correct slot. If there is an item in the targeted slot, it gets replaced. - https://community.bistudio.com/wiki/musicVolume + https://community.bistudio.com/wiki/linkItem - musicVolume + Object linkItem String - musicVolume + unit linkItem item - + $Code$bluforUnit linkItem "NVGoggles"; + opforUnit linkItem "NVGoggles_OPFOR"; + independentUnit linkItem "NVGoggles_INDEP";$/Code$ + - undefined / undefined + global / global - Number + Nothing + - nMenuItems + fadeMusic - Returns the total number of user-added menu items belonging to the given menu. - i - Some Old Editor Command + Changes the music volume smoothly within the given time. - https://community.bistudio.com/wiki/nMenuItems + https://community.bistudio.com/wiki/fadeMusic - Control nMenuItems String - - Control nMenuItems Number + Number fadeMusic Number - map nMenuItems menuName - - map nMenuItems index + time fadeMusic volume - + $Code$5 fadeMusic 0$/Code$ + - undefined / undefined + undefined / local - Number - Number + Nothing + - nameSound + ctrlType - Returns the nameSound of a person. + Returns number representing the type of control, which is also defined by type property in config. For more information see Dialog Control - https://community.bistudio.com/wiki/nameSound + https://community.bistudio.com/wiki/ctrlType - nameSound Object + ctrlType Control - nameSound person + ctrlType control - $Code$nameSound player$/Code$ + $Code$_type = ctrlType _rscEdit; // 2$/Code$ undefined / undefined @@ -43706,431 +45135,379 @@ - String + Number + - name + forEachMember - When argument is Object, the command returns the name given to a unit using the setIdentity instruction or selected randomly by the game engine if setIdentity has not been used on the unit. If used on vehicle, name of first crew member (in order commander, driver, gunner). If used on an object, "Error: No unit" is being returned. - When argument is Location, the location's name is returned. To return the textual value of a location use text command instead. - NOTE: In Arma 3 setName can be used on a person to set name. However in multiplayer name always returns profileName. + Executes the given command recursively for both teams and agents that are members of the given team. For teams only use forEachMemberTeam. For agents only use forEachMemberAgent. - https://community.bistudio.com/wiki/name + https://community.bistudio.com/wiki/forEachMember - name Object - - name Location + Code forEachMember Team_Member - name object - - name location + command forEachMember team - $Code$_name = name player ;$/Code$ - - $Code$_locationName = name myLocation;$/Code$ - - $Code$name nearestLocation [ position player, "Hill"]; //"" - text nearestLocation [ position player, "Hill"]; //"Lesnoy Khrebet"$/Code$ - + undefined / undefined - Location variant appears to be only for the 3d editor. - - (August 4, 2006) - Notes from before the conversion: - Name will return an error for units that have been dead for more than a few seconds. - - (December 15, 2006) - To return the name of the unit that was given in the editor's "name" field, call up the unit's object in a format statement: - hint format["Unit's name: %1",_unitobject] - - (April 14, 2009) - Will return - Error: No vehicle - for JIP players in init.sqf, if no sleep were performed - String - String + Nothing + - nearEntities + weapons - Find entities in the sphere with given radius. If typeName(s) is (are) given, only entities of given type (or its subtype) are listed. - This command returns only alive entities. If you need to return dead entities as well use entities command. + Returns array of names of all Unit 's weapons. - https://community.bistudio.com/wiki/nearEntities + https://community.bistudio.com/wiki/weapons - Object/Array nearEntities Number - - Object/Array nearEntities Array + weapons Object - position nearEntities radius - - position nearEntities [typeName, radius] + weapons vehicleName - $Code$_list = player nearEntities 20; - _list = ( position player ) nearEntities 50; - _list = player nearEntities ["Man", 1000]; - _list = ( position player ) nearEntities ["LaserTarget", 3000]; - _list = player nearEntities [["Car", "Motorcycle", "Tank"], 50]; - _list = ( position player ) nearEntities [["Man", "Air", "Car", "Motorcycle", "Tank"], 200];$/Code$ + $Code$_wArray = weapons player ;$/Code$ - global / undefined + undefined / undefined - (27 Mar, 2014) - According to Code Optimisation, this function is the fastest and should be used instead of nearestObjects when suitable. + (12:07, 20 January 2007) + (A1 1.02) this command returns only weapons defined for the primary turret of the vehicle. + for ex. only ["D81", "PKT"] for t72, not ["D81", "PKT","DSHKM"] + + (06:01, 3 March 2007 (CET)) + weapons never returns the weapon "Throw" which all soldier units have have to throw handgrenades. You'd have to use hasWeapon to verfy it. Also handgrenades are not listed since they are magazines. Use magazines for that. + + (11 March 2011) + Use weaponsTurret to determine the weapons of a non gunner/turret position. + + (25 November 2011) + This command does not include non-turret weapons, such as smoke, flare or chaff launchers which are usually declared in the root of the vehicle's class, rather than in the Turrets hierarchy. (Unsure whether it excludes it because it is not in the turret or because these are not considered true weapons via some property.) + + (18 June 2013) + Lists also weapons in inventory from Arma 3 ver. 0.70. - Array - Array + Array + - nearObjectsReady + setApertureNew - Check whether all data are loaded to nearObjects will return in reasonable time. + Sets custom camera aperture ([-1] to do it automatically). - https://community.bistudio.com/wiki/nearObjectsReady + https://community.bistudio.com/wiki/setApertureNew - Object/Array nearObjectsReady Number + setApertureNew Array - position nearObjectsReady radius + setApertureNew [min, std, max, stdLum] - $Code$_twnpos nearObjectsReady 500;//from ALICE$/Code$ + $Code$setApertureNew [0.3, 0.2, 0.1, 1];$/Code$ + + $Code$// Simulate eye adjustment at night: + setDate [2016, 8, 10, 4, 0]; + setApertureNew [2, 8, 14,.9];$/Code$ + + $Code$// Narrower range for a subtler effect: + setDate [2016, 8, 10, 4, 0]; + setApertureNew [2, 5, 9,.8];$/Code$ - undefined / undefined + undefined / local + (October 30, 2016) + Some notes on example 2 - try it outdoors on a piece of ground with high contrasting areas. I suggest the end of a runway, standing among the white painted triangles. + Look up about 60 degrees above the horizon and toggle between setApertureNew [2, 8, 14,.9]; and the default setting of setAperture -1;. There should be little change -- at least on the date in the example. + Reset again to setApertureNew [2, 8, 14,.9]; and then pan slowly down until you're basically looking at your feet. The less sky (the main outdoor light source) you see, the 'wider' (toward the 'min' number) the aperture will become. Looking at the ground on a runway, for example, you should be able to easily distinguish the painted white triangles from the unpainted pavement. Again, toggle back to the default aperture. The view should get much darker. + This setting allows for some natural adjustment based on the amount of visible light in the scene, and is highly encouraged over the default fixed aperature for night missions. When you're standing in the beam of a lighthouse, for example (try near the 'Spartan' on Stratis), you will be basically unable to see anything not illuminated by the beam. Once the beam passes and your vision returns to normal, your immediate surroundings will be dimmer, of course, but you'll be able to see further out. - Boolean + Nothing + - nearObjects + setDamage - Find objects in a sphere with given radius. The first object in the returned array is not necessarily the closest one. If you need returned objects to be sorted by distance, use nearestObjects. If typeName is given, only objects of given type (or its subtype) are listed. + Damage / repair object. Damage 0 means fully functional, damage 1 means completely destroyed / dead. (This function is an alias of setDammage and was introduced to fix the obvious spelling error in the original function name) + Since Arma 3 v1.67 there is an alternative syntax to this command allowing to switch off destruction effects. - https://community.bistudio.com/wiki/nearObjects + https://community.bistudio.com/wiki/setDamage - Position/Position2D/Object nearObjects Number + Object setDamage Number - PositionAGL/Position2D/Object nearObjects Array + Object setDamage Array - position nearObjects radius + object setDamage damage - position nearObjects [typeName, radius] + object setDamage [damage, useEffects] - $Code$_list = position player nearObjects 50;$/Code$ - - $Code$_list = [_xpos,_ypos] nearObjects ["House", 20];$/Code$ + $Code$_soldier1 setDamage 1;$/Code$ - $Code$_list = player nearObjects 20;$/Code$ + $Code$_house1 setDamage [1, false ];$/Code$ - undefined / undefined + global / global - (June 30, 2007) - Units in vehicles are not detected via this command. - - (December 15, 2011) - In the second example, you can't omit the typeName parameter. It's required and you'll get an error if you don't supply it. Use "All" as an alternative to leaving it out. (CO 1.59) - - (January 3, 2013) - If you use the first example, it will return objects many more objects such as pollen, honeybees and crucially, triggers. Triggers will show in the returned array as "no shape" but you can use typeOf to get the classname, which will give "EmptyDetector". This will not return objects that don't have classnames such as plants, stones and some map objects like vehicle wrecks. nearestObjects will find objects without classnames. + In OFP, setting a unit's damage to a negative value will set it's health to full, but impair their aim. - (August 8, 2017) - The example 2 means that the command will include all types which inherit from the given type. As an example, when using "Helipad_Base_F", the command will detect all types of helipads (Land_HelipadSquare_F, Land_HelipadCircle_F, Land_HelipadEmpty_F, etc) in the given radius. + (May 29, 2015) + Using this possible overrides individual hit damages such as setHitPointDamage ["HitHead", _value]; if you're having issues try setting hitdamage after setdamage - Array - Array + Nothing - Nothing + - nearRoads + showNewEditorObject - Find the road segments within the circle of given radius. + Show the add editor object dialog,type is editor object type,class is,class definition to automatically select,side filters by a certain,side,pos is position to create the object. + i + Some Old Editor Command - https://community.bistudio.com/wiki/nearRoads + https://community.bistudio.com/wiki/showNewEditorObject - Object/Array nearRoads Number + Control showNewEditorObject Array - pos nearRoads radius + map showNewEditorObject [type,class,side,position] - $Code$_list = player nearRoads 50;$/Code$ - - $Code$_list = ( position _unit) nearRoads 50;$/Code$ - - $Code$_list = [1800,5700] nearRoads 50;$/Code$ - + undefined / undefined - (26 Mar, 2011) - NearRoads always gets data in the same order. In a 300 meter radius around Feruz Abad, for example, the first one is in the south-west corner and the last one is in the north-east. - Click below for picture. - [1] - Array + Any_Value + - nearSupplies + updateDrawIcon - Find supplies (weapon holders, ammo crates, fuel feeds, other units) in the sphere with given radius. + Updates the icon to be shown in 2D editor for the specified editor,object. If maintain size is false,icon will not scale depending on the,scale of the map. If maintain size is a number,the icon will maintain,size if map scale is below that number. + i + Some Old Editor Command - https://community.bistudio.com/wiki/nearSupplies + https://community.bistudio.com/wiki/updateDrawIcon - Object/Array nearSupplies Number + Control updateDrawIcon Array - origin nearSupplies radius + map updateDrawIcon [object,string identifier,color,offset,width,height,maintain size,angle,shadow] - $Code$_list = player nearSupplies 50;$/Code$ - + undefined / undefined - Array + Nothing + - nearTargets + setMarkerAlpha - Returns a list of targets within the defined range. "Targets" are not restricted to enemy units. + Sets the marker alpha. The marker is modified on all computers in a network session. + When alpha equals 1, the marker is visible, but if alpha equals 0, then the marker is invisible. + Alpha can be numbers and fractions. - https://community.bistudio.com/wiki/nearTargets + https://community.bistudio.com/wiki/setMarkerAlpha - Object nearTargets Number + String setMarkerAlpha Number - unit nearTargets range + marker setMarkerAlpha alpha - $Code$player nearTargets 100; - // could return something like this: - //[[[2555.33,2535.33,1.32708],"SoldierEB",EAST,214222,EAST 1-1-A:1],[[2550.39,2482.5,1.32696],"SoldierWB",WEST,0,WEST 1-1-A:2]]$/Code$ + $Code$"my_marker" setMarkerAlpha 0.5;$/Code$ + + $Code$"enemy_convoy_marker" setMarkerAlpha 0;$/Code$ - undefined / undefined + undefined / global - (Febuary 17, 2011) - A subjective cost greater than 0 does not necessarily mean the target is an enemy unit. Any unit, that have yet to be identified by the unit, have a small positive cost in the range 0 to 1. - - (January 15, 2012) - The quality/detail level of the info depends on the knowsAbout value of the sourceUnit about the targetUnit: - For infantry: - ] 0, 1.5 [ - side unknown, some position offset, identified as SoldierWB - [ 1.5, 1.6 [ - side identified, subjective cost set - [ 1.6, 2 [ - type identified better (USMC_Soldier_Base) - [ 2, 3.6 [ - type identified precisely (USMC_Soldier) - [ 3.6, 4 ] - position identified precisely - The values seems closely linked to the accuracy value of the given targetUnit class and its parents up in the config tree: - 0class CAManBase: Man - 1.6class SoldierWB: CAManBase - 2class USMC_Soldier_Base: SoldierWB - 3.9class USMC_Soldier: USMC_Soldier_Base - For tanks: - ] 0, 0.03 [ - side unknown, some position offset, identified as LandVehicle - [ 0.03, 0.13 [ - type identified better (Tank) - [ 0.13, 0.3 [ - type identified better (M1A1) - [ 0.3, 1.5 [ - side identified, subjective cost set - [ 1.5, 3.6 [ - side identified precisely (CIV), subjective cost adjusted - [ 3.6, 4 ] - position identified precisely - The values seems closely linked to the accuracy value of the given targetUnit class and its parents up in the config tree: - 0class All - class AllVehicles: All - 0.0005class Land: AllVehicles - 0.02class LandVehicle: Land - 0.12class Tank: LandVehicle - 0.25class M1A1: Tank - - (January 17, 2012) - When an unit dies, it's nearTargets array gets emptied after some seconds. - When an unit dies, its reference will get removed from other units nearTargets' arrays immediately. - A target will be removed from the array after about 360 seconds without contact. - - (January 21, 2012) - Position accuracy seems to be a radius in meters from the perceived position. - Array + Nothing + - nearestBuilding + menuValue - Finds the nearest building to a given object or position. A "building" is defined as an object that is of class "House" and contains a path LOD. + Returns current value set in menu entry on given path. - https://community.bistudio.com/wiki/nearestBuilding + https://community.bistudio.com/wiki/menuValue - nearestBuilding Object/Array + menuValue Array - nearestBuilding position + menuValue [idc, path] - $Code$_nBuilding = nearestBuilding player ;$/Code$ - - $Code$_nBuilding = nearestBuilding position player ;$/Code$ - + undefined / undefined - (February 18, 2016) - This command doesn't return any house or building placed in editor (with createVehicle ). Use nearestObjects instead: - $Code$ nearestObjects [ player, ["House", "Building"], 50] select 0$/Code$ - Object + Number + - nearestLocationWithDubbing + diag_mergeConfigFile - Find the nearest location (to the given position) having it speech non-empty. + Adjust configs on-the-fly without the need of restarting the game (by merging the given config file into the main config in memory). Location is relative to the Userdir (default) or mission directory depending on the the value of UserDir [FileName,UserDir]. + Doesn't work with cfgAmmo & few other classes. (Since 1.69, cfgAmmo should be mergeable!) Merging config file means also that you can't delete parameters through diag_mergeConfigFile. Changes applied by diag_mergeConfigFile are applied to all new entities so restart of mission is not necessarily required - spawning vehicle again or changing back forth weapon should usually do the trick. + Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. - https://community.bistudio.com/wiki/nearestLocationWithDubbing + https://community.bistudio.com/wiki/diag_mergeConfigFile - nearestLocationWithDubbing Object/Array + diag_mergeConfigFile Array - nearestLocationWithDubbing position + diag_mergeConfigFile [PathToConfigOnDrive] - + $Code$diag_mergeConfigFile ["O:\Arma3\A3\Stuff_F\config.cpp"]$/Code$ + undefined / undefined - Location + Nothing + - nearestLocation + enableEnvironment - Return the closest location of specified class to a given position. Checked range is unlimited (i.e. covers the whole map). + Enable/disable environmental effects: ambient life and/or ambient sound. - https://community.bistudio.com/wiki/nearestLocation + https://community.bistudio.com/wiki/enableEnvironment - nearestLocation Array + enableEnvironment Boolean + + enableEnvironment Array - nearestLocation [position, locationClass] + enableEnvironment enabled + + enableEnvironment [ambientLife, ambientSound] - $Code$_nearestCity = nearestLocation [ getPos player, "nameCity"];$/Code$ + $Code$enableEnvironment false ;$/Code$ - $Code$_anyNearestLocation = nearestLocation [ player, ""];$/Code$ + $Code$enableEnvironment [ false, true ];$/Code$ undefined / undefined + (28 October, 2013) + This command has to be executed after mission start to have an effect. So if you add this command in init.sqf make sure you wait until mission is running: + $Code$//init.sqf + waitUntil { time 0}; + enableEnvironment false ;$/Code$ + + (October 23, 2017) + NOTE: Disabling ambient life will remove generation of anything that is coming from AmbientA3 map class (see Ambient System ). That means removing not only bees and cicadas around a player, but rabbits, snakes, seagulls and all the fish in the sea. - Location + Nothing - Nothing + - nearestLocations + allSimpleObjects - Returns an array of locations of chosen type(s) within the given radius of the given position, sorted from nearest to farthest. + Returns array of all simple objects that belong to the listed class names. If the array of types is empty [], all simple objects are returned including those without class name. NOTE : There is no inheritance in simple objects, so only exact class match is allowed. className is not case sensitive. - https://community.bistudio.com/wiki/nearestLocations + https://community.bistudio.com/wiki/allSimpleObjects - nearestLocations Array + allSimpleObjects Array - nearestLocations [position, [locationType,], radius, sortPosition] + allSimpleObjects [className1, className2,classNameN] - $Code$_nearbyLocations = nearestLocations [ position player, ["RockArea","VegetationFir"], 100];$/Code$ + $Code$allSimpleObjects ["Box_NATO_Equip_F", "Land_CampingChair_V2_F"];$/Code$ - $Code$// Find any of nearest locations: - allLocationTypes = []; - "allLocationTypes pushBack configName _x" configClasses ( - configFile "CfgLocationTypes" - ); - { - systemChat format [ - "%1 (%2) - %3m", - _x, - text _x, - position player distance _x - ]; - } forEach nearestLocations [ player, allLocationTypes, 500];$/Code$ + $Code$_allSimpleObjects = allSimpleObjects [];$/Code$ undefined / undefined @@ -44138,148 +45515,61 @@ - Array + Array + - nearestObjects + mapGridPosition - Returns a list of nearest objects of the given types to the given position or object, within the specified distance. If more than one object is found they will be ordered by proximity, the closest one will be first in the array. Alternatively, you use nearObjects command, which doesn't sort results. - position can use the format: - [[x,y,z], ["ClassName",...], radius] - or - [object, ["ClassName",...], radius] - To use it without any ClassName filter: - [object or position, [], radius]. - A list of ClassName types (Tanks eg) can be found in CfgVehicles - Since Arma 3 v1.65.138818 it is possible to switch search and sorting mode between 2D and 3D + Returns the map grid position of an object or position. The format is determined by the Grid format specified in the CfgWorlds for the current world. Eg: "024577" or "De82" or similar. - https://community.bistudio.com/wiki/nearestObjects + https://community.bistudio.com/wiki/mapGridPosition - nearestObjects Array + mapGridPosition Object/Position - nearestObjects [position, types, radius, 2Dmode] + mapGridPosition param - $Code$nearestObjects [ player, ["Car","Tank"], 200];$/Code$ - - $Code$nearestObjects [ player, ["house"], 200];$/Code$ - - $Code$nearestObjects [[2716,2949,0], ["Car","Truck"], 100];$/Code$ + $Code$_gridPos = mapGridPosition player$/Code$ - $Code$// Return every object in 50 metres radius around player: - nearestObjects [ player, [], 50]$/Code$ + $Code$_gridPos = mapGridPosition getPos player$/Code$ undefined / undefined - (unknown) - To get a list with alive targets for various situations use this construct: - $Code$_nearestTargets = nearestObjects [_submunScanPos, ["VBS2_TANK","TANK"], _scanArea]; - _validNearestTargets = []; - { if ( alive _x) then {_validNearestTargets set [( count _validNearestTargets),_x];};} forEach _nearestTargets; - $/Code$ - results in _validNearestTargets being filled with targets == alive.. (you could use other conditions there, of course!) - -- Vigilante - - (10. Aug. 2010) - Passing an empty array to define the types will also return objects with no class at all (such as trees, bushes, stones,...). - Example: - $Code$_objects = nearestObjects [_position, [], _radius];$/Code$ - Passing the array ["All"] is not the same and will only return objects that have some sort of class. - - (11.09.2013) - If you want to detect nearby grenades for the position of a unit, for example, using 'nearestObjects' won't work. You have to use - 'nearObjects' instead. - $Code$ count ( nearestObjects [_unit, ["GrenadeHand"], 30]) // WON'T WORK$/Code$ - Won't ever return anything but 0. - $Code$ count (_unit nearObjects ["GrenadeHand", 30]) // WORKS!$/Code$ - Will work. - - (March 22, 2014) - The distance from which an object is determined to be inside the radius is calculated from its model center (object modelToWorld [0,0,0]), and not the position returned by getPos/ATL/ASL. If an object is used as the origin from which to scan, distance is calculated from its model center as well. - - (October 26, 2014) - Return all trees in 100m radius around player: - $Code$trees = []; - { - if ( str _x find ": t_" -1) then { - trees pushBack _x; - }; - } forEach nearestObjects [ player, [], 100];$/Code$ - - (August 27, 2015) - If you use "Man" as the class to look for, it will only find dismounted men. IE, men in vehicles will NOT be found. - - (January 8, 2016) - The first call to this command can take significantly longer then consecutive calls. But even after the objects in given radius were cached, the sorting this command performs could be quite expensive. For example to sort ~7000 object it might take up to 100ms. For performance reasons you can use nearObjects instead, which is basically the same command but without added sorting. - - (March 2, 2016) - In Arma 3, nearestObjects is partially broken and is unable to return nearby placed explosive charges or mines when searching by classnames. Use nearObjects, nearestObject or allMines instead. - Example of non-functional code: - $Code$//always returns nothing, even if there are objects that should be returned - nearestObjects [position player, ["APERSMine_Range_Ammo", "SatchelCharge_Remote_Ammo"], 10]$/Code$ - - (October 31, 2016) - Since Arma 3 v1.65.138818 the default sorting is done according to 3D distance not distance2D as before. This is an attempt to correct some very old bug in implementation. - Array + String + - nearestObject + setObjectProxy - Returns the nearest object of given type to given position within a sphere. Hardcoded radius is 50 meters. Unlike with nearestObjects, where distance is measured in 2D space, nearestObject will be closest object in 3D space. - If object class type is used, any object derived from the type is found as well (In OFP however, only objects with exactly the type given are found). If object ID passed as an argument (as in example 2) the search range is unlimited. + Set the proxy object associated with the given editor object. + i + Some Old Editor Command - https://community.bistudio.com/wiki/nearestObject + https://community.bistudio.com/wiki/setObjectProxy - nearestObject Array - - nearestObject Position3D/Position2D/Object - - Position3D/Position2D nearestObject String - - Position3D/Position2D nearestObject Number + Control setObjectProxy Array - nearestObject [position, type] - - nearestObject position - - position nearestObject type - - position nearestObject id + map setObjectProxy [object,proxy object] - $Code$_nObject = nearestObject [2345,6789]; - _nObject = nearestObject [ player, "StreetLamp"];$/Code$ - - $Code$// Return the object with ID 123456: - _nObject = [0,0,0] nearestObject 123456;$/Code$ - - $Code$_nObject = getPos player nearestObject "StreetLamp";$/Code$ - - $Code$// Return the nearest object with ( typeOf _nObject == "#XXXX") - #mark, #slop, etc. Unlimited search range: - _nObject = _position nearestObject -1; - // Return the nearest object with ( typeOf _nObject != ""). Search range is 50m:_nObject = nearestObject _position;$/Code$ - - $Code$// (See also allMissionObjects ): - _blood = nearestObject [ player, "#slop"]; - _step = nearestObject [ player, "#mark"]; - _track = nearestObject [ player, "#track"]; - _crater = nearestObject [ player, "#crater"];$/Code$ + $Code$_map setObjectProxy ["_group_0", vehicle (leader _group)];$/Code$ undefined / undefined @@ -44287,244 +45577,229 @@ - Object - Object - Object - Object + Nothing + - nearestTerrainObjects + local - Returns a list of nearest terrain objects of the given types to the given position or object, within the specified distance. If more than one object is found they will be ordered according to 3D distance to the object (i.e. the closest one will be first in the array). - In contrast to nearestObjects this command returns terrain placed objects like trees, rocks and buildings which don't necessarily need an associated config class. - position can use the format: - [[x,y,z], ["Type",...], radius] - or - [object, ["Type",...], radius] - To use it without any type filter: - [object or position, [], radius] - Possible type names: "TREE", "SMALL TREE", "BUSH", "BUILDING", "HOUSE", "FOREST BORDER", "FOREST TRIANGLE", "FOREST SQUARE", "CHURCH", "CHAPEL", "CROSS", "BUNKER", "FORTRESS", "FOUNTAIN", "VIEW-TOWER", "LIGHTHOUSE", "QUAY", "FUELSTATION", "HOSPITAL", "FENCE", "WALL", "HIDE", "BUSSTOP", "ROAD", "FOREST", "TRANSMITTER", "STACK", "RUIN", "TOURISM", "WATERTOWER", "TRACK", "MAIN ROAD", "ROCK", "ROCKS", "POWER LINES", "RAILWAY", "POWERSOLAR", "POWERWAVE", "POWERWIND", "SHIPWRECK", "TRAIL" - Since Arma 3 v1.61.136035 it is possible to switch the sorting algorithm off by providing optional param, which significantly increases the performance of this command, especially if the search is performed with large radius. - Since Arma 3 v1.65.138818 it is possible to switch search and sorting mode between 2D and 3D + Check if given unit is local on the computer in Multiplayer games (see Locality in Multiplayer for general concepts). + This can be used when some activation fields or scripts need to be performed only on one computer. In Single player all objects are local. + Note1: Map created objects (those placed in Visitor ) are local everywhere. + Note2: Since Arma 3 v1.53.132932 keyword local has been renamed to private for consistency and to avoid any confusion. However, this just makes the third example obsolete. It's core functionality still remains. - https://community.bistudio.com/wiki/nearestTerrainObjects + https://community.bistudio.com/wiki/local - nearestTerrainObjects Array + local Object/Group - nearestTerrainObjects [position, types, radius, sort, 2Dmode] + local object - $Code$nearestTerrainObjects [ player, ["Tree","Bush"], 200];$/Code$ - - $Code$nearestTerrainObjects [ player, ["House"], 200];$/Code$ - - $Code$nearestTerrainObjects [[2716,2949,0], ["Chapel","Fuelstation"], 100];$/Code$ - - $Code$// Return every terrain object in 50 metres radius around player sorted, closest first: - nearestTerrainObjects [ player, [], 50]$/Code$ - - $Code$// Return every terrain object in 50 metres radius around player unsorted: - nearestTerrainObjects [ player, [], 50, false ]$/Code$ + $Code$// SQS: + ?! local _unitName : hint "remote"$/Code$ - $Code$// Hide all terrain objects command could find: - if ( isServer ) then - { - { - _x hideObjectGlobal true ; - } - forEach nearestTerrainObjects - [ - [ worldSize /2, worldSize /2], - [], - worldSize, - false - ]; + $Code$// SQF: + if (! local _unitName) then { + hint "remote"; };$/Code$ + + $Code$_isLocalGroup = local group _unit;$/Code$ - undefined / undefined + global / undefined - (October 31, 2016) - Since Arma 3 v1.65.138818 the default sorting is done according to 3D distance not distance2D as before. This is an attempt to correct some very old bug in implementation. - - (December 28, 2016) - Be aware that some terrain objects types might be tricky to be found, such as terrain rocks and boulders which are not considered to be "ROCKS" or "ROCK", but "HIDE". Example: - $Code$nearestTerrainObjects [player, ["HIDE"], 20]; // [939688: bluntstone_01.p3d,939691: garbagebags_f.p3d,939671: wreck_car_f.p3d,939692: junkpile_f.p3d] - $/Code$ + (August 4, 2006) + Notes from before the conversion: + In multiplayer, a game logic will always be local to the host computer. This works on both dedicated and player-hosted servers. - Array + Boolean + - needReload + crew - Return how much vehicle wants to reload its weapons. + Returns the crew (both dead and alive) of the given vehicle. - https://community.bistudio.com/wiki/needReload + https://community.bistudio.com/wiki/crew - needReload Object + crew Object - needReload vehicle + crew vehicleName - $Code$_seriousness = needReload _vehicle;$/Code$ - - $Code$if ( needReload player == 1) then { reload player };$/Code$ + $Code$player in ( crew _tank);$/Code$ - undefined / undefined + global / undefined + (3 February, 2010) + The crew command will return crew in order [driver,gunner,commander,turrets,cargo] + + (1 June, 2014) + The crew command will return an empty array if the object has no crew - this includes objects that can't hold crew. If used on a unit (man, module, etc.) it will return an array containing that unit. - Number + Array + - netId + ctRemoveRows - Unique ID of object or group. As this command is MP only, you can use BIS_fnc_netId, which extends the use to SP as well. See also: BIS_fnc_objectVar + Takes array of row indices as a parameter and removes rows with those indices. Indices of remaining rows will be recomputed. - https://community.bistudio.com/wiki/netId + https://community.bistudio.com/wiki/ctRemoveRows - netId Object/Group + Control ctRemoveRows Array - netId var + Control ctRemoveRows Array - $Code$_playerNetId = netId player ;$/Code$ + $Code$_control ctRemoveRows [0, 1, 2];$/Code$ - undefined / undefined + local / local - String + Nothing + - netObjNull + getWeaponCargo - A non existing network object. Not used in scripting anywhere in game. + Returns all weapons types and count from the cargo space - https://community.bistudio.com/wiki/netObjNull + https://community.bistudio.com/wiki/getWeaponCargo - netObjNull + getWeaponCargo Object - netObjNull + getWeaponCargo object - $Code$netObjNull == netObjNull // Returns false$/Code$ + $Code$_content = getWeaponCargo carName;$/Code$ - $Code$netObjNull isEqualTo netObjNull // Returns true$/Code$ + $Code$_content = getWeaponCargo ammoBoxName; + // Sample result returns: + [["arifle_Katiba_F","launch_B_Titan_short_F"],[2,1]]$/Code$ - undefined / undefined + global / undefined - NetObject + Array + - newOverlay + isOnRoad - Creates the new overlay dialog for the specified type of overlay. - i - Some Old Editor Command + Checks if given position is on road. Same as roadAt, only return is boolean instead of road object. - https://community.bistudio.com/wiki/newOverlay + https://community.bistudio.com/wiki/isOnRoad - Control newOverlay Config + isOnRoad Object/Array - map newOverlay config + isOnRoad position - + $Code$_objOnRoad = isOnRoad player ;$/Code$ + + $Code$_posOnRoad = isOnRoad ASLToAGL getPosASL player ;$/Code$ + - undefined / undefined + global / undefined + (November 24, 2017) + Some roadobjects will return false when using this command. invisibleroadway_square_f.p3d is found by the nearRoads command, yet will return false for isOnRoad. - Nothing + Boolean + - nextMenuItemIndex + camPreload - Returns the next available menu item index. - i - Some Old Editor Command + Preload the scene for the prepared camera. Time gives timeout, zero means no (infinite) timeout. - https://community.bistudio.com/wiki/nextMenuItemIndex + https://community.bistudio.com/wiki/camPreload - nextMenuItemIndex Control + Object camPreload Number - nextMenuItemIndex map + camera camPreload time - + $Code$_camera camPreload 5$/Code$ + undefined / undefined - Number + Nothing + - nextWeatherChange + attachedObject - Return the remaining time (in seconds) over which the current weather change will occur. - When a weather change finishes, the game engine will automatically generate a new random weather change over a realistic time period (minimum of 90 minutes). + Returns the object a location is attached to. If the location is unattached, then objNull is returned. - https://community.bistudio.com/wiki/nextWeatherChange + https://community.bistudio.com/wiki/attachedObject - nextWeatherChange + attachedObject Location - nextWeatherChange + attachedObject location - $Code$_seconds = nextWeatherChange ;$/Code$ + $Code$_locAttachedObj = attachedObject myLocation;$/Code$ undefined / undefined @@ -44532,99 +45807,115 @@ - Number + Object + - nil + joinSilent - Nil value. This value can be used to undefine existing variables. + Join all units in the array to given group silently (without radio message). To have a group member leave a group, join him with the grpNull group (e.g. [guy1] joinSilent grpNull ), but beware, as brand new group is created for the leaving unit and this could result in the number of groups in a mission growing out of control. - https://community.bistudio.com/wiki/nil + https://community.bistudio.com/wiki/joinSilent - nil + Array joinSilent Object/Group - nil + unitArray joinSilent group - $Code$variableToDestroy = nil ;$/Code$ + $Code$[_unitOne, _unitTwo] joinSilent ( group player );$/Code$ + + $Code$[_unitOne, _unitTwo] joinSilent player ;$/Code$ - undefined / undefined + global / global - Note that ArrayName = nil destroys the arrayNAME not the array content. - Array content is 'destroyed' when no more ArrayName s refer to the content. - - Never ever assign a value to nil ! - Doing so creates a global variable with the same name that overrides the "command" nil : - foo = "foo"; - nil = "bar"; - foo = nil; - hint foo; // displays "bar" - - (September 25, 2014) - While isNil isn't available in OFP/CWA you can easily emulate it with something like this: - _nil = format["%1",_nilstring]; - ?(format["%1",foo]==_nil): foo = "Hello World!" + (August 4, 2014) + If all units of a group are joined to another group then the first group will be NULL-group afterward. - Void + Nothing + - not + loadFile - not a. - Exactly the same as ! a + Return content of given filename. - https://community.bistudio.com/wiki/not + https://community.bistudio.com/wiki/loadFile - not Number + loadFile String - not a + loadFile filename - $Code$not false - // Result is true.$/Code$ + $Code$_contents = loadFile "myFunction.sqf";$/Code$ - undefined / undefined + undefined / local + (28 November 2006) + In Armed Assault, the 'loadfile' command must be preceded by the 'compile' command to work. + Ex OFP 1.96: _falarmEvent = loadfile ("syswarn\falarmEvent.sqf") + Ex ArmA 1.0: _falarmEvent = compile loadfile ("syswarn\falarmEvent.sqf") + + (11 July 2007) + The note by Pennywise is not entirely accurate. loadFile only needs to be preceded with compile when loading code (for example, a function contained in an.sqf file ). Using loadFile without compile will return a string, which, in some cases, is exactly what you want. + + (02 December 2012) + Please note that any comment you have within the file you load will be included, to get around that use preprocessFile instead. + + (25 January 2016) + Notice that you will have to activate file patching via -filePatching [ [1] ]. Otherwise, execVM and loadFile will *not* load any files outside your mission folder (like the global scripts). For more info see CMA:DevelopmentSetup (since Arma 3 1.49+). - Boolean + String + - numberToDate + failMission - Convert float number to a date. + Finish the mission. If the server is set to run persistent mission, failMission will not end the mission when last player gets kicked to the lobby. Use endMission to end the mission. + The end type can be: + "CONTINUE" + "KILLED" + "LOSER" + "END1" + "END2" + "END3" + "END4" + "END5" + "END6" + Mission saves won't be deleted. + To maintain Arma 3 visual style, it's recommended to use BIS_fnc_endMission instead. - https://community.bistudio.com/wiki/numberToDate + https://community.bistudio.com/wiki/failMission - numberToDate Array + failMission String - numberToDate [year,time] + failMission endtype - $Code$_date = numberToDate [2008,0.5324]; //[2008,7,13,7,49]$/Code$ + $Code$failMission "LOSER";$/Code$ undefined / undefined @@ -44632,36 +45923,28 @@ - Array + Nothing + - objNull + enginesIsOnRTD - A non-existent Object. To compare non-existent objects use isNull or isEqualTo : - objNull == objNull ; // false - isNull objNull ; // true - objNull isEqualTo objNull ; // true + Returns which engines are producing some work. - https://community.bistudio.com/wiki/objNull + https://community.bistudio.com/wiki/enginesIsOnRTD - objNull + enginesIsOnRTD Object - objNull + enginesIsOnRTD RTD_helicopter - $Code$player == player ; // false if player is null$/Code$ - - $Code$isNull player ; // true if player is null$/Code$ - - $Code$str objNull // NULL-object$/Code$ - - $Code$position objNull // [0,0,0]$/Code$ + $Code$_enginesTaru = enginesIsOnRTD _taru// Returns [true,true]$/Code$ undefined / undefined @@ -44669,129 +45952,162 @@ - Object + Array + - objStatus + ppEffectCreate - Sets the status of an objective that was defined in briefing.html. - Status may be one of: - "ACTIVE" - "FAILED" - "DONE" - "HIDDEN" - To refer to an objective that is named "OBJ_1", for example, use only the index number in this command (i.e. "1" objStatus "HIDDEN"). + Creates Post process effects specified by effect name and priority. Supported effects are: + "RadialBlur" + "ChromAberration" + "WetDistortion" + "ColorCorrections" + "DynamicBlur" + "FilmGrain" + "ColorInversion" - https://community.bistudio.com/wiki/objStatus + https://community.bistudio.com/wiki/ppEffectCreate - String objStatus String + ppEffectCreate Array - objectivenumber objStatus status + ppEffectCreate [name, priority] + + ppEffectCreate [[name1, priority1],] - $Code$"1" objStatus "DONE" - Marks the objective named "OBJ_1" as completed.$/Code$ + $Code$_ppGrain = ppEffectCreate ["filmGrain", 2005];$/Code$ undefined / undefined + (July 24, 2015) + "wetDistortion" only works if handle is used. Arma 3 (1.48.131561) - Nothing + Number + - objectCurators + sliderRange - Returns array with all curators which can edit given object. + Return limits, as an Array [min, max] of slider idc of topmost user dialog. - https://community.bistudio.com/wiki/objectCurators + https://community.bistudio.com/wiki/sliderRange - objectCurators Object + sliderRange Number + + sliderRange Control - objectCurators obj + sliderRange idc + + sliderRange control - + $Code$_slidelimits1 = sliderRange 105;$/Code$ + undefined / undefined - Array + Array - Array + - objectFromNetId + vectorDistanceSqr - Get object with given unique ID. If object is a group use groupFromNetId. As this command is MP only, you can use BIS_fnc_objectFromNetId, which extends the use to SP as well. + Squared distance between two 3D vectors. - https://community.bistudio.com/wiki/objectFromNetId + https://community.bistudio.com/wiki/vectorDistanceSqr - objectFromNetId String + Array vectorDistanceSqr Array - objectFromNetId id + vector1 vectorDistanceSqr vector2 - $Code$objectFromNetId "2:3"$/Code$ + $Code$_distSqr = getPos player vectorDistanceSqr [0,0,2];$/Code$ undefined / undefined + (28 Jun, 2014) + (ArmA3 1.22)Algorithm: + $Code$ + Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; + Result = (x2 - x1) ^ 2 + (y2 - y1) ^ 2 + (z2 - z1) ^ 2; + $/Code$ - Object + Number + - objectParent + gearSlotData - Returns parent of an object if the object is proxy, otherwise objNull. In case of backpack, the parent is a weaponholder or a cargo space of a vehicle or the unit carrying it. Unit in a vehicle will return the vehicle as parent. - Another good use of objectParent is when a static weapon is known and one needs to check if it is assembled or not. objectParent _staticWeapon will return objNull if weapon is unpacked, or backpack object if packed. + Returns gear slot item name. - https://community.bistudio.com/wiki/objectParent + https://community.bistudio.com/wiki/gearSlotData - objectParent Object + gearSlotData Control - objectParent object + gearSlotData control - $Code$_weaponholder = objectParent _mybackpack;$/Code$ - - $Code$// Create and place created backpack in front of player: - _backpackContainer = "B_TacticalPack_rgr" createVehicle [0,0,0]; - _weaponHolder = objectParent _backpackContainer; - _weaponHolder setPos ( player modelToWorld [0,5,0]);$/Code$ - - $Code$// Check if player is on foot: - _isOnFoot = isNull objectParent player ;$/Code$ - - $Code$// Detect if player is in commander turret of a vehicle: - _isVehicleCommander = player isEqualTo commander objectParent player ;$/Code$ + $Code$Open any ammobox and click by any gear slots + private "_dspl"; + disableSerialization; + waitUntil { + _dspl = findDisplay 106; + ! isNull _dspl; + }; + uiNamespace setVariable ["/VDMJ/RscDisplayGear/SlotDataEH", { + _self = _this select 0; + _weaponName = gearSlotData _self; + _conf = configFile _confSection _weaponName; + _name = getText(_conf "displayName"); + _desc = getText(_conf "Library" "libTextDesc"); + _image = getText(_conf "picture"); + hint parseText format[ + ' t size="1.3" align="center" shadow="true" shadowColor="#000000" %1 /t br / img image="%2" size="6" align="center" / br / %3 br / %4', + _name, _image, _desc + ]; + }]; + for "_i" from 107 to 145 do { + _dspl displayCtrl _i ctrlAddEventHandler ["ButtonClick", + format [ + '_confSection = "%1"; _this call (uiNamespace getVariable "/VDMJ/RscDisplayGear/SlotDataEH");', + if( _i = 109 && _i = 129 ) then { "CfgMagazines" } else { "CfgWeapons" } + ] + ]; + };$/Code$ undefined / undefined @@ -44799,115 +46115,148 @@ - Object + String + - onBriefingGroup + lbAdd - Select a sound declared in the Description.ext of the mission to be played the first time the Group tab is selected in the briefing. + Adds an item with the given text to the listbox or combobox with id idc of the topmost user dialog. + It returns the index of the newly added item. - https://community.bistudio.com/wiki/onBriefingGroup + https://community.bistudio.com/wiki/lbAdd - onBriefingGroup String + lbAdd Array + + Control lbAdd String - onBriefingGroup soundName + lbAdd [idc, text] + + control lbAdd text - $Code$onBriefingGroup "GroupVoiceOver"$/Code$ + $Code$_index = lbAdd [101, "First item"];$/Code$ + + $Code$_index = _control lbAdd "First item";$/Code$ - undefined / undefined + local / local - - - Nothing + More information on the LB command family can be found here + + (April 12, 2015) + This command can be very very frustrating to use because it does not output any errors if unable to function. + Often, the 2nd provided syntax needs to be used like this: + $Code$_giveYourControlAname = (findDisplay 7) displayCtrl 9; + _addThisToListBox = "Option"; + _giveYourControlAname lbAdd _addThisToListBox;$/Code$ + Where "7" is the "idd" of the dialog you made in your ".hpp" file and where "9" is the "idc" of the RscListBox or RscComboBox. + The code above will add an option named "Option" to the ListBox or ComboBox. + + + Number - Number + - onBriefingNotes + waypointCombatMode - Select a sound declared in the Description.ext of the mission to be played the first time the Notes tab is selected in the briefing. + Gets the waypoint combat mode. - https://community.bistudio.com/wiki/onBriefingNotes + https://community.bistudio.com/wiki/waypointCombatMode - onBriefingNotes String + waypointCombatMode Array - onBriefingNotes soundName + waypointCombatMode waypoint - $Code$onBriefingNotes "NotesVoiceOver";$/Code$ + $Code$waypointCombatMode [groupOne,1]$/Code$ undefined / undefined - (8 Feb, 2007) - In OFP it works only with the sound files defined in the mission's description.ext - Nothing + String + - onBriefingPlan + deleteLocation - Select a sound declared in the Description.ext of the mission to be played the first time the Plan tab is selected in the briefing. + Delete a location. - https://community.bistudio.com/wiki/onBriefingPlan + https://community.bistudio.com/wiki/deleteLocation - onBriefingPlan String + deleteLocation Location - onBriefingPlan soundName + deleteLocation location - $Code$onBriefingPlan "PlanVoiceOver"$/Code$ + $Code$deleteLocation myLocation$/Code$ undefined / undefined - (January 20, 2007) - In OFP 1.96 only sound files defined in the mission description can be played in this way. - Nothing + Nothing + - onBriefingTeamSwitch + onHCGroupSelectionChanged - Select a sound declared in the Description.ext of the mission to be played the first time the TeamSwitch tab is selected in the briefing. + Defines an action performed when high command group selection has been changed. + Command receives 2 variables: + _group: Group - last selected/deselected group + _isSelected: Boolean - new selection state of the specific group + The code is executed on every hc group selection change until it is + removed via $Code$ onHCGroupSelectionChanged "";$/Code$ or $Code$ onHCGroupSelectionChanged {};$/Code$ + or replaced by $Code$ onHCGroupSelectionChanged "SomeOtherCommand(s)";$/Code$ or $Code$ onHCGroupSelectionChanged {SomeOtherCommand(s)};$/Code$ + i + Since Arma 3 v1.57 a stackable version of this EH is available: HCGroupSelectionChanged - https://community.bistudio.com/wiki/onBriefingTeamSwitch + https://community.bistudio.com/wiki/onHCGroupSelectionChanged - onBriefingTeamSwitch String + onHCGroupSelectionChanged String/Code - onBriefingTeamSwitch soundName + onHCGroupSelectionChanged command - $Code$onBriefingTeamSwitch "TeamSwitchVoiceOver"$/Code$ + $Code$onHCGroupSelectionChanged { + if (_isSelected) then { + hint format ["Group %1 has been selected.", _group]; + } else { + hint format ["Group %1 has been deselected.", _group]; + }; + };$/Code$ + + $Code$onHCGroupSelectionChanged " player globalChat 'HC group selection has been changed.';";$/Code$ undefined / undefined @@ -44915,154 +46264,118 @@ - Nothing + Nothing + - onCommandModeChanged + getItemCargo - Defines code performed when hc command mode changes either because of (Left Ctrl + Space) shortcut or hcShowBar scripting command. Groups hc mode must contain at least one group for this command to work (see High Command ). Attached code receives _isHighCommand boolean. - i - Since Arma 3 v1.57 a stackable version of this EH is available: CommandModeChanged + Returns all items names and count from ammo box (or any general weapon holder container). - https://community.bistudio.com/wiki/onCommandModeChanged + https://community.bistudio.com/wiki/getItemCargo - onCommandModeChanged Code/String + getItemCargo Object - onCommandModeChanged code + getItemCargo box - $Code$//Examples in-use can be found in: - //ca\modules\HC\data\scripts\HC_GUI.sqf - //A3\modules_f\HC\data\scripts\HC_GUI.sqf$/Code$ + $Code$hint str getItemCargo cursorTarget ;$/Code$ - undefined / undefined + global / undefined - Nothing + Array + - onDoubleClick + lookAtPos - Defines an action performed when the user double clicks on the map. Command receives:,_pos array position,_units array selected units,_shift,_alt bool key state + Center the map on,and point the camera at,the position. i Some Old Editor Command - https://community.bistudio.com/wiki/onDoubleClick + https://community.bistudio.com/wiki/lookAtPos - Control onDoubleClick String + Control lookAtPos Array - map onDoubleClick command + map lookAtPos position - + $Code$(findDisplay 12) lookAtPos [0,0,0];$/Code$ + undefined / undefined - Nothing + Nothing + - onEachFrame + assignCurator - Runs given statement every frame. - i - Since Arma 3 v1.57 a stackable version of this EH is available: EachFrame - In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. + Assign player as curator. Two players cannot act as one curator. - https://community.bistudio.com/wiki/onEachFrame + https://community.bistudio.com/wiki/assignCurator - onEachFrame String/Code + Object assignCurator Object - onEachFrame statement + player assignCurator curatorObj - $Code$onEachFrame { hintSilent str position player }; //Hints position every frame$/Code$ - - $Code$// Private variables defined outside of onEachFrame scope are not inherited: - _myvar = "bob"; - myvar = "bill"; - onEachFrame { hintSilent str [_myvar, myvar]}; - //Result: [any,"bill"]$/Code$ - - $Code$// Only one onEachFrame loop can exist at any time: - onEachFrame { player sideChat "first"}; - onEachFrame { player sideChat "second"}; - //Result: "second","second","second"..."second" - // Note how "first" never gets shown even though it precedes "second". This is because script thread is executing within the same frame and first onEachFrame is overwritten before it has a chance to execute its statement.$/Code$ - - $Code$// Script suspension is not permitted within onEachFrame scope: - onEachFrame { sleep 1}; - //ERROR!!!$/Code$ + $Code$player assignCurator myCurator;$/Code$ undefined / undefined - (21 Dec, 2012) - $Code$ onEachFrame {}; //Reset event$/Code$ + This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - onGroupIconClick + removeGroupIcon - Defines an action performed when player clicked on group marker (3D or in a map). The code executed once. This EH, unlike onGroupIconOverEnter and onGroupIconOverLeave, has one more param which returns 1 if RMB was pressed, 0 otherwise. - i - Since Arma 3 v1.57 a stackable version of this EH is available: GroupIconClick + Remove icon with given ID from group. - https://community.bistudio.com/wiki/onGroupIconClick + https://community.bistudio.com/wiki/removeGroupIcon - onGroupIconClick String/Code + Group removeGroupIcon Number - onGroupIconClick command + group removeGroupIcon iconID - $Code$onGroupIconClick - { - // Passed values for _this are: - _is3D = _this select 0; - _group = _this select 1; - _wpID = _this select 2; - _RMB = _this select 3; - _posx = _this select 4; - _posy = _this select 5; - _shift = _this select 6; - _ctrl = _this select 7; - _alt = _this select 8; - _message = format ["____ Info ____"]; - {_message = _message + format ["\n %1",_x]} forEach _this; - hint _message; - }$/Code$ + $Code$_target removeGroupIcon (_target getvariable "hc_attackicon");$/Code$ undefined / undefined @@ -45070,43 +46383,28 @@ - Nothing + Nothing + - onGroupIconOverEnter + setOxygenRemaining - Defines an action performed when player moves pointer over group marker (3D or in a map). The code will execute continuously while pointer is over icon. - i - Since Arma 3 v1.57 a stackable version of this EH is available: GroupIconOverEnter + Sets oxygen remaining. It has no effect when soldier is not diving. Oxygen remaining is a number between 0 and 1. - https://community.bistudio.com/wiki/onGroupIconOverEnter + https://community.bistudio.com/wiki/setOxygenRemaining - onGroupIconOverEnter String/Code + Object setOxygenRemaining Number - onGroupIconOverEnter command + unit setOxygenRemaining value - $Code$onGroupIconOverEnter - { - // Passed values for _this are: - _is3D = _this select 0; - _group = _this select 1; - _wpID = _this select 2; - _posx = _this select 3; - _posy = _this select 4; - _shift = _this select 5; - _ctrl = _this select 6; - _alt = _this select 7; - _message = format ["____ Info ____"]; - {_message = _message + format ["\n %1",_x]} forEach _this; - hint _message; - }$/Code$ + $Code$player setOxygenRemaining 0; // Drowns player$/Code$ undefined / undefined @@ -45114,321 +46412,291 @@ - Nothing + Nothing + - onGroupIconOverLeave + drawIcon - Defines an action performed when pointer, previously positioned over icon, is moved away from it (3D or in a map). The code is executed once. - i - Since Arma 3 v1.57 a stackable version of this EH is available: GroupIconOverLeave + Draw an icon on the map. The command needs to be called every frame, preferably with "Draw" control event handler ctrlAddEventHandler. - https://community.bistudio.com/wiki/onGroupIconOverLeave + https://community.bistudio.com/wiki/drawIcon - onGroupIconOverLeave String/Code + Control drawIcon Array - onGroupIconOverLeave command + map drawIcon [texture, color, position, width, height, angle, text, shadow, textSize, font, align] - $Code$onGroupIconOverLeave - { - // Passed values for _this are: - _is3D = _this select 0; - _group = _this select 1; - _wpID = _this select 2; - _posx = _this select 3; - _posy = _this select 4; - _shift = _this select 5; - _ctrl = _this select 6; - _alt = _this select 7; - _message = format ["____ Info ____"]; - {_message = _message + format ["\n %1",_x]} forEach _this; - hint _message; - }$/Code$ + $Code$findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", " + _this select 0 drawIcon [ + 'iconStaticMG', + [1,0,0,1], + getPos player, + 24, + 24, + getDir player, + 'Player Vehicle', + 1, + 0.03, + 'TahomaB', + 'right' + ] + "];$/Code$ undefined / undefined + (July 03, 2013) + Support of paremeters textSize, font and align is in the game since Arma 3 version 0.72. + + (March 22, 2014) + icon will always remain the same width and height, if you want an icon scaled to the map, use: $Code$( sizeInMeters * 0.15) * 10^(abs log (ctrlMapScale _ctrl))$/Code$ for width and height (guessimated). + + (July 20, 2014) + If you want only text with no icon, you can use "#(argb,8,8,3)color(0,0,0,0)" as texture. + + (July 7, 2015) + Be careful when using this command. Unlike map markers, the draw commands can decrease your framerate. + + (January 4, 2016) + Arma 3 1.54 + This command doesn't seem to play nice with onEachFrame. It seems to draw on the main screen while maintaing position relative to the map position + Example: + $Code$ onEachFrame { + findDisplay 12 displayCtrl 51 drawIcon ['iconStaticMG',[1,0,0,1], getPos player,24,24, getDir player,'Player Vehicle',1,0.03,'TahomaB','right']; + };$/Code$ + + (October 13, 2016) + If you unPBO the following addon: + $Code$@ui_f_data.pbo $/Code$ + You can find the possible icons inside this folder: + $Code$ui_f_data\map\vehicleicons$/Code$ + For example: + If you want to use "iconman_ca.paa" you will write "iconman" on the texture string. - Nothing + Nothing + - onHCGroupSelectionChanged + hcAllGroups - Defines an action performed when high command group selection has been changed. - Command receives 2 variables: - _group: Group - last selected/deselected group - _isSelected: Boolean - new selection state of the specific group - The code is executed on every hc group selection change until it is - removed via $Code$ onHCGroupSelectionChanged "";$/Code$ or $Code$ onHCGroupSelectionChanged {};$/Code$ - or replaced by $Code$ onHCGroupSelectionChanged "SomeOtherCommand(s)";$/Code$ or $Code$ onHCGroupSelectionChanged {SomeOtherCommand(s)};$/Code$ - i - Since Arma 3 v1.57 a stackable version of this EH is available: HCGroupSelectionChanged + Returns selected groups in high command. - https://community.bistudio.com/wiki/onHCGroupSelectionChanged + https://community.bistudio.com/wiki/hcAllGroups - onHCGroupSelectionChanged String/Code + hcAllGroups Object - onHCGroupSelectionChanged command + hcAllGroups unit - $Code$onHCGroupSelectionChanged { - if (_isSelected) then { - hint format ["Group %1 has been selected.", _group]; - } else { - hint format ["Group %1 has been deselected.", _group]; - }; - };$/Code$ - - $Code$onHCGroupSelectionChanged " player globalChat 'HC group selection has been changed.';";$/Code$ - + undefined / undefined - Nothing + Array + - onMapSingleClick + lnbValue - Define action performed when user clicks in map by executing command string. - the string receives 5 (localised in scope) variables: - _this: Anything - Params passed to onMapSingleClick - _pos: Array - Clicked position - _units: Array - Units which were selected (via function keys) before opening the map ( may be non-functional in Arma ) - _shift: Boolean - Whether Shift was pressed when clicking on the map - _alt: Boolean - Whether Alt was pressed when clicking on the map - In Arma 3 the code should return true only if you wish to override default engine handling of the mouse click on map (see example #4) For older games, when click is processed, code should ultimately return true back to the engine. If false is returned, default processing by the game engine is done. Return value of any other type (including Nothing ) is an error. In such case default processing by the game engine is done, and error message may be displayed. - The code is executed on every click, until the Command is - removed via onMapSingleClick "", or - replaced by onMapSingleClick "SomeOtherCommand(s)" - i - Since Arma 3 v1.57 a stackable version of this EH is available: MapSingleClick - In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. + Returns the additional integer value in the item with the given position of the 2D listbox. - https://community.bistudio.com/wiki/onMapSingleClick + https://community.bistudio.com/wiki/lnbValue - onMapSingleClick String/Code + lnbValue Array - Anything onMapSingleClick String/Code + Control lnbValue Array - onMapSingleClick command + lnbValue [idc,[row, column]] - params onMapSingleClick command + ctrl lnbValue [row, column] - $Code$onMapSingleClick "'SoldierWB' createUnit [_pos, group player ]; true"; - // ArmA: Creates a soldier unit at the position clicked.$/Code$ - - $Code$onMapSingleClick "grp1 move _pos; onMapSingleClick ''; true "; - // ArmA: Orders "grp1" to move to position clicked. Disables further map-click actions.$/Code$ - - $Code$onMapSingleClick "'SoldierWB' createUnit [_pos, group player ]; true "; - // OFP: In OFP single quotes cannot be used for string definition, so two double-quotes have to be used instead.$/Code$ - - $Code$//The following code will disable Shift+click waypoint marker creation - onMapSingleClick {_shift};$/Code$ - - $Code$//Pass params to onMapSingleClick code - player onMapSingleClick { hint ("Hello " + name _this)}; //Hello KK$/Code$ - - $Code$//Pass params to onMapSingleClick code and disable Shift+click waypoint marker creation - player onMapSingleClick " hint (""Hello "" + name _this ); _shift"; //Hello KK$/Code$ + $Code$_ctrl lnbValue [0,0];//1, default is 0 if value is String set by lnbSetValue$/Code$ undefined / undefined - (8 July, 2009) - See my Multiple OnMapSingleClick script to allow you to add multiple events to the onMapSingleClick event. Some minor editing of the scripts would be required to use them in Arma. - - (April 1, 2016) - _units param is supposed to return what groupSelectedUnits returns. Player must be leader and some units in the group must be selected on the group bar. However selected units are connected with group orders menu, which interferes with map click. In other words, when you click on the main map, the map gets focus and group orders menu closes, deselecting any selected unit, so _units is [] pretty much all the time. + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Nothing - Nothing + Number - Number + - onPlayerConnected + setAmmoOnPylon - This command will execute attached code whenever a player is connected to a MP session. The code will receive a number of special variables: - _id : Number - is the unique DirectPlay ID. Quite useless as the number is too big for in-built string representation and gets rounded. It is also the same id used for user placed markers. - _uid : String - is getPlayerUID of the joining player. In Arma 3 it is also the same as Steam ID. - _name : String - is profileName of the joining player. - _jip : ( since Arma 3 v1.49 ) Boolean - is a flag that indicates whether or not the player joined after the mission has started ( J oined I n P rogress). true - when the player is JIP, otherwise false. - _owner : ( since Arma 3 v1.49 ) Number - is owner id of the joining player. Can be used for kick or ban purposes or just for publicVariableClient. - i - Since Arma 3 v1.57 a stackable version of this EH is available: PlayerConnected - In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. + Set count of ammo in magazine on pylon - https://community.bistudio.com/wiki/onPlayerConnected + https://community.bistudio.com/wiki/setAmmoOnPylon - onPlayerConnected String/Code + Object setAmmoOnPylon Array - onPlayerConnected code + vehicle setAmmoOnPylon [pylon nameindex, ammo count] - $Code$onPlayerConnected "[_id, _name] execVM ""PlayerConnected.sqf""";$/Code$ - - $Code$onPlayerConnected { diag_log [_id, _uid, _name]};$/Code$ - - $Code$// From Arma 3 v1.49: - onPlayerConnected { - somevar = random 123; - _owner publicVariableClient "somevar"; - //this will set somevar on - //joining player PC to a random value - };$/Code$ - - $Code$// From Arma 3 v1.49: - onPlayerConnected {isJip = _jip; _owner publicVariableClient "isJip"}; - //Each player will now have variable isJip containing individual JIP info$/Code$ + $Code$( vehicle player ) setAmmoOnPylon [1, 12];$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer + (August 18, 2017) + The pylon indices start at 1 and not at 0. - Nothing + Nothing + - onPlayerDisconnected + setMarkerShape - This command will execute attached code whenever a player is leaving an MP session. The code will receive a number of special variables: - _id : Number - is the unique DirectPlay ID. Quite useless as the number is too big for in-built string representation and gets rounded. It is also the same id used for user placed markers. - _uid : String - is getPlayerUID of the leaving player. In Arma 3 it is also the same as Steam ID. - _name : String - is profileName of the leaving player. - _jip : ( since Arma 3 v1.49 ) Boolean - is a flag that indicated whether or not the player joined after the mission has started ( J oined I n P rogress). true - if the player was JIP, otherwise false. - _owner : ( since Arma 3 v1.49 ) Number - is owner id of the leaving player. Can be used for kick or ban purposes or just for publicVariableClient. - i - Since Arma 3 v1.57 a stackable version of this EH is available: PlayerDisconnected - In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. + Selects the shape (type) of the marker. + Shape can be "ICON", "RECTANGLE", "ELLIPSE" or "POLYLINE". - https://community.bistudio.com/wiki/onPlayerDisconnected + https://community.bistudio.com/wiki/setMarkerShape - onPlayerDisconnected String/Code + String setMarkerShape String - onPlayerDisconnected code + markerName setMarkerShape shape - $Code$onPlayerDisconnected " diag_log [_id, _uid, _name]";$/Code$ - - $Code$onPlayerDisconnected { - if ( count allPlayers == 0) then { - endMission "END1"; - }; - };$/Code$ + $Code$"Marker1" setMarkerShape "RECTANGLE";$/Code$ - undefined / undefined + undefined / global - This scripting command must be executed on the server to work properly in multiplayer - - (January 14, 2015) - For Arma 3 v1.32 and onward, one might want to consider using instead the HandleDisconnect mission event handler for greater flexibility. - Nothing + Nothing + - onPreloadFinished + commandWatch - Defines an action performed after the preload screen finished. Preload event occurs after briefing screen on mission start. - i - Since Arma 3 v1.57 a stackable version of this EH is available: PreloadFinished - In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. + Orders the unit(s) to watch the given position or target (via the radio). Use objNull as the target to order a unit to stop watching a position/target - https://community.bistudio.com/wiki/onPreloadFinished + https://community.bistudio.com/wiki/commandWatch - onPreloadFinished String/Code + Object/Array commandWatch Array + + Object/Array commandWatch Object - onPreloadFinished command + unitName commandWatch position + + unitName commandWatch target - $Code$onPreloadFinished {TAG_ReceivingScreenDone = true };$/Code$ + $Code$_soldierOne commandWatch markerPos "MarkerMoveOne"$/Code$ - $Code$//removes the event immediately after the first run again - onPreloadFinished {TAG_ReceivingScreenDone = true ; onPreloadFinished ""};$/Code$ + $Code$[s1,s2] commandWatch player$/Code$ - undefined / undefined + local / global - (July 24, 2009) - There is a bug in Arma2 that will make this command execute every time the screen with "Receiving..." has been displayed. - If this code is put in the Init.sqf it will run the startcam.sqf script when the loading screen has disappeared - onPreloadFinished '[fire1] execVM "scripts\startcam.sqf"'; - It will however also run every time a player change graphics settings, alt-tab or do anything else that will trigger the loading screen. - You will have to script around it with if statements to get it to run only in the beginning of the mission. - Nothing + Nothing - Nothing + - onPreloadStarted + precision - Defines an action performed just before the preload screen started. Preload event occurs after briefing screen on mission start. - i - Since Arma 3 v1.57 a stackable version of this EH is available: PreloadStarted - In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. + Return the precision of the given entity, how is the entity able to be precise when moving to given target. - https://community.bistudio.com/wiki/onPreloadStarted + https://community.bistudio.com/wiki/precision - onPreloadStarted String/Code + precision Object - onPreloadStarted command + precision entity - $Code$onPreloadStarted { diag_log "preload started"};$/Code$ + $Code$if ( position _this distance _dangerPos = precision _this) then {...}; + //used in formationCDanger.fsm$/Code$ undefined / undefined @@ -45436,59 +46704,57 @@ - Nothing + Number + - onShowNewObject + getPilotCameraDirection - Defines an action performed when the user right clicks on the map and,selects New Object. Set to empty for default behavior. Command receives:,_pos array position, - i - Some Old Editor Command + Returns model space vector of the object airplane or helicopter pilotCamera. - https://community.bistudio.com/wiki/onShowNewObject + https://community.bistudio.com/wiki/getPilotCameraDirection - Control onShowNewObject String + getPilotCameraDirection Object - map onShowNewObject command + getPilotCameraDirection object - + $Code$_pilotCamVector = getPilotCameraDirection vehicle player$/Code$ + - undefined / undefined + local / undefined - Any_Value + Array + - onTeamSwitch + getMissionDLCs - Defines an action performed when the team switch is finished. Commandset receives the following special variables: _from object previous unit, _to object current unit. Consecutive use of onTeamSwitch command will overwrite previously set commandset. - i - Since Arma 3 v1.57 a stackable version of this EH is available: TeamSwitch - NOTE: When player switches and leaves behind AI unit, you need to enable "TeamSwitch" AI on it onTeamSwitch {_from enableAI "TeamSwitch"}; so that the unit continues with waypoints + Returns list of DLCs that are used in the mission. List is created only from units listed in mission.sqm and doesn't detect units created by scripts! - https://community.bistudio.com/wiki/onTeamSwitch + https://community.bistudio.com/wiki/getMissionDLCs - onTeamSwitch String/Code + getMissionDLCs - onTeamSwitch commandset + getMissionDLCs - $Code$onTeamSwitch {[_from, _to] execVM "myTeamSwitchScript.sqf";};$/Code$ + $Code$_list = getMissionDLCs$/Code$ undefined / undefined @@ -45496,67 +46762,61 @@ - Nothing + Array + - openCuratorInterface + rating - Force opens curator interface. + Check unit rating. Rating is increased for killing enemies, decreased for killing friendlies (see Rating Values ). Can be changed via addRating by the mission designer. + The rating of the player is displayed as the "score" at the end of the mission. Via Description.ext one can define how many points it takes to get a perfect score, as well as the number of stars. - https://community.bistudio.com/wiki/openCuratorInterface + https://community.bistudio.com/wiki/rating - openCuratorInterface + rating Object - openCuratorInterface + rating unitName - $Code$// Open interface: - openCuratorInterface ;$/Code$ - - $Code$// Close interface: - findDisplay 312 closeDisplay 2;$/Code$ - - $Code$// Detect if user used "Zeus" key to open curator interface in the absence of event handler for it: - findDisplay 46 displayAddEventHandler ["KeyDown", { - if ( inputAction "CuratorInterface" 0) then { - hint "Curator interface is open"; - }; - false - }];$/Code$ + $Code$_score = rating player$/Code$ - undefined / undefined + global / undefined + In ArmA 1.18 rating does only return rating levels for units that are local. - Nothing + Number + - openDLCPage + lookAt - Opens a Steam page of the app with given appId. Only works for known appId (game + linked DLCs) + Control what the unit(s) is/are looking at (target or position). - https://community.bistudio.com/wiki/openDLCPage + https://community.bistudio.com/wiki/lookAt - openDLCPage Number + Object/Array lookAt Object/Array - openDLCPage dlcID + unit lookAt position - $Code$openDLCPage 288520$/Code$ + $Code$_someSoldier lookAt _otherSoldier$/Code$ + + $Code$[_someSoldier, _otherSoldier] lookAt markerPos "markerOne"$/Code$ undefined / undefined @@ -45564,33 +46824,28 @@ - Boolean + Nothing + - openMap + waypointHousePosition - Shows in-game map. If forced, cannot be closed. + Gets the house position assigned to the waypoint. - https://community.bistudio.com/wiki/openMap + https://community.bistudio.com/wiki/waypointHousePosition - openMap Boolean - - openMap Array + waypointHousePosition Array - openMap show - - openMap [show, forced] + waypointHousePosition waypoint - $Code$openMap true ;$/Code$ - - $Code$openMap [ true, true ];$/Code$ + $Code$waypointHousePosition [groupOne,1]$/Code$ undefined / undefined @@ -45598,28 +46853,29 @@ - Boolean - Boolean + Number + - openYoutubeVideo + textLog - Opens Steam overlay with given YT video. Video URL is the end part of the YT URL, starting with watch?v=.... If the user has Steam overlay disabled, the command will display appropriate message to the user and return false. + Dump argument value to debugging output. + This command is non-functional in the retail version - https://community.bistudio.com/wiki/openYoutubeVideo + https://community.bistudio.com/wiki/textLog - openYoutubeVideo String + textLog Any_Value - openYoutubeVideo youTubeUrl + textLog anything - $Code$//Open http://www.youtube.com/watch?v=UBIAbm7Rt78 - _isOpened = openYoutubeVideo "watch?v=UBIAbm7Rt78";$/Code$ + $Code$textLog player$/Code$ undefined / undefined @@ -45627,30 +46883,31 @@ - Boolean + Nothing + - opfor + setStatValue - Pre-defined variable for the opfor side. - Alias for east. + Sets a value to a given stat. + A list of possible StatNames can be found here: StatNames + Its important to note that most Stats are restricted to scripts in certain paths. + For example "ExpWarlockDown" is restricted to scripts in any subdirectory of "a3\Missions_F_Exp\Campaign\Missions\" - https://community.bistudio.com/wiki/opfor + https://community.bistudio.com/wiki/setStatValue - opfor + setStatValue Array - opfor + setStatValue [name, value] - $Code$if ( side player == opfor ) then { - hint "OPFOR"; - };$/Code$ + $Code$setStatValue ["ExpWarlockDown", 1]; //Unlocks the "Warlock Down" Steam achivement$/Code$ undefined / undefined @@ -45658,160 +46915,120 @@ - Side + Boolean + - orderGetIn + nextMenuItemIndex - Force all units in the array to get in or out of their assigned vehicles. Units must be assigned to a vehicle before this command will do anything. + Returns the next available menu item index. + i + Some Old Editor Command - https://community.bistudio.com/wiki/orderGetIn + https://community.bistudio.com/wiki/nextMenuItemIndex - Array orderGetIn Boolean + nextMenuItemIndex Control - unitArray orderGetIn order + nextMenuItemIndex map - $Code$[_unitOne, _unitTwo] orderGetIn true$/Code$ - - $Code$[_unitOne, _unitTwo] orderGetIn false$/Code$ - + - local / global + undefined / undefined - (8 May, 2014) - (ArmA3 ver 1.18), here's a quick reference to unit's embarkation and disembarkation. - Command - Remote Control - Behavior - Role Unassigning - orderGetIn - false - orderGetIn won't take effect on player controlled AI units, and which needs to be used together with assaignAs command family. Generally speaking, orderGetIn is a Role Excuator. - When orderGetIn was disabled it won't automatically unassign unit's vehicle role but will force the unit get out of the vehicle and stop him re-entering until it was enabled again. orderGetIn false won't stop a unit when he is embarking a vehicle in the half way but unassignVehicle will do. orderGetIn false will wait to fire until the unit enter a vehicle. - allowGetIn - false - allowGetIn won't take effect on player controlled AI units. Different from orderGetIn, this command is a Role Holder, it can control the unit's movement in the half way set by orderGetIn but not by setWaypointType, unit will be forced to get out from a vehicle by allowGetIn false and won't automatically re-enter the vehicle until allowGetIn true - allowGetIn won't do anything with unit's vehicle role - doGetOut - true - Works on player controlled ai silently, unit will automatically get back to the vehicle after disembarkation. (Unit won't get out until vehicle is stopped or landed) - false - commandGetOut - true - Same as doGetOut with radio message. (Unit won't get out until vehicle is stopped or landed) - false - leaveVehicle - false - leaveVehicle can't force a player controlled AI disembark - true - action ["GetOut",_veh] - true - Eject immediately without parachute - false - action ["Eject",_veh] - true - Eject immediately with parachute if needed - false - setWaypointType "GETIN" - false - Waypoint won't be affected by orderGetIn false or allowGetIn false until the unit is on the vehicle. - N/A - Nothing + Number + - or + camSetPos - Returns true only if one or both conditions are true. In case of the alternative syntax, lazy evaluation is used (if left operand is true, evaluation of the right side is skipped completely). - Identical to: a || b + Sets the position of the given camera or seagull (see camCreate ). It is worth mentioning that camera position can also be set with setPos, in which case it would be instant. With camSetPos it is possible to make smooth position transition in time, defined with camCommit, which is required in this case. - https://community.bistudio.com/wiki/or + https://community.bistudio.com/wiki/camSetPos - Boolean or Boolean - - Boolean or Code + Object camSetPos Array - a or b - - a or b + camera camSetPos position - $Code$if ((OBJ1) or (_enemycount == 0)) then { hint "you win !"}$/Code$ - - $Code$if (( count _array == 0) or {(_array select 0) != player }) then { hint "It works! Without lazy evaluation it would throw an error if array was empty."}$/Code$ + $Code$_cam camSetPos [2300,1000,130]; + _cam camCommit 10;$/Code$ - undefined / undefined + local / local - (March 29, 2015) - The examples suggest that you can only use two conditions with or. You can use more if you want. - It is not recommended to use a lot of conditions because the check will take longer to complete. - Boolean - Boolean + Nothing + - overcastForecast + triggerText - Return the overcast forecast. + Returns trigger text. + Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. - https://community.bistudio.com/wiki/overcastForecast + https://community.bistudio.com/wiki/triggerText - overcastForecast + triggerText Object - overcastForecast + triggerText trigger - + $Code$result = triggerText triggerName;$/Code$ + - undefined / undefined + global / local - Number + String + - overcast + setWaypointLoiterType - Return the current overcast level. Zero is clear skies, one is maximum cloud cover. + Sets the waypoint loiter type. - https://community.bistudio.com/wiki/overcast + https://community.bistudio.com/wiki/setWaypointLoiterType - overcast + Waypoint setWaypointLoiterType String - overcast + waypoint setWaypointLoiterType type - $Code$_cloudLevel = overcast$/Code$ + $Code$[_grp, 2] setWaypointLoiterType "CIRCLE";$/Code$ + + $Code$[_grp, 2] setWaypointLoiterType "CIRCLE_L";$/Code$ undefined / undefined @@ -45819,523 +47036,326 @@ - Number + Nothing + - owner + getObjectDLC - On server machine, returns the ID of the client where the object is local. Otherwise returns 0. For use on clients clientOwner command is available. To find out the owner of a Group, use groupOwner. + Returns appID of the DLC the object belongs to or nil if object is vanilla. - https://community.bistudio.com/wiki/owner + https://community.bistudio.com/wiki/getObjectDLC - owner Object + getObjectDLC Object - owner object + getObjectDLC obj - $Code$_clientID = owner _someobject;$/Code$ + $Code$_appID = getObjectDLC cursorTarget ; + if (! isNil "_appID") then { + hint format ["This object belongs to DLC with id: %1", _appID]; + } else { + hint "This object is vanilla"; + };$/Code$ global / undefined - This scripting command must be executed on the server to work properly in multiplayer - Number + Number/Nothing + - param + ctFindHeaderRows - Extracts a single value with given index from input argument, similar to BIS_fnc_param. When used without argument, as shown in main syntax, internal variable _this, which is usually available inside functions and event handlers, is used as argument. If input argument is not an array, it will be converted to 1 element array. - If extracted item of input with given index is undefined, of the wrong type or of the wrong length (if the item is an array), default value is used instead. Since Arma 3 v1.53.132691, onscreen errors are displayed for when the input is of the wrong type or size. + Takes index of a header as a parameter. Returns array of indices of rows under this header. - https://community.bistudio.com/wiki/param + https://community.bistudio.com/wiki/ctFindHeaderRows - param Array - - Anything param Array + Control ctFindHeaderRows Number - param [index, defaultValue, expectedDataTypes, expectedArrayCount] - - argument param [index, defaultValue, expectedDataTypes, expectedArrayCount] + Control ctFindHeaderRows Number - $Code$[1, 2, 3] call - { - private _one = param [0, 1]; - private _two = param [1, 2]; - private _three = param [2, 3]; - //..... - };$/Code$ - - $Code$[123] call - { - private _val = param [0]; - }; - // Below would produce the same result as above - 123 call - { - private _val = param [0]; - };$/Code$ - - $Code$_z = position player param [2, 0]; - if (_z 10) then - { - hint "YOU ARE FLYING!"; - };$/Code$ - - $Code$fnc = - { - private _pos = param [0, [0,0,0], [ objNull, []], [2,3]]; - private _rad = param [1, 0, [0]]; - _pos nearObjects _rad; - }; - [ position player, 25] call fnc; //ok - [ player, 25] call fnc; //ok - [25, player ] call fnc; //default values are used$/Code$ + $Code$_array = _control ctFindHeaderRows 0;$/Code$ - undefined / undefined + local / local - (November 8, 2016) - You can also use param in a complex with another commands. For example call, compile and format : - $Code$["var = 2"] call { - call compile format ["%1", param [0,"",[""]]]; // compiled param string value - hint str (var); // 2 - }; - $/Code$ - Anything - Anything + Array + - params + newOverlay - Parses input argument into array of private variables. When used without argument, as shown in main syntax, internal variable _this, which is usually available inside functions and event handlers, is used as argument. - In addition to simple parsing directly into variables, input can be tested in case it is undefined, of the wrong type or of the wrong size (if array) and substituted if necessary with default values. Since Arma 3 v1.53.132691, onscreen errors are displayed for when the input is of the wrong type or size. + Creates the new overlay dialog for the specified type of overlay. + i + Some Old Editor Command - https://community.bistudio.com/wiki/params + https://community.bistudio.com/wiki/newOverlay - params Array - - Anything params Array + Control newOverlay Config - params [element1, element2,elementN] - - argument params [element1, element2,elementN] + map newOverlay config - $Code$[1, 2, 3] call { - private ["_one", "_two", "_three"]; - _one = _this select 0; - _two = _this select 1; - _three = _this select 2; - //..... - }; - // Same as above, only using params - [1, 2, 3] call { - params ["_one", "_two", "_three"]; - //..... - };$/Code$ - - $Code$[123] call { - params ["_myvar"]; - }; - // Below would produce the same result as above - 123 call { - params ["_myvar"]; - };$/Code$ - - $Code$position player params ["", "", "_z"]; - if (_z 10) then { - hint "YOU ARE FLYING!"; - };$/Code$ - - $Code$[1, nil, 2] params ["_var1", "_var2", "_var3"]; - // All 3 variables are made private but only _var1 and _var3 are defined - [1, nil, 2] params ["_var1", ["_var2", 23], "_var3"]; - // All 3 variables are private and defined$/Code$ - - $Code$[1, 2] call { - if (! params ["_var1", "_var2", ["_var3", true, [ true ]]]) exitWith { - hint str [_var1, _var2, _var3]; - }; - }; - // The hint shows [1,2,true] - //Script exits, default value was used due to missing value - [1, 2, 3] call { - if (! params ["_var1", "_var2", ["_var3", true, [ true ]]]) exitWith { - hint str [_var1, _var2, _var3]; - }; - }; - // The hint shows [1,2,true] - //Script exits, default value was used due incorrect value type$/Code$ - - $Code$[1, "ok", [1, 2, 3]] call { - if (! params [ - ["_var1", 0, [0]], - ["_var2", "", [""]], - ["_var3", [0,0,0], [[], objNull, 0], [2,3]] - ]) exitWith {}; - hint "ok"; - }; - // Passes validation - [1, 2, [3, 4, 5]] call { - if (! params ["_var1", "_var2", ["_var3", [], [[], objNull, 0], 0]]) exitWith {}; - hint "ok"; - }; - // Fails, because passed array is expected to be of 0 length, i.e. empty$/Code$ - - $Code$position player params ["_x", "_y"]; - player setPos [_x, _y, 100];$/Code$ - - $Code$[1, 2, 3, [4, 5, 6]] call { - params ["_one", "_two", "_three"]; - _this select 3 params ["_four", "_five", "_six"]; - };$/Code$ - - $Code${ - _x params ["_group", "_index"]; - //..... - } forEach waypoints group player ; - fn_someFnc = { - params ["_position", ["_direction", 0], ["_name", ""]]; - // Extract the x, y, and z from "_position" array: - _position params ["_x", "_y", "_z"]; - //..... - }; - [ position player, direction player, name player ] call fn_someFnc;$/Code$ - - $Code$targ addEventHandler ["HitPart", { - _this select 0 params ["_target", "_shooter", "_projectile"]; - }];$/Code$ - + undefined / undefined - (August 30, 2015) - Because params doubles as private, instead of: - $Code$[1, 2, 3] params ["_one", "_two", "_three"]; - private "_four"; - _four = 4;$/Code$ - You can just: - $Code$[1, 2, 3] params ["_one", "_two", "_three", "_four"]; - _four = 4;$/Code$ - - (November 3, 2016) - With a function only taking one Parameter, it doesn't matter whether the parameter is in an array or not: - Example: - $Code$1 call { - params [ ["_number",0, [0]] ]; - }; - or - [1] call { - params [ ["_number",0, [0]] ]; - };$/Code$ - But when the one Parameter is an array that parameter has to be inside of an array when the function is called - Example: - $Code$[1,2] call { - params [ ["_array", [], [[]], 2] ]; - };//Fails - [[1,2]] call { - params [ ["_array", [], [[]], 2] ]; - };//Succeeds$/Code$ - Boolean - Boolean + Nothing + - parseNumber + drawArrow - An SQF equivalent of C++ atof function. Parses the string, interpreting its content as a floating point number. - The command first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes as many characters as possible that are valid following a syntax resembling that of floating point literals, and interprets them as a numerical value. The rest of the string after the last valid character is ignored and has no effect on the behavior of this command. - If the first sequence of non-whitespace characters in string does not form a valid floating-point number, or if no such sequence exists because either string is empty or contains only whitespace characters, no conversion is performed and the command returns 0. + Draws a single line arrow on the map. To draw a color filled arrow of custom shape see BIS_fnc_drawArrow - https://community.bistudio.com/wiki/parseNumber + https://community.bistudio.com/wiki/drawArrow - parseNumber String - - parseNumber Boolean + Control drawArrow Array - parseNumber string - - parseNumber boolean + map drawArrow [from, to, color] - $Code$_number = parseNumber "0.125"; //0.125$/Code$ - - $Code$_number = parseNumber "2 abc"; //2$/Code$ - - $Code$_number = parseNumber true ; //1$/Code$ + $Code$findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", + { + _this select 0 drawArrow [ + player, player getRelPos [100, 0], [1,0,0,1] + ]; + }];$/Code$ undefined / undefined - (Aug 28, 2014) - (A3 1.26)It only detects the first occurrence of a number in the string, return 0 by default. - $Code$ parseNumber "2s4f"; // 2 - parseNumber "s2f4"; // 0$/Code$ - parse config or code, currently BIS_fnc_parseNumber, occurrence is only limited with number, return -1 by default. - $Code${s3s4f} call BIS_fnc_parseNumber ; // -1$/Code$ + (July 7, 2015) + Be careful when using this command. Unlike map markers, the draw commands can decrease your framerate. - Number - Number + Nothing + - parseSimpleArray + vectorFromTo - Converts given, formatted as simple array, String into a valid Array. Simple array is array consisting of Numbers, Strings, Booleans and Arrays of all of the above. For example: [1,"2",true,[4,"five",false]]. The string representation of this array compatible with parseSimpleArray will be "[1,""2"",true,[4,""five"",false]]" accordingly. - This command is built for speed and security and because of this has several limitations. There is limited error reporting about format errors as the command expects well formatted array as argument. To be able to see exact format expected, you can just copy output result of str command applied to an array for reference: copyToClipboard str str [1,"2",true,[4,"five",false]] (notice the use of double str with copyToClipboard ). - In any case here are the explicit rules: - no spaces are permitted between array elements: [1,2,3] - correct, [1, 2, 3] - incorrect! - only double quotes " supported for Strings : ["hello"] - correct, ['hello'] - incorrect! - use " to escape ", for example ["hello"] converted to string should look like this: "[""hello""]" - no spaces should exist before or after array brackets: "[1,2,3]" - correct, "[1,2,3] " - incorrect! - To simplify, your constructed array format should be the same as Arma array converted to string with str : - $Code$_arr1 = getUnitLoadout player ; - _arr2 = parseSimpleArray str _arr1; - hint str (_arr1 isEqualTo _arr2); //true - $/Code$ - Because of this strictness the command is on average 3x faster than similar call compile string array method. And because call compile is not required, it is also more secure and primarily intended for use with callExtension to parse the String output into Array. + Unit vector, equal to direction from vector1 to vector2. In other words this command produces vectorNormalized between given 2 points. To get a normal vector use vectorDiff. - https://community.bistudio.com/wiki/parseSimpleArray + https://community.bistudio.com/wiki/vectorFromTo - parseSimpleArray String + Array vectorFromTo Array - parseSimpleArray stringArray + vector1 vectorFromTo vector2 - $Code$_arr = parseSimpleArray "[1,2,3]";$/Code$ - - $Code$_bool = true ; - _num = 123.45; - _str = "ok"; - _arr = [1,false,"cool"]; - _res = parseSimpleArray format ["[%1,%2,%3,%4]", _bool, _num, str _str, str _arr]; - // Note how _bool and _num do not need str, however if used anyway, the result in this case would be identical - hint str _res; // [true,123.45,"ok",[1,false,"cool"]]$/Code$ + $Code$[1,2,3] vectorFromTo [4,5,6]; //[0.57735,0.57735,0.57735] + //is the same as + vectorNormalized ([4,5,6] vectorDiff [1,2,3]); //[0.57735,0.57735,0.57735]$/Code$ undefined / undefined + (19 Jul, 2014) + (ArmA3 1.26) Algorithm: + $Code$ + Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; + Result = [(x1 – x2)/( sqrt ((x1 – x2) ^ 2 + (y1 – y2) ^ 2 + (z1 – z2) ^ 2)), + (y1 – y2)/( sqrt ((x1 – x2) ^ 2 + (y1 – y2) ^ 2 + (z1 – z2) ^ 2)), + (z1 – z2)/( sqrt ((x1 – x2) ^ 2 + (y1 – y2) ^ 2 + (z1 – z2) ^ 2))]; + $/Code$ - Array + Array + - parseText + assignedItems - Creates a structured text by parsing the given XML description. Do not use parseText when displaying a localized text from stringtable.xml (see notes below). + Get array with all assigned items. + The resulting Array is sorted like: [ Map, Compass, Watch, Radio, GPS, NVG, Binoculars ]. + But if something is missing it get's omitted so you can not be sure that some element is at a constant index. - https://community.bistudio.com/wiki/parseText + https://community.bistudio.com/wiki/assignedItems - parseText String + assignedItems Object - parseText text + assignedItems unit - $Code$_Stxt = parseText "First line img image='data\isniper.paa'/ br/ Second line";$/Code$ - - $Code$hintSilent parseText format [" t size='1.25' font='Zeppelin33' color='#ff0000' %1 lives remaining. /t ", 12];$/Code$ - - $Code$_clickableLink = parseText " a href='http://arma3.com' A3 /a ";$/Code$ + $Code$hint str assignedItems player ;$/Code$ undefined / undefined - (22:07, 11 May 2007 (CEST)) - You can also colorate your text. You just have to use following tag: - t color='#ffff00' Your yellow text! /t - To change the size of your text, use this command: - t size='2.2' Your bigger text! /t - To change text font, use: - t font='Zeppelin33' Bold Text /t - To change horizontal alignment, use (parameter can be 'left', 'center', 'right'): - t align='center' Centered Text /t - To change vertical alignment within a line, use (parameter can be 'top', 'middle', 'bottom'): - t valign='bottom' Text at Line Bottom /t - To underline text, use: - t underline='true' Underlined Text /t - To put shadow under text, use: - t shadow='true' t shadowColor='#ff0000' Text with Red Shadow /t /t - Following statements are valid too: - t underline='1' Underlined Text /t - t shadow='1'shadowColor='#ff0000' Green shadow text /t - Following fonts are valid (got from config): - t font='Zeppelin32' Zeppelin32 (normal text) /t - t font='Zeppelin33' Zeppelin33 (bold text) /t - t font='Zeppelin33Italic' Zeppelin33Italic (bold italic text) /t - t font='Bitstream' Bitstream (same as Zeppelin32) /t - t font='TahomaB' TahomaB (same as Zeppelin32) /t - t font='LucidaConsoleB' LucidaConsoleB (like Courier) /t - - (21 March 2009) - Although there is a dedicated image command, parseText gives more options: - img size='5' color='#ff0000' image='fish.paa'/ + (June 18, 2013) + Arma 3, version 0.70 - headgear and goggles are not present in returned array now. - (1 September 2016) - To convert a structured text back to a string type, just use: - _str = str parseText _structuredText; + (August 22, 2013) + For head gear use headgear, addHeadgear and removeHeadgear. For goggles use goggles, addGoggles and removeGoggles - Structured_Text + Array + - parsingNamespace + setVelocityModelSpace - Returns the global namespace attached to config parser. + Sets the velocity (speed vector) of the given vehicle relative to its model. - https://community.bistudio.com/wiki/parsingNamespace + https://community.bistudio.com/wiki/setVelocityModelSpace - parsingNamespace + Object setVelocityModelSpace Array - parsingNamespace + vehicle setVelocityModelSpace [x, y, z] - $Code$parsingNamespace setVariable ["var1",101.23124]; - _profVar1 = parsingNamespace getVariable "var1";$/Code$ + $Code$car setVelocityModelSpace [0, 10, 0]; //pushes car forward$/Code$ - undefined / undefined + local / global - (January 27, 2015) - Any global variable defined in a config using __EXEC() will be stored in this namespace. - For example in the description.ext: - $Code$__EXEC(testVar = 1);$/Code$ - The variable "testVar" can be accessed during mission run time using getVariable - $Code$ hint str ( parsingNamespace getVariable ["testVar", 0]);$/Code$ - The above example would print 1. - This example however: - $Code$__EXEC(_testVar = 1);$/Code$ - Would print 0, because adding an underscore will make the variable local to the config in the same way that it would make it local to a script. - See PreProcessor Commands for more details on __EXEC() - Namespace + Nothing + - particlesQuality + forceEnd - Returns current settings for particles quality (configure- video- general- particles). 0-low, 1-normal, 2-high + Sets the flag which tells engine that the mission end was forced. Might need additional endMission execution. Can be used in an "END" trigger to force end conditions in the editor. - https://community.bistudio.com/wiki/particlesQuality + https://community.bistudio.com/wiki/forceEnd - particlesQuality + forceEnd - particlesQuality + forceEnd - $Code$_currentQuality = particlesQuality ;$/Code$ + $Code$if (_TerritoryLost) then { forceEnd }$/Code$ - undefined / undefined + undefined / local - Number + Nothing + - pickWeaponPool + groupRadio - Transfer weapons and magazines from cargo of object into weapon pool (used in campaign to transfer weapons into next mission). + Sends the audio message to the group radio channel. Must have assigned "ItemRadio" to send or receive the transmission. The message is defined in CfgRadio in the description.ext file or config radio protocol. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). + Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. - https://community.bistudio.com/wiki/pickWeaponPool + https://community.bistudio.com/wiki/groupRadio - pickWeaponPool Object + Object groupRadio String - pickWeaponPool object + unit groupRadio radioName - + $Code$_soldierOne groupRadio "messageOne";$/Code$ + + $Code$player groupRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ + - undefined / undefined + global / local + (December 3, 2016) + To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: + $Code$ player groupRadio "#MySound.ogg";$/Code$ - Nothing + Nothing + - pitch + acos - Returns the pitch of a persons voice. + ArcCosine of a number, result in Degrees - https://community.bistudio.com/wiki/pitch + https://community.bistudio.com/wiki/acos - pitch Object + acos Number - pitch person + acos x - $Code$pitch player$/Code$ + $Code$_degrees = acos 0.5 + // returns 60$/Code$ undefined / undefined @@ -46343,1231 +47363,1072 @@ - Number + Number + - pixelGridBase + lbSetPictureRightColor - Returns grid size based on screen resolution. + Sets the color of the second (right aligned) picture of the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. - https://community.bistudio.com/wiki/pixelGridBase + https://community.bistudio.com/wiki/lbSetPictureRightColor - pixelGridBase + lbSetPictureRightColor Array + + Control lbSetPictureRightColor Array - pixelGridBase + lbSetPictureRightColor [idc, index, color] + + control lbSetPictureRightColor [index, color] - $Code$_gridBaseHeight = pixelH * pixelGridBase ;$/Code$ + $Code$lbSetPictureRightColor [101, 0, [0, 1, 0, 0.5]];$/Code$ + + $Code$_ctrl lbSetPictureRightColor [0, [1, 1, 1, 1]];$/Code$ undefined / undefined + More information on the LB command family can be found here - Number + Nothing - Nothing + - pixelGridNoUIScale + primaryWeaponItems - Returns grid size based on screen resolution and configs: uiScaleFactor, uiScaleMaxGrids - As mentioned in the name of this command, the user interface scale is ignored. + Returns array with all items assigned to the primary weapon. This command is used for infantry weapons only. - https://community.bistudio.com/wiki/pixelGridNoUIScale + https://community.bistudio.com/wiki/primaryWeaponItems - pixelGridNoUIScale + primaryWeaponItems Object - pixelGridNoUIScale + primaryWeaponItems unit - $Code$_gridHeightNoUIScale = pixelH * pixelGridNoUIScale ;$/Code$ + $Code$primaryWeaponItems player ; + /* + [ + "muzzle_snds_H",//silencer + "acc_pointer_IR",//laser + "optic_Aco",//optics + "bipod_01_F_blk"//bipod + ] + */$/Code$ undefined / undefined + (March 16, 2015) + Since revision 129742, this command also returns an attached bipod. - Number + Array + - pixelGrid + getOxygenRemaining - Returns grid size based on screen resolution, UI size and configs: uiScaleFactor, uiScaleMaxGrids. + Returns amount of remaining oxygen. - https://community.bistudio.com/wiki/pixelGrid + https://community.bistudio.com/wiki/getOxygenRemaining - pixelGrid + getOxygenRemaining Object - pixelGrid + getOxygenRemaining unit - $Code$_gridHeight = pixelH * pixelGrid ;$/Code$ + $Code$_oxygen = getOxygenRemaining player;$/Code$ undefined / undefined + (October 24, 2014) + Unit will die instantly at 0 oxygen unlike some other games that permit a certain amount of time after oxygen is depleted. - Number + Number + - pixelH + roleDescription - Returns the height of one pixel for current resolution. + Returns unit description set in Editor and visible on role selection screen in MP. Works in MP and SP. - https://community.bistudio.com/wiki/pixelH + https://community.bistudio.com/wiki/roleDescription - pixelH + roleDescription Object - pixelH + roleDescription unit - $Code$_pixelHeight = pixelH ;$/Code$ + $Code$_playerRole = roleDescription player ;$/Code$ undefined / undefined + (June 29, 2015) + One thing you should know about roles. When switching to units placed in editor on the fly in MP, it could mess up the role of the player. Could be bug, could be intended, but I would not recommend doing this. Create new unit dynamically if you need to switch to. Anyway, if role of the unit is messed up so is roleDescription. + + (May 26, 2017) + roleDescription works for playableUnits only. That means not on AI disabled in lobby and not in SP (even for player). - Number + String + - pixelW + setCuratorEditingAreaType - Returns width of one pixel for current resolution. + Set whether curator can edit in all editing areas (true) or outside of them (false). - https://community.bistudio.com/wiki/pixelW + https://community.bistudio.com/wiki/setCuratorEditingAreaType - pixelW + Object setCuratorEditingAreaType Boolean - pixelW + curatorObj setCuratorEditingAreaType bool - $Code$_pixelWidth = pixelW ;$/Code$ + $Code$curatorModule setCuratorEditingAreaType true$/Code$ undefined / undefined + This scripting command must be executed on the server to work properly in multiplayer - Number + Nothing + - pi + limitSpeed - pi (180 degrees converted to Radians ). + Limit speed of given vehicle or person to given value (in km/h). - https://community.bistudio.com/wiki/pi + https://community.bistudio.com/wiki/limitSpeed - pi + Object limitSpeed Number - pi + objectName limitSpeed speed - $Code$_radians = 2*pi - // Result is 6.2830$/Code$ + $Code$// Adjust "speedLimit" variable to change limited speed. (A3 1.24 we don't need loop for a continus effect, limitSpeed alone is enough.) + _this setVariable ["speedLimit", 200]; + _nul = _this spawn { + while { canMove _this} do { + _this limitSpeed (_this getVariable "speedLimit"); + sleep 0.1; + }; + };$/Code$ + + $Code$["SpeedObserver","onEachFrame",{ hintSilent format ["%1", speed vehicle MyVehicle]},[]] call BIS_fnc_addStackedEventHandler ; + sleep 10; + MyVehicle limitSpeed 5; //Watch the effect of this command.$/Code$ undefined / undefined + (9 February 2008) + (A1 1.08.5163)Has only an temporary effect on the vehicle specified (i.e. vehicle goes back to its previous speed right away). So, in order for this command to have a real, noticeable effect, it would have to be issued continuously (e.g. via a script loop, but in A3 1.24 it's unnecessary). + + (29 July 2014) + (A3 1.24)To clarify, limitSpeed only do effect on non-player controlled AI units, it has continuous effect and AI won’t break through the speed limitation until one is contacted, engaged or regrouped. - Number + Nothing + - playActionNow + sideAmbientLife - When used on a person, a smooth transition to the given action will be initiated, but all previous playAction are discarded. - For Arma 3 actions see: playAction/actions. + Returns side of ambient life, for example ambient life placed in Eden Editor. - https://community.bistudio.com/wiki/playActionNow + https://community.bistudio.com/wiki/sideAmbientLife - Object playActionNow String + sideAmbientLife - soldier playActionNow action + sideAmbientLife - $Code$soldierOne playActionNow "SitDown";$/Code$ - - $Code$rabbitTwo playActionNow "WalkF";$/Code$ + $Code$_sideAmbientLife = sideAmbientLife ;$/Code$ - local / global + undefined / undefined - (October 12, 2010) - Some other possible playactions: - "walkf" - walk forward - "walkb" - walk backwards - "walkr" - strafe right - "walkl" - strafe left - "grabdrag" - initiate First Aid dragging animation - "stopdrag" - stops First Aid dragging animation - "reloadMagazine" - reloads the current magazine - "gestureFreeze" - hand signal "Freeze" - "GestureGo" - "GestureCover" - "GestureAttack" - "GestureCeaseFire" - "GestureFollow" - "GestureUp" - "GestureAdvance" - "GesturePoint" - Note that playAction works regardless of stance (rifle up, down, crouched, prone). - Nothing + Side + - playAction + lbPictureRight - When used on a person, a smooth transition to the given action will be initiated. - For Arma 3 actions see: playAction/actions. + Returns the right picture name of the item with the given index of the listbox or combobox with id idc of the topmost user dialog. - https://community.bistudio.com/wiki/playAction + https://community.bistudio.com/wiki/lbPictureRight - Object playAction String + lbPictureRight Array + + Control lbPictureRight Number - soldier playAction action + lbPictureRight [idc, index] + + control lbPictureRight index - $Code$soldierOne playAction "SitDown"$/Code$ + $Code$_picture = lbPictureRight [101, 0];$/Code$ + + $Code$_picture = _control lbPictureRight 0;$/Code$ - local / global + undefined / undefined - Nothing + String - String + - playGesture + ctrlSetTooltip - When used on a person,a smooth transition to the given move will be initiated. Command doesn't seem to be functional + Sets tooltip text of given control. - https://community.bistudio.com/wiki/playGesture + https://community.bistudio.com/wiki/ctrlSetTooltip - Object playGesture String + Control ctrlSetTooltip String - soldier playGesture moveName + control ctrlSetTooltip text - $Code$soldierOne playGesture "Wave"$/Code$ + $Code$_control ctrlSetTooltip "tooltip";$/Code$ + + $Code$findDisplay 10000 displayCtrl 10001 ctrlSetTooltip "ThisIsAGoodTip";$/Code$ + + $Code$with uiNamespace do + { + bar = findDisplay 46 createDisplay "RscDisplayEmpty" ctrlCreate ["RscProgress", -1]; + bar ctrlSetPosition [0,0,1,0.01]; + bar ctrlCommit 0; + bar progressSetPosition 0.75; + bar ctrlSetTooltip "lalalalalalalala"; + };$/Code$ undefined / undefined - (August 31, 2010) - Rpt says "Not implemented" as of OA 1.54. + (September 26, 2017) + NOTE : If you want to recieve a multi-line tooltip, you can simply input newline escape symbol in your text: + $Code$_ctrl ctrlSetTooltip "Your text\nYour text on next line";$/Code$ + Localization files (stringtable.xml) also supports that. - Nothing + Nothing + - playMission + setVehicleLock - The mission is launched (from the main menu). Both campaign and mission are given as their directory name. If the campaign is empty, a single mission is launched. If skipBriefing is true, the intro and briefing are skipped. + Sets vehicle lock. Possible values: + "UNLOCKED" + "DEFAULT" + "LOCKED" + "LOCKEDPLAYER" - https://community.bistudio.com/wiki/playMission + https://community.bistudio.com/wiki/setVehicleLock - playMission Array + Object setVehicleLock String - playMission [campaign, mission, skipBriefing] + vehicleName setVehicleLock lockState - $Code$playMission ["XOutrage","x05Negotiator.Noe"]$/Code$ + $Code$_veh1 setVehicleLock "LOCKED";$/Code$ - undefined / undefined + local / global + (October 22, 2014) + In Arma 3: + setVehicleLock "UNLOCKED" = same as " lock 0" + setVehicleLock "DEFAULT" = same as " lock 1" + setVehicleLock "LOCKED" = same as " lock 2" + setVehicleLock "LOCKEDPLAYER" = same as " lock 3" + + (March 4, 2015) + DEFAULT lock is default vehicle lock when vehicle placed in editor. If player is in a group of AIs and not the leader, he will not be able to enter this vehicle as he will not have GetIn action for this vehicle. - Nothing + Nothing + - playMoveNow + setMarkerBrushLocal - When used on a person,a smooth transition to the given move will be initiated, but all previous playMove are discarded. - List of moves in ArmA 2 List of moves in Armed Assault List of moves in Operation Flashpoint: Resistance - The difference between playMove and playMoveNow is that playMove adds another move to the move queue, while playMoveNow replaces the whole move queue with new move: - $Code$ player switchMove "amovpercmstpsraswrfldnon"; - [] spawn - { - sleep 0.5; - player playMove "amovppnemstpsraswrfldnon"; // player goes prone - player playMove "amovpknlmstpsraswrfldnon"; // player gets up on one knee - };$/Code$ - Compared to: - $Code$ player switchMove "amovpercmstpsraswrfldnon"; - [] spawn - { - sleep 0.5; - player playMove "amovppnemstpsraswrfldnon"; // player never goes prone - player playMoveNow "amovpknlmstpsraswrfldnon"; // player goes down on one knee straight away - };$/Code$ + Selects the fill texture for the marker ("RECTANGLE" or "ELLIPSE"). Brush is the name of the subclass in CfgMarkerBrushes. + brush can be: + "Solid" + "SolidFull" (A3 only) + "Horizontal" + "Vertical" + "Grid" + "FDiagonal" + "BDiagonal" + "DiagGrid" + "Cross" + "Border" (A2/A3 only) + "SolidBorder" (OA/A3 only) - https://community.bistudio.com/wiki/playMoveNow + https://community.bistudio.com/wiki/setMarkerBrushLocal - Object playMoveNow String + String setMarkerBrushLocal String - soldier playMoveNow moveName + markerName setMarkerBrushLocal brush - $Code$player playMoveNow "AmovPercMevaSlowWrflDf"$/Code$ + $Code$"Marker1" setMarkerBrushLocal "DiagGrid";$/Code$ - local / global + undefined / local - Nothing + Nothing + - playMove + disableDebriefingStats - When used on person, smooth transition to given move will be done. - List of moves in ArmA 2 List of moves in Armed Assault List of moves in Operation Flashpoint: Resistance - The difference between playMove and playMoveNow is that playMove adds another move to the move queue, while playMoveNow replaces the whole move queue with new move: - $Code$ player switchMove "amovpercmstpsraswrfldnon"; - [] spawn - { - sleep 0.5; - player playMove "amovppnemstpsraswrfldnon"; // player goes prone - player playMove "amovpknlmstpsraswrfldnon"; // player gets up on one knee - };$/Code$ - Compared to: - $Code$ player switchMove "amovpercmstpsraswrfldnon"; - [] spawn - { - sleep 0.5; - player playMove "amovppnemstpsraswrfldnon"; // player never goes prone - player playMoveNow "amovpknlmstpsraswrfldnon"; // player goes down on one knee straight away - };$/Code$ + Disable debriefing score table. + This command is broken. - https://community.bistudio.com/wiki/playMove + https://community.bistudio.com/wiki/disableDebriefingStats - Object playMove String + disableDebriefingStats - unitName playMove moveName + disableDebriefingStats - $Code$soldierOne playMove "Stand"$/Code$ + $Code$disableDebriefingStats ;$/Code$ - local / global + undefined / undefined - For an immediate transition use switchMove. This command must be executed after mission start. If you place it into init.sqs / init.sqf or in the Init field of some unit, it will not work. Just add a little delay (~0.001) and then place the command. - Nothing + Nothing + - playMusic + camCommit - Plays music defined in Description.ext#CfgMusic or config.cpp. To stop the music execute playMusic "" or give the start time which is beyond the music duration playMusic ["SomeMusic", 1000]; - For Arma 3 music, see Arma 3 CfgMusic. Since Arma 3 v1.67 one can use Jukebox Utility to preview in-game music. + Smoothly conduct the changes that were assigned to a camera within the given time. If the time is set to zero, the changes are done immediately. - https://community.bistudio.com/wiki/playMusic + https://community.bistudio.com/wiki/camCommit - playMusic String - - playMusic Array + Object camCommit Number - playMusic name - - playMusic [name, start] + camera camCommit time - $Code$playMusic "RadioAmbient1";$/Code$ - - $Code$playMusic ["RadioAmbient3", 3]; //start from 00:00:03$/Code$ + $Code$// SQS + ; create a camera object + _cam = "camera" camCreate [5600,4800,10] + _cam camSetTarget player + _cam cameraEffect ["internal", "BACK"] + _cam camCommit 0 + ; smoothly move the camera to its new position in 6 seconds + _cam camSetPos [5680,4720,20] + _cam camCommit 6 + @ camCommitted _cam + ; proceed$/Code$ - $Code$// Play from 00:00:01 to 00:00:05 - 0 = [] spawn { - playMusic ["RadioAmbient5", 1]; - sleep 4; - playMusic ""; - };$/Code$ + $Code$// SQF + private "_cam"; + comment "create a camera object"; + _cam = "camera" camCreate [ position player select 0, position player select 1, 2]; + _cam camSetTarget player ; + _cam cameraEffect ["internal", "BACK"]; + _cam camCommit 0; + comment "smoothly move the camera to its new position in 6 seconds"; + _cam camSetPos [ position player select 0, ( position player select 1) + 10, 20]; + _cam camCommit 6; + waitUntil { camCommitted _cam; };$/Code$ - undefined / local + local / local - You can get all Music Types from Arma:_cfgMusic - http://community.bistudio.com/wiki/Arma_2:_Music#top - Nothing - Nothing + Nothing + - playScriptedMission + switchableUnits - Load the given world, launch an empty mission and execute the given, expression. Config (optional) can reference to the config entry, replacing description.ext for this mission. + Returns a list of playable units available for switching to. Command is relative to the client on which it is executed and will only show playable units for the same side as player 's group + player himself. The playableUnits command on the other hand will show all playable units regardless of the side. Exception is SP, where playable units from all sides will be accessible via this command. Dead units are automatically removed from the resulting array. Playable units that are already occupied by other human players will also not show in the results. + NOTE that in Multiplayer, switchableUnits are only available when respawn type is set to SIDE or GROUP. In all other cases it is an empty array []. - https://community.bistudio.com/wiki/playScriptedMission + https://community.bistudio.com/wiki/switchableUnits - playScriptedMission Array + switchableUnits - playScriptedMission [world,expression,config,ignoreChildWindow] + switchableUnits - $Code$playScriptedMission - [ - "desert_e", - { - private["_handle"]; - _handle = execVM "\ca\missions_e\data\scenes\credits1\init.sqf"; - }, - configFile/"CfgMissions"/"Cutscenes"/"Credits" - ];$/Code$ - + - undefined / undefined + undefined / local - (December 31, 2015) - For this command to work, you will need to - call command with ignoreChildWindow param set to true (in VBS docs its called fromMission) - close any opened display (not sure about this part, but closing every display (but #0) seems to work): - If mission is run from 2D editor, you can just close RscDisplayArcadeMap display (idd 26) (because this was done from 2D editor, so RscDisplayArcadeMap is still active in background -- benargee ) - If mission is run from single mission browser, you can just close RscDisplaySingleMission (idd 2) - end mission - Debriefing will show and player will be moved to new mission after clicking on Continue. - Command is a bit bugged: - Third (config) param doesn't seem to work - If you run this command in mission loaded from pbo, said pbo won't be writable until you close the game (you can't update it) - Following code will change change island to Stratis and spawns player as basic soldier at [0,0,0] coordinates. - $Code$disableSerialization; - playScriptedMission ['Stratis',{ - createCenter west; - _grp = createGroup west; - _player = _grp createUnit ["B_Soldier_F",[0,0,0],[],0,"NONE"]; - selectPlayer _player; - },missionConfigFile, true]; - //Close all displays that could be the background display... this is essentialy forceEnd command - //Closing #0 will cause game to fail - _zero = findDisplay(0); - { - if (_x != _zero) then { - _x closeDisplay 1; - }; - } foreach allDisplays; - failMission "END1";$/Code$ - (tested in Arma 3 1.54.133741) + (July 06, 2011) + On dedicated server this command returns empty array. - Nothing + Array + - playSound3D + ropeUnwound - Plays positional sound with given filename on every computer on network. At least 2 parameters must be specified. + False if unwinding in progress, otherwise true - https://community.bistudio.com/wiki/playSound3D + https://community.bistudio.com/wiki/ropeUnwound - playSound3D Array + ropeUnwound Object - playSound3D [filename, soundSource, isInside, soundPosition, volume, soundPitch, distance] + ropeUnwound rope - $Code$playSound3D ["A3\Sounds_F\sfx\blip1.wav", player ]$/Code$ - - $Code$playSound3D ["A3\Sounds_F\sfx\blip1.wav", player, false, getPosASL player, 1, 1, 0]$/Code$ - - $Code$// Sound file extension must be specified even if a config entry has none: - playSound3D ["A3\Sounds_F\sfx\alarm_independent", player ]; //no sound - playSound3D ["A3\Sounds_F\sfx\alarm_independent.wss", player ]; //alarm$/Code$ + $Code$_isUnwound = ropeUnwound ( ropes heli1 select 0);$/Code$ - global / global + undefined / undefined - (September 23, 2013) - This command works well with addon sounds, however getting it to play mission sound files is a bit tricky. Follow this guide - - (September 26, 2014) - Currently, playSound3D is not JIP compatible, so joining players will not hear the sound if is started before and is still playing when player joins. - - (October 16, 2013) - You need to get the correct path for custom mission sounds. Use missionConfigFile with BIS_fnc_trimString (to trim off " description.ext "), then add your mission's sound directory and sound file: - $Code$_soundPath = [( str missionConfigFile ), 0, -15] call BIS_fnc_trimString; - _soundToPlay = _soundPath + "sounds\some_sound_file.ogg"; - playSound3D [_soundToPlay, _sourceObject, false, getPos _sourceObject, 10, 1, 50]; - //Volume db+10, volume drops off to 0 at 50 meters from _sourceObject$/Code$ - - (November 8, 2014) - When object is supplied but not a position, the position is taken from object, otherwise the position is taken from supplied position. That doesn't mean that when position is taken from object it is going to follow object when it changes position. The sound is generated at object position and it stays there. - Nothing + Boolean + - playSound + addCamShake - Selects sound from Description.ext#CfgSounds or config.cpp. + Creates the camera shaking effect, like when you are near an explosion - https://community.bistudio.com/wiki/playSound + https://community.bistudio.com/wiki/addCamShake - playSound String - - playSound Array + addCamShake Array - playSound soundName - - playSound [soundName, isSpeech] + addCamShake [power, duration, frequency] - $Code$playSound "soundname"$/Code$ - - $Code$// Start a sound and then stop it after 1.2 second: - playSound "AlarmCar"; - [] spawn - { - _sound = ASLToAGL [0,0,0] nearestObject "#soundonvehicle"; - sleep 1.2; - deleteVehicle _sound; - };$/Code$ + $Code$addCamShake [10, 1, 25];$/Code$ - $Code$// Start a sound and wait until it is finished: - playSound "Alarm"; - hint "Started!"; - [] spawn - { - _sound = ASLToAGL [0,0,0] nearestObject "#soundonvehicle"; - waitUntil { isNull _sound}; - hint "Finished!"; - };$/Code$ + $Code$enableCamShake true ; + addCamShake [5, 5, 25];$/Code$ undefined / local - (August 4, 2006) - Notes from before the conversion: - For dialogue involving living units it is better to use say, playSound will play a sound at the location of the player, say will play a sound at the location of the unit that is speaking, and it will only play that sound if the unit is alive. - - (December 28, 2014) - As you may have noticed, the parameter for playsound/say3d that deals with the "volume" of the sound played has little to do with the effective loudness heard in game. What it is alters is the drop off for fading the sound at a distance. A higher decibel or integer value will increase the distance before any sort of fading will take place. The actual volume of the sound file played will factor in to this, as it does throughout the playing action. - Amplifying the Sound - Modifying the effective volume of sounds played by the engine is possible by "spamming" the sounds. By quickly playing the sounds overtop of one another, you can effectively amplify the volume - This example, - $Code$ - playSound "soundname"; - playSound "soundname"; - $/Code$ - Will effectively amplify the sound by a sensed 2x. The volume of the sound file itself will still affect the sound volume as it appears as though the arma engine has no normalization for sound files added to it. - This technique may cause issues in sound quality in large multiplayer servers. I observed multiple instances when a triggered sound amplified with this method was out of sync with each other. Timing of the individual commands sent over the network is probably the issue. Recommend you compile your amplification code into a single finished function for better syncing for clients not activating the action/far away from the activation position. - Nothing - Nothing + Nothing + - playableSlotsNumber + doGetOut - Returns the number of available slots in mission per side (both empty and taken). In singleplayer mission, it returns number of playable units per side. + Orders a unit or units to get out from the vehicle (silently). - https://community.bistudio.com/wiki/playableSlotsNumber + https://community.bistudio.com/wiki/doGetOut - playableSlotsNumber Side + doGetOut Object/Array - playableSlotsNumber side + doGetOut unit - $Code$_maxBluforPlayers = playableSlotsNumber blufor ;$/Code$ + $Code$doGetOut _unitOne$/Code$ - undefined / undefined + local / global - Number + Nothing + - playableUnits + getAimingCoef - Returns a list of playable units in a multiplayer game (occupied by both AI or players), created on the following sides east, west, resistance / independent and civilian only. Does not contain units of sideLogic. This does not include dead players awaiting for respawn. + Get current aiming coefficient (higher ~ less precise, default is 1) - https://community.bistudio.com/wiki/playableUnits + https://community.bistudio.com/wiki/getAimingCoef - playableUnits + getAimingCoef Object - playableUnits + getAimingCoef unit - $Code${_x groupChat "I'm a playable unit.";} forEach playableUnits ;$/Code$ - - $Code$// All playable units in a group: - _playableInGroup = units group player arrayIntersect playableUnits ;$/Code$ - - $Code$// All non-playable units in a group: - _playableInGroup = units group player - playableUnits ;$/Code$ + $Code$_coef = getAimingCoef player$/Code$ undefined / undefined - (July 13, 2009) - In single-player missions, this command will return an empty array. - - (December 23, 2014) - To get a list of all player-controlled units: - $Code$_allPlayers = []; - { - if ( isPlayer _x) then - { - _allPlayers pushBack _x; - }; - } forEach playableUnits ;$/Code$ - - (April 15, 2015) - Quote: $Code$ Killswitch - In single-player missions, this command will return an empty array.$/Code$ - Use the switchableUnits command instead - - (August 16, 2015) - playableUnits will not return dead players, use allPlayers instead. - - (February 14, 2017) - Using the Editor (multiplayer attributes) for unchecking "enable AI", or disabling AI(s) in lobby, will make playableUnits as a public variable, updated by each JIP on disabled slot. So, if all slots are diabled AI, playableunits is same as allPlayers - Furthermore, in this case, non-played slot (playable and disabled AI) units simply don't exist! i.e. If you name 8 playable units: u1..to u8, then 2 players in game: u3 & u6 - playableUnits will return [u3,u6], and true for isNil "u1", isNil "u2"... until another player takes the slot. - Array + Number + - playerRespawnTime + reload - Return the player remaining time to respawn or -1 if it is not available. + Reload all weapons - https://community.bistudio.com/wiki/playerRespawnTime + https://community.bistudio.com/wiki/reload - playerRespawnTime + reload Object - playerRespawnTime + reload unitName - $Code$waitUntil { playerRespawnTime = 0};$/Code$ + $Code$if ( needReload player == 1) then { reload player };$/Code$ undefined / undefined - (June 21, 2007) - When playerRespawnTime reaches zero the player respawns as expected. When the player has completed respawning this command returns -1. - - (February 25, 2009) - Also note that spawning doesn't create a body to use, but allows a player to choose an already - existing one as defined either in the mission editor or in a script as player or playable. - Number + Nothing + - playerSide + diag_logSlowFrame - Returns the player's side. This is valid even when the player controlled person is dead (a difference from side player ). + Log all frames, where section takes longer than the threshold (in seconds). + Note : Only available in specific builds. See Performance Profiling for details. - https://community.bistudio.com/wiki/playerSide + https://community.bistudio.com/wiki/diag_logSlowFrame - playerSide + diag_logSlowFrame Array - playerSide + diag_logSlowFrame [section, threshold] - $Code$if ( side man1 == playerSide ) then { - hint "man1 is on your side!"; - };$/Code$ - - $Code$switch ( playerSide ) do { - case west : { - hint "You are BLUFOR"; - }; - case east : { - hint "You are OPFOR"; - }; - };$/Code$ + $Code$diag_logSlowFrame ['total',0.3]$/Code$ undefined / undefined - (27 Jan, 2008) - playerSide defaults to west for JIP players early on during initialization regardless of their side. - So if you are a JIP player on another side (like east ), you will need to cater for this for any early initializations. - - (13 Oct, 2008) - playerSide also shows your starting side, even if your side changes to enemy due to a bad rating. In that case, playerSide != side player. - Side + Nothing + - playersNumber + and - Returns count of occupied role selection slots for given side. Players who claimed a slot in the lobby but didn't start the mission are counted as well. If disabledAI = 0; in description.ext or Enable AI option is checked in 3DEN, AI bots will be treated as valid players and will be counted too. Multiplayer only, in singleplayer always returns 0. + Returns true only if both conditions are true. In case of the alternative syntax, lazy evaluation is used (if left operand is false, evaluation of the right side is skipped completely). - https://community.bistudio.com/wiki/playersNumber + https://community.bistudio.com/wiki/and - playersNumber Side + Boolean and Boolean + + Boolean and Code - playersNumber side + a and b + + a and b - $Code$_west = playersNumber west ; - _east = playersNumber east ; - _civ = playersNumber civilian ; - hint format ["West:%1 East:%2, Civ:%3", _west, _east, _civ];$/Code$ + $Code$if (( alive player ) and (_enemycount == 0)) then { hint "you win !"}$/Code$ + + $Code$if (( count _array 0) and {(_array select 0) == player }) then { hint "It works! Without lazy evaluation it would throw an error if array was empty."}$/Code$ undefined / undefined - (April 13, 2015) - playersNumber returns playable AI as well as human players. It does not include non playable AI. [NOTE: This was observed in ArmA 1.05] - To get the amount of players that are on the same side as the person executing the script: - $Code$playersNumber playerSide;$/Code$ + (April 12, 2015) + Just like the "or" command, the "and" command allows several conditions to be checked. Example: + $Code$if(alive player and speed player 0 and _someOtherVar) then { hint"All three condtions are true" };$/Code$ + The example above will check if the player is alive and if the player is moving and checks if _someOtherVar is true. - Number + Boolean - Boolean + - player + lnbAddArray - Person controlled by player. - In MP this value is different on each computer and on dedicated server this value is null. - In Intros and Outros this isn't set by default and must be assigned. + Adds list of rows of strings. - https://community.bistudio.com/wiki/player + https://community.bistudio.com/wiki/lnbAddArray - player + lnbAddArray Array - player + lnbAddArray [idc, [[[text,text],[value,],[data,]],[[text,text],[value,],[data,]],]] - $Code$player addRating 500;$/Code$ + $Code$lnbAddArray [102,[[["#1"],[1],["#1"]]]];$/Code$ - undefined / undefined + local / local - (20 Jul, 2010) - Before you use the player object (usually to avoid JIP issues) all you need is to run: - waitUntil {!isNull player}; - Anything else you see in other scripts is equivalent and/or redundant. Of course JIP players may need more than just the player to point at the actual JIP player unit, but that's script/mission-specific. - - (27 Jan, 2008) - ( isNull player ) is true for JIP players on their client during initialization. - After initialization, it will be set, making it valid again. - To cater for this, some people use code similar to the following in their spawned scripts: - if (!isServer && (player != player)) then - { - waitUntil {player == player}; - waitUntil {time 10}; - }; - // 'player' will now be valid - _action = player addAction ["heal", "heal.sqf", [], -1, false, false, ""]; - See JIP/player topic for additional helpful information. - - (June 26, 2014) - player can actually be REMOTE object on player's PC: http://www.youtube.com/watch?v=m6IILtfa3cQ - Object + Number + - posScreenToWorld + setVehicleCargo - Convert screen coordinates in map to world coordinates. + Load cargo vehicle inside vehicle if possible, returns bool based on whether the vehicle was able to be loaded. Can also be used to unload a specific loaded vehicle or all loaded vehicles. - https://community.bistudio.com/wiki/posScreenToWorld + https://community.bistudio.com/wiki/setVehicleCargo - Control posScreenToWorld Array + Object setVehicleCargo Object - map posScreenToWorld [x, y] + vehicle setVehicleCargo cargo - $Code$_WorldCoord = _Control posScreenToWorld _ScreenCoord$/Code$ + $Code$// Blackfish with no vehicle cargo loaded + _success = blackfish setVehicleCargo offroad; //true$/Code$ - $Code$_WorldCoord = _Control posScreenToWorld [_x,_y]$/Code$ + $Code$// Blackfish with full cargo already loaded + _success = blackfish setVehicleCargo offroad; //false$/Code$ + + $Code$// Unload specific loaded vehicle + _success = objNull setVehicleCargo offroad;$/Code$ + + $Code$// Unload all vehicles + _success = blackfish setVehicleCargo objNull ;$/Code$ undefined / undefined - (April 7, 2007) - Notes: - You can get the screen coordinates by the UI Event Handlers onMouseButtonDown, onMouseButtonUp, onMouseButtonClick, onMouseButtonDblClick. - The return Array is in 2-D, you can use it with all set-position commands. - _x = returnArray select 0; - _y = returnArray select 1; + (July 4, 2016) + From biforums : + "objnull setVehicleCargo cargo vehicle - will unload specific loaded vehicle" and "transporting vehicle setVehicleCargo objnul - unload all vehicles" - Array + Boolean + - posWorldToScreen + allCutLayers - Convert world coordinates to screen coordinates in map. + Returns all named layers used by cutRsc, cutText, cutObj or cutFadeOut. The layer normally would be added on the first use of any of the aforementioned commands, however if a layer needs to be reserved it could be done like so: _layerNum = "myLayerName" cutFadeOut 0;. The index of the layer name in the array corresponds to the layer number the cut effect will be displayed on. If no layers were defined, the return is [""], because 0 layer is reserved for usage in cut commands without layer param or when name of the layer given is empty "". - https://community.bistudio.com/wiki/posWorldToScreen + https://community.bistudio.com/wiki/allCutLayers - Control posWorldToScreen Array + allCutLayers - map posWorldToScreen position + allCutLayers - + $Code$_allLayers = allCutLayers ;$/Code$ + undefined / undefined - Array + Array + - positionCameraToWorld + onPreloadStarted - Transforms position from camera coordinate space to world coordinate space. - Camera axes are relative to camera orientation. x axis goes from left of the camera to right of the camera, z axis goes from underneath the camera to above the camera and y axis goes from back of the camera to where the camera is looking. + Defines an action performed just before the preload screen started. Preload event occurs after briefing screen on mission start. + i + Since Arma 3 v1.57 a stackable version of this EH is available: PreloadStarted + In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. - https://community.bistudio.com/wiki/positionCameraToWorld + https://community.bistudio.com/wiki/onPreloadStarted - positionCameraToWorld PositionRelative + onPreloadStarted String/Code - positionCameraToWorld cameraPos + onPreloadStarted command - $Code$_worldPos = positionCameraToWorld _cameraPos;$/Code$ - - $Code$// Example demonstrating reversed y and z: - player setDir 0; //assuming player is looking forward - hint str [ positionCameraToWorld [0,0,0], positionCameraToWorld [0,0,1]]; - //[[2481.35,567 1.21,1.51395],[2481.35,567 2.21,1.46955]]$/Code$ + $Code$onPreloadStarted { diag_log "preload started"};$/Code$ undefined / undefined - (October 17, 2008) - By measuring the distance between the camera and the player one can determine whether 1st-person or 3rd-person view is being used: - $Code$ if (( positionCameraToWorld [0,0,0] distance player ) 2) then { hint "3rd person"} else { hint "1st person"};$/Code$ - - (22:45, 17 October 2010 (CEST)) - The camera coordinate system is different from the model coordinate system: when modelToWorld uses [x, y, z] then positionCameraToWorld uses [x, z, y]. So for a steady camera the following is true: - $Code$ positionCameraToWorld [5,10,15] == _camera modelToWorld [5,15,10];$/Code$ - - (July 20, 2014) - When over land, the position returned is in format PositionATL, and over sea, PositionASLW. - Array + Nothing + - position + groupIconSelectable - Synonym for getPos. + Return if groups icon raises onClick and onOver events. - https://community.bistudio.com/wiki/position + https://community.bistudio.com/wiki/groupIconSelectable - position Object/Location + groupIconSelectable - position object + groupIconSelectable - $Code$_pos = position player ;$/Code$ - + undefined / undefined - Array + Boolean + - ppEffectAdjust + ctAddHeader - Set post process effect parameters. NOTE: The two syntaxes differ in what format of the params they accept. The syntax with PP name expects colors to be packed into arrays within main array, while the syntax with PP handle can handle both flat and packed array. Therefore it is recommended to use the universal packed format, such as shown in the examples. + Adds a header line of controls according to the HeaderTemplate class. It returns an array containing header index and array of created controls in a format [ headerIndex, [ control0, control1... control n ]]. + Note that rows and headers are indexed separately. - https://community.bistudio.com/wiki/ppEffectAdjust + https://community.bistudio.com/wiki/ctAddHeader - String ppEffectAdjust Array - - Number ppEffectAdjust Array + ctAddHeader Control - effect ppEffectAdjust settings - - effect ppEffectAdjust settings + ctAddHeader Control - $Code$"colorCorrections" ppEffectAdjust [1, 1, -0.01, [0, 0, 0, 0], [1.5, 1, 1.2, 0.6], [0.199, 0.587, 0.114, 0]];$/Code$ - - $Code$// Black&White: - _colorCorrectionsEffHandle ppEffectAdjust [1, 0.4, 0, [0, 0, 0, 0], [1, 1, 1, 0], [1, 1, 1, 0]];$/Code$ + $Code$_array = ctAddHeader _control;$/Code$ - undefined / local + local / local - Nothing - Nothing + Array + - ppEffectCommitted + ctrlMapAnimClear - Check whether given post process effect is committed + Clears the map animation. - https://community.bistudio.com/wiki/ppEffectCommitted + https://community.bistudio.com/wiki/ctrlMapAnimClear - ppEffectCommitted String - - ppEffectCommitted Number + ctrlMapAnimClear Control - ppEffectCommitted effect - - ppEffectCommitted effect + ctrlMapAnimClear controlName - $Code$ppEffectCommitted "colorCorrection";$/Code$ - - $Code$ppEffectCommitted _hndl;$/Code$ - - $Code$if ( ppEffectCommitted "colorCorrection") then { hint "alteration done !"};$/Code$ - + - undefined / undefined + local / local - Boolean - Boolean + Nothing + - ppEffectCommit + isWalking - Commit post process effect in given time. + Returns true if walk is toggled (W+S in Arma 3). - https://community.bistudio.com/wiki/ppEffectCommit + https://community.bistudio.com/wiki/isWalking - String ppEffectCommit Number - - Number ppEffectCommit Number - - Array ppEffectCommit Number + isWalking Object - effect ppEffectCommit commit - - effect ppEffectCommit commit - - [effect1,] ppEffectCommit commit + isWalking unitName - $Code$"colorCorrection" ppEffectCommit 3;$/Code$ - - $Code$_hndl ppEffectCommit 3;$/Code$ - - $Code$[_hndl1, _hndl2] ppEffectCommit 3;$/Code$ + $Code$_bool = isWalking player ;$/Code$ - undefined / undefined + global / undefined + (March 8, 2015) + To expand on the limited description, this command doesn't necessarily say whether or not the unit is currently walking. All it says is that walking is toggled on or off. This command can still return true when the unit is sprinting. When walking is toggled on, the unit will return to walking pace when not sprinting. When walking is toggled off, the unit will return to jogging pace when not sprinting. This command is not intended to gauge a units current movement speed. - Nothing - Nothing - Nothing + Boolean + - ppEffectCreate + attachedTo - Creates Post process effects specified by effect name and priority. Supported effects are: - "RadialBlur" - "ChromAberration" - "WetDistortion" - "ColorCorrections" - "DynamicBlur" - "FilmGrain" - "ColorInversion" + Returns the object it is attached to. + Returns objNull if not attached to anything. - https://community.bistudio.com/wiki/ppEffectCreate + https://community.bistudio.com/wiki/attachedTo - ppEffectCreate Array + attachedTo Object - ppEffectCreate [name, priority] - - ppEffectCreate [[name1, priority1],] + attachedTo object - $Code$_ppGrain = ppEffectCreate ["filmGrain", 2005];$/Code$ + $Code$if ( isNull attachedTo _obj1) then { + hint "_obj1 is not attached to anything."; + };$/Code$ undefined / undefined - (July 24, 2015) - "wetDistortion" only works if handle is used. Arma 3 (1.48.131561) - Number + Object + - ppEffectDestroy + menuShortcut - Destroy Post process effects given by handle or array of handles. + Returns shortcut related to menu entry on given path. - https://community.bistudio.com/wiki/ppEffectDestroy + https://community.bistudio.com/wiki/menuShortcut - ppEffectDestroy Number - - ppEffectDestroy Array + menuShortcut Array - ppEffectDestroy effect - - ppEffectDestroy [effect1,] + menuShortcut [idc, path] - $Code$ppEffectDestroy _hndl;$/Code$ - - $Code$ppEffectDestroy [_hndl0, _hndl1, _hndl2];$/Code$ - + undefined / undefined - Nothing - Nothing + Number + - ppEffectEnable + loadStatus - Enable / disable Post process effects + Loads object's properties from Objects.sav file in campaign directory (from entry name). - https://community.bistudio.com/wiki/ppEffectEnable + https://community.bistudio.com/wiki/loadStatus - String ppEffectEnable Boolean - - Number ppEffectEnable Boolean - - Array ppEffectEnable Boolean + Object loadStatus String - effect ppEffectEnable enable - - effect ppEffectEnable enable - - [effect1,] ppEffectEnable enable + obj loadStatus entryName - $Code$"colorCorrections" ppEffectEnable true ;$/Code$ - - $Code$_hndl ppEffectEnable true ;$/Code$ - - $Code$[_hndl1, _hndl2] ppEffectEnable true ;$/Code$ + $Code$_ok = player loadStatus "playerState";$/Code$ undefined / undefined @@ -47575,27 +48436,29 @@ - Nothing - Nothing - Nothing + Boolean + - ppEffectEnabled + set3DENObjectType - Checks whether given post process effect is enabled + Sets the classname of one or more given Eden Editor objects. For Logic objects use set3DENLogicType - https://community.bistudio.com/wiki/ppEffectEnabled + https://community.bistudio.com/wiki/set3DENObjectType - ppEffectEnabled Number + Array set3DENObjectType String - ppEffectEnabled effect + objects set3DENObjectType classname - $Code$_enabled = ppEffectEnabled _hndl;$/Code$ + $Code$[ get3DENMouseOver select 1] set3DENObjectType "B_crew_F"; + // turns object under cursor into a blufor crewman$/Code$ undefined / undefined @@ -47603,27 +48466,28 @@ - Boolean + Nothing + - ppEffectForceInNVG + ctrlSetTooltipColorText - Forces use of Post process effects in NVG. + Sets tooltip text color of given control. Color is in format Color. - https://community.bistudio.com/wiki/ppEffectForceInNVG + https://community.bistudio.com/wiki/ctrlSetTooltipColorText - Number ppEffectForceInNVG Boolean + Control ctrlSetTooltipColorText Array - number ppEffectForceInNVG bool + display ctrlSetTooltipColorText color - $Code$_ppGrain ppEffectForceInNVG true ;$/Code$ + $Code$_control ctrlSetTooltipColorText [1, 0, 0, 1]$/Code$ undefined / undefined @@ -47631,130 +48495,147 @@ - Nothing + Nothing + - precision + setHit - Return the precision of the given entity, how is the entity able to be precise when moving to given target. + Damage / repair part of object. The object must be local to the computer where command is executed. + Damage 0 means fully functional, damage 1 means completely destroyed / dead. Note: Some part names are in Czech; see translation table. - https://community.bistudio.com/wiki/precision + https://community.bistudio.com/wiki/setHit - precision Object + Object setHit Array - precision entity + object setHit [part, damage, useEffects] - $Code$if ( position _this distance _dangerPos = precision _this) then {...}; - //used in formationCDanger.fsm$/Code$ + $Code$vehicle player setHit ["motor", 1]$/Code$ + + $Code$vehicle player setHit ["mala vrtule", 0.95]$/Code$ + + $Code$if ( local _heli) then { + _heli setHit ["velka vrtule", 0]; + } else { + hint "Vehicle " + str _heli + " must be local to this machine to do that!"; + };$/Code$ - undefined / undefined + local / global + Damaging specific parts of the vehicle will not update its overall damage value (as of v1.03): + player setHit ["hands", 0.9]; + hint str (damage player); //will return 0 + + Direct use of the names of sections of the model is likely a bad practice, and will not work on some addons. + So instead: + _MH60S setHit ["elektronika", _hit]; + should be used: + _MH60S setHit [getText(configFile "cfgVehicles" "MH60S" "HitPoints" "HitAvionics" "name"), _hit]; + + Since there is no getHit (as of 1.61), you can use canMove command to check if vehicle is capable of moving. + For land wheeled vehicles canMove will return false if any real wheel (damaging nonexistent wheels doesn't count) has hitpoint damage greater than 0.9. Having HitEngine damage greater than 0.9 will make canMove to return false as well (plus will result in vehicle exploding). HitFuel however doesn't make canMove return false even though having high HitFuel damage will make car explode. + For helicopters HitEngine with damage greater than 0.9 will make canMove return false as well. Having HitHRotor (main rotor) damaged even up to 1 will never make canMove return false. However, if HitVRotor (tail rotor) will have damage greater than 0.703608 it will make canMove return false (even though some helicopters are controllable and flyable by player with broken tail rotor). + In same manner you can use canFire to check if turret hitpoints are not damaged enough to be able to fire. (canFire always returns false if there is nobody in vehicle) + Update: Since ArmA 3 1.31 getHit has been introduced. - Number + Nothing + - preloadCamera + addPlayerScores - Preload all textures and models around given Position to avoid visual artifacts after camera is moved. - Should be used before any abrupt camera change/cut. - Returns true once all data is ready. + MP server only: Adds player score. - https://community.bistudio.com/wiki/preloadCamera + https://community.bistudio.com/wiki/addPlayerScores - preloadCamera Array + Object addPlayerScores Array - preloadCamera position + unit addPlayerScores values - $Code$waitUntil { preloadCamera markerPos "cam_location_2"};$/Code$ + $Code$player addPlayerScores [0, 1, 0, 0, 1];$/Code$ undefined / undefined + This scripting command must be executed on the server to work properly in multiplayer + + (May 2, 2017) + As this command will add the given number to a player's score, a little bit of thought needs to be given to friendly-fire if it's for something like a deathmatch or a FFA, due to friendly-fire incurring negative points. So to counter this just add 2 points every time a player kills a unit from the same side: + $Code$player addPlayerScores [2, 0, 0, 0, 0];$/Code$ + The 2 points will add 1 point to counter the negative friendly-fire point and 1 point to add correctly to the score. - Boolean + Nothing + - preloadObject + getHit - Preloads all textures, materials and proxies needed to render given object. Works with both class names and objects. Returns true once all data is loaded and ready. + Returns selection damage. Same as getHitPointDamage only argument is selection part instead of hit point. Note: Some part names are in Czech; see translation table. - https://community.bistudio.com/wiki/preloadObject + https://community.bistudio.com/wiki/getHit - Number preloadObject Object - - Number preloadObject String + Object getHit String - distance preloadObject object - - distance preloadObject classname + vehicle getHit selection - $Code$[] spawn - { - waitUntil {10 preloadObject "SoldierW"}; - hint "Preload finished"; - };$/Code$ + $Code$player getHit "head";$/Code$ - $Code$[] spawn - { - waitUntil {10 preloadObject leader player }; - hint "Preload finished"; - };$/Code$ + $Code$_car getHit "motor";$/Code$ - undefined / undefined + global / undefined - Boolean - Boolean + Number/Nothing + - preloadSound + saveStatus - Makes sure that a sound can start playing without any delay once it is needed. Command works in Arma 3, but might not be implemented in earlier Arma installments. + Saves object's properties to Objects.sav file in campaign directory as entry name. - https://community.bistudio.com/wiki/preloadSound + https://community.bistudio.com/wiki/saveStatus - preloadSound String + Object saveStatus String - preloadSound soundName + object saveStatus name - $Code${ - waitUntil { preloadSound _x}; - } forEach getArray ( missionConfigFile "CfgSounds" "sounds");$/Code$ + $Code$player saveStatus "playerstate"$/Code$ undefined / undefined @@ -47762,60 +48643,58 @@ - Boolean + Boolean + - preloadTitleObj + createMenu - Object title - Preload data the object can be defined in the Description.ext file. + Creates a previously added menu. + i + Some Old Editor Command - https://community.bistudio.com/wiki/preloadTitleObj + https://community.bistudio.com/wiki/createMenu - preloadTitleObj Array + Control createMenu Number - preloadTitleObj [name, type] - - preloadTitleObj [name, type, speed, showInMap] + map createMenu index - $Code$_ok=preloadTitleObj ["BISLogo","plain"]$/Code$ - + undefined / undefined - Boolean + Nothing + - preloadTitleRsc + playMission - Resource title - Preload data. - The resource can be defined in the Description.ext file. + The mission is launched (from the main menu). Both campaign and mission are given as their directory name. If the campaign is empty, a single mission is launched. If skipBriefing is true, the intro and briefing are skipped. - https://community.bistudio.com/wiki/preloadTitleRsc + https://community.bistudio.com/wiki/playMission - preloadTitleRsc Array + playMission Array - preloadTitleRsc [name, type] - - preloadTitleRsc [name, type, speed, showInMap] + playMission [campaign, mission, skipBriefing] - $Code$_ok=preloadTitleRsc ["BIS", "PLAIN"]$/Code$ + $Code$playMission ["XOutrage","x05Negotiator.Noe"]$/Code$ undefined / undefined @@ -47823,239 +48702,179 @@ - Boolean + Nothing + - preprocessFileLineNumbers + setFatigue - Returns the preprocessed content of the given file. The preprocessor is C-like, it supports comments using // or /* and */ and macros defined with #define. The return is file content starting with #line 1 "aFilename" - This is how mysterious #line keyword works: - The keyword can be used in any script, even the one made on-the-fly and executed in debug console for example. The format is: - #line number " name " - followed by new line. number could be any positive integer and name could be any name. This will be used only if an error occurs in the script. The error will contain the line: - File filename, line linenumber - where filename will be the name you set and linenumber will be number + how many lines it is from the #line line. If the error happened on the line right under #line it will add 0 to number, if on second line, it will add 1 etc. - It is possible to use more than one #line keywords, but it seems having just one at the top of the script is enough to pinpoint position of the error easily. + Sets the person's fatigue, from 0 to 1. - https://community.bistudio.com/wiki/preprocessFileLineNumbers + https://community.bistudio.com/wiki/setFatigue - preprocessFileLineNumbers String + Object setFatigue Number - preprocessFileLineNumbers fileName + unit setFatigue value - $Code$_string = preprocessFileLineNumbers "A3\ui_f\scripts\IGUI\RscUnitInfo.sqf" - // Result is: - //#line 1 "A3\ui_f\scripts\IGUI\RscUnitInfo.sqf" - //disableserialization; - //........$/Code$ + $Code$player setFatigue 1;$/Code$ - undefined / undefined + global / local - (December 17, 2013) - The main difference between preprocessFile and preprocessFileLineNumbers is that the latter adds #line keyword to the target file, which allows to log the __LINE__ error happened at and the __FILE__ error happened in. + (05 April, 2014) + setFatigue will affect fatigue of a local unit only. If you execute it on remote unit, the getFatigue value will only change locally with no effect on remote unit. Scripted setFatigue changes don't broadcast at all. In short, use setFatigue on local units only. - String + Nothing + - preprocessFile + setLocalWindParams - Reads and processes the content of the specified file. Preprocessor is C-like, supports comments using // or /* and */ and macros defined with #define. Due to the hard-drive access this command executes (and the lack of caching) this command should not be used in time-critical script loops. + Sets parameters for helicopter rotor wash. Visually it affects how much the grass and bushes bend under a helicopter and how big is the area of the effect. Default [1.0, 1.0]. - https://community.bistudio.com/wiki/preprocessFile + https://community.bistudio.com/wiki/setLocalWindParams - preprocessFile String + setLocalWindParams Array - preprocessFile fileName + setLocalWindParams [strength, diameter] - $Code$_content = preprocessFile "myFunction.sqf";$/Code$ + $Code$setLocalWindParams [10, 5];$/Code$ undefined / undefined - (March 4, 2008) - File path is always relative to mission directory. If script dir\a.sqf includes dir\b.sqf, use "dir\b.sqf" and not "b.sqf". - - (July 8, 2011) - Use preprocessFileLineNumbers instead as it provides more context information on error. - - (December 17, 2013) - The main difference between preprocessFile and preprocessFileLineNumbers is that the latter adds #line directive to the target file, which allows to log the __LINE__ error happened at and the __FILE__ error happened in. - - (July 25, 2014) - Essentially what the preprocessFile command does is it refers to the contents of a file as a string: - Example 1: - boop.html: - $Code$ t align = 'center' valign = 'middle' shadow = '0' size = '2' structured text /t $/Code$ - init.sqf: - $Code$_text = parseText preprocessFile "boop.html"; - hint _text; - $/Code$ - This is especially useful for long strings, and it works on files with any file extension as long as they can be edited with a text editor. - Example 2: - init.sqf: - $Code$ hint preprocessFile "description.ext"; - copyToClipboard preprocessFile "mission.sqm"; - $/Code$ - The above is all valid. However, using *.jpg or any other files saved in an image format is not possible. - String + Nothing + - primaryWeaponItems + setFlagAnimationPhase - Returns array with all items assigned to the primary weapon. This command is used for infantry weapons only. + Sets flag position on the flag pole according to the given animation phase, where 0 is the bottom of the flag pole, 1 is the top of the flag pole. The changes to the flag position are local to the PC command is executed on. To animate flag use BIS_fnc_animateFlag - https://community.bistudio.com/wiki/primaryWeaponItems + https://community.bistudio.com/wiki/setFlagAnimationPhase - primaryWeaponItems Object + Object setFlagAnimationPhase Number - primaryWeaponItems unit + flag setFlagAnimationPhase phase - $Code$primaryWeaponItems player ; - /* - [ - "muzzle_snds_H",//silencer - "acc_pointer_IR",//laser - "optic_Aco",//optics - "bipod_01_F_blk"//bipod - ] - */$/Code$ + $Code$_flag1 setFlagAnimationPhase 0.5;$/Code$ - undefined / undefined + global / local - (March 16, 2015) - Since revision 129742, this command also returns an attached bipod. - Array + Nothing + - primaryWeaponMagazine + estimatedTimeLeft - Returns array containing class name of currently loaded primary weapon magazine (or magazine s in case of weapon having grenade launcher), otherwise it returns []. This command is used for infantry weapons only. + Sets the estimated time left in the game. Using this function the designer can provide a "time left" estimate that is shown in the "Game in progress" screen or in the master browser. This command works in MP only and must be executed on the server only. NOTE that since Arma 3 v1.69 the max value that can be set is 10 hours (36000 seconds) - https://community.bistudio.com/wiki/primaryWeaponMagazine + https://community.bistudio.com/wiki/estimatedTimeLeft - primaryWeaponMagazine Object + estimatedTimeLeft Number - primaryWeaponMagazine unit + estimatedTimeLeft seconds - $Code$hint primaryWeaponMagazine player ; //["30Rnd_65x39_caseless_mag"]$/Code$ + $Code$estimatedTimeLeft 600; //10 min$/Code$ - $Code$_array = primaryWeaponMagazine player ; - if ( count _array 0) then { - hint ("Primary weapon is loaded with " + (_array select 0) + "!"); - } else { - if ( primaryWeapon player != "") then { - hint "Primary weapon is not loaded!"; - } else { - hint "Player doesn't have a primary weapon!"; - }; - };$/Code$ + $Code$// For missions with a hard set limit adjusted via Param1, the following example can be used in the init.sqs file: + estimatedTimeLeft Param1;$/Code$ - undefined / undefined + undefined / global - (June 8, 2014) - This function returns an array like ["type of magazine loaded in primary weapon", "type of grenade loaded in launcher if exist"] - For example ["30Rnd_556x45_Stanag", "1Rnd_HE_Grenade_shell"], with no consideration about amount of these ammo. - However, be careful if you intend to use it in expression like : (magazines _unit) - (primaryWeaponMagazine _unit), i.e. magazines "minus" this array, - The result will inventory all magazines (with grenades, chemlights...) except ALL magazines (and grenades eventually) belonging to the TYPE of the loaded one! i.e. you suppress ALL "30Rnd_556x45_Stanag" but the "30Rnd_556x45_Stanag_Tracer_Green" are still remaining. - If you kill the unit, the same expression will return a consistent inventory as primary weapon "disappears" and primaryWeaponMagazine is empty. "30Rnd_556x45_Stanag" are back! + This scripting command must be executed on the server to work properly in multiplayer - Array + Nothing + - primaryWeapon + enableDiagLegend - Returns name of unit's primary weapon (empty string if none). + Enable or disable the legend for diagnostics. Internal dev only - https://community.bistudio.com/wiki/primaryWeapon + https://community.bistudio.com/wiki/enableDiagLegend - primaryWeapon Object + enableDiagLegend Boolean - primaryWeapon unit + enableDiagLegend Bool - $Code$_pWeap = primaryWeapon player ;$/Code$ - - $Code$hint primaryWeapon player ; //"arifle_MX_ACO_pointer_F"$/Code$ + $Code$enableDiagLegend false$/Code$ - global / undefined + undefined / undefined - (August 4, 2006) - primaryWeapon tells you what weapon the unit has irrespective of the status of the weapon. For example a unit that has an M16 on his back will still report an M16 as its primary weapon. - - (October 11, 2015) - To directly detect the active weapon use currentWeapon command. - String + Nothing + - priority + isUAVConnected - Return the priority of the task. + Returns true if UAV is connected to some terminal. - https://community.bistudio.com/wiki/priority + https://community.bistudio.com/wiki/isUAVConnected - priority Task + isUAVConnected Object - priority task + isUAVConnected uav - $Code$_prioTsk01 = priority task01$/Code$ + $Code$bool = isUAVConnected cursorTarget ;$/Code$ undefined / undefined @@ -48063,121 +48882,56 @@ - Number + Boolean + - private + echo - Sets a variable to the innermost scope as demonstrated in Example 3. One other command that is capable of creating private variables is params. - Since Arma 3 v1.53.132932 private can be used as keyword as shown in Example 4. + Sends any text into the debugger console or the logfile. Present in internal version only, not working in the retail version. - https://community.bistudio.com/wiki/private + https://community.bistudio.com/wiki/echo - private String - - private Array + echo String - private variableName - - private variableNameList + echo text - $Code$private "_varname";$/Code$ - - $Code$private ["_varname1", "_varname2"];$/Code$ - - $Code$_myvar = 123; - systemChat str [_myvar]; // -- [123] - call { - systemChat str [_myvar]; // -- [123] - private "_myvar"; - systemChat str [_myvar]; // -- [any] - _myvar = 345; - systemChat str [_myvar]; // -- [345] - }; - systemChat str [_myvar]; // -- [123]$/Code$ - - $Code$// Usage of private as keyword: - private _myvar = 123; - //is the same as - private "_myvar"; - _myvar = 123;$/Code$ - - $Code$_lol = 123; call { hint str [_lol]}; // [123] - _lol = 123; call { private "_lol"; hint str [_lol]}; // [any]$/Code$ + $Code$echo "Text in logfile"$/Code$ undefined / undefined - (Sep 24, 2009 15:04) - The example provided is fairly worthless without a context. - Using the private command allows you to declare a variable in the current scope, without regards to variables in a higher scope with the same name. Note that if you try to declare a variable without an underscore (meaning it's global) with the private command, it will cause an error. Specifically: "Error Local variable in global space". - Here's a code example with output for your benefit. - $Code$ - _foo = 10; - if (true) then - { - private ["_foo"]; - _foo = 5; - player sideChat format ["%1", _foo]; - }; - player sideChat format ["%1", _foo]; - $/Code$ - In this example, the first sidechat (innermost) returns 5 while the second sidechat (outermost) returns 10. - $Code$ - if (true) then - { - private ["_bar"]; - _bar = 5; - player sideChat format ["%1", _bar]; - }; - $/Code$ - In this example, the private command does nothing and is simply a waste of code, assuming there is no higher level code to interfere with the if statement. - - (August 4, 2010) - The higher scope is also the script from which the function has been called. - If you've got in the script: - $Code$ - _a = 1; - call compile loadFile "function.sqf"; - hint format ["%1", _a]; - $/Code$ - And in the function.sqf : - $Code$ - _a = 2; - $/Code$ - Game will display 2. - Inserting private "_a" in the function prevents the change and so number 1 will be displayed on the screen. - - (February 25, 2015) - Recursive loops require the use of private. Without it, your variables will be overwritten. - Nothing - Nothing + Nothing + - processDiaryLink + onShowNewObject - Open the diary screen on the record specified by link. + Defines an action performed when the user right clicks on the map and,selects New Object. Set to empty for default behavior. Command receives:,_pos array position, + i + Some Old Editor Command - https://community.bistudio.com/wiki/processDiaryLink + https://community.bistudio.com/wiki/onShowNewObject - processDiaryLink String + Control onShowNewObject String - processDiaryLink link + map onShowNewObject command @@ -48185,42 +48939,30 @@ undefined / undefined - (June 30, 2017) - To select various tabs in the map screen: - $Code$ processDiaryLink createDiaryLink ["selected_tab", player, ""];$/Code$ - ... where "selected_tab" can be "Map", "Tasks", "Diary", "Units", "Players", "Log". - - (June 30, 2017) - You can also force open diary with selected link by passing string in link format directly: - $Code$ processDiaryLink " log subject=""Diary"" /log ";$/Code$ - The above will open tab Briefing. - $Code$ processDiaryLink " log subject=""Diary"" record=""Record2"" /log ";$/Code$ - The above will open tab Briefing and select 3rd record from the bottom, provided the records were added consistently. - Nothing + Any_Value + - productVersion + get3DENLinesVisible - Returns the product's friendly name, identifier and version. In Arma 3 it also returns branch identifier, whether or not the game was launched using mods, and the platform. + Get visibility state of Eden Editor lines. - https://community.bistudio.com/wiki/productVersion + https://community.bistudio.com/wiki/get3DENLinesVisible - productVersion + get3DENLinesVisible - productVersion + get3DENLinesVisible - $Code$hint str productVersion ; // would return ["Arma 2 OA", "arma2oa", 162, 95208] on Arma 2 OA 1.62.95208$/Code$ - - $Code$hint str productVersion ; // ["Arma 3","Arma3",137,128764,"Development",false,"Windows"]$/Code$ + $Code$if ( get3DENLinesVisible select 0) then { hint "Lines are visible in the map.";};$/Code$ undefined / undefined @@ -48228,55 +48970,71 @@ - Array + Array + - profileNameSteam + nil - Returns name of the current Steam profile. + Nil value. This value can be used to undefine existing variables. - https://community.bistudio.com/wiki/profileNameSteam + https://community.bistudio.com/wiki/nil - profileNameSteam + nil - profileNameSteam + nil - $Code$_mySteamProfileName = profileNameSteam ;$/Code$ + $Code$variableToDestroy = nil ;$/Code$ undefined / undefined + Note that ArrayName = nil destroys the arrayNAME not the array content. + Array content is 'destroyed' when no more ArrayName s refer to the content. + + Never ever assign a value to nil ! + Doing so creates a global variable with the same name that overrides the "command" nil : + foo = "foo"; + nil = "bar"; + foo = nil; + hint foo; // displays "bar" + + (September 25, 2014) + While isNil isn't available in OFP/CWA you can easily emulate it with something like this: + _nil = format["%1",_nilstring]; + ?(format["%1",foo]==_nil): foo = "Hello World!" - String + Void + - profileName + objectFromNetId - Returns profile name. + Get object with given unique ID. If object is a group use groupFromNetId. As this command is MP only, you can use BIS_fnc_objectFromNetId, which extends the use to SP as well. - https://community.bistudio.com/wiki/profileName + https://community.bistudio.com/wiki/objectFromNetId - profileName + objectFromNetId String - profileName + objectFromNetId id - $Code$_myProfileName = profileName ;$/Code$ + $Code$objectFromNetId "2:3"$/Code$ undefined / undefined @@ -48284,68 +49042,75 @@ - String + Object + - profileNamespace + animateDoor - Returns the global namespace attached to the active user profile. Use setVariable and getVariable to save and load data to and from this Namespace. A variable can be deleted by setting its value to nil. By default the variables set in this namespace will exist while the game is running. In order to make variables save permanently, use saveProfileNamespace before the game is over. - The variables are stored next to the user profile in a file named myUsername.vars.GAMENAME (e.g. in the My Documents\Take On Helicopters folder). + Animates a door on a vehicle. Animation is defined in config file in CfgVehicles - AnimationSources. Wanted animation phase is set with phase param. This command works only on animation sources with "door" controller. Door_L in the example below can be animated with animateDoor but not CargoRamp_Open: heli animateDoor ["Door_L", 1]; + class AnimationSources + { + class CargoRamp_Open + { + source = "user" ; + animPeriod = 5 ; + initPhase = 0 ; + }; + class Door_L + { + source = "door" ; + animPeriod = 1.6 ; + }; + }; + To animate doors or other sources that have "user" controller, use animate command, or even better, animateSource (recommended). Sources with "hit" controller can be animated with setHitPointDamage command applied to the name contained in hitpoint property. For availability of animation sources and their controller types see: createVehicle/vehicles - https://community.bistudio.com/wiki/profileNamespace + https://community.bistudio.com/wiki/animateDoor - profileNamespace + Object animateDoor Array - profileNamespace + object animateDoor [doorname, phase, instant] - $Code$_namespace = profileNamespace ;$/Code$ + $Code$Taru animateDoor ["Door_1_source", 1];$/Code$ - $Code$profileNamespace setVariable ["var_kills",10000]; - _playerKills = profileNamespace getVariable "var_kills";$/Code$ + $Code$// Open left front door on Ifrit instantly: + Ifrit animateDoor ["Door_LF", 1, true ];$/Code$ - undefined / undefined + global / global - The variables are loaded when the user profile is loaded or changed. - Namespace + Nothing + - progressLoadingScreen + ctrlSetFontPB - If loading screen is shown, sets progress bar to the given value (interval is from 0 to 1]) + Sets P bold font of given HTML control. - https://community.bistudio.com/wiki/progressLoadingScreen + https://community.bistudio.com/wiki/ctrlSetFontPB - progressLoadingScreen Number + Control ctrlSetFontPB String - progressLoadingScreen progress + controlName ctrlSetFontPB fontName - $Code$startLoadingScreen ["Loading My Mission"]; - //Batch of code - //Batch of code - //Batch of code - progressLoadingScreen 0.5; - //Batch of code - //Batch of code - //Batch of code - endLoadingScreen ;$/Code$ + $Code$_control ctrlSetFontPB "TahomaB"$/Code$ undefined / undefined @@ -48353,62 +49118,59 @@ - Nothing + Nothing + - progressPosition + exp - Returns the current position in the progress bar. + Let x be a number, then exp (x) is equal to e to the power of x (or e^x) - https://community.bistudio.com/wiki/progressPosition + https://community.bistudio.com/wiki/exp - progressPosition Control + exp Number - progressPosition control + exp x - $Code$_pos = progressPosition _control;$/Code$ + $Code$_result = exp 1 + // returns 2.7182$/Code$ undefined / undefined + Note that you cannot exponent a value greater than 88.72283554077147726999 (999 repeating), as this is beyond what the game can calculate. - Number + Number + - progressSetPosition + waves - Sets progress position of the progress bar ( DialogControls-ProgressBar ) + Return waves value. - https://community.bistudio.com/wiki/progressSetPosition + https://community.bistudio.com/wiki/waves - Control progressSetPosition Number + waves - control progressSetPosition pos + waves - $Code$_control progressSetPosition 0.5$/Code$ - - $Code$with uiNamespace do { - bar = findDisplay 46 ctrlCreate ["RscProgress", -1]; - bar ctrlSetPosition [0,0,1,0.01]; - bar ctrlCommit 0; - bar progressSetPosition 0.75; - };$/Code$ + $Code$waveIntensity = waves ;$/Code$ undefined / undefined @@ -48416,386 +49178,320 @@ - Nothing + Number + - publicVariableClient + backpackContainer - Send the variable value to the client computer - same limitations regarding variable type as publicVariable. - The Client ID is the temporary ID given to a connected client for that session. You can find out this ID with the owner command (using it on a player's character, for example, will give you that players client ID). - In Arma 3 it is possible to broadcast nil value + Returns a cargo container of a unit's backpack. - https://community.bistudio.com/wiki/publicVariableClient + https://community.bistudio.com/wiki/backpackContainer - Number publicVariableClient String + backpackContainer Object - clientID publicVariableClient varName + backpackContainer unit - $Code$3 publicVariableClient "CTFscoreOne";$/Code$ + $Code$hint str backpackContainer player ; //1a5f7900# 163944: backpack_fast.p3d$/Code$ + + $Code$hint str getMagazineCargo backpackContainer player ; + // [ + //[ + //"APERSBoundingMine_Range_Mag", + //"ClaymoreDirectionalMine_Remote_Mag", + //"SLAMDirectionalMine_Wire_Mag", + //"DemoCharge_Remote_Mag" + //],[ + //3, + //2, + //2, + //1 + //] + //]$/Code$ + + $Code$( backpackContainer player ) addWeaponCargoGlobal [ weapons player select 0,1];$/Code$ undefined / undefined - (24 Aug, 2012) - publicVariableServer (run on client) - publicVariableClient (run on server) - Publishes a variable (name as STRING) to a specific client, from the server. This is useful where you want to synchronize a variable with only a specific client. - This is a useful way to cut down on network traffic, as publicVariable commands are issued as a priority message. So use publicVariable sparingly, and these commands where they apply. - Rocket - - (21 Sep, 2013) - While publicVariable is JIP compatible and persistent, publicVariableClient is not. If you log out then log in with the same owner id the public variable sent to your client prior will be nil. - $Code$//server - pv = 123; - 3 publicVariableClient "pv"; - //connected client with id 3 - hint str pv; //123 - // - //client log out/log in - // - //client id is still 3 - hint str pv; //error, undefined variable pv$/Code$ - - (April 12, 2015) - Tested in Arma 3 v1.43, publicVariableClient works client-to-client if owner id of the targeted client is known. + (Apr 29, 2014) + In ArmA3 ver 1.16, we can use either backpackContainer or unitBackpack at present since both of them enjoy same operand type and return value. - Nothing + Object + - publicVariableServer + currentWeaponTurret - Send the variable value to the server - same limitations regarding variable type as publicVariable. - In Arma 3 it is possible to broadcast nil value + Returns the name of the currently selected weapon on specified turret. Use turret path [-1] for driver's turret. - https://community.bistudio.com/wiki/publicVariableServer + https://community.bistudio.com/wiki/currentWeaponTurret - publicVariableServer String + Object currentWeaponTurret Array - publicVariableServer varName + vehicle currentWeaponTurret [turret path] - $Code$publicVariableServer "CTFscoreOne";$/Code$ + $Code$_weapon = MBT_Kuma currentWeaponTurret [0];$/Code$ undefined / undefined - (24 Aug, 2012) - publicVariableServer (run on client) - publicVariableClient (run on server) - Publishers the variable (name as STRING) to the server only. Useful when you want to synchronize a variable with the server but not any other clients. - Rocket - Nothing + String + - publicVariable + doMove - Broadcasts missionNamespace variable and its value to all computers. The data is sent consequently and reliably to all clients. Using publicVariable too frequently in a given period of time can cause other parts of the game to experience bandwidth problems. - Variables broadcast with publicVariable during a mission stay persistent for JIP (Join In Progress) clients. Such persistent variables are synced to the JIP client before the first batch of client side Event Scripts are ran. - The following Types of data are supported: - Number - Since OFP version 1.34 : - Boolean - Object - Group - Since ArmA version 1.00: - String - Text - Since ArmA version 1.09 : - Array - Code - Since Arma 3 version 1.26 : - Nothing ( nil ) - Limitations : Cannot use reserved names, such as " player " or " west " or " side ", etc. It is also not possible to transfer references to entities which are local, like scripts, displays, or local objects. Team Member is also not supported. + Order the given unit(s) to move to the given position (without radio messages). After reaching his destination, the unit will immediately return to formation (if in a group); or order his group to form around his new position (if a group leader). Use doStop to stop units returning to formation. - https://community.bistudio.com/wiki/publicVariable + https://community.bistudio.com/wiki/doMove - publicVariable String + Object/Array doMove Array - publicVariable varName + unit doMove position - $Code$publicVariable "CTFscoreOne";$/Code$ + $Code$_soldier1 doMove ( position _officer);$/Code$ - $Code$myPubVar = [123, "456", true ]; - publicVariable "myPubVar";$/Code$ + $Code$this doMove ( getMarkerPos "Marker1");$/Code$ local / global - (3 Aug, 2006 23:03) - This command broadcasts a variable to all clients, but as soon as you change the variable again, you have to use publicVariable again, as it does not automatically synchronise it. - - (12 April, 2008) - Be sure to place your variable name in quotation marks. This may sound awfully simple, but many times I have forgotten to do this, and it has resulted in no end of headaches for me. - - (2 Feb, 2008) - When initialising a public variable to handle JIP, you will usually first want to check if the public variable has already been (broadcast, received and) set locally. Otherwise you may inadvertantly overwrite the broadcast value with your default value. - To perform this check, use code similar to the following to first check that the variable is nil: - if ( isNil "PV_abc") then - { - // set the nil variable with a default value for server and both JIP & 'join at mission start' - PV_abc = [7, 8, 9]; - }; - // else public variable has already been set due to a public variable broadcast. - - (14 July, 2011) - To make Dr_Eyeball's note even more clear: - For JIP players pV'ed variables are received and set BEFORE the init.sqf. - So to avoid the received variables getting overwritten by variable initialization normally done in the init.sqf, you HAVE TO to use the 'if ( isNil "PV_abc")' pattern. - It says literally: "Only initialize value it has not yet been set. And in a JIP this may already been the cause due to publicVariable use". - - (21 September, 2013) - To make Dr_Eyeball's and kju's notes even more clear, public variable is persistent. Once it has been broadcast it will be delivered to all clients, present and future. Therefore it is wise to check if the variable already exists on a client due to it being persistent before initialising its value. - - (23 February, 2014) - Just to clarify, when players JIP, they get the value of the variable from the last call to publicVariable, not the current value of the variable. Eg. with - $Code$SomeVar = 5; publicVariable "SomeVar"; SomeVar = 10;$/Code$ - Connecting players will receive 5, not the current value of 10. + (February 9, 2008) + If doMove is to be used in conjunction with waypoint behavior commands (e.g. setSpeedMode ), then those have to be issued after the move command to have an effect. Otherwise the move will be done with the default settings. - (October 19, 2014) - I'm pretty far down the notes list so I hope this doesn't get buried. - For clarity, after a variable has been publicVariable'd, scripts in all clients can use it as if it had been defined locally. - Variables that have been publicVariable'd do not need to be pre-defined on receiving clients. In fact, this could cause issues with JIP players overwriting a publicVariable value, as mentioned above. (tested in A3 1.32.127785) - Local variables cannot be publicVariable'd. (tested in A3 1.32.127785) (tested by having dedicated server publicVariable a local variable, then trying to hint it on client. Error was "Undefined variable in expression") + (February 3, 2009) + If a unit is part of a group, and is not the leader, the unit will fall back into formation soon after the domove is completed. This does not happen for units that are in a group alone (because they are their own leader). + There is no single command to get a unit to move to a position and stay there. The best way to do this is to issue a domove, then wait for the unit to reach his destination, then disable his movement AI. VBS2 users can use the fn_vbs_doMoveEx function. - Nothing + Nothing + - pushBackUnique + scudState - Adds element to the back of the given array but only if it is unique to the array. The index of the added element is returned upon success, otherwise -1. This command modifies the original array. + Current state of given Scud launcher. Following states are recognized: + 0 - No activity + 1 - Launch preparation, + 2 - Launch prepared + 3 - Ignition + 4 - Launched. - https://community.bistudio.com/wiki/pushBackUnique + https://community.bistudio.com/wiki/scudState - Array pushBackUnique Anything + scudState Object - array pushBackUnique element + scudState scudName - $Code$_arr = [1,2,3]; - _index = _arr pushBackUnique 3; - hint str [_index, _arr]; //[-1,[1,2,3]]$/Code$ - - $Code$_arr = [1,2,3]; - _index = _arr pushBackUnique 4; - hint str [_index, _arr]; //[3,[1,2,3,4]]$/Code$ + $Code$if (( scudState _scud) == 3) exitWith + { + player sideChat "SCUD Launch status: Missile Ignition"; + };$/Code$ undefined / undefined + (August 4, 2006) + This command checks the scud status (Non-integral values are used to indicate transition between states). + To make the scud be upright, launch or cancel launch you need to use actions. + $Code$scud1 action ["scudLaunch",scud1]; // erect the missile + scud1 action ["scudStart",scud1]; // launch the missile + scud1 action ["scudCancel",scud1]; // down the missile + $/Code$ + (Make sure either the scud launcher has a crew inside or you use the game logic to perform actions). - Number + Number + - pushBack + sliderPosition - Insert an element to the back of the given array. This command modifies the original array. (see also: pushBackUnique ) + Return current thumb position of slider idc of topmost user dialog. - https://community.bistudio.com/wiki/pushBack + https://community.bistudio.com/wiki/sliderPosition - Array pushBack Anything + sliderPosition Number + + sliderPosition Control - array pushBack element + sliderPosition idc + + sliderPosition control - $Code$_arr = [1,2,3]; - _arr pushBack 4; - hint str _arr; //[1,2,3,4]$/Code$ - - $Code$_arr = [1,[2,4],3]; - (_arr select 1) pushBack [5,6]; - hint str _arr //[1,[2,4,[5,6]],3]$/Code$ + $Code$_slidepos1 = sliderPosition 105;$/Code$ undefined / undefined - (Aug 1, 2014) - (A3 1.26) It is recommended to use pushBack instead of BIS_fnc_arrayPush. - $Code$_array = [1,2,3]; - _array pushBack 4; //same as [_array, 4] call BIS_fnc_arrayPush ; - $/Code$ - - (August 23, 2014) - It's highly recommended to use the new pushBack command, up to 43% faster than set and up to 11843% faster a plus b ! - - (November 26, 2014) - pushBack does not support nil while set and a plus b do. For example: - $Code$_array = []; - for "_i" from 0 to 3 do - { - _array pushBack nil ; - }; - hint str _array; // hint is []$/Code$ - - (May 21, 2015) - Array "push" implementation using pushBack, alternative to BIS_fnc_arrayPush - $Code$KK_fnc_push = { - _this select 0 pushBack (_this select 1); - _this select 0 - }; - // Example - arr = [1,2,3]; - [arr, 4] call KK_fnc_push; //both arr and return of function are now [1,2,3,4]$/Code$ - - (October 5, 2016) - Note that pushBack does not create a new object. - Therefore, if you edit an object that was pushed back to an array, it also affects the object in the array. - e.g. - $Code$_first_squence = [1,2,3]; - _second_squence = [5,4]; - _first_squence pushBack _second_squence; - systemChat str _first_squence // prints [1,2,3,[5,4]]] - reverse _second_squence; - systemChat str _first_squence // prints [1,2,3,[4,5]]] - $/Code$ - If you pushBack an array for instance, you can just copy it to generate a new object. - e.g. - $Code$_first_squence pushBack +_second_squence; - $/Code$ - Number + Number - Number + - putWeaponPool + uiSleep - Transfer weapons and magazines from weapon pool into cargo of object obj. Used in campaign to transfer weapons into next mission. + Suspend execution of script for given uitime. uiSleep is a sleep method to delay script execution where script time/simulation time is stopped. uiSleep is basically using the system time (uiTime more specifically) and not simulation time. So in the cases where sleep command would get stuck indefinitely, uiSleep can still be used to effectively delay script execution. For example in a mission briefing or an editor or when simulation is paused in general. - https://community.bistudio.com/wiki/putWeaponPool + https://community.bistudio.com/wiki/uiSleep - putWeaponPool Object + uiSleep Number - putWeaponPool object + uiSleep delay - + $Code$uiSleep 0.5$/Code$ + undefined / undefined + (March 28, 2016) + If the game is paused in SP (via ESC) the sleep command will stop working, to prevent that use uiSleep. - Nothing + Nothing + - queryItemsPool + viewDistance - Returns the number of items of type in the weapon pool (used in campaigns to transfer weapons to the next mission). + Returns the rendering distance. - https://community.bistudio.com/wiki/queryItemsPool + https://community.bistudio.com/wiki/viewDistance - queryItemsPool String + viewDistance - queryItemsPool name + viewDistance - + $Code$hint ("my view distance is " + str viewDistance + " meters");$/Code$ + undefined / undefined - Number + Number + - queryMagazinePool + removeAllHandgunItems - Return number of magazines of type name in magazine pool (used in campaign to transfer magazines into next mission). + Removes all items from weapon except magazine. - https://community.bistudio.com/wiki/queryMagazinePool + https://community.bistudio.com/wiki/removeAllHandgunItems - queryMagazinePool String + removeAllHandgunItems Object - queryMagazinePool name + removeAllHandgunItems unit - $Code$_num = queryMagazinePool "M16";$/Code$ - + - undefined / undefined + local / global - Number + Nothing + - queryWeaponPool + weaponState - Return number of weapons of type name in weapon pool (used in campaign to transfer weapons into next mission). + Returns the currently selected weapon state for unit or vehicle. + Since Arma 3 v1.69.140397 this command has been improved and extended: + It is now possible to query any weapon of a vehicle without the need to place a weapon operator first, provided the weapon or muzzle is specified in optional param. By default a vehicle has no weapons selected, so querying currently selected weapon returns no weapon, unless weapon is specified. + Driver turret can now be accessed as well with turret path [-1]. + Muzzle name is supported as well as weapon name. Weapon search gets priority, but if there is no weapon with given name, the muzzles will be searched. - https://community.bistudio.com/wiki/queryWeaponPool + https://community.bistudio.com/wiki/weaponState - queryWeaponPool String + weaponState Object + + weaponState Array - queryWeaponPool name + weaponState unit + + weaponState [vehicle, turretPath, weapon] - $Code$_num=queryWeaponPool "M16"$/Code$ + $Code$_wsPlayer = weaponState player ; // ["arifle_MXC_ACO_F","arifle_MXC_ACO_F","Single","30Rnd_65x39_caseless_mag",30]$/Code$ + + $Code$_wsVehicle = weaponState [_apc, [0]]; // ["autocannon_40mm_CTWS","HE","player","60Rnd_40mm_GPR_Tracer_Red_shells",60]$/Code$ + + $Code$_wsVehicle = weaponState [_apc, [0], "AP"]; // ["autocannon_40mm_CTWS","AP","player","40Rnd_40mm_APFSDS_Tracer_Red_shells",40]$/Code$ undefined / undefined @@ -48803,27 +49499,28 @@ - Number + Array - Array + - radioChannelAdd + turretUnit - Add the units to the custom radio channel. + Returns the unit in the vehicle turret. Driver turret [-1] is supported since Arma 3 v1.57.135045 - https://community.bistudio.com/wiki/radioChannelAdd + https://community.bistudio.com/wiki/turretUnit - Number radioChannelAdd Array + Object turretUnit Array - index radioChannelAdd units + vehicle turretUnit turretpath - $Code$2 radioChannelAdd [player, unit1];$/Code$ + $Code$_vehicle turretUnit _thisTurret$/Code$ undefined / undefined @@ -48831,139 +49528,183 @@ - Nothing + Object + - radioChannelCreate + removeWeaponCargo - Create a custom radio channel with the given color, label, call sign and registered characters. The index returned can be used to manipulate the created channel later. There are 10 slots for custom radio channels which would correspond to channels 6-15 (see getPlayerChannel ). The command will find an unused index in this range and create it when found. Server only. + Remove weapon from the vehicle cargo space. + This is unoffical documentation. All Information here is as it exists in the Engine. It might not reflect the reality. - https://community.bistudio.com/wiki/radioChannelCreate + https://community.bistudio.com/wiki/removeWeaponCargo - radioChannelCreate Array + Object removeWeaponCargo Array - radioChannelCreate [color, label, callSign, units, sentenceType] + vehicle removeWeaponCargo [weaponID,creatorID] - $Code$_index = radioChannelCreate [[0.96, 0.34, 0.13, 0.8], "Q-dance Radio", "%UNIT_NAME", [player1, player2]];$/Code$ - - $Code$_index = radioChannelCreate [[0.96, 0.34, 0.13, 0.8], "Q-dance Radio", "%UNIT_NAME", [player1, player2], false ]; - // disable automatic quotes for chat in channel (ArmA 3)$/Code$ - - $Code$// Create custom channel and add all players to it, present and JIP: - if ( isServer ) then - { - private _channelName = "Q-dance Radio"; - private _channelID = radioChannelCreate [[0.96, 0.34, 0.13, 0.8], _channelName, "%UNIT_NAME", []]; - if (_channelID == 0) exitWith { diag_log format ["Custom channel '%1' creation failed!", _channelName]}; - [_channelID, {_this radioChannelAdd [ player ]}] remoteExec ["call", [0, -2] select isDedicated, _channelName]; - };$/Code$ + $Code$rearmTruckOne removeWeaponCargo [19, 1]$/Code$ - global / global + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - - (January 21, 2016) - Make sure you add all units you intend to speak or receive messages on created custom channel to the channel. - Number + Nothing + - radioChannelRemove + lnbText - Remove the units from the custom radio channel. + Returns the shown text in the item with the given position of the given 2D listbox. - https://community.bistudio.com/wiki/radioChannelRemove + https://community.bistudio.com/wiki/lnbText - Number radioChannelRemove Array + Control lnbText Array - index radioChannelRemove units + control lnbText [row,column] - $Code$3 radioChannelRemove [blufor_unit_1, blufor_unit_2];$/Code$ + $Code$_ctrl lnbText [0,0];$/Code$ - undefined / undefined + local / local + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Nothing + String + - radioChannelSetCallSign + setOvercast - Set the custom radio channel's call sign. - Available special parameters: - $KEY (reference to a localized text) - %CHANNEL_LABEL - %UNIT_SIDE - %UNIT_NAME - %UNIT_RANK - %UNIT_ID - %UNIT_REF - %UNIT_GRP_NAME - %UNIT_GRP_LEADER - %UNIT_VEH_NAME - %UNIT_VEH_POSITION + Set overcast to given value smoothly during given time (in seconds). Zero time means immediate change. An overcast setting of zero means clear (sunny) weather, and one means storms and rain are very likely. Higher overcast values also result in higher wind speeds. - https://community.bistudio.com/wiki/radioChannelSetCallSign + https://community.bistudio.com/wiki/setOvercast - Number radioChannelSetCallSign String + Number setOvercast Number - index radioChannelSetCallSign callSign + time setOvercast overcast - $Code$4 radioChannelSetCallSign "%UNIT_NAME";$/Code$ + $Code$50 setOvercast 0.5$/Code$ - undefined / undefined + undefined / local + (August 4, 2006) + Notes from before the conversion: + Use setRain if you want to make sure it rains. + + Only one script command induced weather change (either setOvercast or setFog ) can be happening at a time. Starting a new weather change will immediately halt the current weather change. SetRain changes are independent and can occur simultaneously to a weather change. + + Arma 3 's volumetric clouds cannot be instantly changed (it would take up to a few seconds to do a full recompute). Therefore, 0 setOvercast 0 will not have the desired effect. You can use skipTime to get to the desired cloud coverage. + NOTE: To get instant, seamless overcast change to overcast 1 advance the time 24 hours with skipTime while setting overcast transition time to 86400 seconds (24 hours) -- Killzone_Kid + $Code$86400 setOvercast 1; + skipTime 24; + //to remain on the same date: + skipTime -24; + 86400 setOvercast 1; + skipTime 24; + $/Code$ + + With removal of simulSetHumidity‎, in order to add instant cloud cover, execute simulWeatherSync with delay (for now): + $Code$ skipTime -24; + 86400 setOvercast 1; + skipTime 24; + 0 = [] spawn { + sleep 0.1; + simulWeatherSync ; + };$/Code$ + There is slight freeze with simul command. + + Delay in Arma 3 doesn't work for quick changes. Using 120 setOvercast 1 only reaches full overcast after about 50 minutes. Using setTimeMultiplier does speed up the overcast, but it doesn't render any clouds. You will need to skipTime or forceWeatherChange to render clouds if you want it to happen within the hour. + + (May 4, 2016) + Actual transition time is inversely proportional to the timeMultiplier. For example, a time of 7200 (2 hours) and a timeMultiplier of 2 will result in a real-life transition time of 7200 / 2 = 3600 (1 hour). + In case of overcast, a timeMultiplier 1 will cause gradual desyncing of the cloud cover with the overcast value, so it is advised that you multiply the transition time by the multiplier, i.e. : + $Code$(7200 * timeMultiplier ) setOvercast 1$/Code$ - Nothing + Nothing + - radioChannelSetLabel + reportRemoteTarget - Set the custom radio channel's label. + Shares the target vehicle via datalink to the Side center for a given time. - https://community.bistudio.com/wiki/radioChannelSetLabel + https://community.bistudio.com/wiki/reportRemoteTarget - Number radioChannelSetLabel String + Side reportRemoteTarget Array - index radioChannelSetLabel label + side reportRemoteTarget [target, time] - $Code$5 radioChannelSetLabel "Q-dance Radio";$/Code$ + $Code$blufor reportRemoteTarget [ vehicle player, 60];$/Code$ undefined / undefined @@ -48971,27 +49712,28 @@ - Nothing + Nothing + - radioVolume + taskDestination - Checks the current radio volume (set by fadeRadio ). + Returns the position of the task (as specified by destination parameter in config). - https://community.bistudio.com/wiki/radioVolume + https://community.bistudio.com/wiki/taskDestination - radioVolume + taskDestination Task - radioVolume + taskDestination task - $Code$_volume = radioVolume;$/Code$ + $Code$if (! isNull currentTask player ) then { taskDestination currentTask player }; //return Position ( Array )$/Code$ undefined / undefined @@ -48999,315 +49741,459 @@ - Number + Array + - rad + displayRemoveEventHandler - Convert x from Degrees to Radians. 360 degrees is equal to 2 multiplied with pi. + Remove a given event handler from the given display. - https://community.bistudio.com/wiki/rad + https://community.bistudio.com/wiki/displayRemoveEventHandler - rad Number + Display displayRemoveEventHandler Array - rad x + display displayRemoveEventHandler [handler name,id] - $Code$_radians = rad 180 - // Result is 3.1415 (eg pi$/Code$ - + undefined / undefined + (April 19, 2015) + If you for example used this code to add the eventHandler: + $Code$_myEH = (findDisplay 46) displayAddEventHandler ["KeyDown", "hint str _this"];$/Code$ + Then this would be the correct code to remove that eventHandler again: + $Code$(findDisplay 46) displayRemoveEventHandler ["KeyDown", _myEH];$/Code$ - Number + Nothing + - rainbow + ctrlMapAnimDone - Returns the current rainbow intensity. + Checks whether the map animation has finished. - https://community.bistudio.com/wiki/rainbow + https://community.bistudio.com/wiki/ctrlMapAnimDone - rainbow + ctrlMapAnimDone Control - rainbow + ctrlMapAnimDone controlName - undefined / undefined + local / local - Number + Boolean + - rain + createVehicleCrew - Returns the current value of rain density in range 1...0 + Creates crew to given empty vehicle. Crew members are default crew defined in config. Crew side will also correspond to vehicle's faction. This command does not addVehicle to the created crew in the same way this normally happens when crewed vehicle created in the editor. - https://community.bistudio.com/wiki/rain + https://community.bistudio.com/wiki/createVehicleCrew - rain + createVehicleCrew Object - rain + createVehicleCrew vehicle - $Code$_rainLevel = rain ;$/Code$ + $Code$// Spawn a flying UAV with crew. + myUAV = [ getPos player, 0, "B_UAV_02_F", west ] call BIS_fnc_spawnVehicle ; + createVehicleCrew (myUAV select 0);$/Code$ + + $Code$_veh = createVehicle ["O_MRAP_02_hmg_F", position player, [], 0, "NONE"]; + createVehicleCrew _veh; + { + diag_log [_x, faction _x, side _x, side group _x]; + } forEach crew _veh;[O Alpha 1-1:1,"OPF_F",EAST,EAST] + [O Alpha 1-1:2,"OPF_F",EAST,EAST]$/Code$ undefined / undefined + (August 20, 2014) + As of ARMA 3 v1.26 the command will work on non-empty vehicles. If any of the crew defined in config are missing they will be added. + + (November 8, 2014) + This command creates drivers/copilots, commanders and gunners where appropriate, but it never creates cargo crew. + So a gunship Huron will get a pilot and copilot plus 2 door gunners, but nobody in the back. + + (December 22, 2015) + createVehicleCrew does not work with Transport Unload waypoints for helicopters. You need to spawn the pilots separately and then get them into the helicopter in order to get Transport Unload waypoints to work. + + (July 2, 2017) + The particular seats to which units are added depend on the dontCreateAI property, the hasDriver property of the base class, and the hasGunner propery of turret classes. + For instance, the following snippet calculates how many seats will be occupied by the created crew: + $Code$private _vehCfg = configFile "CfgVehicles" typeOf _vehicle; + private _crewCount = {round getNumber (_x "dontCreateAI") 1 && + ((_x == _vehCfg && {round getNumber (_x "hasDriver") 0}) || + (_x != _vehCfg && {round getNumber (_x "hasGunner") 0}))} count ([_vehicle, configNull] call BIS_fnc_getTurrets); + $/Code$ + Also, I've written a function to create a UAV crew for a specific side: https://gist.github.com/AgentRev/cb25d30e464f2239b6cee51fa0110c78 - Number + Nothing + - random + lbText - Random real (floating point) value from 0 (inclusive) to x (not inclusive). - Since Arma 3 v1.55.133393 alternative syntax is added, allowing to define Gaussian Distribution params. Uses the same method as setTriggerTimeout command. Quite useful for spawning loot for example, making more valuable items more rare. - Since Arma 3 v1.67.139663 an alternative syntax is available, allowing to generate semi-random number based on provided seed. - Since Arma 3 v1.67.139663 an alternative syntax is available, generating pseudo-random noise texture based on provided seed and returning a single number between 0 (included) and 1 (excluded) at supplied x and y coordinates. + Returns the shown text in the item with the given index of the listbox or combobox with id idc of the topmost user dialog. - https://community.bistudio.com/wiki/random + https://community.bistudio.com/wiki/lbText - random Number - - random Array - - Number random Number + lbText Array - Number random Array + Control lbText Number - random x - - random [min, mid, max] - - seed random x + lbText [idc, index] - seed random [x,y] + control lbText index - $Code$_rNumber = random 1;$/Code$ - - $Code$_rNumber = random -10;$/Code$ + $Code$_text = lbText [101, 0];$/Code$ - $Code$// Generate random position inside a circle - _center getPos [_radius * sqrt random 1, random 360];$/Code$ + $Code$_text = _control lbText 0;$/Code$ + + + local / local + + + More information on the LB command family can be found here + + + String - String + + + + + + lbSetPicture + + + Sets the picture in the item (left) with the given index of the listbox or combobox with id idc of the topmost user dialog. Name is the picture name. The picture is searched for in the mission directory, the dtaExt subdirectory of the campaign directory and the dtaExt directory and the data bank (or directory). + In Arma 3 it might be necessary to set the color of the picture as well with lbSetPictureColor as default [0,0,0,0] color makes picture invisible. + + + https://community.bistudio.com/wiki/lbSetPicture + + + lbSetPicture Array + + Control lbSetPicture Array + + + lbSetPicture [idc, index, name] + + control lbSetPicture [index, name] + + + $Code$lbSetPicture [101, 0, "iskoda"];$/Code$ - $Code$// Compare (each command was executed 100000 times to gather statistics): - floor random 10; - // 0 - 10099 (10%) - // 1 - 10040 (10%) - // 2 - 10154 (10%) - // 3 - 9910 (10%) - // 4 - 10023 (10%) - // 5 - 9937 (10%) - // 6 - 10118 (10%) - // 7 - 9716 (10%) - // 8 - 9986 (10%) - // 9 - 10017 (10%) - floor random [0,5,10]; - // 0 - 109 (0%) - // 1 - 1604 (2%) - // 2 - 6839 (7%) - // 3 - 16671 (17%) - // 4 - 24706 (25%) - // 5 - 24702 (25%) - // 6 - 16626 (17%) - // 7 - 6925 (7%) - // 8 - 1702 (2%) - // 9 - 116 (0%) - floor random [0,10,0]; - // 0 - 19 (0%) - // 1 - 209 (0%) - // 2 - 817 (1%) - // 3 - 2384 (2%) - // 4 - 4841 (5%) - // 5 - 8976 (9%) - // 6 - 14067 (14%) - // 7 - 18955 (19%) - // 8 - 23605 (24%) - // 9 - 26127 (26%) - floor random [0,10,5]; - // 0 - 11 (0%) - // 1 - 98 (0%) - // 2 - 430 (0%) - // 3 - 1149 (1%) - // 4 - 2384 (2%) - // 5 - 4546 (5%) - // 6 - 8612 (9%) - // 7 - 16283 (16%) - // 8 - 28393 (28%) - // 9 - 38094 (38%)$/Code$ + $Code$_control lbSetPicture [0, "iskoda"];$/Code$ + + local / local + + + More information on the LB command family can be found here + + (August 18, 2015) + (ArmA 3) To place an image on the right end of the listItem: $Code$_ctrl lbSetPictureRight [_index, "A3\path\to\image.paa"];$/Code$ + + + Nothing - Nothing + + + + + + menuAdd + + + Adds new submenu entry into item on given path. + + + https://community.bistudio.com/wiki/menuAdd + + + menuAdd Array + + + menuAdd [idc, path, text] + + + undefined / undefined - (July 12, 2015) - Random selections including negative numbers can be obtained via: - $Code$_Xrnd = round(random 200) -100;$/Code$ - This will yield numbers between -100 and 100. - Be careful using random numbers in multiplayer, each client will come up with a different result. See multiplayer tutorials for more general information about locality. - The number returned is unlikely to be a whole number. To return a whole number use either round, ceil or floor together with random : - x=round(random 5) will return 0,1,2,3,4 or 5. (non-uniform distribution, 0 and 5 are half as likely to be selected than any of the other numbers) - x=floor(random 5) will return 0,1,2,3 or 4. (uniform distribution, all numbers have the same probability of being selected) - x=ceil(random 5) will return 0,1,2,3,4 or 5. (0 is very unlikely, but possible, as ceil 0 is 0) - Number - Number - Number - Number + Number + - rankId + processDiaryLink - Return the rank of the given unit for comparison. - Value may be : - 0 - Private - 1 - Corporal - 2 - Sergeant - 3 - Lieutenant - 4 - Captain - 5 - Major - 6 - Colonel + Open the diary screen on the record specified by link. - https://community.bistudio.com/wiki/rankId + https://community.bistudio.com/wiki/processDiaryLink - rankId Object + processDiaryLink String - rankId unit + processDiaryLink link - $Code$_myIdRank = rankId player;$/Code$ - + undefined / undefined + (June 30, 2017) + To select various tabs in the map screen: + $Code$ processDiaryLink createDiaryLink ["selected_tab", player, ""];$/Code$ + ... where "selected_tab" can be "Map", "Tasks", "Diary", "Units", "Players", "Log". + + (June 30, 2017) + You can also force open diary with selected link by passing string in link format directly: + $Code$ processDiaryLink " log subject=""Diary"" /log ";$/Code$ + The above will open tab Briefing. + $Code$ processDiaryLink " log subject=""Diary"" record=""Record2"" /log ";$/Code$ + The above will open tab Briefing and select 3rd record from the bottom, provided the records were added consistently. - Number + Nothing + - rank + ctrlSetText - Returns the rank of the given unit. Rank can be one of the following: - "PRIVATE" - "CORPORAL" - "SERGEANT" - "LIEUTENANT" - "CAPTAIN" - "MAJOR" - "COLONEL" + Set the text of a control of the currently active user dialog or display. This command can be used for: static texts, buttons, edit lines and active texts as well as for images, where you can use it to set the image path. + Read Dialog Control for more information about user dialogs and controls. - https://community.bistudio.com/wiki/rank + https://community.bistudio.com/wiki/ctrlSetText - rank Object + ctrlSetText Array + + Control ctrlSetText String - rank unitName + ctrlSetText [idc, text] + + controlName ctrlSetText text - $Code$_rank = rank player;$/Code$ + $Code$ctrlSetText [100, "Hello world"];//for Dialogs$/Code$ + + $Code$_control ctrlSetText "Hello world.";// for Displays$/Code$ - global / undefined + local / local + (16 Nov, 2011) + For ArmA2 textured "shortcut" buttons (type = 16), you must use the alternative syntax. + + (October 16, 2016) + When using ctrlSetText with picture control, the path to the texture is cached, so that if the new texture is from the same file as old one, the precious CPU cycles would not be wasted on reloading it. - String + Nothing - Nothing + - rating + countFriendly - Check unit rating. Rating is increased for killing enemies, decreased for killing friendlies (see Rating Values ). Can be changed via addRating by the mission designer. - The rating of the player is displayed as the "score" at the end of the mission. Via Description.ext one can define how many points it takes to get a perfect score, as well as the number of stars. + Count how many units in the array are considered friendly to the given unit. - https://community.bistudio.com/wiki/rating + https://community.bistudio.com/wiki/countFriendly - rating Object + Object countFriendly Array - rating unitName + unitName countFriendly arrayName - $Code$_score = rating player$/Code$ + $Code$_num = player countFriendly list _triggerOne;$/Code$ global / undefined - In ArmA 1.18 rating does only return rating levels for units that are local. + (August 3, 2006) + Notes from before the conversion: + The countFriendly command seem to count the number of units from the array that are considered to be of the given type by the whole side, not just the specified unit. - Number + Number + - rectangular + callExtension - Checks if a location is rectangular (returns true) or elliptical (returns false). + Calls custom.dll also known as Extension. The name of the extension is the name of the extension.dll without ".dll" part (or without "_x64.dll" part on 64-bit Arma). For example if the file is 'myExtension.dll' the name of the extension will be "myExtension". For 64-bit extensions, the name of the extension doesn't need to change and is still "myExtension". The game will automatically look for 'myExtension_x64.dll' when you use 64-bit Arma exe. + This command is blocking, meaning that the game will wait for the extension to return before continuing. This may cause FPS drop if extension is not optimised. If extension takes too long, consider making asynchronous extension, where the result of the work of the extension is collected in a separate call. + Currently there is no limit how much data you can send to the extension. However there is a limit on how much data you can return from extension in one call. The limit is known to the extension and is passed in int outputSize. The limit may or may not change in the future and is currently 10240 bytes. It is up to extension designer to handle multipart results if returned data exceeds output limit. + Since Arma 3 v1.67 it is possible to pass array of arguments to extensions. The array of arguments could be anything and all elements will be converted to strings, however you might want to only send simple types like Booleans, Strings, Numbers and Arrays of all of the above. There is currently a limit on how many arguments can be sent and it is 1024. However an argument could be an Array itself, in this case extension maker will have to provide additional methods for parsing such arguments. + Possible error codes: + 101: SYNTAX_ERROR_WRONG_PARAMS_SIZE + 102: SYNTAX_ERROR_WRONG_PARAMS_TYPE + 201: PARAMS_ERROR_TOO_MANY_ARGS + 301: EXECUTION_WARNING_TAKES_TOO_LONG + Each error will have entry in.rpt file with more details. + Since Arma 3 v1.69, RVExtensionVersion interface (see source code example below) has been added, which is called by the engine on extension load and expects extension version. This interface is designed to work with both, Linux and Windows. The max buffer size is 32 bytes. The version information will then appear in. rpt file like so: + $Code$19:06:36 CallExtension loaded: test_extension (.\test_extension.dll) [1.0.0.1]$/Code$ + For more information see Extensions. - https://community.bistudio.com/wiki/rectangular + https://community.bistudio.com/wiki/callExtension - rectangular Location + String callExtension String + + String callExtension Array - rectangular location + extension callExtension function + + extension callExtension [function, arguments] - $Code$_isRect = rectangular myLocation;$/Code$ + $Code$_return = "myExtension" callExtension "stringToBeParsed";$/Code$ + + $Code$_result = "test_extension" callExtension str weapons player ; + _result = "test_extension" callExtension ["fnc1", getUnitLoadout player ]; + _result = "test_extension" callExtension ["fnc2", magazinesAmmoFull player ]; + _result = "test_extension" callExtension ["fnc1", [ weapons player, magazines player ]];$/Code$ + + $Code$_result = "test_extension" callExtension ["fnc1", [1,"two", true,[4,"five", false ]]]; + parseSimpleArray (_result select 0) params ["_number","_string","_boolean","_array"]; + systemChat str [_number,_string,_boolean,_array]; + // Source Code ( Download.dll ) + //This is an example of an extension compatible with both syntaxes. When using 1st syntax, the data is just copied from input to output. When using alt syntax, the arguments are parsed and then assembled back into string array in 2 ways: fnc1 and fnc2. fnc1 is a fraction faster. + //#include string + //#include vector + //#include iterator + //#include sstream + //#define CURRENT_VERSION "1.0.0.1" + //extern "C" + //{ + ////--- Engine called on extension load + //__declspec ( dllexport ) void __stdcall RVExtensionVersion ( char * output, int outputSize ); + ////--- STRING callExtension STRING + //__declspec ( dllexport ) void __stdcall RVExtension ( char * output, int outputSize, const char * function ); + ////--- STRING callExtension ARRAY + //__declspec ( dllexport ) int __stdcall RVExtensionArgs ( char * output, int outputSize, const char * function, const char ** args, int argsCnt ); + //} + ////--- Extension version information shown in.rpt file + //void __stdcall RVExtensionVersion ( char * output, int outputSize ) + //{ + ////--- max outputSize is 32 bytes + //strncpy_s ( output, outputSize, CURRENT_VERSION, _TRUNCATE ); + //} + ////--- name callExtension function + //void __stdcall RVExtension ( char * output, int outputSize, const char * function ) + //{ + //std :: string str = function ; + //strncpy_s ( output, outputSize, ( "Input Was: " + str ). c_str (), _TRUNCATE ); + //} + ////--- name callExtension [function, args] + //int __stdcall RVExtensionArgs ( char * output, int outputSize, const char * function, const char ** args, int argsCnt ) + //{ + //if ( strcmp ( function, "fnc1" ) == 0 ) + //{ + ////--- Manually assemble output array + //int i = 0 ; + //std :: string str = "[" ; + ////--- Each argument can be accessed via args[n] + //if ( argsCnt 0 ) + //str += args [ i ++ ]; + //while ( i argsCnt ) + //{ + //str += "," ; + //str += args [ i ++ ]; + //} + //str += "]" ; + ////--- Extension result + //strncpy_s ( output, outputSize, str. c_str (), _TRUNCATE ); + ////--- Extension return code + //return 100 ; + //} + //else if ( strcmp ( function, "fnc2" ) == 0 ) + //{ + ////--- Parse args into vector + //std :: vector std :: string vec ( args, std :: next ( args, argsCnt )); + //std :: ostringstream oss ; + //if ( ! vec. empty ()) + //{ + ////--- Assemble output array + //std :: copy ( vec. begin (), vec. end () - 1, std :: ostream_iterator std :: string ( oss, "," )); + //oss vec. back (); + //} + ////--- Extension result + //strncpy_s ( output, outputSize, ( "[" + oss. str () + "]" ). c_str (), _TRUNCATE ); + ////--- Extension return code + //return 200 ; + //} + //else + //{ + //strncpy_s ( output, outputSize, "Avaliable Functions: fnc1, fnc2", outputSize - 1 ); + //return - 1 ; + //} + //}$/Code$ undefined / undefined @@ -49315,58 +50201,75 @@ - Boolean + String - Array + - registerTask + configProperties - Register a new task type. Parameters are defined in the given config class (subclass of CfgTasks). + Returns an array of config entries which meet criteria in condition code. Command iterates through available classes and config properties for given config entry. If 3rd param is true the search also includes inherited properties. Current looked at config is stored in _x variable (similar to alternative count command implementation). Condition has to return true in order for the looked at property to be added to the resulting array. A bit slower than configClasses but allows to access inherited entires. + The condition code passed to configProperties should only be used for simple filter expressions and nothing more - https://community.bistudio.com/wiki/registerTask + https://community.bistudio.com/wiki/configProperties - Team_Member registerTask String + configProperties Array - teamMember registerTask entryName + configProperties [config, condition, inherit] - + $Code$_configs = configProperties [ configFile "CfgVehicles" "O_Truck_02_box_F"];$/Code$ + + $Code$_configs = configProperties [ configFile "RscText", " true ", true ];$/Code$ + + $Code$// Get all hitpoints of a truck: + _hitPoints = []; + _hitPointsCfgs = configProperties [ + configFile "CfgVehicles" "O_Truck_02_box_F" "HitPoints", + " true ", + true + ]; + hint str _hitPointsCfgs;$/Code$ + undefined / undefined - Boolean + Array + - registeredTasks + ctrlSetChecked - List all registered task types. + Sets checked state of a checkbox in checkboxes control (CT_CHECKBOXES, type = 7; ). Since Arma 3 v1.71.141591 it is possible to check checkbox with given index in multiple checkboxes set-up. For more information see DialogControls-CheckBoxes. - https://community.bistudio.com/wiki/registeredTasks + https://community.bistudio.com/wiki/ctrlSetChecked - registeredTasks Team_Member + Control ctrlSetChecked Boolean + + Control ctrlSetChecked Array - registeredTasks member + control ctrlSetChecked checked + + control ctrlSetChecked [index, checked] - $Code$tasklist = registeredTasks teamMember player ;$/Code$ + $Code$_control ctrlSetChecked true ;$/Code$ - $Code$_rabbit = createAgent ["Rabbit_F", position player,[], 0, "None"]; - hint str registeredTasks teamMember _rabbit; - // Hint shows ["Animal Main Task"] in Arma 3.$/Code$ + $Code$_control ctrlSetChecked [3, true ];$/Code$ undefined / undefined @@ -49374,54 +50277,62 @@ - Array + Nothing - Nothing + - reloadEnabled + enableUAVWaypoints - Check whether magazine is reloaded whenever emptied. + Enables/disables the option for player to set waypoints for UAV in AV terminal. - https://community.bistudio.com/wiki/reloadEnabled + https://community.bistudio.com/wiki/enableUAVWaypoints - reloadEnabled Object + Object enableUAVWaypoints Boolean - reloadEnabled unitName + uav enableUAVWaypoints enable - + $Code$_uav enableUAVWaypoints false ; + hint str waypointsEnabledUAV _uav; // returns false$/Code$ + undefined / undefined - Boolean + Nothing + - reload + default - Reload all weapons + See switch do. - https://community.bistudio.com/wiki/reload + https://community.bistudio.com/wiki/default - reload Object + default Code - reload unitName + default a - $Code$if ( needReload player == 1) then { reload player };$/Code$ + $Code$switch (_condition) do { + case 1: { hint "1" }; + case 2: { hint "2" }; + default { hint "default" }; + };$/Code$ undefined / undefined @@ -49429,323 +50340,165 @@ - Nothing + Nothing + - remoteControl + registeredTasks - Switches on remote control of the unit. Command needs to be executed locally to the player. If driver is remote it will get transferred to players PC. + List all registered task types. - https://community.bistudio.com/wiki/remoteControl + https://community.bistudio.com/wiki/registeredTasks - Object remoteControl Object + registeredTasks Team_Member - who remoteControl whom + registeredTasks member - $Code$// Set player remote control of driver: - player remoteControl driver UAV; - driver UAV switchCamera "Internal"; //switchCamera required - //sometimes switchCamera is not needed - player remoteControl driver UAV;$/Code$ + $Code$tasklist = registeredTasks teamMember player ;$/Code$ - $Code$// Return control to player: - objNull remoteControl driver UAV;$/Code$ + $Code$_rabbit = createAgent ["Rabbit_F", position player,[], 0, "None"]; + hint str registeredTasks teamMember _rabbit; + // Hint shows ["Animal Main Task"] in Arma 3.$/Code$ - local / global + undefined / undefined - You must use switchCamera in order to remote control the unit and. - You can only remoteControl characters, e.g. if yo want to remote control a car, you have - to add a driver and use - "player remoteControl driver someVehicle". - - (Jan 25, 2010) - Arma 1.05 : - You can remoteControl multiple units at the same time. - It is not needed to switchCamera to the unit to be able to control it - it is needed to be able to fire with. - The switchCamera is fixed : the player can't change internal/external/optics view. - Do not think about it like a selectPlayer : it is used to give the control to the vehicle role the unit is in. - SwitchCamera to the vehicle the unit is in ; the camera will go depending the role you are remoteControlling. - The AI driver won't follow your vehicle move orders. - If the player dies, the death screen will appear, not automatically turning back to the player. - If you want to stop the remote control, use objNull as remote controller. - Example : - player remoteControl driver jeep1; // will remoteControl it, you still will have full control of the player - jeep1 switchCamera "internal"; // fix the camera to the ''vehicle'' and not to (driver jeep1) ! - waitUntil { !(alive jeep1) || !(alive player) }; - objNull remoteControl driver jeep1; // removes the remoteControlling - player switchCamera "internal"; // returns to the player - Nothing + Array + - remoteExecCall + captive - Asks server to execute given scripted function or script command on given target PC. The environment chosen for the execution is as follows: - Scripted function - unscheduled environment ( suspension is NOT allowed). - Script command - unscheduled environment ( suspension is NOT allowed). - remoteExecCall can also be used in SP (the same restrictions apply both to SP and MP). For more information about the usage, security features and advanced jip techniques check the remote execution dedicated section. - While it is true that this function executes the desired scripted command/function by calling it, it does not mean remoteExecCall itself will be executed right away. Therefore, calling remoteExecCall is by no means a replacement for calling scripted commands/functions directly. - Example: - remoteExecCall ["func1"]; call func2; // func2 can be executed sooner than func1 - call func1; call func2; // func2 will always execute after func1. + Returns the captive state of the given unit (set with setCaptive ). A captive unit will not be attacked by its enemies. + ! + While a captive unit won't be attacked, it will still attack its enemies – be sure to setBehaviour "CARELESS" / removeAllWeapons accordingly. - https://community.bistudio.com/wiki/remoteExecCall + https://community.bistudio.com/wiki/captive - Anything remoteExecCall Array + captive Object - params remoteExecCall [functionName, targets, JIP] + captive object - $Code$// runs hint "hello" on each connected client - "hello" remoteExecCall [" hint "];$/Code$ - - $Code$// runs hint "hello" on first connected client - "hello" remoteExecCall [" hint ", 3];$/Code$ - - $Code$// runs hint "hello" everywhere but server - "hello" remoteExecCall [" hint ", -2];$/Code$ - - $Code$// runs hint "hello" everywhere but server, JIPs the message - // and returns e.g. "3_1" as a unique JIP id - myJipID = "hello" remoteExecCall [" hint ", -2, true ];$/Code$ - - $Code$// runs hint "hello" everywhere but server, JIPs the message under ID "some_JIP_ID" - // replacing any previous message with this ID in the JIP queue. - "hello" remoteExecCall [" hint ", -2, "some_JIP_ID"];$/Code$ - - $Code$// runs "someFuncWithNoArgs" on each connected client - remoteExecCall ["someFuncWithNoArgs"];$/Code$ - - $Code$// removes a message identified by "IamUnique" from the JIP queue - remoteExecCall ["", "IamUnique"];$/Code$ - - $Code$// all clients will have their ammo set to 1 for their current weapon - { player setAmmo [ primaryWeapon player, 1];} remoteExecCall [" bis_fnc_call ", 0];$/Code$ - - $Code$// Object obj will have its ammo set to 1 where it is local - [obj,[ primaryWeapon obj, 1]] remoteExecCall [" setAmmo ", obj];$/Code$ - - $Code$myJipID = "hello" remoteExecCall ["", 0]; - if ( isNil "myJipID") then { hint "empty function name is not allowed"; };$/Code$ + $Code$if ( captive _general) then { removeAllWeapons _general; };$/Code$ - undefined / undefined + global / undefined - (July 16, 2015) - Removal of persistent call must be in the following format no argument remoteExecCall [ empty string, JIP id ]. For example: - $Code$ remoteExecCall ["", "5:8"];$/Code$ - - (December 29, 2015) - 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 class Functions is in mode 1 (whitelist), the following BE filter exclusion can be used to safely allow all whitelisted *_fnc_* functions taking an array as parameter to go through: - $Code$!="\w+?_fnc_\w+? \[.*\]"$/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, and instead use functions, as commands need to be excluded individually for BE, while all functions are covered by the above exclusion. - - (May 10, 2017) - To remoteExecCall : - $Code$ titleText ["Test Message", "PLAIN", 1];$/Code$ - Use - $Code$[["Test Message", "PLAIN", 1]] remoteExecCall ["titleText"];$/Code$ - Anything + Boolean + - remoteExecutedOwner + addTeamMember - Returns clientOwner of the PC, which initiated Remote Execution call. If used in SP or outside of remote executed context, the command returns 0. To check if the context was remote executed or remote executed from JIP queue, use isRemoteExecuted and isRemoteExecutedJIP + Add given member to given team. Effect is local, unless both member and team are local to PC on which command is executed, then effect is global. + The same Team Member can be member of several different teams at the same time. - https://community.bistudio.com/wiki/remoteExecutedOwner + https://community.bistudio.com/wiki/addTeamMember - remoteExecutedOwner + Team_Member addTeamMember Team_Member - remoteExecutedOwner + team addTeamMember member - $Code$_callerRE = remoteExecutedOwner ;$/Code$ - - $Code$// Send request to the server and get immediate response: - { - // in this scope, the remoteExecutedOwner equals clientOwner of the sender - // so using it as target in remoteExec will send response right back at him - [ - time, // mission time value on the server - { - hint format - [ - "Request recieved!\nMission time value on the server is: %1", - _this - ]; - } - ] - remoteExec ["call", remoteExecutedOwner ]; // server response to the sender - } - remoteExec ["call", 2]; // send request to server$/Code$ + $Code$_team addTeamMember _teamMember;$/Code$ - undefined / undefined + local / local - Number + Nothing + - remoteExec + assignAsTurret - Asks server to execute given scripted function or script command on given target PC. The environment chosen for the execution is as follows: - Scripted function - scheduled environment ( suspension is allowed, i.e. spawn, execVM ). - Script command - unscheduled environment ( suspension is NOT allowed). - remoteExec can also be used in SP (the same restrictions apply both to SP and MP). For more information about the usage, security features and advanced jip techniques check the remote execution dedicated section. + Assigns the soldier to turret. - https://community.bistudio.com/wiki/remoteExec + https://community.bistudio.com/wiki/assignAsTurret - Anything remoteExec Array + Object assignAsTurret Array - params remoteExec [functionName, targets, JIP] + unit assignAsTurret [vehicle, [turretPath]] - $Code$// runs hint "hello" on each connected client - "hello" remoteExec [" hint "];$/Code$ - - $Code$// runs hint "hello" on first connected client - "hello" remoteExec [" hint ", 3];$/Code$ - - $Code$// runs hint "hello" everywhere but server - "hello" remoteExec [" hint ", -2];$/Code$ - - $Code$// runs hint "hello" everywhere but server, JIPs the message - // and returns e.g. "3_1" as a unique JIP id - myJipID = "hello" remoteExec [" hint ", -2, true ];$/Code$ - - $Code$// runs hint "hello" everywhere but server, JIPs the message under ID "some_JIP_ID" - // replacing any previous message with this ID in the JIP queue. - "hello" remoteExec [" hint ", -2, "some_JIP_ID"];$/Code$ - - $Code$// runs "someFuncWithNoArgs" on each connected client - remoteExec ["someFuncWithNoArgs"];$/Code$ - - $Code$// removes a message identified by "IamUnique" from the JIP queue - remoteExec ["", "IamUnique"];$/Code$ - - $Code$// all clients will have their ammo set to 1 for their current weapon - { player setAmmo [ primaryWeapon player, 1];} remoteExec [" bis_fnc_call ", 0];$/Code$ - - $Code$// Object obj will have its ammo set to 1 where it is local - [obj,[ primaryWeapon obj, 1]] remoteExec [" setAmmo ", obj];$/Code$ - - $Code$myJipID = "hello" remoteExec ["", 0]; - if ( isNil "myJipID") then { hint "empty function name is not allowed"; };$/Code$ - + undefined / undefined - (June 30, 2015) - While it is true that this function executes the desired scripted command/function by calling it, it does not mean remoteExecCall itself will be executed right away. Therefore, calling remoteExecCall is by no means a replacement for calling scripted commands/functions directly. - Example: - remoteExecCall ["func1"]; call func2; // func2 can be executed sooner than func1 - call func1; call func2; // func2 will always execute after func1. - - (December 29, 2015) - 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 class Functions is in mode 1 (whitelist), the following BE filter exclusion can be used to safely allow all whitelisted *_fnc_* functions taking an array as parameter to go through: - $Code$!="\w+?_fnc_\w+? \[.*\]"$/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, and instead use functions, as commands need to be excluded individually for BE, while all functions are covered by the above exclusion. - - (January 15, 2016) - Executing commands/functions via remoteExec is more faster than using BIS_fnc_MP. Tested with BIS_fnc_codePerformance in ArmA 3 1.52. - $Code$['"string" remoteExec ["hint",player];',[],100] call BIS_fnc_codePerformance ; //Result ~0.1ms$/Code$ - $Code$['["string","hint", player ] call BIS_fnc_MP ;',[],100] call BIS_fnc_codePerformance ; //Result ~0.6ms$/Code$ - - (March 24, 2016) - The INCORRECT way to call reveal command on a certain object for every player: - $Code$[ player, _desired_object] remoteExec ["reveal", 0];$/Code$ - In this case player object will be the object obtained on the computer where remoteExec is initiated. If it is dedicated server, player will be objNull, if it is client, player would be player object on this client. In any case this will not reveal _desired_object for all connected players. - The CORRECT way: - $Code$[_desired_object, { player reveal _this}] remoteExec ["call", 0];$/Code$ - The _desired_object will be identical on every client, this is what we want, but player will refer to individual player on each client, so _desired_object will be revealed to all connected players. - - (May 25, 2016) - When adapting mission from dedicated server for SP, if target used in remoteExec is -2 (execute on every client but not server), in SP this will not execute since client is server in SP. To work around, the target could be set using isMultiplayer condition like this: - $Code$"123" remoteExec ["hint", [0, -2] select isMultiplayer ];$/Code$ - This will execute hint on every client in MP on dedicated server (target -2) and will also execute it in SP (target 0). - - (May 28, 2016) - While KK's solution works fine in sp missions and on dedicated servers, it will not work properly for hosted missions. - Solution: - $Code$[0,0.5] remoteExec [' fadeRadio ',[0,-2] select isDedicated, true ];$/Code$ - Singleplayer: isDedicated returns false - code is executed everywhere (0) - Hosted: isDedicated returns false - code is executed everywhere including host (0) - Dedicated: isDedicated returns true - code is executed everywhere excluding server (-2) - - (Jan 30, 2017) - $Code$[some params] remoteExec ['some command',2,true];$/Code$ - will fail, as you can't use JIP and remoteExec on server only - $Code$[some params] remoteExec ['some command',2]; // works$/Code$ - - (May 10, 2017) - To remoteExec : - $Code$ titleText ["Test Message", "PLAIN", 1];$/Code$ - Use - $Code$[["Test Message", "PLAIN", 1]] remoteExec ["titleText"];$/Code$ - Anything + Nothing + - remove3DENConnection + inArea - Remove connection between entities. + Checks whether given position is inside given area. The area is usually a rectangle or an ellipse defined similar to triggerArea format. Hence argument for this command could be a trigger, a marker, a location or an array in format [center, a, b, angle, isRectangle, c]. This command also supports hexagon area which can be created from ellipse when both a and b are negative. Hexagon ellipses are also supported by both marker creation and drawEllipse. + Alternatively, use inAreaArray to check multiple positions/objects within area. - https://community.bistudio.com/wiki/remove3DENConnection + https://community.bistudio.com/wiki/inArea - remove3DENConnection Array + Array/Object inArea Object + + Array/Object inArea String + + Array/Object inArea Location + + Array/Object inArea Array - remove3DENConnection [type, from, to] + position inArea trigger + + position inArea marker + + position inArea location + + position inArea [center, a, b, angle, isRectangle, c] - $Code$remove3DENConnection ["RandomStart", get3DENSelected "Object","marker_0"] - // Remove random start on marker "marker_0" from all selected objects.$/Code$ + $Code$_playerIsInside = player inArea _myTrigger;$/Code$ + + $Code$_positionIsInside = _myPosition inArea [[100, 100, 0], 20, 30, 45, false ];$/Code$ undefined / undefined @@ -49753,29 +50506,31 @@ - Boolean + Boolean - Boolean - Boolean - Boolean + - remove3DENEventHandler + preloadTitleRsc - Removes Eden Editor event handler of given type and ID. - See the list of all Eden Editor Event Handlers. + Resource title - Preload data. + The resource can be defined in the Description.ext file. - https://community.bistudio.com/wiki/remove3DENEventHandler + https://community.bistudio.com/wiki/preloadTitleRsc - remove3DENEventHandler Array + preloadTitleRsc Array - remove3DENEventHandler [type,id] + preloadTitleRsc [name, type] + + preloadTitleRsc [name, type, speed, showInMap] - $Code$eh = add3DENEventHandler ["onUndo",{ systemChat "Zip..."}]; - remove3DENEventHandler ["onUndo",eh];$/Code$ + $Code$_ok=preloadTitleRsc ["BIS", "PLAIN"]$/Code$ undefined / undefined @@ -49783,231 +50538,246 @@ - Nothing + Boolean + - remove3DENLayer + removeBackpackGlobal - Remove Eden Editor editing layer. + Removes backpack from a unit. (even non-local) - https://community.bistudio.com/wiki/remove3DENLayer + https://community.bistudio.com/wiki/removeBackpackGlobal - remove3DENLayer Number + removeBackpackGlobal Object - remove3DENLayer layerID + removeBackpackGlobal unit - $Code$_myLayer = -1 add3DENLayer "Enemy Base"; - remove3DENLayer _myLayer ;$/Code$ + $Code$removeBackpackGlobal player ;$/Code$ - undefined / undefined + global / global + (May 8, 2016) + Because of AG (Arguments Global), you can use this command to remove the backpack from UNITS that are local as well as REMOTE. + $Code$ removeBackpackGlobal UNIT;$/Code$ where UNIT can be a local and/or REMOTE player and/or AI - Boolean + Nothing + - removeAction + typeOf - Removes user added action with given id index. This only removes actions added with the addAction command. You cannot remove default game actions, such as reload. - This command has local effect. The action will only be removed on the computer that executes the command. + Returns the config class name of given object or "" if object doesn't have config class. - https://community.bistudio.com/wiki/removeAction + https://community.bistudio.com/wiki/typeOf - Object removeAction Number + typeOf Object - unit removeAction index + typeOf object - $Code$player removeAction 0;$/Code$ + $Code$if ( typeOf vehicle player == "B_Heli_Light_01_armed_F") then { hint "Player is in AH-9 Pawnee"};$/Code$ - global / local + undefined / undefined + (August 4, 2006) + (CWR 1.90)Try using this on an object pre-placed in the mission editor (such as a house): hint format ["%1", typeOf object xxx] Now place an object in the editor, save the map, and open up the Mission.sqm. Find the line: vehicle = "XXX", and replace XXX with the name of the object that you found above. Save it, and load the map. (this method is no longer available since ArmA) - Nothing + String + - removeAll3DENEventHandlers + moveTo - Removes all Eden Editor event handlers of given type. - See the list of all Eden Editor Event Handlers. + Low level command to person to move to given position. - https://community.bistudio.com/wiki/removeAll3DENEventHandlers + https://community.bistudio.com/wiki/moveTo - removeAll3DENEventHandlers String + Object moveTo PositionATL - removeAll3DENEventHandlers type + person moveTo position - $Code$removeAll3DENEventHandlers "onUndo";$/Code$ - + - undefined / undefined + local / global + (August 14, 2010) + moveTo is a low-level command used in FSM called with doFSM or commandFSM. See doFSM for more information about this. Use doMove everywhere else - even in FSM executed with execFSM. - Nothing + Nothing + - removeAllActions + menuShortcutText - Removes all unit's user added actions. + Returns a string containing shortcut text for menu item on the given path. - https://community.bistudio.com/wiki/removeAllActions + https://community.bistudio.com/wiki/menuShortcutText - removeAllActions Object + menuShortcutText Array - removeAllActions unit + menuShortcutText [idc, path] - $Code$removeAllActions player ;$/Code$ - + - global / local + undefined / undefined - (30 October, 2013) - Syntax of this command was until Arma 3 ver. 1.06: unit removeAllActions number - Nothing + String + - removeAllAssignedItems + selectedEditorObjects - Unassigns and deletes all linked items from inventory. The commands operates on assignedItems array, which doesnt include goggles or headgear. Use removeGoggles and removeHeadgear for those. + Returns a list of currently selected editor objects. + i + Some Old Editor Command - https://community.bistudio.com/wiki/removeAllAssignedItems + https://community.bistudio.com/wiki/selectedEditorObjects - removeAllAssignedItems Object + selectedEditorObjects Control - removeAllAssignedItems unit + selectedEditorObjects map - $Code$removeAllAssignedItems player ;$/Code$ + $Code$_selObjects = selectedEditorObjects _map + Result can be: ["_vehicle_0","_vehicle_9","_vehicle_11"]$/Code$ - local / global + undefined / undefined - Nothing + Array + - removeAllContainers + grpNull - Removes all containers from the unit. + A non-existing Group. To compare non-existent groups use isNull or isEqualTo : + grpNull == grpNull ; // false + isNull grpNull ; // true + grpNull isEqualTo grpNull ; // true - https://community.bistudio.com/wiki/removeAllContainers + https://community.bistudio.com/wiki/grpNull - removeAllContainers Object + grpNull - removeAllContainers unit + grpNull - $Code$removeAllContainers player;$/Code$ + $Code$! isNull grpNull ; // false$/Code$ + + $Code$str grpNull ; // NULL-group$/Code$ undefined / undefined - (2013) - This will remove the Uniform, Vest and Backpack from a unit leaving them unable to hold or pickup inventory items. - Nothing + Group + - removeAllCuratorAddons + finishMissionInit - Restrict access to all addons for given curator. + Finish world initialization before mission is launched. - https://community.bistudio.com/wiki/removeAllCuratorAddons + https://community.bistudio.com/wiki/finishMissionInit - removeAllCuratorAddons Object + finishMissionInit - removeAllCuratorAddons curatorObj + finishMissionInit - $Code$removeAllCuratorAddons myCurator;$/Code$ - + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - removeAllCuratorCameraAreas + create3DENComposition - Delete all curator camera areas. + Create new Composition. To create individual entities, use create3DENEntity. - https://community.bistudio.com/wiki/removeAllCuratorCameraAreas + https://community.bistudio.com/wiki/create3DENComposition - removeAllCuratorCameraAreas Object + create3DENComposition Array - removeAllCuratorCameraAreas curatorObj + create3DENComposition [configPath, position] - $Code$removeAllCuratorCameraAreas myCurator;$/Code$ + $Code$myComposition = create3DENComposition [ + configFile "CfgGroups" "West" "BLU_F" "Infantry" "BUS_InfSquad", + screenToWorld [0.5,0.5] + ];$/Code$ undefined / undefined @@ -50015,196 +50785,325 @@ - Nothing + Array + - removeAllCuratorEditingAreas + getMarkerColor - Delete all curator edit areas. + Returns marker color for given marker. See setMarkerColor. Note: This function is identical to markerColor. - https://community.bistudio.com/wiki/removeAllCuratorEditingAreas + https://community.bistudio.com/wiki/getMarkerColor - removeAllCuratorEditingAreas Object + getMarkerColor String - removeAllCuratorEditingAreas curatorObj + getMarkerColor markerName - $Code$removeAllCuratorEditingAreas myCurator;$/Code$ + $Code$"MarkerOne" setMarkerColor "ColorBlack"; + _color = getMarkerColor "MarkerOne"; //returns "ColorBlack"$/Code$ - undefined / undefined + global / undefined - Nothing + String + - removeAllEventHandlers + call - Removes all event handlers of given type that were added by addEventHandler. Since VBS2 v1.24 can be applied on individual weapon rounds. + Executes given set of compiled instructions with an option to pass arguments to the executed Code. In OFP this command used to accept String for the code. - https://community.bistudio.com/wiki/removeAllEventHandlers + https://community.bistudio.com/wiki/call - Object removeAllEventHandlers String + call Code + + Anything call Code - objectName removeAllEventHandlers handlerType + call code + + args call code - $Code$player removeAllEventHandlers "killed";$/Code$ + $Code$call { hint str 123};$/Code$ + + $Code$123 call { hint str _this};$/Code$ + + $Code$_sum = [1, 2] call {(_this select 0) + (_this select 1)}; + hint str _sum; //3$/Code$ + + $Code$123 call compile " hint str _this";$/Code$ + + $Code$_result = 123 call compile preprocessFileLineNumbers "myfile.sqf";$/Code$ undefined / undefined + (July 5, 2014) + A called function may only use suspension ( sleep, uiSleep, waitUntil ) if it originates in a scheduled environment. If the called function originates in a non-scheduled environment it will return a generic error. + $Code$// *** non-scheduled origin *** + [] spawn { + // *** scheduled scope *** + [] call { + // *** scheduled scope *** + sleep 3; // - OK + hintSilent "Hello World!"; + }; + }; + $/Code$ + $Code$// *** non-scheduled origin *** + [] call { + // *** non-scheduled scope*** + [] call { + // *** non-scheduled scope *** + sleep 3; // - NOT OK + hintSilent "Hello World!"; + }; + }; + $/Code$ + $Code$// *** scheduled origin *** + [] spawn { + // *** scheduled scope *** + [] call { + // *** scheduled scope *** + sleep 3; // - OK + hintSilent "Hello World!"; + }; + }; + $/Code$ + $Code$// *** scheduled origin *** + [] call { + // *** scheduled scope*** + [] call { + // *** scheduled scope *** + sleep 3; // - OK + hintSilent "Hello World!"; + }; + }; + $/Code$ + + (February 17, 2015) + If the code is in non-scheduled scope and contains while-do statement, the code runs only 10,000 times at the maximum, even if the statement makes infinite loop. (ARMA3 Ver. 1.38.128937) + $Code$// *** non-scheduled origin *** + [] call { + // *** non-scheduled scope*** + [] call { + // *** non-scheduled scope *** + _a=0; + while{_a 15000} do{ + _a=_a+1; + }; + hint str(_a);//10000 + }; + };$/Code$ - Nothing + Anything - Anything + - removeAllHandgunItems + lightIsOn - Removes all items from weapon except magazine. + Check if lampost is on (shining). For working with CfgNonAIVehicles class "StreetLamp" only. Possible values are: + "ON" + "OFF" + "AUTO" (auto is only on during the night). + "ERROR" - https://community.bistudio.com/wiki/removeAllHandgunItems + https://community.bistudio.com/wiki/lightIsOn - removeAllHandgunItems Object + lightIsOn Object - removeAllHandgunItems unit + lightIsOn lamppost - + $Code$? lightIsOn nearestObject [ player, "StreetLamp"] == "ON" :hint "nightime"$/Code$ + + $Code$_it = lightIsOn object 159582$/Code$ + + $Code$if ( count allMissionObjects "StreetLamp" == 0) then { + hint "Objects compatible with 'lightIsOn' are not found."; + } else { + hint "'lightIsOn' compatible objects are found!"; + };$/Code$ + - local / global + undefined / undefined + (August 4, 2006) + Notes from before the conversion: + Use switchLight to turn lamposts on and off. - Nothing + String + - removeAllItemsWithMagazines + cutFadeOut - Removes all itemsWithMagazines from the uniform, vest and backpack. + Terminates the effect in the given layer by fading it out according to the given duration. If named layer used and it doesn't exist, it will be allocated. + For greater efficiency and ease of modability it is recommended to use named layers available with alternative syntax since Arma 3 v1.57.134673 - https://community.bistudio.com/wiki/removeAllItemsWithMagazines + https://community.bistudio.com/wiki/cutFadeOut - removeAllItemsWithMagazines Object + Number cutFadeOut Number + + String cutFadeOut Number - removeAllItemsWithMagazines unit + layer cutFadeOut duration + + layerName cutFadeOut duration - $Code$removeAllItemsWithMagazines player ;$/Code$ + $Code$0 cutFadeOut 2;$/Code$ + + $Code$_layer = "layer1" cutFadeOut 2;$/Code$ undefined / undefined + (July 9, 2016) + (ArmA v1.60) + The actual fadeout-duration can be dependent on the duration for the fadein (e.g. specified by cutText ). If the fadein-duration is set to a value less than 1 the fadeout-duration will be the given number multiplied by the fadein-duration. + "test" cutText ["", "BLACK", 0.5, true]; // fadein is 0 + "test" cutFadeout 2; // The actual fadeout-time is 2 * 0.5 = 1 - Nothing + Nothing - Number + - removeAllItems + get3DENEntityID - Removes all special items from the unit. + Returns unique index of an Eden Entity. This number remains the same even after saving and loading the scenario. - https://community.bistudio.com/wiki/removeAllItems + https://community.bistudio.com/wiki/get3DENEntityID - removeAllItems Object + get3DENEntityID EdenEntity - removeAllItems unit + get3DENEntityID entity - $Code$removeAllItems unitName;$/Code$ + $Code$myID = get3DENEntityID player$/Code$ - local / global + undefined / undefined - (June 18, 2013) - Arma 3, version 0.70 - removes only items listed by command items. - Nothing + Number + - removeAllMPEventHandlers + playGesture - Removes all MP event handlers of the given type which were added by addMPEventHandler. Command needs to be executed only on one PC for MP event handler to be removed globally. + When used on a person,a smooth transition to the given move will be initiated. Command doesn't seem to be functional - https://community.bistudio.com/wiki/removeAllMPEventHandlers + https://community.bistudio.com/wiki/playGesture - Object removeAllMPEventHandlers String + Object playGesture String - objectName removeAllMPEventHandlers event + soldier playGesture moveName - $Code$player removeAllMPEventHandlers "mpkilled";$/Code$ + $Code$soldierOne playGesture "Wave"$/Code$ - global / global + undefined / undefined + (August 31, 2010) + Rpt says "Not implemented" as of OA 1.54. - Nothing + Nothing + - removeAllMissionEventHandlers + ctrlSetAngle - Removes all mission event handlers of the given type which were added by addMissionEventHandler. + Sets the rotation of an ST_PICTURE control. Rotation will be done within the control boundaries, so if the X and Y are given off center, the picture may get clipped by the control boundaries. Doesn't require ctrlCommit. Procedural textures filled controls do not rotate. - https://community.bistudio.com/wiki/removeAllMissionEventHandlers + https://community.bistudio.com/wiki/ctrlSetAngle - removeAllMissionEventHandlers String + Control ctrlSetAngle Array - removeAllMissionEventHandlers type + control ctrlSetAngle [angle, centerX, centerY] + + control ctrlSetAngle [angle, centerX, centerY, now] - $Code$removeAllMissionEventHandlers "Loaded";$/Code$ + $Code$_control ctrlSetAngle [25, 0.5, 0.5];$/Code$ + + $Code$with uiNamespace do + { + ctrl = findDisplay 46 ctrlCreate ["RscPictureKeepAspect", -1]; + ctrl ctrlSetPosition [0,0,1,1]; + ctrl ctrlSetText "A3\Missions_F_Exp\data\Img\lobby\ui_campaign_lobby_background_tablet_radial_left_ca.paa"; + ctrl ctrlCommit 0; + angle = 0; + onEachFrame + { + with uiNamespace do + { + if (angle 359) then {angle = 0}; + ctrl ctrlSetAngle [angle, 0.5, 0.5]; + angle = angle + 1; + }; + }; + };$/Code$ + + $Code$_control ctrlSetAngle [25, 0.5, 0.5, false ]; + _control ctrlCommit 1; // Rotation applies smoothly for 1 second.$/Code$ undefined / undefined @@ -50212,29 +51111,30 @@ - Nothing + Nothing + - removeAllMusicEventHandlers + weaponsItemsCargo - Removes all music track event handlers of given type. + Returns an array with subarrays contains class names and also names of connected items of all the vehicle's cargo weapons in weaponsItems format. If weapon has no magazine, an empty array [] is returned instead of magazine info. - https://community.bistudio.com/wiki/removeAllMusicEventHandlers + https://community.bistudio.com/wiki/weaponsItemsCargo - removeAllMusicEventHandlers String + weaponsItemsCargo Object - removeAllMusicEventHandlers type + weaponsItemsCargo vehicle - $Code$removeAllMusicEventHandlers "MusicStart"$/Code$ + $Code$weaponsItemsCargo vehicle player ;$/Code$ - $Code$removeAllMusicEventHandlers "MusicStop"$/Code$ + $Code$weaponsItemsCargo _weaponholder;$/Code$ undefined / undefined @@ -50242,27 +51142,28 @@ - Nothing + Array + - removeAllOwnedMines + showWaypoints - Removes ownership of all owned mines/explosive devices of the given unit + Shows/Hides task HUD markers and waypoints that will fade out in time. Dependable on difficulty settings. - https://community.bistudio.com/wiki/removeAllOwnedMines + https://community.bistudio.com/wiki/showWaypoints - removeAllOwnedMines Object + showWaypoints Boolean - removeAllOwnedMines unit + showWaypoints enabled - $Code$removeAllOwnedMines player ;$/Code$ + $Code$showWaypoints true ;$/Code$ undefined / undefined @@ -50270,150 +51171,184 @@ - Nothing + Nothing + - removeAllPrimaryWeaponItems + ropeDestroy - Removes all items from weapon except magazine. + Destroy a rope. - https://community.bistudio.com/wiki/removeAllPrimaryWeaponItems + https://community.bistudio.com/wiki/ropeDestroy - removeAllPrimaryWeaponItems Object + ropeDestroy Object - removeAllPrimaryWeaponItems unit + ropeDestroy rope - + $Code$ropeDestroy myRope;$/Code$ + - local / global + undefined / undefined - Nothing + Nothing + - removeAllWeapons + markerBrush - Remove all weapons and magazines of the unit. - On vehicles only ammo is removed - Does not remove map, compass, radio. Use - unitname removeweapon "itemmap" - for that purpose. + Gets the marker brush. See setMarkerBrush. - https://community.bistudio.com/wiki/removeAllWeapons + https://community.bistudio.com/wiki/markerBrush - removeAllWeapons Object + markerBrush String - removeAllWeapons unitName + markerBrush name - $Code$removeAllWeapons player ;$/Code$ + $Code$if ( markerBrush "Marker1" == "Solid") then { hint "Marker1 is solid!"}$/Code$ - local / global + undefined / undefined - (October 14, 2014) - removeAllWeapons doesn't quite work with vehicles. If you need to remove all weapons from a vehicle, remove each weapon individually: - $Code${tank removeWeapon _x} forEach weapons tank;$/Code$ - Nothing + String + - removeBackpackGlobal + toLower - Removes backpack from a unit. (even non-local) + Converts the supplied string to all lowercase characters. - https://community.bistudio.com/wiki/removeBackpackGlobal + https://community.bistudio.com/wiki/toLower - removeBackpackGlobal Object + toLower String - removeBackpackGlobal unit + toLower string - $Code$removeBackpackGlobal player ;$/Code$ + $Code$hint toLower("AaBb1") + // returns "aabb1"$/Code$ - global / global + undefined / undefined - (May 8, 2016) - Because of AG (Arguments Global), you can use this command to remove the backpack from UNITS that are local as well as REMOTE. - $Code$ removeBackpackGlobal UNIT;$/Code$ where UNIT can be a local and/or REMOTE player and/or AI - Nothing + String + - removeBackpack + lnbColor - Removes unit's backpack + Returns the text color of the item with the given position of the 2D listbox. The color is returned in format Color. - https://community.bistudio.com/wiki/removeBackpack + https://community.bistudio.com/wiki/lnbColor - removeBackpack Object + lnbColor Array + + Control lnbColor Array - removeBackpack unit + lnbColor [idc, [row, column]] + + control lnbColor [row, column] - $Code$removeBackpack this ;$/Code$ - - $Code$removeBackpack mySoldierDude;$/Code$ + $Code$_ctrl lnbColor [0,0];$/Code$ - local / global + undefined / undefined + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Nothing + Array - Array + - removeCuratorAddons + removeAllCuratorAddons - Restrict curator use of given addons. + Restrict access to all addons for given curator. - https://community.bistudio.com/wiki/removeCuratorAddons + https://community.bistudio.com/wiki/removeAllCuratorAddons - Object removeCuratorAddons Array + removeAllCuratorAddons Object - curatorObj removeCuratorAddons addons + removeAllCuratorAddons curatorObj - $Code$curatorModule removeCuratorAddons [addon1,addon2]$/Code$ + $Code$removeAllCuratorAddons myCurator;$/Code$ undefined / undefined @@ -50422,255 +51357,337 @@ This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - removeCuratorCameraArea + getEnvSoundController - Removes curator camera area. + Returns value of the specified controller. - https://community.bistudio.com/wiki/removeCuratorCameraArea + https://community.bistudio.com/wiki/getEnvSoundController - Object removeCuratorCameraArea Number + Position getEnvSoundController String - curatorObj removeCuratorCameraArea cameraAreaID + position getEnvSoundController controller - $Code$myCurator removeCuratorCameraArea 3;$/Code$ + $Code$position player getEnvSoundController "trees"; //0.3333$/Code$ undefined / undefined + (March 25, 2018) + Other environmental variables are; + rain, night, wind, daytime, meadows, trees, houses, forest, sea, coast, altitudeGround. alititudeSea, shooting, deadbody and fog - Nothing + Number + - removeCuratorEditableObjects + removeAllActions - Unregister objects which can be edited by a curator. + Removes all unit's user added actions. - https://community.bistudio.com/wiki/removeCuratorEditableObjects + https://community.bistudio.com/wiki/removeAllActions - Object removeCuratorEditableObjects Array + removeAllActions Object - curatorObj removeCuratorEditableObjects [[objects],removeCrew] + removeAllActions unit - $Code$curatorModule removeCuratorEditableObjects [[ cursorTarget ],true]$/Code$ + $Code$removeAllActions player ;$/Code$ - undefined / undefined + global / local - This scripting command must be executed on the server to work properly in multiplayer + (30 October, 2013) + Syntax of this command was until Arma 3 ver. 1.06: unit removeAllActions number - Nothing + Nothing + - removeCuratorEditingArea + atg - Removes editing area for given curator. + Equivalent to atan - https://community.bistudio.com/wiki/removeCuratorEditingArea + https://community.bistudio.com/wiki/atg - Object removeCuratorEditingArea Number + atg Number - curatorObj removeCuratorEditingArea editAreaID + atg x - $Code$myCurator removeCuratorEditingArea 3;$/Code$ - + undefined / undefined - Nothing + Number + - removeDrawIcon + glanceAt - Removes an icon for an editor object. - i - Some Old Editor Command + Control what the unit is glancing at (target or Position ). + How frequently the unit is glancing there depends on behaviour. - https://community.bistudio.com/wiki/removeDrawIcon + https://community.bistudio.com/wiki/glanceAt - Control removeDrawIcon Array + Object/Array glanceAt Object/Array - map removeDrawIcon [object,string identifier] + unit glanceAt position - + $Code$_someSoldier glanceAt _otherSoldier$/Code$ + + $Code$_otherSoldier glanceAt markerPos "markerOne"$/Code$ + undefined / undefined - Nothing + Nothing + - removeDrawLinks + setWaypointFormation - Remove all drawn links for the given editor object for the given editor,object type. Pass an empty string as param type to remove all draw,links for an object. - i - Some Old Editor Command + Switches the group formation when the waypoint becomes active. + Possible values are: + "NO CHANGE" + "COLUMN" + "STAG COLUMN" + "WEDGE" + "ECH LEFT" + "ECH RIGHT" + "VEE" + "LINE" + "FILE" + "DIAMOND" - https://community.bistudio.com/wiki/removeDrawLinks + https://community.bistudio.com/wiki/setWaypointFormation - Control removeDrawLinks Array + Array setWaypointFormation String - map removeDrawLinks [from,param type] + waypoint setWaypointFormation formation - + $Code$[_grp, 2] setWaypointFormation "LINE";$/Code$ + - undefined / undefined + undefined / global + This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - removeEventHandler + inheritsFrom - Removes event handler added by addEventHandler. - When any handler is removed, all handler indices higher than the deleted one should be decremented. + Returns base entry of config entry. - https://community.bistudio.com/wiki/removeEventHandler + https://community.bistudio.com/wiki/inheritsFrom - Object removeEventHandler Array + inheritsFrom Config - objectName removeEventHandler [type, index] + inheritsFrom config - $Code$player removeEventHandler ["killed", 0]$/Code$ + $Code$_base = inheritsFrom ( configFile "CfgVehicles" "Car"); + // Result is Config entry for class "LandVehicle"$/Code$ + + $Code$// Print parent tree of given config class: + fnc_printParents = + { + disableSerialization ; + if (! isClass _this) exitWith { hint "Argument is not a config Class"}; + private _parents = []; + while {! isNull _this} do + { + _parents pushBack configName _this; + _this = inheritsFrom _this; + }; + reverse _parents; + private _tv = findDisplay 46 createDisplay "RscDisplayEmpty" ctrlCreate ["RscTree", -1]; + _tv ctrlSetPosition [0,0,1,1]; + _tv ctrlSetBackgroundColor [0,0,0,0.5]; + _tv ctrlCommit 0; + private _path = []; + { + _tv tvAdd [_path, _x]; + _path pushBack 0; + } + forEach _parents; + tvExpandAll _tv; + }; + // Example: + ( configFile "CfgVehicles" typeOf player ) call fnc_printParents;$/Code$ undefined / undefined + (Apr 2, 2014) + (A3 1.14)Use BIS_fnc_returnParents if a parents' collection of the given entry is needed. + $Code$ + [( configFile "CfgVehicles" "Land_Atm_02_F"), true ] call BIS_fnc_returnParents ; + //return: ["Land_Atm_02_F","House_Small_F","House_F","House","HouseBase","NonStrategic","Building","Static","All"] + $/Code$ + Not all entries have parent, and please differ parents from path. + $Code$ + inheritsFrom ( configFile "CfgUIColors" "IGUI" "Presets" "PresetA1" "Variables"); + //return: Nothing + $/Code$ - Nothing + Config + - removeFromRemainsCollector + vehicleVarName - Removes vehicles/units from disposal manager, added earlier with addToRemainsCollector + Returns the name of the variable which contains a primary editor reference to this object. This is the variable given in the Insert Unit dialog / name field, in the editor. It can be changed using setVehicleVarName. + If object refers to a vehicle that wasn't given a name in the editor, the return value is an empty string, "". + Since it is possible to setVehicleVarName individually on each PC, the value of vehicleVarName returned will be local to the PC on which command is executed. - https://community.bistudio.com/wiki/removeFromRemainsCollector + https://community.bistudio.com/wiki/vehicleVarName - removeFromRemainsCollector Array + vehicleVarName Object - removeFromRemainsCollector remains + vehicleVarName object - $Code$removeFromRemainsCollector [unit1, unit2, vehicle1];$/Code$ + $Code$hint vehicleVarName player ;$/Code$ - global / global + global / local + (April 19, 2015) + To get variable names referencing an object in mission namespace: + $Code$KK_fnc_objectVarNames = { + private "_names"; + _names = []; + { + if ( missionNamespace getVariable _x isEqualTo _this) then { + _names pushBack _x; + }; + } forEach allVariables missionNamespace ; + _names + }; + //example + myGroup = group player ; + aGroup = group player ; + hint str ( group player call KK_fnc_objectVarNames); //["agroup","mygroup"]$/Code$ - Nothing + String + - removeGoggles + reversedMouseY - Removes goggles from unit (diver goggles for example). This command does not remove NVGoggles. Use unassignItem and removeItem or just unlinkItem for latter. + Return if mouse vertical axe is inverted. - https://community.bistudio.com/wiki/removeGoggles + https://community.bistudio.com/wiki/reversedMouseY - removeGoggles Object + reversedMouseY - removeGoggles unit + reversedMouseY - $Code$removeGoggles assaultDiver;$/Code$ - + - global / global + undefined / undefined - Nothing + Boolean + - removeGroupIcon + diag_resetShapes - Remove icon with given ID from group. + Reload models on-the-fly without the need of restarting the game. Changes applied by diag_resetShapes are applied to all new entities so restart of mission is not necessarily required - spawning vehicle again or changing back forth weapon should usually do the trick. It works only with "-FilePatching" in combination with local data. Command will reload only models present in local data. + Limitation - you can't reload cfgSkeletons (Which is inside model.cfg) + Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. - https://community.bistudio.com/wiki/removeGroupIcon + https://community.bistudio.com/wiki/diag_resetShapes - Group removeGroupIcon Number + diag_resetShapes - group removeGroupIcon iconID + diag_resetShapes - $Code$_target removeGroupIcon (_target getvariable "hc_attackicon");$/Code$ + $Code$diag_resetShapes$/Code$ undefined / undefined @@ -50678,167 +51695,260 @@ - Nothing + Nothing + - removeHandgunItem + isSteamMission - Removes given weapon item from the handgun weapon cargo space. - As of Arma 3 DEV 1.37, this command also supports weapon magazines. + Returns true if the current mission is a Steam Workshop mission. - https://community.bistudio.com/wiki/removeHandgunItem + https://community.bistudio.com/wiki/isSteamMission - Object removeHandgunItem String + isSteamMission - unit removeHandgunItem item + isSteamMission - $Code$player removeHandgunItem "muzzle_snds_L";$/Code$ + $Code$if ( isSteamMission ) then + { + hint "Thank you for subscribing to my mission on Steam!"; + } + else + { + hint "Thank you for downloading my mission off the Internet!"; + };$/Code$ - local / global + undefined / undefined - Nothing + Boolean + - removeHeadgear + removeEventHandler - Removes headgear from a unit. If unit has no headgear command quietly fails. + Removes event handler added by addEventHandler. + When any handler is removed, all handler indices higher than the deleted one should be decremented. - https://community.bistudio.com/wiki/removeHeadgear + https://community.bistudio.com/wiki/removeEventHandler - removeHeadgear Object + Object removeEventHandler Array - removeHeadgear unit + objectName removeEventHandler [type, index] - $Code$removeHeadgear player ;$/Code$ + $Code$player removeEventHandler ["killed", 0]$/Code$ - global / global + undefined / undefined - (August 5, 2016) - To clarify, this command effectively DELETES the headgear. It does not simply remove it from unit's head and move it into inventory. - Nothing + Nothing + - removeItemFromBackpack + selectBestPlaces - Removes item from soldier's backpack. + Find the places with the maximum value of expression in the given area. Places can be on water. Results are sorted by value. Search pattern is randomised every command execution. - https://community.bistudio.com/wiki/removeItemFromBackpack + https://community.bistudio.com/wiki/selectBestPlaces - Object removeItemFromBackpack String + selectBestPlaces Array - unit removeItemFromBackpack item + selectBestPlaces [position, radius, expression, precision, sourcesCount] - + $Code$myPlaces = selectBestPlaces [ position player, 50, "meadow + 2*hills", 1, 5];$/Code$ + - global / global + undefined / undefined + (Jul 17, 2010) + see http://forums.bistudio.com/showthread.php?t=93897 for some more information (though neither official, nor complete). The most important information is the list of useable keywords for the expression which is: forest, trees, meadow, hills, houses, sea, night, rain, windy and deadBody. The keyword will be replaced by the actual value at the given sample position and thus the expression gets evaluated. For example the following expression (which returns high values in forest) "forest + trees - meadow - houses - (10 * sea)" might be transformed to 0 + 0.1 - 0.7 - 0 - (10 * 0) which is - with it's result of -0.6 - not in the forest, though there are some tree(s) around. You get the idea. + Also note that you may aswell check such an expression value at a single position by passing a low radius and a sourceCount of 1, which is often just as useful as retrieving multiple (and already sorted) positions. + Also do not underestimate the keywords night, rain or windy, for if you couple them with the other keywords, you can easily get a highly dynamic system at a very low cost. (this, btw., is how animals "choose" where and when to spawn) + + (Apr 3, 2014) + In ArmA3 ver 1.14 Two new expressions are available: waterDepth (0-1) and camDepth (0-1), along with three simple operators: interpolate, randomGen and factor that can be used together with expressions. E.g. + $Code$ + p = selectBestPlaces [ + position player, + 500, + "(2 * (waterDepth interpolate [1,16,0,1]) * ((0.1+houses factor [0.1,0.8]) * (randomGen 1 + houses)))", + 1, + 1]; + $/Code$ + A lgorithm randomGen: + $Code$ + randomGen A(number): randomly generate a float number from 0 - A + $/Code$ + A lgorithm factor: + $Code$ + A(number) factor [p,q] = + p A q: [(A -p)/(q-p)] + $/Code$ + A lgorithm interpolate: + $Code$ + A(number) interpolate [p,q,r,s] = + A =p:r + A =q:s + p A q: [(A -p)/(q-p)]*(s-r) +r + $/Code$ + + (June 15, 2015) + precision seems to have range 0 - 100. At very low values the command is extremely slow. 100 makes it quite fast. It looks like precision is some kind of grid search size. Large chunks make the search faster but less accurate. + Resulting array is [] if sourcesCount is 0 or expression is "". In all other cases it seems that result is array of arrays of the set max count. The sole indication of successful search is expressionResult value when it is 0. + + (June 4, 2017) + Results are sorted by value, that is, the result of the expression. + They are sorted in descending order, so in the case of waterdepth, the deepest water will be found at the locations at the start of the returned array and the shallowest water will be found at the locations at the end. + + (September 22, 2017) + The sourcesCount parameter is capped to 50. Asking for any more is capped to 50. - Nothing + Array + - removeItemFromUniform + difficulty - Removes item from soldier's uniform. Can be used with magazines and weapons too. + Returns high-level selected difficulty mode. + Returned value will be: 0 (Recruit), 1 (Regular), 2 (Veteran) or 3 (Elite) - https://community.bistudio.com/wiki/removeItemFromUniform + https://community.bistudio.com/wiki/difficulty - Object removeItemFromUniform String + difficulty - unit removeItemFromUniform item + difficulty - + $Code$value = difficulty ;$/Code$ + + $Code$// The command returns the index of selected difficulty as they appear in CfgDifficulties + hint str difficulty ; //Result: 4$/Code$ + - global / global + undefined / undefined - Nothing + Number + - removeItemFromVest + add3DENConnection - Removes item from soldier's vest. + Connect entities together. - https://community.bistudio.com/wiki/removeItemFromVest + https://community.bistudio.com/wiki/add3DENConnection - Object removeItemFromVest String + add3DENConnection Array - unit removeItemFromVest item + add3DENConnection [type, from, to] - + $Code$add3DENConnection ["RandomStart", get3DENSelected "Object","marker_0"] + // Set random start on marker "marker_0" for all selected objects.$/Code$ + - global / global + undefined / undefined - Nothing + Boolean + - removeItems + moonPhase - Removes all items with given template from the inventory. + Returns the phase of the in-game Moon on the given date in range 0...1, where 0 - new Moon, 1 - full Moon. According to this command the fullest Moon in Arma 3 at midnight is on setDate [4804,7,13,0,0]; Use Moon Phase Utility to find out date for a mission with desired moon. - https://community.bistudio.com/wiki/removeItems + https://community.bistudio.com/wiki/moonPhase - Object removeItems String + moonPhase Array - unit removeItems item + moonPhase date - $Code$player removeItems "FirstAidKit";$/Code$ + $Code$_currentMoonPhase = moonPhase date ;$/Code$ + + $Code$// Returns array of dates for given year when moon is at its fullest + fnc_fullMoonDates = + { + private _year = param [0, 2035]; + private ["_date", "_phase", "_fullMoonDate"]; + private _fullMoonPhase = 1; + private _waxing = false ; + private _fullMoonDates = []; + for "_i" from dateToNumber [_year, 1, 1, 0, 0] to dateToNumber [_year, 12, 31, 23, 59] step 1 / 365 do + { + _date = numberToDate [_year, _i]; + _phase = moonPhase _date; + call + { + if (_phase _fullMoonPhase) exitWith + { + _waxing = true ; + _fullMoonDate = _date; + }; + if (_waxing) exitWith + { + _waxing = false ; + _fullMoonDates pushBack _fullMoonDate; + }; + }; + _fullMoonPhase = _phase; + }; + _fullMoonDates + }; + //set random full moon date in year 1970 + setDate selectRandom (1970 call fnc_fullMoonDates);$/Code$ undefined / undefined @@ -50846,315 +51956,441 @@ - Nothing + Number + - removeItem + currentMagazineTurret - Removes item from the inventory. + Returns the name of the type of the currently using magazine on specified turret. Use turret path [-1] for driver's turret. Note that a turret is not loaded until unit enters it, so this command will return "". - https://community.bistudio.com/wiki/removeItem + https://community.bistudio.com/wiki/currentMagazineTurret - Object removeItem String + Object currentMagazineTurret Array - unit removeItem item + vehicle currentMagazineTurret [turret path] - $Code$bluforUnit unassignItem "NVGoggles"; - bluforUnit removeItem "NVGoggles"; - opforUnit unassignItem "NVGoggles_OPFOR"; - opforUnit removeItem "NVGoggles_OPFOR"; - independentUnit unassignItem "NVGoggles_INDEP"; - independentUnit removeItem "NVGoggles_INDEP";$/Code$ + $Code$_magazine = MBT_Kuma currentMagazineTurret [0];$/Code$ - global / global + undefined / undefined - Nothing + String + - removeMPEventHandler + lnbSetValue - Removes MP event handler added by addMPEventHandler. Format of handler is [type,index]. Index is returned by addMPEventHandler. When any handler is removed, all handler indices highter than the deleted one should decremented + Sets the additional integer value in the item with the position index of the 2D listbox. - https://community.bistudio.com/wiki/removeMPEventHandler + https://community.bistudio.com/wiki/lnbSetValue - Object removeMPEventHandler Array + lnbSetValue Array + + Control lnbSetValue Array - unitName removeMPEventHandler [event, index] + lnbSetValue [idc, [row, column], value] + + control lnbSetValue [[row, column], value] - $Code$player removeMPEventHandler ["killed", 0];$/Code$ + $Code$_ctrl lnbSetValue [[0,0],1];$/Code$ - global / global + undefined / undefined - (25 July, 2011) - At least for MPKilled it needs to be executed where the target unit is local. The effect (the removal) is global. + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Nothing + Nothing - Nothing + - removeMagazineGlobal + name - Removes the magazine from the unit. + When argument is Object, the command returns the name given to a unit using the setIdentity instruction or selected randomly by the game engine if setIdentity has not been used on the unit. If used on vehicle, name of first crew member (in order commander, driver, gunner). If used on an object, "Error: No unit" is being returned. + When argument is Location, the location's name is returned. To return the textual value of a location use text command instead. + NOTE: In Arma 3 setName can be used on a person to set name. However in multiplayer name always returns profileName. - https://community.bistudio.com/wiki/removeMagazineGlobal + https://community.bistudio.com/wiki/name - Object removeMagazineGlobal String + name Object + + name Location - unit removeMagazineGlobal magazineName + name object + + name location - $Code$player removeMagazineGlobal "30Rnd_65x39_caseless_mag";$/Code$ + $Code$_name = name player ;$/Code$ + + $Code$_locationName = name myLocation;$/Code$ + + $Code$name nearestLocation [ position player, "Hill"]; //"" + text nearestLocation [ position player, "Hill"]; //"Lesnoy Khrebet"$/Code$ - global / global + undefined / undefined + Location variant appears to be only for the 3d editor. + + (August 4, 2006) + Notes from before the conversion: + Name will return an error for units that have been dead for more than a few seconds. + + (December 15, 2006) + To return the name of the unit that was given in the editor's "name" field, call up the unit's object in a format statement: + hint format["Unit's name: %1",_unitobject] + + (April 14, 2009) + Will return + Error: No vehicle + for JIP players in init.sqf, if no sleep were performed - Nothing + String - String + - removeMagazineTurret + set3DENGrid - Removes the magazine from the turret. Use turret path [-1] for driver's turret. - Note: you may create invalid combinations by using this function. When doing so, application behaviour is undefined. + Sets the grid increment for the given transformation type. + Transformation types: + Rotation - "r" + Translation - "t" + Scale - "s" - https://community.bistudio.com/wiki/removeMagazineTurret + https://community.bistudio.com/wiki/set3DENGrid - Object removeMagazineTurret Array + set3DENGrid Array - vehicle removeMagazineTurret [magazineName, turretPath] + set3DENGrid [type,value] - $Code$vehicle player removeMagazineTurret ["60rnd_cmflaremagazine",[-1]]$/Code$ - - $Code$_tank removeMagazineTurret ["20Rnd_120mmSABOT_M1A2",[0]]$/Code$ + $Code$set3DENGrid ["t",100];// 100m movement increment$/Code$ - local / global + undefined / undefined - Nothing + Nothing + - removeMagazinesTurret + setSpeech - Removes all magazines of the given type from given vehicle. Use turret path [-1] for driver's turret. + Add speech to location. - https://community.bistudio.com/wiki/removeMagazinesTurret + https://community.bistudio.com/wiki/setSpeech - Object removeMagazinesTurret Array + Location setSpeech String - vehicle removeMagazinesTurret [magazineName, turretPath] + location setSpeech speech - $Code$vehicle player removeMagazinesTurret ["60rnd_cmflaremagazine",[-1]]$/Code$ - - $Code$_tank removeMagazinesTurret ["20Rnd_120mmSABOT_M1A2",[0]]$/Code$ - + - local / global + undefined / undefined - (July 30, 2011) - Here's how you would remove all machine gun ammo from an M1A2 TUSK: - remove the gunner's M240 ammo. - $Code$this removeMagazinesTurret ["1200Rnd_762x51_M240",[0]];$/Code$ - remove the commander's M2 ammo. - $Code$this removeMagazinesTurret ["100Rnd_127x99_M2",[0,0]];$/Code$ - remove the loader's M240 ammo. - $Code$this removeMagazinesTurret ["100Rnd_762x51_M240",[0,1]];$/Code$ - Nothing + Nothing + - removeMagazines + cameraEffect - Remove all magazines of given type from the unit. - Note: You may create invalid combinations with this function. When doing so, application behaviour is undefined. + Sets the given effect on the given camera. If you want to switch the screen directly to the first-person, aiming, third-person or group view of an object, use switchCamera instead. The effect type "Terminate" is used to exit the current camera view and switch back to the player's view. Does not need camCommit. + Since Arma 3 v1.73.142217, it is possible to terminate individual r2t source. For example: $Code$cam cameraEffect ["terminate", "back", "rtt1"]; // would terminate "rtt1" r2t source + cam cameraEffect ["terminate", "back"]; // would terminate all r2t sources$/Code$ - https://community.bistudio.com/wiki/removeMagazines + https://community.bistudio.com/wiki/cameraEffect - Object removeMagazines String + Object cameraEffect Array - unitName removeMagazines magazineName + camera cameraEffect [effectName, effectPosition, r2tName] - $Code$player removeMagazines "M16";$/Code$ + $Code$_cam cameraEffect ["internal", "BACK"];$/Code$ + + $Code$_cam cameraEffect ["internal", "back", "rendersurface"];$/Code$ + + $Code$cam = "seagull" camCreate ( player modelToWorld [0,0,100]); + cam cameraEffect ["FIXED", "LEFT TOP"]; + cam camCommand "MANUAL ON";$/Code$ - local / undefined + local / local - Though BIS did not provide a command to remove all magazines of every type, it can still be accomplished using forEach magazines. example: - {player removeMagazine _x} forEach magazines player + (October 30, 2016) + Types of camera for CfgCameraEffects config: + CamExternal (CamInterpolated) type = 0; // linked directly with object + CamStatic type = 1; // fixed point in space + CamStaticWithZoom type = 2; // fixed point in space + CamChained type = 3; // chained + CamTerminate type = 4; // terminate + CamInternal type = 5; // internal view - Nothing + Nothing + - removeMagazine + weaponsTurret - Remove magazine from the unit. - Note: You may create invalid combinations with this function. When doing so, application behaviour is undefined. + Returns all weapons of given turret. Use turret path [-1] for driver's turret. - https://community.bistudio.com/wiki/removeMagazine + https://community.bistudio.com/wiki/weaponsTurret - Object removeMagazine String + Object weaponsTurret Array - unitName removeMagazine magazineName + vehicle weaponsTurret turretPath - $Code$player removeMagazine "M16"$/Code$ + $Code$_weapons = vehicle player weaponsTurret [0,0]$/Code$ + + $Code$_weapons = _tank weaponsTurret [0]$/Code$ + + $Code$_driverWeapon = _ka50pilot weaponsTurret [-1]$/Code$ + + $Code$_weaponsForAnyTurrentPosition = (vehicle player) weaponsTurret ((assignedVehicleRole player) select 1)$/Code$ - local / undefined + global / undefined + (11 March 2011) + Use assignedVehicleRole in combination to easily determine the weapons for any vehicle position. You need to check for -1 if the unit is in the driver/pilot position. See example 3 and 4. + + (11 March 2011) + funcGetTurretsWeapons = { + private ["_result", "_getAnyMagazines", "_findRecurse", "_class"]; + _result = []; + _getAnyMagazines = { + private ["_weapon", "_mags"]; + _weapon = configFile "CfgWeapons" _this; + _mags = []; + { + _mags = _mags + getArray ( + (if (_x == "this") then { _weapon } else { _weapon _x }) "magazines" + ) + } foreach getArray (_weapon "muzzles"); + _mags + }; + _findRecurse = { + private ["_root", "_class", "_path", "_currentPath"]; + _root = (_this select 0); + _path = +(_this select 1); + for "_i" from 0 to count _root -1 do { + _class = _root select _i; + if (isClass _class) then { + _currentPath = _path + [_i]; + { + _result set [count _result, [_x, _x call _getAnyMagazines, _currentPath, str _class]]; + } foreach getArray (_class "weapons"); + _class = _class "turrets"; + if (isClass _class) then { + [_class, _currentPath] call _findRecurse; + }; + }; + }; + }; + _class = ( + configFile "CfgVehicles" ( + switch (typeName _this) do { + case "STRING" : {_this}; + case "OBJECT" : {typeOf _this}; + default {nil} + } + ) "turrets" + ); + [_class, []] call _findRecurse; + _result; + }; + This call: + "M1A2_US_TUSK_MG_EP1" call funcGetTurretsWeapons + will return all turrets weapons, its magazines and its paths: + [ + ["M256", ["20Rnd_120mmSABOT_M1A2", "20Rnd_120mmHE_M1A2"], [0], "bin\config.bin/CfgVehicles/M1A2_US_TUSK_MG_EP1/Turrets/MainTurret"], + ["M240_veh", ["100Rnd_762x51_M240", "1200Rnd_762x51_M240"], [0], "bin\config.bin/CfgVehicles/M1A2_US_TUSK_MG_EP1/Turrets/MainTurret"], + ["M2BC", ["100Rnd_127x99_M2"], [0, 0], "bin\config.bin/CfgVehicles/M1A2_US_TUSK_MG_EP1/Turrets/MainTurret/Turrets/CommanderOptics"], + ["SmokeLauncher", ["SmokeLauncherMag"], [0, 0], "bin\config.bin/CfgVehicles/M1A2_US_TUSK_MG_EP1/Turrets/MainTurret/Turrets/CommanderOptics"], + ["M240_veh_2", ["100Rnd_762x51_M240", "1200Rnd_762x51_M240"], [0, 1], "bin\config.bin/CfgVehicles/M1A2_US_TUSK_MG_EP1/Turrets/MainTurret/Turrets/LoaderTurret"] + ] + denisko.redisko (denvdmj) - Nothing + Array + - removeMenuItem + checkVisibility - Removes a previously added menu item. - i - Some Old Editor Command + Checks if one position is visible from another position and how much. The results can be affected by getTerrainGrid value, especially if position is near the ground. Particle effects such as smoke can also affect the results. - https://community.bistudio.com/wiki/removeMenuItem + https://community.bistudio.com/wiki/checkVisibility - Control removeMenuItem Number + Array checkVisibility Array - map removeMenuItem index + [ignore, LOD, ignore2] checkVisibility [beg, end] - + $Code$_cansee = [ objNull, "VIEW"] checkVisibility [ eyePos player, eyePos unit1];$/Code$ + undefined / undefined + (August 8, 2016) + Particles that have blockAIVisibility set to 1 will influence the result, but will not make checkVisibility return 0. Instead an extremly small number will be returned. + Distance, fog, overcast, rain and nighttime have no effect on the result. - Nothing + Number + - removeMissionEventHandler + listObjects - Removes mission event handler added by addMissionEventHandler. - When any handler is removed, all handler indices higher that the deleted one should be decremented. + Return the list of all objects of given type. + i + Some Old Editor Command - https://community.bistudio.com/wiki/removeMissionEventHandler + https://community.bistudio.com/wiki/listObjects - removeMissionEventHandler Array + Control listObjects String - removeMissionEventHandler [type, index] + map listObjects type - $Code$for "_i" from 0 to 4 do { - missionNamespace setVariable [ format ["handler%1",_i], addMissionEventHandler ["Loaded","hint ""_i"";"]]; - }; - removeMissionEventHandler ["Loaded",handler2]; //Remove the third index under type "Loaded"$/Code$ - + undefined / undefined - (August 6, 2015) - As of Arma 3 version 1.38 you can safely remove mission event handlers without worrying about decrementing higher indices. - Nothing + Array + - removeMusicEventHandler + simulCloudDensity - Removes specified music track event handler. + Returns density of clouds at given position. - https://community.bistudio.com/wiki/removeMusicEventHandler + https://community.bistudio.com/wiki/simulCloudDensity - removeMusicEventHandler Array + simulCloudDensity Position - removeMusicEventHandler [type, id] + simulCloudDensity pos - $Code$removeMusicEventHandler ["MusicStart", 12];$/Code$ - - $Code$removeMusicEventHandler ["MusicStop", 12];$/Code$ - - $Code$hnd_stop = addMusicEventHandler ["MusicStop",{}]; - removeMusicEventHandler ["MusicStop",hnd_stop];$/Code$ + $Code$simulCloudDensity (getPos player)$/Code$ undefined / undefined @@ -51162,252 +52398,327 @@ - Nothing + Number + - removeOwnedMine + distance - Removes ownership over a remotely detonatable mine from the unit. + Returns a distance in meters between Objects, Positions or Locations. + NOTE: If positions are supplied as arguments, the coordinates are treated as PositionATL if over the land and as PositionASLW if over the sea. If 2D position is supplied, z is assumed 0. - https://community.bistudio.com/wiki/removeOwnedMine + https://community.bistudio.com/wiki/distance - Object removeOwnedMine Object + Object/Array distance Object/Array + + Location/Array distance Location/Array - unit removeOwnedMine mine + param1 distance param2 + + location1 distance location2 - $Code$player removeOwnedMine SuperMine;$/Code$ + $Code$_meters = player distance _object;$/Code$ + + $Code$_meters = player distance [1,2,3];$/Code$ + + $Code$_meters = [1,2,3] distance [4,5,6];$/Code$ + + $Code$_meters = position player distance nearestLocation [ position player, "hill"];$/Code$ - undefined / undefined + global / undefined + (Feb 14, 2007) + distance to position3D (array) doesnt work with OFP, only objects + Armed Assault: + position3D (array) and object works + + (Mar 10, 2010) + This returns the map distance, not the vector distance, [0,0,0] distance [0,0,1] can be 1 or 1, not exactly 1; unlike the vector math. + + (Aug 03, 2012) + If a position in format [x, y, z] is provided for both arguments, distance also checks the z dimension as well. Ie: + player distance [0,0,200] + will return 200, if the player is at this position at ground/sea level. + + (March 22, 2014) + When objects are supplied as arguments, distance is calculated from their model center (object modelToWorld [0,0,0]), and not the position returned by getPos/ATL/ASL. + However, this is not relevant for units, as their model center matches their world position. - Nothing + Number - Number + - removePrimaryWeaponItem + findEmptyPositionReady - Removes given weapon item from the primary weapon cargo space. - As of Arma 3 DEV 1.37, this command also supports weapon magazines. + Check if findEmptyPosition command can be called without waiting for files. - https://community.bistudio.com/wiki/removePrimaryWeaponItem + https://community.bistudio.com/wiki/findEmptyPositionReady - Object removePrimaryWeaponItem String + Array findEmptyPositionReady Array - unit removePrimaryWeaponItem item + center findEmptyPositionReady [radius,maxDistance] - $Code$player removePrimaryWeaponItem "acc_flashlight";$/Code$ - + - local / global + undefined / undefined - Nothing + Boolean + - removeSecondaryWeaponItem + setCenterOfMass - Removes given weapon item from the secondary weapon cargo space. This command also supports weapon magazines. + Changes the center of mass of an object smoothly during the given time (in seconds). A time of zero (or using the alternative syntax) means an immediate change. - https://community.bistudio.com/wiki/removeSecondaryWeaponItem + https://community.bistudio.com/wiki/setCenterOfMass - Object removeSecondaryWeaponItem String + Object setCenterOfMass Array - unit removeSecondaryWeaponItem item + myObject setCenterOfMass [com, time] + + myObject setCenterOfMass com - $Code$player removeSecondaryWeaponItem ( secondaryWeaponItems select 0);$/Code$ + $Code$myObject setCenterOfMass [[0,-1,0],0.5];$/Code$ + + $Code$myObject setCenterOfMass [0,-1,0];$/Code$ local / global + (20 Jun, 2014) + (ArmA3 1.22) A quick reference: + category + setMass + setCenterOfMass + unit + The larger the mass is, the easier a unit will physically fatigued + N/A + aircraft + The larger the mass is, the more sensitive an aircraft will react to joystick, vice versa. + Aircraft slant due to center change accordingly, and the position of the camera view will be altered relatively at the same time. (3rd person view) + vehicle + The larger the mass is, the slower a vehicle drives (Ships will sink), vice versa. (Land vehicle performs like a bouncing ball while ships accelerated pretty speedy.) + Vehicle slant due to center change accordingly. - Nothing + Nothing + - removeSimpleTask + setFormation - Remove a simple task from the list of simple tasks. + Set group formation. + Formation is one of: + "COLUMN" + "STAG COLUMN" + "WEDGE" + "ECH LEFT" + "ECH RIGHT" + "VEE" + "LINE" + "FILE" (ArmA) + "DIAMOND" (ArmA) - https://community.bistudio.com/wiki/removeSimpleTask + https://community.bistudio.com/wiki/setFormation - Object removeSimpleTask Task + Object/Group setFormation String - person removeSimpleTask task + group setFormation formation - $Code$player removeSimpleTask _tskKillSpongebob$/Code$ + $Code$_groupOne setFormation "LINE"$/Code$ - undefined / undefined + local / global - Nothing + Nothing + - removeSwitchableUnit + lnbSort - Remove a unit from the list of units available for Team Switch. + Sorts given multicolumn listbox by lnbText in given column in ascending or descending order. - https://community.bistudio.com/wiki/removeSwitchableUnit + https://community.bistudio.com/wiki/lnbSort - removeSwitchableUnit Object + lnbSort Array + + control lnbSort Array - removeSwitchableUnit unitName + lnbSort [idc, column, reversed] + + control lnbSort [column, reversed] - + $Code$lnbSort [1800, 1, false ];$/Code$ + + $Code$_ctl lnbSort [1, true ]$/Code$ + undefined / undefined - Nothing + Nothing - Nothing + - removeTeamMember + setRepairCargo - Remove given member from given team. Effect is local, unless both member and team are local to PC on which command is executed, then effect is global. + Set amount of repair resources in cargo space of repair vehicle. + Amount 1 is full cargo. - https://community.bistudio.com/wiki/removeTeamMember + https://community.bistudio.com/wiki/setRepairCargo - Team_Member removeTeamMember Team_Member + Object setRepairCargo Number - team removeTeamMember member + vehicleName setRepairCargo amount - $Code$_team removeTeamMember _teamMember;$/Code$ + $Code$_repairTruck1 setRepairCargo 0$/Code$ - local / local + local / global + (July 10, 2015) + (ArmA 3 1.44) setRepairCargo will have no effect if the vehicle doesn't support getRepairCargo. - Nothing + Nothing + - removeUniform + setMousePosition - Removes uniform from unit. + Moves mouse pointer to specified position on the screen. x and y could be any number, but will be clipped so mouse never leaves the screen area. - https://community.bistudio.com/wiki/removeUniform + https://community.bistudio.com/wiki/setMousePosition - removeUniform Object + setMousePosition Array - removeUniform unit + setMousePosition [x, y] - $Code$removeUniform player ;$/Code$ + $Code$setMousePosition [0.5, 0.5];$/Code$ - global / global + undefined / undefined - Nothing + Nothing + - removeVest + not - Removes vest from unit. + not a. + Exactly the same as ! a - https://community.bistudio.com/wiki/removeVest + https://community.bistudio.com/wiki/not - removeVest Object + not Number - removeVest unit + not a - $Code$removeVest player ;$/Code$ + $Code$not false + // Result is true.$/Code$ - global / global + undefined / undefined - Nothing + Boolean + - removeWeaponAttachmentCargo + setArmoryPoints - Remove attachment linked to a weapon from the vehicle cargo space. - This is unoffical documentation. All Information here is as it exists in the Engine. It might not reflect the reality. + Stores passed number into [USERNAME].ArmaXProfile file, where it assigns it as a value to armoryPoints entry. If entry doesn't exist, it is created. - https://community.bistudio.com/wiki/removeWeaponAttachmentCargo + https://community.bistudio.com/wiki/setArmoryPoints - Object removeWeaponAttachmentCargo Array + setArmoryPoints Number - vehicle removeWeaponAttachmentCargo [weaponID,creatorID,attachment] + setArmoryPoints points - $Code$rearmTruckOne removeWeaponAttachmentCargo[weaponID,creatorID,"attachment"]$/Code$ + $Code$setArmoryPoints ( armoryPoints + 20);$/Code$ + + $Code$setArmoryPoints 3.14;$/Code$ undefined / undefined @@ -51415,214 +52726,249 @@ - Nothing + Nothing + - removeWeaponCargo + ctAddRow - Remove weapon from the vehicle cargo space. - This is unoffical documentation. All Information here is as it exists in the Engine. It might not reflect the reality. + Adds one row of controls according to the RowTemplate class. It returns an array containing row index and array of created controls in a format [ rowIndex, [ control0, control1... control n ]]. + Note that rows and headers are indexed separately. - https://community.bistudio.com/wiki/removeWeaponCargo + https://community.bistudio.com/wiki/ctAddRow - Object removeWeaponCargo Array + ctAddRow Control - vehicle removeWeaponCargo [weaponID,creatorID] + ctAddRow Control - $Code$rearmTruckOne removeWeaponCargo [19, 1]$/Code$ + $Code$_array = ctAddRow _control;$/Code$ - undefined / undefined + local / local - Nothing + Array + - removeWeaponGlobal + isObjectRTD - Remove a weapon from a unit. An attempt to remove a weapon, which is not in unit's possession, is simply ignored. + Returns true if RTD model is loaded - https://community.bistudio.com/wiki/removeWeaponGlobal + https://community.bistudio.com/wiki/isObjectRTD - Object removeWeaponGlobal String + isObjectRTD Object - unit removeWeaponGlobal weapon + isObjectRTD helicopter - $Code${ - _x removeWeaponGlobal "Laserdesignator"; - } forEach allUnits ;$/Code$ - - $Code${ - if ( typeOf _x == "O_Heli_Attack_02_black_F") then { - _x removeWeaponGlobal "rockets_Skyfire"; - }; - } forEach vehicles ;$/Code$ + $Code$_heliRTD = isObjectRTD vehicle player ;$/Code$ - global / global + undefined / undefined - Nothing + Boolean + - removeWeaponTurret + lightAttachObject - Removes weapon from the turret. Use turret path [-1] for driver's turret. + Attach light to given object at given position on object. - https://community.bistudio.com/wiki/removeWeaponTurret + https://community.bistudio.com/wiki/lightAttachObject - Object removeWeaponTurret Array + Object lightAttachObject Array - vehicle removeWeaponTurret [weaponName, turretPath] + light lightAttachObject [object, position] - $Code$_tank removeWeaponTurret ["LMG_M200",[0,0]];$/Code$ - - $Code$vehicle player removeWeaponTurret ["SportCarHorn",[-1]];$/Code$ + $Code$myLight lightAttachObject [myVehicle, [-0.5,-0.25,1]];$/Code$ - local / global + global / local + (Dec 1, 2006) + Light can be created with command createVehicleLocal with special vehicle class "#lightpoint" + for example: + $Code$_light = "#lightpoint" createVehicleLocal pos; + _light setLightBrightness 1.0; + _light setLightAmbient [0.0, 1.0, 0.0]; + _light setLightColor [0.0, 1.0, 0.0]; + _light lightAttachObject [_object, [0,0,0]]; + $/Code$ + + (March 31, 2015) + When attached, movement is slow to update (jumpy). Use attachTo when attaching a light to moving objects. - Nothing + Nothing + - removeWeapon + serverCommandExecutable - Remove weapon from a unit. The unit must be local to the computer where command is executed. For a global version of this command see removeWeaponGlobal. - Note : It is possible to create invalid combinations with this command (ie, attempting to remove a weapon that a unit does not possess). When doing so, application behaviour is undefined. + Returns true if the serverCommand can be performed on the machine and in this exact environment, otherwise false. serverCommand can be executed only from User Interface Event Handlers, and this command also checks if that's the case. - https://community.bistudio.com/wiki/removeWeapon + https://community.bistudio.com/wiki/serverCommandExecutable - Object removeWeapon String + serverCommandExecutable String - unit removeWeapon weapon + serverCommandExecutable command - $Code$player removeWeapon "BAF_L85A2_RIS_SUSAT";$/Code$ + $Code$_canKick = serverCommandAvailable "#kick";$/Code$ - $Code$An_2 removeWeapon "M240_veh";$/Code$ + $Code$// Add button to the main map to lock server, which could only be activated by admin: + with uiNamespace do { + ctrl = findDisplay 12 ctrlCreate ["RscButton", -1]; + ctrl ctrlSetPosition [0,0,0.5,0.1]; + ctrl ctrlCommit 0; + ctrl ctrlSetText "LOCK SERVER"; + ctrl ctrlAddEventHandler ["ButtonDown", + { + if ( serverCommandExecutable "#lock") then { + serverCommand "#lock"; + } else { + hint "You need to be logged in as admin to do this"; + }; + }]; + };$/Code$ - local / global + undefined / undefined - (May 27, 2009) - CTD may occur in certain conditions: when shooter is AI and is currently shooting at target in some proximity (tested with M136 on ACE 1.08 and Compact Fix 1.14H+). Even "dropweapon" action may cause CTD with AI. - Nothing + Boolean + - reportRemoteTarget + animationPhase - Shares the target vehicle via datalink to the Side center for a given time. + Returns the phase of the given animation on the given object. Animation can be scripted ( animate, animateSource, animateDoor ) or engine driven. Animation names for an object could be found out with animationNames command. When animation is rotation, like with "MainTurret" for example, the output is in radians, to convert to degrees use deg command. - https://community.bistudio.com/wiki/reportRemoteTarget + https://community.bistudio.com/wiki/animationPhase - Side reportRemoteTarget Array + Object animationPhase String - side reportRemoteTarget [target, time] + object animationPhase animationName - $Code$blufor reportRemoteTarget [ vehicle player, 60];$/Code$ + $Code$_building animate ["maindoor",1]; + sleep 1; + _p = _building animationPhase "maindoor"; + // returns 1 (if the animation speed is = 2 seconds)$/Code$ + + $Code$_flagPole animationPhase "flag";$/Code$ + + $Code$_tank animationPhase "MainTurret";$/Code$ - undefined / undefined + global / undefined - Nothing + Number + - requiredVersion + isClass - Check if version of application is available. If the current version is older than the required one, a warning message is shown and false is returned. - Version of format Major.Minor, e.g. 1.30 + Check if config entry represents config class. - https://community.bistudio.com/wiki/requiredVersion + https://community.bistudio.com/wiki/isClass - requiredVersion String + isClass Config - requiredVersion version + isClass config - $Code$if !( requiredVersion "1.09") exitWith {};$/Code$ + $Code$_ok = isClass ( configFile "CfgVehicles"); + // Result is true.$/Code$ undefined / undefined - (March 12, 2008) - If the script contains a command that was introduced after the required version, it will still generate a syntax error, even if this test is done at the top of the script (as the whole script is parsed before execution). + (March 2, 2007) + This command allows you to check for the presence of an addon. + isClass (configFile "cfgVehicles" "MyCustomCar") + will return true if the addon "MyCustomCar" is installed, and false if it is not installed. + You will have to know under which class the addon is categorized (in this case "cfgVehicles") to be able to use the right config path. + + (Mar 31, 2014) + (ArmA3 ver 1.14) According to BI Dev Karel Mořický, BIS_fnc_getCfgIsClass provides a comfortable workaround with custom config under description.ext compared with isClass. (But as a function created specifically for A3 campaign, it is in no way intended as a replacement for isClass. So it is not suggested to use it for configFile classes. But isClass instead.) + E.g. + $Code$["Something1","Something2","Something3"] call bis_fnc_getCfgIsClass //Same as isClass (missionconfigfile "Something1" "Something2" "Something3")$/Code$ - Boolean + Boolean + - resetCamShake + ctrlSetActiveColor - Stops any ongoing camera shake effects. Does not prevent new effects from being created. To disallow new effects altogether, enableCamShake should be used. + Sets text color of given control when control is selected. - https://community.bistudio.com/wiki/resetCamShake + https://community.bistudio.com/wiki/ctrlSetActiveColor - resetCamShake + Control ctrlSetActiveColor Array - resetCamShake + display ctrlSetActiveColor color - $Code$resetCamShake ;$/Code$ + $Code$_control ctrlSetActiveColor [1, 0, 0, 1]$/Code$ undefined / undefined @@ -51630,339 +52976,437 @@ - Nothing + Nothing + - resetSubgroupDirection + allTurrets - Resets direction of subgroup. + Returns array of available turret paths from vehicle object. To look up turrets from config, use BIS_fnc_allTurrets - https://community.bistudio.com/wiki/resetSubgroupDirection + https://community.bistudio.com/wiki/allTurrets - resetSubgroupDirection Object + allTurrets Object + + allTurrets Array - resetSubgroupDirection unit + allTurrets vehicle + + allTurrets [vehicle, personTurrets] - $Code$resetSubgroupDirection myUnit;$/Code$ + $Code$_turretPaths = allTurrets SlammerUP; //[[0],[0,0]] + _turretPaths = allTurrets [SlammerUP, true ]; //[[0],[0,0]] - Commander turret is also FFV turret + _turretPaths = allTurrets [SlammerUP, false ]; //[[0]]$/Code$ + + $Code$// Return FFV turrets only: + _FFVTurrets = allTurrets [tank, true ] - allTurrets [tank, false ];$/Code$ undefined / undefined + (April 13, 2016) + The first syntax (vehicle only without boolean) will include commander turrets like in the example, and does not include actual FFV turrets like offroad back seats, as expected. + Also, the driver turret [-1] is never included in the results, which can be solved as follows: + $Code$_paths = [[-1]] + allTurrets _vehicle;$/Code$ - Nothing + Array - Array + - resistance + inGameUISetEventHandler - Resistance side. - When used in a format statement ( hint format ["%1",resistance] ), the string returned is "GUER". + Sets given event handler of in-game UI. If EH function returns true, performed action is overridden. Event handlers available are: + "PrevAction" - mouse scroll up + "Action" - action key press + "NextAction" - mouse scroll down + This is "set" type EH, which means it will replace previously set EH of the same type. So to remove EH, set another one with empty string "" for the function. + Since Arma 3 v1.49.131743 this EH returns array of params for selected/activated action in _this variable: + 0: Object - target object to which action is attached + 1: Object - caller object, basically player + 2: Number - index of the action in action menu (0 - top most) + 3: String - engine based action name ("User" for user added actions) + 4: String - localized action plain text as seen by the caller + 5: Number - action priority value + 6: Boolean - action showWindow value + 7: Boolean - action hideOnUse value + 8: String - action shortcut name or "" + 9: Boolean - action menu visibility (on first scroll or action press the menu is still invisible, so no action is performed, only menu is shown) + 10: String - EH event name - https://community.bistudio.com/wiki/resistance + https://community.bistudio.com/wiki/inGameUISetEventHandler - resistance + inGameUISetEventHandler Array - resistance + inGameUISetEventHandler [handlerName, function] - $Code$// SQS: - ?((side _unit) == resistance ) : hint "This is a resistance unit!"$/Code$ + $Code$inGameUISetEventHandler ["Action","hint 'Lights, Camera, Action!'; true "];$/Code$ - $Code$// SQF: - if (( side _unit) == resistance ) then { - hint "This is a resistance unit!"; - };$/Code$ + $Code$inGameUISetEventHandler ["PrevAction", " hint str _this; false "]; + inGameUISetEventHandler ["NextAction", " hint str _this; false "]; + inGameUISetEventHandler ["Action", " hint str _this; false "];$/Code$ + + $Code$// Deny any weapon disassembly: + inGameUISetEventHandler ["Action", " + if (_this select 3 == 'DisAssemble') then { + hint 'You are not allowed to do this'; + true + } + "];$/Code$ + + $Code$// Detect explosive/mine placement: + onMagazineUse = ' + params ["_target", "", "", "_action", "", "", "", "", "", "", "_event"]; + if (_action == "UseMagazine") then { + if (_event == "Action") then { + 0 = _target spawn { + waitUntil {!(all_magazines isEqualTo magazines _this)}; + { + 0 = all_magazines deleteAt (all_magazines find _x); + } count magazines _this; + hint format ["Magazine Used: %1", all_magazines select 0]; + } + } else { + all_magazines = magazines _target; + }; + }; + false + '; + inGameUISetEventHandler ["PrevAction", onMagazineUse]; + inGameUISetEventHandler ["NextAction", onMagazineUse]; + inGameUISetEventHandler ["Action", onMagazineUse];$/Code$ - undefined / undefined + undefined / local + (May 12, 2016) + In case of the "Action" event, (param 6 || param 9) also denotes if the action is performed or not. For example, if the action menu is closed or fading off, pressing Spacebar will bring it up and trigger an "Action" event; in that case, param 9 (action menu visibility) is false. But if the action menu is open, and Spacebar is pressed to perform the selected action, then param 9 will be true. If param 6 (showWindow) is true, then it means the action was performed, regardless of param 9. + + (February 08, 2017) + This powerful command can override the actions (previous/next/action), depending on true/false return. But, the command overrides itself, no matter of the returned value. That means, if two mods or scripts are using the same command parameter, say 'action', the last inGameUISetEventHandler 'action' will override the first one. Example: trigger1 : + $Code$inGameUISetEventHandler ["Action","hint 'action for mod 1';true "];// true or false doesn't matter here$/Code$ + trigger2 (delayed): + $Code$inGameUISetEventHandler ["Action","false "];// true or false doesn't matter here$/Code$ + trigger2 will run after trigger1, then, you'll never see the hint, what ever the trigger2 action code could be. What ever could be the last code, it will override all previous ones. You have to group these codes in a same event handler. But, beyond this, inGameUISetEventHandler is not stackable and implies a competition between scripts (or mods) using it. - Side + Nothing + - resize + fogForecast - Changes the size of the given array. The command does not return new array, it resizes the source array to the desired number of elements. If the new size is bigger than the current size, the new places are filled with nils. + Returns the forecast fog value. A value of 0 means no fog, 1 means maximum fog. - https://community.bistudio.com/wiki/resize + https://community.bistudio.com/wiki/fogForecast - Array resize Number + fogForecast - array resize count + fogForecast - $Code$_arrayNum = [0,1,2,3,4]; - _arrayNum resize 2; // _arrayNum is now [0,1]$/Code$ + $Code$_level = fogForecast ;$/Code$ undefined / undefined - (November 13, 2014) - Use this number to resize the array to the number of elements desired, not the desired index of the final element. - resize cannot be used to create a new array. - Nothing + Number + - resources + headgear - Returns the resources of a team member. Results are local to the PC on which command was executed. + Returns headgear of unit. - https://community.bistudio.com/wiki/resources + https://community.bistudio.com/wiki/headgear - resources Team_Member + headgear Object - resources member + headgear unit - + $Code$hint headgear player ; //H_HelmetB$/Code$ + - global / local + global / undefined - Array + String + - respawnVehicle + getMarkerSize - Sets vehicle as respawnable in MP game. The vehicle will be spawned at the locality and coordinates it was prior to destruction. If respawn type is set to base respawn (type 3) and vehicle respawn marker is provided (respawn_vehicle_XXXSIDEXXX), vehicle will spawn on the marker. - NOTE : Command has to be executed where vehicle is local + Returns the size of the given marker. A getter for setMarkerSize and an alias of markerSize. - https://community.bistudio.com/wiki/respawnVehicle + https://community.bistudio.com/wiki/getMarkerSize - Object respawnVehicle Array + getMarkerSize String - vehicle respawnVehicle [delay, count] + getMarkerSize markerName - $Code$car respawnVehicle [5, 3]; - // 'car' will respawn at the predefined marker for the side after 5 seconds. The unit will respawn 3 times.$/Code$ - - $Code$car respawnVehicle [30]; - // 'car' will respawn at the predefined marker for the side after 30 seconds. The unit will respawn an unlimited number of times.$/Code$ + $Code$"MarkerOne" setMarkerSize [100,200]; + _size = getMarkerSize "MarkerOne"; //returns [100,200]$/Code$ - local / global + global / undefined - (May 28, 2007) - For this command to work (in MP) you need the appropriate markers in the mission. - The markers are... - respawn_vehicle_west - respawn_vehicle_east - respawn_vehicle_guerilla - respawn_vehicle_civilian - Also, by default it will use respawnDelay from the description.ext as mentioned unless you specify - respawnVehicleDelay = x; - Where x is delay in seconds. - In Multiplayer the respawned vehicle remains local to the client who was the last driver of the vehicle or the client who was the leader of the last AI driver of the vehicle. - If the vehicle has yet to be driven or the AI driver is local to the Server then the respawned vehicle will be local to the Server. - Nothing + Array + - restartEditorCamera + radioChannelCreate - Restarts the mission editor camera (if it was deleted by a script,for example). - i - Some Old Editor Command + Create a custom radio channel with the given color, label, call sign and registered characters. The index returned can be used to manipulate the created channel later. There are 10 slots for custom radio channels which would correspond to channels 6-15 (see getPlayerChannel ). The command will find an unused index in this range and create it when found. Server only. - https://community.bistudio.com/wiki/restartEditorCamera + https://community.bistudio.com/wiki/radioChannelCreate - restartEditorCamera Control + radioChannelCreate Array - restartEditorCamera map + radioChannelCreate [color, label, callSign, units, sentenceType] - + $Code$_index = radioChannelCreate [[0.96, 0.34, 0.13, 0.8], "Q-dance Radio", "%UNIT_NAME", [player1, player2]];$/Code$ + + $Code$_index = radioChannelCreate [[0.96, 0.34, 0.13, 0.8], "Q-dance Radio", "%UNIT_NAME", [player1, player2], false ]; + // disable automatic quotes for chat in channel (ArmA 3)$/Code$ + + $Code$// Create custom channel and add all players to it, present and JIP: + if ( isServer ) then + { + private _channelName = "Q-dance Radio"; + private _channelID = radioChannelCreate [[0.96, 0.34, 0.13, 0.8], _channelName, "%UNIT_NAME", []]; + if (_channelID == 0) exitWith { diag_log format ["Custom channel '%1' creation failed!", _channelName]}; + [_channelID, {_this radioChannelAdd [ player ]}] remoteExec ["call", [0, -2] select isDedicated, _channelName]; + };$/Code$ + - undefined / undefined + global / global + This scripting command must be executed on the server to work properly in multiplayer + + (January 21, 2016) + Make sure you add all units you intend to speak or receive messages on created custom channel to the channel. + + (October 12, 2017) + WARNING : Be aware that created channels order and count are different between server and client. Example 3 shown that server-side channel ID is actually 4, while client currentChannel on the same channel results in 9. + Behaviour is yet unknown for me. - Nothing + Number + - revealMine + isAbleToBreathe - Sets given mine as known to the side. (Knowledge about a mine is always shared across all units in a side.) + If unit is diving and doesn't have a re-breather, it returns false. Diving means the unit's head is underwater. If unit is underwater and has a re-breather, the command returns true. - https://community.bistudio.com/wiki/revealMine + https://community.bistudio.com/wiki/isAbleToBreathe - Side revealMine Object + isAbleToBreathe Object - side revealMine mine + isAbleToBreathe unit - $Code$west revealMine _mine;$/Code$ - + undefined / undefined - Nothing + Boolean + - reveal + tvSetPictureRightColor - Reveals a target to a group. If toWhom is a unit, unit's group is considered. If toWhom is a vehicle, vehicle commander's group is considered. - The knowledge value will be set to the highest level any unit of the revealing side has about the revealed target. If the revealing side has no knowledge about the revealed target, the value will be set to 1. - Since ARMA 2 OA 1.60 the alternative syntax is available. Values greater than or equal 1.5 reveal the side of the target, too. - The knowledge level can only be increased, not decreased by this command. - In MP targetKnowledge and knowsAbout infos get updated only on the PC where command was executed. + Sets color of the right picture on the tree view item defined by path - https://community.bistudio.com/wiki/reveal + https://community.bistudio.com/wiki/tvSetPictureRightColor - Object/Group reveal Object + tvSetPictureRightColor Array - Object/Group reveal Array + Control tvSetPictureRightColor Array - toWhom reveal target + tvSetPictureRightColor [idc, path, color] - toWhom reveal [target, accuracy] + control tvSetPictureRightColor [path, color] - $Code$_soldierOne reveal _soldierTwo; //soldierOne knowsAbout information about soldierTwo is updated$/Code$ - - $Code$player reveal cursorObject ; //player knowsAbout information about object under cursor is updated$/Code$ + $Code$tvSetPictureRightColor [101, [0], [1,0,1,1]];$/Code$ - $Code$_soldierOne reveal [_soldierTwo, 1.5];$/Code$ + $Code$_ctrl tvSetPictureRightColor [[0], [1,0,1,1]];$/Code$ - global / local + undefined / undefined - (January 15, 2007) - In OFP v1.96, When a target is revealed to a unit, it's knowsAbout rating is set to 1, unless it was already more than 1 in which case reveal does nothing. See knowsAbout for more details about knowsAbout ratings and limitations. - - (January 24, 2008) - Use reveal to allow client to see a created vehicle faster - the associated menu interaction will become available therefore, like the player has option to get in sooner. - _tank = "M1A1" createVehicle (position player); - player reveal _tank; - //get in user actions become available instantly - - (January 15, 2012) - The same idea from Doolittle's note applies to beaming of units. If you setPos an unit or a player, reveal (all) nearby objects and vehicles to make the interaction possible a lot quicker. - - (January 15, 2012) - Revealing a targetUnit will also add it to nearTargets database of the given sourceUnit. The quality/detail level of the info depends on the knowsAbout value used with reveal. More detail in the nearTargets page. - - (October 21, 2014) - Units that have been previously subjected to enableSimulation false; or enableSimulationGlobal false; may stay unrecognised for a long time even after simulation was re-enabled, returning objNull as cursorTarget. Force revealing units with reveal command usually solves the problem. For example: $Code${ player reveal _x} forEach allUnits ;$/Code$ - Nothing - Nothing + Nothing - Nothing + - reverse + remoteExecCall - Reverses given array by reference (modifies the original array, just like resize ). + Asks server to execute given scripted function or script command on given target PC. The environment chosen for the execution is as follows: + Scripted function - unscheduled environment ( suspension is NOT allowed). + Script command - unscheduled environment ( suspension is NOT allowed). + remoteExecCall can also be used in SP (the same restrictions apply both to SP and MP). For more information about the usage, security features and advanced jip techniques check the remote execution dedicated section. + While it is true that this function executes the desired scripted command/function by calling it, it does not mean remoteExecCall itself will be executed right away. Therefore, calling remoteExecCall is by no means a replacement for calling scripted commands/functions directly. + Example: + remoteExecCall ["func1"]; call func2; // func2 can be executed sooner than func1 + call func1; call func2; // func2 will always execute after func1. - https://community.bistudio.com/wiki/reverse + https://community.bistudio.com/wiki/remoteExecCall - reverse Array + Anything remoteExecCall Array - reverse array + params remoteExecCall [functionName, targets, JIP] - $Code$_arr = [1,2,3]; - reverse _arr; - hint str _arr; //[3,2,1]$/Code$ + $Code$// runs hint "hello" on each connected client + "hello" remoteExecCall [" hint "];$/Code$ - $Code$_wordArr = toArray "gateman"; - reverse _wordArr; - hint toString _wordArr; //nametag$/Code$ - - + $Code$// runs hint "hello" on first connected client + "hello" remoteExecCall [" hint ", 3];$/Code$ + + $Code$// runs hint "hello" everywhere but server + "hello" remoteExecCall [" hint ", -2];$/Code$ + + $Code$// runs hint "hello" everywhere but server, JIPs the message + // and returns e.g. "3_1" as a unique JIP id + myJipID = "hello" remoteExecCall [" hint ", -2, true ];$/Code$ + + $Code$// runs hint "hello" everywhere but server, JIPs the message under ID "some_JIP_ID" + // replacing any previous message with this ID in the JIP queue. + "hello" remoteExecCall [" hint ", -2, "some_JIP_ID"];$/Code$ + + $Code$// runs "someFuncWithNoArgs" on each connected client + remoteExecCall ["someFuncWithNoArgs"];$/Code$ + + $Code$// removes a message identified by "IamUnique" from the JIP queue + remoteExecCall ["", "IamUnique"];$/Code$ + + $Code$// all clients will have their ammo set to 1 for their current weapon + { player setAmmo [ primaryWeapon player, 1];} remoteExecCall [" bis_fnc_call ", 0];$/Code$ + + $Code$// Object obj will have its ammo set to 1 where it is local + [obj,[ primaryWeapon obj, 1]] remoteExecCall [" setAmmo ", obj];$/Code$ + + $Code$myJipID = "hello" remoteExecCall ["", 0]; + if ( isNil "myJipID") then { hint "empty function name is not allowed"; };$/Code$ + + undefined / undefined + (July 16, 2015) + Removal of persistent call must be in the following format no argument remoteExecCall [ empty string, JIP id ]. For example: + $Code$ remoteExecCall ["", "5:8"];$/Code$ + + (December 29, 2015) + 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 class Functions is set to mode = 1;, 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+? \[.*\]"$/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. + + (May 10, 2017) + To remoteExecCall : + $Code$ titleText ["Test Message", "PLAIN", 1];$/Code$ + Use + $Code$[["Test Message", "PLAIN", 1]] remoteExecCall ["titleText"];$/Code$ - Nothing + Anything + - reversedMouseY + setSimulWeatherLayers - Return if mouse vertical axe is inverted. + Sets number of simul weather layers, affects quality of simul weather clouds. - https://community.bistudio.com/wiki/reversedMouseY + https://community.bistudio.com/wiki/setSimulWeatherLayers - reversedMouseY + setSimulWeatherLayers Number - reversedMouseY + setSimulWeatherLayers layers @@ -51972,151 +53416,172 @@ - Boolean + Nothing + - roadAt + setUnitAbility - Returns road segment at given position, objNull otherwise. Same as isOnRoad only returns the actual road object instead of boolean. + Sets skill of given unit. Unlike setSkill, setUnitAbility can set values 1. Even though the skill command will correctly return set value, the actual unit ability will be capped to max available. - https://community.bistudio.com/wiki/roadAt + https://community.bistudio.com/wiki/setUnitAbility - roadAt Object/Array + Object setUnitAbility Number - roadAt position + unit setUnitAbility value - $Code$_road = roadAt ASLToAGL getPosASL player ;$/Code$ + $Code$_unit setUnitAbility 1;$/Code$ - $Code$_isOnRoad = ! isNull roadAt player ;$/Code$ + $Code$bob setUnitAbility - log 0; + hint str skill bob; //1.#INF$/Code$ - global / undefined + undefined / undefined - (December 30, 2016) - This command does not nessecarly return the segment which center is the closest to the given position. - In order to get such segment use nearRoads. - $Code$_closest_road = (_pos nearRoads 0.1) select 0;$/Code$ + (October 8, 2014) + AFAIK not used in Arma 3 anymore (or equals to setSkill) - Object + Nothing + - roadsConnectedTo + enableCollisionWith - Find the road segments connected to the given road segment. + Enable collision between vehicles. - https://community.bistudio.com/wiki/roadsConnectedTo + https://community.bistudio.com/wiki/enableCollisionWith - roadsConnectedTo Object + Object enableCollisionWith Object - roadsConnectedTo roadSegment + vehicle enableCollisionWith vehicle - $Code$_road = ( player nearRoads 50) select 0; - _connectedRoads = roadsConnectedTo _road;$/Code$ - + - undefined / undefined + local / global + (April 5, 2015) + enableCollisionWith is a script that when you apply it to an object, it will be solid and the player will not be able to go through it. However, if you want your unit to go through it, you may want to use the disableCollisionWith command. An example for this is: + $Code$//name of unit in editor such as player1 + //name of object in editor such as car1 + car1 enableCollisionWith player1; + //to make your unit go through the car, use the below and make sure you know what your doing! + car1 disableCollisionWith player1; + $/Code$ + Both commands enableCollisionWith and disableCollisionWith, are very handy codes and could be used for example: map testing, mission editing and even animation cutscenes. - Array + Nothing + - roleDescription + useAudioTimeForMoves - Returns unit description set in Editor and visible on role selection screen in MP. Works in MP and SP. + Switch between elapsed game time and audio time being used as animation timer. Used for audio/animation synchronization. - https://community.bistudio.com/wiki/roleDescription + https://community.bistudio.com/wiki/useAudioTimeForMoves - roleDescription Object + Object useAudioTimeForMoves Boolean - roleDescription unit + soldier useAudioTimeForMoves toggle - $Code$_playerRole = roleDescription player ;$/Code$ + $Code$player useAudioTimeForMoves true$/Code$ undefined / undefined - (June 29, 2015) - One thing you should know about roles. When switching to units placed in editor on the fly in MP, it could mess up the role of the player. Could be bug, could be intended, but I would not recommend doing this. Create new unit dynamically if you need to switch to. Anyway, if role of the unit is messed up so is roleDescription. - - (May 26, 2017) - roleDescription works for playableUnits only. That means not on AI disabled in lobby and not in SP (even for player). - String + Nothing + - ropeAttachEnabled + commandSuppressiveFire - Returns true if vehicle can be attached to ropes + Order the given unit to suppress a given position or target (via the radio). - https://community.bistudio.com/wiki/ropeAttachEnabled + https://community.bistudio.com/wiki/commandSuppressiveFire - ropeAttachEnabled Object + Object/Array commandSuppressiveFire Object/Array - ropeAttachEnabled vehicle + unitName commandSuppressiveFire target - $Code$ropeAttachEnabled veh1;$/Code$ + $Code$_soldier commandSuppressiveFire [1869.508,5760.962,0.000]$/Code$ + + $Code$_soldier commandSuppressiveFire cursorTarget$/Code$ - undefined / undefined + local / local + (October 8, 2016) + Command expects position as second argument in format ASL in A3 1.64.138497. - Boolean + Nothing + - ropeAttachTo + waypointFormation - Attach vehicle to rope with optional offset + Gets the waypoint formation. + Possible values are: + "NO CHANGE" + "COLUMN" + "STAG COLUMN" + "WEDGE" + "ECH LEFT" + "ECH RIGHT" + "VEE" + "LINE" + "FILE" + "DIAMOND" - https://community.bistudio.com/wiki/ropeAttachTo + https://community.bistudio.com/wiki/waypointFormation - Array ropeAttachTo Object + waypointFormation Array - [veh, toPoint, ropeEndDownDir] ropeAttachTo rope + waypointFormation waypoint - $Code$[veh1,[0,0,0],[0,0,-1]] ropeAttachTo ( ropes heli1 select 0);$/Code$ + $Code$waypointFormation [groupOne,1]$/Code$ undefined / undefined @@ -52124,55 +53589,72 @@ - Nothing + String + - ropeAttachedObjects + toString - Returns list of attached objects on ropes + Converts the supplied Array of Numbers into a String. + The numbers in the array to be converted are the decimal Unicode representations of characters. - https://community.bistudio.com/wiki/ropeAttachedObjects + https://community.bistudio.com/wiki/toString - ropeAttachedObjects Object + toString Array - ropeAttachedObjects vehicle + toString array - $Code$_cargoArray = ropeAttachedObjects heli1;$/Code$ + $Code$hint toString [65,97,338]; + // returns "AaŒ"$/Code$ + + $Code$["test","test"] joinString toString [12345] splitString toString [12345]; // ["test","test"]$/Code$ undefined / undefined + (February 10, 2015) + Tabs and new lines can be created with toString [9] and toString [10], respectively. Alternatively, a new line can also be created with toString [92,110] ("\n"). If you save these strings into a variable, they can be manipulated like any other string. For example, the following code will work just fine and return the expected output: + $Code$_tab = toString [9]; + for "_i" from 0 to 3 do + { + _tab = _tab + ( toString [9]); + }; + copyToClipboard format ["x%1x",tab];$/Code$ + + (August 25, 2015) + While you can convert any String to Array with toArray command, only numbers from 1 to 55295 (not 65535 as expected) can be successfully converted to String with toString and then back to Array with toArray without loss of data. - Array + String + - ropeAttachedTo + formatText - Returns the object it is attached to by rope + Creates a structured text by replacing %1, %2, etc. in format with plain or structured texts given as arguments. - https://community.bistudio.com/wiki/ropeAttachedTo + https://community.bistudio.com/wiki/formatText - ropeAttachedTo Object + formatText Array - ropeAttachedTo vehicle + formatText [format, arg1, arg2,] - $Code$_heli = ropeAttachedTo veh1;$/Code$ + $Code$_text = formatText ["Image: %1", image "data\isniper.paa"];$/Code$ undefined / undefined @@ -52180,72 +53662,61 @@ - Object + Structured_Text + - ropeCreate + teamName - Create a rope (PhysX rope in Arma 3). + Return a name of given team. - https://community.bistudio.com/wiki/ropeCreate + https://community.bistudio.com/wiki/teamName - ropeCreate Array + teamName Team_Member - ropeCreate [fromObject, fromPoint, toObject, toPoint, segments, length] - - ropeCreate [fromObject, fromPoint, length, segments, unroll] + teamName team - $Code$myRope = ropeCreate [ vehicle player, "slingload0", myCargo, [0, 0, 0], 10]; //A3 example$/Code$ - - $Code$myRope = ropeCreate [ vehicle player, "fastrope0", 10, 10, true ]; //TakeOn example$/Code$ - - $Code$myRope = ropeCreate [veh1, [0,0,-2], veh2, [0,0,0], 10] //A3 1.34$/Code$ + $Code$_name = teamName _team;$/Code$ undefined / undefined - (November 8, 2014) - Doesn't work well for towing vehicles on the ground. - Their wheels don't turn freely and have a LOT of friction. You'll most likely end up flipping the vehicle over if you try to tow it. - Also note that ropes can be destroyed/cut by shooting at them. - - (January 4, 2015) - Pay special attention to what is your fromObject and what is your toObject as this will have an impact on the physics of the rope. - For example: If you want to tow an Assault CRRC from a heavier Speedboat Minigun, attach two boats together with a rope. If you drive the Speedboat Minigun and set the CRRC as the fromObject, the rope will have almost no elasticity and the CRRC will yank around as you tow it. However, if you set the CRRC as the toObject, the rope will have more elasticity and will be a little friendlier for the CRRC when you are towing it. - - (July 9, 2015) - Parameters segments and unroll are not supported in Arma 3. Segments are set automatically according the length of a rope. - Object + String + - ropeCut + setWaypointScript - Cut rope and detach rope from vehicle + Attaches a script to a scripted waypoint. In early versions of Arma, command consisted of a script name and additional script arguments and the script had to use SQS -Syntax. The script receives the following arguments in _this variable: [group, position, target] + [the optional passed arguments]. The optional arguments are appended to the end of the return array. + In Arma 3, command argument can be a String with code, a reference to.sqf script (it will have to explicitly end with.sqf ) or a reference to.sqs script. + See Mission editor Description for more information about scripted waypoints. - https://community.bistudio.com/wiki/ropeCut + https://community.bistudio.com/wiki/setWaypointScript - ropeCut Array + Array setWaypointScript String - ropeCut [rope, distance] + waypoint setWaypointScript command - $Code$ropeCut [ ropes heli1 select 0, 5];$/Code$ + $Code$[_grp, 2] setWaypointScript "find.sqs player ";$/Code$ + + $Code$[_grp, 2] setWaypointScript "somescript.sqf [1,2,3,4,5,6,7,8]";$/Code$ undefined / undefined @@ -52253,55 +53724,64 @@ - Nothing + Nothing + - ropeDestroy + leader - Destroy a rope. + Returns the group leader for the given unit or group. For dead units, objNull is returned. - https://community.bistudio.com/wiki/ropeDestroy + https://community.bistudio.com/wiki/leader - ropeDestroy Object + leader Object/Group - ropeDestroy rope + leader unitName - $Code$ropeDestroy myRope;$/Code$ + $Code$leader group player == leader player$/Code$ + + $Code$_GroupLeader = leader ( group ( vehicle player ))$/Code$ + + $Code$_UnitLeader = leader player$/Code$ - undefined / undefined + global / undefined - Nothing + Object + - ropeDetach + setConvoySeparation - Detach a rope from an object. + Sets the distance to keep to the vehicle which is in front. + This command has to be applied to all vehicles in a convoy in order to have a separation of, for example, 50 m. + Vehicles in a convoy can also have different distances. + It's recommended that small values ( 10m) should only be used for slowly moving convoys, otherwise AI driven vehicles will leave the road frequently to avoid collisions - https://community.bistudio.com/wiki/ropeDetach + https://community.bistudio.com/wiki/setConvoySeparation - Object ropeDetach Object + Object setConvoySeparation Number - vehicle ropeDetach rope + vehicle setConvoySeparation distance - $Code$vehicle player ropeDetach myRope;$/Code$ + $Code$vehicle setConvoySeparation 20;$/Code$ undefined / undefined @@ -52309,218 +53789,322 @@ - Nothing + Nothing + - ropeEndPosition + getCenterOfMass - Return rope end positions in Position3D format + Returns center of mass of an object. - https://community.bistudio.com/wiki/ropeEndPosition + https://community.bistudio.com/wiki/getCenterOfMass - ropeEndPosition Object + getCenterOfMass Object - ropeEndPosition rope + getCenterOfMass object - $Code$_ends = ropeEndPosition ( ropes heli1 select 0); - _end1 = _ends select 0; - _end2 = _ends select 1;$/Code$ + $Code$_com = getCenterOfMass _myCar;$/Code$ - undefined / undefined + global / undefined - Array + Array + - ropeLength + handsHit - Return rope length in meters (set by ropeCreate, ropeCut, ropeUnwind ) + Checks if a soldier's hands are hit, which results in inaccurate aiming. - https://community.bistudio.com/wiki/ropeLength + https://community.bistudio.com/wiki/handsHit - ropeLength Object + handsHit Object - ropeLength rope + handsHit unitName - $Code$_length = ropeLength ( ropes heli1 select 0);$/Code$ + $Code$? (handsHit player == 1) : player globalChat "Ouch! Don't shoot at my hands dammit!"$/Code$ - undefined / undefined + global / undefined - (March 19, 2016) - When a rope gets stretched ropeLength will still return the same length as before. - Number + Number + - ropeUnwind + deleteVehicleCrew - Unwind rope to target length. Use relative parameter for changing rope length +/- from current length + Deletes a member of the crew of a vehicle. Human players cannot be deleted. - https://community.bistudio.com/wiki/ropeUnwind + https://community.bistudio.com/wiki/deleteVehicleCrew - ropeUnwind Array + Object deleteVehicleCrew Object - ropeUnwind [rope, speed, targetLength, relative] + vehicle deleteVehicleCrew unit - $Code$ropeUnwind [ ropes heli1 select 0, 3, 10];//set rope length to 10m at 3m/s$/Code$ - - $Code$ropeUnwind [ ropes heli1 select 0, 3, -5, true];//decrease rope length by 5m at 3m/s$/Code$ + $Code$heli deleteVehicleCrew driver heli;$/Code$ - undefined / undefined + global / global - (November 8, 2014) - Unwinding speed is not linear but instead automatically accelerates at the beginning and slows down at the end. - The speed also only seems to have no effect when pulling the rope in. (unless the end of the rope is not attached to anything) - High unwinding speeds (over ~250) can cause your cargo to get stuck in midair. + (August 31, 2014) + Not quite sure of the exact use of this command. You can delete AI pilot for example with $Code$ deleteVehicle driver heli;$/Code$ but co-pilot will then jump out. If you use $Code$heli deleteVehicleCrew driver heli;$/Code$ co-pilot stays. - (January 4, 2015) - Rope length limits are between 0.5 and 100 meters. + (April 10, 2015) + Using the following code will remove ALL crew from the given vehicle. + $Code${_myvehicle deleteVehicleCrew _x} forEach crew _myvehicle;$/Code$ - Nothing + Nothing + - ropeUnwound + loadUniform - False if unwinding in progress, otherwise true + Returns current sum of mass from items stored in a uniform. - https://community.bistudio.com/wiki/ropeUnwound + https://community.bistudio.com/wiki/loadUniform - ropeUnwound Object + loadUniform Object - ropeUnwound rope + loadUniform unit - $Code$_isUnwound = ropeUnwound ( ropes heli1 select 0);$/Code$ - + undefined / undefined - Boolean + Number + - ropes + scriptDone - Returns a vehicle's rope objects in an Array. + Check if a script is finished running using the Script_(Handle) returned by execVM or spawn. - https://community.bistudio.com/wiki/ropes + https://community.bistudio.com/wiki/scriptDone - ropes Object + scriptDone Script_Handle - ropes vehicle + scriptDone handle - $Code$hint str ( ropes vehicle player );$/Code$ + $Code$// SQS Syntax: + @ scriptDone _Handle$/Code$ - $Code$_rope1 = ( ropes heli1) select 0;$/Code$ + $Code$// SQF Syntax: + script_handler = [parameters] execVM "scriptname.sqf"; + waitUntil { scriptDone script_handler };$/Code$ undefined / undefined - (05 April, 2014) - The ropes command seems to return each individual sling load rope. ropes will return an empty Array if the sling load ropes are not deployed. Ropes as of A3 1.33 have a cfgVehicles classname of "Rope". + (03:54, 11 September 2009) + A Null Script handle can be created in this manner: + $Code$_handle = 0 spawn {};$/Code$ + That is what any Script_(Handle) becomes when a script is finished running, meaning it will test as true with: + $Code$ scriptDone _handle $/Code$ and it returns " NULL-script " when converted to string. This in turn lets you initialize the variable with a completed Script_(Handle) and lets you test the variable even though nothing else may have set the handle by creating a script with spawn or execVM. It also lets you store and manage script handles in arrays, and a few other sexy things. - Array + Boolean + - rotorsForcesRTD + weaponsItems - Returns force produced by rotors. + Returns an array with subarrays contains class names and also names of connected items of all the vehicle's weapons. + Since Arma 3 v1.21.124406 it is possible to query weapon holders and ammo crates with this command. If weapon has no magazine, an empty array [] is returned instead of magazine info. - https://community.bistudio.com/wiki/rotorsForcesRTD + https://community.bistudio.com/wiki/weaponsItems - rotorsForcesRTD Object + weaponsItems Object - rotorsForcesRTD RTD_helicopter + weaponsItems vehicle - $Code$_rotorForces = rotorsForcesRTD _taru// Returns [[-465.981,351.941,45960.5],[-469.079,397.451,46933.3]]$/Code$ + $Code$hint str weaponsItems player ;[ + [//=PRIMARY= + "arifle_MX_ACO_pointer_F",//weapon + "muzzle_snds_H",//suppressor + "acc_pointer_IR",//laser + "optic_Aco",//optics + [//loaded magazine + "30Rnd_65x39_caseless_mag",//mag type + 30//mag ammo count + ], + "bipod_01_F_blk"//bipod + ], + [//=SECONDARY= + "launch_NLAW_F", + "", + "", + "", + [ + "NLAW_F", + 1 + ], + "" + ], + [//=HANDGUN= + "hgun_P07_F", + "muzzle_snds_L", + "", + "", + [ + "16Rnd_9x21_Mag", + 11 + ], + "" + ] + ]$/Code$ + + $Code$hint str weaponsItems vehicle player ;[ + [ + "gatling_30mm", + "", + "", + "", + [ + "250Rnd_30mm_HE_shells", + 250 + ], + "" + ], + [ + "missiles_SCALPEL", + "", + "", + "", + [ + "8Rnd_LG_scalpel", + 8 + ], + "" + ], + [ + "rockets_Skyfire", + "", + "", + "", + [ + "38Rnd_80mm_rockets", + 38 + ], + "" + ] + ]$/Code$ undefined / undefined - (November 4, 2014) - There is no official information I can find on what these values mean. According to my testing on the Mi-290 Taru, here is what I have come up with: - $Code$[[ rotor 1 roll +right/-left, rotor 1 pitch +down/-up, rotor 1 collective +up/-down ], - [ rotor 2 roll +right/-left, rotor 2 pitch +down/-up, rotor 2 collective +up/-down ]]$/Code$ - When yawing left and right, rotor 1 and 2 collective differ from each other. This is normal behaviour with coaxial rotors. Yawing right increase rotor 1 collective and decreases rotor 2 collective. Yawing left does the opposite. Rotor 1 in this example seems to be the bottom rotor. + (August 17, 2013) + Be careful with this function. The weapons are listed in the order they were taken by the unit, with the most recent at the bottom of the array. Therefore, do not assume the first one is always the primary weapon, and so on. + Also, here's how the primary weapon looks if it has a grenade launcher with a loaded grenade: + $Code$[ + "arifle_MX_GL_F", + "muzzle_snds_H", + "acc_pointer_IR", + "optic_Aco", + [ + "30Rnd_65x39_caseless_mag", + 30 + ], + [ + "1Rnd_HE_Grenade_shell", + 1 + ], + "" + ]$/Code$ + + (October 25, 2014) + The output of this command is an array of arrays and is as follows: (If the unit only has 1 weapon, output is an array within an array.) + $Code$[ + [ + ((_arr select 0) select 0) //STRING - The weapon's classname + ((_arr select 0) select 1) //STRING - Classname of the unit's equipped 'Muzzle/Barrel Accessory' + ((_arr select 0) select 2) //STRING - Classname of the unit's equipped 'Side Accessory' + ((_arr select 0) select 3) //STRING - Classname of the unit's equipped 'Top/Optic Accessory' + ((_arr select 0) select 4) //ARRAY - Magazine information + [ + (((_arr select 0) select 4) select 0) //STRING - Classname of the loaded magazine + (((_arr select 0) select 4) select 1) //SCALAR(Number) - Amount of bullets in the mag + ] + ] //If unit has more than one weapon, the output will follow the same pattern as above except with a new element + ]$/Code$ - Array + Array + - rotorsRpmRTD + titleObj - Returns rotors RPM + Shows object defined in global config in CfgTitles - https://community.bistudio.com/wiki/rotorsRpmRTD + https://community.bistudio.com/wiki/titleObj - rotorsRpmRTD Object + titleObj Array - rotorsRpmRTD RTD_helicopter + titleObj [class, type, speed, showInMap] - $Code$_mh9_main = ( rotorsRpmRTD _MH9) select 0;//main rotor - _mh9_tail = ( rotorsRpmRTD _MH9) select 1;//tail rotor$/Code$ + $Code$titleObj ["BISLogo", "PLAIN"]$/Code$ undefined / undefined @@ -52528,29 +54112,28 @@ - Array + Nothing + - round + magazinesDetailUniform - Rounds up or down to the closest integer. + Returns an array with the type names of all the unit's uniform magazines. - https://community.bistudio.com/wiki/round + https://community.bistudio.com/wiki/magazinesDetailUniform - round Number + magazinesDetailUniform Object - round x + magazinesDetailUniform unit - $Code$_val= round 5.25, result is 5$/Code$ - - $Code$_val= round 5.55, result is 6$/Code$ + $Code$magazinesDetailUniform player$/Code$ undefined / undefined @@ -52558,170 +54141,178 @@ - Number + Array + - runInitScript + ctrlSetFontH2B - Launch init.sqs or init.sqf scripts. + Sets H2 bold font of given HTML control. - https://community.bistudio.com/wiki/runInitScript + https://community.bistudio.com/wiki/ctrlSetFontH2B - runInitScript + Control ctrlSetFontH2B String - runInitScript + controlName ctrlSetFontH2B fontName - + $Code$_control ctrlSetFontH2B "TahomaB"$/Code$ + undefined / undefined - Nothing + Nothing + - safeZoneH + setPlayerRespawnTime - Returns the height of the screen in screen measurement units. Taken from top left corner of the default viewport (0,0) of the screen and going in the same direction as the Y axis, the value will be positive but resulting Y will end up beyond the bottom border. Therefore in order to calculate Y of the bottom screen border, the length of safeZoneY must be subtracted from safeZoneH, but because it is negative, it must be added instead. _screenBottomBorderY = safeZoneH + safeZoneY. The measurement units depend on the current screen resolution getResolution. See also SafeZone + Sets the time interval to wait on player respawn. It resets to mission default on mission start. In Single Player or when respawn type is GROUP or SIDE in Multiplayer, setting player respawn time has no effect and is always -1. - https://community.bistudio.com/wiki/safeZoneH + https://community.bistudio.com/wiki/setPlayerRespawnTime - safeZoneH + setPlayerRespawnTime Number - SafeZoneH + setPlayerRespawnTime interval - $Code$_screenHeight = safeZoneH ;$/Code$ - - $Code$_screenBottomBorderY = safeZoneH + safeZoneY ;$/Code$ + $Code$setPlayerRespawnTime 5;$/Code$ - undefined / undefined + undefined / local - Number + Nothing + - safeZoneWAbs + accTime - Returns SafeZone width (of all monitors, in case there's more than one) + Returns the current time acceleration factor - https://community.bistudio.com/wiki/safeZoneWAbs + https://community.bistudio.com/wiki/accTime - safeZoneWAbs + accTime - safeZoneWAbs + accTime - $Code$_szW = safeZoneWAbs;$/Code$ + $Code$_acc = accTime$/Code$ undefined / undefined + (August 2, 2006) + Use setAccTime to change the time acceleration factor. Not to be confused with skipTime. - Number + Number + - safeZoneW + catch - Returns the width of the screen in screen measurement units. Taken from top left corner of the default viewport (0,0) of the screen and going in the same direction as the X axis, the value will be positive but resulting X will end up beyond the right border. Therefore in order to calculate X of the right screen border, the length of safeZoneX must be subtracted from safeZoneW, but because it is negative, it must be added instead. _screenRightBorderX = safeZoneW + safeZoneX. The measurement units depend on the current screen resolution getResolution. See also SafeZone + Processes code when an exception is thrown in a try block. The exception caught can be found in the _exception variable. - https://community.bistudio.com/wiki/safeZoneW + https://community.bistudio.com/wiki/catch - safeZoneW + Exception catch Code - safeZoneW + try-block catch code - $Code$_screenWidth = safeZoneW ;$/Code$ - - $Code$_screenRightBorderX = safeZoneW + safeZoneX ;$/Code$ - + undefined / undefined - Number + Anything + - safeZoneXAbs + hcSelectGroup - Returns SafeZone left border (of all monitors, in case there's more than one) + Select given group in high command bar. - https://community.bistudio.com/wiki/safeZoneXAbs + https://community.bistudio.com/wiki/hcSelectGroup - safeZoneXAbs + Object hcSelectGroup Array - safeZoneXAbs + unit hcSelectGroup array - $Code$_szX = safeZoneXAbs;$/Code$ - + undefined / undefined - Number + Nothing + - safeZoneX + case - Returns the X of the left border of the screen, which is also a distance in screen measurement units from top left corner of the default viewport (0,0) of the screen to the left border of the screen. Since it is going in opposite way of the X axis, the value is negative. The measurement units depend on the current screen resolution getResolution. See also SafeZone + This command is used inside a switch do construct. Although the syntax below states that this operator takes only one argument, that is most likely not true. It seems like it needs two arguments of which the left one is some sort of hidden variable that gets defined inside a switch do construct. That is the reason why this operator can not be used outside a switch do construct. (see https://foxhound.international/arma-3-sqf-grammar.html for further explaination) + Also note that it is not possible to store the returned Switch Type in a variable and use that variable in another switch do construct. It will never lead to an execution of the corresponding code block. - https://community.bistudio.com/wiki/safeZoneX + https://community.bistudio.com/wiki/case - safeZoneX + case Anything - SafeZoneX + case b - $Code$_screenLeftBorderX = safeZoneX ; // returns a float value 0$/Code$ + $Code$switch (_condition) do { + case 1: { hint "1" }; + case 2: { hint "2" }; + default { hint "default" }; + };$/Code$ undefined / undefined @@ -52729,27 +54320,28 @@ - Number + Switch_Type + - safeZoneY + targetsAggregate - Returns the Y of the top border of the screen, which is also a distance in screen measurement units from top left corner of the default viewport (0,0) of the screen to the top border of the screen. Since it is going in opposite way of the Y axis, the value is negative. The measurement units depend on the current screen resolution getResolution. See also SafeZone + Aggregate candidates. - https://community.bistudio.com/wiki/safeZoneY + https://community.bistudio.com/wiki/targetsAggregate - safeZoneY + Array targetsAggregate Array - SafeZoneY + [speaker, side, unit, place, time] targetsAggregate candidates - $Code$_screenTopBorderY = safeZoneY ; // returns a float value 0$/Code$ + $Code$_aggregation = [_this,"","","",""] targetsAggregate _selected;//ca\characters\scripts\reactCore_Full.fsm$/Code$ undefined / undefined @@ -52757,142 +54349,180 @@ - Number + Array + - save3DENInventory + tvSetPicture - Saves current state of entitie's inventory to SQM. + Sets picture to item selected by path. IDC means id of parent Tree View. Name is picture name. The picture is searched in the mission directory. - https://community.bistudio.com/wiki/save3DENInventory + https://community.bistudio.com/wiki/tvSetPicture - save3DENInventory Array + tvSetPicture Array + + Control tvSetPicture Array - save3DENInventory entities + tvSetPicture [idc, path, name] + + control tvSetPicture [path, name] - $Code$save3DENInventory [_soldier1,_solider2]$/Code$ + $Code$tvSetPicture [101, [0], "picture"];$/Code$ + + $Code$_ctrl tvSetPicture [[0,0,0], getText ( configFile "CfgWeapons" "optic_NVS" "picture")];$/Code$ undefined / undefined + (Sep 11 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Nothing + Nothing - Nothing + - saveGame + clearMagazineCargo - Autosave game (used for Retry). + Remove all magazines from the given vehicle's magazine cargo space. - https://community.bistudio.com/wiki/saveGame + https://community.bistudio.com/wiki/clearMagazineCargo - saveGame + clearMagazineCargo Object - saveGame + clearMagazineCargo vehicleName - $Code$saveGame ;$/Code$ + $Code$clearMagazineCargo _truck;$/Code$ - undefined / undefined + global / local + (11:02, 24 October 2009 (CEST)) + Effect is local, run on each client for global effect. - Nothing + Nothing + - saveIdentity + restartEditorCamera - Saves person's identity to Objects.sav file in campaign directory as entry name. + Restarts the mission editor camera (if it was deleted by a script,for example). + i + Some Old Editor Command - https://community.bistudio.com/wiki/saveIdentity + https://community.bistudio.com/wiki/restartEditorCamera - Object saveIdentity String + restartEditorCamera Control - unitName saveIdentity name + restartEditorCamera map - $Code$player saveIdentity "playerid"$/Code$ - + undefined / undefined - (August 12, 2006) - Can be also used in singleplayer missions to save player status before cutscenes and load it to player's double. - Boolean + Nothing + - saveJoysticks + formationDirection - Saves joysticks key mappings into the joysticks.cfg file. Engine add these joysticks to the Joystick Scheme mapping dialog in options controls section. + Return the direction in degrees of the 'unit' watching in formation. - https://community.bistudio.com/wiki/saveJoysticks + https://community.bistudio.com/wiki/formationDirection - saveJoysticks + formationDirection Object - saveJoysticks + formationDirection unitName - + $Code$_degrees = FormationDirection _unit$/Code$ + - undefined / undefined + local / undefined - Nothing + Number + - saveOverlay + binocular - Save the current overlay. - i - Some Old Editor Command + Returns class name of currently used binocular weapon. - https://community.bistudio.com/wiki/saveOverlay + https://community.bistudio.com/wiki/binocular - saveOverlay Control + binocular Object - saveOverlay map + binocular unit - $Code$saveOverlay _map$/Code$ + $Code$_binocs = binocular player ; //Rangefinder$/Code$ undefined / undefined @@ -52900,119 +54530,165 @@ - Nothing + String + - saveProfileNamespace + weightRTD - Saves the variables stored in profileNamespace to the persistent active user profile. - Warning : this is a file operation, which makes it expensive! It is not recommended to do this at a high frequency in a loop for example. It is however also recommended not to change a large amount of variables and wait long before saving, because certain game crashes may cause a loss of data. - Warning : saving a lot of data can quickly increase the size of the profile variables file, so keep an eye on this. - Warning : TKOH's Heliport status (used in the Career mode for example) is stored in this file, so be mindful of working with this technology to avoid losing data and progress. + Returns weight of RTD helicopter. - https://community.bistudio.com/wiki/saveProfileNamespace + https://community.bistudio.com/wiki/weightRTD - saveProfileNamespace + weightRTD Object - saveProfileNamespace + weightRTD helicopter - $Code$saveProfileNamespace;$/Code$ + $Code$_taruWeight = weightRTD taru// Returns [7000,300,1990.56,0,0]$/Code$ undefined / undefined - Variables are also saved when the game is quit. - Nothing + Array + - saveStatus + buttonSetAction - Saves object's properties to Objects.sav file in campaign directory as entry name. + Set the action of a control of the currently active user dialog. Can be used for buttons and active texts. See Dialog Control for more information about user dialogs. Works with: + CT_BUTTON + CT_XBUTTON + CT_ACTIVETEXT + CT_SHORTCUTBUTTON + The action code is expected to be in SQS format - https://community.bistudio.com/wiki/saveStatus + https://community.bistudio.com/wiki/buttonSetAction - Object saveStatus String + buttonSetAction Array + + Control buttonSetAction String - object saveStatus name + buttonSetAction [idc, action] + + control buttonSetAction action - $Code$player saveStatus "playerstate"$/Code$ + $Code$buttonSetAction [100, " player exec ""reply.sqs"""];$/Code$ + + $Code$_ctrl buttonSetAction " if ( alive bob) then { hint 'alive'} else { hint 'dead'}"; // SQF but SQS compatible, see SQS$/Code$ - undefined / undefined + local / local + (October 5, 2009) + When using buttonSetAction for an ActiveText control from a script, you cannot use any variables local to the script in it. + /* This will print 'any bar' in the hint box, + since _foo has no value according to buttonSetAction */ + _foo = "foo"; + buttonSetAction [100, "hint format[""%1 bar"", _foo];"]; + + (February 15, 2016) + This command does not overwride the buttonaction which was set via "action" in the hpp of the dialog + + (June 11, 2016) + To use variables local to the defining script, a syntax like the one below needs to be used: + $Code$_foo = "foo"; + buttonSetAction [100, format["hint '%1 bar'", _foo]]; + $/Code$ + works! thanks to Kronzky for commenting this workaround in the VBS wiki - Boolean + Nothing - Nothing + - saveVar + setUserMFDvalue - Save variable value into the campaign space. This variable is available to all following missions in the campaign. + When MFD is using user controllers, this command can set values on them. For example, MFD config for Blackfoot has an entry + ... + class Draw + { + alpha = "user3" ; + color [] = { "user0", "user1", "user2" }; + ... + which could control color of the MFD. See Example 2-3-4 on how to set different colors of the Blackfoot MFD - https://community.bistudio.com/wiki/saveVar + https://community.bistudio.com/wiki/setUserMFDvalue - saveVar String + Object setUserMFDvalue Array - saveVar varname + vehicle setUserMFDvalue [index, value] - $Code$saveVar "varOne"$/Code$ + $Code$BIS_Plane setUserMFDvalue [0,1]; // user0 in MFD will return 1$/Code$ + + $Code$// Set MFD Red: + Blackfoot setUserMFDvalue [0, 1]; // "user0" - 1 + Blackfoot setUserMFDvalue [1, 0]; // "user1" - 0 + Blackfoot setUserMFDvalue [2, 0]; // "user2" - 0 + Blackfoot setUserMFDvalue [3, 1]; // "user3" - 1$/Code$ + + $Code$// Set MFD pale Blue: + Blackfoot setUserMFDvalue [0, 0]; // "user0" - 0 + Blackfoot setUserMFDvalue [1, 0]; // "user1" - 0 + Blackfoot setUserMFDvalue [2, 1]; // "user2" - 1 + Blackfoot setUserMFDvalue [3, 0.1]; // "user3" - 0.1$/Code$ + + $Code$// Hide MFD: + Blackfoot setUserMFDvalue [3, 0]; // "user3" - 0$/Code$ undefined / undefined - (January 28, 2009) - If you try to saveVar a vehicle saved in your variable (SavedVars = [Car1]; saveVar "SavedVars"), then Car1 will not be properly "saved", refering to ObjNull if you try to use it in subsequent missions, even if a vehicle with the same vehicle varname exists. To get around this, save the vehicle's varname as a string (SavedVars = [str(Car1)]) and then when you need it just use call compile to "unstring" the varname (_car = call compile (SavedVars select 0);). - Nothing + Nothing + - savingEnabled + activateKey - Check if saving the game is enabled. + Activates the given keyname for the current user profile. The keys are used to unlock missions or campaigns. + See keys, keysLimit and doneKeys in the description.ext file of the missions. - https://community.bistudio.com/wiki/savingEnabled + https://community.bistudio.com/wiki/activateKey - savingEnabled + activateKey String - savingEnabled + activateKey keyname - $Code$if ( savingEnabled ) then { - hint "Saving is enabled!"; - };$/Code$ + $Code$activateKey "Mission04Key";$/Code$ undefined / undefined @@ -53020,180 +54696,117 @@ - Boolean + Nothing + - say2D + unregisterTask - Plays given sound in 2D + Unregister a task type. - https://community.bistudio.com/wiki/say2D + https://community.bistudio.com/wiki/unregisterTask - Object say2D String - - Object say2D Array - - Array say2D String - - Array say2D Array + Team_Member unregisterTask String - from say2D sound - - from say2D [sound, maxTitlesDistance, speed] - - [from, to] say2D sound - - [from, to] say2D [sound, maxTitlesDistance, speed] + teamMember unregisterTask name - + $Code$player unregisterTask taskName;$/Code$ + - global / local + undefined / undefined - Nothing - Nothing - Nothing - Nothing + Boolean + - say3D + isDamageAllowed - Unit or object will say given sound in 3D Space. This allows broadcasting of positional music or sound from a source, without having to script a fade sound or music command. Compare this with say2D which will always play a sound at the location of the player after he has been in the vicinity of a broadcasting sound. Sound is defined in "CfgSounds" of the Description.ext or main config. - NOTE : You can stop say3D sound currently playing in 2 ways: delete the source of the sound (from) with deleteVehicle or kill the source with setDamage for example. + A getter for allowDamage command. The command indicates if damage is allowed at current locality, hence local effect of the command. A complete solution for being able to tell whether or not an object can be damaged at current locality looks like this: + $Code$_canBeDamaged = local _obj && isDamageAllowed _obj;$/Code$ - https://community.bistudio.com/wiki/say3D + https://community.bistudio.com/wiki/isDamageAllowed - Object say3D String - - Object say3D Array - - Array say3D String - - Array say3D Array + isDamageAllowed Object - from say3D sound - - from say3D [sound, maxDistance, pitch] - - [from, to] say3D sound - - [from, to] say3D [sound, maxDistance, pitch] + isDamageAllowed object - $Code$helicopter1 say3D "Fortunateson"$/Code$ + $Code$_isGod = ! isDamageAllowed player ;$/Code$ global / local - (7 March 2013) - The only difference with this command and say is during cutscenes (when some camera effect is active). In cutscenes, say3D is 3D, say is not. - - (July 19, 2015) - In Arma 2 1.63, the object this command is assigned to must be alive for the sound to broadcast. If the object is killed while the sound is still playing, the sound will stop immediately. - Here is a link to the forum to get around this issue: [1] - I have not tested this in Arma 3 yet. - - (October 13, 2016) - This command is local. - - (March 11, 2017) - This command creates sound object "#soundonvehicle" which can be detected with allMissionObjects : - $Code$ onEachFrame { hintSilent str allMissionObjects "#soundonvehicle"}; - [] spawn { sleep 1; player say3D "Alarm"};$/Code$ - Nothing - Nothing - Nothing - Nothing + Boolean + - say + canUnloadInCombat - Unit will say given sound. - When the Unit is a Person, it will also perform corresponding lipsync effect provided an appropriate.lip file has been created for this sound. - A unit that has been killed or does not exist will not say anything. - Compare this with playSound which will always play a sound at the location of the player. - If the camera is not within given range, title is not shown and the sound will not be heard. - Sound is defined in CfgSound of the Description.ext. - NOTE: say will mimic either say2D or say3D depending on whether it is there executed in a cut scene or in a game scene. + Check if cargo of this vehicle want to get out when in combat. - https://community.bistudio.com/wiki/say + https://community.bistudio.com/wiki/canUnloadInCombat - Object say String - - Object say Array - - Array say String - - Array say Array + canUnloadInCombat Object - from say sound - - from say [sound, maxTitlesDistance, speed] - - [from, to] say sound - - [from, to] say [sound, maxTitlesDistance, speed] + canUnloadInCombat vehicle - $Code$( units player select 1) say ["whisper1",5];$/Code$ - - $Code$// Arma 3: - player say "scuba_breath";$/Code$ + $Code$if (canUnloadInCombat _vehicle) then {...};$/Code$ - global / local + undefined / undefined - (7 March 2013) - Say will occur in 3D when the player is active, during cutscenes it will not. Use say3D for cutscenes. - Nothing - Nothing - Nothing - Nothing + Boolean + - scopeName + ctrlAutoScrollRewind - Defines name of current scope. Name is visible in debugger, and name is also used as reference in some commands like breakOut and breakTo. Scope name should be defined only once per scope. Trying to set a different name on the scope that has already defined scope name will result in error. + Returns true if auto-scroll should move back to start after it reaches the end. + Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. - https://community.bistudio.com/wiki/scopeName + https://community.bistudio.com/wiki/ctrlAutoScrollRewind - scopeName String + ctrlAutoScrollRewind Control - scopeName name + ctrlAutoScrollRewind control - $Code$scopeName "main"; - while {true} do { - scopeName "loop1"; - while {true} do { - scopeName "loop2"; - ... - }; - };$/Code$ + $Code$_ctrlRewind = ctrlAutoScrollRewind _ctrlGroup;$/Code$ undefined / undefined @@ -53201,252 +54814,318 @@ - Nothing + Boolean + - scoreSide + getObjectMaterials - Returns score for the given side. MP Only. + Gets all custom materials associated with the object. - https://community.bistudio.com/wiki/scoreSide + https://community.bistudio.com/wiki/getObjectMaterials - scoreSide Side + getObjectMaterials Object - scoreSide side + getObjectMaterials obj - $Code$_number = scoreSide west ;$/Code$ + $Code$_materials = getObjectMaterials car;$/Code$ - undefined / undefined + global / undefined - Number + Array + - score + playerRespawnTime - Returns the person's score in MP. + Return the player remaining time to respawn or -1 if it is not available. - https://community.bistudio.com/wiki/score + https://community.bistudio.com/wiki/playerRespawnTime - score Object + playerRespawnTime - score unit + playerRespawnTime - $Code$_pScore = score player ;$/Code$ + $Code$waitUntil { playerRespawnTime = 0};$/Code$ undefined / undefined + (June 21, 2007) + When playerRespawnTime reaches zero the player respawns as expected. When the player has completed respawning this command returns -1. + + (February 25, 2009) + Also note that spawning doesn't create a body to use, but allows a player to choose an already + existing one as defined either in the mission editor or in a script as player or playable. - Number + Number + - screenToWorld + vectorUp - Returns the position on landscape ( PositionAGL ) corresponding to the given point on screen (in UI coordinates). + Return object's up vector in world Position coordinates ( [x, y, z] ). - https://community.bistudio.com/wiki/screenToWorld + https://community.bistudio.com/wiki/vectorUp - screenToWorld Array + vectorUp Object - screenToWorld screen + vectorUp objectName - $Code$_wPos = screenToWorld [0.5,0.5];$/Code$ + $Code$objVector = vectorUp myObject;$/Code$ - undefined / undefined + global / undefined + (28 Jun, 2014) + (ArmA3 1.22) Returns the pitch and bank of an object in degrees, use BIS_fnc_getPitchBank instead. - Array + Array + - screenshot + ctrlSetFontH1B - Captures a screenshot and stores it to given filename. PNG is the only available format and the file must have.png extension. - The file is saved into Screenshots folder in the Profile directory. The folder is by default limited to 250 MB to prevent abuse. - To increase the limit, add the following line at the end of the profile file: - $Code$maxScreenShotFolderSizeMB = 2000;$/Code$ - 2000 can be replaced by any value in MB. + Sets H1 bold font of given HTML control. - https://community.bistudio.com/wiki/screenshot + https://community.bistudio.com/wiki/ctrlSetFontH1B - screenshot String + Control ctrlSetFontH1B String - screenshot filename + controlName ctrlSetFontH1B fontName - $Code$screenshot "";$/Code$ - - $Code$screenshot "testFile.png";$/Code$ - - $Code$// The following code will result in the screenshot being placed in \Documents\Arma 3\Screenshots\any\where\you\want.png - screenshot "any\where\you\want.png";$/Code$ + $Code$_control ctrlSetFontH1B "TahomaB"$/Code$ undefined / undefined - (July 18, 2016) - This command only captures the rendered picture (including ppEffects). GUI nor the mouse are visible on the screenshot. (ArmA 3 1.62.137494) - Nothing + Nothing + - scriptDone + setVectorDirAndUp - Check if a script is finished running using the Script_(Handle) returned by execVM or spawn. + Sets orientation of an object. The command takes 2 vector arrays, one for vectorDir and one for vectorUp. Default object orientation will always have vectorDir pointing forward (North) along Y axis and vectorUp pointing up along Z axis - [[0,1,0],[0,0,1]], as shown on the diagram below. + When attaching object to an object the axes are relative to the object that gets the attachment. If it is player object for example, then X goes from left to right, Y goes from back to front, and Z goes from down up. + The setDir command is incompatible with setVectorDirAndUp and should not be used together on the same object. Using setVectorDirAndUp alone should be sufficient for any orientation. + In Multiplayer, setVectorDirAndUp must be executed on the machine where the object it applied to is local. - https://community.bistudio.com/wiki/scriptDone + https://community.bistudio.com/wiki/setVectorDirAndUp - scriptDone Script_Handle + Object setVectorDirAndUp Array - scriptDone handle + vehicle setVectorDirAndUp [[x1, y1, z1],[x2, y2, z2]] - $Code$// SQS Syntax: - @ scriptDone _Handle$/Code$ + $Code$// set exact yaw, pitch, and roll + _y = 45; _p = -80; _r = 0; + BRICK setVectorDirAndUp [ + [ sin _y * cos _p, cos _y * cos _p, sin _p], + [ [ sin _r,- sin _p, cos _r * cos _p],-_y] call BIS_fnc_rotateVector2D + ];$/Code$ - $Code$// SQF Syntax: - script_handler = [parameters] execVM "scriptname.sqf"; - waitUntil { scriptDone script_handler };$/Code$ + $Code$// To rotate BRICK on Z axis 90 degrees clockwise, change its vectorDir but leave vectorUp unchanged. + BRICK setVectorDirAndUp [[1,0,0],[0,0,1]];$/Code$ + + $Code$// To rotate BRICK on Y axis 90 degrees clockwise, change its vectorUp but leave vectorDir unchanged. + BRICK setVectorDirAndUp [[0,1,0],[1,0,0]];$/Code$ + + $Code$// To rotate BRICK on X axis 90 degrees (tilt forward), change both vectorDir and vectorUp accordingly. + BRICK setVectorDirAndUp [[0,0,-1],[0,1,0]];$/Code$ + + $Code$// More complex orientations + //tilt forward 90 + rotate left 90 + BRICK setVectorDirAndUp [[1,0,0],[0,1,0]]; + //tilt backward 45 degrees + BRICK setVectorDirAndUp [[0,0.5,0.5],[0,-0.5,0.5]]; + //tilt forward 30 degrees + BRICK setVectorDirAndUp [[0,0.66,-0.33],[0,0.33,0.66]];$/Code$ - undefined / undefined + local / global - (03:54, 11 September 2009) - A Null Script handle can be created in this manner: - $Code$_handle = 0 spawn {};$/Code$ - That is what any Script_(Handle) becomes when a script is finished running, meaning it will test as true with: - $Code$ scriptDone _handle $/Code$ and it returns " NULL-script " when converted to string. This in turn lets you initialize the variable with a completed Script_(Handle) and lets you test the variable even though nothing else may have set the handle by creating a script with spawn or execVM. It also lets you store and manage script handles in arrays, and a few other sexy things. + (March 16, 2008) + Command can be also used to rotate camera in all three axis (which also mean it's possible to set camera bank). + + (May 9, 2008) + The object's vectorDir can only control its pitch, while its vectorUp can only control its bank. To set an object's yaw (direction), use the setdir command, before using this command. + You would think vectorUp would control pitch as well, but any pitch that would be set due to vectorUp is ignored. The same is true with vectorDir and yaw; any vectorDir that would adjust yaw is also ignored. If this doesn't make sense, try to visualize it with a box or soda can. + This command does NOT work with values relative to a unit, but rather it works with world vectors (think world coordinates as opposed to model coordinates). As a result, this command can be difficult to use in many situations, because the input values needed to get a certain pitch / bank for an object vary, depending on what direction the object is facing (yaw). + A function to set an object's pitch / bank can be found here + + (October 23rd, 2009) + Note this odd command may now be better understood. There's a thread about it here: + BI Studios Forum Thread + + (1 Jun, 2014) + (ArmA3 ver 1.20) setDir overwrites setVectorDirAndUp (P.S. setVectorDirAndUp also affects setVelocity.), so use setDir before BIS_fnc_setPitchBank, which is an easier workaround on vector, if changing yaw, pitch and bank are needed. setVectorDirAndUp is CCW, so if we wanna to set an obj 40 degrees CW, 170 degrees pitch and 85 degrees bank: + $Code$_obj setDir (40 - 180); [_obj, 170, 85] call BIS_fnc_setPitchBank ;$/Code$ + Same as: + $Code$_obj setVectorDirAndUp [[0.63,0.75,0.17],[-0.75,0.65,-0.084]];$/Code$ + Be aware that attachTo may flip vectorDir if pitch beyond 90 degrees and cause unexpected behavior to BIS_fnc_setPitchBank, e.g. + $Code$[_obj, 100, 0] call BIS_fnc_setPitchBank ; //vector: [-0.14,-0.09,0.98],[-0.83,-0.51,-0.17]$/Code$ + $Code$_obj attachTo [_logic,[0,0,2]]; + [_obj, 100, 0] call BIS_fnc_setPitchBank ; //vector: [0.11,0.33,0.93],[-0.06,0.94,-0.32] + compass direction algorism failed if obj was attached at present.$/Code$ + To overcome such limitation we can use fallowing function for a better workaround. (code originated from bapedibupa, remodified) + $Code$ + _obj attachTo [_logic,[0,0,2]]; + [_obj,[120,-78,37]] call fnc_SetPitchBankYaw; // pitch: 120, bank: -78, yaw: 37$/Code$ + $Code$ + fnc_SetPitchBankYaw = { + private ["_object","_rotations","_aroundX","_aroundY","_aroundZ","_dirX","_dirY", + "_dirZ","_upX","_upY","_upZ","_dir","_up","_dirXTemp","_upXTemp"]; + _object = _this select 0; + _rotations = _this select 1; + _aroundX = _rotations select 0; + _aroundY = _rotations select 1; + _aroundZ = (360 - (_rotations select 2)) - 360; + _dirX = 0; + _dirY = 1; + _dirZ = 0; + _upX = 0; + _upY = 0; + _upZ = 1; + if (_aroundX != 0) then { + _dirY = cos _aroundX; + _dirZ = sin _aroundX; + _upY = - sin _aroundX; + _upZ = cos _aroundX; + }; + if (_aroundY != 0) then { + _dirX = _dirZ * sin _aroundY; + _dirZ = _dirZ * cos _aroundY; + _upX = _upZ * sin _aroundY; + _upZ = _upZ * cos _aroundY; + }; + if (_aroundZ != 0) then { + _dirXTemp = _dirX; + _dirX = (_dirXTemp* cos _aroundZ) - (_dirY * sin _aroundZ); + _dirY = (_dirY * cos _aroundZ) + (_dirXTemp * sin _aroundZ); + _upXTemp = _upX; + _upX = (_upXTemp * cos _aroundZ) - (_upY * sin _aroundZ); + _upY = (_upY * cos _aroundZ) + (_upXTemp * sin _aroundZ); + }; + _dir = [_dirX,_dirY,_dirZ]; + _up = [_upX,_upY,_upZ]; + _object setVectorDirAndUp [_dir,_up]; + }; + $/Code$ - Boolean + Nothing + - scriptName + activateAddons - Assign a user friendly name to the VM script this command is executed from. - Once name is assigned, it cannot be changed. + Activates the listed addons. The list of active addons is initialized during this function. - https://community.bistudio.com/wiki/scriptName + https://community.bistudio.com/wiki/activateAddons - scriptName String + activateAddons Array - scriptName name + activateAddons [addon1,] - $Code$scriptName "leetScript.sqf";$/Code$ - - $Code$scriptName format ["%1ARTY\data\scripts\ARTY_sadarmDeploy.sqf (_this: %1)",_this];$/Code$ + $Code$activateAddons ["BISOFP"];$/Code$ undefined / undefined - (17:39, 13 June 2009 (CEST)) - scriptName is good when you want to load the handle of some spawn or call with some name: - on top of leetscript.sqf - $Code$ - scriptName "LEETSCRIPT"; - GLOBAL_SCR_NAME = [] spawn "leetscript.sqf"; - hint format ["%1",GLOBAL_SCR_NAME]; - //display "LEETSCRIPT"$/Code$ + (Jan 21, 2009) + Be aware that "Addon1" is the cfgPatches class of the desired addon to preload. + + (May 10, 2009) + This command will activate addons that are referenced via scripts but not included in a missions required addons section. If executed from a configs init event with the call command, it will effectively override a missions required addons, preventing them from being activated (Appears to only happen in multi player). + To activate the passed addons along with those defined in the mission.sqm, execute the command from a configs init event using spawn or execVM. UNN - Nothing + Nothing + - scriptNull + enableSaving - A non-existing Script or script that has finished ( scriptDone ). To compare non-existent scripts use isNull or isEqualTo : - scriptNull == scriptNull ; // ERROR! == cannot be used with script object - isNull scriptNull ; // true - scriptNull isEqualTo scriptNull ; // true + Enable / disable saving of the game. + When disabled, the autosave is created (if not forbidden by save == false). - https://community.bistudio.com/wiki/scriptNull + https://community.bistudio.com/wiki/enableSaving - scriptNull + enableSaving Boolean + + enableSaving Array - scriptNull + enableSaving enable + + enableSaving [enable, save] - $Code$// Wait until previous script is finished before starting a new one: - [] spawn - { - _script = scriptNull ; - for "_i" from 1 to 10 do { - waitUntil { isNull _script}; - _script = _i spawn { - hint format ["script %1 started", _this]; - sleep 1; - hint format ["script %1 finished", _this]; - sleep 0.2; - }; - }; - };$/Code$ - - $Code$if ( scriptDone (_obj getVariable ["objScript", scriptNull ])) then { - _obj setVariable ["objScript", _obj spawn { - waitUntil { damage _this 0.9}; - hint "Critical Damage!"; - }]; - };$/Code$ - - $Code$str scriptNull ; // NULL-script$/Code$ + $Code$enableSaving false ; // Saving disabled and make autosave. + enableSaving true ; // Saving enabled without autosave. + enableSaving [ false, false ]; // Saving disabled without autosave. + enableSaving [ false, true ]; // Saving disabled and make autosave. + enableSaving [ true, false ]; // Saving enabled without autosave. + enableSaving [ true, true ]; // Saving enabled and make autosave.$/Code$ undefined / undefined @@ -53454,110 +55133,95 @@ - Script_Handle + Nothing - Nothing + - scudState + progressSetPosition - Current state of given Scud launcher. Following states are recognized: - 0 - No activity - 1 - Launch preparation, - 2 - Launch prepared - 3 - Ignition - 4 - Launched. + Sets progress position of the progress bar ( DialogControls-ProgressBar ) - https://community.bistudio.com/wiki/scudState + https://community.bistudio.com/wiki/progressSetPosition - scudState Object + Control progressSetPosition Number - scudState scudName + control progressSetPosition pos - $Code$if (( scudState _scud) == 3) exitWith - { - player sideChat "SCUD Launch status: Missile Ignition"; + $Code$_control progressSetPosition 0.5$/Code$ + + $Code$with uiNamespace do { + bar = findDisplay 46 ctrlCreate ["RscProgress", -1]; + bar ctrlSetPosition [0,0,1,0.01]; + bar ctrlCommit 0; + bar progressSetPosition 0.75; };$/Code$ undefined / undefined - (August 4, 2006) - This command checks the scud status (Non-integral values are used to indicate transition between states). - To make the scud be upright, launch or cancel launch you need to use actions. - $Code$scud1 action ["scudLaunch",scud1]; // erect the missile - scud1 action ["scudStart",scud1]; // launch the missile - scud1 action ["scudCancel",scud1]; // down the missile - $/Code$ - (Make sure either the scud launcher has a crew inside or you use the game logic to perform actions). - Number + Nothing + - secondaryWeaponItems + setObjectArguments - Returns array with all items assigned to the secondary weapon. This command is used for infantry weapons only. + Set object arguments in mission editor. + i + Some Old Editor Command - https://community.bistudio.com/wiki/secondaryWeaponItems + https://community.bistudio.com/wiki/setObjectArguments - secondaryWeaponItems Object + Control setObjectArguments Array - secondaryWeaponItems unit + map setObjectArguments [object,[name1,value1,]] - $Code$secondaryWeaponItems player ; //["","","",""]$/Code$ - + undefined / undefined - Array + Any_Value + - secondaryWeaponMagazine + nextWeatherChange - Returns either single element array, containing class name of currently loaded in the secondary weapon magazine, or an empty array if unit has no secondary weapon or secondary weapon is not loaded. This command is used for infantry weapons only. + Return the remaining time (in seconds) over which the current weather change will occur. + When a weather change finishes, the game engine will automatically generate a new random weather change over a realistic time period (minimum of 90 minutes). - https://community.bistudio.com/wiki/secondaryWeaponMagazine + https://community.bistudio.com/wiki/nextWeatherChange - secondaryWeaponMagazine Object + nextWeatherChange - secondaryWeaponMagazine unit + nextWeatherChange - $Code$hint secondaryWeaponMagazine player ; //["NLAW_F"]$/Code$ - - $Code$_array = secondaryWeaponMagazine player ; - if ( count _array 0) then { - hint ("Secondary weapon is loaded with " + (_array select 0) + "!"); - } else { - if ( secondaryWeapon player != "") then { - hint "Secondary weapon is not loaded!"; - } else { - hint "Player doesn't have a secondary weapon!"; - }; - };$/Code$ + $Code$_seconds = nextWeatherChange ;$/Code$ undefined / undefined @@ -53565,124 +55229,89 @@ - Array + Number + - secondaryWeapon + setFuel - Returns name of a unit's secondary weapon (empty string if none). + Sets fuel percentage from 0 (empty) to 1 (full). The vehicle must be local to the computer where command is executed. - https://community.bistudio.com/wiki/secondaryWeapon + https://community.bistudio.com/wiki/setFuel - secondaryWeapon Object + Object setFuel Number - secondaryWeapon unit + vehicle setFuel amount - $Code$_sWeap = secondaryWeapon player ;$/Code$ - - $Code$hint secondaryWeapon player ; //"launch_NLAW_F"$/Code$ + $Code$_jeepOne setFuel 0.5;$/Code$ - undefined / undefined + local / global - (August 4, 2006) - Notes from before the conversion: - secondaryWeapon tells you what weapon the unit has irrespective of the status of the weapon. For example a unit that has a LAWLauncher on his back will still report a LAWLauncher as its secondary weapon. Use currentWeapon to detect the active weapon. - String + Nothing + - selectBestPlaces + damage - Find the places with the maximum value of expression in the given area. Places can be on water. Results are sorted by value. Search pattern is randomised every command execution. + Return the damage value of an object. - https://community.bistudio.com/wiki/selectBestPlaces + https://community.bistudio.com/wiki/damage - selectBestPlaces Array + damage Object - selectBestPlaces [position, radius, expression, precision, sourcesCount] + damage object - $Code$myPlaces = selectBestPlaces [ position player, 50, "meadow + 2*hills", 1, 5];$/Code$ + $Code$? (( damage player ) 0.1) : player groupChat "I'm hurt! Medic!"$/Code$ + + $Code$_health = (1 - damage player ) * 100 //Health in % from 0 to 100$/Code$ - undefined / undefined + global / undefined - (Jul 17, 2010) - see http://forums.bistudio.com/showthread.php?t=93897 for some more information (though neither official, nor complete). The most important information is the list of useable keywords for the expression which is: forest, trees, meadow, hills, houses, sea, night, rain, windy and deadBody. The keyword will be replaced by the actual value at the given sample position and thus the expression gets evaluated. For example the following expression (which returns high values in forest) "forest + trees - meadow - houses - (10 * sea)" might be transformed to 0 + 0.1 - 0.7 - 0 - (10 * 0) which is - with it's result of -0.6 - not in the forest, though there are some tree(s) around. You get the idea. - Also note that you may aswell check such an expression value at a single position by passing a low radius and a sourceCount of 1, which is often just as useful as retrieving multiple (and already sorted) positions. - Also do not underestimate the keywords night, rain or windy, for if you couple them with the other keywords, you can easily get a highly dynamic system at a very low cost. (this, btw., is how animals "choose" where and when to spawn) - - (Apr 3, 2014) - In ArmA3 ver 1.14 Two new expressions are available: waterDepth (0-1) and camDepth (0-1), along with three simple operators: interpolate, randomGen and factor that can be used together with expressions. E.g. - $Code$ - p = selectBestPlaces [ - position player, - 500, - "(2 * (waterDepth interpolate [1,16,0,1]) * ((0.1+houses factor [0.1,0.8]) * (randomGen 1 + houses)))", - 1, - 1]; - $/Code$ - A lgorithm randomGen: - $Code$ - randomGen A(number): randomly generate a float number from 0 - A - $/Code$ - A lgorithm factor: - $Code$ - A(number) factor [p,q] = - p A q: [(A -p)/(q-p)] - $/Code$ - A lgorithm interpolate: - $Code$ - A(number) interpolate [p,q,r,s] = - A =p:r - A =q:s - p A q: [(A -p)/(q-p)]*(s-r) +r - $/Code$ - - (June 15, 2015) - precision seems to have range 0 - 100. At very low values the command is extremely slow. 100 makes it quite fast. It looks like precision is some kind of grid search size. Large chunks make the search faster but less accurate. - Resulting array is [] if sourcesCount is 0 or expression is "". In all other cases it seems that result is array of arrays of the set max count. The sole indication of successful search is expressionResult value when it is 0. - - (June 4, 2017) - Results are sorted by value, that is, the result of the expression. - They are sorted in descending order, so in the case of waterdepth, the deepest water will be found at the locations at the start of the returned array and the shallowest water will be found at the locations at the end. + (February 13, 2015) + The returned value depends on the couple target/ammo fired. This value has no correlation with the sum of all hitpoints damage status and the effective status of the object. Firing bullets on cars often lead to weird results. For example: damage returns zero while a Hunter is fired at will with an.50 HMG! Hunter can be almost destroyed with zero damage for this function. If you script, use instead the getHitPointDamage function. - Array + Number + - selectDiarySubject + isShowing3DIcons - Select the subject page in a log. + Returns true if the editor is set to draw 3D icons. + i + Some Old Editor Command - https://community.bistudio.com/wiki/selectDiarySubject + https://community.bistudio.com/wiki/isShowing3DIcons - Object selectDiarySubject String + isShowing3DIcons Control - person selectDiarySubject subject + isShowing3DIcons map @@ -53692,137 +55321,126 @@ - Nothing + Boolean + - selectEditorObject + setMarkerTextLocal - Select an editor object. Does not un-select previously selected objects. - i - Some Old Editor Command + Sets the text label of an existing marker. - https://community.bistudio.com/wiki/selectEditorObject + https://community.bistudio.com/wiki/setMarkerTextLocal - Control selectEditorObject String + String setMarkerTextLocal String - map selectEditorObject object + markerName setMarkerTextLocal text - + $Code$"Marker1" setMarkerTextLocal "You are here.";$/Code$ + - undefined / undefined + undefined / local - Any_Value + Nothing + - selectLeader + get3DENIconsVisible - Select a group's leader. In MP the group has to be local to the PC executing the command. Locality of the group can be checked with local command and group ownership with groupOwner command. + Get visibility state of Eden Editor icons. - https://community.bistudio.com/wiki/selectLeader + https://community.bistudio.com/wiki/get3DENIconsVisible - Group selectLeader Object + get3DENIconsVisible - groupName selectLeader unitName + get3DENIconsVisible - $Code$group player selectLeader player ;$/Code$ - - $Code$// Make unit a leader from server: - [ group _unit, _unit] remoteExec ["selectLeader", groupOwner group _unit];$/Code$ + $Code$if ( get3DENIconsVisible select 0) then { hint "Icons are visible in the map.";};$/Code$ - local / global + undefined / undefined - Nothing + Array + - selectMax + titleText - Returns the array element with maximum numerical value. Engine solution to BIS_fnc_greatestNum and BIS_fnc_findExtreme. Therefore it is expected that supplied array consists of Numbers only. Booleans however are also supported and will be evaluated as Numbers : true - 1, false - 0. nil value treated as 0. Other non Number elements (not recommended) will be evaluated as 0 and Bad conversion: scalar message will be logged into. rpt. + Displays text across the screen. If used along with cutText two different texts (in different type styles) can be shown at once. The text can be displayed on multiple lines by using "\n" new line characters: + titleText ["line1\nline2\nline3", "PLAIN"];. Since Arma 3 v1.73.142260 this command supports Structured Text formatting. - https://community.bistudio.com/wiki/selectMax + https://community.bistudio.com/wiki/titleText - selectMax Array + titleText Array - selectMax array + titleText [text, type, speed, showInMap, isStructuredText] - $Code$_max = selectMax [1,2,3,4,5]; //5$/Code$ + $Code$titleText ["Show this text", "PLAIN"];$/Code$ - $Code$// Same as, for example: - _max = _a max _b max _c max _d; - // Only faster: - _max = selectMax [_a,_b,_c,_d];$/Code$ + $Code$titleText ["Your message", "BLACK", 2];$/Code$ + + $Code$// Since Arma 3 v1.73.142260: + titleText [" t color='#ff0000' size='5' RED ALERT! /t br/ ***********", "PLAIN", -1, true, true ];$/Code$ - undefined / undefined + undefined / local - (December 19, 2016) - Returns either number or boolean value, in case max value in array 0, command will return either 0 or false, which ever comes first. - Same for 1 and true values. - $Code$selectMax [false,0] // returns false - selectMax [0,false] // returns 0 - selectMax [true,1] // returns true - selectMax [1,true] // returns 1 - $/Code$ - in case all values are equal or less than zero, command may also return other type of values - $Code$selectMax ["",false,0,-1] // returns "" - $/Code$ - if nil value appears in array, other values are equal or less than zero, command returns nil + (November 21, 2014) + The third parameter or 'speed', as it's called in the description, refers to the amount of time the message will be shown on-screen. Multiply each number by 10 to get the number of seconds it will be shown. You can even use floats as input, like 0.1, to show a message for only 1 second. + Note : Calculating the time with that method does not include the time it takes to fade in/out, which is about 1 second unless you use numbers lower than 1. + Note : Using anything lower than 0.001 seems to have no effect, or the effect is so little it's negligible. + (A3 1.34.128075) - Anything + Nothing + - selectMin + environmentEnabled - Returns the array element with minimum numerical value. Engine solution to BIS_fnc_lowestNum and BIS_fnc_findExtreme. Therefore it is expected that supplied array consists of Numbers only. Booleans however are also supported and will be evaluated as Numbers : true - 1, false - 0. nil value treated as 0. Other non Number elements (not recommended) will be evaluated as 0 and Bad conversion: scalar message will be logged into. rpt. + Returns status of enableEnvironment command - https://community.bistudio.com/wiki/selectMin + https://community.bistudio.com/wiki/environmentEnabled - selectMin Array + environmentEnabled - selectMin array + environmentEnabled - $Code$_min = selectMin [1,2,3,4,5]; //1$/Code$ - - $Code$// Same as, for example: - _min = _a min _b min _c min _d; - // Only faster: - _min = selectMin [_a,_b,_c,_d];$/Code$ + $Code$_enabled = environmentEnabled ;$/Code$ undefined / undefined @@ -53830,307 +55448,187 @@ - Anything + Array + - selectNoPlayer + curatorWaypointCost - Switches player to no unit, makes player return objNull. SP only, the command is completely ignored in MP. + Return current price for placing waypoints (curator specific). - https://community.bistudio.com/wiki/selectNoPlayer + https://community.bistudio.com/wiki/curatorWaypointCost - selectNoPlayer + curatorWaypointCost Object - selectNoPlayer + curatorWaypointCost curatorObj - $Code$// Single player: - selectNoPlayer ; - hint str player ; // NULL-object - // Rough multiplayer emulation:_noPlayer = createGroup sideLogic createUnit [ - "Logic", - [0,0,1000], - [], - 0, - "NONE" - ]; - selectPlayer _noPlayer; - hint str player ; //L Charlie 4-3:1 (KK)$/Code$ - + undefined / undefined - Player returns objNull after this command has been used. It also has at least the following side effects: closeDialog won't work anymore and onKeyDown event handlers cease to detect the ESC key. In order to get things back to normal a new player object has to be set with selectPlayer. Using objNull won't cut it in this case. - Nothing + Number + - selectPlayer + runInitScript - Moves player into given unit. In Arma 3 it is now not possible to selectPlayer into unit occupied by another player. Also avoid selecting player into editor placed units in multiplayer, as it may, on occasion, lead to some undefined behaviour. If you need to selectPlayer into another unit, consider creatingUnit dynamically. + Launch init.sqs or init.sqf scripts. - https://community.bistudio.com/wiki/selectPlayer + https://community.bistudio.com/wiki/runInitScript - selectPlayer Object + runInitScript - selectPlayer unitName + runInitScript - $Code$selectPlayer bob;$/Code$ - + - local / global + undefined / undefined - This command has significant effects on locality - Notes on locality issues with selectPlayer in multiplayer environments: - 1) If you switch to a unit that's not local, control over movement will not be given to you immediately. For example, if you switch to an AI unit whose leader is a player, you will not be able to control the movement of your new avatar, as its control remains with the leader unit. You will however be able to look around while the unit walks automatically. - 2) The identity of units are not transferred properly: If your old unit dies, this will count for your stats. Your old unit might remain identifiable as you (if you aim at the unit you see your own name). Your new unit will keep it's name, face and voice (face can be set dynamically, but name, voice and glasses have to be defined before mission start in the description.ext). When chatting, not the name of your original identity, but the identity of the transferred to person will show. - Those 2 Points were for ArmA I, I am currently analyzing the behaviour in ArmA II with version 1.08 + OA 1.57 - So with ArmA II, you still have to keep an eye on locality (otherwise the AI will controll the unit you are), but there are cool possibilities now: if you do a "selectPlayer unitVarName",the unit takes your identity (with name, voice, face and glasses) - and your identity is also visible on other clients! - But you have to remember that your old unit will stay with your Identity. Dies the old unit, the stats count it. An other thing you have to pay attention is the Death for your new unit - you have to register an EventHandler, otherwise you will stay in your dead unit, and also the MenuOption Respawn won't help you out! 3.Jan. 2011 - 3) If you do a selectPlayer call, join,joinSilent,joinAs,joinAsSilent wont work anymore correctly. Means: Your unit joins the other group AND your unit will be local to the other group. so at the moment you can use selectPlayer only as a single human player in a group. In the later day I will try what happens if both human players are units by selectPlayer, and both join the same group (till yet tried with one selectPlayer unit and one originUnit) - 14.May 2011 - Tried to create ingame a group with a selectPlayer Unit (on both clients), and joint the new squad. The result was, the group was local to the client who created the group, so after that, all other units that join that Group are - as you may think already, local to that single client. 18.May 2011 - - 3) After switching to a unit that's not local, the unit will remain local to you after switching back. For example, if we have units A and B, and a client starts as unit A and unit B is AI under server control. If you switch to unit B, it will take some time, but eventually you can control the movement of unit B (see (1) above). Now if you switch back to unit A, unit B will remain local to you, the player. Any server-side scripts which try to execute local arguments -- such as doMove -- will fail. - - A working implementation can be found at A&S ProMode dev-heaven repo, acc guest, pw guest or at pastebin. - Be careful to learn all the pitfalls and things you need to take into consideration to have this working in MP. - - (09 March 2014) - Arma 3 (v1.13): In MP the Identity and the name carries over to the new Unit but not in SP. Use setName to set the name in SP. - - (June 24, 2015) - Most of the notes above do not apply to Arma 3 anymore. - Nothing + Nothing + - selectRandomWeighted + vehicle - Returns a random element from the given array according to assigned weights. Engine solution to BIS_fnc_selectRandomWeighted. A few notes: - Negative weights are not supported - If an item's weight is 0, the item is ignored - The weights don't have to total to 1 - If numbers of items and weights do not match, the shortest array is used - A single array Syntax is slightly faster then Alt Syntax + Vehicle in which given unit is mounted. If none, unit is returned. Alternatively, use objectParent - https://community.bistudio.com/wiki/selectRandomWeighted + https://community.bistudio.com/wiki/vehicle - selectRandomWeighted Array - - Array selectRandomWeighted Array + vehicle Object - selectRandomWeighted valuesAndWeights - - values selectRandomWeighted weights + vehicle unitName - $Code$_randomWeightedElement = selectRandomWeighted [1,0.1,2,0.2,3,1.3,4,2.4,5,7.5];$/Code$ + $Code$// SQS + ? vehicle player != player : hint "Player is in a vehicle"$/Code$ - $Code$_randomWeightedElement = [1,2,3,4,5] selectRandomWeighted [0.1,0.2,1.3,2.4,7.5];$/Code$ + $Code$// SQF + if ( vehicle player != player ) then { hint "Player is in a vehicle"};$/Code$ undefined / undefined - (June 26, 2017) - A 100000 runs of the following code: - $Code$_values = [0,1,2,3,4,5,6,7,8,9]; - _weights = [0.109,0.65,0.01,1.01,1.24,0,1.59,0.09,1.15,0.55]; - _result = _values selectRandomWeighted _weights;$/Code$ - Gave this result: - 0 - 0 - 0.01 - 144 - 0.09 - 1409 - 0.109 - 1633 - 0.55 - 8673 - 0.65 - 10127 - 1.01 - 15668 - 1.15 - 18059 - 1.24 - 19518 - 1.59 - 24769 - Anything - Anything + Object + - selectRandom + terrainIntersectASL - Returns a random element from the given array. Engine solution to BIS_fnc_selectRandom + Checks for intersection of terrain between two ASL positions. Returns true if intersects with terrain. For AGL variant, see terrainIntersect - https://community.bistudio.com/wiki/selectRandom + https://community.bistudio.com/wiki/terrainIntersectASL - selectRandom Array + terrainIntersectASL Array - selectRandom array + terrainIntersectASL [pos1, pos2] - $Code$_randomElement = selectRandom [1,2,3,4,5];$/Code$ + $Code$_intersects = terrainIntersectASL [ getPosASL player, getPosASL chopper];$/Code$ + + $Code$_intersects = terrainIntersectASL [ eyePos player, eyePos enemy1];$/Code$ undefined / undefined + (may 31, 2012) + Please note the difference : + terrainIntersect + terrainIntersectASL + lineIntersect s + lineIntersect s With + lineIntersect s Objs + intersect + + (may 31, 2012) + This command is CPU intensive on the engine, be careful with its use. - Anything + Boolean + - selectWeaponTurret + clearWeaponPool - Selects the given weapon on specified turret. Use turret path [-1] for driver's turret. Since ver. 1.63.136864 this command supports both weapon name and muzzle name. + Remove all weapons from the weapon pool, of which the player may choose in the following missions. Available in campaigns only. - https://community.bistudio.com/wiki/selectWeaponTurret + https://community.bistudio.com/wiki/clearWeaponPool - Object selectWeaponTurret Array + clearWeaponPool - vehicle selectWeaponTurret [weapon, turretPath] + clearWeaponPool - $Code$MBT_Kuma selectWeaponTurret ["LMG_coax",[0]];$/Code$ - + undefined / undefined - (February 13, 2017) - The command will treat weapon or muzzle param like a weapon first. If no such weapon is found then it will try to find muzzle with such name. For example AMV-7 Marshall APC has main gun "autocannon_40mm_CTWS" which has 2 muzzles "HE" and "AP". Default muzzle is "HE". So if you try to select weapon by the name "autocannon_40mm_CTWS" you will always get "HE" muzzle selected. However if you pass "AP" as param, it will correctly select "AP" muzzle, since no "AP" weapon exists on this turret it will continue searching for a muzzle with this name and will find it eventually. - - - Nothing - - - - - selectWeapon - - - Selects the given weapon. - Note: For weapons that have more than one muzzle, you have to input the muzzlename and not the weaponName. - The only weapons that have muzzleNames seem to be rifles with grenade launchers, handgrenades, smokeshells and satchels. - In all other cases the weaponName must be used. - Fortunately, in OFP, in most cases, both names are the same. But check. - In ArmA the weaponNames and muzzleNames are different. - For muzzle names see cfgWeapons. - NOTE: The unit must be local to the PC on which command is executed. - - - https://community.bistudio.com/wiki/selectWeapon - - - Object selectWeapon String - - - unitName selectWeapon muzzleName - - - $Code$_soldier1 selectWeapon "LAWLauncher";$/Code$ - - $Code$player selectWeapon "M203Muzzle";$/Code$ - - - local / global - - - (5 Aug, 2008) - Rather than simply using selectWeapon to select your default weapon after adding them to your player, it is recommended you use a script instead similar to the following, which caters for multiple muzzles: - SelectWeapon.sqf - // Desc: select default weapon & handle multiple muzzles - if (count weapons player 0) then - { - private['_type', '_muzzles']; - _type = ((weapons player) select 0); - // check for multiple muzzles (eg: GL) - _muzzles = getArray(configFile "cfgWeapons" _type "muzzles"); - if (count _muzzles 1) then - { - player selectWeapon (_muzzles select 0); - } - else - { - player selectWeapon _type; - }; - }; - - (22 Mar, 2010) - Can be used with primaryWeapon to select the primary weapon. - An example with muzzle care (see Dr_EyeBall note) : - if ( (primaryWeapon player) != "") then - { - private['_type', '_muzzles']; - _type = primaryWeapon player; - // check for multiple muzzles (eg: GL) - _muzzles = getArray(configFile "cfgWeapons" _type "muzzles"); - if (count _muzzles 1) then - { - player selectWeapon (_muzzles select 0); - } - else - { - player selectWeapon _type; - }; - }; - Nothing + Nothing + - selectedEditorObjects + ctrlSetFontH4B - Returns a list of currently selected editor objects. - i - Some Old Editor Command + Sets H4 bold font of given HTML control. - https://community.bistudio.com/wiki/selectedEditorObjects + https://community.bistudio.com/wiki/ctrlSetFontH4B - selectedEditorObjects Control + Control ctrlSetFontH4B String - selectedEditorObjects map + controlName ctrlSetFontH4B fontName - $Code$_selObjects = selectedEditorObjects _map - Result can be: ["_vehicle_0","_vehicle_9","_vehicle_11"]$/Code$ + $Code$_control ctrlSetFontH4B "TahomaB"$/Code$ undefined / undefined @@ -54138,308 +55636,228 @@ - Array + Nothing + - selectionNames + leaderboardInit - Returns the list of model selections + Initialize the leaderboard structure for board with given name. Returns true if board is already initialized. - https://community.bistudio.com/wiki/selectionNames + https://community.bistudio.com/wiki/leaderboardInit - selectionNames Object + leaderboardInit String - selectionNames object + leaderboardInit boardName - $Code$_house= "Land_i_House_Small_02_V3_F" createVehicle _pos; - selectionNames _house; - //[ - //"door_1","door_2","damt_1","door_handle_1","door_handle_2","glass_1_hide", - //"glass_2_hide","glass_3_hide","glass_1_unhide","glass_2_unhide","glass_3_unhide", - //"glass_4_hide","glass_4_unhide" - //]$/Code$ + $Code$leaderboardInit "TT01"$/Code$ undefined / undefined - (June 5, 2016) - selectionNames returns an array of named selections from only the resolution LODs. - Array + Boolean + - selectionPosition + remoteExecutedOwner - Search for selection in the object model (first in the memory level, then in geometry LODs). - Returns position in model space. In A1 it returns the initial position of the selection, in A2/3 position of the selection (e.g. when it is animated) in render time scope. If a selection does not exist [0,0,0] is returned. + Returns clientOwner of the PC, which initiated Remote Execution call. If used in SP or outside of remote executed context, the command returns 0. To check if the context was remote executed or remote executed from JIP queue, use isRemoteExecuted and isRemoteExecutedJIP - https://community.bistudio.com/wiki/selectionPosition + https://community.bistudio.com/wiki/remoteExecutedOwner - Object selectionPosition String - - Object selectionPosition Array + remoteExecutedOwner - object selectionPosition selectionName - - object selectionPosition [selectionName, LODName] + remoteExecutedOwner - $Code$_inModelPosition = player selectionPosition "head_hit";$/Code$ - - $Code$_inModelPosition = player selectionPosition "pelvis";$/Code$ - - $Code$_inModelPosition = player selectionPosition "head";$/Code$ + $Code$_callerRE = remoteExecutedOwner ;$/Code$ - $Code$_inModelPosition = player selectionPosition "camera";$/Code$ + $Code$// Send request to the server and get immediate response: + { + // in this scope, the remoteExecutedOwner equals clientOwner of the sender + // so using it as target in remoteExec will send response right back at him + [ + time, // mission time value on the server + { + hint format + [ + "Request recieved!\nMission time value on the server is: %1", + _this + ]; + } + ] + remoteExec ["call", remoteExecutedOwner ]; // server response to the sender + } + remoteExec ["call", 2]; // send request to server$/Code$ - global / undefined + undefined / undefined - (January 5, 2007) - To know more selections simply create an eventHandler damage on an object. - - (July 29, 2015) - Since 1.49.131660, you can use an alternative syntax: - object selectionPosition [selectionName, lodName] - lodName: "Memory", "Geometry", "FireGeometry", "LandContact", "HitPoints" - If the given selectionName is not found in the given lod, [0,0,0] is returned. - - (June 25, 2017) - Do use the filter that comes with Alt Syntax to suit your needs. For example player has 3 selections called "head" and their selectionPositions are quite different from each other: - $Code$ player selectionPosition ["head", "Memory"]; // [0.173798,0.330415,1.37783] - player selectionPosition ["head", "FireGeometry"]; // [0.14375,0.206039,1.44689] - player selectionPosition ["head", "HitPoints"]; // [0.144257,0.306769,1.53471]$/Code$ + (September 11, 2017) + NOTE : Always be sure to check if the remoteExecutedOwner is not equal to 0 when sending a remoteExec / remoteExecCall packet back, as this will result in sending packet to ANYONE (0): + $Code$if (remoteExecutedOwner isEqualTo 0) exitWith {}; // Not valid RE owner + _gearArray remoteExecCall ['someGearFunction',remoteExecutedOwner]; + $/Code$ + Will prevent from code being accidentaly sent for everyone on the server. - Array - Array + Number + - select + allowDammage - Selects an element from an array, config entry from Config or substring from a string or a range from an array. + Allow or prevent an object being damaged (or injured, or killed). Alias of allowDamage. + The command does not prevent object from taking scripted damage such as setDamage or setHit. + ! + Command has to be executed where object is local and as long as object does not change locality the effect of this command will be global. + If object changes locality, the command needs to be executed again on the new owner 's machine to maintain the effect. - https://community.bistudio.com/wiki/select + https://community.bistudio.com/wiki/allowDammage - Array select Number - - Array select Boolean - - Config select Number - - String select Array - - Array select Array - - Array select Code + Object allowDammage Boolean - array select index - - array select boolean - - config select index - - string select [start, length] - - array select [start, count] - - array select expression + object allowDammage allow - $Code$[1,2,3,4] select 2; //result is 3 - position player select 2; //result is Z coordinate of player position$/Code$ - - $Code$["", currentWeapon player ] select alive player ; //if dead "" is selected$/Code$ - - $Code$( configFile "cfgVehicles" typeOf vehicle player "Turrets") select 0 "gunnerAction";$/Code$ - - $Code$hint str ("japa is the man!" select [8]); //the man! - hint str ("japa is the man!" select [0,7]); //japa is$/Code$ - - $Code$hint str ([1,2,3,4,5,6] select [1,4]); //[2,3,4,5]$/Code$ - - $Code$_even = [1,2,3,4,5,6,7,8,9,0] select {_x%2 == 0}; // returns [2, 4, 6, 8, 0]$/Code$ + $Code$player allowDammage false ;$/Code$ undefined / undefined - (3 March 2009) - When combined with the count command, this can be used to read all entries out of a config; even when you don't know exactly how many entries there will be. See the notes under count for more info. - - (27 Sep, 2013) - Rounding of fractions with select is not the same as when you use round command: - $Code$_roundThis = 0.5; - hint str ([0,1] select _roundThis); //0 - hint str round _roundThis; //1$/Code$ - - (30 May, 2014) - In ArmA3 ver 1.18, Boolean type supported. Which true defaulted as 1 and false as 0. - $Code$[0,1] select (56 40) // 1 - [0,1,2] select ((! isNil "v") && false ) // 0$/Code$ - - (14 juil, 2016) - You can substract array from array using select: - $Code$_array = [[1],[2],[3]]; _sub = [2]; - _array - _sub // [[1],[2],[3]; - _array select {!(_x isEqualTo _sub)} // [[1],[3]]; - [[1],[2],[2],[2],[2],[3]] select {!(_x isEqualTo _sub)} // [[1],[3]]; - $/Code$ - - (June 22, 2015) - Usually when select tries to pick up element out of range, Arma throws "division by zero" error. However there are exceptions. Basically as long as index of element you are selecting is less then or equal to array size, you will get no error. - $Code$[] select 0; //ok, result is nil - [1,2,3] select 3; //ok, result is nil - [1,2,3] select 4; //division by zero$/Code$ - - (November 12, 2016) - It is not safe to escape the code block of alternative syntax #5 with exitWith, breakOut etc. - $Code$x3 = [1,2,3,4,5] select { - if (_x == 3) exitWith { - false; - }; - true - }; - // could be expected to be: x3 = [1,2,4,5] - // actual result: x3 = false - $/Code$ - - (February 14, 2017) - Syntax #5 is the equivalent of passing in a predicate that returns a boolean. In SQF, a piece of code will always return what the last executed command returned. - $Code$ - myAliveUnits = allunits select {alive _x;}; // alive returns a boolean, the last statement run was alive _x, therefore this piece of code will return a true/false to the select command - myEastGroups = allgroups select {side _x == EAST;}; // returns all groups that are side EAST - my4ManGroups = allgroups select { count (units _x) == 4;}; // returns all groups that have 4 men in them - UnitsThatDetectedMe = allunits select {_x knowsAbout player 0.1;}; // returns a list of units that have detected the player - $/Code$ - - (May 28, 2017) - Very simple example of how to report about the status of the player: - $Code$[ "Player is dead.", "Player is alive" ] select ( alive player )$/Code$ - returns "Player is alive" because ( alive player ) returned true. If ( alive player ) returned false, the first element (0) - would have been returned. - That is a great way of reporting about something without having to write a complicated it then else statement. + (October 24, 2014) + This command is still working in A3 1.32.127785, at least in single player. I didn't test multiplayer. - Anything - Anything - Config - String - Array - Array + Nothing + - sendAUMessage + getPlayerUID - Send the command to the list of clients. + Return an uniqueID of the given unit as string if it's player and empty value if it's AI. The unique ID may be up to 100 characters long and may contain numbers, uppercase letters and underscores (the value can be used to construct a valid variable name by appending to another valid variable name). + Note: while for ArmA 2 or ArmA 2: Operation Arrowhead until version 1.60 the result always contains a number, it should be always handled as an opaque string. Converting it to a Number can cause precision problems, as Number cannot accurately represent integers above 16777216 (2^24). Moreover, game versions since ArmA 2: Operation Arrowhead 1.61 provide a non-numeric value as a result. + In some cases, the identity of certain player units might fail to propagate to other clients and the server, which causes isPlayer and getPlayerUID to incorrectly return false and "", respectively, where the affected units are not local. [1] Therefore, beware of false negatives. - https://community.bistudio.com/wiki/sendAUMessage + https://community.bistudio.com/wiki/getPlayerUID - sendAUMessage Array + getPlayerUID Object - sendAUMessage [clientList, command] + getPlayerUID unit - $Code$sendAUMessage [[dpnid1, dpnid2], "ConnectTo: 192.168.1.66"]$/Code$ + $Code$_uid = getPlayerUID player ;$/Code$ - undefined / undefined + global / undefined + (April 17, 2014) + In Arma 3 the returned string is the steamID64 of the player. $Code$ _steamProfileUrl = "http://steamcommunity.com/profiles/" + ( getPlayerUID player );$/Code$ - Nothing + String + - sendSimpleCommand + onPlayerConnected - Sends a simple command to the vehicle's driver / gunner. The player executing command should be in the vehicle. - Gunner commands - "FIRE" - "CEASE FIRE" - "MANUAL FIRE" - "CANCEL MANUAL FIRE" - "KEY FIRE" - Driver commands - "FORWARD" - move forward - "FAST" - move forward, fast - "SLOW" - move forward, slow - "STOP" - stop moving forward or backward - "BACK" - move backward - "LEFT" - turn left, while moving or not - "RIGHT" - turn right, while moving or not - "STOPTURNING" - cancel turning (special case, normally would be called by the engine when LEFT or RIGHT turn key is released by the player) ( since Arma 3 v1.77 ) - "KEY UP" - "KEY DOWN" - "KEY FAST" - "KEY SLOW" + This command will execute attached code whenever a player is connected to a MP session. The code will receive a number of special variables: + _id : Number - is the unique DirectPlay ID. Quite useless as the number is too big for in-built string representation and gets rounded. It is also the same id used for user placed markers. + _uid : String - is getPlayerUID of the joining player. In Arma 3 it is also the same as Steam ID. + _name : String - is profileName of the joining player. + _jip : ( since Arma 3 v1.49 ) Boolean - is a flag that indicates whether or not the player joined after the mission has started ( J oined I n P rogress). true - when the player is JIP, otherwise false. + _owner : ( since Arma 3 v1.49 ) Number - is owner id of the joining player. Can be used for kick or ban purposes or just for publicVariableClient. + i + Since Arma 3 v1.57 a stackable version of this EH is available: PlayerConnected + In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. - https://community.bistudio.com/wiki/sendSimpleCommand + https://community.bistudio.com/wiki/onPlayerConnected - Object sendSimpleCommand String + onPlayerConnected String/Code - vehicleName sendSimpleCommand command + onPlayerConnected code - $Code$vehicle player sendSimpleCommand "STOP";$/Code$ + $Code$onPlayerConnected "[_id, _name] execVM ""PlayerConnected.sqf""";$/Code$ + + $Code$onPlayerConnected { diag_log [_id, _uid, _name]};$/Code$ + + $Code$// From Arma 3 v1.49: + onPlayerConnected { + somevar = random 123; + _owner publicVariableClient "somevar"; + //this will set somevar on + //joining player PC to a random value + };$/Code$ + + $Code$// From Arma 3 v1.49: + onPlayerConnected {isJip = _jip; _owner publicVariableClient "isJip"}; + //Each player will now have variable isJip containing individual JIP info$/Code$ undefined / undefined - Valid commands include: "FORWARD", "SLOW", "FAST" "BACK", "LEFT", "RIGHT", "STOP", "FIRE", "CEASE FIRE", "MANUAL FIRE", "CANCEL MANUAL FIRE". There may be more. - Only vehicles crewed by a player can use sendSimpleCommand. - - Other commands that work: "KEY FIRE", "KEY FAST", "KEY SLOW", "KEY DOWN", "KEY UP". These will simulate key presses. - In Arma 3 player doesn't always need to be in the vehicle to give commands. + This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - sendTaskResult + setMagazineTurretAmmo - Send a result of the task to the task sender. + Sets ammo count to given amount for given turret. + Broken when vehicle has multiple magazines of the same type - https://community.bistudio.com/wiki/sendTaskResult + https://community.bistudio.com/wiki/setMagazineTurretAmmo - Task sendTaskResult Array + Object setMagazineTurretAmmo Array - task sendTaskResult [state,result,sentence] + vehicle setMagazineTurretAmmo [magazineClass, ammoCount, turretPath] @@ -54449,7 +55867,8 @@ - Nothing + Number + @@ -54476,75 +55895,57 @@ - Task + Task + - sendUDPMessage + setMarkerColor - Send message to given address using UDP protocol. Returns false if the message has not been delivered - Note: Not implemented (see talk page for more info). + Sets marker color. Marker color names and their corresponding RGBA values for Arma 3 could be found in here: CfgMarkerColors_Arma_3 - https://community.bistudio.com/wiki/sendUDPMessage + https://community.bistudio.com/wiki/setMarkerColor - sendUDPMessage Array + String setMarkerColor String - sendUDPMessage [ip, port, message] + markerName setMarkerColor color - $Code$_bool = sendUDPMessage ["192.168.0.1", 2302, "Here goes you message..."];$/Code$ + $Code$"MarkerOne" setMarkerColor "ColorBlack";$/Code$ - undefined / undefined + undefined / global - Boolean + Nothing + - serverCommandAvailable + setDynamicSimulationDistanceCoef - Returns true if given serverCommand is available on current machine, false if not. Here is the general table of availability of Arma 3 server commands: - Available to anyone - #login, #userlist, #beclient, #vote - Available to any admin (voted in / logged in) or server host - #kick, #debug - Available to logged in admin or server host - #lock, #unlock, #maxping, #maxdesync, #maxpacketloss - Available to any admin (voted in / logged in) - #logout, #restart, #mission, #missions, #reassign, #monitor, #init - Available to logged in admin - #shutdown, #restartserver, #exec, #beserver, #monitords, #logentities, #exportjipqueue - Available to logged in admin on certain game builds - #captureframe, #enabletest, #disabletest - To check if server command could be executed in current environment use serverCommandExecutable. For more information on what each server command does, see Multiplayer Server Commands. - NOTE : When password variant of serverCommand is used on dedicated server, the table above does not apply as everything is available to it. + Sets activation distance multiplier of Arma_3_Dynamic_Simulation for the given class - https://community.bistudio.com/wiki/serverCommandAvailable + https://community.bistudio.com/wiki/setDynamicSimulationDistanceCoef - serverCommandAvailable String + String setDynamicSimulationDistanceCoef Number - serverCommandAvailable command + class setDynamicSimulationDistanceCoef multiplier - $Code$_can = serverCommandAvailable "#kick";$/Code$ - - $Code$if ( serverCommandAvailable "#logout") then - { - hint "You are a some sort of admin"; - };$/Code$ + $Code$"IsMoving" setDynamicSimulationDistanceCoef 3;$/Code$ undefined / undefined @@ -54552,42 +55953,34 @@ - Boolean + Nothing + - serverCommandExecutable + cameraView - Returns true if the serverCommand can be performed on the machine and in this exact environment, otherwise false. serverCommand can be executed only from User Interface Event Handlers, and this command also checks if that's the case. + Returns mode of active camera view. Mode is one of: + "INTERNAL" (1st person) + "EXTERNAL" (3rd person) + "GUNNER" (optics / sights) + "GROUP" (commander view) - https://community.bistudio.com/wiki/serverCommandExecutable + https://community.bistudio.com/wiki/cameraView - serverCommandExecutable String + cameraView - serverCommandExecutable command + cameraView - $Code$_can = serverCommandAvailable "#kick";$/Code$ - - $Code$// Add button to the main map to lock server, which could only be activated by admin: - with uiNamespace do { - ctrl = findDisplay 12 ctrlCreate ["RscButton", -1]; - ctrl ctrlSetPosition [0,0,0.5,0.1]; - ctrl ctrlCommit 0; - ctrl ctrlSetText "LOCK SERVER"; - ctrl ctrlAddEventHandler ["ButtonDown", + $Code$if ( cameraOn == _vehicle && cameraView == "External") then { - if ( serverCommandExecutable "#lock") then { - serverCommand "#lock"; - } else { - hint "You need to be logged in as admin to do this"; - }; - }]; + _vehicle switchCamera "Internal"; };$/Code$ @@ -54596,50 +55989,28 @@ - Boolean + String + - serverCommand + ctrlSetFontH1 - Executes a server command. Which command is available for execution can be found with serverCommandAvailable and whether or not it can be executed with serverCommandExecutable. - If serverCommand is executed on a client, it must be executed from UI event handler ( ctrlAddEventHandler, displayAddEventHandler ), such as onButtonDown or other User_Interface_Event_Handlers. - As of Arma 3 v1.39 serverCommand can be used on dedicated server and headless clients. This requires a password, both set in server.cfg and passed to the command itself (See Alt Syntax). + Sets H1 font of given HTML control. - https://community.bistudio.com/wiki/serverCommand + https://community.bistudio.com/wiki/ctrlSetFontH1 - serverCommand String - - String serverCommand String + Control ctrlSetFontH1 String - serverCommand command - - password serverCommand command + controlName ctrlSetFontH1 fontName - $Code$serverCommand "#logout";$/Code$ - - $Code$// Create button on the main map which will show userlist to anyone who clicks on it: - with uiNamespace do - { - ctrl = findDisplay 12 ctrlCreate ["RscButton", -1]; - ctrl ctrlSetPosition [0,0,0.5,0.1]; - ctrl ctrlSetText "USERLIST"; - ctrl ctrlCommit 0; - ctrl ctrlAddEventHandler ["ButtonDown", - { - serverCommand "#userlist"; - }]; - };$/Code$ - - $Code$serverCommand format ["#kick %1",_name];$/Code$ - - $Code$_isOK = "MyServerCommandPassword" serverCommand "#lock";$/Code$ + $Code$_control ctrlSetFontH1 "TahomaB"$/Code$ undefined / undefined @@ -54647,90 +56018,135 @@ - Boolean - Boolean + Nothing + - serverName + exitWith - Returns name of the hosting server in MP, "" in SP. + Exits current scope {...} it is executed from if condition evaluates true, creates new scope {...code...} and executes the given code in it. Often used for exiting do, for, count or forEach. Simply exiting waitUntil or onEachFrame scopes with exitWith will have no effect as these scopes are called repeatedly by the engine and require different handling to terminate (see Example 3). - https://community.bistudio.com/wiki/serverName + https://community.bistudio.com/wiki/exitWith - serverName + If_Type exitWith Code - serverName + ifType exitWith code - + $Code$if (_x 5) exitWith { echo "_x is too big"; _x} + // When _x is greater than 5, outputs message and terminates code in current level with value of _x.$/Code$ + + $Code$for "_j" from 1 to 10 do + { + player sideChat format ["%1",_j]; + if (_j==5) exitWith { player sideChat "5 is enough"}; + }; + player sideChat "Complete"; + // Only the "for" loop will exit when the exitWith condition has been fulfilled (not the whole script). Execution will continue after the end of the loop (player sideChat "Complete").$/Code$ + + $Code$// Most loops will also terminate when their scope exited. To exit and terminate scopes which are called every frame such as onEachFrame and waitUntil use the following examples: + onEachFrame { + if (! alive player ) exitWith { + onEachFrame {} + } + } + _time = time + 10; + waitUntil { + if ( time _time) exitWith { + true + } + }$/Code$ + undefined / undefined + (May 28, 2010) + Since ArmA2 uses Blocks in FSM as any ordinary Handle like while, for etc. in Scripts, ExitWith also only closes the Block in the FSM. + + (August 04, 2013) + The command will exit the current scope - no ifs no buts. If the current scope is a loop, it will exit the loop. If the current scope is the main body of a script, it will exit the script. For more understanding of scopes and exitWith have a look at this resource. + + (January 06, 2014) + To further explain Killzone_Kid 's above statement, exitWith does not work as described within any subsequent inner scopes of a loop - it will only simply exit the current scope. For example, this code will not exit the while loop: + $Code$ while { true } do { // 'while' scope + if ( player == ( leader player )) then { // 'if-then' scope + if ( time (5 * 60)) exitWith {}; // This will only exit the 'if-then' scope + }; + sleep 1; + }; + hint "Mission Started"; // This code will never execute$/Code$ + + (March 10, 2016) + exitWith cannot be used in event handlers with override ability to simply exit with override value. The following is incorrect: + $Code$// INCORRECT USAGE + onMapSingleClick { if (! isServer ) exitWith { true }};$/Code$ + The override value must be returned in the main scope of EH, but since it is exited with exitWith, it never happens. The correct way in this case would be: + $Code$// CORRECT USAGE + onMapSingleClick { call { if (! isServer ) exitWith { true }}};$/Code$ + exitWith will exit current call scope only and override value therefore will appear in the main scope of the EH, right where we want it. + + (October 12, 2016) + exitWith does not use standard "if-then" syntax, but a unique "if-exitWith" structure. - String + Anything + - serverTime + ctrlSetFontH5 - Server time synchronized to clients. Returns always 0 in Singleplayer. - Note that in ArmA2 1.05 Final, this command only returns the time since the Server was actually started. - NOTE: serverTime is available to both server and clients and shows the same value when synced. The only time it is not synced is on the server, right after server restart and only for the first 300 seconds. Client side serverTime is synced from the start. serverTime is also different from server time and server diag_tickTime + Sets H5 font of given HTML control. - https://community.bistudio.com/wiki/serverTime + https://community.bistudio.com/wiki/ctrlSetFontH5 - serverTime + Control ctrlSetFontH5 String - serverTime + controlName ctrlSetFontH5 fontName - $Code$hint format ["Synced server time : %1", serverTime ];$/Code$ + $Code$_control ctrlSetFontH5 "TahomaB"$/Code$ - global / undefined + undefined / undefined - (Sep 8, 2010(CEST) 19:31) - There is a bug in this command, about 3 minutes after missionstart this command returns something completely different. - See http://dev-heaven.net/issues/13581 for further infomation. - Number + Nothing + - set3DENAttribute + ctrlSetFontH4 - Set one of entity attributes. - ! - Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! + Sets H4 font of given HTML control. - https://community.bistudio.com/wiki/set3DENAttribute + https://community.bistudio.com/wiki/ctrlSetFontH4 - EdenEntity set3DENAttribute Array + Control ctrlSetFontH4 String - entity set3DENAttribute [class, value] + controlName ctrlSetFontH4 fontName - $Code$player set3DENAttribute ["allowDamage", false ]; - // Mark player as invincible$/Code$ + $Code$_control ctrlSetFontH4 "TahomaB"$/Code$ undefined / undefined @@ -54738,31 +56154,28 @@ - Boolean + Nothing + - set3DENAttributes + ctrlSetFontH3 - Set entity attributes. - An attribute is identified by its property ( data when it's engine-drive attribute) value in config. For the list of all attributes with their properties, see Setting Attributes. - ! - Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! + Sets H3 font of given HTML control. - https://community.bistudio.com/wiki/set3DENAttributes + https://community.bistudio.com/wiki/ctrlSetFontH3 - set3DENAttributes Array + Control ctrlSetFontH3 String - set3DENAttributes [[ entities1, class1, value1 ],, [ entitiesN, classN, valueN ]] + controlName ctrlSetFontH3 fontName - $Code$set3DENAttributes [[ get3DENSelected "Object","ControlMP", true ]]; - // Set all selected objects as playable$/Code$ + $Code$_control ctrlSetFontH3 "TahomaB"$/Code$ undefined / undefined @@ -54770,31 +56183,28 @@ - Boolean + Nothing + - set3DENGrid + ctrlSetFontH2 - Sets the grid increment for the given transformation type. - Transformation types: - Rotation - "r" - Translation - "t" - Scale - "s" + Sets H2 font of given HTML control - https://community.bistudio.com/wiki/set3DENGrid + https://community.bistudio.com/wiki/ctrlSetFontH2 - set3DENGrid Array + Control ctrlSetFontH2 String - set3DENGrid [type,value] + controlName ctrlSetFontH2 fontName - $Code$set3DENGrid ["t",100];// 100m movement increment$/Code$ + $Code$_control ctrlSetFontH2 "TahomaB"$/Code$ undefined / undefined @@ -54802,28 +56212,33 @@ - Nothing + Nothing + - set3DENIconsVisible + displayNull - Toggle visibility of Eden Editor icons. + A non-existing Display. To compare non-existent displays use isNull or isEqualTo : + displayNull == displayNull ; // false + isNull displayNull ; // true + displayNull isEqualTo displayNull ; // true - https://community.bistudio.com/wiki/set3DENIconsVisible + https://community.bistudio.com/wiki/displayNull - set3DENIconsVisible Array + displayNull - set3DENIconsVisible [showMap, showScene] + displayNull - $Code$set3DENIconsVisible [ false, false ]; - // Hide all icons$/Code$ + $Code$! isNull displayNull ; // false$/Code$ + + $Code$str displayNull ; // No display$/Code$ undefined / undefined @@ -54831,28 +56246,28 @@ - Nothing + Display + - set3DENLayer + vehicleReceiveRemoteTargets - Set layer for Eden Entity. + Gets whether the vehicle can acquire targets via datalink from the Side center. - https://community.bistudio.com/wiki/set3DENLayer + https://community.bistudio.com/wiki/vehicleReceiveRemoteTargets - EdenEntity set3DENLayer Number + vehicleReceiveRemoteTargets Object - entity set3DENLayer layerID + vehicleReceiveRemoteTargets vehicle - $Code$_myLayer = -1 add3DENLayer "CTRG"; - player set3DENLayer _myLayer;$/Code$ + $Code$vehicleReceiveRemoteTargets ( vehicle player );$/Code$ undefined / undefined @@ -54860,28 +56275,28 @@ - Boolean + Boolean + - set3DENLinesVisible + ctrlSetFontH6 - Toggle visibility of Eden Editor lines. + Sets H6 font of given HTML control. - https://community.bistudio.com/wiki/set3DENLinesVisible + https://community.bistudio.com/wiki/ctrlSetFontH6 - set3DENLinesVisible Array + Control ctrlSetFontH6 String - set3DENLinesVisible [showMap, showScene] + controlName ctrlSetFontH6 fontName - $Code$set3DENLinesVisible [ false, false ]; - // Hide all lines$/Code$ + $Code$_control ctrlSetFontH6 "TahomaB"$/Code$ undefined / undefined @@ -54889,27 +56304,28 @@ - Nothing + Nothing + - set3DENLogicType + ctrlSetFontH3B - Sets the new type of Logic object(s). For other objects use set3DENObjectType + Sets H3 bold font of given HTML control. - https://community.bistudio.com/wiki/set3DENLogicType + https://community.bistudio.com/wiki/ctrlSetFontH3B - Array set3DENLogicType String + Control ctrlSetFontH3B String - objects set3DENLogicType classname + controlName ctrlSetFontH3B fontName - $Code$[ get3DENSelected "logic" select 0] set3DENLogicType "MiscOR_F";$/Code$ + $Code$_control ctrlSetFontH3B "TahomaB"$/Code$ undefined / undefined @@ -54917,31 +56333,29 @@ - Nothing + Nothing + - set3DENMissionAttribute + vectorModelToWorldVisual - Set scenario attribute. - An attribute is identified by its property ( data when it's engine-drive attribute) value in config. For the list of all attributes with their properties, see Setting Attributes. - ! - Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! + Converts vector from model to world space in render time scope. - https://community.bistudio.com/wiki/set3DENMissionAttribute + https://community.bistudio.com/wiki/vectorModelToWorldVisual - String set3DENMissionAttribute Array + Object vectorModelToWorldVisual Array - section set3DENMissionAttribute [ class, value ] + object vectorModelToWorldVisual modelDir - $Code$"Multiplayer" set3DENMissionAttribute ["respawn",3]; - // Set respawn type to 3$/Code$ + $Code$// Convert model space vector [0,-10,4] to world space; vector gets rotated according to _airplane: + _airplane vectorModelToWorldVisual [0,-10,4];$/Code$ undefined / undefined @@ -54949,87 +56363,138 @@ - Boolean + Array + - set3DENMissionAttributes + typeName - Set scenario attributes. - An attribute is identified by its property ( data when it's engine-drive attribute) value in config. For the list of all attributes with their properties, see Setting Attributes. - ! - Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! + Returns the data type of an expression. + The type is returned as on of the following all-uppercase strings: + " ARRAY " + " BOOL " + " CODE " + " CONFIG " + " CONTROL " + " DISPLAY " + " GROUP " + " LOCATION " + " OBJECT " + " SCALAR " + " SCRIPT " + " SIDE " + " STRING " + " TEXT " + " TEAM_MEMBER " + " NAMESPACE " + They represent the available data types in ArmA. - https://community.bistudio.com/wiki/set3DENMissionAttributes + https://community.bistudio.com/wiki/typeName - set3DENMissionAttributes Array + typeName Anything - set3DENMissionAttributes [[ section, class1, value1 ],, [ section, classN, valueN ]] + typeName anything - $Code$set3DENMissionAttributes [["Multiplayer","respawn",3],["Multiplayer","respawnDelay",10]]; - // Set respawn type to 3 and respawn delay to 10 seconds$/Code$ + $Code$_msg = "hello"; _result = typeName _msg; //_result will be "STRING"$/Code$ + + $Code$_unit = player ; _result = typeName _unit; //_result becomes "OBJECT"$/Code$ + + $Code$// Values representing direct Data Types : + hint typeName 0; //SCALAR + hint typeName ""; //STRING + hint typeName true ; //BOOL + hint typeName []; //ARRAY + hint typeName {}; //CODE + hint typeName objNull ; //OBJECT + hint typeName grpNull ; //GROUP + hint typeName controlNull ; //CONTROL + hint typeName teamMemberNull ; //TEAM_MEMBER + hint typeName displayNull ; //DISPLAY + hint typeName taskNull ; //TASK + hint typeName locationNull ; //LOCATION + hint typeName sideUnknown ; //SIDE + hint typeName text ""; //TEXT + hint typeName configFile ; //CONFIG + hint typeName configNull ; //CONFIG (Since Arma 3 v1.53.133130) + hint typeName missionNamespace ; //NAMESPACE$/Code$ + + $Code$if ( typeName _this != "ARRAY") exitWith { + hint "_this is not an array!" + } + //is the same as + if ( typeName _this != typeName []) exitWith { + hint "_this is not an array!" + } + //is the same as + if !(_this isEqualType []) exitWith { + hint "_this is not an array!"$/Code$ undefined / undefined + (September 25, 2016) + typeName of nil is ANY, however this is not possible to test as script command is just ignored when any argument is nil - Boolean + String + - set3DENModelsVisible + dynamicSimulationSystemEnabled - Enables or disables lines visibility in 3DEN + A getter for enableDynamicSimulationSystem - https://community.bistudio.com/wiki/set3DENModelsVisible + https://community.bistudio.com/wiki/dynamicSimulationSystemEnabled - set3DENModelsVisible Array + dynamicSimulationSystemEnabled - set3DENModelsVisible [map, scene] + dynamicSimulationSystemEnabled - + $Code$hint str dynamicSimulationSystemEnabled ;$/Code$ + undefined / undefined - Nothing + Boolean + - set3DENObjectType + allAirports - Sets the classname of one or more given Eden Editor objects. For Logic objects use set3DENLogicType + Returns all map airports, both static and dynamic - https://community.bistudio.com/wiki/set3DENObjectType + https://community.bistudio.com/wiki/allAirports - Array set3DENObjectType String + allAirports - objects set3DENObjectType classname + allAirports - $Code$[ get3DENMouseOver select 1] set3DENObjectType "B_crew_F"; - // turns object under cursor into a blufor crewman$/Code$ + $Code$_allAirports = allAirports ;$/Code$ undefined / undefined @@ -55037,116 +56502,126 @@ - Nothing + Array + - set3DENSelected + missionNamespace - Changes selection in 3den to what is inside entities array. + Returns the global namespace attached to mission. - https://community.bistudio.com/wiki/set3DENSelected + https://community.bistudio.com/wiki/missionNamespace - set3DENSelected Array + missionNamespace - set3DENSelected entities + missionNamespace - + $Code$missionNamespace setVariable ["YourString",3];//Same as: YourString = 3; + _yourString = missionNamespace getVariable "YourString";$/Code$ + undefined / undefined - Nothing + Namespace + - setAccTime + roadAt - Set time acceleration coefficient. May be also used to slow time in cutscenes. This command does NOT work in multiplayer. accFactor is clamped to [1/128; 4]. + Returns road segment at given position, objNull otherwise. Same as isOnRoad only returns the actual road object instead of boolean. - https://community.bistudio.com/wiki/setAccTime + https://community.bistudio.com/wiki/roadAt - setAccTime Number + roadAt Object/Array - setAccTime accFactor + roadAt position - $Code$setAccTime 0.1$/Code$ + $Code$_road = roadAt ASLToAGL getPosASL player ;$/Code$ + + $Code$_isOnRoad = ! isNull roadAt player ;$/Code$ - undefined / undefined + global / undefined - (August 4, 2006) - Notes from before the conversion: - A good habit to get into is setting the accTime to 1 at the start of all cutscenes, in case the player is running at 4x speed when the scene starts. + (December 30, 2016) + This command does not nessecarly return the segment which center is the closest to the given position. + In order to get such segment use nearRoads. + $Code$_closest_road = (_pos nearRoads 0.1) select 0;$/Code$ - Nothing + Object + - setAirplaneThrottle + getMagazineCargo - Sets a wanted throttle position, works only on player's vehicle. + Returns all magazines types and count from the cargo space - https://community.bistudio.com/wiki/setAirplaneThrottle + https://community.bistudio.com/wiki/getMagazineCargo - Object setAirplaneThrottle Number + getMagazineCargo Object - airplane setAirplaneThrottle value + getMagazineCargo object - + $Code$_content = getMagazineCargo carName;$/Code$ + + $Code$_content = getMagazineCargo ammoBoxName;$/Code$ + + $Code$hint str getMagazineCargo unitBackpack cursorTarget ;$/Code$ + - undefined / undefined + global / undefined - Nothing + Array + - setAirportSide + ctrlSetFontH6B - Set owning side of the airport. ID is the number to identify which airport on the island you want to check. + Sets H6 bold font of given HTML control. - https://community.bistudio.com/wiki/setAirportSide + https://community.bistudio.com/wiki/ctrlSetFontH6B - Number setAirportSide Side - - Object setAirportSide Side + Control ctrlSetFontH6B String - id setAirportSide side - - target setAirportSide side + controlName ctrlSetFontH6B fontName - $Code$0 setAirportSide east$/Code$ + $Code$_control ctrlSetFontH6B "TahomaB"$/Code$ undefined / undefined @@ -55154,503 +56629,493 @@ - Nothing - Nothing + Nothing + - setAmmoCargo + formLeader - Set amount of ammo resources in cargo space of a rearm vehicle. Ammo resource is used to resupply vehicles that take ammo. Soldiers use individual magazines instead. Amount: 1 is full cargo. - The actual quantity to work with is determined by the model's class in CfgVehicles + Returns the formation leader of a given unit. This is often the same as the group leader, but not always, for example in cases when a unit is ordered to follow another unit. - https://community.bistudio.com/wiki/setAmmoCargo + https://community.bistudio.com/wiki/formLeader - Object setAmmoCargo Number + formLeader Object - vehicleName setAmmoCargo ammoCargo + formLeader unitName - $Code$_ammoTruck1 setAmmoCargo 0.5;$/Code$ + $Code$? (formLeader player != leader player) : + hint "The formation leader is different to the group leader!" + returns X$/Code$ - local / global + global / undefined - (31 Aug, 2011) - While the amount of total 'ammo' that can be reloaded is defined in the truck/supply point's CfgVehicles entry, the amount each round of ammunition takes from that total is defined in the CfgAmmo 'Cost' entry for that round. - Your typical truck has 300000 ammo capacity, and the tunguska's missiles have a Cost of 50000. So the tunguska can reload a total of 6 missiles from the ammo truck before the ammo capacity is depleted and needs to be set with setAmmoCargo. - A similar thing applies with a vehicle's cfgVehicle Cost entry for repairing, and the vehicle's fuelCapacity entry when refuelling. - - (July 10, 2015) - (ArmA 3 1.44) setAmmoCargo will have no effect if the vehicle doesn't support getAmmoCargo. - Nothing + Object + - setAmmoOnPylon + sendSimpleCommand - Set count of ammo in magazine on pylon + Sends a simple command to the vehicle's driver / gunner. The player executing command should be in the vehicle. + Gunner commands + "FIRE" + "CEASE FIRE" + "MANUAL FIRE" + "CANCEL MANUAL FIRE" + "KEY FIRE" + Driver commands + "FORWARD" - move forward + "FAST" - move forward, fast + "SLOW" - move forward, slow + "STOP" - stop moving forward or backward + "BACK" - move backward + "LEFT" - turn left, while moving or not + "RIGHT" - turn right, while moving or not + "STOPTURNING" - cancel turning (special case, normally would be called by the engine when LEFT or RIGHT turn key is released by the player) ( since Arma 3 v1.77 ) + "KEY UP" + "KEY DOWN" + "KEY FAST" + "KEY SLOW" - https://community.bistudio.com/wiki/setAmmoOnPylon + https://community.bistudio.com/wiki/sendSimpleCommand - Object setAmmoOnPylon Array + Object sendSimpleCommand String - vehicle setAmmoOnPylon [pylon nameindex, ammo count] + vehicleName sendSimpleCommand command - $Code$( vehicle player ) setAmmoOnPylon [1, 12];$/Code$ + $Code$vehicle player sendSimpleCommand "STOP";$/Code$ undefined / undefined - (August 18, 2017) - The pylon indices start at 1 and not at 0. + Valid commands include: "FORWARD", "SLOW", "FAST" "BACK", "LEFT", "RIGHT", "STOP", "FIRE", "CEASE FIRE", "MANUAL FIRE", "CANCEL MANUAL FIRE". There may be more. + Only vehicles crewed by a player can use sendSimpleCommand. + + Other commands that work: "KEY FIRE", "KEY FAST", "KEY SLOW", "KEY DOWN", "KEY UP". These will simulate key presses. + In Arma 3 player doesn't always need to be in the vehicle to give commands. - Nothing + Nothing + - setAmmo + addCuratorCameraArea - Sets custom ammo count in the currently loaded magazine of the specified weapon. The unit must be local to the computer where command is executed. + Adds or changes curator camera area (depends on if ID is already used). - https://community.bistudio.com/wiki/setAmmo + https://community.bistudio.com/wiki/addCuratorCameraArea - Object setAmmo Array + Object addCuratorCameraArea Array - unit setAmmo [weapon, count] + curatorObj addCuratorCameraArea [cameraAreaID,position,radius] - $Code$// Set player's handgun magazine ammo count to 10 rounds: - player setAmmo [ handgunWeapon player, 10];$/Code$ - - $Code$// Set player's current weapon magazine ammo count to 1 round: - player setAmmo [ currentWeapon player, 1];$/Code$ - - $Code$// If player is a gunner in a vehicle, set current weapon magazine ammo count to 5 rounds: - if ( local vehicle player ) then { - vehicle player setAmmo [ currentWeapon vehicle player, 5]; - } else { - hint "Vehicle must be local to this machine for 'setAmmo' to work"; - };$/Code$ - - $Code$// If you try to set more ammo than the magazine can hold, it will be clipped at default magazine capacity: - player setAmmo [ primaryWeapon player, 1000000]; //full mag with default ammo count$/Code$ + $Code$myCurator addCuratorCameraArea [3, position mySoldier,300];$/Code$ - local / global + undefined / undefined - Nothing + Nothing + - setAnimAimPrecision + isFilePatchingEnabled - Set aimPrecision value of the current animation state (parameter aimPrecision) + Returns true if file patching is enabled otherwise false - https://community.bistudio.com/wiki/setAnimAimPrecision + https://community.bistudio.com/wiki/isFilePatchingEnabled - Object setAnimAimPrecision Number + isFilePatchingEnabled - unit setAnimAimPrecision value + isFilePatchingEnabled - $Code$player setAnimAimPrecision 1$/Code$ - + - global / global + undefined / undefined - Nothing + Boolean + - setAnimSpeedCoef + isEngineOn - Sets a coefficient for animation speed + Returns true if engine is on, false if it is off. - https://community.bistudio.com/wiki/setAnimSpeedCoef + https://community.bistudio.com/wiki/isEngineOn - Object setAnimSpeedCoef Number + isEngineOn Object - unit setAnimSpeedCoef coef + isEngineOn vehicle - $Code$player setAnimSpeedCoef 0.75;$/Code$ + $Code$_OnOff = isEngineOn _carOne$/Code$ - undefined / undefined + global / undefined - (November 14, 2016) - Increasing animation speed of a unit also increases its run/walk speed (thanks to Killzone Kid ) + (March 20, 2015) + isEngineOn returns true for static objects without an engine - (November 27, 2016) - Setting negative values with this makes animations act in reverse or make you stuck sliding in unknown directions. + (April 6, 2015) + Bind Engine action to User Action 1 + $Code$this addAction ["", + { + _this select 1 action + [ + ["EngineOn", "EngineOff"] select isEngineOn (_this select 0), + _this select 0 + ]; + }, "", -10, false, true, "User1", "_this == driver _target"];$/Code$ - Nothing + Boolean + - setApertureNew + screenToWorld - Sets custom camera aperture ([-1] to do it automatically). + Returns the position on landscape ( PositionAGL ) corresponding to the given point on screen (in UI coordinates). - https://community.bistudio.com/wiki/setApertureNew + https://community.bistudio.com/wiki/screenToWorld - setApertureNew Array + screenToWorld Array - setApertureNew [min, std, max, stdLum] + screenToWorld screen - $Code$setApertureNew [0.3, 0.2, 0.1, 1];$/Code$ - - $Code$// Simulate eye adjustment at night: - setDate [2016, 8, 10, 4, 0]; - setApertureNew [2, 8, 14,.9];$/Code$ - - $Code$// Narrower range for a subtler effect: - setDate [2016, 8, 10, 4, 0]; - setApertureNew [2, 5, 9,.8];$/Code$ + $Code$_wPos = screenToWorld [0.5,0.5];$/Code$ undefined / undefined - (October 30, 2016) - Some notes on example 2 - try it outdoors on a piece of ground with high contrasting areas. I suggest the end of a runway, standing among the white painted triangles. - Look up about 60 degrees above the horizon and toggle between setApertureNew [2, 8, 14,.9]; and the default setting of setAperture -1;. There should be little change -- at least on the date in the example. - Reset again to setApertureNew [2, 8, 14,.9]; and then pan slowly down until you're basically looking at your feet. The less sky (the main outdoor light source) you see, the 'wider' (toward the 'min' number) the aperture will become. Looking at the ground on a runway, for example, you should be able to easily distinguish the painted white triangles from the unpainted pavement. Again, toggle back to the default aperture. The view should get much darker. - This setting allows for some natural adjustment based on the amount of visible light in the scene, and is highly encouraged over the default fixed aperature for night missions. When you're standing in the beam of a lighthouse, for example (try near the 'Spartan' on Stratis), you will be basically unable to see anything not illuminated by the beam. Once the beam passes and your vision returns to normal, your immediate surroundings will be dimmer, of course, but you'll be able to see further out. - Nothing + Array + - setAperture + setFaceAnimation - Sets custom camera aperture (-1 to do it automatically). + Set facial animation phase (eye blinking), blink is in the range from 0 to 1. - https://community.bistudio.com/wiki/setAperture + https://community.bistudio.com/wiki/setFaceAnimation - setAperture Number + Object setFaceAnimation Number - setAperture aperture + person setFaceAnimation blink - $Code$setAperture 0.3;$/Code$ + $Code$_soldier1 setFaceAnimation 0.5;$/Code$ undefined / undefined - The aperture value to simulate typical daylight (outdoor) conditions is 50. The aperture value to simulate typical daylight (indoor) conditions is 30. Setting the value to less than 20 will result in a very bright scene, suitable for night conditions. The closer the number is to 0, the more light will be let into the lens, to carry on the aperture metaphor. Different lighting/weather conditions can change the actual indoor and outdoor aperture values. Experiment and test to be sure. + (09:01, 23 December 2008 (CET)) + Setting face animation to 4 will give "devilish" features (ArmA) - Nothing + Nothing + - setArmoryPoints + removeBackpack - Stores passed number into [USERNAME].ArmaXProfile file, where it assigns it as a value to armoryPoints entry. If entry doesn't exist, it is created. + Removes unit's backpack - https://community.bistudio.com/wiki/setArmoryPoints + https://community.bistudio.com/wiki/removeBackpack - setArmoryPoints Number + removeBackpack Object - setArmoryPoints points + removeBackpack unit - $Code$setArmoryPoints ( armoryPoints + 20);$/Code$ + $Code$removeBackpack this ;$/Code$ - $Code$setArmoryPoints 3.14;$/Code$ + $Code$removeBackpack mySoldierDude;$/Code$ - undefined / undefined + local / global - Nothing + Nothing + - setAttributes + shownScoretable - Returns a structured text created by the given structured or plain text by setting attributes to the given values. + Returns the state of the score table set with showScoretable command. + Since Arma 3 v1.63.137869, the previous functionality of this command (score table visibility check) is moved to visibleScoretable command. Please update your scripts and sorry for any inconvinience. - https://community.bistudio.com/wiki/setAttributes + https://community.bistudio.com/wiki/shownScoretable - String/Structured_Text setAttributes Array + shownScoretable - text setAttributes [name1, value1, name2, value2,] + shownScoretable - $Code$txt = img setAttributes ["image", "data\iSoldier.paa"]$/Code$ + $Code$_state = shownScoretable ;$/Code$ undefined / undefined - (November 9, 2014) - This command doesn't seem to work in Arma 3. - Structured_Text + Number + - setAutonomous + nearestLocationWithDubbing - Sets UAV autonomous mode. + Find the nearest location (to the given position) having it speech non-empty. - https://community.bistudio.com/wiki/setAutonomous + https://community.bistudio.com/wiki/nearestLocationWithDubbing - Object setAutonomous Boolean + nearestLocationWithDubbing Object/Array - uav setAutonomous bool + nearestLocationWithDubbing position - $Code$uav setAutonomous true ;$/Code$ - + undefined / undefined - Nothing + Location + - setBehaviour + assignedTeam - Sets group behaviour mode. If a unit is given as argument, behaviour is set for the unit's group. Behaviour is one of: - "CARELESS" - "SAFE" - "AWARE" - "COMBAT" - "STEALTH". - See this page for details of the effect of this command on AI units. For Arma 3 see Arma_3_AI_Behavior + Returns the team the unit belongs to. Possible values: + MAIN (default and white) + RED + GREEN + BLUE + YELLOW + This command will return nil if given unit is objNull, remoteControling another unit or is not local - https://community.bistudio.com/wiki/setBehaviour + https://community.bistudio.com/wiki/assignedTeam - Group setBehaviour String + assignedTeam Object - groupName setBehaviour behaviour + assignedTeam unitName - $Code$_group1 setBehaviour "SAFE";$/Code$ + $Code$_team = assignedTeam player ;$/Code$ - local / global + local / undefined - Warning! Since ArmA v.1.14 the command setBehaviour "COMBAT" do not work correctly any loger. - Units ( Groups ) which are using this behaviour and then get a move order, will not move to the given position. - - Although setBehaviour can be called on an individual unit, the entire group will be affected. + (December 13, 2014) + As of Arma 3 version 1.36. assignedTeam might return nil instead of any of the STRINGs above if the player is currently remote controlling a unit. + $Code$ assignedTeam player + - $/Code$ - If setting a behaviour on an individual unit is required, it can be achieved by creating a temporary group, use joinSilent to make the individual unit belong to that group, then change his behaviour, use joinSilent into the original group, then delete the temporary group. + (May 23, 2017) + Executed on server also nothing is returned... so arguments need to be local. - Nothing + String/Nothing + - setBleedingRemaining + dissolveTeam - Sets for how many seconds injured unit leaves blood trail. The unit damage must be = 0.1 for this command to have an effect, otherwise, the getBleedingRemaining will return 0 and no blood trail is left behind. + Dissolves the given team. All members become members of the main team. Possible team values are: "RED", "GREEN", "BLUE" or "YELLOW". - https://community.bistudio.com/wiki/setBleedingRemaining + https://community.bistudio.com/wiki/dissolveTeam - Object setBleedingRemaining Number + dissolveTeam String - unit setBleedingRemaining time + dissolveTeam teamColor - $Code$_unit setBleedingRemaining 60;$/Code$ - - $Code$player setDamage 0.25; - player setBleedingRemaining 120;$/Code$ + $Code$dissolveTeam "RED"$/Code$ - undefined / undefined + local / undefined - Nothing + Nothing + - setCamShakeDefParams + forceWeatherChange - Sets camera shake default params, the default camshake when, for example, you freelook at your character shooting a 12.7mm sniper rifle or firing tank cannon. Would also work in 1st person. + Forces saved wanted settings for weather to be actual (BEWARE: Will cause lag). + NOTE The engine has own idea about the weather and will interfere with your scripted weather at every opportunity it gets. So don't give it the opportunity. In the editor's Intel there are Manual Override setting for many aspects of the weather. Select them to disable engine interference. Some commands such as setWaves and setLightnings will not even work until their respective settings are set to manual. - https://community.bistudio.com/wiki/setCamShakeDefParams + https://community.bistudio.com/wiki/forceWeatherChange - setCamShakeDefParams Array + forceWeatherChange - setCamShakeDefParams [power, duration, frequency, minSpeed, minMass, caliberCoefHit, vehicleCoef] + forceWeatherChange - $Code$setCamShakeDefParams [1, 2, 3, 4, 5,.5,.5];$/Code$ - - $Code$setCamShakeDefParams [100, 10, 10, 4, 5, 1, 1];$/Code$ + $Code$240 setOvercast 1; + 360 setRain 1; + forceWeatherChange ; comment "force immediate change overriding smooth transition";$/Code$ undefined / undefined - (December 1, 2014) - Doesn't appear to have any effect in ArmA 3. + This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - setCamShakeParams + ctSetCurSel - Set camera shake parameters. - Will not have any effect until shake is started via addCamShake. + Selects the line with the given index. Will take only rows, but not headers into account. -1 deselects all. Returns Nothing. - https://community.bistudio.com/wiki/setCamShakeParams + https://community.bistudio.com/wiki/ctSetCurSel - setCamShakeParams Array + Control ctSetCurSel Number - setCamShakeParams [posCoef, vertCoef, horzCoef, bankCoef, interpolation] + Control ctSetCurSel Number - $Code$setCamShakeParams [0.1, 1, 1, 1, true];$/Code$ + $Code$_control ctSetCurSel 0;$/Code$ - undefined / undefined + local / local - Nothing + Nothing + - setCamUseTI + getMousePosition - Activates thermal vision. Mode index defines what sort of thermal vision it is: - 0 - White Hot - 1 - Black Hot - 2 - Light Green Hot / Darker Green cold - 3 - Black Hot / Darker Green cold - 4 - Light Red Hot /Darker Red Cold - 5 - Black Hot / Darker Red Cold - 6 - White Hot. Darker Red Cold - 7 - Thermal (Shade of Red and Green, Bodies are white) - This command only works with camCreate created camera that is currently the main camera for the player (see example). + Returns mouse position in UI coordinates. - https://community.bistudio.com/wiki/setCamUseTI + https://community.bistudio.com/wiki/getMousePosition - Boolean setCamUseTI Number + getMousePosition - Bool setCamUseTI modeIndex + getMousePosition - $Code$true setCamUseTI 1;$/Code$ - - $Code$// "Preditor" vision: - _cam = "camera" camCreate [0,0,0]; - _cam camSetTarget player ; - _cam camSetRelPos [0,1,1.5]; - _cam cameraEffect ["Internal","Back"]; - _cam camCommit 0; - true setCamUseTI 7;$/Code$ + $Code$_pos = getMousePosition ;$/Code$ undefined / undefined @@ -55658,27 +57123,30 @@ - Nothing + Array + - setCameraInterest + setMusicEventHandler - Set camera interest for given entity. Camera interest is by default 0. Any unit which is speaking has its camera interest raised to 50. Camera interest is used to focus camera to control depth of field in cutscenes. Combination of camera interest, unit position of the screen, unit movement, unit type, and some other properties is used to determine which unit to focus at. Higher camera interest increases the chance of the unit being focused. + Sets given music track event handler. Will overwrite other music event handlers. Use addMusicEventHandler if you want to stack them. - https://community.bistudio.com/wiki/setCameraInterest + https://community.bistudio.com/wiki/setMusicEventHandler - Object setCameraInterest Number + setMusicEventHandler Array - entity setCameraInterest interest + setMusicEventHandler [type, function] - $Code$_soldier setCameraInterest 50;$/Code$ + $Code$_ehID = setMusicEventHandler ["MusicStart", " hint str _this"];$/Code$ + + $Code$_ehID = setMusicEventHandler ["MusicStop", " hint str _this"];$/Code$ undefined / undefined @@ -55686,208 +57154,198 @@ - Nothing + Number + - setCaptive + allowDamage - Mark a unit as captive. If unit is a vehicle, commander is marked. A captive is neutral to everyone (belong to civilian side ), and will not trigger "detected by" conditions for its original side. - Using a number (instead of a boolean) for the status has no further effect on the engine's behavior, but can be used by captiveNum to keep track of the captivity status at a finer resolution (e.g. handcuffed, grouped, etc.). The numbered status syntax was introduced in Arma 2. + Allow or prevent an object being damaged (or injured, or killed). The command does not prevent object from taking scripted damage such as setHit, setHitIndex, setHitPointDamage or setDamage. To check if damage is allowed at current locality, see isDamageAllowed. + ! + This command has to be executed where object is local and as long as object does not change locality the effect of this command will be global. If object changes locality, the command needs to be executed again on the new owner 's machine to maintain the effect - https://community.bistudio.com/wiki/setCaptive + https://community.bistudio.com/wiki/allowDamage - Object setCaptive Boolean - - Object setCaptive Number + Object allowDamage Boolean - unitName setCaptive status - - unitName setCaptive status + object allowDamage allow - $Code$_soldier1 setCaptive true ;$/Code$ - - $Code$_soldier1 setCaptive 1;$/Code$ + $Code$player allowDamage false ;$/Code$ local / global - (August 4, 2006) - This function does not remove unit's weapons. - If you make a unit captive, that unit will still fire on the enemy, but the enemy will not fire back. - - (January 1, 2011) - If you change a unit from captive to no longer captive (for example, to "reveal" an undercover unit), enemy units that already have prior knowledge of the unit as a captive will only partially engage, making it very easy for the undercover unit. This seems to be a bug. - However other enemy unit the unit later encounters will engage freely with full force. + (September 2, 2013) + $Code$_object allowDamage false$/Code$ + has the same effect as + $Code$_object addEventHandler ["HandleDamage", {0}]$/Code$ + (except for buildings that are native to the map; for those, the effects of HandleDamage will not sync properly across all clients, even if added to the building on every client and the server) - Nothing - Nothing + Nothing + - setCenterOfMass + diarySubjectExists - Changes the center of mass of an object smoothly during the given time (in seconds). A time of zero (or using the alternative syntax) means an immediate change. + Checks whether given subject is present in the diary of given person. - https://community.bistudio.com/wiki/setCenterOfMass + https://community.bistudio.com/wiki/diarySubjectExists - Object setCenterOfMass Array + Object diarySubjectExists String - myObject setCenterOfMass [com, time] - - myObject setCenterOfMass com + person diarySubjectExists name - $Code$myObject setCenterOfMass [[0,-1,0],0.5];$/Code$ - - $Code$myObject setCenterOfMass [0,-1,0];$/Code$ - + - local / global + undefined / undefined - (20 Jun, 2014) - (ArmA3 1.22) A quick reference: - category - setMass - setCenterOfMass - unit - The larger the mass is, the easier a unit will physically fatigued - N/A - aircraft - The larger the mass is, the more sensitive an aircraft will react to joystick, vice versa. - Aircraft slant due to center change accordingly, and the position of the camera view will be altered relatively at the same time. (3rd person view) - vehicle - The larger the mass is, the slower a vehicle drives (Ships will sink), vice versa. (Land vehicle performs like a bouncing ball while ships accelerated pretty speedy.) - Vehicle slant due to center change accordingly. - Nothing + Boolean + - setCollisionLight + getHitIndex - Switches collision lights of a vehicle on/off. Note that the vehicle has to be local, for global variant use Arma 3 Actions "CollisionLightOn"/"CollisionLightOff" + Return current level of damage for a specific Hit Point (specified by its hit part index). All hit points can be obtained with getAllHitPointsDamage command. + 0: no damage + 1: full damage - https://community.bistudio.com/wiki/setCollisionLight + https://community.bistudio.com/wiki/getHitIndex - Object setCollisionLight Boolean + Object getHitIndex Number - vehicle setCollisionLight set + vehicle getHitIndex hitPartIndex - $Code$heli setCollisionLight true ;$/Code$ + $Code$vehicle player getHitIndex 3;$/Code$ - local / global + global / undefined - Nothing + Number/Nothing + - setCombatMode + hostMission - Set group combat mode (engagement rules). - Mode may be one of: - " BLUE " (Never fire) - " GREEN " (Hold fire - defend only) - " WHITE " (Hold fire, engage at will) - " YELLOW " (Fire at will) - " RED " (Fire at will, engage at will) + Host the mp mission described by config class. Should be called as reaction to some UI action in some dialog. + For example you can start a MP scenario from a button. It creates a host and takes you to the lobby with the scenario loaded. + You need to provide the display which is active when the hostMission command is called. - https://community.bistudio.com/wiki/setCombatMode + https://community.bistudio.com/wiki/hostMission - Object/Group setCombatMode String + hostMission Array - groupName setCombatMode mode + hostMission [pConfig, pDisplay] - $Code$_group1 setCombatMode "BLUE"$/Code$ + $Code$hostMission [configMissionName, display];$/Code$ + + $Code$hostMission [ configFile /"CfgMissions"/"MPMissions"/_scenarioClassName, _currentlyActiveDisplay];$/Code$ + + $Code$// Launch host mission dialog in Arma 3 from a client on dedicated server + hostMission [ + configFile "CfgMissions" "MPmissions" "MP_COOP_m01", + findDisplay 46 + ];$/Code$ - local / global + undefined / undefined + (January 03, 2011) + The command must be called in the main menu or something similar menu it seems. - Nothing + Nothing + - setCompassOscillation + isCopilotEnabled - Sets compass oscillation. + Returns true if copilots actions are enabled. - https://community.bistudio.com/wiki/setCompassOscillation + https://community.bistudio.com/wiki/isCopilotEnabled - setCompassOscillation Array + isCopilotEnabled Object - setCompassOscillation [angle, frequencyMin, frequencyMax] + isCopilotEnabled vehicle - $Code$setCompassOscillation [1, 1, 1];$/Code$ + $Code$if (! isCopilotEnabled myHeli) then { + myHeli enableCopilot true ; + };$/Code$ - undefined / undefined + global / undefined + (February 17, 2014) + Only returns whether or not the actions are enabled and shown to the pilot and co-pilot. This will still return TRUE if the pilot uses the 'Lock Controls' action to disable co-pilot controls. + You can use the Arma 3 Event Handler - Controls Shifted to detect 'Take Controls' or 'Release Controls' actions - Nothing + Boolean + - setConvoySeparation + rain - Sets the distance to keep to the vehicle which is in front. - This command has to be applied to all vehicles in a convoy in order to have a separation of, for example, 50 m. - Vehicles in a convoy can also have different distances. - It's recommended that small values ( 10m) should only be used for slowly moving convoys, otherwise AI driven vehicles will leave the road frequently to avoid collisions + Returns the current value of rain density in range 1...0 - https://community.bistudio.com/wiki/setConvoySeparation + https://community.bistudio.com/wiki/rain - Object setConvoySeparation Number + rain - vehicle setConvoySeparation distance + rain - $Code$vehicle setConvoySeparation 20;$/Code$ + $Code$_rainLevel = rain ;$/Code$ undefined / undefined @@ -55895,454 +57353,460 @@ - Nothing + Number + - setCuratorCameraAreaCeiling + magazinesDetailVest - Sets maximal height to which curator camera can move. + Returns an array with the type names of all the unit's vest magazines. - https://community.bistudio.com/wiki/setCuratorCameraAreaCeiling + https://community.bistudio.com/wiki/magazinesDetailVest - Object setCuratorCameraAreaCeiling Number + magazinesDetailVest Object - curatorObj setCuratorCameraAreaCeiling height + magazinesDetailVest unit - $Code$myCurator setCuratorCameraAreaCeiling 50;$/Code$ + $Code$magazinesDetailVest player$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Array + - setCuratorCoef + serverCommandAvailable - Sets coef for some action (coef have to be bigger than -1 000 000, anything lower is considered as disabled action). + Returns true if given serverCommand is available on current machine, false if not. Here is the general table of availability of Arma 3 server commands: + Available to anyone + #login, #userlist, #beclient, #vote + Available to any admin (voted in / logged in) or server host + #kick, #debug + Available to logged in admin or server host + #lock, #unlock, #maxping, #maxdesync, #maxpacketloss + Available to any admin (voted in / logged in) + #logout, #restart, #mission, #missions, #reassign, #monitor, #init + Available to logged in admin + #shutdown, #restartserver, #exec, #beserver, #monitords, #logentities, #exportjipqueue + Available to logged in admin on certain game builds + #captureframe, #enabletest, #disabletest + To check if server command could be executed in current environment use serverCommandExecutable. For more information on what each server command does, see Multiplayer Server Commands. + NOTE : When password variant of serverCommand is used on dedicated server, the table above does not apply as everything is available to it. - https://community.bistudio.com/wiki/setCuratorCoef + https://community.bistudio.com/wiki/serverCommandAvailable - Object setCuratorCoef Array + serverCommandAvailable String - curatorObj setCuratorCoef [action,coef] + serverCommandAvailable command - $Code$curatorModule setCuratorCoef ["Place", 1]$/Code$ + $Code$_can = serverCommandAvailable "#kick";$/Code$ - $Code$curatorModule setCuratorCoef ["Delete", -1e10]$/Code$ + $Code$if ( serverCommandAvailable "#logout") then + { + hint "You are a some sort of admin"; + };$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - - (March 25, 2015) - Possible actions are: - place - edit - delete - destroy - group - synchronize - Nothing + Boolean + - setCuratorEditingAreaType + ctrlSetFontH5B - Set whether curator can edit in all editing areas (true) or outside of them (false). + Sets H5 bold font of given HTML control. - https://community.bistudio.com/wiki/setCuratorEditingAreaType + https://community.bistudio.com/wiki/ctrlSetFontH5B - Object setCuratorEditingAreaType Boolean + Control ctrlSetFontH5B String - curatorObj setCuratorEditingAreaType bool + controlName ctrlSetFontH5B fontName - $Code$curatorModule setCuratorEditingAreaType true$/Code$ + $Code$_control ctrlSetFontH5B "TahomaB"$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - setCuratorWaypointCost + sizeOf - Sets cost of waypoints (used for placing, editing and deleting). + Returns the diameter of bounding sphere of the object of given type in meters. Size returned is usually bigger than the biggest size of the object along any of the axes. For example if object is 10 x 4 x 5 the sizeOf value returned expected to be around 10. If you need to estimate the size of the object more precisely, use boundingBox or boundingBoxReal. + NOTE: The object has to be present in current mission to be able to read its size (otherwise zero will be returned). - https://community.bistudio.com/wiki/setCuratorWaypointCost + https://community.bistudio.com/wiki/sizeOf - Object setCuratorWaypointCost Number + sizeOf String - curatorObj setCuratorWaypointCost cost + sizeOf type - $Code$myCUrator setCuratorWaypointCost 0.1;$/Code$ + $Code$_dimension = sizeOf "M1Abrams"; //returns 10.7833$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Number + - setCurrentChannel + serverTime - Sets given channel as current chat channel. Scripted way of selecting desired channel on the UI. The given channel may be disabled (see enableChannel ), this is why this command returns boolean, true on success or false on failure. Correspondence between channel and number: - 0 = Global - 1 = Side - 2 = Command - 3 = Group - 4 = Vehicle - 5 = Direct - 6-15 = Custom Radio (see radioChannelCreate ) + Server time synchronized to clients. Returns always 0 in Singleplayer. + Note that in ArmA2 1.05 Final, this command only returns the time since the Server was actually started. + NOTE: serverTime is available to both server and clients and shows the same value when synced. The only time it is not synced is on the server, right after server restart and only for the first 300 seconds. Client side serverTime is synced from the start. serverTime is also different from server time and server diag_tickTime - https://community.bistudio.com/wiki/setCurrentChannel + https://community.bistudio.com/wiki/serverTime - setCurrentChannel Number + serverTime - setCurrentChannel channel + serverTime - $Code$_isDirectSelected = setCurrentChannel 5; // sets Direct channel as current active$/Code$ + $Code$hint format ["Synced server time : %1", serverTime ];$/Code$ - undefined / local + global / undefined - (December 9, 2015) - This command can be used together with custom radio channels, but an offset of 5 must be added to the index from radioChannelCreate. - $Code$_index = radioChannelCreate [[1, 0, 0, 1], "Custom Channel 1", "%UNIT_NAME", [player]]; - setCurrentChannel (_index + 5); - $/Code$ + (Sep 8, 2010(CEST) 19:31) + There is a bug in this command, about 3 minutes after missionstart this command returns something completely different. + See http://dev-heaven.net/issues/13581 for further infomation. - Boolean + Number + - setCurrentTask + removeMagazines - Set the task as a current task of the person. + Remove all magazines of given type from the unit. + Note: You may create invalid combinations with this function. When doing so, application behaviour is undefined. - https://community.bistudio.com/wiki/setCurrentTask + https://community.bistudio.com/wiki/removeMagazines - Object setCurrentTask Task + Object removeMagazines String - object setCurrentTask task + unitName removeMagazines magazineName - $Code$player setCurrentTask tskKillSpongebob;$/Code$ + $Code$player removeMagazines "M16";$/Code$ - undefined / undefined + local / undefined + Though BIS did not provide a command to remove all magazines of every type, it can still be accomplished using forEach magazines. example: + {player removeMagazine _x} forEach magazines player - Nothing + Nothing + - setCurrentWaypoint + pixelW - Sets the currently active waypoint for a group. + Returns width of one pixel for current resolution. - https://community.bistudio.com/wiki/setCurrentWaypoint + https://community.bistudio.com/wiki/pixelW - Object/Group setCurrentWaypoint Array + pixelW - groupName setCurrentWaypoint waypoint + pixelW - $Code$_grp setCurrentWaypoint [_grp, 1];$/Code$ + $Code$_pixelWidth = pixelW ;$/Code$ - local / undefined + undefined / undefined - (27 Aug 2007) - (A1 1.08) Does not seem to work with Game Logic. Crashes to desktop. - - (26 Nov 2008) - Note that a waypoints number as seen in the mission editor is not the same as it's waypoint number using this command. In the mission editor, waypoint 0 refers to the first placed waypoint, whereas waypoint 0 with the setCurrentWaypoint command refers to the unit's initial position waypoint. - - (17 Jan 2010) - (A2 1.05) This command may crash the game to desktop if you call it from the on act field of a waypoint that belongs to that same unit. - - (13 Aug 2012) - Using this command forces the last waypoint to complete. Any code in the on Act of that waypoint will run. - Nothing + Number + - set + getMarkerType - Changes the element at the given (zero-based) index of the array. - If the element does not exist, resize index+1 is called to create it. + Returns the type of a given marker. See cfgMarkers for a list of standard markers. - https://community.bistudio.com/wiki/set + https://community.bistudio.com/wiki/getMarkerType - Array set Array + getMarkerType String - array set [index, value] + getMarkerType markerName - $Code$_arrayOne set [0, "Hello"];$/Code$ - - $Code$_arrayTwo set [ count _arrayTwo, "Bye"]; - // appends "Bye" as last element to _arrayTwo$/Code$ - - $Code$_arrayThree set [( count _arrayThree) - 1, 23]; - // replaces the last element of _arrayTwo with 23$/Code$ + $Code$"MarkerOne" setMarkerType "Destroy" + _type = getMarkerType "MarkerOne" + returns "Destroy"$/Code$ - undefined / undefined + global / undefined - Nothing + String + - setCustomAimCoef + getGroupIcons - Set custom aim precision coefficient for weapon sway + Returns all group icons. [id,icon,[offsetx,offsety],[..],..] - https://community.bistudio.com/wiki/setCustomAimCoef + https://community.bistudio.com/wiki/getGroupIcons - Object setCustomAimCoef Number + getGroupIcons Group - unit setCustomAimCoef coef + getGroupIcons group - $Code$player setCustomAimCoef 1;$/Code$ - + - undefined / undefined + global / undefined - Nothing + Array + - setDamage + ropes - Damage / repair object. Damage 0 means fully functional, damage 1 means completely destroyed / dead. (This function is an alias of setDammage and was introduced to fix the obvious spelling error in the original function name) - Since Arma 3 v1.67 there is an alternative syntax to this command allowing to switch off destruction effects. + Returns a vehicle's rope objects in an Array. - https://community.bistudio.com/wiki/setDamage + https://community.bistudio.com/wiki/ropes - Object setDamage Number - - Object setDamage Array + ropes Object - object setDamage damage - - object setDamage [damage, useEffects] + ropes vehicle - $Code$_soldier1 setDamage 1;$/Code$ + $Code$hint str ( ropes vehicle player );$/Code$ - $Code$_house1 setDamage [1, false ];$/Code$ + $Code$_rope1 = ( ropes heli1) select 0;$/Code$ - global / global + undefined / undefined - In OFP, setting a unit's damage to a negative value will set it's health to full, but impair their aim. - - (May 29, 2015) - Using this possible overrides individual hit damages such as setHitPointDamage ["HitHead", _value]; if you're having issues try setting hitdamage after setdamage + (05 April, 2014) + The ropes command seems to return each individual sling load rope. ropes will return an empty Array if the sling load ropes are not deployed. Ropes as of A3 1.33 have a cfgVehicles classname of "Rope". - Nothing - Nothing + Array + - setDammage + camUseNVG - Damage / repair object. - Damage 0 means fully functional, damage 1 means completely destroyed / dead. - Alias of setDamage, which was introduced to fix a spelling error in this operator's name. + Set / clear using of night vision during cutscenes. This command only works with camCreate created camera that is currently the main camera for the player (see example). - https://community.bistudio.com/wiki/setDammage + https://community.bistudio.com/wiki/camUseNVG - Object setDammage Number + camUseNVG Boolean - object setDammage damage + camUseNVG set - $Code$_soldier1 setDammage 1;$/Code$ + $Code$camUseNVG true ;$/Code$ + + $Code$setDate [2000,12,31,0,0]; + _cam = "camera" camCreate [0,0,0]; + _cam camSetTarget player ; + _cam camSetRelPos [0,-5,3]; + _cam cameraEffect ["Internal","Back"]; + _cam camCommit 0; + camUseNVG true ;$/Code$ - global / global + undefined / undefined - In OFP, setting a unit's damage to a negative value will set it's health to full, but impair their aim. - Nothing + Nothing + - setDate + getClientState - Sets the actual mission date and time. + Returns client state in network game. Works on both, client and dedicated server. The following states are possible: + getClientStateNumber + getClientState + 0 + "NONE" + No client (or singleplayer) + 1 + "CREATED" + Client is created + 2 + "CONNECTED" + Client is connected to server, message formats are registered + 3 + "LOGGED IN" + Identity is created + 4 + "MISSION SELECTED" + Mission is selected + 5 + "MISSION ASKED" + Server was asked to send / not send mission + 6 + "ROLE ASSIGNED" + Role was assigned (and confirmed) + 7 + "MISSION RECEIVED" + Mission received + 8 + "GAME LOADED" + Island loaded, vehicles received + 9 + "BRIEFING SHOWN" + Briefing was displayed + 10 + "BRIEFING READ" + Ready to play mission + 11 + "GAME FINISHED" + Game was finished + 12 + "DEBRIEFING READ" + Debriefing read, ready to continue with next mission - https://community.bistudio.com/wiki/setDate + https://community.bistudio.com/wiki/getClientState - setDate Array + getClientState - setDate [year, month, day, hour, minute] + getClientState - $Code$setDate [1986, 2, 25, 16, 0]; //(4:00pm February 25, 1986)$/Code$ + $Code$_state = getClientState ;$/Code$ - $Code$// Set real date: - //postInit = 1; - if ( isServer ) then { - waitUntil { time 0}; - setDate ( missionStart select [0,5]); - };$/Code$ + $Code$if ( getClientState == "BRIEFING READ") then { hint "Let the show begin!"};$/Code$ - local / local + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - - This command is special in that it is "smart". If you add 120 minutes, for example, it will actually advance hours by 2, and so on. - 10:00, 7/12/2010 (BST) - - This command sets the date for the southern hemisphere only, i.e. when the map is in northern hemisphere a date [2010,12,7,17,0] is in day light and and date [2010,6,7,17,0] is in darkness. - 21:35, 31 October 2011 (EET) - - In multiplayer, the effect of this command is local, not global. The date from the server is synchronized with clients when they join the game (including start of the mission and joining in progress). E.g. if this command is executed on server in the init.sqf before the mission starts, every client will be synchronized with server as mission is started. However, if you run this command in the middle of the mission, effect is local. - 10 September 2013 (EET) - - This command is JIP compatible. Players joining after mission start will get current server date set up. - - (October 4, 2014) - Since an unknown version of ARMA 3, this command now has global effect when executed on the server. - - (February 5, 2015) - Arma 3 1.38.128937- Leapyear BUG - setdate [2016,12,31,23,59] yields an ingame date of the 1st of January 2017. If left to tick over from the 30th of December it ticks to 1st January skipping the 31st of December entirely. - Feedback_Link - - (April 23, 2017) - Regarding execution in the middle of a session, the post of MulleDK13 is not entirely true. If you don't change the year, you are perfectly fine when executing the command on the server only. However, the server does not sync the year. Hence, if you do change the year, you have to execute the command on the server, clients and JIP to account for the missing sync. e.g. - $Code$[[], { setDate [1986, 2, 25, 16, 0]}] remoteExec [" call ",0,"JIP_id_setDate"];$/Code$ - Nothing + String + - setDebriefingText + pixelH - Sets debriefing text for endType defined in CfgDebriefing. - This command is broken. https://feedback.bistudio.com/T85682 + Returns the height of one pixel for current resolution. - https://community.bistudio.com/wiki/setDebriefingText + https://community.bistudio.com/wiki/pixelH - String setDebriefingText Array + pixelH - endType setDebriefingText [title, description] + pixelH - $Code$_currentObjective = ( taskDescription ( currentTask player )) select 2; - "endDeath" setDebriefingText ["You Lose","All of your men were killed while assaulting the " + _currentObjective];$/Code$ + $Code$_pixelHeight = pixelH ;$/Code$ undefined / undefined @@ -56350,937 +57814,930 @@ - Nothing + Number + - setDefaultCamera + setPiPEffect - Sets the position and direction for the camera used after camera is set on no object (log out view when leaving MP game for example) + Sets Render Target's visual effect (Picture-in-Picture). + 0: Normal - [0] + 1: Night Vision - [1] + 2: Thermal - [2] + 3: Color Correction - [3, enabled, brightness, contrast, offset, blend [r,g,b,a], lerp [r,g,b,a], rgb [r,g,b,a]] + 4: Mirror - [4] currently not working + 5: Chromatic Aberration - [5, enabled, powerx, powery, (bool) aspectCorrection] currently not working + 6: Film Grain - [6, enabled, intensity, sharpness, grainsize, intensityx1, intensityx2, (bool) monochromatic] currently not working + 7: Thermal Inverted [7] - https://community.bistudio.com/wiki/setDefaultCamera + https://community.bistudio.com/wiki/setPiPEffect - setDefaultCamera Array + String setPiPEffect Array - setDefaultCamera [position, direction] + name setPiPEffect [effect, optionalParam1,, optionalParamN] - $Code$setDefaultCamera [[5000,5000,200],[1,1,-1]];$/Code$ + $Code$"rendersurface" setPiPEffect [0];$/Code$ - $Code$// Lift camera 100m up above current player position and point downwards: - setDefaultCamera [ ATLtoASL ( player modelToWorld [0,0,100]),[0,0,-1]];$/Code$ + $Code$"rendertarget0" setPiPEffect [3, 1.0, 1.0, 1.0, 0.0, [0.0, 1.0, 0.0, 0.25], [1.0, 0.0, 1.0, 1.0], [0.199, 0.587, 0.114, 0.0]];$/Code$ + + $Code$cam = "camera" camCreate ( player modelToWorld [0,-5,2]); + cam cameraEffect ["internal","back","rtt"]; + "rtt" setPiPEffect [2]; + with uiNamespace do { + pic = findDisplay 46 ctrlCreate ["RscPicture", -1]; + pic ctrlSetPosition [0,0,1,1]; + pic ctrlCommit 0; + pic ctrlSetText "#(argb,512,512,1)r2t(rtt,1.0)"; + };$/Code$ + + $Code$// Black&White: + "rtt" setPiPEffect [3,1,1,0.4,0,[0,0,0,0],[1,1,1,0],[1,1,1,1]];$/Code$ undefined / undefined + (July 9, 2017) + If Color Corrections effect has been used, going back to Normal will have no effect. In order to unset Color Corrections, set 2nd param in it (enable) to 0. - Nothing + Nothing + - setDestination + lbSetData - Set the destination for path planning of the pilot. - Possible values for planningMode are: - "DoNotPlan" - used when not moving - "DoNotPlanFormation" - used in formation when simple path testing is used - "LEADER PLANNED" - used for formation leader (full path finding used) - "LEADER DIRECT" - used for DirectGo (like getin, supply) - "FORMATION PLANNED" - used in formation when full path finding is used - "VEHICLE PLANNED" - used for vehicle driver - Works best when used on agents + Sets the additional text (invisible) in the item with the given index of the listbox or combobox with id idc of the topmost user dialog to the given data. - https://community.bistudio.com/wiki/setDestination + https://community.bistudio.com/wiki/lbSetData - Object setDestination Array + lbSetData Array + + Control lbSetData Array - object setDestination [position, planningMode, forceReplan] + lbSetData [idc, index, data] + + control lbSetData [index, data] - $Code$bob setDestination [ screenToWorld [0.5,0.5], "LEADER PLANNED", true ]$/Code$ + $Code$lbSetData [101, 1, "#1"];$/Code$ + + $Code$_control lbSetData [1, "#1"];$/Code$ - local / global + undefined / undefined + More information on the LB command family can be found here - Nothing + Nothing - Nothing + - setDetailMapBlendPars + cursorObject - Sets the detail texture map blend pars. Allows for smooth transition between detailed and undetailed terrain texture at distance. If noDetail fullDetail, the texture detail will incur smooth transition in the area between the thresholds. If noDetail = fullDetail there will be obvious visible edge between texture detail changes at fullDetail distance. + Returns the object under cursor. This command is quite different from cursorTarget as it is more precise in determining the boundaries of the pointed at object and can detect a larger variety of objects including map objects and trees. - https://community.bistudio.com/wiki/setDetailMapBlendPars + https://community.bistudio.com/wiki/cursorObject - setDetailMapBlendPars Array + cursorObject - setDetailMapBlendPars [fullDetail, noDetail] + cursorObject - $Code$setDetailMapBlendPars [20, 50];$/Code$ - - $Code$setDetailMapBlendPars ( if ( currentWeapon player in [ - "Binocular", - "Rangefinder", - "Laserdesignator" - ]) then [ - {[300,600]}, - {[20,50]} - ]);$/Code$ + $Code$hint str [ getModelInfo cursorObject, typeOf cursorObject ];$/Code$ - undefined / local + undefined / undefined + (March 23, 2015) + If you point at the primary weapon of an infantry unit, cursorObject will return the p3d of the weapon instead of the unit itself (B Alpha 1-2:1.. or its variable name ). That doesn't occur for anything else (backpack or headgear). - Nothing + Object + - setDirection + primaryWeapon - Set's the orientation of a location. It's area and map icon (if it's type uses an icon) will be rotated to this orientation. + Returns name of unit's primary weapon (empty string if none). - https://community.bistudio.com/wiki/setDirection + https://community.bistudio.com/wiki/primaryWeapon - Location setDirection Number + primaryWeapon Object - location setDirection direction + primaryWeapon unit - $Code$location1 = createLocation ["VegetationPalm", getPos player, 200, 200]; - location1 setText "Benargee's Palm Tree"; - location1 setDirection 45;$/Code$ + $Code$_pWeap = primaryWeapon player ;$/Code$ + + $Code$hint primaryWeapon player ; //"arifle_MX_ACO_pointer_F"$/Code$ - undefined / undefined + global / undefined + (August 4, 2006) + primaryWeapon tells you what weapon the unit has irrespective of the status of the weapon. For example a unit that has an M16 on his back will still report an M16 as its primary weapon. + + (October 11, 2015) + To directly detect the active weapon use currentWeapon command. - Nothing + String + - setDir + playSound3D - Sets object heading. Angles are measured in degrees clockwise from north. The accepted heading range is from 0 to 360 Negative angles represent a counter-clockwise angle and the angle can be of any size. + Plays positional sound with given filename on every computer on network. At least 2 parameters must be specified. - https://community.bistudio.com/wiki/setDir + https://community.bistudio.com/wiki/playSound3D - Object setDir Number + playSound3D Array - object setDir heading + playSound3D [filename, soundSource, isInside, soundPosition, volume, soundPitch, distance] - $Code$_soldier1 setDir 45 - // Will set soldier1 to face North East$/Code$ + $Code$playSound3D ["A3\Sounds_F\sfx\blip1.wav", player ]$/Code$ + + $Code$playSound3D ["A3\Sounds_F\sfx\blip1.wav", player, false, getPosASL player, 1, 1, 0]$/Code$ - $Code$_soldier1 setDir -675 - // Will also set soldier1 to face North East$/Code$ + $Code$// Sound file extension must be specified even if a config entry has none: + playSound3D ["A3\Sounds_F\sfx\alarm_independent", player ]; //no sound + playSound3D ["A3\Sounds_F\sfx\alarm_independent.wss", player ]; //alarm$/Code$ - local / global + global / global - (November 27, 2013) - Make sure you setDir BEFORE you set position. Setting direction after set position could lead to unpredictable behaviour. For example main part of the hospital building in Arma 3 can lose collision detection near both side entrances. AI will also can get confused and will stop detecting obstacles if setDir called after setPos. - - (May 9, 2007) - Though effects of this command remain local, you can do a setPos afterwards to synchronize the direction on all machines in MP. - $Code$myObj setDir 90; - myObj setPos getPos myObj;$/Code$ - - (January 9, 2009) - In ArmA, the effect of setDir is synchronized across the network. - - (April 5th, 2011) - In OA 1.59 the comment of Manny still holds true for createVehicle'd empty vehicles by the server. - For the player object a local setDir alone is enough. - - (July 10, 2010) - In ArmA 2 OA, this command only makes the unit glance momentarily to the direction. To change his heading more permanently use setFormDir. + (September 23, 2013) + This command works well with addon sounds, however getting it to play mission sound files is a bit tricky. Follow this guide - (August 28, 2013) - Be careful letting the command to do the conversion for you when the angle is 0 or 360 - $Code$ player setDir 360+1; - hint str direction player ; //1 - player setDir -360+1; - hint str direction player ; //1.00001 - player setDir 360*5+1; - hint str direction player ; //1.00002 - player setDir -360*5+1; - hint str direction player ; //0.999972 - player setDir 360*10+1; - hint str direction player ; //0.999876 - player setDir -360*10+1; - hint str direction player ; //1 - player setDir 360*100000+1; - hint str direction player ; //358.24 - player setDir -360*100000+1; - hint str direction player ; //1.76001 - player setDir 360*10000000+1; - hint str direction player ; //298.591 - player setDir -360*10000000+1; - hint str direction player ; //61.4094$/Code$ + (September 26, 2014) + Currently, playSound3D is not JIP compatible, so joining players will not hear the sound if is started before and is still playing when player joins. - (November 25, 2013) - In Arma 3, setDir affects vectorUp, vectorDir and velocity of the object it applied to. While this is not noticeable with stationary objects, a moving objects will have its orientation and velocity reset. So if you are planning on using setDir on a moving object, make sure you read the velocity value before and restore it after if you want the object to continue to move. - $Code$_vel = velocity _object; - _object setDir 45; - _object setVelocity _vel; - $/Code$ - With orientation it is a bit more complicated. setDir resets vectorUp to [0,0,1] and changes vectorDir accordingly to accommodate set direction. If your object's vectorUp is not [0,0,1] and you want to keep it this way, then you have to use setVectorDirAndUp to change object's direction not setDir. This is also the reason why it is better to use setVectorDirAndUp instead of setDir on attached objects for a better control of object's orientation. + (October 16, 2013) + You need to get the correct path for custom mission sounds. Use missionConfigFile with BIS_fnc_trimString (to trim off " description.ext "), then add your mission's sound directory and sound file: + $Code$_soundPath = [( str missionConfigFile ), 0, -15] call BIS_fnc_trimString; + _soundToPlay = _soundPath + "sounds\some_sound_file.ogg"; + playSound3D [_soundToPlay, _sourceObject, false, getPos _sourceObject, 10, 1, 50]; + //Volume db+10, volume drops off to 0 at 50 meters from _sourceObject$/Code$ - (November 22, 2014) - To setDir for AI unit, setFormDir first: - $Code$_ai setFormDir 180; - _ai setDir 180;$/Code$ + (November 8, 2014) + When object is supplied but not a position, the position is taken from object, otherwise the position is taken from supplied position. That doesn't mean that when position is taken from object it is going to follow object when it changes position. The sound is generated at object position and it stays there. - Nothing + Nothing + - setDrawIcon + setLightAttenuation - Set the icon to be shown in 2D editor for the specified editor object. If maintain size is false,icon will not scale depending on the scale,of the map. If maintain size is a number,the icon will maintain size,if map scale is below that number. is3D,show line and priority are,optional. - i - Some Old Editor Command + Sets attenuation of light. Standard method of attenuation (1 / (constant + linear*dist + quadratic*dist*dist)). start param represents distance, where the attenuation starts to take effects (dist = distance - start). - https://community.bistudio.com/wiki/setDrawIcon + https://community.bistudio.com/wiki/setLightAttenuation - Control setDrawIcon Array + Object setLightAttenuation Array - map setDrawIcon [object,texture,color,offset,width,height,maintain size,angle,string identifier,shadow,is3D,draw line,priority] + light setLightAttenuation [start, constant, linear, quadratic, hardlimitstart, hardlimitend] - + $Code$myLight setLightAttenuation [2,4,4,0,9,10];$/Code$ + - undefined / undefined + local / local + (Mar 25, 2014) + (A3 1.14) setLightAttenuation array will present fallowing visual effects: + [start(SCALAR), constant(SCALAR), linear (SCALAR), quadratic(SCALAR)] + start(SCALAR) – Number can be unlimited, this parameter determines the range that the light source takes effect. Terrain environmental color will be bathed by ‎setLightAmbient within the range and its covered objects will reflect the color by ‎setLightColor. + constant(SCALAR) – Support signed number, this parameter determines the brightness proportion of the light source, higher the number is, less the brightness will be, vice versa. Any minus value passed will be treated as 0 (100% brightness). In other words, this parameter is related with ‎‎setLightBrightness and ‎setLightIntensity. + linear (SCALAR) – Support signed number, effective range is from 0 ~ 100 (passed minus value will be treated as 0), this parameter determines the concentration of the light source, higher the number is, more will the light concentrate, vice versa. In other words, this parameter will turn the source into spotlight and sharpens its light circle border. + Please pay attention to a special value: 4.31918e-005 + e.g. + $Code$ + _light setLightAttenuation [2,4, 4.31918e-005,0]; //This value will make the light source reach an ultra high effect range. Any initial param set before will be discarded and overwritten. + $/Code$ + quadratic(SCALAR) – Support signed number (range unlimited, passed minus number will be treated as 0), this parameter determines the range that the light source is visible and its visual presentation looks similar to linear. 0 means the maximum visible range. In further explanation, a less bright source can’t be seen out of the range on the land but still visible on the sea, and a bright enough source won’t be effected by the passed range who is still visible out of the range. + Please pay attention to a special value: 4.31918e-005 + e.g. + $Code$ + _light setLightAttenuation [6,0,0, 4.31918e-005 ]; //This value will make the light source reach an ultra high effect range. Any initial param set before will be discarded and overwritten. + $/Code$ - Nothing + Nothing + - setDriveOnPath + removeItemFromBackpack - Sets the path to follow for AI driver + Removes item from soldier's backpack. - https://community.bistudio.com/wiki/setDriveOnPath + https://community.bistudio.com/wiki/removeItemFromBackpack - Object setDriveOnPath Array + Object removeItemFromBackpack String - vehicleName setDriveOnPath [points] + unit removeItemFromBackpack item - $Code$myVehicle setDriveOnPath [[1000,10,1000],[1100,10,1000]]$/Code$ - + - undefined / undefined + global / global - Nothing + Nothing + - setDropInterval + breakTo - Set interval of emitting particles from particle source. In Arma 3 hardcoded limit of how many particles can exist at the same time is 18000. Correspondence between CfgCloudlets class param name and command param: - $Code$particleSource setDropInterval interval;$/Code$ + Breaks block to scope named name. Nil is returned. + Scope name can be assigned using scopeName command. - https://community.bistudio.com/wiki/setDropInterval + https://community.bistudio.com/wiki/breakTo - Object setDropInterval Number + breakTo String - particleSource setDropInterval interval + breakTo name - $Code$_source setDropInterval 0.05;$/Code$ + $Code$scopeName "main"; + while { true } do { + scopeName "loop1"; + while { true } do { + scopeName "loop2"; + if (condition1) then { breakTo "main"}; // Breaks all scopes and return to "main" + if (condition2) then { breakOut "loop2"}; // Breaks scope named "loop2" + sleep 1; + }; + sleep 1; + };$/Code$ undefined / undefined + (May 18, 2017) + This command can not be used to re-execute scopes in which command is inside of. Example: + $Code$scopeName "whatever"; + if true then { + breakTo "whatever" + }; + $/Code$ + The example above will not make the engine jump back to line 1 and re-execute the 2nd line. Instead, it will just jump across line 2 to line 5 if it [ line 5 ] exists. - Nothing + Nothing + - setDynamicSimulationDistanceCoef + lockWP - Sets activation distance multiplier of Arma_3_Dynamic_Simulation for the given class + Disable switching to next waypoint (current waypoint will never complete while lockwp is used). Sometimes used during cut-scenes. - https://community.bistudio.com/wiki/setDynamicSimulationDistanceCoef + https://community.bistudio.com/wiki/lockWP - String setDynamicSimulationDistanceCoef Number + Object/Group lockWP Boolean - class setDynamicSimulationDistanceCoef multiplier + groupName lockWP lock - $Code$"IsMoving" setDynamicSimulationDistanceCoef 3;$/Code$ + $Code$_groupOne lockWP true ;$/Code$ + + $Code$_Soldier lockWP true ;$/Code$ + + $Code$_MyTank lockWP false ;$/Code$ - undefined / undefined + local / local - Nothing + Nothing + - setDynamicSimulationDistance + getAllEnvSoundControllers - Sets activation distance of Arma_3_Dynamic_Simulation for given category + Returns an array containing the names and values of environmental variables that can be used in simple expressions when configuring sounds. - https://community.bistudio.com/wiki/setDynamicSimulationDistance + https://community.bistudio.com/wiki/getAllEnvSoundControllers - String setDynamicSimulationDistance Number + getAllEnvSoundControllers Position - category setDynamicSimulationDistance distance + getAllEnvSoundControllers position - $Code$"Group" setDynamicSimulationDistance 1000;$/Code$ + $Code$getAllEnvSoundControllers position player ; + // Result: + //[["rain",0],["night",0],["wind",0.161588],...]$/Code$ undefined / undefined - (March 19, 2017) - Desired distances for "Group" and "Vehicle" must be based on viewDistance and fog to exclude any rendering problems with frequently moving objects. Example: - $Code$"Group" setDynamicSimulationDistance (( viewDistance * 0.8) - ( viewDistance * fog)) - // 80% of maximum rendering and fog distance$/Code$ - But that might impair objects simulations if you are using long-scope optics, so there's a even better solution using cameraView with it: - $Code$[] spawn { - while { true } do { - if ( cameraView isEqualTo "GUNNER") then { - "Group" setDynamicSimulationDistance (( viewDistance - ( viewDistance * fog )); - // Scoped - } else { - "Group" setDynamicSimulationDistance (( viewDistance * 0.8) - ( viewDistance * fog )); - // Not scoped - }; - uiSleep 0.25; - }; - }; - $/Code$ + (March 25, 2018) + This command will return data on the following attributes; + rain, night, wind, daytime, meadows, trees, houses, forest, sea, coast, altitudeGround. alititudeSea, shooting, deadbody and fog - Nothing + Array + - setEditorMode + diag_fps - Sets map mode to MAP,3D or PREVIEW. - i - Some Old Editor Command + Returns average framerate calculated over last 16 frames. - https://community.bistudio.com/wiki/setEditorMode + https://community.bistudio.com/wiki/diag_fps - Control setEditorMode String + diag_fps - map setEditorMode mode + diag_fps - + $Code$diag_log diag_fps;$/Code$ + undefined / undefined + (November 19, 2014) + The engine will always calculate the last 16 frames without caring if they are frames in which the loading screen was drawn, or actual mission frames. - Nothing + Number + - setEditorObjectScope + getPlayerChannel - This command defines the level of access a user has to editor objects. - "objects" is an array of either Editor Objects (eg ["_unit_0"]) or actual Game Objects (eg [player]). If the array is empty then the command will automatically parse all editor objects. - "editorType" is the editor type to effect (eg "unit", "vehicle", "center") or "" for all types. - "condition" is an executable string that must evaluate to true or false. If true, the scope of the evaluated editor object will be modified. "_x" can be used in the string as reference to the ingame representation of the currently processed array member. - "scope" is one of "HIDE", "VIEW", "SELECT", "LINKTO", "LINKFROM", "ALLNODRAG", "ALLNOTREE", "ALLNOCOPY", "ALLNOSELECT" or "ALL". - "subordinatesAlso" is a boolean value. If true then subordinates in the editor will be assigned the same scope as the parent. - i - Some Old Editor Command + Returns channel number for given player, provided that player is speaking, otherwise -1. Having mic on is not enough, player has to make a sound. There are several limitations to this command: + It does not work on dedicated server, the return is always -1, only client can detect other client talking. + It does not detect when someone talks on direct chat at all anywhere. + The client on which command is executed has to able to receive transmission before the transmission channel can be detected. For example if a player is not in the same group as a speaker and the speaker speaks on Group Channel, the player cannot hear the speaker and therefore cannot detect what channel the speaker is on. + In short, this command mimics the speaking icon from the UI. Correspondence between channel and number: + 0 = Global + 1 = Side + 2 = Command + 3 = Group + 4 = Vehicle + 5 = Direct (Is not detected by getPlayerChannel ) + 6-15 = Custom Radio (see radioChannelCreate ) - https://community.bistudio.com/wiki/setEditorObjectScope + https://community.bistudio.com/wiki/getPlayerChannel - Control setEditorObjectScope Array + getPlayerChannel Object - map setEditorObjectScope [objects, editorType, condition, scope, subordinatesAlso] + getPlayerChannel player - $Code$_map setEditorObjectScope [ [],"vehicle", "side effectiveCommander _x != side player", "HIDE", false]$/Code$ - - $Code$((findDisplay 128) displayCtrl 51) setEditorObjectScope [ ["_unit_0"], "", "true", "ALLNODRAG", false]$/Code$ + $Code$_channel = getPlayerChannel player ;$/Code$ - undefined / undefined + global / undefined - Nothing + Number + - setEffectCondition + lbSetTooltip - The statement is executed when the trigger or waypoint is activated and the effects are launched depending on the result. - If the result is a boolean and true, the effect is launched. - If the result is an object, the effect is launched if the result is the player or the player vehicle. - If the result is an array, the effect is launched if the result contains the player or the player vehicle. + Sets tooltip for item with given index of the listbox or combobox with id idc of the topmost user dialog to the given data. - https://community.bistudio.com/wiki/setEffectCondition + https://community.bistudio.com/wiki/lbSetTooltip - Object setEffectCondition String + lbSetTooltip Array - Waypoint setEffectCondition String + Control lbSetTooltip Array - trigger setEffectCondition statement + lbSetTooltip [idc, index, tooltip] - waypoint setEffectCondition statement + control lbSetTooltip [index, tooltip] - $Code$_triggerObj setEffectCondition "thisList";$/Code$ + $Code$lbSetTooltip [101, 1, "tooltip"];$/Code$ + + $Code$_control lbSetTooltip [0, "another tooltip"];$/Code$ - undefined / undefined + local / local + More information on the LB command family can be found here + + (August 9, 2017) + [ ArmA 3 v1.75.142535 ] if you want to put linebreaks into a tooltip, use this method: + $Code$format [ "%1,%2%3", "hi", parseText "\n", "my name is Will" ]$/Code$ - Nothing - Nothing + Nothing - Nothing + - setFSMVariable + doFollow - Set variable to given value in the variable space of given FSM. - The FSM handle is the number returned by the execFSM command. + Order the given unit(s) to follow the given other unit or vehicle eg (without radio messages). Also is used to resume unit formation after doStop, just doFollow leader even if it is the leader himself you want to resume (see Example 2). - https://community.bistudio.com/wiki/setFSMVariable + https://community.bistudio.com/wiki/doFollow - Number setFSMVariable Array + Object/Array doFollow Object - handle setFSMVariable [name, value] + unitName doFollow unitName2 - $Code$_handle = execFSM "test.fsm"; - _handle setFSMVariable ["_foo", 23]; - - // sets variable _foo in the FSM to 23$/Code$ + $Code$_soldier1 doFollow _soldier2$/Code$ + + $Code$units _group doFollow leader _group;$/Code$ - undefined / undefined + local / global - (March 23, 2014) - If the variable is not yet defined within the FSM it will be created. + These commands ( doFollow or commandFollow ) work only if the two units are in the same group. + + (August 29, 2016) + The name of this command is a bit misleading, it is used to make a unit return to the formation of its group or subformation. - Nothing + Nothing + - setFace + ctrlTextWidth - Set person's face. For a list of available faces, check Category:CfgIdentities. + Returns the control text width. Supported control types are: + CT_STATIC 0 + CT_EDIT 2 + CT_STRUCTURED_TEXT 13 - https://community.bistudio.com/wiki/setFace + https://community.bistudio.com/wiki/ctrlTextWidth - Object setFace String + ctrlTextWidth Control - person setFace face + ctrlTextWidth control - $Code$soldier1 setFace "WhiteHead_02"$/Code$ - - $Code$// Set persistent face for a unit in MP - if ( isServer ) then {[_unit, "AsianHead_A3_02"] remoteExec ["setFace", 0, _unit]};$/Code$ + $Code$_w = ctrlTextWidth _ctrl;$/Code$ - global / local + undefined / undefined - (September 19, 2013) - For ArmA 3 face can be any of the following: - AfricanHead_01 - AfricanHead_02 - AfricanHead_03 - AsianHead_A3_01 - AsianHead_A3_02 - AsianHead_A3_03 - GreekHead_A3_01 - GreekHead_A3_02 - GreekHead_A3_03 - GreekHead_A3_04 - GreekHead_A3_05 - GreekHead_A3_06 - GreekHead_A3_07 - GreekHead_A3_08 - GreekHead_A3_09 - PersianHead_A3_01 - PersianHead_A3_02 - PersianHead_A3_03 - NATOHead_01 - WhiteHead_02 - WhiteHead_03 - WhiteHead_04 - WhiteHead_05 - WhiteHead_06 - WhiteHead_07 - WhiteHead_08 - WhiteHead_09 - WhiteHead_10 - WhiteHead_11 - WhiteHead_12 - WhiteHead_13 - WhiteHead_14 - WhiteHead_15 - - (unknown) - For ArmA 2 the face value is a string from Face01 to Face107. Camo faces are available as well, 6 per face. For example the full set of class names for face value 77 would be: - Face77, Face77_camo1, Face77_camo2, Face77_camo3, Face77_camo4, Face77_camo5 and Face77_camo6 - All Armed Assault 1.08 faces plus tutorial, - Online gallery of 1.08 Armed Assault faces - a full list of Arma 2 faces - Nothing + Number + - setFaceAnimation + allControls - Set facial animation phase (eye blinking), blink is in the range from 0 to 1. + Returns a list of all controls for desired existing display. Returned controls also include controls from control groups - https://community.bistudio.com/wiki/setFaceAnimation + https://community.bistudio.com/wiki/allControls - Object setFaceAnimation Number + allControls Display - person setFaceAnimation blink + allControls display - $Code$_soldier1 setFaceAnimation 0.5;$/Code$ + $Code$_allCtrls = allControls findDisplay 46;$/Code$ undefined / undefined - (09:01, 23 December 2008 (CET)) - Setting face animation to 4 will give "devilish" features (ArmA) - Nothing + Array + - setFatigue + disableSerialization - Sets the person's fatigue, from 0 to 1. + Disable saving of script containing this command. After this, the script can work with data types which do not support serialization (UI types). + NOTE : When using spawn command, if the argument passed to it is Display or Control, an error will show asking to consider to disable serialization because of use of _this variable. What's more neither disableSerialization no use of uiNamespace will solve this. Passing Display or Control as part of an array however, will do the job: + $Code$ findDisplay 46 spawn { hint str _this}; // serialization error + [ findDisplay 46] spawn { hint str (_this select 0)}; // OK $/Code$ - https://community.bistudio.com/wiki/setFatigue + https://community.bistudio.com/wiki/disableSerialization - Object setFatigue Number + disableSerialization - unit setFatigue value + disableSerialization - $Code$player setFatigue 1;$/Code$ + $Code$disableSerialization ; + _display = findDisplay 46;$/Code$ - global / local + undefined / undefined - (05 April, 2014) - setFatigue will affect fatigue of a local unit only. If you execute it on remote unit, the getFatigue value will only change locally with no effect on remote unit. Scripted setFatigue changes don't broadcast at all. In short, use setFatigue on local units only. + (19 June, 2010) + Can be used to detecting load. Scope with disabled serialization is discontinued after load, even if there's endless loop inside. + _loaded = [] spawn { disableSerialization ; waitUntil { false };}; + waitUntil { scriptDone _loaded;}; + hint "Game was loaded!" + Works for all possible load types - loading user save, loading autosave and resuming mission from main menu. + Use with caution, as it handles two threads in memory, having impact at overall scripting time. + + (23 October, 2013) + If you do not store UI elements ( Display, Control ) in variables, you do not need disableSerialization ; UI elements are usually returned by scripting commands such as findDisplay or passed as params in UI event handler scripts ( displayAddEventHandler, ctrlAddEventHandler ). + This code will require disableSerialization : $Code$ disableSerialization ; + _display = findDisplay 123; + _ctrl = _display displayCtrl -1; + _ctrl ctrlSetText "LOL";$/Code$ + This code will not: $Code$ findDisplay 123 displayCtrl -1 ctrlSetText "LOL";$/Code$ + + (July 25, 2017) + In ArmA 3 1.72.142223, a scripted FSM does somehow not work with disableSerialization. As a workaround, store a display inside an array. + Example: $Code$_d = [ findDisplay idd ];$/Code$ - Nothing + Nothing + - setFeatureType + move - Enable/disable object as a feature/landmark. Possible feature types: - 0 - Feature disabled - 1 - Object is always visible within object view distance - 2 - Object is always visible within terrain view distance - The limit is 500 map/static objects and 200 dynamic objects including config features and auto features (flying helicopters, airplanes). When limit is reached, function returns false. + Let group move to given position (format Position or Position2D ) without waypoint. Active waypoints will be ignored when command is used. - https://community.bistudio.com/wiki/setFeatureType + https://community.bistudio.com/wiki/move - Object setFeatureType Number + Object/Group move Array - object setFeatureType type + group move position - $Code$// Set a building to be always rendered: - building setFeatureType 2;$/Code$ + $Code$_groupOne move position player ;$/Code$ - global / local + local / global - Boolean + Nothing + - setFlagAnimationPhase + estimatedEndServerTime - Sets flag position on the flag pole according to the given animation phase, where 0 is the bottom of the flag pole, 1 is the top of the flag pole. The changes to the flag position are local to the PC command is executed on. To animate flag use BIS_fnc_animateFlag + Estimated end of MP game in seconds converted to serverTime. - https://community.bistudio.com/wiki/setFlagAnimationPhase + https://community.bistudio.com/wiki/estimatedEndServerTime - Object setFlagAnimationPhase Number + estimatedEndServerTime - flag setFlagAnimationPhase phase + estimatedEndServerTime - $Code$_flag1 setFlagAnimationPhase 0.5;$/Code$ + $Code$// Estimated minutes left: + _min = ( ceil ( estimatedEndServerTime - serverTime ) / 60);$/Code$ - global / local + undefined / undefined - Nothing + Number + - setFlagOwner + assignAsCargoIndex - Sets flag owner. When owner is set to objNull or any object other than a unit of class man or logic, flag is returned to the flagpole. A flag owned by a logic has no visual representation. + Assigns the character to a specific cargo / passenger index of the given vehicle. - https://community.bistudio.com/wiki/setFlagOwner + https://community.bistudio.com/wiki/assignAsCargoIndex - Object setFlagOwner Object + Object assignAsCargoIndex Array - flag setFlagOwner owner + character assignAsCargoIndex [vehicle, index] - $Code$_flag1 setFlagOwner _soldier1;$/Code$ - - $Code$// To return the flag back to the flag pole: - //Method 1: (set owner null) - flag _flagCarrier setFlagOwner objNull ; - //Method 2: (set the flag mast as the owner) - flag _flagCarrier setFlagOwner flag _flagCarrier;$/Code$ + $Code$player assignAsCargoIndex [myHelicopter, 1];$/Code$ - global / global + undefined / undefined - Since flags can not be owned by vehicles, use "flag setFlagOwner driver tank1" or "flag1 setFlagOwner tank1D" to assign the flag to the vehicle's driver. The second method will only work if tank1 is the name of a unit, not a variable refering to it. True for OFP&Arma - Nothing + Boolean + - setFlagSide + removeAllWeapons - Sets flag Side. A flag may be taken by any unit that is enemy to the side that owns the flag. Just like with setFlagTexture, if the command executed where unit is local effect of the command will be global and JIP compatible. + Remove all weapons and magazines of the unit. + On vehicles only ammo is removed + Does not remove map, compass, radio. Use + unitname removeweapon "itemmap" + for that purpose. - https://community.bistudio.com/wiki/setFlagSide + https://community.bistudio.com/wiki/removeAllWeapons - Object setFlagSide Side + removeAllWeapons Object - flag setFlagSide side + removeAllWeapons unitName - $Code$_flag1 setFlagSide east ;$/Code$ - - $Code$// Capturable OPFOR flag: - private _flag = "FlagPole_F" createVehicle position player ; - _flag setFlagTexture "\A3\Data_F\Flags\Flag_CSAT_CO.paa"; - _flag setFlagSide east ;$/Code$ + $Code$removeAllWeapons player ;$/Code$ local / global + (October 14, 2014) + removeAllWeapons doesn't quite work with vehicles. If you need to remove all weapons from a vehicle, remove each weapon individually: + $Code${tank removeWeapon _x} forEach weapons tank;$/Code$ - Nothing + Nothing + - setFlagTexture + terrainIntersect - Sets flag texture. - If texture is "", flag is not drawn. - Custom texture can be used, as long as it is in *.jpg format, and has dimensions of 200px*200px. - The page Flag Textures shows which textures are available in each game. - NOTE : In MP this command has to be executed where Flag Pole is local. If you add Flag Pole in the editor, it will be local to the server, so executing setFlagTexture on the server will change flag texture on all clients. The command is also persistent and is synchronised for JIP clients. + Checks for intersection of terrain between two AGL positions. Returns true if intersects with terrain. For ASL variant see terrainIntersectASL - https://community.bistudio.com/wiki/setFlagTexture + https://community.bistudio.com/wiki/terrainIntersect - Object setFlagTexture String + terrainIntersect Array - flag setFlagTexture texture + terrainIntersect [pos1, pos2] - $Code$_flagE setFlagTexture "\ca\misc\data\sever_vlajka.paa";$/Code$ - - $Code$_flagW setFlagTexture "\ca\misc\data\usa_vlajka.paa";$/Code$ - - $Code$flag1 setFlagTexture "\A3\Data_F\Flags\Flag_red_CO.paa";$/Code$ - - $Code$flagARMA3 setFlagTexture "\a3\ui_f\data\Logos\arma3_expansion_ca.paa";$/Code$ + $Code$_intersects = terrainIntersect [ getPos player, getPos chopper];$/Code$ - $Code$// Capturable OPFOR flag: - private _flag = "FlagPole_F" createVehicle position player ; - _flag setFlagTexture "\A3\Data_F\Flags\Flag_CSAT_CO.paa"; - _flag setFlagSide east ;$/Code$ + $Code$_intersects = terrainIntersect [ position player, position enemy1];$/Code$ - local / global + undefined / undefined + (may 31, 2012) + Please note the difference : + terrainIntersect + terrainIntersectASL + lineIntersect s + lineIntersect s With + lineIntersect s Objs + intersect + + (may 31, 2012) + This command is CPU intensive on the engine, be careful with its use. + + (Jun 23, 2012) + This command was changed to ATL and counterpart for ASL was added in build 94049. - Nothing + Boolean + - setFog + say - Changes the fog smoothly over the the given TransitionTime (in seconds). A time of zero means there will be an immediate change. A fog intensity of zero is minimum fog and a fog level of one is maximum fog. - NOTE : Since Arma 3 this command is MP synchronised, if executed on server, the changes will propagate globally. If executed on client effect is temporary as it will soon change to the server setting. - A little information about how Alt Syntax works. The fogValue is normal fog value that could be set independently with original setFog command. fogBase is the ASL altitude at which the fog will start. 0 is the sea level. fogDecay is how defined the fog start is. The more defined, the denser is the fog. 1 (or -1) are the max values. If it is positive the fog will be generated below fogBase line, if negative, above it. If fogDecay is small, the fog will transition more smoothly from no fog to full fog, and because of that it will cross fogBase line by quite a lot, depending on how small is fogDecay value. Current values of fogDecay and fogBase can be retrieved with fogParams + Unit will say given sound. + When the Unit is a Person, it will also perform corresponding lipsync effect provided an appropriate.lip file has been created for this sound. + A unit that has been killed or does not exist will not say anything. + Compare this with playSound which will always play a sound at the location of the player. + If the camera is not within given range, title is not shown and the sound will not be heard. + Sound is defined in CfgSound of the Description.ext. + NOTE: say will mimic either say2D or say3D depending on whether it is there executed in a cut scene or in a game scene. - https://community.bistudio.com/wiki/setFog + https://community.bistudio.com/wiki/say - Number setFog Number + Object say String - Number setFog Array + Object say Array + + Array say String + + Array say Array - time setFog fog + from say sound - time setFog [fogValue, fogDecay, fogBase] + from say [sound, maxTitlesDistance, speed] + + [from, to] say sound + + [from, to] say [sound, maxTitlesDistance, speed] - $Code$15 setFog 0.5;$/Code$ - - $Code$// Force no fog: - 0 setFog 0; - forceWeatherChange ; - 999999 setFog 0;$/Code$ - - $Code$0 setFog [1, 0.01, 0];$/Code$ - - $Code$// Mountain fog, starts from 70m ASL and thickens more the higher you climb: - 0 setFog [1, -1, 70];$/Code$ - - $Code$// Valley fog, starts from 60m ASL and thickens more the lower you descend: - 0 setFog [1, 1, 60];$/Code$ + $Code$( units player select 1) say ["whisper1",5];$/Code$ - $Code$// Fooooog on the waaaater: - 0 setFog [1, 1, 0];$/Code$ + $Code$// Arma 3: + player say "scuba_breath";$/Code$ - undefined / global + global / local - This scripting command must be executed on the server to work properly in multiplayer - - Only one script command induced weather change (either setOvercast or setFog) can be happening at a time. Starting a new weather change will immediately halt the current weather change. SetRain changes are independent and can occur simultaneously to a weather change. - - (December 15, 2015) - setTimeMultiplier DOES affect transition time. + (7 March 2013) + Say will occur in 3D when the player is active, during cutscenes it will not. Use say3D for cutscenes. - Nothing - Nothing + Nothing - Nothing - Nothing - Nothing + - setFormDir + ropeAttachedTo - Set group formation heading. Accepted heading range is 0 to 360. Formation is facing this direction unless enemy is seen. When group is moving, this value is overriden by movement direction. + Returns the object it is attached to by rope - https://community.bistudio.com/wiki/setFormDir + https://community.bistudio.com/wiki/ropeAttachedTo - Object/Group setFormDir Number + ropeAttachedTo Object - group setFormDir heading + ropeAttachedTo vehicle - $Code$_group1 setFormDir 180;$/Code$ - - $Code$_unit1 setFormDir random 360;$/Code$ - - $Code$//center the main turret - ( group BIS_Crew1) setFormDir ( getDir BIS_Armor);$/Code$ + $Code$_heli = ropeAttachedTo veh1;$/Code$ - local / global + undefined / undefined - (November 22, 2014) - When applied to AI, setFormDir will set unit formation direction, which in turn will force unit to change direction to match formation direction, however unit will stop turning as soon as unit direction is +/- 30 degrees of the formation direction. To precisely match formation direction, additional setDir is required: - $Code$_unit setFormDir 45; - _unit setDir 45; - hint str direction _unit; //45$/Code$ - Nothing + Object + - setFormationTask + queryItemsPool - Set the current task of the formation member. + Returns the number of items of type in the weapon pool (used in campaigns to transfer weapons to the next mission). - https://community.bistudio.com/wiki/setFormationTask + https://community.bistudio.com/wiki/queryItemsPool - Object setFormationTask String + queryItemsPool String - object setFormationTask task + queryItemsPool name @@ -57288,201 +58745,192 @@ undefined / undefined - (16:57, 2 March 2007 (CET)) - Nothing + Number + - setFormation + showSubtitles - Set group formation. - Formation is one of: - "COLUMN" - "STAG COLUMN" - "WEDGE" - "ECH LEFT" - "ECH RIGHT" - "VEE" - "LINE" - "FILE" (ArmA) - "DIAMOND" (ArmA) + Enables / disables showing of subtitles in a chat. Only scripted/engine chatter is affected, player manual chat is unaffected. Returns the previous state. - https://community.bistudio.com/wiki/setFormation + https://community.bistudio.com/wiki/showSubtitles - Object/Group setFormation String + showSubtitles Boolean - group setFormation formation + showSubtitles enable - $Code$_groupOne setFormation "LINE"$/Code$ + $Code$showSubtitles false;$/Code$ - local / global + undefined / local - Nothing + Boolean + - setFriend + isUniformAllowed - Sets how friendly side1 is with side2. For a value smaller than 0.6 it results in being enemy, otherwise it's friendly. - Intended to be used on mission start. Changing value during mission can cause unexpected errors in AI behavior. See also Side relations. + Check whether given uniform can be dressed by target soldier. - https://community.bistudio.com/wiki/setFriend + https://community.bistudio.com/wiki/isUniformAllowed - Side setFriend Array + Object isUniformAllowed String - side1 setFriend [side2, value] + unit isUniformAllowed type - $Code$west setFriend [ resistance, 0];$/Code$ + $Code$_canUse = _unit isUniformAllowed "U_B_CombatUniform_mcam";$/Code$ - undefined / global + global / undefined - This scripting command must be executed on the server to work properly in multiplayer - - (18:49, 28 December 2006) - This command might be buggy in ArmA (or the description regarding enemy status is wrong). See this discussion. - - (11:25, 30 November 2007) - Setting the civilian side to be the enemy of any other side will result in the other side attacking inanimate mission editor placed objects such as empty vehicles and static objects, since these objects belong to the civilian side. - - (15:57, 27 February 2008) - Be aware that this command only sets the friendliness of one side. If you want to have both sides attacking each other, you have to set both: $Code$Resistance setFriend [East, 0]; - East setFriend [Resistance, 0];$/Code$ - - (October 11, 2014) - (Arma 3 1.30 stable) It is possible to make a side hostile towards itself. - $Code$ west setFriend [ west, 0]; $/Code$ - It is only possible to do so with west / blufor, east / opfor, independent / resistance and civilian. This essentially creates a free for all deathmatch. Affects AI behaviour too. - Nothing + Boolean + - setFromEditor + assignedVehicle - Set if given team member was inserted directly from editor. + Returns the vehicle a unit is assigned to. If no vehicle is assigned objNull is returned. - https://community.bistudio.com/wiki/setFromEditor + https://community.bistudio.com/wiki/assignedVehicle - Team_Member setFromEditor Boolean + assignedVehicle Object - teamMember setFromEditor fromEditor + assignedVehicle unit - $Code$_teamMember setFromEditor true$/Code$ + $Code$_vehicle = assignedVehicle player ;$/Code$ - undefined / undefined + local / undefined - Nothing + Object + - setFuel + positionCameraToWorld - Sets fuel percentage from 0 (empty) to 1 (full). The vehicle must be local to the computer where command is executed. + Transforms position from camera coordinate space to world coordinate space. + Camera axes are relative to camera orientation. x axis goes from left of the camera to right of the camera, z axis goes from underneath the camera to above the camera and y axis goes from back of the camera to where the camera is looking. - https://community.bistudio.com/wiki/setFuel + https://community.bistudio.com/wiki/positionCameraToWorld - Object setFuel Number + positionCameraToWorld PositionRelative - vehicle setFuel amount + positionCameraToWorld cameraPos - $Code$_jeepOne setFuel 0.5;$/Code$ + $Code$_worldPos = positionCameraToWorld _cameraPos;$/Code$ + + $Code$// Example demonstrating reversed y and z: + player setDir 0; //assuming player is looking forward + hint str [ positionCameraToWorld [0,0,0], positionCameraToWorld [0,0,1]]; + //[[2481.35,567 1.21,1.51395],[2481.35,567 2.21,1.46955]]$/Code$ - local / global + undefined / undefined - - - Nothing - - - + (October 17, 2008) + By measuring the distance between the camera and the player one can determine whether 1st-person or 3rd-person view is being used: + $Code$ if (( positionCameraToWorld [0,0,0] distance player ) 2) then { hint "3rd person"} else { hint "1st person"};$/Code$ + + (22:45, 17 October 2010 (CEST)) + The camera coordinate system is different from the model coordinate system: when modelToWorld uses [x, y, z] then positionCameraToWorld uses [x, z, y]. So for a steady camera the following is true: + $Code$ positionCameraToWorld [5,10,15] == _camera modelToWorld [5,15,10];$/Code$ + + (July 20, 2014) + When over land, the position returned is in format PositionATL, and over sea, PositionASLW. + + + Array + + + + - setFuelCargo + ctSetHeaderTemplate - Sets fuel amount in cargo space of refuel vehicle from empty (0) to full (1) - Note, the carrying capacity of each side's refuel trucks differ. + Takes config path to the new header template. Clears the whole RscControlsTable and sets the new header template. - https://community.bistudio.com/wiki/setFuelCargo + https://community.bistudio.com/wiki/ctSetHeaderTemplate - Object setFuelCargo Number + Control ctSetHeaderTemplate Config - vehicle setFuelCargo amount + Control ctSetHeaderTemplate Config - $Code$_refuelTruckOne setFuelCargo 0;$/Code$ + $Code$_control ctSetHeaderTemplate _configPath;$/Code$ - local / global + local / local - (July 10, 2015) - (ArmA 3 1.44) setFuelCargo will have no effect if the vehicle doesn't support getFuelCargo. - Nothing + Nothing + - setGroupIconParams + delete3DENEntities - Set group icons parameters. [color,string,float,bool] + Delete given entities in Eden Editor, including anything that can be placed in editor. - https://community.bistudio.com/wiki/setGroupIconParams + https://community.bistudio.com/wiki/delete3DENEntities - Group setGroupIconParams Array + delete3DENEntities Array - group setGroupIconParams properties + delete3DENEntities entities - $Code$_grp setGroupIconParams [_color,_text,_scale,_visible]; - _grp setGroupIconParams [[0,0,0,0],"",1,false];$/Code$ + $Code$delete3DENEntities ( all3DENEntities select 0); + // removes all objects$/Code$ undefined / undefined @@ -57490,343 +58938,209 @@ - Nothing + Nothing + - setGroupIconsSelectable + removeFromRemainsCollector - Sets if group icons raises onclick and onover events. + Removes vehicles/units from disposal manager, added earlier with addToRemainsCollector - https://community.bistudio.com/wiki/setGroupIconsSelectable + https://community.bistudio.com/wiki/removeFromRemainsCollector - setGroupIconsSelectable Boolean + removeFromRemainsCollector Array - setGroupIconsSelectable bool + removeFromRemainsCollector remains - $Code$setGroupIconsSelectable true ;$/Code$ + $Code$removeFromRemainsCollector [unit1, unit2, vehicle1];$/Code$ - undefined / undefined + global / global - Object + Nothing + - setGroupIconsVisible + get3DENConnections - Sets if group icons are visible. + Return all connections currently present on an entity. - https://community.bistudio.com/wiki/setGroupIconsVisible + https://community.bistudio.com/wiki/get3DENConnections - setGroupIconsVisible Array + get3DENConnections EdenEntity - setGroupIconsVisible array + get3DENConnections entity - $Code$setGroupIconsVisible [true,true];//[show markers on map, show markers on player hud] - setGroupIconsVisible [true,false]; //Show only 2D - setGroupIconsVisible [false,false];$/Code$ - + undefined / undefined - Nothing + Array + - setGroupIcon + showChat - Set group icons properties. + Shows/hides the whole chat window. - https://community.bistudio.com/wiki/setGroupIcon + https://community.bistudio.com/wiki/showChat - Group setGroupIcon Array + showChat Boolean - group setGroupIcon [id, icon, offset] + showChat bool - $Code$_target setGroupIcon [_icon,"hc_selectedEnemy"]; - _target setGroupIcon [_icon,"flag"]; - _grp setGroupIcon [_iconsize,_iconsizeclass,_offset]; - _grp setGroupIcon [_newid,_icon,_offset]; - _grp setGroupIcon [_icon,_iconclass];$/Code$ + $Code$showChat false ;$/Code$ - undefined / undefined + undefined / local - Nothing + Nothing + - setGroupIdGlobal + diag_toggle - A global equivalent of setGroupId + Used to enable/disabled various diagnostics. + Only available in the Arma 3 Diagnostic exe - https://community.bistudio.com/wiki/setGroupIdGlobal + https://community.bistudio.com/wiki/diag_toggle - Object/Group setGroupIdGlobal Array + diag_toggle String - group setGroupIdGlobal [nameFormat, nameParam1,, nameParamN] + diag_toggle diag_mode - + $Code$diag_toggle "Animation";//enable + diag_toggle "Animation";//disable$/Code$ + - global / global + undefined / undefined - Nothing + Nothing + - setGroupId + nMenuItems - Sets a group's identity, how it will be displayed in chat, for example. While groups on the different sides can have identical ids, the groups on the same side cannot. When given id exists already, the group which currently has it will simply swap it with the current id of the group for which this id is intended. For example: - $Code$group1 = createGroup west ; - group2 = createGroup west ; - group1 setGroupId ["Active Group"]; - group2 setGroupId ["Inactive Group"]; - systemChat groupId group1; //"Active Group"; - systemChat groupId group2; //"Inactive Group"; - group2 setGroupId ["Active Group"]; - systemChat groupId group1; //"Inactive Group"; - systemChat groupId group2; //"Active Group";$/Code$ - The identity setup could also consist of format keywords (marked with %) and param keywords taken from CfgWorlds config. Basically it is like format command but with some special group keywords. For Arma 3 possible values are: - %GroupSquad - "Squad1" - 1 - "Squad2" - 2 - "Squad3" - 3 - "Squad4" - 4 - %GroupPlatoon - "Platoon1" - 1 - "Platoon2" - 2 - "Platoon3" - 3 - "Platoon4" - 4 - %GroupCompany - "CompanyAlpha" - Alpha - "CompanyBravo" - Bravo - "CompanyCharlie" - Charlie - "CompanyDelta" - Delta - "CompanyEcho" - Echo - "CompanyFoxtrot" - Foxtrot - "CompanyGolf" - Golf - "CompanyHotel" - Hotel - "CompanyIndia" - India - "CompanyKilo" - Kilo - "CompanyLima" - Lima - "CompanyMike" - Mike - "CompanyNovember" - November - "CompanyOscar" - Oscar - "CompanyPapa" - Papa - "CompanyQuebec" - Quebec - "CompanyRomeo" - Romeo - "CompanySierra" - Sierra - "CompanyTango" - Tango - "CompanyUniform" - Uniform - "CompanyVictor" - Victor - "CompanyWhiskey" - Whiskey - "CompanyXray" - X-Ray - "CompanyYankee" - Yankee - "CompanyZulu" - Zulu - %GroupNames - "Alpha" - Alpha - "Bravo" - Bravo - "Charlie" - Charlie - "Delta" - Delta - "Echo" - Echo - "Foxtrot" - Foxtrot - "Golf" - Golf - "Hotel" - Hotel - "November" - November - "Kilo" - Kilo - "Yankee" - Yankee - "Zulu" - Zulu - "Two" - Two - "Three" - Three - "Buffalo" - Buffalo - "Guardian" - Guardian - "Convoy" - Convoy - "Fox" - Fox - %GroupColors - "GroupColor1" - Black - "GroupColor2" - Red - "GroupColor3" - Green - "GroupColor4" - Blue - "GroupColor5" - Yellow - "GroupColor6" - Orange - "GroupColor7" - Pink - "GroupColor0" - - "Six" - Six - For global variant of this command use setGroupIdGlobal. + Returns the total number of user-added menu items belonging to the given menu. + i + Some Old Editor Command - https://community.bistudio.com/wiki/setGroupId + https://community.bistudio.com/wiki/nMenuItems - Object/Group setGroupId Array + Control nMenuItems String + + Control nMenuItems Number - group setGroupId [nameFormat, nameParam1,, nameParamN] + map nMenuItems menuName + + map nMenuItems index - $Code$// Arma 3 : - group player setGroupId ["Some name for the group"]; - hint groupId group player ; //"Some name for the group" - player sideChat "lalala"; //Some name for the group (KK): "lalala"$/Code$ - - $Code$// Arma 3 : - group player setGroupId ["%GroupNames :=: %GroupColors","Alpha","GroupColor2"]; - hint groupId group player ; //"Alpha :=: Red" - player sideChat "lalala"; //Alpha :=: Red (KK): "lalala"$/Code$ - - $Code$// OFP : - _group1 setGroupId ["Delta","GroupColor4"]$/Code$ - - $Code$// ArmA / ArmA 2 : - _group1 setGroupId ["Assault Squad"]$/Code$ - + - global / local + undefined / undefined - Letter is one of: - "Alpha" - "Bravo" - "Charlie" - "Delta" - "Echo" - "Foxtrot" - "Golf" - "Hotel" - "Kilo" - "Yankee" - "Zulu" - "Buffalo" - "Convoy" - "Guardian" - "November" - "Two" - "Three" - "Fox" - Colour may be one of the following: - "GroupColor0" - (Nothing) - "GroupColor1" - Black - "GroupColor2" - Red - "GroupColor3" - Green - "GroupColor4" - Blue - "GroupColor5" - Yellow - "GroupColor6" - Orange - "GroupColor7" - Pink - "Six" - Six - - (August 4, 2006) - Notes from before the conversion: - Note that this command does not name the group. To call a group "grp1", for example, write this in the init field of the group leader : - grp1 = group this - - (December 9, 2006) - Selfdefined Callsigns: - In Armed Assault you're able to define the callsignletter by yourself. This can be for example "Fireteam", or "Specialforces". - this setgroupId ["Attackteam"] - - In OFP v1.96, the radio callsign strings for a mission can be redefined by creating a stringtable.csv in the mission folder. All string names except FOX can be found within the main stringtable.csv. Note "SIX" has a string suggesting it is a groupname, although the engine uses it as a colour. Some examples of the string names : STR_CFG_GRPNAMES_ALPHA, STR_CFG_GRPNAMES_FOX, STR_CFG_GRPCOL_BLACK, STR_CFG_GRPNAMES_SIX, STR_CFG_FIREFLYBASE, STR_CFG_PAPABEAR, STR_CFG_HQ_BASE, STR_CFG_HQ_BASE. - - (April 21, 2015) - List of available keywords from config: $Code$"if ((configName _x) select [0, 5] == 'group') then { - diag_log ('%' + configName _x); - for '_i' from 0 to count _x - 1 do { - diag_log ('* ""' + configName (_x select _i) + '"" - ' + getText ((_x select _i) 'name')); - }; - }; false" configClasses (configFile "CfgWorlds");$/Code$ - Nothing + Number - Number + - setGroupOwner + setTriggerTimeout - Changes the ownership of a group (and all its units) to a given client. Group leader can't be a player. Only works when called from a server. Returns true if locality was changed. For agents use setOwner command. + Defines the time between condition satisfaction and trigger activation (randomly from min to max, with an average value mid). If the last argument is true, the condition must be fullfilled all the time. + For a normal trigger, min, mid and max are used to generate random duration according to Gaussian Distribution. For a "Seized" type of trigger, the duration value is generated using side ruling power - https://community.bistudio.com/wiki/setGroupOwner + https://community.bistudio.com/wiki/setTriggerTimeout - Group setGroupOwner Number + Object setTriggerTimeout Array - group setGroupOwner clientID + trigger setTriggerTimeout [min, mid, max, interruptable] - $Code$_localityChanged = _someGroup setGroupOwner ( owner _playerObject);$/Code$ + $Code$_trigger setTriggerTimeout [5, 10, 7, false ];$/Code$ - undefined / undefined + global / local - This scripting command must be executed on the server to work properly in multiplayer - - (July 30, 2015) - In ArmA3 1.48, setGroupOwner does NOT work if group has no units - Boolean + Nothing + - setGusts + setWPPos - Changes the gusts value smoothly during the given time (in seconds). A time of zero means there will be an immediate change. Value is 0 to 1. + Set waypoint position - https://community.bistudio.com/wiki/setGusts + https://community.bistudio.com/wiki/setWPPos - Number setGusts Number + Array setWPPos Array - time setGusts value + waypoint setWPPos pos - $Code$60 setGusts 0.75;$/Code$ + $Code$[_groupOne, 1] setWPPos markerPos "MarkerOne";$/Code$ undefined / local @@ -57834,850 +59148,1561 @@ - Nothing + Nothing + - setHUDMovementLevels + isInRemainsCollector - Set min/max movement borders displayed in HUD gauges. Use -1 to skip some value. + Checks if unit or vehicle is queued for disposal after death. - https://community.bistudio.com/wiki/setHUDMovementLevels + https://community.bistudio.com/wiki/isInRemainsCollector - setHUDMovementLevels Array + isInRemainsCollector Object - setHUDMovementLevels [minSpeed, maxSpeed, minAlt, maxAlt, minDir, maxDir, targetOrPosition] + isInRemainsCollector remain - $Code$setHUDMovementLevels [20,30,-1,-1,0.23,2.1,[0,0,0]]$/Code$ - - $Code$setHUDMovementLevels [20,30,-1,-1,0.23,2.1,player]$/Code$ + $Code$if ( isInRemainsCollector unit1) then { hint "unit1 is queued for disposal"};$/Code$ - undefined / undefined + global / undefined - Nothing + Boolean + - setHideBehind + formationPosition - Sets the data for hiding. objectWhereHide can be taken using findCover. hidePosition can be taken using getHideFrom. Command is not functional in ArmA 2. - This command is not implemented + Return position of unit in the formation - https://community.bistudio.com/wiki/setHideBehind + https://community.bistudio.com/wiki/formationPosition - Object setHideBehind Array + formationPosition Object - object setHideBehind [objectWhereHide, hidePosition] + formationPosition person - + $Code$_pos=FormationPosition _person$/Code$ + undefined / undefined - Nothing + Array + - setHitIndex + getNumber - Set the current level of damage for a specific Hit Point (specified by its hit part index). All hit points can be obtained with getAllHitPointsDamage command. - 0: no damage - 1: full damage + Extract number from config entry. - https://community.bistudio.com/wiki/setHitIndex + https://community.bistudio.com/wiki/getNumber - Object setHitIndex Array + getNumber Config - vehicle setHitIndex [hitPartIndex, damage, useEffects] + getNumber config - $Code$vehicle player setHitIndex [1, 1];$/Code$ - - $Code$player setHitIndex [7, 0.5];$/Code$ + $Code$_value = getNumber ( configFile "CfgVehicles" "Thing" "maxSpeed");$/Code$ - local / global + undefined / undefined + (04:45, 3 March 2007 (CET)) + Use getNumber to get boolean values from a config file. 1 equals true, 0 equals false and if no value is found (when a valid variable is undefined) 0.67 is returned. + + (13 September 2011) + With an not existing entry, getNumber returns 0. + + (Mar 28, 2014) + (ArmA3 1.14), It's recommended to use BIS_fnc_getCfgData or BIS_fnc_returnConfigEntry to get variable cfg data rather than conditioning via isNumber, isText, isArray, getNumber, getText and getArray combination. + Traditional workaround: + $Code$ + _cfg = configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type" + switch ( true ) do + { + case ( isNumber _cfg): { getNumber _cfg}; + case ( isText _cfg): { getText _cfg}; + case ( isArray _cfg): { getArray _cfg;}; + default {nil}; + }; + $/Code$ + Recommended workaround: + $Code$ + ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_getCfgData ; + $/Code$ + To return default value once entry was not found, we can use BIS_fnc_returnConfigEntry instead of BIS_fnc_getCfgData. + $Code$ + [( configFile "CannonFire" "LightExp"),"lifeTime",0] call BIS_fnc_returnConfigEntry ;//0.5 + $/Code$ + To compose collected Number into Array, use BIS_fnc_getCfgDataArray instead. + $Code$ + ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_getCfgDataArray ; + $/Code$ + To retype collected Number into Boolean, use BIS_fnc_getCfgDataBool. Anything bigger than 0 is true, otherwise false. + $Code$ + ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_getCfgDataBool ; + $/Code$ - Nothing + Number + - setHitPointDamage + setVehicleAmmoDef - Set the current level of damage for a specific Hit Point (specified by its config class). - 0: no damage - 1: full damage - See also BIS_fnc_setHitPointDamage for setting hit with dependency + Sets how much ammunition (compared to the configuration of magazines defined in the vehicle's class) the vehicle has. Note that the ammo will only be added to local turrets. To check the locality of turret use turretLocal. - https://community.bistudio.com/wiki/setHitPointDamage + https://community.bistudio.com/wiki/setVehicleAmmoDef - Object setHitPointDamage Array + Object setVehicleAmmoDef Number - vehicle setHitPointDamage [hitPointName, damage, useEffects] + unit setVehicleAmmoDef value - $Code$vehicle player setHitPointDamage ["hitEngine2", 1.0];$/Code$ - - $Code$player setHitPointDamage ["hitHead", 0.5]; - player setHitPointDamage ["hitBody", 0.5]; - player setHitPointDamage ["hitHands", 0.5]; - player setHitPointDamage ["hitLegs", 0.5];$/Code$ + $Code$player setVehicleAmmoDef 0;$/Code$ local / global - (August 30, 2012) - This command is using the Hit Points (defined in the HitPoints class in the config) while setHit is using Named Selections (defined in the model itself). - - (November 10, 2016) - This command has no affect when allowDamage is false. - - (November 14, 2016) - Mention that setHitPointDamage only can be executed localy, while the getHitPointDamage is global. + (December 20, 2014) + For vehicles this command operates relative to its stock magazine loadout (i.e. its CfgVehicles magazines[] values). Thus setVehicleAmmoDef 1 will fully restore a vehicle to its default ammunition capacity, resetting any changes made by intentionally/implicitly adding/removing magazines. + Use setVehicleAmmo to operate in relation to a vehicle's current magazine loadout. + -- Actium ( talk ) 22:49, 20 December 2014 (CET) - Nothing + Nothing + - setHit + synchronizeTrigger - Damage / repair part of object. The object must be local to the computer where command is executed. - Damage 0 means fully functional, damage 1 means completely destroyed / dead. Note: Some part names are in Czech; see translation table. + Synchronizes the trigger with zero or more waypoints. - https://community.bistudio.com/wiki/setHit + https://community.bistudio.com/wiki/synchronizeTrigger - Object setHit Array + Object synchronizeTrigger Array - object setHit [part, damage, useEffects] + trigger synchronizeTrigger [waypoint1, waypoint2,] - $Code$vehicle player setHit ["motor", 1]$/Code$ + $Code$_trigger synchronizeTrigger []$/Code$ - $Code$vehicle player setHit ["mala vrtule", 0.95]$/Code$ + $Code$_trigger synchronizeTrigger [_waypoint1]$/Code$ - $Code$if ( local _heli) then { - _heli setHit ["velka vrtule", 0]; - } else { - hint "Vehicle " + str _heli + " must be local to this machine to do that!"; - };$/Code$ + $Code$_trigger synchronizeTrigger [_waypoint1, [_group5, 7], _waypoint3]$/Code$ - local / global + undefined / undefined - Damaging specific parts of the vehicle will not update its overall damage value (as of v1.03): - player setHit ["hands", 0.9]; - hint str (damage player); //will return 0 - - Direct use of the names of sections of the model is likely a bad practice, and will not work on some addons. - So instead: - _MH60S setHit ["elektronika", _hit]; - should be used: - _MH60S setHit [getText(configFile "cfgVehicles" "MH60S" "HitPoints" "HitAvionics" "name"), _hit]; - - Since there is no getHit (as of 1.61), you can use canMove command to check if vehicle is capable of moving. - For land wheeled vehicles canMove will return false if any real wheel (damaging nonexistent wheels doesn't count) has hitpoint damage greater than 0.9. Having HitEngine damage greater than 0.9 will make canMove to return false as well (plus will result in vehicle exploding). HitFuel however doesn't make canMove return false even though having high HitFuel damage will make car explode. - For helicopters HitEngine with damage greater than 0.9 will make canMove return false as well. Having HitHRotor (main rotor) damaged even up to 1 will never make canMove return false. However, if HitVRotor (tail rotor) will have damage greater than 0.703608 it will make canMove return false (even though some helicopters are controllable and flyable by player with broken tail rotor). - In same manner you can use canFire to check if turret hitpoints are not damaged enough to be able to fire. (canFire always returns false if there is nobody in vehicle) - Update: Since ArmA 3 1.31 getHit has been introduced. - Nothing + Nothing + - setHorizonParallaxCoef + displayCtrl - Sets coef used to shift horizon position based on camera height (use 0 to disable shifting). + Return child control with specified idc. - https://community.bistudio.com/wiki/setHorizonParallaxCoef + https://community.bistudio.com/wiki/displayCtrl - setHorizonParallaxCoef Number + Display displayCtrl Number - setHorizonParallaxCoef coef + display displayCtrl idc - $Code$setHorizonParallaxCoef 1;$/Code$ + $Code$_ChildControl = _ParentDisplay displayCtrl 101;$/Code$ undefined / undefined + (May 1, 2017) + Since Arma 3 1.42 you can also return a control inside a controls group using controlsGroupCtrl (created with ctrlCreate or inside a controls[] of a control config). Example: + $Code$((uiNamespace getVariable "RscUnitInfo") displayCtrl 2303) controlsGroupCtrl 154; // Display - Controls Group - Control$/Code$ + Note that control inside controls group having -1 IDC currently cannot be returned in any way. - Nothing + Control + - setIdentity + humidity - Set identity of person. - Identities are defined in Description.ext of the mission or campaign. For a list of available faces, glasses and speakers check Category:CfgIdentities. + Returns the current humidity value. 0 is no humidity and 1 is 100% humidity. Humidity value quickly changes from 0 to 1 when rain starts, then slowly changes from 1 to 0 when rain stops. - https://community.bistudio.com/wiki/setIdentity + https://community.bistudio.com/wiki/humidity - Object setIdentity String + humidity - person setIdentity identity + humidity - $Code$_soldier1 setIdentity "MyLittleSoldier";$/Code$ + $Code$currentHumidity = humidity ;$/Code$ + + $Code$skipTime -24; + 86400 setOvercast 1; + skipTime 24; + [] spawn { + 10 setRain 1; + sleep 10; + 10 setRain 0; + }; + onEachFrame { + hintSilent str [ round ( rain * 10) / 10, round ( humidity * 10) / 10]; + };$/Code$ undefined / undefined - (August 28, 2013) - For ArmA3 the definition format in the Description.ext file is: - class CfgIdentities - { - class MyLittleSoldier - { - name = "Givens"; - nameSound = "Givens"; - face="WhiteHead_06"; - glasses="None"; - speaker="Male05ENG"; - pitch=1.1; - }; - }; - nameSound can be any preset BIS recorded name value. By default units will be called out in voice by their number. By using nameSound you can call them out by name using the following values: - Default: - Armstrong - Nichols - Tanny - Frost - Lacey - Larkin - Kerry - Jackson - Miller - McKendrick - Levine - Reynolds - BLUFOR: - Adams - Bennett - Campbell - Dixon - Everett - Franklin - Givens - Hawkins - Lopez - Martinez - O'Connor - Ryan - Patterson - Sykes - Taylor - Walker - OPFOR: - Amin - Masood - Fahim - Habibi - Kushan - Jawadi - Nazari - Siddiqi - Takhtar - Wardak - Yousuf - INDEPENDENT: - Anthis - Costa - Dimitirou - Elias - Gekas - Kouris - Leventis - Markos - Nikas - Nicolo - Panas - Petros - Rosi - Samaras - Stavrou - Thanos - Vega - CODE NAMES: - Ghost - Stranger - Fox - Snake - Razer - Jester - Nomad - Viper - Korneedler - face can be any of the following: - AfricanHead_01 - AfricanHead_02 - AfricanHead_03 - AsianHead_A3_01 - AsianHead_A3_02 - AsianHead_A3_03 - GreekHead_A3_01 - GreekHead_A3_02 - GreekHead_A3_03 - GreekHead_A3_04 - GreekHead_A3_05 - GreekHead_A3_06 - GreekHead_A3_07 - GreekHead_A3_08 - GreekHead_A3_09 - PersianHead_A3_01 - PersianHead_A3_02 - PersianHead_A3_03 - NATOHead_01 - WhiteHead_02 - WhiteHead_03 - WhiteHead_04 - WhiteHead_05 - WhiteHead_06 - WhiteHead_07 - WhiteHead_08 - WhiteHead_09 - WhiteHead_10 - WhiteHead_11 - WhiteHead_12 - WhiteHead_13 - WhiteHead_14 - WhiteHead_15 - speaker can be any of the following: - Male01ENG - Male01ENGB - Male01GRE - Male01PER - Male02ENG - Male02ENGB - Male02GRE - Male02PER - Male03ENG - Male03ENGB - Male03GRE - Male03PER - Male04ENG - Male04ENGB - Male04GRE - Male05ENG - Male06ENG - Male07ENG - Male08ENG - Male09ENG - In ArmA 3 1.04+ these settings can also be set individually without description.ext editing by using the following commands: setFace, setName, setNameSound, setSpeaker, setPitch + + + Number + + + + + + rank + + + Returns the rank of the given unit. Rank can be one of the following: + "PRIVATE" + "CORPORAL" + "SERGEANT" + "LIEUTENANT" + "CAPTAIN" + "MAJOR" + "COLONEL" + + + https://community.bistudio.com/wiki/rank + + + rank Object + + + rank unitName + + + $Code$_rank = rank player;$/Code$ + + + global / undefined + + + + + String + + + + + + scoreSide + + + Returns score for the given side. MP Only. + + + https://community.bistudio.com/wiki/scoreSide + + + scoreSide Side + + + scoreSide side + + + $Code$_number = scoreSide west ;$/Code$ + + + undefined / undefined + + + + + Number + + + + + + diag_tickTime + + + Real time spent from the start of the game. Expressed in fractions of second. Resolution of 1 tick is 1 ms. + + + https://community.bistudio.com/wiki/diag_tickTime + + + diag_tickTime + + + diag_tickTime + + + $Code$_start = diag_tickTime ; + //code + _stop = diag_tickTime ; + diag_log format ["%1",_stop - _start];$/Code$ + + + undefined / undefined + + + (8 Sept, 2010) + In Arma 2 Operation Arrowhead 1.54.0.72888 this returns the time in seconds since the game was started. - (August 4, 2006) - Notes from before the conversion: - The definition format in the Description.ext file is: - class CfgIdentities + (25 Jan, 2014) + This command will return time since last client restart as float. However because of Number format used in Arma, the more time has past since restart the less precise the returned value will be. + + + Number + + + + + + selectWeapon + + + Selects the given weapon. + Note: For weapons that have more than one muzzle, you have to input the muzzlename and not the weaponName. + The only weapons that have muzzleNames seem to be rifles with grenade launchers, handgrenades, smokeshells and satchels. + In all other cases the weaponName must be used. + Fortunately, in OFP, in most cases, both names are the same. But check. + In ArmA the weaponNames and muzzleNames are different. + For muzzle names see cfgWeapons. + NOTE: The unit must be local to the PC on which command is executed. + + + https://community.bistudio.com/wiki/selectWeapon + + + Object selectWeapon String + + + unitName selectWeapon muzzleName + + + $Code$_soldier1 selectWeapon "LAWLauncher";$/Code$ + + $Code$player selectWeapon "M203Muzzle";$/Code$ + + + local / global + + + (5 Aug, 2008) + Rather than simply using selectWeapon to select your default weapon after adding them to your player, it is recommended you use a script instead similar to the following, which caters for multiple muzzles: + SelectWeapon.sqf + // Desc: select default weapon & handle multiple muzzles + if (count weapons player 0) then { - class John_Doe + private['_type', '_muzzles']; + _type = ((weapons player) select 0); + // check for multiple muzzles (eg: GL) + _muzzles = getArray(configFile "cfgWeapons" _type "muzzles"); + if (count _muzzles 1) then { - name = "John Bartholemew Doe"; - face = "Face20"; - glasses = "None"; - speaker = "Dan"; - pitch = 1.1; + player selectWeapon (_muzzles select 0); + } + else + { + player selectWeapon _type; }; }; - In Operation Flashpoint, - Name can be any string. - Face can take any of the following values: - Male: "Face1"... to "Face52", "Face99" & "FaceR01" to "Face R04" - Female: "Eva", "Kamila", "Lada", "Lucie", "Marketa" & "Nada" - Glasses can take the following values: "None", "Spectacles" & "Sunglasses" - Speaker determines which voice is used and can take any of the following values: - "Adam" - "Dan" - "George" - "Greg" - "John" - "Jonah" - "Marc" - "Patrick" - "Paul" - "Peter" - "Rich" - "Rob" - "Ted" - "Tom" - "Nikolai" - "Vitaliy" - "Sergey" - "Oleg" - "Ruslan" - "Aleksei" - "Andrei" - "Boris" - "Georgiy" - "Vadim" - "Vladimir" - "Ivan" - Pitch sets the tone of voice. 1.0 for normal; 1.0 for deep; 1.0 for high pitched - (November 18, 2006) - Preview of all faces in Armed Assault can be found on Czech Biki + (22 Mar, 2010) + Can be used with primaryWeapon to select the primary weapon. + An example with muzzle care (see Dr_EyeBall note) : + if ( (primaryWeapon player) != "") then + { + private['_type', '_muzzles']; + _type = primaryWeapon player; + // check for multiple muzzles (eg: GL) + _muzzles = getArray(configFile "cfgWeapons" _type "muzzles"); + if (count _muzzles 1) then + { + player selectWeapon (_muzzles select 0); + } + else + { + player selectWeapon _type; + }; + }; + + + Nothing + + + + + + diag_setLightNew + + + Overrides currently used scene lightning. The operand is config that is placed as a string (not file). The changes may not be applied immediately, but can be forced by the call of simulWeatherSync. + Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. + + + https://community.bistudio.com/wiki/diag_setLightNew + + + diag_setLightNew String + + + diag_setLightNew config + + + $Code$diag_setLightNew "sunOrMoon = 1; diffuse[] = { 0, 0, 0, 0 }; diffuseCloud[] = { 0, 0, 0, 0 }; ambient[] = { 0, 0, 0, 0 };... "$/Code$ + + + undefined / undefined + + + + + Nothing + + + + + + isServer + + + Returns true if the machine (executing the command) is the server in a multiplayer game or is running single player. isServer will return true for both, dedicated server and player hosted. Dedicated server could be detected with isDedicated command. Hosted by player server can be detected by presense of UI: isServer && hasInterface + + + https://community.bistudio.com/wiki/isServer + + + isServer + + + isServer + + + $Code$if (! isServer ) exitWith {};$/Code$ + + + undefined / undefined + + + (April 8, 2011) + You can use isServer inside the condition of a trigger to have the trigger activate only for the server. All other conditions for the trigger will be checked across all machines, but it will only activate the trigger created on the server. For example: $Code$this && isServer $/Code$ + + (December 21, 2014) + $Code$ if ( isDedicated ) then { + //run on dedicated server only + }; + if ( isServer ) then { + //run on dedicated server or player host + }; + if ( hasInterface ) then { + //run on all player clients incl. player host + }; + if (! isDedicated ) then { + //run on all player clients incl. player host and headless clients + }; + if (! isServer ) then { + //run on all player clients incl. headless clients but not player host + }; + if (! hasInterface ) then { + //run on headless clients and dedicated server + }; + if (! hasInterface && ! isDedicated ) then { + //run on headless clients only + };$/Code$ + + + Boolean + + + + + + isAgent + + + Check if team member is an agent. + + + https://community.bistudio.com/wiki/isAgent + + + isAgent Team_Member + + + isAgent teamMember + + + + + undefined / undefined + + + (May 19, 2017) + One can check if a unit is an agent via + $Code$ isAgent teamMember _unit$/Code$ + + + Boolean + + + + + + allVariables + + + Returns a list of all variables from desired namespace. Namespaces supported: + Control + Team_Member + Namespace + Object + Group + Task + Location + + + https://community.bistudio.com/wiki/allVariables + + + allVariables Control/Team_Member + + + allVariables namespace + + + $Code$_allVarsUINamespace = allVariables uiNamespace ;$/Code$ + + $Code$_allVarsTrigger = allVariables trigger1;$/Code$ + + + undefined / undefined + + + (June 11, 2016) + Using profileNamespace and uiNamespace with this command has been disabled in multiplayer. [1] + + (October 1, 2016) + One still can use allVariables in Multiplayer against profileNamespace and uiNamespace using config parser. In Description.ext + $Code$_EXEC(somevar = allVariables profileNamespace)$/Code$ + in code + $Code$_allprofilevars = parsingNamespace getVariable "somevar"$/Code$ + but list will be valid only at the moment of parsing config. + + + Array + + + + + + taskParent + + + Return the parent task of the specified task. + + + https://community.bistudio.com/wiki/taskParent + + + taskParent Task + + + taskParent task + + + + + undefined / undefined + + + + + Task + + + + + + landResult + + + Return the result of helicopter landing position searching (performed, after land command). The value can be "Found" (position found),"NotFound" (position not found), "NotReady" (position searching is,still in progress) or empty string when wrong argument given. + + + https://community.bistudio.com/wiki/landResult + + + landResult Object + + + landResult helicopter + + + + + undefined / undefined + + + + + String + + + + + + ctrlSetAutoScrollDelay + + + Sets number of second before auto-scroll starts/rewinds. Setter for ctrlAutoScrollDelay. + Autorscroll is available for CT_LISTBOX and CT_CONTROLS_GROUP types of controls only. Autoscroll will wait ctrlAutoScrollDelay seconds (must be 0) and then will scroll the scroll bar down to the bottom. ctrlAutoScrollSpeed defines the speed with which scrollbar is scrolled. If ctrlAutoScrollRewind is true, the control will fade out, immediately rewind to the top, then fade in, wait ctrlAutoScrollDelay seconds and then repeat the scrolling in a loop. If user focuses on the control, autoscrolling is interrupted. + + + https://community.bistudio.com/wiki/ctrlSetAutoScrollDelay + + + Control ctrlSetAutoScrollDelay Number + + + control ctrlSetAutoScrollDelay delay + + + $Code$_ctrlGroup ctrlSetAutoScrollDelay 5;$/Code$ + + + undefined / undefined + + + + + Nothing + + + + + + vestContainer + + + Returns a cargo container of a unit's vest. + + + https://community.bistudio.com/wiki/vestContainer + + + vestContainer Object + + + vestContainer unit + + + $Code$hint str vestContainer player ; //2df7d600# 163942: dummyweapon.p3d$/Code$ + + $Code$hint str getMagazineCargo vestContainer player ; + // [ + //[ + //"30Rnd_65x39_caseless_mag", + //"16Rnd_9x21_Mag", + //"HandGrenade", + //"APERSMine_Range_Mag", + //"SmokeShell", + //"SmokeShellGreen", + //"Chemlight_green" + //],[ + //2, + //2, + //2, + //3, + //1, + //1, + //2 + //] + //]$/Code$ + + + undefined / undefined + + + + + Object + + + + + + deleteCollection + + + Delete a collection. As example, used with a soldier, it'll hide the ingame model. + When targetting ArmA 2 1.06 or newer, use hideObject instead. This function is a relic from dynamic building destruction development. It is left only for compatibility with scripts created before ArmA 2 1.06, and its functionality may be changed or removed in the future. + + + https://community.bistudio.com/wiki/deleteCollection + + + deleteCollection Object + + + deleteCollection object + + + $Code$deleteCollection unitName;$/Code$ + + + undefined / undefined + + + (August 20, 2014) + In Arma 3 deleteCollection is alias for hideObject + + + Nothing + + + + + + ropeUnwind + + + Unwind rope to target length. Use relative parameter for changing rope length +/- from current length + + + https://community.bistudio.com/wiki/ropeUnwind + + + ropeUnwind Array + + + ropeUnwind [rope, speed, targetLength, relative] + + + $Code$ropeUnwind [ ropes heli1 select 0, 3, 10];//set rope length to 10m at 3m/s$/Code$ + + $Code$ropeUnwind [ ropes heli1 select 0, 3, -5, true];//decrease rope length by 5m at 3m/s$/Code$ + + + undefined / undefined + + + (November 8, 2014) + Unwinding speed is not linear but instead automatically accelerates at the beginning and slows down at the end. + The speed also only seems to have no effect when pulling the rope in. (unless the end of the rope is not attached to anything) + High unwinding speeds (over ~250) can cause your cargo to get stuck in midair. - (May 10, 2008) - Glasses and Female faces do not work as of Arma patch 1.12beta. + (January 4, 2015) + Rope length limits are between 0.5 and 100 meters. - Nothing + Nothing + - setImportance + lbSetPictureRightColorDisabled - Sets the importance value of location. + Sets the disabled color of second (right aligned) picture of the item with the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. - https://community.bistudio.com/wiki/setImportance + https://community.bistudio.com/wiki/lbSetPictureRightColorDisabled - Location setImportance Number + lbSetPictureRightColorDisabled Array + + Control lbSetPictureRightColorDisabled Array - location setImportance value + lbSetPictureRightColorDisabled [idc, index, color] + + control lbSetPictureRightColorDisabled [index, color] - $Code$myLocation setImportance 2$/Code$ + $Code$lbSetPictureRightColorDisabled [101, 0, [1, 1, 1, 0.25]];$/Code$ + + $Code$_ctrl lbSetPictureRightColorDisabled [0, [1, 1, 1, 0.25]];$/Code$ undefined / undefined + More information on the LB command family can be found here - Nothing + Nothing - Nothing + - setLeader + setTaskState - Set the leader of given team. Effect is local, unless both leader unit and team are local to PC on which command is executed, then effect is global. + Set the state of a given task. + State value may be one of: + "None" + "Created" + "Assigned" + "Succeeded" + "Failed" + "Canceled" - https://community.bistudio.com/wiki/setLeader + https://community.bistudio.com/wiki/setTaskState - Team_Member setLeader Team_Member + Task setTaskState String - team setLeader leader + task setTaskState state - + $Code$_tskKillSpongebob setTaskState "Succeeded";$/Code$ + - local / local + undefined / undefined - Nothing + Nothing + - setLightAmbient + getVehicleCargo - Set ambient color of light. This includes surfaces that face away from the light, unlike setLightColor. + Get a list of vehicles loaded as cargo inside this vehicle. The returned array is in the order the cargo vehicles were added to containing vehicle. - https://community.bistudio.com/wiki/setLightAmbient + https://community.bistudio.com/wiki/getVehicleCargo - Object setLightAmbient Array + getVehicleCargo Object - light setLightAmbient [r, g, b] + getVehicleCargo storingVehicle - $Code$myLight setLightAmbient [0.5,0,0]; //produces red light around the origin source$/Code$ + $Code$_vehicleCargo = getVehicleCargo blackfish; // returns [] if empty$/Code$ + + $Code$_vehicleCargo = getVehicleCargo blackfish; // returns [quad_3, quad_1, quad_2] as they were loaded in this order$/Code$ - local / local + global / global - (Dec 1, 2006) - Light can be created with command createVehicleLocal with special vehicle class "#lightpoint" - for example: - $Code$_light = "#lightpoint" createVehicleLocal pos; - _light setLightBrightness 1.0; - _light setLightAmbient [0.0, 1.0, 0.0]; - _light setLightColor [0.0, 1.0, 0.0]; - _light lightAttachObject [_object, [0,0,0]]; - $/Code$ - - (Aug 17, 2007) - To clarify: - setLightAmbient - Terrain and surrounding objects are bathed in this colour. - setLightColor - Controls the "haze" seen around the lightsource (ex flares). + + + Array + + + + + + showCommandingMenu + + + Create the commanding menu described by the given config class or menu name. When the name is empty, the current menu is hidden. + If commanding menu has "expression" set up, the expression will receive the following arguments when user activated the menu item: + Local variable _target : Object - Target under the cursor. This works in both 3D and 2D (when cursor is over the unit icon on the map). + Local variable _pos : Array - Cursor position. + Local variable _is3D : Boolean - false if cursor is over the map, otherwise true. + + + https://community.bistudio.com/wiki/showCommandingMenu + + + showCommandingMenu String + + + showCommandingMenu name + + + $Code$showCommandingMenu "";$/Code$ + + $Code$showCommandingMenu "MyClassName";$/Code$ + + $Code$showCommandingMenu "#USER:Tag_Menu_myMenu_0";$/Code$ + + $Code$showCommandingMenu "RscMainMenu";$/Code$ + + + undefined / undefined + + + (July 22nd, 2012) + //This script will create a custom menu, and display it once. + MY_SUBMENU_inCommunication = + [ + ["User submenu",true], + ["Option-1", [2], "", -5, [["expression", "player sidechat ""-1"" "]], "0", "0", "\ca\ui\data\cursor_support_ca"], + ["Option 0", [3], "", -5, [["expression", "player sidechat "" 0"" "]], "1", "0", "\ca\ui\data\cursor_support_ca"], + ["Option 1", [4], "", -5, [["expression", "player sidechat "" 1"" "]], "1", "CursorOnGround", "\ca\ui\data\cursor_support_ca"] + ]; + MY_MENU_inCommunication = + [ + // First array: "User menu" This will be displayed under the menu, bool value: has Input Focus or not. + // Note that as to version Arma2 1.05, if the bool value set to false, Custom Icons will not be displayed. + ["User menu",false], + // Syntax and semantics for following array elements: + // ["Title_in_menu", [assigned_key], "Submenu_name", CMD, [["expression",script-string]], "isVisible", "isActive", optional icon path ] + // Title_in_menu: string that will be displayed for the player + // Assigned_key: 0 - no key, 1 - escape key, 2 - key-1, 3 - key-2,..., 10 - key-9, 11 - key-0, 12 and up... the whole keyboard + // Submenu_name: User menu name string (eg "#USER:MY_SUBMENU_NAME" ), "" for script to execute. + // CMD: (for main menu:) CMD_SEPARATOR -1; CMD_NOTHING -2; CMD_HIDE_MENU -3; CMD_BACK -4; (for custom menu:) CMD_EXECUTE -5 + // script-string: command to be executed on activation. (no arguments passed) + // isVisible - Boolean 1 or 0 for yes or no, - or optional argument string, eg: "CursorOnGround" + // isActive - Boolean 1 or 0 for yes or no - if item is not active, it appears gray. + // optional icon path: The path to the texture of the cursor, that should be used on this menuitem. + ["First", [0], "", -5, [["expression", "player sidechat ""First"" "]], "1", "1"], + ["Second", [2], "", -5, [["expression", "player sidechat ""Second"" "]], "1", "1"], + ["Submenu", [3], "#USER:MY_SUBMENU_inCommunication", -5, [["expression", "player sidechat ""Submenu"" "]], "1", "1"] + ]; + showCommandingMenu "#USER:MY_MENU_inCommunication"; + // Appendix, list of optional argument strings + HasRadio + CanAnswer + IsLeader + IsAlone + IsAloneInVehicle + IsCommander + VehicleCommander + CommandsToGunner + CommandsToPilot + NotEmpty + NotEmptySoldiers + NotEmptyCommanders + NotEmptyMainTeam + NotEmptyRedTeam + NotEmptyGreenTeam + NotEmptyBlueTeam + NotEmptyYellowTeam + NotEmptySubgroups + NotEmptyInVehicle + SelectedTeam + SelectedUnit + FuelLow + AmmoLow + Injured + Multiplayer + AreActions + CursorOnGroupMember + CursorOnHoldingFire + CursorOnEmptyVehicle + CursorOnVehicleCanGetIn + CursorOnFriendly + CursorOnEnemy + CursorOnGround + CanSelectUnitFromBar + CanDeselectUnitFromBar + CanSelectVehicleFromBar + CanDeselectVehicleFromBar + CanSelectTeamFromBar + CanDeselectTeamFromBar + FormationLine + FormationDiamond + SomeSelectedHoldingFire + PlayableLeader + PlayableSelected + IsWatchCommanded + IsSelectedToAdd + HCIsLeader + HCCursorOnIcon + HCCursorOnIconSelectable + HCCanSelectUnitFromBar + HCCanDeselectUnitFromBar + HCCanSelectTeamFromBar + HCCanDeselectTeamFromBar + HCNotEmpty + PlayerVehicleCanGetIn + IsXbox + IsTeamSwitch + CursorOnNotEmptySubgroups + SomeSelectedHaveTarget + CursorOnGroupMemberSelected + HCCursorOnIconSelectableSelected + HCCursorOnIconenemy + PlayerOwnRadio + CursorOnNeedFirstAID + CursorOnNeedHeal - (Mar 25, 2014) - When both setLightAmbient and setLightColor were [0,0,0], there won’t be any visual presentation on the light source. + (July 23, 2016) + You can combine the argument strings (see the above note) together to create OR conditions. + Hence $Code$"HasRadioIsLeader"$/Code$ is true when the unit is a leader or has a radio. - Nothing + Nothing + - setLightAttenuation + confirmSensorTarget - Sets attenuation of light. Standard method of attenuation (1 / (constant + linear*dist + quadratic*dist*dist)). start param represents distance, where the attenuation starts to take effects (dist = distance - start). + Sets for which Side the entity becomes a "confirmed hostile" target - a target that becomes highlighted red on the sensors display. - https://community.bistudio.com/wiki/setLightAttenuation + https://community.bistudio.com/wiki/confirmSensorTarget - Object setLightAttenuation Array + Object confirmSensorTarget Array - light setLightAttenuation [start, constant, linear, quadratic, hardlimitstart, hardlimitend] + vehicle confirmSensorTarget [side, isConfirmed] - $Code$myLight setLightAttenuation [2,4,4,0,9,10];$/Code$ + $Code$( vehicle player ) confirmSensorTarget [ west, true ];$/Code$ - local / local + undefined / undefined - (Mar 25, 2014) - (A3 1.14) setLightAttenuation array will present fallowing visual effects: - [start(SCALAR), constant(SCALAR), linear (SCALAR), quadratic(SCALAR)] - start(SCALAR) – Number can be unlimited, this parameter determines the range that the light source takes effect. Terrain environmental color will be bathed by ‎setLightAmbient within the range and its covered objects will reflect the color by ‎setLightColor. - constant(SCALAR) – Support signed number, this parameter determines the brightness proportion of the light source, higher the number is, less the brightness will be, vice versa. Any minus value passed will be treated as 0 (100% brightness). In other words, this parameter is related with ‎‎setLightBrightness and ‎setLightIntensity. - linear (SCALAR) – Support signed number, effective range is from 0 ~ 100 (passed minus value will be treated as 0), this parameter determines the concentration of the light source, higher the number is, more will the light concentrate, vice versa. In other words, this parameter will turn the source into spotlight and sharpens its light circle border. - Please pay attention to a special value: 4.31918e-005 - e.g. - $Code$ - _light setLightAttenuation [2,4, 4.31918e-005,0]; //This value will make the light source reach an ultra high effect range. Any initial param set before will be discarded and overwritten. - $/Code$ - quadratic(SCALAR) – Support signed number (range unlimited, passed minus number will be treated as 0), this parameter determines the range that the light source is visible and its visual presentation looks similar to linear. 0 means the maximum visible range. In further explanation, a less bright source can’t be seen out of the range on the land but still visible on the sea, and a bright enough source won’t be effected by the passed range who is still visible out of the range. - Please pay attention to a special value: 4.31918e-005 - e.g. - $Code$ - _light setLightAttenuation [6,0,0, 4.31918e-005 ]; //This value will make the light source reach an ultra high effect range. Any initial param set before will be discarded and overwritten. - $/Code$ - Nothing + Nothing + - setLightBrightness + listRemoteTargets - Set brightness of light. + Return list of datalink targets and time for which they will be/were known - https://community.bistudio.com/wiki/setLightBrightness + https://community.bistudio.com/wiki/listRemoteTargets - Object setLightBrightness Number + listRemoteTargets Side - light setLightBrightness brightness + listRemoteTargets side - $Code$myLight setLightBrightness 2;$/Code$ + $Code$listRemoteTargets east;$/Code$ - local / local + undefined / undefined - (Dec 1, 2006) - Light can be created with command createVehicleLocal with special vehicle class "#lightpoint" - for example: - $Code$_light = "#lightpoint" createVehicleLocal pos; - _light setLightBrightness 1.0; - _light setLightAmbient [0.0, 1.0, 0.0]; - _light setLightColor [0.0, 1.0, 0.0]; - _light lightAttachObject [_object, [0,0,0]]; - $/Code$ - - (Mar 24, 2014) - In ArmA3 ver1.14 setLightBrightness will overwrite the previous effect processed by setLightIntensity on the same light source, vice versa. And both of them currently play the same role on brightness, for example: $Code$_light setLightBrightness 1;// same as _light setLightIntensity 3000;$/Code$ - Nothing + Array + - setLightColor + addCuratorPoints - Set diffuse color of light. Illuminates surfaces that are facing the light. + Adds or removes curator points. Points can be only in range from 0 to 1. - https://community.bistudio.com/wiki/setLightColor + https://community.bistudio.com/wiki/addCuratorPoints - Object setLightColor Array + Object addCuratorPoints Number - light setLightColor [r, g, b] + curatorObj addCuratorPoints points - $Code$myLight setLightColor [0.5,0,0]; //produces red$/Code$ + $Code$curatorModule addCuratorPoints 0.5$/Code$ - local / local + undefined / undefined - (Dec 1, 2006) - Light can be created with command createVehicleLocal with special vehicle class "#lightpoint" - for example: - $Code$_light = "#lightpoint" createVehicleLocal pos; - _light setLightBrightness 1.0; - _light setLightAmbient [0.0, 1.0, 0.0]; - _light setLightColor [0.0, 1.0, 0.0]; - _light lightAttachObject [_object, [0,0,0]]; - $/Code$ - - (Aug 17, 2007) - To clarify: - setLightAmbient - Terrain and surrounding objects are bathed in this colour. - setLightColor - Controls the "haze" seen around the lightsource (ex flares). - - (Mar 24, 2014) - 1. In ArmA3 ver 1.14 setLightColor will also change the color of the flare when setLightUseFlare, setLightFlareSize and setLightFlareMaxDistance were used on the same light source. For example: - $Code$ - _light setLightUseFlare true; - _light setLightFlareSize 2; - _light setLightFlareMaxDistance 60; - _light setLightColor [1, 1, 1]; - $/Code$ - 2. When both setLightAmbient and setLightColor were [0,0,0], there won’t be any visual presentation on the light source. - Nothing + Nothing + - setLightDayLight + isStreamFriendlyUIEnabled - Sets if light can be used during the day. + Returns the status of STREAM FRIENDLY UI setting in UI (OPTIONS GAME GENERAL STREAM FRIENDLY UI). - https://community.bistudio.com/wiki/setLightDayLight + https://community.bistudio.com/wiki/isStreamFriendlyUIEnabled - Object setLightDayLight Boolean + isStreamFriendlyUIEnabled - light setLightDayLight bool + isStreamFriendlyUIEnabled - $Code$myLight setLightDayLight true;$/Code$ + $Code$hint str isStreamFriendlyUIEnabled ;$/Code$ - local / local + undefined / undefined + + + + + Boolean + + + + + + triggerTimeoutCurrent + + + Returns trigger timeout or -1 if countdown is not in progress. + Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. + + + https://community.bistudio.com/wiki/triggerTimeoutCurrent + + + triggerTimeoutCurrent Object + + + triggerTimeoutCurrent trigger + + + $Code$_remaining = triggerTimeoutCurrent _trigger;$/Code$ + + + global / local + + + (November 26, 2013) + Triggers have their own schedule. If you create a trigger with timeout and try to read triggerTimeoutCurrent immediately it will return -1. This is because the countdown will not start until the next scheduled trigger check is due, and this could take up to 0.5 seconds. + + + Number + + + + + + waypointTimeout + + + Gets the waypoint timeout values. + + + https://community.bistudio.com/wiki/waypointTimeout + + + waypointTimeout Array + + + waypointTimeout waypoint + + + $Code$waypointTimeout [groupOne,1]$/Code$ + + + undefined / undefined + + + + + Array + + + + + + clearMagazinePool + + + Remove all magazines from the magazine pool, of which the player may choose in the following missions. Available in campaigns only. + + + https://community.bistudio.com/wiki/clearMagazinePool + + + clearMagazinePool + + + clearMagazinePool + + + + + undefined / undefined - Nothing + Nothing + + + + + + lnbCurSelRow + + + Returns the index of the selected row id 2D listbox. + + + https://community.bistudio.com/wiki/lnbCurSelRow + + + lnbCurSelRow Number + + lnbCurSelRow Control + + + lnbCurSelRow idc + + lnbCurSelRow ctrl + + + $Code$lnbCurSelRow _ctrl;$/Code$ + + + undefined / undefined + + + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. + + + Number - Number + - setLightFlareMaxDistance + drawIcon3D - Sets max distance where the flare is visible. + Draws an ingame icon at a given position. Command has to be executed each frame. Use onEachFrame or addMissionEventHandler "Draw3D" - https://community.bistudio.com/wiki/setLightFlareMaxDistance + https://community.bistudio.com/wiki/drawIcon3D - Object setLightFlareMaxDistance Number + drawIcon3D Array - light setLightFlareMaxDistance distance + drawIcon3D [texture, color, pos, width, height, angle, text, shadow, textSize, font, textAlign, drawSideArrows] - $Code$myLight setLightFlareMaxDistance 500;$/Code$ + $Code$// Icon and text: + onEachFrame { + drawIcon3D ["targetIcon.paa", [1,1,1,1], getPos cursorTarget, 1, 1, 45, "Target", 1, 0.05, "TahomaB"]; + };$/Code$ + + $Code$// Just text: + addMissionEventHandler ["Draw3D", { + drawIcon3D ["", [1,0,0,1], position cursorTarget, 0, 0, 0, "Target", 1, 0.05, "PuristaMedium"]; + }];$/Code$ - local / local + undefined / undefined + (August 31, 2013) + As command syntax indicates, this command expects icon position in format PositionAGL meaning that over the land it expects PositionATL and over the sea PositionASLW. Use additional ASLToAGL if needed. + To draw smooth moving icon for a moving object use visiblePosition and visiblePositionASL accordingly. + This command works well with addon textures, however getting it to display mission textures is a bit tricky. Follow this guide. + + (April 19, 2014) + You should rely exclusively on modelToWorldVisual for a moving object's icon position if you want it to accurately stay at the correct height over the sea. + Width, height, and textSize are proportional to the user's interface size, which can optionally be compensated against via size / ( getResolution select 5) + Additionally, width and height are inversely proportional to the fovLeft and fovTop parameters from the user's ArmaProfile, and AFAIK those parameters are not retrievable via scripting. For example, a fovTop higher than the default value of 0.75 will make all 3D icons smaller vertically. I'm not sure if this is a bug or by design, however it is definitely annoying to take into account. + + (October 23, 2014) + drawIcon3D and BIS_fnc_addStackedEventHandler work well together. + Using formatting commands with drawIcon3D will not work, instead, they will be added to the string. + $Code$["uniqueID", "onEachFrame", + { + drawIcon3D["myIcon.jpg", [1,1,1,0.5], getPos player, 1, 1, 0, format["%1\n%2", "Dreaded", "Entity"]]; + }] call BIS_fnc_addStackedEventHandler;$/Code$ + Shown text will be Dreaded\nEntity. (A3 1.32.127785) + The "text" parameter must be a string. You cannot use Structured_Text. + $Code$["uniqueID", "onEachFrame", + { + drawIcon3D + [ + "myIcon.jpg", + [1,1,1,0.5], + getPos player, + 1, + 1, + 0, + parseText format[" t size='1.25' font='PuristaLight' color='#ff0000' %1%2 /t ", Dreaded, Entity] + ]; + }] call BIS_fnc_addStackedEventHandler;$/Code$ + (A3 1.32.127785) + + (November 13 (2014)) + Here's a practical example combining both drawLine3D and drawIcon3D. Note: You may want to use visiblePosition instead of getPos for moving objects. + $Code$DEADPILOTS = []; + { + if (getText (configfile "CfgVehicles" typeOf _x "textSingular") == "pilot") then { + DEADPILOTS pushBack _x; + }; + } forEach allDeadMen; + addMissionEventHandler ["Draw3D", { + if ( + { + player distance _x = 15 + } count DEADPILOTS 0 + ) then { + { + _corpsePos = getPos _x; + if (player distance _corpsePos = 15) then { + _line1_start = _corpsePos; + _line1_end = [(_line1_start select 0), (_line1_start select 1), 0.5]; + _line2_start = [(_line1_end select 0), (_line1_end select 1) + 0.5, (_line1_end select 2)]; + drawLine3D [_line1_start, _line1_end, [0,0,0,0.5]]; + drawLine3D [_line1_end, _line2_start, [0,0,0,0.5]]; + drawIcon3D ["\a3\ui_f\data\gui\cfg\hints\BasicLook_ca.paa", [0,0,0,0.5], _line2_start, 0.75, 0.75, 0]; + }; + } forEach DEADPILOTS; + }; + }]; + $/Code$ + + (April 11, 2015) + Doesn't work when showHUD false, textAlign is broken, drawSideArrows will turn if angle is not 0 [1] + + (February 11, 2016) + You can also use getPosWorld (for X and Y only, but not Z), which works splendid in script performance. Here is an example: + $Code$addMissionEventHandler ["Draw3D", { _pos = getPosWorld player; drawIcon3D ["a3\ui_f\data\gui\Rsc\RscDisplayArsenal\radio_ca.paa", [1,1,1,1], [(_pos select 0),(_pos select 1), 1], 0.8, 0.8, 0, (name player), 1, 0.0315, "EtelkaMonospacePro"]; }];$/Code$ - Nothing + Nothing + - setLightFlareSize + shownUAVFeed - Sets relative size of the flare for the light. + Returns true if video feed transmitted from UAV is shown. A getter for showUAVFeed - https://community.bistudio.com/wiki/setLightFlareSize + https://community.bistudio.com/wiki/shownUAVFeed - Object setLightFlareSize Number + shownUAVFeed - light setLightFlareSize size + shownUAVFeed - $Code$myLight setLightFlareSize 5;$/Code$ + $Code$_bool = shownUAVFeed ;$/Code$ - local / local + undefined / undefined - Nothing + Boolean + - setLightIntensity + vectorMagnitude - Sets intensity of light. + Magnitude of a 3D vector. - https://community.bistudio.com/wiki/setLightIntensity + https://community.bistudio.com/wiki/vectorMagnitude - Object setLightIntensity Number + vectorMagnitude Array - light setLightIntensity value + vectorMagnitude vector - $Code$myLight setLightIntensity 4;$/Code$ + $Code$_size = vectorMagnitude [0,3,4]; //5$/Code$ + + $Code$_speed = vectorMagnitude velocity player ; // return velocity of player in m/s + _speed = ( vectorMagnitude velocity player ) * 3.6; // return velocity of player in Km/h + _speed = ( vectorMagnitude velocity player ) * 2.23694; // return velocity of player in mph$/Code$ - local / local + undefined / undefined - (Mar 24, 2014) - In ArmA3 ver1.14 setLightIntensity will overwrite the previous effect processed by setLightBrightness on the same light source, vice versa. And both of them currently play the same role on brightness, for example: $Code$_light setLightIntensity 3000;// same as _light setLightBrightness 1;$/Code$ + (28 Jun, 2014) + (ArmA3 1.22)Algorithm: + $Code$ + Vector = [x,y,z]; + Result = sqrt ((x ^ 2) + (y ^ 2) + (z ^ 2)) + $/Code$ + It is recommended to use vectorMagnitude instead of BIS_fnc_magnitude. - Nothing + Number + - setLightUseFlare + handgunWeapon - Sets if light has flare. + Returns the name of a unit's handgun (an empty string if there is none). - https://community.bistudio.com/wiki/setLightUseFlare + https://community.bistudio.com/wiki/handgunWeapon - Object setLightUseFlare Boolean + handgunWeapon Object - light setLightUseFlare bool + handgunWeapon unit - $Code$myLight setLightUseFlare true ;$/Code$ + $Code$hint handgunWeapon player ; //"hgun_P07_F"$/Code$ - local / local + global / undefined - (Mar 25, 2014) - 1. In ArmA3 ver 1.14 flare color can be changed via setLightColor. - 2. Flare won't have visual presentation in daytime. - 3. setLightUseFlare needs to be used together with setLightFlareSize and setLightFlareMaxDistance so that a flare can be seen. - Nothing + String + - setLightnings + set - Changes the lightnings value smoothly during the given time (in seconds). A time of zero means there will be an immediate change. - NOTE : This command will have no effect (even though the value of lightnings changes) unless Manual Override option is selected in the editor in the Intel, which is normally off. + Changes the element at the given (zero-based) index of the array. + If the element does not exist, resize index+1 is called to create it. - https://community.bistudio.com/wiki/setLightnings + https://community.bistudio.com/wiki/set - Number setLightnings Number + Array set Array - time setLightnings value + array set [index, value] - $Code$1800 setLightnings 0.7;$/Code$ + $Code$_arrayOne set [0, "Hello"];$/Code$ + + $Code$_arrayTwo set [ count _arrayTwo, "Bye"]; + // appends "Bye" as last element to _arrayTwo$/Code$ + + $Code$_arrayThree set [( count _arrayThree) - 1, 23]; + // replaces the last element of _arrayTwo with 23$/Code$ undefined / undefined @@ -58685,27 +60710,28 @@ - Nothing + Nothing + - setLocalWindParams + set3DENLogicType - Sets parameters for helicopter rotor wash. Visually it affects how much the grass and bushes bend under a helicopter and how big is the area of the effect. Default [1.0, 1.0]. + Sets the new type of Logic object(s). For other objects use set3DENObjectType - https://community.bistudio.com/wiki/setLocalWindParams + https://community.bistudio.com/wiki/set3DENLogicType - setLocalWindParams Array + Array set3DENLogicType String - setLocalWindParams [strength, diameter] + objects set3DENLogicType classname - $Code$setLocalWindParams [10, 5];$/Code$ + $Code$[ get3DENSelected "logic" select 0] set3DENLogicType "MiscOR_F";$/Code$ undefined / undefined @@ -58713,714 +60739,785 @@ - Nothing + Nothing + - setMagazineTurretAmmo + setAmmo - Sets ammo count to given amount for given turret. - Broken when vehicle has multiple magazines of the same type + Sets custom ammo count in the currently loaded magazine of the specified weapon. The unit must be local to the computer where command is executed. - https://community.bistudio.com/wiki/setMagazineTurretAmmo + https://community.bistudio.com/wiki/setAmmo - Object setMagazineTurretAmmo Array + Object setAmmo Array - vehicle setMagazineTurretAmmo [magazineClass, ammoCount, turretPath] + unit setAmmo [weapon, count] - + $Code$// Set player's handgun magazine ammo count to 10 rounds: + player setAmmo [ handgunWeapon player, 10];$/Code$ + + $Code$// Set player's current weapon magazine ammo count to 1 round: + player setAmmo [ currentWeapon player, 1];$/Code$ + + $Code$// If player is a gunner in a vehicle, set current weapon magazine ammo count to 5 rounds: + if ( local vehicle player ) then { + vehicle player setAmmo [ currentWeapon vehicle player, 5]; + } else { + hint "Vehicle must be local to this machine for 'setAmmo' to work"; + };$/Code$ + + $Code$// If you try to set more ammo than the magazine can hold, it will be clipped at default magazine capacity: + player setAmmo [ primaryWeapon player, 1000000]; //full mag with default ammo count$/Code$ + - undefined / undefined + local / global - Number + Nothing + - setMarkerAlphaLocal + assignedTarget - Sets the marker alpha. The marker is only modified on the computer where the command is called. - When alpha equals 1, the marker is visible, but if alpha equals 0, then the marker is invisible. - Alpha can be numbers and fractions. + Returns the target assigned to the vehicle/unit. To unassign the target use doWatch objNull or commandWatch objNull. - https://community.bistudio.com/wiki/setMarkerAlphaLocal + https://community.bistudio.com/wiki/assignedTarget - String setMarkerAlphaLocal Number + assignedTarget Object - marker setMarkerAlphaLocal alpha + assignedTarget vehicleName - $Code$"my_marker" setMarkerAlphaLocal 0.5;$/Code$ - - $Code$"enemy_convoy_marker" setMarkerAlphaLocal 0;$/Code$ + $Code$_target = assignedTarget _T72$/Code$ - undefined / local + local / undefined - (January 7, 2010) - - The range for 'alpha' is 0... 1 - Nothing + Object + - setMarkerAlpha + createGearDialog - Sets the marker alpha. The marker is modified on all computers in a network session. - When alpha equals 1, the marker is visible, but if alpha equals 0, then the marker is invisible. - Alpha can be numbers and fractions. + Opens gear dialog for given unit. Alternatively use action command: + $Code$ player action ["Gear", player ];$/Code$ - https://community.bistudio.com/wiki/setMarkerAlpha + https://community.bistudio.com/wiki/createGearDialog - String setMarkerAlpha Number + createGearDialog Array - marker setMarkerAlpha alpha + createGearDialog [unit, resource] - $Code$"my_marker" setMarkerAlpha 0.5;$/Code$ - - $Code$"enemy_convoy_marker" setMarkerAlpha 0;$/Code$ + $Code$createGearDialog [player];$/Code$ - undefined / global + undefined / undefined - Nothing + Nothing + - setMarkerBrushLocal + leaderboardsRequestUploadScoreKeepBest - Selects the fill texture for the marker ("RECTANGLE" or "ELLIPSE"). Brush is the name of the subclass in CfgMarkerBrushes. - brush can be: - "Solid" - "SolidFull" (A3 only) - "Horizontal" - "Vertical" - "Grid" - "FDiagonal" - "BDiagonal" - "DiagGrid" - "Cross" - "Border" (A2/A3 only) - "SolidBorder" (OA/A3 only) + Starts async. operation to upload score to board with given name, value is only stored to board if it's better than one already in the board. The details array is optional. The board has to be initialized before the call. - https://community.bistudio.com/wiki/setMarkerBrushLocal + https://community.bistudio.com/wiki/leaderboardsRequestUploadScoreKeepBest - String setMarkerBrushLocal String + leaderboardsRequestUploadScoreKeepBest Array - markerName setMarkerBrushLocal brush + leaderboardsRequestUploadScoreKeepBest [boardName, score, [details]] - $Code$"Marker1" setMarkerBrushLocal "DiagGrid";$/Code$ + $Code$leaderboardsRequestUploadScoreKeepBest ["TT01", 1234, [5,6,7,8]]$/Code$ - undefined / local + undefined / undefined - Nothing + Boolean + - setMarkerBrush + fadeSound - Selects the fill texture for the marker ("RECTANGLE" or "ELLIPSE"). Brush is the name of the subclass in CfgMarkerBrushes. - brush can be: - "Solid" - "SolidFull" (A3 only) - "Horizontal" - "Vertical" - "Grid" - "FDiagonal" - "BDiagonal" - "DiagGrid" - "Cross" - "Border" - "SolidBorder" + Changes the sound volume smoothly within the given time. - https://community.bistudio.com/wiki/setMarkerBrush + https://community.bistudio.com/wiki/fadeSound - String setMarkerBrush String + Number fadeSound Number - markerName setMarkerBrush brush + time fadeSound volume - $Code$"Marker1" setMarkerBrush "DIAGGRID";$/Code$ + $Code$5 fadeSound 0$/Code$ - undefined / global + undefined / local + (January 19, 2010) + This command doesn't work, in Arma 2 1.05. - Nothing + Nothing + - setMarkerColorLocal + tvValue - Sets marker color for the given marker locally. Marker color names and their corresponding RGBA values for Arma 3 could be found in here: CfgMarkerColors_Arma_3 + Returns scalar data from item on given path. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/setMarkerColorLocal + https://community.bistudio.com/wiki/tvValue - String setMarkerColorLocal String + tvValue Array + + Control tvValue Array - markerName setMarkerColorLocal color + tvValue [idc, [path]] + + _ctrl tvValue [path] - $Code$"MarkerOne" setMarkerColorLocal "ColorBlack";$/Code$ + $Code$tvValue [101, [0]];$/Code$ + + $Code$_ctrl tvValue [0,0,0];$/Code$ - global / local + local / local + (Sep 11 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Nothing + Number - Number + - setMarkerColor + isObjectHidden - Sets marker color. Marker color names and their corresponding RGBA values for Arma 3 could be found in here: CfgMarkerColors_Arma_3 + Checks visibility of a given object on the local machine. - https://community.bistudio.com/wiki/setMarkerColor + https://community.bistudio.com/wiki/isObjectHidden - String setMarkerColor String + isObjectHidden Object - markerName setMarkerColor color + isObjectHidden object - $Code$"MarkerOne" setMarkerColor "ColorBlack";$/Code$ + $Code$_bobIsHidden = isObjectHidden bob;$/Code$ - undefined / global + global / local - Nothing + Boolean + - setMarkerDirLocal + get3DENCamera - Sets the orientation of the marker. Angle is in degrees. + Returns the camera Object used by the Eden Editor. - https://community.bistudio.com/wiki/setMarkerDirLocal + https://community.bistudio.com/wiki/get3DENCamera - String setMarkerDirLocal Number + get3DENCamera - markerName setMarkerDirLocal angle + get3DENCamera - $Code$"Marker1" setMarkerDirLocal 90;$/Code$ + $Code$// set exact yaw, pitch, and roll + _y = 45; _p = -80; _r = 0; + get3DENCamera setVectorDirAndUp [ + [ sin _y * cos _p, cos _y * cos _p, sin _p], + [ [ sin _r,- sin _p, cos _r * cos _p],-_y] call BIS_fnc_rotateVector2D + ];$/Code$ + + $Code$//Look at player + _a = positionCameraToWorld [0,0,0] vectorFromTo ( getPosATL player ); + _y = asin (_a select 0); + _b = [_a,_y] call BIS_fnc_rotateVector2D ; + _z = _b select 2; + _p = asin (_z / sqrt ((_b select 1)^2 + _z^2)); + get3DENCamera setVectorDirAndUp [ + _a, + [ [0,- sin _p, cos _p],-_y] call BIS_fnc_rotateVector2D + ];$/Code$ - undefined / local + undefined / undefined - Nothing + Object + - setMarkerDir + setStaminaScheme - Sets the orientation of the marker. Angle is in degrees. + Set stamina bar color. The scheme can be "Normal", "FastDrain", "Exhausted" or "Default". - https://community.bistudio.com/wiki/setMarkerDir + https://community.bistudio.com/wiki/setStaminaScheme - String setMarkerDir Number + setStaminaScheme String - markerName setMarkerDir angle + setStaminaScheme scheme - $Code$"Marker1" setMarkerDir 90;$/Code$ + $Code$setStaminaScheme "Default";$/Code$ - undefined / global + undefined / undefined - Nothing + Nothing + - setMarkerPosLocal + cbChecked - Moves the marker. Pos format is Position2D. + Returns the current state of a checkbox (CT_CHECKBOX type 77 of Dialog Control ). - https://community.bistudio.com/wiki/setMarkerPosLocal + https://community.bistudio.com/wiki/cbChecked - String setMarkerPosLocal Array + cbChecked Control - markerName setMarkerPosLocal pos + cbChecked control - $Code$"MarkerOne" setMarkerPosLocal getMarkerPos "MarkerTwo";$/Code$ + $Code$_checked = cbChecked _myCheckBox;$/Code$ - undefined / local + undefined / undefined - Nothing + Boolean + - setMarkerPos + showScoretable - Moves the marker. Pos format is Position2D. + Forces the score table to be shown, hidden or reset to default functionality. Forcing score table will make it show even in SP. When score table is forced opened it cannot be closed manually, when it is force closed, it cannot be opened manually. - https://community.bistudio.com/wiki/setMarkerPos + https://community.bistudio.com/wiki/showScoretable - String setMarkerPos Array + showScoretable Number - markerName setMarkerPos pos + showScoretable force - $Code$"MarkerOne" setMarkerPos getMarkerPos "MarkerTwo"$/Code$ + $Code$showScoretable 1;$/Code$ - undefined / global + undefined / undefined - Effect is local in OFP. - - (March 31, 2008) - This command will not move a marker on dedicated server (if a client calls it). AI will continue to respawn at old spot if you are moving something like respawn_west. - - (August 7, 2009) - The marker position can actually be set in 3D. This has a benefit for respawn markers, when placed at the correct altitude ASL on the LHD, the correct altitude will be used for respawn. There is no particular benefit for regular markers since markerPos will still return 0 for the altitude array element. - Nothing + Nothing + - setMarkerShapeLocal + unassignTeam - Selects the shape (type) of the marker. - Shape can be "ICON", "RECTANGLE" or "ELLIPSE". + Unassigns the unit (in the case of a vehicle its commander unit) from his team. This is equal to unit assignTeam "MAIN". - https://community.bistudio.com/wiki/setMarkerShapeLocal + https://community.bistudio.com/wiki/unassignTeam - String setMarkerShapeLocal String + unassignTeam Object - markerName setMarkerShapeLocal shape + unassignTeam vehicleName - $Code$"Marker1" setMarkerShapeLocal "RECTANGLE";$/Code$ + $Code$unassignTeam _soldier2$/Code$ - undefined / local + local / undefined - Nothing + Nothing + - setMarkerShape + language - Selects the shape (type) of the marker. - Shape can be "ICON", "RECTANGLE", "ELLIPSE" or "POLYLINE". + Returns current game language. - https://community.bistudio.com/wiki/setMarkerShape + https://community.bistudio.com/wiki/language - String setMarkerShape String + language - markerName setMarkerShape shape + language - $Code$"Marker1" setMarkerShape "RECTANGLE";$/Code$ - + - undefined / global + undefined / undefined - Nothing + String + - setMarkerSizeLocal + do - Set marker size. - Size is in format [a-axis, b-axis]. + Executes code. Used as part of construct, such as while, with, for and switch. The code is always executed in missionNamespace unless do is used with with as an argument. - https://community.bistudio.com/wiki/setMarkerSizeLocal + https://community.bistudio.com/wiki/do - String setMarkerSizeLocal Array + While_Type/With_Type/For_Type/Switch_Type do Code - markerName setMarkerSizeLocal [a-axis, b-axis] + construct do code - $Code$"MarkerOne" setMarkerSizeLocal [100, 200];$/Code$ + $Code$while {b a} do {a = a + 1};$/Code$ + + $Code$// A practical example: Repair all members of a group to such a level that they are able to stand up: + { + while {! canStand _x && alive _x } do { + _x setDamage ( damage _x - 0.01); + }; + } forEach units group unitname;$/Code$ - undefined / local + undefined / undefined - Nothing + Anything + - setMarkerSize + setTerrainGrid - Set marker size. - Size is in format [a-axis, b-axis]. + Operation Flashpoint, VBS1 : Set desired terrain resolution (in meters). + For default landscapes, supported resolutions are: + 50 - smoothest, less lag + 25 - default in multiplayer + 12.5 - default in singleplayer + 6.25 + 3.125 - bumpiest, higher lag + If you select unsupported resolutions, nearest supported value is used instead. + Armed Assault, VBS2 : Terrain resolution is fixed, determined by the world created. This function controls terrain LOD instead (the distance in which the terrain mesh resolution starts to degrade). Higher number means less vertices are used for terrain rendering, making distant hills less smooth. Value 12.5 corresponds to selecting Terrain Detail Normal in Video options, 50 to Very Low, 3.125 to Very High. - https://community.bistudio.com/wiki/setMarkerSize + https://community.bistudio.com/wiki/setTerrainGrid - String setMarkerSize Array + setTerrainGrid Number - markerName setMarkerSize [a-axis, b-axis] + setTerrainGrid grid - $Code$"MarkerOne" setMarkerSize [100, 200];$/Code$ + $Code$setTerrainGrid 12.5$/Code$ - undefined / global + undefined / local + (August 4, 2006) + Notes from before the conversion: + This is like opening up your video preferences and changing "terrain detail", i.e.: setTerrainGrid 50 = lowest detail + setTerrainGrid 3.125 = highest detail It is similar to the command setViewDistance. + + (August 18, 2007) + Effects on grass: + 50: disables/removes grass altogether. + 25: grass is visible. + Lower values make grass drawn a bit further at distance. However the effect is decreasing rapidly: Grass radius of 25 is 100%. 12.5 is now like 100% + 20%, 6.25 is like 100% + 20% + 5% and 3.125 is 100% + 20% + 5% + 1%. Note these are estimates! + Demo Mission Test_VD_TD.Sara.rar : ViewDistance and TerrainGrid can be changed via RadioTriggers + + (December 15, 2019) + ArmA2 Supported Reso: + In ArmA2 you are not stuck to 50, 25, 12 etc. 45 is a lower setting then 25! + + (March 13, 2013) + ArmA 3 Multiplayer default: + Some testing indicates that the default value for Arma 3 multiplayer is 10 - just like before. 10 is between "Normal" and "High". + An user's terrain detail setting is ignored in multiplayer just like in ArmA 2. + + (November 19, 2014) + TerrainGrid values for Arma 3 1.34: + Low = 50 (NoGrass) + Standard = 25 + High = 12.5 + Very High = 6.25 + Ultra = 3.125 - Nothing + Nothing + - setMarkerTextLocal + openDLCPage - Sets the text label of an existing marker. + Opens a Steam page of the app with given appId. Only works for known appId (game + linked DLCs) - https://community.bistudio.com/wiki/setMarkerTextLocal + https://community.bistudio.com/wiki/openDLCPage - String setMarkerTextLocal String + openDLCPage Number - markerName setMarkerTextLocal text + openDLCPage dlcID - $Code$"Marker1" setMarkerTextLocal "You are here.";$/Code$ + $Code$openDLCPage 288520$/Code$ - undefined / local + undefined / undefined - Nothing + Boolean + - setMarkerText + getResolution - Sets the text label of an existing marker. + Returns an array containing all information about resolution. + The returned Array is as follow: [width, height, 2D viewport width, 2D viewport height, aspect ratio, UI scale] + Note: aspect ratio and UI scale are returned as coefficients and not 16:9 for example. - https://community.bistudio.com/wiki/setMarkerText + https://community.bistudio.com/wiki/getResolution - String setMarkerText String + getResolution - markerName setMarkerText text + getResolution - $Code$"Marker1" setMarkerText "You are here.";$/Code$ + $Code$_res = getResolution ; //some single monitor setup[ + 1360,//width + 768,//height + 867,//2D viewport width + 653,//2D viewport height + 1.77778,//aspect ratio + 0.85//UI scale + ]$/Code$ + + $Code$_res = getResolution ; //dedicated server[ + 160,//width + 120,//height + 136,//2D viewport width + 102,//2D viewport height + 1.33333,//aspect ratio + 0.85//UI scale + ]$/Code$ + + $Code$_res = getResolution ; //some triple monitor setup[ + 5760,//width + 1080,//height + 792,//2D viewport width + 594,//2D viewport height + 5.33333,//aspect ratio + 0.55//UI scale + ]$/Code$ - undefined / global + undefined / undefined - createMarker is GLOBAL in multiplayer, so all markers created with it exist for all clients. But they are not visible. Almost all setMarker commands can then be used for different effects on LOCAL clients. - BUT if you use the setMarkerText command, then the marker will become visible to all clients since the command is GLOBAL. + (05:38, 20 December 2010) + This command can be usefull to play a video (see this function BIS_fnc_playVideo ) in the given format if you've compiled it for different UI scale. - Nothing + Array + - setMarkerTypeLocal + isUIContext - Set marker type. See cfgMarkers for a list of standard markers. + Returns true if the script originated from some UI control event, for example from "onButtonDown" EH. Exists within parent scope and immediate child scopes. - https://community.bistudio.com/wiki/setMarkerTypeLocal + https://community.bistudio.com/wiki/isUIContext - String setMarkerTypeLocal String + isUIContext - markerName setMarkerTypeLocal type + isUIContext - $Code$"MarkerOne" setMarkerTypeLocal "Warning";$/Code$ + $Code$if ( isUIContext ) then { hint "UI control event"};$/Code$ + + $Code$_button ctrlSetEventHandler ['ButtonDown'," call { diag_log isUIContext }"]; // Outputs true$/Code$ + + $Code$_button ctrlSetEventHandler ['ButtonDown',"[] spawn { diag_log isUIContext }"]; // Outputs false$/Code$ - undefined / local + undefined / undefined - Nothing + Boolean + - setMarkerType + lbClear - Set marker type. See cfgMarkers for a list of standard markers. + Clear all items in listbox or combobox with id idc of topmost user dialog. - https://community.bistudio.com/wiki/setMarkerType + https://community.bistudio.com/wiki/lbClear - String setMarkerType String + lbClear Number + + lbClear Control - markerName setMarkerType type + lbClear idc + + lbClear control - $Code$"MarkerOne" setMarkerType "Warning";$/Code$ + $Code$lbClear 101;$/Code$ + + $Code$lbClear _ctrl;$/Code$ - undefined / global + local / local + More information on the LB command family can be found here - Nothing + Nothing - Nothing + - setMass + vehicleReportOwnPosition - Changes the mass of an object smoothly during the given time (in seconds). A time of zero (or using the alternative syntax) means an immediate change. + Gets whether the vehicle shares its own position via datalink with the Side center. - https://community.bistudio.com/wiki/setMass + https://community.bistudio.com/wiki/vehicleReportOwnPosition - Object setMass Array - - Object setMass Number + vehicleReportOwnPosition Object - myObject setMass [mass, time] - - myObject setMass mass + vehicleReportOwnPosition vehicle - $Code$myObject setMass [10,0.5];$/Code$ - - $Code$myObject setMass 10;$/Code$ + $Code$vehicleReportOwnPosition ( vehicle player );$/Code$ - local / global + undefined / undefined - (20 Jun, 2014) - (ArmA3 1.22) A quick reference: - category - setMass - setCenterOfMass - unit - The larger the mass is, the easier a unit will physically fatigued - N/A - aircraft - The larger the mass is, the more sensitive an aircraft will react to joystick, vice versa (Except when AFM is enabled). - Aircraft slant due to center change accordingly, and the position of the camera view will be altered relatively at the same time. (3rd person view) - vehicle - The larger the mass is, the slower a vehicle drives (Ships will sink), vice versa. (Land vehicle performs like a bouncing ball while ships accelerated pretty speedy.) - Vehicle slant due to center change accordingly. - - (March 26, 2015) - If you intend to use setMass in conjunction with ropeCreate in MP i highly recommend to first ropeCreate then setMass (on clientside). - RopeCreate in MP will set the mass of the attached object to the server value upon execution. - Nothing - Nothing + Boolean + - setMimic + doorPhase - Set person's facial expression. Following mimic values are recognized: - "Default" - "Normal" - "Smile" - "Hurt" - "Ironic" - "Sad" - "Cynic" - "Surprised" - "Agresive" - "Angry" - Since Arma 2 OA 1.6*, these values are used : - "neutral" - "dead" - "danger" - "hurt" - "aware" - "safe" - "combat" + Return animation phase of door on vehicle. - https://community.bistudio.com/wiki/setMimic + https://community.bistudio.com/wiki/doorPhase - Object setMimic String + Object doorPhase String - person setMimic mimic + object doorPhase door - $Code$_soldier1 setmimic "angry"$/Code$ + $Code$_phase = heli doorPhase "door_L";$/Code$ - global / local + undefined / undefined - To give the impression of hard faced guys going into a mission, use the setmimic "angry" command. I always have this on my guys to stop them grinning during a cutscene/mission. - - In OFP v1.96, a character will keep any facial expression you set indefinately. Setmimic to "" to return soldier to automatic facial expressions. - - (Jan 19, 2010) - Not working in Arma 2 1.05. - - (September 2, 2013) - In Arma 3 the following face expressions work: "neutral","dead","danger","hurt","aware","safe","combat". Names must be written in all lower case letters. There is another grimace in config - "unconscious", which doesn't quite work. - Nothing + Number + - setMousePosition + clearItemPool - Moves mouse pointer to specified position on the screen. x and y could be any number, but will be clipped so mouse never leaves the screen area. + Removes all items from ammo box (or any general weapon holder container) - https://community.bistudio.com/wiki/setMousePosition + https://community.bistudio.com/wiki/clearItemPool - setMousePosition Array + clearItemPool Object - setMousePosition [x, y] + clearItemPool box - $Code$setMousePosition [0.5, 0.5];$/Code$ + $Code$clearItemPool jeepOne$/Code$ undefined / undefined @@ -59428,34 +61525,28 @@ - Nothing + Nothing + - setMusicEffect + setVehicleReceiveRemoteTargets - Defines the music track played on activation. - Track is a subclass name of CfgMusic. In addition, "$STOP$" (stops the current music track). + Sets that the vehicle will be able to receive targets acquired by someone else via datalink from the Side center. - https://community.bistudio.com/wiki/setMusicEffect + https://community.bistudio.com/wiki/setVehicleReceiveRemoteTargets - Object setMusicEffect String - - Array setMusicEffect String + Object setVehicleReceiveRemoteTargets Boolean - trigger setMusicEffect track - - waypoint setMusicEffect track + vehicle setVehicleReceiveRemoteTargets bool - $Code$_trigger setMusicEffect "Track1"$/Code$ - - $Code$[_group1,1] setMusicEffect "$STOP$"$/Code$ + $Code$( vehicle player ) setVehicleReceiveRemoteTargets true;$/Code$ undefined / undefined @@ -59463,29 +61554,32 @@ - Nothing - Nothing + Nothing + - setMusicEventHandler + set3DENAttributes - Sets given music track event handler. Will overwrite other music event handlers. Use addMusicEventHandler if you want to stack them. + Set entity attributes. + An attribute is identified by its property ( data when it's engine-drive attribute) value in config. For the list of all attributes with their properties, see Setting Attributes. + ! + Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! - https://community.bistudio.com/wiki/setMusicEventHandler + https://community.bistudio.com/wiki/set3DENAttributes - setMusicEventHandler Array + set3DENAttributes Array - setMusicEventHandler [type, function] + set3DENAttributes [[ entities1, class1, value1 ],, [ entitiesN, classN, valueN ]] - $Code$_ehID = setMusicEventHandler ["MusicStart", " hint str _this"];$/Code$ - - $Code$_ehID = setMusicEventHandler ["MusicStop", " hint str _this"];$/Code$ + $Code$set3DENAttributes [[ get3DENSelected "Object","ControlMP", true ]]; + // Set all selected objects as playable$/Code$ undefined / undefined @@ -59493,279 +61587,238 @@ - Number + Boolean + - setNameSound + findIf - Sets the nameSound of a person. By default, when giving orders, the units are addressed by their number. When nameSound is set, it will be used instead to address the unit. For example: "Two, hold fire!", one can have: "Miller, hold fire!" + Searches for an element within array for which the code evaluates to true. Returns the 0 based index on success or -1 if not found. Code on the right side of the command is evaluated for each element of the array, processed element can be referenced in code as _x. + NOTE: Because command findIf terminates as soon as it finds an element that fulfills the condition, it is more efficient then count in scenarios where you need to check for presence / absence of at least one element that evaluates to true. - https://community.bistudio.com/wiki/setNameSound + https://community.bistudio.com/wiki/findIf - Object setNameSound String + Array findIf Code - person setNameSound name + array findIf code - $Code$unit1 setNameSound "dixon";$/Code$ - - $Code$unit1 setNameSound ""; // will reset to default behaviour$/Code$ + $Code$[unit1,unit2,unit3] findIf { ! alive _x }; //return index of first dead unit$/Code$ - $Code$_name = "Masood"; - unit1 setNameSound _name; - unit1 setName _name;$/Code$ + $Code$//two ways how to 'wait for all units to be dead': + waitUntil {[unit1,unit2,unit3] findIf { alive _x } == -1}; //fast, terminates as soon as it finds alive unit + waitUntil {[unit1,unit2,unit3] count { alive _x } == 0}; //slow, always goes through all array elements$/Code$ undefined / undefined - (September 19, 2013) - nameSound can be any preset BIS recorded name value. By default units will be called out in voice by their number. By using nameSound you can call them out by name using the following values: - Default: - Armstrong - Nichols - Tanny - Frost - Lacey - Larkin - Kerry - Jackson - Miller - McKendrick - Levine - Reynolds - BLUFOR: - Adams - Bennett - Campbell - Dixon - Everett - Franklin - Givens - Hawkins - Lopez - Martinez - OConnor - Ryan - Patterson - Sykes - Taylor - Walker - OPFOR: - Amin - Masood - Fahim - Habibi - Kushan - Jawadi - Nazari - Siddiqi - Takhtar - Wardak - Yousuf - INDEPENDENT: - Anthis - Costa - Dimitirou - Elias - Gekas - Kouris - Leventis - Markos - Nikas - Nicolo - Panas - Petros - Rosi - Samaras - Stavrou - Thanos - Vega - CODE NAMES: - Ghost - Stranger - Fox - Snake - Razer - Jester - Nomad - Viper - Korneedler - - (December 22, 2013) - setting an incorrect value like "0" or "randomString" will remove the callsign (" /* 2, */ fall back") - - (April 25, 2015) - While kylania listed available names, you can use any word you want. Available words for english can be found in configfile "RadioProtocolENG" "Words". - Nothing + Number + - setName + image - Sets the name of a location or a person. In Arma 3 this can be used to set name of a person but only in single player. + Creates a structured text containing the given image. - https://community.bistudio.com/wiki/setName + https://community.bistudio.com/wiki/image - Object setName String - - Object setName Array - - Location setName String + image String - object setName name - - unit setName [name, firstName, lastName] - - location setName name + image filename - $Code$myLocation setName "My Location Name";$/Code$ - - $Code$player setName "New Name";$/Code$ - - $Code$player setName ["Ben Kerry","Ben","Kerry"];$/Code$ + $Code$_txt1 = image "data\isniper.paa";$/Code$ - undefined / local + undefined / undefined - (July 9, 2010‎) - Appears to be only for the 3d editor. - - (September 19, 2013‎) - Support of a person as the first parameter from Arma 3 v. 1.02. - - (April 12, 2014) - Seems to have no effect on players in Multiplayer. (ArmA 3 v1.00) - - (August 18, 2014) - Only last name will appear in command bar i.e. this setname _mynameArray will display _mynameArray select 2. If setname is used with a string : this setname "blah", nothing occurs in command bar and default randomized name is displayed. - Dealing with the units' names in a script, _x (in a foreach units group, for example) will return the "object" as B ALFA 4-1:2 or the name written in ai unit name field in editor (if exists). This context is rather a "variable name" for each object (ai) than an "identity name" as given via setname function. + (March 21, 2009) + Although there is a dedicated image command, parseText gives more options: + $Code$_imageText = parseText " img size='5' color='#ff0000' image='fish.paa'/ "$/Code$ - Nothing - Nothing - Nothing + Structured_Text + - setObjectArguments + showCinemaBorder - Set object arguments in mission editor. - i - Some Old Editor Command + Forces drawing of cinema borders when using custom camera camCreate. This is normally used in cutscenes to indicate player has no control. - https://community.bistudio.com/wiki/setObjectArguments + https://community.bistudio.com/wiki/showCinemaBorder - Control setObjectArguments Array + showCinemaBorder Boolean - map setObjectArguments [object,[name1,value1,]] + showCinemaBorder show - + $Code$showCinemaBorder false ;$/Code$ + undefined / undefined + (13 October 2007) + This command does only work when Mission is started. Use waitUntil { time 0}; to be sure it works. - Any_Value + Nothing + - setObjectMaterialGlobal + updateObjectTree - Set the material of the given selection on all computers in a network session. + Update the editor object tree. + i + Some Old Editor Command - https://community.bistudio.com/wiki/setObjectMaterialGlobal + https://community.bistudio.com/wiki/updateObjectTree - Object setObjectMaterialGlobal Array + updateObjectTree Control - obj setObjectMaterialGlobal [selection, material] + updateObjectTree map - $Code$player setObjectMaterialGlobal [0, "A3\Structures_F\Data\Windows\window_set.rvmat"];$/Code$ - + - global / global + undefined / undefined - Nothing + Nothing + - setObjectMaterial + parseText - Sets material of object selection. The selection number is defined through the hiddenselection []={} array in the vehicle's config (starting with 0). + Creates a structured text by parsing the given XML description. Do not use parseText when displaying a localized text from stringtable.xml (see notes below). - https://community.bistudio.com/wiki/setObjectMaterial + https://community.bistudio.com/wiki/parseText - Object setObjectMaterial Array + parseText String - obj setObjectMaterial [selectionNumber, material] + parseText text - $Code$car setObjectMaterial [0,"A3\Structures_F\Data\Windows\window_set.rvmat"]; - car setObjectMaterial [1,"A3\Structures_F\Data\Windows\window_set.rvmat"];$/Code$ + $Code$_Stxt = parseText "First line img image='data\isniper.paa'/ br/ Second line";$/Code$ + + $Code$hintSilent parseText format [" t size='1.25' font='Zeppelin33' color='#ff0000' %1 lives remaining. /t ", 12];$/Code$ + + $Code$_clickableLink = parseText " a href='http://arma3.com' A3 /a ";$/Code$ - global / local + undefined / undefined + (22:07, 11 May 2007 (CEST)) + You can also colorate your text. You just have to use following tag: + t color='#ffff00' Your yellow text! /t + To change the size of your text, use this command: + t size='2.2' Your bigger text! /t + To change text font, use: + t font='Zeppelin33' Bold Text /t + To change horizontal alignment, use (parameter can be 'left', 'center', 'right'): + t align='center' Centered Text /t + To change vertical alignment within a line, use (parameter can be 'top', 'middle', 'bottom'): + t valign='bottom' Text at Line Bottom /t + To underline text, use: + t underline='true' Underlined Text /t + To put shadow under text, use: + t shadow='true' t shadowColor='#ff0000' Text with Red Shadow /t /t + Following statements are valid too: + t underline='1' Underlined Text /t + t shadow='1'shadowColor='#ff0000' Green shadow text /t + Following fonts are valid (got from config): + t font='Zeppelin32' Zeppelin32 (normal text) /t + t font='Zeppelin33' Zeppelin33 (bold text) /t + t font='Zeppelin33Italic' Zeppelin33Italic (bold italic text) /t + t font='Bitstream' Bitstream (same as Zeppelin32) /t + t font='TahomaB' TahomaB (same as Zeppelin32) /t + t font='LucidaConsoleB' LucidaConsoleB (like Courier) /t + + (21 March 2009) + Although there is a dedicated image command, parseText gives more options: + img size='5' color='#ff0000' image='fish.paa'/ + + (1 September 2016) + To convert a structured text back to a string type, just use: + _str = str parseText _structuredText; + + (September 1, 2017) + If you are parsing user-defined strings like player names, you may want to convert special characters to their XML entities as a precaution beforehand: + $Code$private _encodeText = + { + private _specialChars = [38, 60, 62, 34, 39]; // & " ' + private _convertTo = [[38,97,109,112,59], [38,108,116,59], [38,103,116,59], [38,113,117,111,116,59], [38,97,112,111,115,59]]; // + private _chars = []; + private "_i"; + { + _i = _specialChars find _x; + if (_i isEqualTo -1) then { _chars pushBack _x } else { _chars append (_convertTo select _i) }; + } forEach toArray param [0,"",[""]]; + toString _chars + }; + private _encodedName = _name call _encodeText; + private _redName = parseText format [" t color='#ff0000' %1 /t ", _encodedName]; $/Code$ - Nothing + Structured_Text + - setObjectProxy + camSetFocus - Set the proxy object associated with the given editor object. - i - Some Old Editor Command + Sets camera focus range in format [distance, blur]. blur param - sets the camera focus blur. It does not automatically commit changes (see camCommit ). Use [-1, -1] to disable focus completely. - https://community.bistudio.com/wiki/setObjectProxy + https://community.bistudio.com/wiki/camSetFocus - Control setObjectProxy Array + Object camSetFocus Array - map setObjectProxy [object,proxy object] + camera camSetFocus focusRange - $Code$_map setObjectProxy ["_group_0", vehicle (leader _group)];$/Code$ + $Code$_camera camSetFocus [50, 1];$/Code$ undefined / undefined @@ -59773,391 +61826,338 @@ - Nothing + Nothing + - setObjectTextureGlobal + ctrlSetPosition - Set the texture of the given selection on all computers in a network session. NOTES : - Do not put global commands such this one into init field in editor and expect it to work in Multiplayer. See Talk:setObjectTextureGlobal for the explanation. - Not all objects could be textured this way. To find out, run getObjectTextures command on an object. Empty array [] usually indicates it cannot be textured. - All textures must have resolution 2^x / 2^y (e.g. 16 / 16, 16 / 32, 64 / 256, 512 / 512, etc). The largest texture size commonly supported by graphics cards and RV engine is 4096x4096 + Sets wanted position and size for 2D control animation. Width and height are optional. ctrlCommit is required to complete the operation. For 3D control, param is relative [x,y,z] and no ctrlCommit is required as it cannot be animated. - https://community.bistudio.com/wiki/setObjectTextureGlobal + https://community.bistudio.com/wiki/ctrlSetPosition - Object setObjectTextureGlobal Array + Control ctrlSetPosition Array - obj setObjectTextureGlobal [selection, texture] + controlName ctrlSetPosition [x, y] + + controlName ctrlSetPosition [x, y, w, h] + + controlName ctrlSetPosition [x, y, z] - $Code$player setObjectTextureGlobal [0, "\MyAddon\blue.paa"];$/Code$ + $Code$// Move control: + _control2D ctrlSetPosition [0, 0]; + _control2D ctrlCommit 0;$/Code$ - $Code$//set up persistent texture keeper - player addEventHandler ["Take", { - ( getObjectTextures player + [ uniformContainer player getVariable "texture"]) - params ["_texUniform", "_texInsignia", "_texCustom"]; - if ( isNil "_texCustom") exitWith {}; - if (_texUniform == _texCustom) exitWith {}; - player setObjectTextureGlobal [0, _texCustom]; - false - }]; - //Example: make current uniform persistently blue - _texture = "#(rgb,8,8,3)color(0,0,1,1)"; //blue texture - player setObjectTextureGlobal [0, _texture]; //set it on player - uniformContainer player setVariable ["texture", _texture, true ]; //store it on uniform$/Code$ + $Code$// Move control and resize: + _control2D ctrlSetPosition [0, 0, 1, 1]; + _control2D ctrlCommit 0;$/Code$ + + $Code$_control3D ctrlSetPosition [0.5, 1, 0.5]; //centered and 1m away from screen$/Code$ - global / global + undefined / undefined - (March 8, 2015) - The effect is persistent and will be synchronized for players who join in progress. (Tested with Arma 3 v1.40) + (January 27, 2007) + IMPORTANT + You have to use ctrlCommit command to apply this effect(Arma v1.02.5103GER) - (December 29, 2015) - In some cases the ".paa" files do not work. Instead you can try ".jpg" files. + (May 22, 2017) + If the target ctrl is part of a ctrlGroup, the position needs to be relative to the ctrlGroup position. - (October 24, 2016) - Sometimes it could be necessary to set default material on an object for the texture to take effect: - $Code$_block = createVehicle ["Land_VR_Block_02_F", player getPos [20, getDir player ], [], 0, "CAN_COLLIDE"]; - _block setObjectMaterialGlobal [0, "\a3\data_f\default.rvmat"]; - _block setObjectTextureGlobal [0, "#(rgb,8,8,3)color(1,0,0,1)"];$/Code$ - Courtesy of Larrow + (July 20, 2017) + If the target control is a controls' group, all the child controls of that group will be moved automatically (as their position is relative to the control group rather than the display) - Nothing + Nothing + - setObjectTexture + vectorWorldToModel - Textures object selection with texture named in array. - Array has the form [selectionNumber, "Texture"]. - The selection number is defined through the hiddenselection []={} array in the vehicle's config (starting with 0). - NOTES : - Not all objects could be textured this way. To find out, run getObjectTextures command on an object. Empty array [] usually indicates it cannot be textured. - All textures must have resolution 2^x / 2^y (e.g. 16 / 16, 16 / 32, 64 / 256, 512 / 512, etc). The largest texture size commonly supported by graphics cards and RV engine is 4096x4096 - Supported formats:.pac,.paa,.jpg,.jpeg,.ogg,.ogv + Converts vector direction from world to model space. - https://community.bistudio.com/wiki/setObjectTexture + https://community.bistudio.com/wiki/vectorWorldToModel - Object setObjectTexture Array + Object vectorWorldToModel Array - object setObjectTexture [selectionNumber,texture] + object vectorWorldToModel worldDir - $Code$_objectname setObjectTexture [0, "\pboname\texture.paa"]; - _objectname setObjectTexture [1, "\pboname\texture2.paa"];$/Code$ - - $Code$_obj setObjectTexture [0, "#(rgb,8,8,3)color(1,0,0,1)"];$/Code$ - - $Code$_obj setObjectTexture [0, "#(argb,512,512,1)r2t(rendersurface,1.333)"];$/Code$ - - $Code$// When applying custom texture in Editor on vehicles that have randomization enabled ( Arma 3 Assets ), disable randomization first: - this setVariable ["BIS_enableRandomization", false ]; - this setObjectTexture [0,"#(rgb,8,8,3)color(1,0,0,1)"];$/Code$ + $Code$// Convert world space vector [0,-10,4] to model space of object _airplane: + _airplane vectorWorldToModel [0,-10,4];$/Code$ - global / local + undefined / undefined - (Aug 4, 2006) - In MP this command has only local effect. If you want to change a texture on all clients, you have to execute this command on each client (or setObjectTextureGlobal ). This command has also a bug: when a saved game is loaded the texture you have set will disappear and needs to be reset. - - (December 19, 2009) - Instead of bitmaps, procedural textures can be used. - The syntax for those is #(argb,8,8,3)color(R,G,B,A), where R,G,B stands for Red, Green, Blue, and A stands for Alpha, all values can be anything between 0 and 1 (including decimals). e.g. - $Code$_obj setObjectTexture [0,'#(argb,8,8,3)color(0,1,0,1)']$/Code$ - would color myObj in flat green. See Procedural Textures for more details. - - (August 25, 2014) - Also works with absolute path and.jpg files. - $Code$_obj setObjectTexture [0, "C:\Folder\Folder\Texture.paa"]; - _obj setObjectTexture [0, "C:\Folder\Folder\Texture.jpg"];$/Code$ - Texture can also be blank: - $Code$_obj setObjectTexture [2,""];$/Code$ - This will make the texture selection invisible on certain units without an error message. In some cases this is a desirable effect - - (March 18, 2015) - It is also possible to apply texture to unit's backpack, as it also has hidden selection (unfortunately does not work for vests) - $Code$(backpackContainer player) setObjectTexture [0,'#(argb,8,8,3)color(0,0,0,1)']$/Code$ - Also keep in mind that player's custom texture is being reset when you open BIS Arsenal (even without changing any gear) - - (May 13, 2015) - You can also use the gameinternal skins: List of MH9 Skins $Code$_obj setObjectTexture [0, "\a3\air_f\heli_light_01\data\skins\heli_light_01_ext_digital_co.paa"];$/Code$ - - (October 24, 2016) - Sometimes it could be necessary to set default material on an object for the texture to take effect: - $Code$_block = createVehicle ["Land_VR_Block_02_F", player getPos [20, getDir player ], [], 0, "CAN_COLLIDE"]; - _block setObjectMaterial [0, "\a3\data_f\default.rvmat"]; - _block setObjectTexture [0, "#(rgb,8,8,3)color(1,0,0,1)"];$/Code$ - Courtesy of Larrow - Nothing + Array + - setObjectViewDistance + missionConfigFile - Sets the rendering distance of objects (and shadows). + Return root of mission Description.ext entries hierarchy. + ! + Since introduction of the Eden Editor, scenario attributes can be configured in the editor itself, not only in the external Description.ext file. To access desired value independently on where it's stored, use the following commands instead: + getMissionConfigValue + getMissionConfig - https://community.bistudio.com/wiki/setObjectViewDistance + https://community.bistudio.com/wiki/missionConfigFile - setObjectViewDistance Number - - setObjectViewDistance Array + missionConfigFile - setObjectViewDistance distance - - setObjectViewDistance [objectDistance, shadowDistance] + missionConfigFile - $Code$setObjectViewDistance 2000;$/Code$ + $Code$for "_i" from (0) to (( count paramsArray ) - 1) do { + missionNamespace setVariable [ configName (( missionConfigFile /"Params") select _i), paramsArray select _i]; + };$/Code$ - $Code$setObjectViewDistance [2000,800];$/Code$ + $Code$// To define custom values in description.ext : + class myMissionConfig + { + class mySetup + { + myNumber = 3; + myArray[] = { 1, 2, 3 }; + myText = "LOL"; + }; + }; + // To read defined custom values from a script:_myNumber = getNumber ( missionConfigFile "myMissionConfig" "mySetup" "myNumber"); + _myArray = getArray ( missionConfigFile "myMissionConfig" "mySetup" "myArray"); + _myText = getText ( missionConfigFile "myMissionConfig" "mySetup" "myText");$/Code$ + + $Code$// To get file path with description.ext to play sound via playSound3D : + _filePath = [( str missionConfigFile ), 0, -15] call BIS_fnc_trimString ;$/Code$ + + $Code$// Obtaining mission root using A3 substring functionality + MISSION_ROOT = str missionConfigFile select [0, count str missionConfigFile - 15];$/Code$ - undefined / local + undefined / undefined + (February 17, 2015) + missionConfigFile can be used to parse mission.sqm file data as well if it is included into description.ext : + class MissionSQM + { + #include "mission.sqm" + }; + Then mission.sqm data can be accessed like this: + $Code$ getNumber ( missionConfigFile "MissionSQM" "version"); //12 - version param in mission.sqm $/Code$ + (courtesy of Master85 ) - Nothing - Nothing + Config + - setOvercast + enableFatigue - Set overcast to given value smoothly during given time (in seconds). Zero time means immediate change. An overcast setting of zero means clear (sunny) weather, and one means storms and rain are very likely. Higher overcast values also result in higher wind speeds. + Enables/Disables the person's fatigue. - https://community.bistudio.com/wiki/setOvercast + https://community.bistudio.com/wiki/enableFatigue - Number setOvercast Number + Object enableFatigue Boolean - time setOvercast overcast + unit enableFatigue enable - $Code$50 setOvercast 0.5$/Code$ + $Code$player enableFatigue false ;$/Code$ + + $Code${ _x enableFatigue false ; } forEach ( units group player );$/Code$ - undefined / local + local / global - (August 4, 2006) - Notes from before the conversion: - Use setRain if you want to make sure it rains. - - Only one script command induced weather change (either setOvercast or setFog ) can be happening at a time. Starting a new weather change will immediately halt the current weather change. SetRain changes are independent and can occur simultaneously to a weather change. - - Arma 3 's volumetric clouds cannot be instantly changed (it would take up to a few seconds to do a full recompute). Therefore, 0 setOvercast 0 will not have the desired effect. You can use skipTime to get to the desired cloud coverage. - NOTE: To get instant, seamless overcast change to overcast 1 advance the time 24 hours with skipTime while setting overcast transition time to 86400 seconds (24 hours) -- Killzone_Kid - $Code$86400 setOvercast 1; - skipTime 24; - //to remain on the same date: - skipTime -24; - 86400 setOvercast 1; - skipTime 24; - $/Code$ - - With removal of simulSetHumidity‎, in order to add instant cloud cover, execute simulWeatherSync with delay (for now): - $Code$ skipTime -24; - 86400 setOvercast 1; - skipTime 24; - 0 = [] spawn { - sleep 0.1; - simulWeatherSync ; - };$/Code$ - There is slight freeze with simul command. - - Delay in Arma 3 doesn't work for quick changes. Using 120 setOvercast 1 only reaches full overcast after about 50 minutes. Using setTimeMultiplier does speed up the overcast, but it doesn't render any clouds. You will need to skipTime or forceWeatherChange to render clouds if you want it to happen within the hour. + (March 24, 2015) + When the player dies enableFatigue is set to true after the respawn - (May 4, 2016) - Actual transition time is inversely proportional to the timeMultiplier. For example, a time of 7200 (2 hours) and a timeMultiplier of 2 will result in a real-life transition time of 7200 / 2 = 3600 (1 hour). - In case of overcast, a timeMultiplier 1 will cause gradual desyncing of the cloud cover with the overcast value, so it is advised that you multiply the transition time by the multiplier, i.e. : - $Code$(7200 * timeMultiplier ) setOvercast 1$/Code$ + (January 27, 2016) + To precise the note of Harmdhast, this command is not persistent (after respawn). So, in MP, you'll have to enableFatigue false, also in onPlayerRespawn.sqf or through the MP eventHandler MPRespawn. - Nothing + Nothing + - setOwner + configHierarchy - From server machine, change the ownership of an object to a given client. Returns true if locality was changed. - Since Arma 3 v1.40, this command should not be used to transfer ownership of units with AI ( agents are an exception to this rule). - Using command in an unintended way will display an on-screen warning and log a message to.rpt file. - To transfer ownership of all AI units in a group properly, use setGroupOwner instead. + Returns hierarchy of the given config class. Just like with inheritsFrom, only complete config classes are supported - https://community.bistudio.com/wiki/setOwner + https://community.bistudio.com/wiki/configHierarchy - Object setOwner Number + configHierarchy Config - object setOwner clientID + configHierarchy configClass - $Code$_someObject setOwner 12;$/Code$ - - $Code$_someObject setOwner ( owner _playerObject);$/Code$ + $Code$_hierarchy = configHierarchy ( configFile "CfgVehicles" "Car"); + //[bin\config.bin,bin\config.bin/CfgVehicles,bin\config.bin/CfgVehicles/Car]$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - - (January 7, 2015) - The ownership can only be given from server to client. For some reason the server cannot return ownership back with this command. This is fixed in Arma 3 1.40 - Boolean + Array + - setOxygenRemaining + mapAnimAdd - Sets oxygen remaining. It has no effect when soldier is not diving. Oxygen remaining is a number between 0 and 1. + Add next frame to map animation. - https://community.bistudio.com/wiki/setOxygenRemaining + https://community.bistudio.com/wiki/mapAnimAdd - Object setOxygenRemaining Number + mapAnimAdd Array - unit setOxygenRemaining value + mapAnimAdd [time, zoom, position] - $Code$player setOxygenRemaining 0; // Drowns player$/Code$ + $Code$mapAnimAdd [1, 0.1, markerPos "anim1"]; + mapAnimCommit ;$/Code$ + + $Code$mapAnimAdd [3, 0.01, player ]; + mapAnimCommit ;$/Code$ - undefined / undefined + local / local + (05:26, 2 February 2007) + In OFP v1.96, the mapAnim series of commands, together with forceMap can only be used in the intro and mission, as it is not possible to access the map from the outro. (not checked, sourced from an old copy of the OFPEC comref) - Nothing + Nothing + - setParticleCircle + addEventHandler - Updates particle source, creates particles in circle with given radius. Velocity is transformed and added to total velocity. Correspondence between CfgCloudlets class param names and command array of params: - $Code$particleSource setParticleCircle - [ - circleRadius, - circleVelocity - ];$/Code$ + Adds event handler (EH) to the given object and returns EH handle. If EH has some data to return upon event (e.g. the "killed" EH will return an array with 2 elements: the killed unit, and the killer), it is passed in _this variable. Since Arma 3 v.1.63.137807 the EH handle is also stored in _thisEventHandler variable and is available during EH code execution. For more information about event handlers and their types check the scripting topic Event handlers in this reference. You may add as many event handlers of any type as you like to every unit. For instance, if you add an event handler of type "killed" and one already exists, the old one doesn't get overwritten. Use removeEventHandler to delete event handlers. - https://community.bistudio.com/wiki/setParticleCircle + https://community.bistudio.com/wiki/addEventHandler - Object setParticleCircle Array + Object addEventHandler Array - particleSource setParticleCircle [radius, velocity] + object addEventHandler [type, command] - + $Code$_EHkilledIdx = player addEventHandler ["killed", {_this exec "playerKilled.sqs"}]$/Code$ + + $Code$this addEventHandler ["killed", " hint format ['Killed by %1',_this select 1]"]$/Code$ + - undefined / undefined + global / local + (July 7, 2015) + When using overridable EH, such as "InventoryOpened" and similar, where returning true allows to override default action, exitWith cannot be used to return value. So: + $Code$ if (whatever) exitWith { true }; false ;$/Code$ + Forget about it, will not work. Instead use: + $Code$ if (whatever) then { true } else { false };$/Code$ + 100% satisfaction guaranteed! - Nothing + Number + - setParticleClass + setTaskResult - Set parameters from existing config class. ClassName is name of the class from CfgCloudlets. - Since version 1.11.114706 you can use setParticleParams to overwrite many values set by config class, particularity those defined in ParticleArray. + Set a result of the task. - https://community.bistudio.com/wiki/setParticleClass + https://community.bistudio.com/wiki/setTaskResult - Object setParticleClass String + Task setTaskResult Array - source setParticleClass className + task setTaskResult [state,result] - $Code$_source01 = "#particlesource" createVehicleLocal _pos01; - _source01 setParticleClass "ObjectDestructionFire1Smallx"; - _source01 attachTo [_object,[0,0,0]];$/Code$ - + undefined / undefined - (June 28, 2015) - This can be very useful for getting features that can't normally be added with commands, such as AI view blocking and particles that can only be above/underwater. - Nothing + Nothing + - setParticleFire + fog - Set fire parameters to particle effect. - Note: You need to create emitter at first. Basic parameters of particle effect must be defined too. You can use script commands setParticleClass or setParticleParams to do so (see example). Correspondence between CfgCloudlets class param names and command array of params: - $Code$particleSource setParticleFire - [ - coreIntensity, - coreDistance, - damageTime - ];$/Code$ + A getter for setFog. Returns the current value of the fog in range 0...1. - https://community.bistudio.com/wiki/setParticleFire + https://community.bistudio.com/wiki/fog - Object setParticleFire Array + fog - source setParticleFire [coreIntensity, coreDistance, damageTime] + fog - $Code$_emitter = "#particlesource" createVehicleLocal ( getPos player ); - _emitter setParticleClass "MediumSmoke"; - _emitter setParticleFire [0.3,1.0,0.1];$/Code$ + $Code$_foglevel = fog ;$/Code$ undefined / undefined @@ -60165,60 +62165,28 @@ - Nothing + Number + - setParticleParams + setWaypointName - Set parameters to particle source. Array is in format ParticleArray. - Since Arma 3 version 1.11.114706 you can use this command to overwrite many values set by setParticleClass, particularity those defined in ParticleArray. Correspondence between CfgCloudlets class param names and command array of params: - $Code$particleSource setParticleParams - [ - [ - particleShape, - particleFSNtieth, - particleFSIndex, - particleFSFrameCount, - particleFSLoop - ], - animationName, - particleType, - timerPeriod, - lifeTime, - position, - moveVelocity, - rotationVelocity, - weight, - volume, - rubbing, - size, - color, - animationSpeed, - randomDirectionPeriod, - randomDirectionIntensity, - onTimerScript, - beforeDestroyScript, - this, - angle, - onSurface, - bounceOnSurface, - emissiveColor - ];$/Code$ + Changes the waypoint name. - https://community.bistudio.com/wiki/setParticleParams + https://community.bistudio.com/wiki/setWaypointName - Object setParticleParams Array + Waypoint setWaypointName String - particleSource setParticleParams array + waypoint setWaypointName name - $Code$see ParticleArray$/Code$ + $Code$[_grp,2] setWaypointName "myName";$/Code$ undefined / undefined @@ -60226,358 +62194,417 @@ - Nothing + Nothing + - setParticleRandom + addItemToUniform - Sets randomization of particle source parameters. Correspondence between CfgCloudlets class param names and command array of params: - $Code$particleSource setParticleRandom - [ - lifeTimeVar, - positionVar, - moveVelocityVar, - rotationVelocityVar, - sizeVar, - colorVar, - randomDirectionPeriodVar, - randomDirectionIntensityVar, - angleVar, - bounceOnSurfaceVar - ];$/Code$ + Create new item and store it to soldier's uniform. The item can also be a weapon or a magazine. - https://community.bistudio.com/wiki/setParticleRandom + https://community.bistudio.com/wiki/addItemToUniform - Object setParticleRandom Array + Object addItemToUniform String - particleSource setParticleRandom [lifeTime, position, moveVelocity, rotationVelocity, size, color, randomDirectionPeriod, randomDirectionIntensity, angle, bounceOnSurface] + unit addItemToUniform item - $Code$_PS setParticleRandom [0, [0.1, 0.1, 0.1], [0, 0, 0.5], 0, 0.1, [0, 0, 0, 0], 0, 0];$/Code$ + $Code$player addItemToUniform "itemGPS";$/Code$ + + $Code$player addItemToUniform "hgun_Rook40_F";$/Code$ - undefined / undefined + global / global - (July 03, 2013) - Support of parameter bounceOnSurface ( Number - 0-1) is in the game since Arma 3 version 0.74. It's variability in speed's loosing in collision with ground. Requires collisions with ground enabled by script command setParticleParams. - Nothing + Nothing + - setPiPEffect + setPosition - Sets Render Target's visual effect (Picture-in-Picture). - 0: Normal - [0] - 1: Night Vision - [1] - 2: Thermal - [2] - 3: Color Correction - [3, enabled, brightness, contrast, offset, blend [r,g,b,a], lerp [r,g,b,a], rgb [r,g,b,a]] - 4: Mirror - [4] currently not working - 5: Chromatic Aberration - [5, enabled, powerx, powery, (bool) aspectCorrection] currently not working - 6: Film Grain - [6, enabled, intensity, sharpness, grainsize, intensityx1, intensityx2, (bool) monochromatic] currently not working - 7: Thermal Inverted [7] + Sets the position of a location. - https://community.bistudio.com/wiki/setPiPEffect + https://community.bistudio.com/wiki/setPosition - String setPiPEffect Array + Location setPosition Array - name setPiPEffect [effect, optionalParam1,, optionalParamN] + location setPosition pos - $Code$"rendersurface" setPiPEffect [0];$/Code$ - - $Code$"rendertarget0" setPiPEffect [3, 1.0, 1.0, 1.0, 0.0, [0.0, 1.0, 0.0, 0.25], [1.0, 0.0, 1.0, 1.0], [0.199, 0.587, 0.114, 0.0]];$/Code$ - - $Code$cam = "camera" camCreate ( player modelToWorld [0,-5,2]); - cam cameraEffect ["internal","back","rtt"]; - "rtt" setPiPEffect [2]; - with uiNamespace do { - pic = findDisplay 46 ctrlCreate ["RscPicture", -1]; - pic ctrlSetPosition [0,0,1,1]; - pic ctrlCommit 0; - pic ctrlSetText "#(argb,512,512,1)r2t(rtt,1.0)"; - };$/Code$ - - $Code$// Black&White: - "rtt" setPiPEffect [3,1,1,0.4,0,[0,0,0,0],[1,1,1,0],[1,1,1,1]];$/Code$ + $Code$myLocation setPosition [1000,5320,10]$/Code$ undefined / undefined - (July 9, 2017) - If Color Corrections effect has been used, going back to Normal will have no effect. In order to unset Color Corrections, set 2nd param in it (enable) to 0. - Nothing + Nothing + - setPilotCameraDirection + lnbSortByValue - Sets the direction of object airplane or helicopter pilotCamera (vector in model space). + Sorts given multicolumn listbox by lnbValue in given column in ascending or descending order. - https://community.bistudio.com/wiki/setPilotCameraDirection + https://community.bistudio.com/wiki/lnbSortByValue - Object setPilotCameraDirection Array + lnbSortByValue Array + + control lnbSortByValue Array - object setPilotCameraDirection Vector3D + lnbSortByValue [idc, column, reversed] + + control lnbSortByValue [column, reversed] - $Code$vehicle player setPilotCameraDirection [0,1,0] //re-centers the camera$/Code$ + $Code$lnbSortByValue [1800, 1, false ];$/Code$ + + $Code$_ctl lnbSortByValue [1, true ]$/Code$ - local / undefined + undefined / undefined - Nothing + Nothing - Nothing + - setPilotCameraRotation + setType - Sets rotation (relative to the centered camera position) of the object airplane or helicopter pilotCamera. + Changes a location to the specified class. Location classes are defined in CfgLocationTypes. - https://community.bistudio.com/wiki/setPilotCameraRotation + https://community.bistudio.com/wiki/setType - Object setPilotCameraRotation Array + Location setType String - object setPilotCameraRotation rotation + location setType name - $Code$vehicle player setPilotCameraRotation [ rad 90, rad 45 ]$/Code$ + $Code$myLocation setType "RockArea"$/Code$ - local / undefined + undefined / undefined - Nothing + Nothing + - setPilotCameraTarget + getClientStateNumber - Sets an area or target to be tracked by the object airplane or helicopter pilotCamera. - To track an object the vehicle has to have appropriate sensors ( scanners ) that can detect the given target type. - Using objNull will unlock the camera + Returns client state in network game. Works on both, client and dedicated server. The following states are possible: + getClientStateNumber + getClientState + 0 + "NONE" + No client (or singleplayer) + 1 + "CREATED" + Client is created + 2 + "CONNECTED" + Client is connected to server, message formats are registered + 3 + "LOGGED IN" + Identity is created + 4 + "MISSION SELECTED" + Mission is selected + 5 + "MISSION ASKED" + Server was asked to send / not send mission + 6 + "ROLE ASSIGNED" + Role was assigned (and confirmed) + 7 + "MISSION RECEIVED" + Mission received + 8 + "GAME LOADED" + Island loaded, vehicles received + 9 + "BRIEFING SHOWN" + Briefing was displayed + 10 + "BRIEFING READ" + Ready to play mission + 11 + "GAME FINISHED" + Game was finished + 12 + "DEBRIEFING READ" + Debriefing read, ready to continue with next mission - https://community.bistudio.com/wiki/setPilotCameraTarget + https://community.bistudio.com/wiki/getClientStateNumber - Object setPilotCameraTarget Object/Array + getClientStateNumber - object setPilotCameraTarget target + getClientStateNumber - $Code$_pilotCamTrack = vehicle player setPilotCameraTarget [2100,4200,4.2];$/Code$ + $Code$_state = getClientStateNumber ;$/Code$ - $Code$_pilotCamTrack = vehicle player setPilotCameraTarget BIS_Edita;$/Code$ + $Code$_inGame = getClientStateNumber 8;$/Code$ - local / undefined + undefined / undefined - Boolean + Number + - setPilotLight + vectorDir - Switches headlights of a vehicle on/off. Note that the vehicle has to be local, for global variant use Arma 3 Actions " LightOn "/" LightOff " + Return object's normalized direction vector in world space ( [x,y,z] ). + A unit facing North would return [0,1,0] + A unit facing East would return [1,0,0] + A unit facing South would return [0,-1,0] + A unit facing West would return [-1,0,0] - https://community.bistudio.com/wiki/setPilotLight + https://community.bistudio.com/wiki/vectorDir - Object setPilotLight Boolean + vectorDir Object - vehicle setPilotLight set + vectorDir objectName - $Code$car setPilotLight true ;$/Code$ + $Code$_dirVector = vectorDir _unit;$/Code$ - local / global + global / undefined - Nothing + Array + - setPitch + setPilotCameraDirection - Sets the pitch of a persons voice. + Sets the direction of object airplane or helicopter pilotCamera (vector in model space). - https://community.bistudio.com/wiki/setPitch + https://community.bistudio.com/wiki/setPilotCameraDirection - Object setPitch Number + Object setPilotCameraDirection Array - person setPitch pitch + object setPilotCameraDirection Vector3D - $Code$unit1 setPitch 1$/Code$ + $Code$vehicle player setPilotCameraDirection [0,1,0] //re-centers the camera$/Code$ - undefined / local + local / undefined - Nothing + Nothing + - setPlayable + for - Create MP role for the unit. The roles created this way are used for Join In Progress and Team Switch. - NOTE: Currently in Arma 3 this command does nothing. - Doesn't work as intended + This operator creates a For Type which is used in the for-constructs (There is the for forspec and the for var syntax available for this construct) - https://community.bistudio.com/wiki/setPlayable + https://community.bistudio.com/wiki/for - setPlayable Object + for String/Array - setPlayable unitName + for arg - $Code$setPlayable _aPerson$/Code$ + $Code$for "_i" from 1 to 10 do { debugLog _i;};$/Code$ + + $Code$for "_i" from 9 to 1 step -2 do { debugLog _i;};$/Code$ + + $Code$for [{_i=0}, {_i 10}, {_i = _i + 1}] do {hint str _i};$/Code$ undefined / undefined - (december 19, 2009) - if you want to add a TeamSwitchable unit (at least in Arma2), better use addSwitchableUnit - Nothing + For_Type + - setPlayerRespawnTime + isManualFire - Sets the time interval to wait on player respawn. It resets to mission default on mission start. In Single Player or when respawn type is GROUP or SIDE in Multiplayer, setting player respawn time has no effect and is always -1. + Returns true if manual fire is on. Manual fire could either be selected in vehicle action menu (if available) or with action "ManualFire" and "ManualFireCancel". Always returns false for a soldier. - https://community.bistudio.com/wiki/setPlayerRespawnTime + https://community.bistudio.com/wiki/isManualFire - setPlayerRespawnTime Number + isManualFire Object - setPlayerRespawnTime interval + isManualFire vehicleName - $Code$setPlayerRespawnTime 5;$/Code$ + $Code$_bool = isManualFire vehicle player ;$/Code$ - undefined / local + global / undefined + (February 5, 2017) + Manual fire means the effectiveCommander of the vehicle controls firing (but not aiming) of the gunner turret weapons (usually path [0]), while unable to fire his own weapons. - Nothing + Boolean + - setPosASL2 + everyBackpack - Sets the object position. The pos array uses the PositionASL format. The version of the command does not offset based on object center. - Appears to be broken + Returns array of backpacks stored in given crate or vehicle. Used for accessing backpack content of a backpack on ground. - https://community.bistudio.com/wiki/setPosASL2 + https://community.bistudio.com/wiki/everyBackpack - Object setPosASL2 Array + everyBackpack Object - obj setPosASL2 pos + everyBackpack box - $Code$player setPosASL2 [ getPosASL player select 0, ( getPosASL player select 1) + 10, getPosASL player select 2]$/Code$ + $Code$everyBackpack cursorTarget ;$/Code$ + + $Code$_vehicleBackpacks = everyBackpack vehicle player ;$/Code$ undefined / undefined - (21 Aug, 2013) - This command appears to do nothing in both Arma 2 and Arma 3. Tested on 21-08-2013. + (Apr 29, 2014) + (ArmA3 ver 1.16), here's a quick reference to backpack command family. + Command + Operand type + Return + Example + firstBackpack + Object (WeaponHolder, AmmoCrate, VehicleCrate) + Object (eg 2bba9d00# 163957: backpack_compact.p3d) + firstBackpack ( getPos player nearestObject "weaponholder") + backpackContainer + Unit( Object ) + Object (eg 2bba9d00# 163957: backpack_compact.p3d) + backpackContainer player //Currently same as unitBackpack + unitBackpack + Unit( Object ) + Object (eg 2bba9d00# 163957: backpack_compact.p3d) + unitBackpack player //Currently same as backpackContainer + backpack + Unit( Object ) + String (eg 2bba9d00# 163957: backpack_compact.p3d) + backpack player //See also ( typeOf backpackContainer player ) or ( typeOf unitBackpack player ) + backpackCargo + Object (WeaponHolder, AmmoCrate, VehicleCrate) + Array of String (eg ["Backpack0","Backpack1"]) + backpackCargo _AmmoCrate + getBackpackCargo + Object (WeaponHolder, AmmoCrate, VehicleCrate) + Array of Array (eg [["Backpack0","Backpack1"],[1,1]]) + getBackpackCargo _AmmoCrate + everyBackpack + Object (WeaponHolder, AmmoCrate, VehicleCrate) + Array of Object (eg [22504f00# 163960: backpack_fast.p3d...]) + everyBackpack _AmmoCrate - Nothing + Array + - setPosASLW + addMagazineGlobal - Sets the object position above sea surface. The pos array uses the PositionASLW format. + Adds a magazine to the unit. + Note: You may create invalid combinations by adding more magazines than the free space in unit's inventory allows. When doing so, application behaviour is undefined. + This command is broken in MP as it dupes inventory items. Use addMagazine array for now, it takes global argument and has global effect too. - https://community.bistudio.com/wiki/setPosASLW + https://community.bistudio.com/wiki/addMagazineGlobal - Object setPosASLW Array + Object addMagazineGlobal String - obj setPosASLW pos + unit addMagazineGlobal magazineName - $Code$_diver setPosASLW [( position _diver) select 0, ( position _diver) select 1, -10];$/Code$ + $Code$player addMagazineGlobal "30Rnd_65x39_caseless_mag";$/Code$ global / global @@ -60585,275 +62612,354 @@ - Nothing + Nothing + - setPosASL + productVersion - Sets the object position above sea level. The pos array uses the PositionASL format. + Returns the product's friendly name, identifier and version. In Arma 3 it also returns branch identifier, whether or not the game was launched using mods, and the platform. - https://community.bistudio.com/wiki/setPosASL + https://community.bistudio.com/wiki/productVersion - Object setPosASL Array + productVersion - object setPosASL pos + productVersion - $Code$player setPosASL [ getPosASL player select 0, ( getPosASL player select 1) + 10, getPosASL player select 2];$/Code$ + $Code$hint str productVersion ; // would return ["Arma 2 OA", "arma2oa", 162, 95208] on Arma 2 OA 1.62.95208$/Code$ - $Code$this setPosASL [ position this select 0, position this select 1, 9]; //[ X, Y, Z]$/Code$ + $Code$hint str productVersion ; // ["Arma 3","Arma3",137,128764,"Development",false,"Windows"]$/Code$ - global / global + undefined / undefined - Nothing + Array + - setPosATL + safeZoneW - Sets the position of an object relative to the terrain. + Returns the width of the screen in screen measurement units. Taken from top left corner of the default viewport (0,0) of the screen and going in the same direction as the X axis, the value will be positive but resulting X will end up beyond the right border. Therefore in order to calculate X of the right screen border, the length of safeZoneX must be subtracted from safeZoneW, but because it is negative, it must be added instead. _screenRightBorderX = safeZoneW + safeZoneX. The measurement units depend on the current screen resolution getResolution. See also SafeZone - https://community.bistudio.com/wiki/setPosATL + https://community.bistudio.com/wiki/safeZoneW - Object setPosATL Array + safeZoneW - object setPosATL pos + safeZoneW - $Code$player setPosATL [ getPosATL player select 0, ( getPosATL player select 1) - 10, getPosATL player select 2];$/Code$ + $Code$_screenWidth = safeZoneW ;$/Code$ + + $Code$_screenRightBorderX = safeZoneW + safeZoneX ;$/Code$ - global / global + undefined / undefined - (Feb 26, 2012) - Please Note : this command demands PositionATL format ; one does not simply give 2D position, as this function won't do anything. - - (November 11, 2014) - If you plan on creating bases through script, setPosATL and getPosATL will be your friends. Other commands like getPos or getPosASL will return the position relative to any objects that are underneath. I wrote a base building helper script and through multiple tests, I have found that getPosATL is the absolute best way to get position for objects that are over land. - Nothing + Number + - setPosWorld + safeZoneX - Sets position of an object based on PositionWorld, which is PositionASL of the model centre [0,0,0]. + Returns the X of the left border of the screen, which is also a distance in screen measurement units from top left corner of the default viewport (0,0) of the screen to the left border of the screen. Since it is going in opposite way of the X axis, the value is negative. The measurement units depend on the current screen resolution getResolution. See also SafeZone - https://community.bistudio.com/wiki/setPosWorld + https://community.bistudio.com/wiki/safeZoneX - Object setPosWorld PositionWorld + safeZoneX - object setPosWorld position + SafeZoneX - $Code$_obj setPosWorld getPosWorld _obj;$/Code$ + $Code$_screenLeftBorderX = safeZoneX ; // returns a float value 0$/Code$ - global / global + undefined / undefined - Nothing + Number + - setPosition + cameraOn - Sets the position of a location. + Returns the vehicle to which the camera is attached. - https://community.bistudio.com/wiki/setPosition + https://community.bistudio.com/wiki/cameraOn - Location setPosition Array + cameraOn - location setPosition pos + cameraOn - $Code$myLocation setPosition [1000,5320,10]$/Code$ - + undefined / undefined + (November 2, 2015) + $Code$ _MyScreenPos = getPos cameraOn; code + This would getPos for the current player or vehicle that the client's camera is attached to. + code _CameraOnSetPos = cameraOn setPos _pos; code + This would do setPos for the current player or vehicle that the client's camera is attached to. + /dd + /dl + $/Code$ - Nothing + Object + - setPos + random - Sets object position. + Random real (floating point) value from 0 (inclusive) to x (not inclusive). + Since Arma 3 v1.55.133393 alternative syntax is added, allowing to define Gaussian Distribution params. Uses the same method as setTriggerTimeout command. Quite useful for spawning loot for example, making more valuable items more rare. + Since Arma 3 v1.67.139663 an alternative syntax is available, allowing to generate semi-random number based on provided seed. + Since Arma 3 v1.67.139663 an alternative syntax is available, generating pseudo-random noise texture based on provided seed and returning a single number between 0 (included) and 1 (excluded) at supplied x and y coordinates. - https://community.bistudio.com/wiki/setPos + https://community.bistudio.com/wiki/random - Object setPos Array + random Number + + random Array + + Number random Number + + Number random Array - object setPos pos + random x + + random [min, mid, max] + + seed random x + + seed random [x,y] - $Code$player setPos [ getPos player select 0, getPos player select 1, ( getPos player select 2) +10]; - //the same as above using modelToWorld : - player setPos ( player modelToWorld [0,0,10]); - //the same as above using vectorAdd : - player setPos ( getPos player vectorAdd [0,0,10]);$/Code$ + $Code$_rNumber = random 1;$/Code$ - $Code$_obj setPos [ getPos _obj select 0, getPos _obj select 1, -5];$/Code$ + $Code$_rNumber = random -10;$/Code$ - $Code$player setPos ( getPos _obj);$/Code$ + $Code$// Generate random position inside a circle + _center getPos [_radius * sqrt random 1, random 360];$/Code$ + + $Code$// Compare (each command was executed 100000 times to gather statistics): + floor random 10; + // 0 - 10099 (10%) + // 1 - 10040 (10%) + // 2 - 10154 (10%) + // 3 - 9910 (10%) + // 4 - 10023 (10%) + // 5 - 9937 (10%) + // 6 - 10118 (10%) + // 7 - 9716 (10%) + // 8 - 9986 (10%) + // 9 - 10017 (10%) + floor random [0,5,10]; + // 0 - 109 (0%) + // 1 - 1604 (2%) + // 2 - 6839 (7%) + // 3 - 16671 (17%) + // 4 - 24706 (25%) + // 5 - 24702 (25%) + // 6 - 16626 (17%) + // 7 - 6925 (7%) + // 8 - 1702 (2%) + // 9 - 116 (0%) + floor random [0,10,0]; + // 0 - 19 (0%) + // 1 - 209 (0%) + // 2 - 817 (1%) + // 3 - 2384 (2%) + // 4 - 4841 (5%) + // 5 - 8976 (9%) + // 6 - 14067 (14%) + // 7 - 18955 (19%) + // 8 - 23605 (24%) + // 9 - 26127 (26%) + floor random [0,10,5]; + // 0 - 11 (0%) + // 1 - 98 (0%) + // 2 - 430 (0%) + // 3 - 1149 (1%) + // 4 - 2384 (2%) + // 5 - 4546 (5%) + // 6 - 8612 (9%) + // 7 - 16283 (16%) + // 8 - 28393 (28%) + // 9 - 38094 (38%)$/Code$ - global / global + undefined / undefined - (6 Feb, 2011) - Calling setPos on an object can cause the object's orientation to change. This depends on the terrain and/or objects below the object. This was tested by calling setPos on a test object with the position of a helicopter ( modelToWorld with some offset). When flying over land the orientation of the test object would rapidly change depending on the slope of the ground and objects beneath it. - Comment applicable to Ver 1.96 and earlier : - obj1 setPos [x,y,z] - Will place most objects z metres above ground level (negative numbers for underground). But if obj1 is a trigger then it will be placed z metres above sea level. This can be very useful if you want to check a unit's height above sea level but it can be a problem if you want to move a trigger to create an explosion or a sound. To move a trigger to a location at ground level: - $Code$triggername setPos [x,y,0]; - triggername setPos [x,y, abs ( getPos triggername select 2)];$/Code$ - Note for Armed Assault: Using setPos for a trigger will work in exactly the same way that setPos works for other objects - namely that setPos [x,y,z] will place the trigger z metres above ground level. - SetPos for static objects like a ammo crate do not work in MP. - - (23 Nov, 2011) - You can use getPos and setPos on triggers. + (July 12, 2015) + Random selections including negative numbers can be obtained via: + $Code$_Xrnd = round(random 200) -100;$/Code$ + This will yield numbers between -100 and 100. + Be careful using random numbers in multiplayer, each client will come up with a different result. See multiplayer tutorials for more general information about locality. + The number returned is unlikely to be a whole number. To return a whole number use either round, ceil or floor together with random : + x=round(random 5) will return 0,1,2,3,4 or 5. (non-uniform distribution, 0 and 5 are half as likely to be selected than any of the other numbers) + x=floor(random 5) will return 0,1,2,3 or 4. (uniform distribution, all numbers have the same probability of being selected) + x=ceil(random 5) will return 0,1,2,3,4 or 5. (0 is very unlikely, but possible, as ceil 0 is 0) - Nothing + Number - Number - Number - Number + - setPylonLoadOut + getObjectChildren - Will add missile to vehicle pylon, TransportPylonsComponent in config is required + Return a list of all the children of the specified object. + i + Some Old Editor Command - https://community.bistudio.com/wiki/setPylonLoadOut + https://community.bistudio.com/wiki/getObjectChildren - Object setPylonLoadOut Array + Control getObjectChildren String - vehicle setPylonLoadOut [pylon nameindex, magazine name, forced, turret] + map getObjectChildren object - $Code$( vehicle player ) setPylonLoadOut ["pylon1", ""];$/Code$ - + undefined / undefined - Boolean + Array + - setPylonsPriority + markerAlpha - Overrides default pylons priorities + Gets the marker alpha. See setMarkerAlpha. - https://community.bistudio.com/wiki/setPylonsPriority + https://community.bistudio.com/wiki/markerAlpha - Object setPylonsPriority Array + markerAlpha String - vehicle setPylonsPriority [priority pylon1, priority pylon2,] + markerAlpha markerName - $Code$( vehicle player ) setPylonsPriority [0,1,2,3,4,5,5,4,3,2,1,0];$/Code$ + $Code$AlphaMarker = markerAlpha "myMarker;$/Code$ - undefined / undefined + global / undefined - Nothing + Number + - setRadioMsg + skill - Sets radio trigger menu title text (0 - 0 - map radio). Use "NULL" to disable radio slot. Use "" to restore default title + Returns current level of ability of a unit, in range between 0 and 1, 1 being the highest level of skill. - https://community.bistudio.com/wiki/setRadioMsg + https://community.bistudio.com/wiki/skill - Number setRadioMsg String + skill Object + + Object skill String - index setRadioMsg text + skill unitName + + unitName skill skillName - $Code$1 setRadioMsg "Click meeeeeeeeee"; //changes title of radio Alpha$/Code$ + $Code$_skill = skill unit1;$/Code$ + + $Code$_myCourage = player skill "courage"$/Code$ - undefined / local + undefined / undefined + Skill of AI units set via the slider in unit placement screen varies from 0.2 to 1.0. + If superAI is enabled all units have skill of 1.0 regardless of the skill slider - Nothing + Number - Number + - setRainbow + allow3DMode - Changes the rainbow value smoothly during the given time (in seconds). A time of zero means there will be an immediate change. + Allow/dissallow 3D mode., + i + Some Old Editor Command - https://community.bistudio.com/wiki/setRainbow + https://community.bistudio.com/wiki/allow3DMode - Number setRainbow Number + Control allow3DMode Boolean - time setRainbow value + map allow3DMode bool @@ -60861,72 +62967,61 @@ undefined / undefined - (April 24, 2015) - It should be known that this command does not create a rainbow in all conditions. As in real life, the rainbow can only appear after rainfall and opposite of the sun when it is low on the horizon. - Nothing + Nothing + - setRain + canSlingLoad - Set rain density smoothly over the given transition time (in seconds). A transition time of zero means an immediate change. A rain density of zero is no rain, one is maximum rain. Rain is not possible when overcast is less than 0.7. - NOTE : Since Arma 3 this command is MP synchronised, if executed on server, the changes will propagate globally. If executed on client effect is temporary as it will soon change to the server setting. + Returns true if it is possible to sling load cargo - https://community.bistudio.com/wiki/setRain + https://community.bistudio.com/wiki/canSlingLoad - Number setRain Number + Object canSlingLoad Object - time setRain rain + vehicle canSlingLoad cargo - $Code$60 setRain 1;$/Code$ + $Code$_slingable = veh1 canSlingLoad veh2;$/Code$ - $Code$// Force no rain: - 0 setRain 0; - forceWeatherChange ; - 999999 setRain 0;$/Code$ + $Code$hint str (( vehicle player ) canSlingLoad veh1);$/Code$ - undefined / global + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - - (December 15, 2015) - setTimeMultiplier does NOT affect transition time. - - (November 16, 2016) - Using Example 2 on dedicated server might need additional interference on JIP clients. The reason is that JIP has rain value 0 slowly changing to 0. To force client to sync one can execute this on client: $Code$ skipTime 1; skipTime -1;$/Code$ - Nothing + Boolean + - setRandomLip + sin - Enables/Disables random lip. When enabled, the unit continuously moves its lips as if it's talking. + Sine of x, argument in Degrees. - https://community.bistudio.com/wiki/setRandomLip + https://community.bistudio.com/wiki/sin - Object setRandomLip Boolean + sin Number - unit setRandomLip bool + sin x - $Code$player setRandomLip true ;$/Code$ + $Code$_sine = sin 30;//result is 0.5$/Code$ undefined / undefined @@ -60934,62 +63029,61 @@ - Nothing + Number + - setRank + getFatigue - Sets rank of given unit. - Possible values: PRIVATE, CORPORAL, SERGEANT, LIEUTENANT, CAPTAIN, MAJOR or COLONEL. - Since Arma 3 v1.67 this command is + Returns fatigue of given unit. - https://community.bistudio.com/wiki/setRank + https://community.bistudio.com/wiki/getFatigue - Object setRank String + getFatigue Object - unitName setRank rank + getFatigue unit - $Code$player setRank "COLONEL"$/Code$ + $Code$value = getFatigue player ;$/Code$ + + $Code$if ( getFatigue player 0.5) then { player sideChat "I'm good to go!" };$/Code$ - global / local + global / undefined - (Mar 26, 2009) - Changing a unit's rank using either setUnitRank or setRank will also REPLACE their current rating dependent on their new rank (colonels have a rating of 7500 etc). That is to say REPLACE, not add to: the unit's old rating will disappear with the rank change. - - (April 12, 2014) - Behavior when used on players in multiplayer seems unpredictable. (ArmA 3 1.00) + getFatigue can be applied to remote unit however it will not read the changes made to unit's fatigue with setFatigue command. Only natural changes resulting from unit moving will be counted. When applied to local unit, it will read resulting value of natural fatigue combined with artificial changes added locally by setFatigue. In short, the server wouldn't know the correct value of remote unit's fatigue if you used setFatigue on the unit prior. - Nothing + Number + - setRectangular + rotorsRpmRTD - Set the shape of a location to be either rectangular or elliptical. Locations default shape is elliptical. + Returns rotors RPM - https://community.bistudio.com/wiki/setRectangular + https://community.bistudio.com/wiki/rotorsRpmRTD - Location setRectangular Boolean + rotorsRpmRTD Object - location setRectangular set + rotorsRpmRTD RTD_helicopter - $Code$myLocation setRectangular true ;$/Code$ + $Code$_mh9_main = ( rotorsRpmRTD _MH9) select 0;//main rotor + _mh9_tail = ( rotorsRpmRTD _MH9) select 1;//tail rotor$/Code$ undefined / undefined @@ -60997,150 +63091,202 @@ - Nothing + Array + - setRepairCargo + canSuspend - Set amount of repair resources in cargo space of repair vehicle. - Amount 1 is full cargo. + Returns true if sleep, uiSleep or waitUntil commands can be used in current scope. Usually when suspension is not allowed but used, for example when code is executed in unscheduled environment, the script engine would ignore any suspension command and throw error: "Suspending not allowed in this context". Using canSuspend command allows to detect the correct environment for the code. + Note : The definition of scheduled and unscheduled environment is not the same as whether or not the script execution can or cannot be suspended. For example while. sqs and. fsm scripts are scheduled (i.e. added to the scheduler : diag_activeSQSScripts, diag_activeMissionFSMs ), they cannot use sleep or be suspended like execVM or spawn scripts can, therefore canSuspend for these types of scripts will return false. - https://community.bistudio.com/wiki/setRepairCargo + https://community.bistudio.com/wiki/canSuspend - Object setRepairCargo Number + canSuspend - vehicleName setRepairCargo amount + canSuspend - $Code$_repairTruck1 setRepairCargo 0$/Code$ + $Code$onEachFrame + { + systemChat str canSuspend ; //false + [] spawn { hint str canSuspend }; //true + onEachFrame {}; + };$/Code$ + + $Code$// Make sure the function code is always spawned even when called: + mysleep = + { + if (! canSuspend ) exitWith {_this spawn mysleep}; + sleep _this; + hint ("slept " + str _this); + }; + 5 call mysleep;$/Code$ - local / global + undefined / undefined - (July 10, 2015) - (ArmA 3 1.44) setRepairCargo will have no effect if the vehicle doesn't support getRepairCargo. - Nothing + Boolean + - setShadowDistance + safeZoneH - Sets the shadows rendering distance. + Returns the height of the screen in screen measurement units. Taken from top left corner of the default viewport (0,0) of the screen and going in the same direction as the Y axis, the value will be positive but resulting Y will end up beyond the bottom border. Therefore in order to calculate Y of the bottom screen border, the length of safeZoneY must be subtracted from safeZoneH, but because it is negative, it must be added instead. _screenBottomBorderY = safeZoneH + safeZoneY. The measurement units depend on the current screen resolution getResolution. See also SafeZone - https://community.bistudio.com/wiki/setShadowDistance + https://community.bistudio.com/wiki/safeZoneH - setShadowDistance Number + safeZoneH - setShadowDistance value + SafeZoneH - $Code$setShadowDistance 1000$/Code$ + $Code$_screenHeight = safeZoneH ;$/Code$ + + $Code$_screenBottomBorderY = safeZoneH + safeZoneY ;$/Code$ - undefined / local + undefined / undefined - Nothing + Number + - setShotParents + insertEditorObject - Sets vehicle and instigator pair for the given projectile. + Insert an object to the editor and assign arguments. Create script is,not called. Returns the ID of the new EditorObject. Subtype class is,optional. + i + Some Old Editor Command + + + https://community.bistudio.com/wiki/insertEditorObject + + + Control insertEditorObject Array + + + map insertEditorObject [type,value,[name1,value1,],subtype class] + + + + + undefined / undefined + + + (May 7, 2015) + "This works only in the old 3D editor" - KM + + + String + + + + + + connectTerminalToUAV + + + Connect person with UAV terminal to UAV unit. UAV Terminal item needs to be assigned to GPS slot. If UAV is already connected to another terminal, this new connection will fail. - https://community.bistudio.com/wiki/setShotParents + https://community.bistudio.com/wiki/connectTerminalToUAV - Object setShotParents Array + Object connectTerminalToUAV Object - projectile setShotParents [vehicle, instigator] + person connectTerminalToUAV uav - $Code$myProjectile setShotParents [ vehicle bob, bob];$/Code$ + $Code$bool = player connectTerminalToUAV uav1;$/Code$ - $Code$tank addEventHandler ["Fired", {_this select 6 setShotParents [tank, commander tank]];$/Code$ + $Code$player connectTerminalToUAV objNull ; //disconnect$/Code$ global / global - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Boolean + - setSide + vectorModelToWorld - Sets a location's side. The default side is Unknown. + Converts vector direction from model to world space. - https://community.bistudio.com/wiki/setSide + https://community.bistudio.com/wiki/vectorModelToWorld - Location setSide Side + Object vectorModelToWorld Array - location setSide side + object vectorModelToWorld modelDir - $Code$myLocation setSide resistance$/Code$ + $Code$// Convert model space vector [0,-10,4] to world space; vector gets rotated according to _airplane: + _airplane vectorModelToWorld [0,-10,4];$/Code$ undefined / undefined - (16:00, 3 December 2013 (CEST)) - For units, vehicles you can use: " array joinSilent createGroup Side ", e.g. in init: "[this] joinSilent createGroup EAST;" described in the note below - - (19:05, 6 August 2009 (CEST)) - This is a frequent question on OFPEC, but produced here because it was difficult to find an answer to. setSide does not work for men, vehicles, etc.: it is intended for locations ( i.e., territory). If you want to switch a unit's ( e.g., the player's) side in the middle of a battle, make the unit joinSilent a group on the given side instead. If you want the unit to become the group leader after joining, use selectLeader. I haven't tested the idea of spawning a temporary unit of that side, assigning the player to that unit, setting the player as the leader, then deleting the original unit, but I don't see why it wouldn't work. (It begs the question why we don't have a setSide object function, though.) - Nothing + Array + - setSimpleTaskAlwaysVisible + tvSetText - Makes the given task allways visible or not. + Sets string text to item on given path. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/setSimpleTaskAlwaysVisible + https://community.bistudio.com/wiki/tvSetText - Task setSimpleTaskAlwaysVisible Boolean + tvSetText Array + + Control tvSetText Array - taskID setSimpleTaskAlwaysVisible state + tvSetText [idc, path, text] + + control tvSetText [path, text] - $Code$getWarka setSimpleTaskAlwaysVisible true ;$/Code$ + $Code$tvSetText [101, [0], "Test data"];$/Code$ + + $Code$_ctrl tvSetText [[0,0,0], "Test data"];$/Code$ undefined / undefined @@ -61148,110 +63294,122 @@ - Nothing + Nothing - Nothing + - setSimpleTaskCustomData + false - Set custom data for the task. Tooltip will be drawn in task list on the right side. Description will be drawn in task description panel on the bottom. + Always false. - https://community.bistudio.com/wiki/setSimpleTaskCustomData + https://community.bistudio.com/wiki/false - Task setSimpleTaskCustomData Array + false - task setSimpleTaskCustomData [IconPath, tooltip, description] + false - + $Code$_var = false ; + systemChat str _var; //false$/Code$ + undefined / undefined - Nothing + Boolean + - setSimpleTaskDescription + setObjectViewDistance - Attach descriptions to the simple task. + Sets the rendering distance of objects (and shadows). - https://community.bistudio.com/wiki/setSimpleTaskDescription + https://community.bistudio.com/wiki/setObjectViewDistance - Task setSimpleTaskDescription Array + setObjectViewDistance Number + + setObjectViewDistance Array - task setSimpleTaskDescription [description, descriptionShort, descriptionHUD] + setObjectViewDistance distance + + setObjectViewDistance [objectDistance, shadowDistance] - $Code$mytask setSimpleTaskDescription ["Today you have to kill Spongebob","Kill Spongebob","Here he is!"];$/Code$ + $Code$setObjectViewDistance 2000;$/Code$ + + $Code$setObjectViewDistance [2000,800];$/Code$ - undefined / undefined + undefined / local - Nothing + Nothing - Nothing + - setSimpleTaskDestination + commandFollow - Attach a destination to the simple task. + Order the given unit to follow the given other unit (via the radio). - https://community.bistudio.com/wiki/setSimpleTaskDestination + https://community.bistudio.com/wiki/commandFollow - Task setSimpleTaskDestination Array + Object/Array commandFollow Object - task setSimpleTaskDestination pos + unitName commandFollow followedunit - $Code$_tskGoHere setSimpleTaskDestination ( getMarkerPos "obj1");$/Code$ + $Code$_soldier1 commandFollow _soldier2$/Code$ - undefined / undefined + local / undefined - Nothing + Nothing + - setSimpleTaskTarget + safeZoneY - Attach a target to the simple task. Overrides setSimpleTaskDestination. + Returns the Y of the top border of the screen, which is also a distance in screen measurement units from top left corner of the default viewport (0,0) of the screen to the top border of the screen. Since it is going in opposite way of the Y axis, the value is negative. The measurement units depend on the current screen resolution getResolution. See also SafeZone - https://community.bistudio.com/wiki/setSimpleTaskTarget + https://community.bistudio.com/wiki/safeZoneY - Task setSimpleTaskTarget Array + safeZoneY - task setSimpleTaskTarget [target, precisePosition] + SafeZoneY - $Code$task setSimpleTaskTarget [targetVehicle, true];$/Code$ + $Code$_screenTopBorderY = safeZoneY ; // returns a float value 0$/Code$ undefined / undefined @@ -61259,52 +63417,67 @@ - Nothing + Number + - setSimpleTaskType + drawEllipse - Attach type to the simple task. See Default Task Types. + Draws an ellipse on the map. Just like with marker or trigger area, negative a and b will result in hexagon. - https://community.bistudio.com/wiki/setSimpleTaskType + https://community.bistudio.com/wiki/drawEllipse - Task setSimpleTaskType String + Control drawEllipse Array - task setSimpleTaskType taskType + map drawEllipse [c, a, b, angle, color, fill] - $Code$( currentTask player ) setSimpleTaskType "attack";$/Code$ + $Code$findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", + { + _this select 0 drawEllipse [ + player, 10, 10, 0, [1, 0, 0, 1], "" + ]; + _this select 0 drawEllipse [ + player, -10, -10, 0, [1, 1, 1, 1], "#(rgb,8,8,3)color(1,0.6,0,1)" + ]; + _this select 0 drawEllipse [ + player, -10, -10, 90, [0, 0, 1, 1], "" + ]; + }];$/Code$ undefined / undefined + (July 7, 2015) + Be careful when using this command. Unlike map markers, the draw commands can decrease your framerate. - Nothing + Nothing + - setSimulWeatherLayers + pickWeaponPool - Sets number of simul weather layers, affects quality of simul weather clouds. + Transfer weapons and magazines from cargo of object into weapon pool (used in campaign to transfer weapons into next mission). - https://community.bistudio.com/wiki/setSimulWeatherLayers + https://community.bistudio.com/wiki/pickWeaponPool - setSimulWeatherLayers Number + pickWeaponPool Object - setSimulWeatherLayers layers + pickWeaponPool object @@ -61314,28 +63487,28 @@ - Nothing + Nothing + - setSize + setWindStr - Sets the size (radius) of a location. - The width is 2 * x, the height is 2 * y. + Changes the wind strength smoothly during the given time (in seconds). A time of zero means there will be an immediate change. - https://community.bistudio.com/wiki/setSize + https://community.bistudio.com/wiki/setWindStr - Location setSize Array + Number setWindStr Number - location setSize size + time setWindStr value - $Code$myLocation setSize [10,30]$/Code$ + $Code$60 setWindStr 0.8; // set the wind strength to 0.8 gradually over the next 60 seconds$/Code$ undefined / undefined @@ -61343,436 +63516,501 @@ - Nothing + Nothing + - setSkill + laserTarget - Sets ability level of person (commander unit). Value of skill may vary from 0 to 1. + Returns laser target object created by given unit (gunner in vehicle or on foot) when using "Laserdesignator" or another laser targeting device. Laser target object is global and can be retrieved from any PC. - https://community.bistudio.com/wiki/setSkill + https://community.bistudio.com/wiki/laserTarget - Object setSkill Number + laserTarget Object - vehicleName setSkill skill + laserTarget unitName - $Code$_hero setskill 1$/Code$ + $Code$_target = laserTarget gunner heli;$/Code$ + + $Code$_designatedPos = position laserTarget player;$/Code$ - undefined / undefined + global / undefined - (August 4, 2006) - Notes from before the conversion: - Approximate ranges are: - Novice 0.25 - Rookie = 0.25 and = 0.45 - Recruit 0.45 and = 0.65 - Veteran 0.65 and = 0.85 - Expert 0.85 + (December 15, 2010) + Need to be try with a soldier and laser designator - (June 30, 2007) - If "SuperAI" is turned on in the Difficulty Menu, the skill level is always 1, no matter what was defined in the editor or via this command. + (December 19, 2010) + Works with either infantry or vehicles. Returns objNull if no target is present - Nothing + Object + - setSlingLoad + get3DENGrid - Creates sling loading from first object to second object if possible. To unload cargo, pass objNull as second param. + Returns the grid increment for the given transformation type. + Transformation types: + Rotation - "r" + Translation - "t" + Scale - "s" - https://community.bistudio.com/wiki/setSlingLoad + https://community.bistudio.com/wiki/get3DENGrid - Object setSlingLoad Object + get3DENGrid String - vehicle setSlingLoad cargo + get3DENGrid type - $Code$_success = heli1 setSlingLoad veh1;$/Code$ - - $Code$// To unload cargo: - _success = heli setSlingLoad objNull ;$/Code$ + $Code$currentMovementIncrement = get3DENGrid "t";// returns 1$/Code$ undefined / undefined - (November 8, 2014) - "... if possible " - FYI, that only means that 'vehicle' has to be able to lift 'cargo'. The position/distance does not matter, 'cargo' is automatically moved to a position that is close enough but doesn't doesn't collide with 'vehicle'. (can also be used if 'vehicle' is not flying, in which case 'cargo' will be placed and attached on the ground next to it). - Boolean + Number + - setSoundEffect + forcedMap - Defines the different sound effects. - Sound - plays a 2D sound from CfgSounds - Voice - plays a 3D sound from CfgSounds - SoundEnv - plays an environmental sound from CfgEnvSounds - SoundDet (only for triggers) - creates a dynamic sound object attached to a trigger defined in CfgSFX - To stop any sound, deactivate the trigger (might take up to 0.5 sec to stop) or delete the trigger (immediate). Also use "$NONE$" to skip the sound (1st item), when there is none to be used (Example 3, 4, 5). + Returns if map was forced by using forceMap command or openMap command with force option - https://community.bistudio.com/wiki/setSoundEffect + https://community.bistudio.com/wiki/forcedMap - Object setSoundEffect Array - - Array setSoundEffect Array + forcedMap - trigger setSoundEffect [sound, voice, soundEnv, soundDet] - - waypoint setSoundEffect [sound, voice, soundEnv, soundDet] + forcedMap - $Code$_trigger setSoundEffect ["Alarm", "", "", ""];$/Code$ - - $Code$[_group1,2] setSoundEffect ["Alarm", "", "", ""];$/Code$ - - $Code$_trigger setSoundEffect ["$NONE$", "Alarm", "", ""];$/Code$ - - $Code$_trigger setSoundEffect ["$NONE$", "", "BattlefieldFirefight1", ""];$/Code$ - - $Code$_trigger setSoundEffect ["$NONE$", "", "", "Owl"];$/Code$ + $Code$_forceMapForced = forcedMap select 0; + _openMapForced = forcedMap select 1;$/Code$ undefined / undefined - (October 2, 2013) - To avoid having to create a dummy sound definition, you can use $NONE$ instead. - $Code$private "_trigger"; - _trigger = createTrigger ["EmptyDetector", position player]; - _trigger setTriggerStatements ["true", "", ""]; - _trigger setSoundEffect ["$NONE$", "", "BattlefieldFirefight1", ""]; - $/Code$ - - (March 7, 2012) - When using this function, I found that if the parameter sound was empty, then you would always get a 'Sound not found' error. The following code fixes this problem. You need to create a dummy sound. This is what example 3 is hinting towards. - description.ext: - $Code$class CfgSounds - { - sounds[] = {}; - class NoSound - { - name = "NoSound"; - sound[] = {"", 0, 1}; - titles[] = {}; - }; //Dummy sound needed for setSoundEffect command, due to stupid bug in engine. - }; - $/Code$ - (code sample above written by 'CarlGustaffa' on the Bohemia Interactive forums.) - script.sqf: - $Code$_trigger = createTrigger[ "EmptyDetector", _position ]; - _trigger setTriggerStatements [ "true", "", "" ]; - _trigger setSoundEffect[ "NoSound", "", "", "Wind2_EP1" ]; - $/Code$ - Nothing - Nothing + Array + - setSpeaker + waypointType - Sets the speaker of a person. In order to setSpeaker dynamically in MP, the command needs to run on every computer with exactly the same params otherwise the speaking unit could appear silent on other PCs. Run this on server: - [bob, "Male02GRE"] remoteExecCall ["setSpeaker", 0]; + Gets the waypoint type. + Type can be: + "MOVE" + "DESTROY" + "GETIN" + "SAD" + "JOIN" + "LEADER" + "GETOUT" + "CYCLE" + "LOAD" + "UNLOAD" + "TR UNLOAD" + "HOLD" + "SENTRY" + "GUARD" + "TALK" + "SCRIPTED" + "SUPPORT" + "GETIN NEAREST" + "DISMISS" + "AND" + "OR" + More details at Waypoint types. - https://community.bistudio.com/wiki/setSpeaker + https://community.bistudio.com/wiki/waypointType - Object setSpeaker String + waypointType Array - person setSpeaker speaker + waypointType waypoint - $Code$unit1 setSpeaker "Male02GRE";$/Code$ + $Code$waypointType [groupOne,1],$/Code$ - local / local + undefined / undefined - (September 19, 2013) - speaker can be any of the following: - Male01ENG - Male01ENGB - Male01GRE - Male01PER - Male02ENG - Male02ENGB - Male02GRE - Male02PER - Male03ENG - Male03ENGB - Male03GRE - Male03PER - Male04ENG - Male04ENGB - Male04GRE - Male05ENG - Male06ENG - Male07ENG - Male08ENG - Male09ENG - - (January 12, 2014) - speakers available in Arma 3 (v1.08) : - Gender - Profile setting - US English (B) for EN-GB available - Greek - Persian - Male - Male01_F - Male01ENG(B) - Male01GRE - Male01PER - Male02_F - Male02ENG(B) - Male02GRE - Male02PER - Male03_F - Male03ENG(B) - Male03GRE - Male03PER - Male04_F - Male04ENG(B) - Male04GRE - Male01PER - Male05_F - Male05ENG - Male05GRE - Male02PER - Male06_F - Male06ENG - Male02GRE - Male03PER - Male07_F - Male07ENG - Male03GRE - Male01PER - Male08_F - Male08ENG - Male04GRE - Male02PER - Male09_F - Male09ENG - Male01GRE - Male03PER - Female - - - - - - - - - - (November 10, 2014) - In order to stop a unit from talking you can use: - $Code$_unit setSpeaker "NoVoice"$/Code$ - This will have no negative effect on the ability to command the unit. + (August 6, 2015) + With the new sling loading in Arma 3, 2 new waypoint types are added aswell being: + Drop Cargo and Lift Cargo. + The names for these 2 waypoints are: + "UNHOOK" and "HOOK". - Nothing + String + - setSpeech + waypointAttachObject - Add speech to location. + Attaches a static object via it's numeric ID to the given waypoint. + The alternative syntax is (at least) available since Arma 2. - https://community.bistudio.com/wiki/setSpeech + https://community.bistudio.com/wiki/waypointAttachObject - Location setSpeech String + Array waypointAttachObject Number + + Array waypointAttachObject Object - location setSpeech speech + waypoint waypointAttachObject objectID + + waypoint waypointAttachObject object - + $Code$[_grp, 2] waypointAttachObject 1234$/Code$ + + $Code$_wp = group player addWaypoint [[1907.5,5746.5,0.00144196],0]; + _wp waypointAttachObject (( waypointPosition _wp) nearestObject 66220);$/Code$ + undefined / undefined + (June 20, 2014) + In Arma 3 1.22 only the alternative syntax is working. - Nothing + Nothing - Nothing + - setSpeedMode + lnbSetData - Set group speed mode. Mode may be one of: - "LIMITED" (half speed) - "NORMAL" (full speed, maintain formation) - "FULL" (do not wait for any other units in formation) + Sets the additional text (invisible) in the item with the given position of the 2D listbox. - https://community.bistudio.com/wiki/setSpeedMode + https://community.bistudio.com/wiki/lnbSetData - Object/Group setSpeedMode String + lnbSetData Array + + Control lnbSetData Array - groupName setSpeedMode mode + lnbSetData [idc, [row, column], data] + + ctrl lnbSetData [[row, column], data] - $Code$_groupOne setSpeedMode "LIMITED"$/Code$ + $Code$_ctrl lnbSetData [ [0,0],"#1"];$/Code$ - local / global + local / local - (14 Feb 2010) - Although setSpeedMode can be called on an individual unit, the entire group will be affected. - - (17 May 2008) - In Multiplayer, this command is overwritten by itself to NORMAL or FULLSPEED (i don't know which one, but it's fast move) when you ask the unit to move via script (ex : _unit doMove (getMarkerPos "destination"); ) - The solution to solve this problem is to initialize the setSpeedMode after your order the unit to move. - So basically it gives you : - _unit doMove (getMarkerPos "destination"); - _unit setSpeedMode "LIMITED"; - If you plan to move the unit again after it reaches its destination, you will have to set the speed mode to LIMITED again like i did just above. + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Nothing + Nothing - Nothing + - setStamina + playMove - Set units' stamina (seconds until depletion) + When used on person, smooth transition to given move will be done. + List of moves in ArmA 2 List of moves in Armed Assault List of moves in Operation Flashpoint: Resistance + The difference between playMove and playMoveNow is that playMove adds another move to the move queue, while playMoveNow replaces the whole move queue with new move: + $Code$ player switchMove "amovpercmstpsraswrfldnon"; + [] spawn + { + sleep 0.5; + player playMove "amovppnemstpsraswrfldnon"; // player goes prone + player playMove "amovpknlmstpsraswrfldnon"; // player gets up on one knee + };$/Code$ + Compared to: + $Code$ player switchMove "amovpercmstpsraswrfldnon"; + [] spawn + { + sleep 0.5; + player playMove "amovppnemstpsraswrfldnon"; // player never goes prone + player playMoveNow "amovpknlmstpsraswrfldnon"; // player goes down on one knee straight away + };$/Code$ - https://community.bistudio.com/wiki/setStamina + https://community.bistudio.com/wiki/playMove - Object setStamina Number + Object playMove String - unit setStamina stamina + unitName playMove moveName - $Code$player setStamina 42;$/Code$ + $Code$soldierOne playMove "Stand"$/Code$ - undefined / undefined + local / global - (December 30, 2015) - "setStamina" has the same effect as "setFatigue". + For an immediate transition use switchMove. This command must be executed after mission start. If you place it into init.sqs / init.sqf or in the Init field of some unit, it will not work. Just add a little delay (~0.001) and then place the command. - Nothing + Nothing + - setStaminaScheme + vectorCrossProduct - Set stamina bar color. The scheme can be "Normal", "FastDrain", "Exhausted" or "Default". + Cross product of two 3D vectors. + In layman's terms, if you have a polygon (surface) defined by 3 points, you can find a normal to it (just like terrain surfaceNormal ). To invert direction of the normal, swap arguments around. - https://community.bistudio.com/wiki/setStaminaScheme + https://community.bistudio.com/wiki/vectorCrossProduct - setStaminaScheme String + Array vectorCrossProduct Array - setStaminaScheme scheme + vector1 vectorCrossProduct vector2 - $Code$setStaminaScheme "Default";$/Code$ + $Code$_vector = [1,1,1] vectorCrossProduct [2,2,2];$/Code$ + + $Code$_vectorUp = [0,1,0] vectorCrossProduct [-1,0,0]; //[0,-0,1]$/Code$ + + $Code$_vectorSide = ( vectorDir player ) vectorCrossProduct ( vectorUp player );$/Code$ undefined / undefined + (28 Jun, 2014) + (ArmA3 1.22)Algorithm: + $Code$ + Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; + Result = [(y1 * z2) – (z1 * y2),(z1 * x2) – (x1 * z2),(x1 * y2) – (y1 * x2)]; + $/Code$ + It is recommended to use vectorCrossProduct instead of BIS_fnc_crossProduct. - Nothing + Array + - setStatValue + select - Sets a value to a given stat. - A list of possible StatNames can be found here: StatNames - Its important to note that most Stats are restricted to scripts in certain paths. - For example "ExpWarlockDown" is restricted to scripts in any subdirectory of "a3\Missions_F_Exp\Campaign\Missions\" + Selects an element from an array, config entry from Config or substring from a string or a range from an array. - https://community.bistudio.com/wiki/setStatValue + https://community.bistudio.com/wiki/select - setStatValue Array + Array select Number + + Array select Boolean + + Config select Number + + String select Array + + Array select Array + + Array select Code - setStatValue [name, value] + array select index + + array select boolean + + config select index + + string select [start, length] + + array select [start, count] + + array select expression - $Code$setStatValue ["ExpWarlockDown", 1]; //Unlocks the "Warlock Down" Steam achivement$/Code$ + $Code$[1,2,3,4] select 2; //result is 3 + position player select 2; //result is Z coordinate of player position$/Code$ + + $Code$["", currentWeapon player ] select alive player ; //if dead "" is selected$/Code$ + + $Code$( configFile "cfgVehicles" typeOf vehicle player "Turrets") select 0 "gunnerAction";$/Code$ + + $Code$hint str ("japa is the man!" select [8]); //the man! + hint str ("japa is the man!" select [0,7]); //japa is$/Code$ + + $Code$hint str ([1,2,3,4,5,6] select [1,4]); //[2,3,4,5]$/Code$ + + $Code$_even = [1,2,3,4,5,6,7,8,9,0] select {_x%2 == 0}; // returns [2, 4, 6, 8, 0]$/Code$ undefined / undefined + (3 March 2009) + When combined with the count command, this can be used to read all entries out of a config; even when you don't know exactly how many entries there will be. See the notes under count for more info. + + (27 Sep, 2013) + Rounding of fractions with select is not the same as when you use round command: + $Code$_roundThis = 0.5; + hint str ([0,1] select _roundThis); //0 + hint str round _roundThis; //1$/Code$ + + (30 May, 2014) + In ArmA3 ver 1.18, Boolean type supported. Which true defaulted as 1 and false as 0. + $Code$[0,1] select (56 40) // 1 + [0,1,2] select ((! isNil "v") && false ) // 0$/Code$ + + (14 juil, 2016) + You can substract array from array using select: + $Code$_array = [[1],[2],[3]]; _sub = [2]; + _array - _sub // [[1],[2],[3]; + _array select {!(_x isEqualTo _sub)} // [[1],[3]]; + [[1],[2],[2],[2],[2],[3]] select {!(_x isEqualTo _sub)} // [[1],[3]]; + $/Code$ + + (June 22, 2015) + Usually when select tries to pick up element out of range, Arma throws "division by zero" error. However there are exceptions. Basically as long as index of element you are selecting is less then or equal to array size, you will get no error. + $Code$[] select 0; //ok, result is nil + [1,2,3] select 3; //ok, result is nil + [1,2,3] select 4; //division by zero$/Code$ + + (November 12, 2016) + It is not safe to escape the code block of alternative syntax #5 with exitWith, breakOut etc. + $Code$x3 = [1,2,3,4,5] select { + if (_x == 3) exitWith { + false; + }; + true + }; + // could be expected to be: x3 = [1,2,4,5] + // actual result: x3 = false + $/Code$ + + (February 14, 2017) + Syntax #5 is the equivalent of passing in a predicate that returns a boolean. In SQF, a piece of code will always return what the last executed command returned. + $Code$ + myAliveUnits = allunits select {alive _x;}; // alive returns a boolean, the last statement run was alive _x, therefore this piece of code will return a true/false to the select command + myEastGroups = allgroups select {side _x == EAST;}; // returns all groups that are side EAST + my4ManGroups = allgroups select { count (units _x) == 4;}; // returns all groups that have 4 men in them + UnitsThatDetectedMe = allunits select {_x knowsAbout player 0.1;}; // returns a list of units that have detected the player + $/Code$ + + (May 28, 2017) + Very simple example of how to report about the status of the player: + $Code$[ "Player is dead.", "Player is alive" ] select ( alive player )$/Code$ + returns "Player is alive" because ( alive player ) returned true. If ( alive player ) returned false, the first element (0) + would have been returned. + That is a great way of reporting about something without having to write a complicated it then else statement. - Boolean + Anything - Anything - Config - String - Array - Array + - setSuppression + sliderSetSpeed - Sets the person's suppression, from 0 to 1. + Set speed of slider with id idc of topmost user dialog. + Click to arrow - move by line + Click to scale outside thumb - move by page. - https://community.bistudio.com/wiki/setSuppression + https://community.bistudio.com/wiki/sliderSetSpeed - Object setSuppression Number + sliderSetSpeed Array + + Control sliderSetSpeed Array - unit setSuppression value + sliderSetSpeed [idc,line,page] + + control sliderSetSpeed [line, page] - $Code$AI_unit_1 setSuppression 1;$/Code$ + $Code$sliderSetSpeed [101, 0.5, 2];$/Code$ undefined / undefined @@ -61780,860 +64018,1082 @@ - Nothing + Nothing - Nothing + - setSystemOfUnits + setObjectMaterialGlobal - Set system of units. + Set the material of the given selection on all computers in a network session. - https://community.bistudio.com/wiki/setSystemOfUnits + https://community.bistudio.com/wiki/setObjectMaterialGlobal - setSystemOfUnits Number + Object setObjectMaterialGlobal Array - setSystemOfUnits value + obj setObjectMaterialGlobal [selection, material] - $Code$myNum = 5; - myNumNew = setSystemOfUnits myNum;$/Code$ + $Code$player setObjectMaterialGlobal [0, "A3\Structures_F\Data\Windows\window_set.rvmat"];$/Code$ - undefined / undefined + global / global - Nothing + Nothing + - setTargetAge + setCurrentWaypoint - Sets how the target is known to the other centers. They behave like the target was seen age seconds ago. - Possible age values are: "ACTUAL", "5 MIN", "10 MIN", "15 MIN", "30 MIN", "60 MIN", "120 MIN" or "UNKNOWN". + Sets the currently active waypoint for a group. - https://community.bistudio.com/wiki/setTargetAge + https://community.bistudio.com/wiki/setCurrentWaypoint - Object setTargetAge String + Object/Group setCurrentWaypoint Array - object setTargetAge age + groupName setCurrentWaypoint waypoint - $Code$player setTargetAge "10 MIN"$/Code$ + $Code$_grp setCurrentWaypoint [_grp, 1];$/Code$ - undefined / undefined + local / undefined + (27 Aug 2007) + (A1 1.08) Does not seem to work with Game Logic. Crashes to desktop. + + (26 Nov 2008) + Note that a waypoints number as seen in the mission editor is not the same as it's waypoint number using this command. In the mission editor, waypoint 0 refers to the first placed waypoint, whereas waypoint 0 with the setCurrentWaypoint command refers to the unit's initial position waypoint. + + (17 Jan 2010) + (A2 1.05) This command may crash the game to desktop if you call it from the on act field of a waypoint that belongs to that same unit. + + (13 Aug 2012) + Using this command forces the last waypoint to complete. Any code in the on Act of that waypoint will run. - Nothing + Nothing + - setTaskResult + enableAI - Set a result of the task. + Enables parts of the AI behavior that was disabled by disableAI. + NOTE: When player switches and leaves behind AI unit, you need to enable "TeamSwitch" AI on it _unit enableAI "TeamSwitch" so that the unit continues with waypoints - https://community.bistudio.com/wiki/setTaskResult + https://community.bistudio.com/wiki/enableAI - Task setTaskResult Array + Object enableAI String - task setTaskResult [state,result] + unit enableAI skilltype - + $Code$_soldierOne enableAI "Move";$/Code$ + - undefined / undefined + local / global - Nothing + Nothing + - setTaskState + setWind - Set the state of a given task. - State value may be one of: - "None" - "Created" - "Assigned" - "Succeeded" - "Failed" - "Canceled" + Set current (forced == false) or permanent (forced == true) wind vector. + NOTE : The effect is global only if command is executed on the server. Wind set locally will sync back to server value in a while. - https://community.bistudio.com/wiki/setTaskState + https://community.bistudio.com/wiki/setWind - Task setTaskState String + setWind Array - task setTaskState state + setWind [x, y, forced] - $Code$_tskKillSpongebob setTaskState "Succeeded";$/Code$ + $Code$setWind [10, 10, true];$/Code$ - undefined / undefined + undefined / global - Nothing + Nothing + - setTerrainGrid + inAreaArray - Operation Flashpoint, VBS1 : Set desired terrain resolution (in meters). - For default landscapes, supported resolutions are: - 50 - smoothest, less lag - 25 - default in multiplayer - 12.5 - default in singleplayer - 6.25 - 3.125 - bumpiest, higher lag - If you select unsupported resolutions, nearest supported value is used instead. - Armed Assault, VBS2 : Terrain resolution is fixed, determined by the world created. This function controls terrain LOD instead (the distance in which the terrain mesh resolution starts to degrade). Higher number means less vertices are used for terrain rendering, making distant hills less smooth. Value 12.5 corresponds to selecting Terrain Detail Normal in Video options, 50 to Very Low, 3.125 to Very High. + Filters given list of Objects and/or Positions in relation to the given area, defined by a trigger, marker, location or array. Returns array of Objects and/or Positions from the list that are inside the area - https://community.bistudio.com/wiki/setTerrainGrid + https://community.bistudio.com/wiki/inAreaArray - setTerrainGrid Number + Array inAreaArray Object + + Array inAreaArray String + + Array inAreaArray Location + + Array inAreaArray Array - setTerrainGrid grid + positions inAreaArray trigger + + positions inAreaArray marker + + positions inAreaArray location + + positions inAreaArray [center, a, b, angle, isRectangle, c] - $Code$setTerrainGrid 12.5$/Code$ + $Code$vehicles inAreaArray trigger_1;$/Code$ + + $Code$allUnits inAreaArray marker_1;$/Code$ + + $Code$allPlayers inAreaArray location_1;$/Code$ + + $Code$allDead inAreaArray [[100, 100, 0], 20, 30, 45, false, 10];$/Code$ - undefined / local + undefined / undefined - (August 4, 2006) - Notes from before the conversion: - This is like opening up your video preferences and changing "terrain detail", i.e.: setTerrainGrid 50 = lowest detail - setTerrainGrid 3.125 = highest detail It is similar to the command setViewDistance. - - (August 18, 2007) - Effects on grass: - 50: disables/removes grass altogether. - 25: grass is visible. - Lower values make grass drawn a bit further at distance. However the effect is decreasing rapidly: Grass radius of 25 is 100%. 12.5 is now like 100% + 20%, 6.25 is like 100% + 20% + 5% and 3.125 is 100% + 20% + 5% + 1%. Note these are estimates! - Demo Mission Test_VD_TD.Sara.rar : ViewDistance and TerrainGrid can be changed via RadioTriggers - - (December 15, 2019) - ArmA2 Supported Reso: - In ArmA2 you are not stuck to 50, 25, 12 etc. 45 is a lower setting then 25! - - (March 13, 2013) - ArmA 3 Multiplayer default: - Some testing indicates that the default value for Arma 3 multiplayer is 10 - just like before. 10 is between "Normal" and "High". - An user's terrain detail setting is ignored in multiplayer just like in ArmA 2. - - (November 19, 2014) - TerrainGrid values for Arma 3 1.34: - Low = 50 (NoGrass) - Standard = 25 - High = 12.5 - Very High = 6.25 - Ultra = 3.125 + (June 11, 2017) + The array you send the command can be filtered. For example: + $Code$ vehicles inAreaArray "mymarker" select {_x isKindOf "StaticWeapon"}$/Code$ + Will return only the statics inside the given marker - Nothing + Array - Array - Array - Array + - setText + ctrlCreate - Sets the text associated with a location. This text will be displayed on the game map at the location's position. + Creates new control in given display. Some of the common controls that can be used with this command: + RscText - simple text box + RscTextMulti - simple multiline text box + RscPicture - simple picture box + RscPictureKeepAspect - picture box that doesn't stretch picture + RscEdit - input box + RscEditMulti - multiline input box + RscTree - tree view control + RscTreeSearch - searchable tree view control (see Example 4) + RscVideo - picture control with autostart for video texture (see BIS_fnc_playVideo ) + RscVideoKeepAspect - picture control for video to keep original video aspect ratio + NOTE : Since Arma 3 v1.69.141213 ctrlCreate will also search for control class in mission config, if search in the main config failed. This means one can now define classes in mission config and use them with ctrlCreate - https://community.bistudio.com/wiki/setText + https://community.bistudio.com/wiki/ctrlCreate - Location setText String + Display ctrlCreate Array - location setText text + display ctrlCreate [class, idc, controlsGroup] - $Code$myLocation setText "Rahmadi Village"$/Code$ + $Code$_display ctrlCreate ["RscText", 1234];$/Code$ + + $Code$_map = findDisplay 46 ctrlCreate ["RscMapControl", -1]; + _multiLineText = findDisplay 46 ctrlCreate ["RscTextMulti", -1]; + _multiLineEdit = findDisplay 46 ctrlCreate ["RscEditMulti", -1];$/Code$ + + $Code$myControl = findDisplay 0 ctrlCreate ["RscText", 1234, findDisplay 0 displayCtrl 2300];$/Code$ + + $Code$// Create Tree View control with search. Available RscTreeSearch class is hardcoded to be used with RscEdit with idc 645. Example below demonstrates how to. After tree is generated, try typing something in the top box. + [] spawn + { + disableSerialization ; + _display = findDisplay 46 createDisplay "RscDisplayEmpty"; + _edit = _display ctrlCreate ["RscEdit", 645]; + _edit ctrlSetPosition [0,0,1,0.04]; + _edit ctrlSetBackgroundColor [0,0,0,1]; + _edit ctrlCommit 0; + _tv = _display ctrlCreate ["RscTreeSearch", -1]; + _tv ctrlSetFont "EtelkaMonospacePro"; + _tv ctrlSetFontHeight 0.03; + _tv ctrlSetPosition [0,0.06,1,0.94]; + _tv ctrlSetBackgroundColor [0,0,0,1]; + _tv ctrlCommit 0; + _classes = "true" configClasses ( configFile "CfgVehicles"); + for "_i" from 0 to 5 do + { + _tv tvAdd [[], configName selectRandom _classes]; + for "_j" from 0 to 5 do + { + _tv tvAdd [[_i], configName selectRandom _classes]; + for "_k" from 0 to 5 do + { + _tv tvAdd [[_i, _j], configName selectRandom _classes]; + for "_n" from 0 to 5 do + { + _tv tvAdd [[_i, _j, _k], configName selectRandom _classes]; + }; + }; + }; + }; + };$/Code$ undefined / undefined + (February 6, 2016) + Although you can only dynamically create controls using BIS's configs, there are many commands to change certain aspects of each created control. See GUI Control + + (May 29, 2017) + Since Arma 3 1.70 ListBoxes created thru ctrlCreate are no more encountering problems with max of 7 selections without scrolling the control. - Nothing + Control + - setTimeMultiplier + addAction - Sets a time multiplier for in-game time. The command range is now capped at 0.1 - 120 to avoid performance problems. + This command syntax is for Arma 3 only. For TKOH and older versions see addAction TKOH + Adds an entry to the action menu of an object (scroll wheel menu). The action can only be activated when in proximity to the object (eg: building). Adding an action to the player obviously makes that action available to the player at all times. The appearance of onscreen text could be further tweaked with setUserActionText. For event handling of user interaction see inGameUISetEventHandler + This command has local effect. Created action is only available on the computer where command was executed. To make action available to all players, command must be executed on all connected clients (see remoteExec ). addAction is also ignored on dedicated server, because of no user interface. In Arma 3 addAction does not work on animals. This is intended behavior. + Since Arma 3 v1.63.136787, two new params are available: radius and unconscious. + Since Arma 3 v1.69.140846, new param is available: selection. + Since Arma 3 v1.81.144102, new param is available: memoryPoint & radius param is now always referencing distance between player eye position ( eyePos ) and object selection, memory point or [0,0,0]; in this order, depending on what params are supplied to the command. - https://community.bistudio.com/wiki/setTimeMultiplier + https://community.bistudio.com/wiki/addAction - setTimeMultiplier Number + Object addAction Array - setTimeMultiplier value + object addAction [title, script, arguments, priority, showWindow, hideOnUse, shortcut, condition, radius, unconscious, selection, memoryPoint] - $Code$setTimeMultiplier 60;$/Code$ + $Code$// Short and sweet: + player addAction ["A Useless Action That Does Nothing", {}]; + player addAction [" t color='#FF0000' This Useless Action Is RED /t ", { hint "RED"}]; + player addAction ["Hint Hello!", { hint format ["Hello %1!", _this select 3]}, name player ]; + player addAction ["String Exec", " hint 'this is also compiled'"];$/Code$ - $Code$setTimeMultiplier 0.5;$/Code$ + $Code$// SQF file example: + _act = player addAction ["Exec the file", "somescript.sqf"] + // somescript.sqf: hint str _this;$/Code$ + + $Code$// SQS file example: + _genAct = generator addAction ["Switch on generator", "activate_generator.sqs"] + // activate_generator.sqs:_gen = _this select 0 + _caller = _this select 1 + _id = _this select 2 + ; remove the action once it is activated + _gen removeAction _id + // This example shows an action called "Switch on generator" added to an object with the name 'generator'. As soon as the player gets close to this object, he can execute the given action via the action menu. Then the script 'activate_generator.sqs' is executed, which in our example only removes the action from the generator.$/Code$ + + $Code$// Create object on dedicated server and add action to the object on every client: + if ( isDedicated ) then + { + _obj = "some_obj_class" createVehicle [1234, 1234, 0]; + [_obj, ["Greetings!", { hint "Hello!"}]] remoteExec ["addAction", -2, _obj]; + };$/Code$ - undefined / global + global / local - This scripting command must be executed on the server to work properly in multiplayer + (August 2, 2006) + An easy way to keep track of and remove actions is to store the IDs of the actions in variables. + This can be accomplished by doing the following: + $Code$_myaction = player addAction ["Hello", "hello.sqs"];$/Code$ + This stores the action's ID in the local variable "_myaction" and assists in keeping track of the action ID. + To remove the above action, you would use the following line: + $Code$ player removeAction _myaction;$/Code$ + + (17:35, 24 August 2013 (CEST)) + In Arma 3 addAction does not work on animals. This is intended behavior. + + (June 19, 2014) + If executing actual script code like this: + $Code$_unit addAction [ "yourAction", { hint "A line of code" } ];$/Code$ + you can have a user action that uses and/or affects variables used elsewhere in the script that adds the action. + But beware! + The variable(s) must be global otherwise it won't work! i.e. + Fail + $Code$_variable = false ; _unit addAction [ "action", { _variable = true } ];$/Code$ + Succeed + $Code$variable = false ; _unit addAction [ "action", { variable = true } ];$/Code$ + + (March 10, 2015) + Actionception: $Code$actions = []; + actions set [0, player addAction ["Actionception", { + if ( count actions == 1) then { + actions set [1, player addAction [" Actionception ", { + if ( count actions == 2) then { + actions set [2, player addAction [" Actionception ", { + if ( count actions == 3) then { + actions set [3, player addAction [" Actionception ", { + { + player removeAction _x ; + } forEach actions; + }, [], 10, false, true ]]; + }; + }, [], 10, false, false ]]; + }; + }, [], 10, false, false ]]; + }; + }, [], 10, false, false ]];$/Code$ + Function to remove user actions with unknown ids: + $Code$KK_fnc_removeUnknownUserActions = { + for "_i" from 0 to ( player addAction ["",""]) do { + if !(_i in _this ) then { + player removeAction _i; + }; + }; + };$/Code$ + To test: + $Code$ for "_i" from 0 to 9 do { + player addAction ["Action #" + str _i, { + [0,5,6] call KK_fnc_removeUnknownUserActions; + }]; + }; + $/Code$ + Removes all user actions but 0, 5 and 6. + + (July 18, 2016) + A3 v1.62.137494 : Condition is not evaluated when map is opened (and probably also true for other displays or opened dialog) + + (October 28, 2017) + addAction with all the default parameters: + $Code$ + addAction["Cookies",{},nil,1.5,true,true,"","true",15,false,""]; + $/Code$ + /dd + /dl - Nothing + Number + - setTitleEffect + sqrt - Defines the title effect via [Type, Effect, Text] where - 'Type' can be - "NONE", - "OBJECT", - 'Text' defines the shown object, a subclass of CfgTitles. - "RES" - 'Text' defines a resource class, a subclass of RscTitles. - "TEXT" - The 'Text' is shown as text itself. 'Effect' defines a subtype: "PLAIN", "PLAIN DOWN", "BLACK", "BLACK FADED", "BLACK OUT", "BLACK IN", "WHITE OUT" or "WHITE IN". + Returns square root of x. - https://community.bistudio.com/wiki/setTitleEffect + https://community.bistudio.com/wiki/sqrt - Object setTitleEffect Array - - Array setTitleEffect Array + sqrt Number - trigger setTitleEffect [type, effect, text] - - waypoint setTitleEffect [type, effect, text] + sqrt x - $Code$_trigger setTitleEffect ["TEXT", "PLAIN DOWN", "Hello world."]$/Code$ + $Code$_sq = sqrt 9; // Result is 3$/Code$ undefined / undefined + (18:05, 24 August 2014 (EST)) + Alternatively use "x^0.5" or "x^(1/2)". $Code$_sq = 9^0.5; //Result is 3 + _sq = 9^(1/2); //Result is 3$/Code$ + You can use this method to get any root. + Cubed root = x^(1/3) or x^0.333[repeating]. + Root 4 = x^(1/4) or x^0.25. - Nothing - Nothing + Number + - setTriggerActivation + else - Defines the trigger activation type. - See ArmA:Mission Editor - Triggers for a thorough overview of triggers and its fields for activation, effects, etc. Since Arma 3 v1.67, "ANYPLAYER" activation can be used to detect any player. + Executes else code when if condition returns false - https://community.bistudio.com/wiki/setTriggerActivation + https://community.bistudio.com/wiki/else - Object setTriggerActivation Array + Code else Code - trigger setTriggerActivation [by, type, repeating] + ifCode else elseCode - $Code$_trigger setTriggerActivation ["WEST", "EAST D", true ]$/Code$ + $Code$if (a b) then { c = 0 } else { c = 1 };$/Code$ + + $Code$if (a b) then { + hint "B is greater than A"; + } else { + hint "A is greater than B"; + };$/Code$ - global / local + undefined / undefined - Nothing + Array + - setTriggerArea + getMarkerPos - Defines the area monitored by the given trigger. The area could be either rectangular or elliptical. Since Arma 3 v1.59.135137 it is possible to define 3 dimensional area to monitor by specifying extra param for the area height (see pic). - Just like with a and b dimensions, c dimension will alter area in opposite directions from the trigger position along z axis. Therefore if the trigger position is on the surface, half of the trigger area will be above the surface and half below. To place the whole area above the surface, adjust trigger position (move it up c meters). If c is not specified or = 0, the trigger area considered infinitely tall, like in old triggers. + Returns the position of a given marker in format [x,y,0]. Array element 3 (height above ground) is always zero. If a non-existing marker is referenced the values returned are [0,0,0]. - https://community.bistudio.com/wiki/setTriggerArea + https://community.bistudio.com/wiki/getMarkerPos - Object setTriggerArea Array + getMarkerPos String - trigger setTriggerArea [a, b, angle, isRectangle, c] + getMarkerPos markerName - $Code$_trigger setTriggerArea [100, 50, 45, false ];$/Code$ - - $Code$// Possible since Arma 3 v1.59.135137: - _trigger setTriggerArea [100, 50, 45, false, 100];$/Code$ + $Code$"MarkerOne" setMarkerPos [200,100]; + _pos = getMarkerPos "MarkerOne" + // _pos is [200,100,0]$/Code$ - global / local + undefined / undefined + (September 1, 2016) + To acomplish getting the altitude of a marker you can do workaround using setMarkerDir as it accepts any number (above 360 or below -360): + $Code$"Marker" setMarkerPos [200,200]; + "Marker" setMarkerDir 1640; + $/Code$ + After, setting player position as an example: + $Code$player setPosASL [(getMarkerPos "Marker") select 0, (getMarkerPos "Marker") select 1,(markerDir "Marker")]$/Code$ - Nothing + Array + - setTriggerStatements + shownRadio - Defines trigger condition, activation and deactivation statements. Trigger condition has to return Boolean. true will activate the trigger, false will deactivate it (only if activation is set to repeat). thisList returns the same result as list command, which includes all entities in the trigger area that are capable of activating the trigger. Dead entities are excluded as well as crew in vehicles, vehicles themselves are included. + Check if player has Radio enabled. - https://community.bistudio.com/wiki/setTriggerStatements + https://community.bistudio.com/wiki/shownRadio - Object setTriggerStatements Array + shownRadio - trigger setTriggerStatements [condition, activation, deactivation] + shownRadio - $Code$_trg setTriggerStatements ["this", " hint 'trigger on'", " hint 'trigger off'"]$/Code$ + $Code$if ( shownRadio ) then { hint "You have Radio enabled."};$/Code$ - global / local + undefined / undefined - (Mar 14, 2011) - An array with three arguments is mandatory for this function. - - (September 16, 2014) - Magic variable thisList does not contain dead units. - Nothing + Boolean + - setTriggerText + profileName - Sets the text label attached to the trigger object. This is used for example as a radio slot label for radio activated triggers. + Returns profile name. - https://community.bistudio.com/wiki/setTriggerText + https://community.bistudio.com/wiki/profileName - Object setTriggerText String + profileName - trigger setTriggerText text + profileName - $Code$trigger setTriggerText "Call for support"$/Code$ + $Code$_myProfileName = profileName ;$/Code$ - global / local + undefined / undefined - Nothing + String + - setTriggerTimeout + join - Defines the time between condition satisfaction and trigger activation (randomly from min to max, with an average value mid). If the last argument is true, the condition must be fullfilled all the time. - For a normal trigger, min, mid and max are used to generate random duration according to Gaussian Distribution. For a "Seized" type of trigger, the duration value is generated using side ruling power + Join all units in the array to given group. + Maximum number of group members is: + OFP: 12 + Arma: ? + Arma 2: ? + Arma 3: "unlimited" (3000+) + VBS 2: "unlimited" (260+) + To have a group member leave a group, join him with the grpNull group (e.g. [guy1] join grpNull ), but beware, as brand new group is created for the leaving unit and this could result in the number of groups in a mission growing out of control. - https://community.bistudio.com/wiki/setTriggerTimeout + https://community.bistudio.com/wiki/join - Object setTriggerTimeout Array + Array join Group/Object - trigger setTriggerTimeout [min, mid, max, interruptable] + unitArray join group - $Code$_trigger setTriggerTimeout [5, 10, 7, false ];$/Code$ + $Code$[_unitOne, _unitTwo] join player ;$/Code$ + + $Code$[_unitOne, _unitTwo] join ( group player );$/Code$ - global / local + global / global - Nothing + Nothing + - setTriggerType + if - Sets the type of action processed by the trigger after activation (no action, a waypoints switch or an end of mission): - "NONE" - "EAST G" - Guarded by OPFOR - use createGuardedPoint instead! - "WEST G" - Guarded by BLUFOR - use createGuardedPoint instead! - "GUER G" - Guarded by Independent - use createGuardedPoint instead! - "SWITCH" - Switch waypoints/break loop (see Triggers ) - "END1" - End #1 - "END2" - End #2 - "END3" - End #3 - "END4" - End #4 - "END5" - End #5 - "END6" - End #6 - "LOOSE" - Lose //it is not a typo on the wiki, it is indeed misspelt in the game engine. - "WIN" - (not found in ArmA) + This operator creates a If Type which is used in the if-construct as described here. - https://community.bistudio.com/wiki/setTriggerType + https://community.bistudio.com/wiki/if - Object setTriggerType String + if Boolean - trigger setTriggerType action + if condition - $Code$_trigger setTriggerType "END1"$/Code$ + $Code$_retVal = if (1 0) then { "It's true" } else { "It's false" }; + hint str _retVal$/Code$ + + $Code$_val = if ( true ) then [ { "true" }, { "false" } ]; + hint _val;$/Code$ - global / local + undefined / undefined + (Jan 31, 2007) + Any _local variables you declare within the body of an if / then statement (ie between the curly braces) are local to that 'if' statement, and are destroyed at the end of the statement. If you know you want to use the variable outside the 'if' statement, make sure your declare it before the 'if' statement. + + (Jan 17, 2010) + (A2 1.05) If the condition is nil then neither the "then" nor the "else" section get executed, but the script will proceed with no error messages. + Example code: + $Code$ + hint "script started"; //will get executed + if (nil) then + { + hint "true"; // will never get executed + } + else + { + hint "false"; // will never get executed + }; + sleep 3; + hint "script ended"; //will get executed$/Code$ + + (June 5, 2015) + If you only need to choose between 2 raw values, it is possible to use the following trick to avoid using code blocks, as required by the if command, which results in greater atomicity and faster execution: + $Code$_result = [falseValue, trueValue] select condition;$/Code$ + The select command treats "false" as 0 and "true" as 1, therefore you can feed it a condition determining the array index of the value to be returned. Here is another example: + $Code$_result = [1,-1] select (_this 0); // If _this is less than 0, _result will be equal to -1, otherwise it will be 1$/Code$ + This feature was added in Arma 3. - Nothing + If_Type + - setType + getRepairCargo - Changes a location to the specified class. Location classes are defined in CfgLocationTypes. + Returns the amount of repair resources from empty (0) to full (1) in the cargo space of a repair vehicle. - https://community.bistudio.com/wiki/setType + https://community.bistudio.com/wiki/getRepairCargo - Location setType String + getRepairCargo Object - location setType name + getRepairCargo vehicle - $Code$myLocation setType "RockArea"$/Code$ + $Code$value = getRepairCargo vehicleName;$/Code$ - undefined / undefined + global / undefined + (December 22, 2014) + If the vehicle is not alive, it always returns Nothing, which you should check for using isNil. + If the vehicle is unable to carry that type of cargo, it returns -1.#IND, which you should check for using finite. - Nothing + Number + - setUnconscious + ropeAttachedObjects - Since Arma 3 v1.63.136889, this command sets unit into incapacitated state and lifeState command returns "INCAPACITATED". Animation played while incapacitated depends on the injuries received. + Returns list of attached objects on ropes - https://community.bistudio.com/wiki/setUnconscious + https://community.bistudio.com/wiki/ropeAttachedObjects - Object setUnconscious Boolean + ropeAttachedObjects Object - unit setUnconscious set + ropeAttachedObjects vehicle - $Code$_unit setUnconscious true;$/Code$ + $Code$_cargoArray = ropeAttachedObjects heli1;$/Code$ - local / global + undefined / undefined - Nothing + Array + - setUnitAbility + createAgent - Sets skill of given unit. Unlike with setSkill it is possible to use values 1 with this command, and even though skill will correctly return set value, the actual unit ability will be capped to max available. + Creates an (independent) agent (person) of the given type (type is a name of a subclass of CfgVehicles ). An agent does not have a group or leader or the standard soldier FSM associated with it -- for instance, an enemy soldier spawned as an agent has limited AI and will stand stupidly when fired upon -- which can be useful to limit the amount of AI processing being done in a mission with very large numbers of "AI". If the markers array contains several marker names, the position of a random one is used, otherwise, the given position is used. The unit is placed inside a circle with this position as its center and placement as its radius. + Players assigned to an agent using setPlayable will be able to control the agent, operate weapons and other actions, but will not be able to access their inventory using the gear screen. + Special properties can be: "NONE", "CAN_COLLIDE" and "FORM". - https://community.bistudio.com/wiki/setUnitAbility + https://community.bistudio.com/wiki/createAgent - Object setUnitAbility Number + createAgent Array - unit setUnitAbility skill + createAgent [type, position, markers, placement, special] - $Code$_unit setUnitAbility 1;$/Code$ - - $Code$bob setUnitAbility - log 0; - hint str skill bob; //1.#INF$/Code$ + $Code$agent = createAgent ["SoldierWB", position player, [], 0, "FORM"];$/Code$ undefined / undefined - (October 8, 2014) - AFAIK not used in Arma 3 anymore (or equals to setSkill) + (September 29, 2014) + In Arma 3, default FSM is calling BIS_fnc_animalBehaviour script upon agent creation, which takes on some animal behavioural logic. The problem here is that it is almost impossible to make animal do what is told. Until now. Since Arma 3 v1.31.127383 you can set BIS_fnc_animalBehaviour_disable variable on the agent at the moment of agent creation, to override the function. + $Code$tr = createTrigger ["EmptyDetector", player modelToWorld [0, 10, 0]]; + tr setTriggerArea [5, 5, 0, true ]; + tr setTriggerActivation ["CIV", "PRESENT", true]; + rabbits = []; + private "_r"; + for "_i" from 1 to 10 do { + _r = createAgent ["Rabbit_F", position tr, [], 0, "NONE"]; + _r setVariable ["BIS_fnc_animalBehaviour_disable", true ]; + rabbits pushBack _r; + }; + tr setTriggerStatements [ + " if (rabbits isEqualTo thisList) exitWith { + _r = thisList select floor random count thisList; + _r moveTo (_r modelToWorld [2.5 - random 5, 2.5 - random 5, 0]); + }; + _esc = rabbits - thisList; + doStop _esc; + {_x moveTo position thisTrigger} forEach _esc; + systemChat str [ time, _esc]; + false ", + "", + "" + ];$/Code$ + + (April 18, 2015) + Agents seem to use the same collision model that the player uses, unlike normal AI. Normal AI don't collide with objects, but agents are physically stopped by obstacles the same way players are. This also probably means agents cost more resources than normal AI. - Nothing + Object + - setUnitLoadout + isDLCAvailable - Creates a loadout from given inventory structure and applies it to a unit. - This command is not final and might be changed in a near future. + Returns true if the DLC is marked as available. (Steam) - https://community.bistudio.com/wiki/setUnitLoadout + https://community.bistudio.com/wiki/isDLCAvailable - Object setUnitLoadout Array + isDLCAvailable Number - unit setUnitLoadout [loadout, rearm] + isDLCAvailable appid - $Code$_loadout = getUnitLoadout player_1 ; - player_2 setUnitLoadout _loadout;//Copies loadout from player_1 and applies it to player_2$/Code$ + $Code$_Karts = 288520; + isDLCAvailable _Karts;//Returns true$/Code$ - global / global + undefined / undefined + (October 19, 2014) + appid can be taken from Steam DLC url. + Karts url is http://store.steampowered.com/app/ 288520 / + Zeus url is http://store.steampowered.com/app/ 275700 / + DLC bundle url is http://store.steampowered.com/app/ 304400 / - Nothing + Boolean + - setUnitPosWeak + in - Set unit position rules. Mode may be one of: - "DOWN" - person goes prone and stays prone. - "UP" - person stands and stays standing. - "Middle" - Kneel Position. ArmA version 1.04 - "AUTO" - person chooses mode according to circumstances. + Checks whether value is in array, unit in vehicle or position inside location. In case of value in array check, String values will be compared on CaSEseNsiTIve basis (see Example 2). Note: In Arma 2 you can not test for arrays within arrays using this command. - https://community.bistudio.com/wiki/setUnitPosWeak + https://community.bistudio.com/wiki/in - Object setUnitPosWeak String + Anything in Array + + Object in Object + + Array in Location - unit setUnitPosWeak mode + value in array + + unit in vehicle + + position in location - $Code$_soldier disableAI "FSM"; - _soldier setUnitPosWeak "DOWN";$/Code$ + $Code$1 in [0,1,2]; //true$/Code$ + + $Code$"lol" in ["Lol", "LOL", "loL"]; //false + "loL" in ["Lol", "LOL", "loL"]; //true$/Code$ + + $Code$// Arma 3: + [1,2,3] in [[1,2,3],[4,5,6]]; //true$/Code$ + + $Code$_isInCar = player in car;$/Code$ + + $Code$_isInside = [1000,2000,0] in myLocation;$/Code$ - local / global + undefined / undefined - This command is the lowest level of priority for setting unit position and to be used in scripted - FSM's. - The current priorities are: - 1. Unit pos commanded (from the commanding menu, higher priority). - 2. Unit pos scripted (from setUnitPos scripting command, medium priority). - 3. Unit pos FSM / setUnitPosWeak (used in the formation FSM, lowest priority). - Command most likely only works if run before join into group after createUnit array. + (15:58, 18 January 2007 (CET)) + For a case- insensitive test use count : + $Code${_x == "lol"} count ["Lol", "LOL", "loL"]; //returns 3.$/Code$ + Checking if an array (for example a position) is in another array doesn't produce an error, but it will always return false. e.g. + $Code$[0,0,0] in [[0,0,0],[1,4,3],[5,3,1]]; //returns: false.$/Code$ + + (August 23, 2014) + As of Arma 3 1.26: + $Code$[0,0,0] in [[0,0,0],[1,4,3],[5,3,1]]; //returns true + [1,2,3] in [[1,2,3],[4,5,6]]; //returns true + $/Code$ + Assuming it is now using comparison as found in isEqualTo + + (August 27, 2017) + The Object syntax of in might not behave as you'd expect (e.g. it would always return true ) when both parameters are the same object. It serves as a quick method of checking if a unit is mounted: + $Code$ private _onFoot = _unit in _unit;$/Code$ - Nothing + Boolean - Boolean - Boolean + - setUnitPos + leaderboardState - Set unit position rules. Mode may be one of: - "DOWN" - unit goes prone and stays prone. - "UP" - unit stands and stays standing. - "MIDDLE" - Kneel Position. ArmA version 1.04 (Unit will not kneel if it is unarmed ) - "AUTO" - unit chooses mode according to circumstances. - This command will not change the stance of the human player, even though it will change the output of unitPos command. To change player stance use playAction or playActionNow : - $Code$ player playAction "PlayerProne"; // DOWN - player playAction "PlayerStand"; // UP - player playAction "PlayerCrouch"; // MIDDLE$/Code$ + returns state of the board with given name. 0: Busy (async. operation in progress); 1: Async. operation ended with success; 2: Async. operation ended with error; 3: Invalid board (bad board name, not initialized etc.). - https://community.bistudio.com/wiki/setUnitPos + https://community.bistudio.com/wiki/leaderboardState - Object setUnitPos String + leaderboardState String - unit setUnitPos mode + leaderboardState boardname - $Code$_soldier setUnitPos "UP";$/Code$ + $Code$leaderboardState ["TT01", 1234, [5,6,7,8]]$/Code$ - local / global + undefined / undefined - (18 September 2008‎) - Command most likely only works if run before join into group after createUnit. - - (11 March 2011) - The above comment by Dwarden about 'an additional join required' is no longer true for Operation Arrowhead. - - (26 September 2013‎) - A unit might not always go prone when ordered to setUnitPos "DOWN", if the unit doesn't agree with the command. To force the unit to go prone, stop the unit from firing by setCombatMode "BLUE" and then order the unit to prone. - Nothing + Number + - setUnitRank + targetKnowledge - Sets rank of given unit. - Possible rank values, and the associated rating that is automatically given: - PRIVATE: 0 - CORPORAL: 500 - SERGEANT: 1500 - LIEUTENANT: 2500 - CAPTAIN: 3500 - MAJOR: 5000 - COLONEL: 7500 - Since Arma 3 v1.67 this command is + Returns unit's knowledge about target. The returned array includes information whether the target is + known by group + known by the unit + last time the target was seen by the unit + last time the target endangered the unit + target side + position error + target position - https://community.bistudio.com/wiki/setUnitRank + https://community.bistudio.com/wiki/targetKnowledge - Object setUnitRank String + Object targetKnowledge Object - unitName setUnitRank rank + unit targetKnowledge target - $Code$player setUnitRank "COLONEL"$/Code$ + $Code$_allInfo = _soldierOne targetKnowledge _jeepOne;$/Code$ + + $Code$_posError = (_soldierOne targetKnowledge _jeepOne) select 5;$/Code$ - global / local + undefined / undefined - (Mar 26, 2009) - Changing a unit's rank using either setUnitRank or setRank will also REPLACE their current rating dependent on their new rank (colonels have a rating of 7500 etc). That is to say REPLACE, not add to: the unit's old rating will disappear with the rank change. - - (December 24, 2015) - In Arma 3, if the rank is not spelled correctly or the string is empty, it will default to Private. This command is not case sensitive. For Arma 3 the rating set by this command is as follows. - (PRIVATE: 0) - (CORPORAL: 50) - (SERGEANT: 150) - (LIEUTENANT: 250) - (CAPTAIN: 350) - (MAJOR: 500) - (COLONEL: 750) The rating listed here will be present on base type respawn. - Nothing + Array + - setUnitRecoilCoefficient + allMissionObjects - Proportionaly increase/decrease unit's recoil. Drives muzzle up with every shot when supplied positive number and down when negative. 0 cancels recoil. + Returns all mission objects (created by or during a mission) with given type (or its subtype). In some cases allMissionObjects could be substituted with entities, which would be much much faster alternative. Some of the unusual mission objects that can be detected with this command (as well as with nearestObject ): + "#slop" - blood drop + "#mark" - unit footprints + "#track" - vehicle tracks + "#crater" - explosion crater on the ground + "#crateronvehicle" - bullet marks on vehicle + "#explosion" - an explosion + "#objectdestructed" - building, tree or bush destruction + "#soundonvehicle" - sound created with say3D for example + "#dynamicsound" - sound source created using createSoundSource - https://community.bistudio.com/wiki/setUnitRecoilCoefficient + https://community.bistudio.com/wiki/allMissionObjects - Object setUnitRecoilCoefficient Number + allMissionObjects String - unitName setUnitRecoilCoefficient coefficient + allMissionObjects type - $Code$player setUnitRecoilCoefficient 10$/Code$ + $Code$_airObjects = allMissionObjects "Air";$/Code$ + + $Code${ deleteVehicle _x } forEach ( allMissionObjects "");$/Code$ + + $Code$_allMObjects = allMissionObjects "All";$/Code$ undefined / undefined - (March 28, 2015) - Doesnt seem to work on AI or remote controlled units. Setting the value too high, positive or negative produces some interesting recoil animations. + (June 22, 2012) + Be VERY careful with the use of this command. It is very demanding as it must iterate through all mission created objects. Particular care should be taken exercising this often on dedicated servers. + + (Decembere 15, 2013) + For some reason in Arma 3 this command is up to 5 times faster on the dedicated server than on a connected client. In my experiments it took on average 5 ms for the command to complete on a client while under 1 ms on the server. - Nothing + Array + - setUnitTrait + getArtilleryAmmo - Enables or disables a trait or alters a trait of the given unit. Custom trait can only be a bool. - Default traits are: - audibleCoef (scalar) - camouflageCoef (scalar) - engineer (bool) - explosiveSpecialist (bool) - loadCoef (scalar) - medic (bool) - UAVHacker (bool) + Get list of all available magazines of artillery units on the list. Command returns only unique magazine types and doesn't contain any information about which unit has which magazine. - https://community.bistudio.com/wiki/setUnitTrait + https://community.bistudio.com/wiki/getArtilleryAmmo - Object setUnitTrait Array + getArtilleryAmmo Array - unit setUnitTrait [skill_name, value, isCustom] + getArtilleryAmmo [unit1, unit2, unit3] - $Code$player setUnitTrait ["Medic", true ];$/Code$ + $Code$if ("8Rnd_82mm_Mo_Flare_white" in getArtilleryAmmo [ + _mortar1, + _mortar2, + _mortar3, + _mortar4 + ]) then { + hint "Sir, we have white flares, sir!"; + };$/Code$ - local / global + global / undefined - (April 27, 2016) - The higher the value for the loadCoef the less stamina a unit has. Negative values will dramatically increase the stamina actually to a point where it extends the stamina bar. - Nothing + Array + - setUnloadInCombat + setRectangular - If cargo or turret units should get out of vehicle when in combat. If true, vehicle will stop and units will dismount. Vehicle must be local. + Set the shape of a location to be either rectangular or elliptical. Locations default shape is elliptical. - https://community.bistudio.com/wiki/setUnloadInCombat + https://community.bistudio.com/wiki/setRectangular - Object setUnloadInCombat Array + Location setRectangular Boolean - vehicle setUnloadInCombat [allowCargo, allowTurrets] + location setRectangular set - $Code$_veh setUnloadInCombat [ true, false ];$/Code$ + $Code$myLocation setRectangular true ;$/Code$ - local / global + undefined / undefined - Nothing + Nothing + - setUserActionText + triggerArea - Changes user added action (see addAction ) menu item text. - Since Arma 3 v1.61.136587 it is possible to set 2 more optional texts, one for background and one for foreground when action is displayed on the screen ( showWindow = true ) + Returns currently monitored trigger area. The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. + NOTE : Since Arma 3 v1.59.135137, triggerArea returns 3rd dimension for the monitored area. If height is not set, the value for it would be -1; - https://community.bistudio.com/wiki/setUserActionText + https://community.bistudio.com/wiki/triggerArea - Object setUserActionText Array + triggerArea Object - object setUserActionText [actionIndex, textMenu, textWindowBackground, textWindowForeground] + triggerArea trigger - $Code$_id = player addAction ["Hello", ""]; - player setUserActionText [_id, "Good Bye"];$/Code$ + $Code$_area = triggerArea sensor1; // result is [200, 120, 45, false]$/Code$ - $Code$_id = billboard addAction ["Some Action", {}]; - billboard setUserActionText [ - _id, - "Some Action", - " t color='#ff0000' Background----------------- /t br/ Multiline br/ Multiline br/ Multiline br/...", - " t color='#00ff00' -----------------Foreground /t " - ];$/Code$ + $Code$// Since Arma 3 v1.59.135137: + _area = triggerArea sensor1; // result is [200, 120, 45, false, -1];$/Code$ global / local @@ -62641,658 +65101,612 @@ - Nothing + Array + - setUserMFDvalue + createUnit - When MFD is using user controllers, this command can set values on them. For example, MFD config for Blackfoot has an entry - ... - class Draw - { - alpha = "user3" ; - color [ ] = { "user0", "user1", "user2" } ; - ... - which could control color of the MFD. See Example 2-3-4 on how to set different colors of the Blackfoot MFD + Create unit of a class that's defined in CfgVehicles. + The Group parameter MUST be an existing group or the unit won't be created. - https://community.bistudio.com/wiki/setUserMFDvalue + https://community.bistudio.com/wiki/createUnit - Object setUserMFDvalue Array + Group createUnit Array + + String createUnit Array - vehicle setUserMFDvalue [index, value] + group createUnit [type, position, markers, placement, special] + + type createUnit [position, group, init, skill, rank] - $Code$BIS_Plane setUserMFDvalue [0,1]; // user0 in MFD will return 1$/Code$ + $Code$_unit = group player createUnit ["B_RangeMaster_F", position player, [], 0, "FORM"];$/Code$ - $Code$// Set MFD Red: - Blackfoot setUserMFDvalue [0, 1]; // "user0" - 1 - Blackfoot setUserMFDvalue [1, 0]; // "user1" - 0 - Blackfoot setUserMFDvalue [2, 0]; // "user2" - 0 - Blackfoot setUserMFDvalue [3, 1]; // "user3" - 1$/Code$ + $Code$"B_RangeMaster_F" createUnit [ position player, group player ];$/Code$ - $Code$// Set MFD pale Blue: - Blackfoot setUserMFDvalue [0, 0]; // "user0" - 0 - Blackfoot setUserMFDvalue [1, 0]; // "user1" - 0 - Blackfoot setUserMFDvalue [2, 1]; // "user2" - 1 - Blackfoot setUserMFDvalue [3, 0.1]; // "user3" - 0.1$/Code$ + $Code$"B_RangeMaster_F" createUnit [ getMarkerPos "barracks", _groupAlpha];$/Code$ - $Code$// Hide MFD: - Blackfoot setUserMFDvalue [3, 0]; // "user3" - 0$/Code$ + $Code$"B_RangeMaster_F" createUnit [ getMarkerPos "marker_1", _groupAlpha, "loon1 = this; + this addWeapon 'BAF_L85A2_RIS_SUSAT'", 0.6, "corporal"];$/Code$ - undefined / undefined + undefined / global + (August 13, 2006) + To give a newly created unit a name, put "newUnit = this" in the init field. + + (18:41, 5 April 2007 (CEST)) + The eventhandlers added with addEventHandler in the init parameter will only fire locally on the machine where this creation command is called from. + + (December 24, 2007) + If you do not wish it to be in a group, you can create a gamelogic and group it to that. Note: The unit will deny to move away from the gamelogic. + + (August 27, 2015) + In order to solve the above problem you can simply group it to the game logic as stated, then group it to grpNull + e.g + $Code$myUnit join myGroupLogic; + myUnit join grpNull + $/Code$ + + (21 December 2006) + Although this command takes a group as an argument, you need to use the join command if you want the created units to perform actions such as move. For example: + $Code$ comment "Create a new soldier within 100m of the player and cause them to run towards the player" ; + _grp = createGroup west ; + unit = _grp createUnit ["SoldierWB", position player, [], 100, "FORM"] ; + [unit] join _grp ; + unit move position player ; + $/Code$ + However, some commands such as setUnitPos only work if run before the join. + + (11 March 2011) + Comment above about 'an additional join required' is no longer true for Operation Arrowhead. + + (27th Nov 2016) + (A3 v1.64)The side of created unit by this command fallows the fraction from its config and won’t be affected by the side of the passed group parameter which is created by createGroup on the fly without entities. + $Code$ + _grp = createGroup east ; // O Alpha 1-1 + _ap = _grp createUnit [ “C_man_p_beggar_F”, position player, [], 0, "FORM"]; + //the side of _ap is still CIV not EAST. + $/Code$ + We can use join command family or fill the _grp with entities in advance to set _ap to our desired side. - Nothing + Object - Nothing + - setVariable + params - Set variable to given value in the variable space of given element. - To remove a variable, set it to nil (e.g. player setVariable ["varname", nil ];$/Code$ ). - When variable is set on Task, it is not actually set on task itself, but on FSM attached to the task. So if there is no FSM setVariable will not work. - All available variable spaces which support setVariable : - Namespace setVariable Array - Object setVariable Array - Group setVariable Array - Team_Member setVariable Array - Task setVariable Array - Location setVariable Array - Control setVariable Array (since Arma 3 v1.55.133553) - Display setVariable Array (since Arma 3 v1.55.133553) - In Arma 3 it is possible to broadcast nil value + Parses input argument into array of private variables. When used without argument, as shown in main syntax, internal variable _this, which is usually available inside functions and event handlers, is used as argument. + In addition to simple parsing directly into variables, input can be tested in case it is undefined, of the wrong type or of the wrong size (if array) and substituted if necessary with default values. Since Arma 3 v1.53.132691, onscreen errors are displayed for when the input is of the wrong type or size. - https://community.bistudio.com/wiki/setVariable + https://community.bistudio.com/wiki/params - Namespace/Object/Group/Team_Member/Task/Location/Control/Display setVariable Array + params Array - Namespace/Object/Group setVariable Array + Anything params Array - varspace setVariable [name, value] + params [element1, element2,elementN] - varspace setVariable [name, value, public] + argument params [element1, element2,elementN] - $Code$_myTruck setVariable ["myPublicVariable", 123, true ];$/Code$ + $Code$[1, 2, 3] call { + private ["_one", "_two", "_three"]; + _one = _this select 0; + _two = _this select 1; + _three = _this select 2; + //..... + }; + // Same as above, only using params + [1, 2, 3] call { + params ["_one", "_two", "_three"]; + //..... + };$/Code$ - $Code$_myTruck setVariable ["myLocalVariable", ["321", _var], false ];$/Code$ + $Code$[123] call { + params ["_myvar"]; + }; + // Below would produce the same result as above + 123 call { + params ["_myvar"]; + };$/Code$ - $Code$missionNamespace setVariable ["myName", "KK"]; - hint myName; //KK$/Code$ + $Code$position player params ["", "", "_z"]; + if (_z 10) then { + hint "YOU ARE FLYING!"; + };$/Code$ - $Code$// Get current value of a variable and if it is undefined, define it and get the defined value: - private _var = missionNamespace getVariable "varName"; - if ( isNil "_var") then - { - missionNamespace setVariable ["varName", 123]; - _var = 123; + $Code$[1, nil, 2] params ["_var1", "_var2", "_var3"]; + // All 3 variables are made private but only _var1 and _var3 are defined + [1, nil, 2] params ["_var1", ["_var2", 23], "_var3"]; + // All 3 variables are private and defined$/Code$ + + $Code$[1, 2] call { + if (! params ["_var1", "_var2", ["_var3", true, [ true ]]]) exitWith { + hint str [_var1, _var2, _var3]; }; - // _var here will contain current value of the variable varName$/Code$ + }; + // The hint shows [1,2,true] + //Script exits, default value was used due to missing value + [1, 2, 3] call { + if (! params ["_var1", "_var2", ["_var3", true, [ true ]]]) exitWith { + hint str [_var1, _var2, _var3]; + }; + }; + // The hint shows [1,2,true] + //Script exits, default value was used due incorrect value type$/Code$ + + $Code$[1, "ok", [1, 2, 3]] call { + if (! params [ + ["_var1", 0, [0]], + ["_var2", "", [""]], + ["_var3", [0,0,0], [[], objNull, 0], [2,3]] + ]) exitWith {}; + hint "ok"; + }; + // Passes validation + [1, 2, [3, 4, 5]] call { + if (! params ["_var1", "_var2", ["_var3", [], [[], objNull, 0], 0]]) exitWith {}; + hint "ok"; + }; + // Fails, because passed array is expected to be of 0 length, i.e. empty$/Code$ + + $Code$position player params ["_x", "_y"]; + player setPos [_x, _y, 100];$/Code$ + + $Code$[1, 2, 3, [4, 5, 6]] call { + params ["_one", "_two", "_three"]; + _this select 3 params ["_four", "_five", "_six"]; + };$/Code$ + + $Code${ + _x params ["_group", "_index"]; + //..... + } forEach waypoints group player ; + fn_someFnc = { + params ["_position", ["_direction", 0], ["_name", ""]]; + // Extract the x, y, and z from "_position" array: + _position params ["_x", "_y", "_z"]; + //..... + }; + [ position player, direction player, name player ] call fn_someFnc;$/Code$ + + $Code$targ addEventHandler ["HitPart", { + _this select 0 params ["_target", "_shooter", "_projectile"]; + }];$/Code$ - global / local + undefined / undefined - (December 9, 2015) - This command does not work with CfgAmmo or CfgNonAIVehicles objects, like bullets, mines or butterflies (probably because they are local objects Killzone Kid ( talk ) 11:25, 9 July 2017 (CEST)). + (August 30, 2015) + Because params doubles as private, instead of: + $Code$[1, 2, 3] params ["_one", "_two", "_three"]; + private "_four"; + _four = 4;$/Code$ + You can just: + $Code$[1, 2, 3] params ["_one", "_two", "_three", "_four"]; + _four = 4;$/Code$ + + (November 3, 2016) + With a function only taking one Parameter, it doesn't matter whether the parameter is in an array or not: + Example: + $Code$1 call { + params [ ["_number",0, [0]] ]; + }; + or + [1] call { + params [ ["_number",0, [0]] ]; + };$/Code$ + But when the one Parameter is an array that parameter has to be inside of an array when the function is called + Example: + $Code$[1,2] call { + params [ ["_array", [], [[]], 2] ]; + };//Fails + [[1,2]] call { + params [ ["_array", [], [[]], 2] ]; + };//Succeeds$/Code$ - Nothing - Nothing + Boolean - Boolean + - setVectorDirAndUp + getArray - Sets orientation of an object. The command takes 2 vector arrays, one for vectorDir and one for vectorUp. Default object orientation will always have vectorDir pointing forward (North) along Y axis and vectorUp pointing up along Z axis - [[0,1,0],[0,0,1]], as shown on the diagram below. - When attaching object to an object the axes are relative to the object that gets the attachment. If it is player object for example, then X goes from left to right, Y goes from back to front, and Z goes from down up. - The setDir command is incompatible with setVectorDirAndUp and should not be used together on the same object. Using setVectorDirAndUp alone should be sufficient for any orientation. - In Multiplayer, setVectorDirAndUp must be executed on the machine where the object it applied to is local. + Extract array from config entry. - https://community.bistudio.com/wiki/setVectorDirAndUp + https://community.bistudio.com/wiki/getArray - Object setVectorDirAndUp Array + getArray Config - vehicle setVectorDirAndUp [[x1, y1, z1],[x2, y2, z2]] + getArray config - $Code$// set exact yaw, pitch, and roll - _y = 45; _p = -80; _r = 0; - BRICK setVectorDirAndUp [ - [ sin _y * cos _p, cos _y * cos _p, sin _p], - [ [ sin _r,- sin _p, cos _r * cos _p],-_y] call BIS_fnc_rotateVector2D - ];$/Code$ - - $Code$// To rotate BRICK on Z axis 90 degrees clockwise, change its vectorDir but leave vectorUp unchanged. - BRICK setVectorDirAndUp [[1,0,0],[0,0,1]];$/Code$ - - $Code$// To rotate BRICK on Y axis 90 degrees clockwise, change its vectorUp but leave vectorDir unchanged. - BRICK setVectorDirAndUp [[0,1,0],[1,0,0]];$/Code$ - - $Code$// To rotate BRICK on X axis 90 degrees (tilt forward), change both vectorDir and vectorUp accordingly. - BRICK setVectorDirAndUp [[0,0,-1],[0,1,0]];$/Code$ - - $Code$// More complex orientations - //tilt forward 90 + rotate left 90 - BRICK setVectorDirAndUp [[1,0,0],[0,1,0]]; - //tilt backward 45 degrees - BRICK setVectorDirAndUp [[0,0.5,0.5],[0,-0.5,0.5]]; - //tilt forward 30 degrees - BRICK setVectorDirAndUp [[0,0.66,-0.33],[0,0.33,0.66]];$/Code$ + $Code$_array = getArray (configFile "CfgVehicles" "Thing" "threat")$/Code$ - local / global + undefined / undefined - (March 16, 2008) - Command can be also used to rotate camera in all three axis (which also mean it's possible to set camera bank). - - (May 9, 2008) - The object's vectorDir can only control its pitch, while its vectorUp can only control its bank. To set an object's yaw (direction), use the setdir command, before using this command. - You would think vectorUp would control pitch as well, but any pitch that would be set due to vectorUp is ignored. The same is true with vectorDir and yaw; any vectorDir that would adjust yaw is also ignored. If this doesn't make sense, try to visualize it with a box or soda can. - This command does NOT work with values relative to a unit, but rather it works with world vectors (think world coordinates as opposed to model coordinates). As a result, this command can be difficult to use in many situations, because the input values needed to get a certain pitch / bank for an object vary, depending on what direction the object is facing (yaw). - A function to set an object's pitch / bank can be found here - - (October 23rd, 2009) - Note this odd command may now be better understood. There's a thread about it here: - BI Studios Forum Thread - - (1 Jun, 2014) - (ArmA3 ver 1.20) setDir overwrites setVectorDirAndUp (P.S. setVectorDirAndUp also affects setVelocity.), so use setDir before BIS_fnc_setPitchBank, which is an easier workaround on vector, if changing yaw, pitch and bank are needed. setVectorDirAndUp is CCW, so if we wanna to set an obj 40 degrees CW, 170 degrees pitch and 85 degrees bank: - $Code$_obj setDir (40 - 180); [_obj, 170, 85] call BIS_fnc_setPitchBank ;$/Code$ - Same as: - $Code$_obj setVectorDirAndUp [[0.63,0.75,0.17],[-0.75,0.65,-0.084]];$/Code$ - Be aware that attachTo may flip vectorDir if pitch beyond 90 degrees and cause unexpected behavior to BIS_fnc_setPitchBank, e.g. - $Code$[_obj, 100, 0] call BIS_fnc_setPitchBank ; //vector: [-0.14,-0.09,0.98],[-0.83,-0.51,-0.17]$/Code$ - $Code$_obj attachTo [_logic,[0,0,2]]; - [_obj, 100, 0] call BIS_fnc_setPitchBank ; //vector: [0.11,0.33,0.93],[-0.06,0.94,-0.32] - compass direction algorism failed if obj was attached at present.$/Code$ - To overcome such limitation we can use fallowing function for a better workaround. (code originated from bapedibupa, remodified) - $Code$ - _obj attachTo [_logic,[0,0,2]]; - [_obj,[120,-78,37]] call fnc_SetPitchBankYaw; // pitch: 120, bank: -78, yaw: 37$/Code$ + (Mar 28, 2014) + (ArmA3 1.14) It's recommended to use BIS_fnc_GetCfgData or BIS_fnc_returnConfigEntry to get variable cfg data rather than conditioning via isNumber, isText, isArray, getNumber, getText and getArray combination. + Traditional workaround: $Code$ - fnc_SetPitchBankYaw = { - private ["_object","_rotations","_aroundX","_aroundY","_aroundZ","_dirX","_dirY", - "_dirZ","_upX","_upY","_upZ","_dir","_up","_dirXTemp","_upXTemp"]; - _object = _this select 0; - _rotations = _this select 1; - _aroundX = _rotations select 0; - _aroundY = _rotations select 1; - _aroundZ = (360 - (_rotations select 2)) - 360; - _dirX = 0; - _dirY = 1; - _dirZ = 0; - _upX = 0; - _upY = 0; - _upZ = 1; - if (_aroundX != 0) then { - _dirY = cos _aroundX; - _dirZ = sin _aroundX; - _upY = - sin _aroundX; - _upZ = cos _aroundX; - }; - if (_aroundY != 0) then { - _dirX = _dirZ * sin _aroundY; - _dirZ = _dirZ * cos _aroundY; - _upX = _upZ * sin _aroundY; - _upZ = _upZ * cos _aroundY; - }; - if (_aroundZ != 0) then { - _dirXTemp = _dirX; - _dirX = (_dirXTemp* cos _aroundZ) - (_dirY * sin _aroundZ); - _dirY = (_dirY * cos _aroundZ) + (_dirXTemp * sin _aroundZ); - _upXTemp = _upX; - _upX = (_upXTemp * cos _aroundZ) - (_upY * sin _aroundZ); - _upY = (_upY * cos _aroundZ) + (_upXTemp * sin _aroundZ); - }; - _dir = [_dirX,_dirY,_dirZ]; - _up = [_upX,_upY,_upZ]; - _object setVectorDirAndUp [_dir,_up]; + _cfg = configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type" + switch ( true ) do + { + case ( isNumber _cfg): { getNumber _cfg}; + case ( isText _cfg): { getText _cfg}; + case ( isArray _cfg): { getArray _cfg;}; + default { nil }; }; $/Code$ + Recommended workaround: + $Code$ + ( configFile "CfgVehicles" _SomeAddonClassName "DestructionEffects" "Smoke1" "type") call BIS_fnc_GetCfgData ; + $/Code$ + To return default value once entry was not found, we can use BIS_fnc_returnConfigEntry instead of BIS_fnc_GetCfgData. + $Code$ + [( configFile "CannonFire" "LightExp"),"lifeTime",0] call BIS_fnc_returnConfigEntry ;//0.5 + $/Code$ + + (January 12, 2018) + There is special behaviour if you try to read a description.ext config entry Array that contains a Bool. + Getting array in MP will result in Number, while SP will return String. + $Code$// SP with false in array + getArray ( missionConfigFile "someClass" "someArray") // - "false" + // MP with false in array + getArray ( missionConfigFile "someClass" "someArray") // - 0$/Code$ - Nothing + Array + - setVectorDir + setVehicleId - Set object's direction vector. Up vector will remain unchanged. + Sets id (integer value) to vehicle. By this id vehicle is referenced by triggers and waypoints. - https://community.bistudio.com/wiki/setVectorDir + https://community.bistudio.com/wiki/setVehicleId - Object setVectorDir Array + Object setVehicleId Number - object setVectorDir [x,y,z] + vehicleName setVehicleId id - + $Code$player setVehicleId 1$/Code$ + - local / global + undefined / undefined - (March 16, 2008) - Command can be also used to rotate camera in all three axis. - - (21:06, 3 March 2009 (CET)) - setVectorDir can only influence an object's pitch. It can not influence bank. Example: - $Code$player setVectorDir [0,0,1]$/Code$ - If the player is facing 0 degrees (north), then this will do NOTHING. - If the player is facing 90 degrees (east), then this will make him pitch 90 degrees up. - You can't directly pitch an object beyond 90 degrees, because this would change its facing direction. You must first flip it's direction using setDir, then you must bank the object 180 degrees, THEN you pitch the object appropriately. - - (August 17, 2015) - In Arma 3, setVectorDir does not control an object's pitch or bank, in fact, it is not possible to change either of those solely using setVectorDir. This command can only affect horizontal rotation along the x-plane, unless an object first has it's vectorUp changed to something other than [0,0,1]. Correct input to setVectorDir should be calculated using the trigonometric functions sin and cos. - examples: - $Code$ - 0 degrees (north) - player setVectorDir - [ - sin 0, //equals 0 - cos 0, //equals 1 - 1 - ]; - 45 degrees (north-east) - player setVectorDir - [ - sin 45, //equals 0.707 - cos 45, //equals 0.707 - 1 - ];$/Code$ - If you are doing trigonometric calculations, it may be better to use setVectorDir rather than setDir, since sine and cosine have already been calculated and will not need to be re-calculated - (also, setDir probably uses setVectorDir anyway.) - Nothing + Nothing + - setVectorUp + mapAnimClear - Set object's up vector. Direction of the object remain unchanged. Default object's vectorUp is [0,0,1]. - In Multiplayer, setVectorUp must be executed on the machine where the object it applied to is local. + Clear map animation. - https://community.bistudio.com/wiki/setVectorUp + https://community.bistudio.com/wiki/mapAnimClear - Object setVectorUp Array + mapAnimClear - object setVectorUp [x, y, z] + mapAnimClear - $Code$// Turn object upside down: - _obj setVectorUp [0,0,-1];$/Code$ - - $Code$// Align object with the terrain underneath: - _obj setVectorUp surfaceNormal position _obj;$/Code$ - + - local / global + local / local - setVectorUp can only influence an object's bank. It can not influence pitch. Example: - player setVectorUp [0,1,0] - If the player is facing 0 degrees (north), then this will do NOTHING. - If the player is facing 90 degrees (east), then this will make him bank 90 degrees to his left. - - (March 22, 2007) - An in-depth discussion on the concept of vectors is available here. - - (March 16, 2008) - Command can be also used to rotate camera in all three axis (which also mean it's possible to set camera bank). - - (October 3, 2013) - It is possible to change both pitch and bank of an object ( surfaceNormal application for instance). Assuming an ammo box in the following example is facing North (default direction is 0): $Code$_ammobox setVectorUp [0,1,0]; //box is pitched 90 degrees forward - _ammobox setVectorUp [1,0,0]; //box is banked 90 degrees to the right$/Code$ - However the above will stop working as soon as you attach the box to something. The following trick however will work in this case: - $Code$_ammobox attachTo [ player, [0,2,1]]; - _ammobox setVectorUp [0,0.99,0.01]; //box is pitched ~90 degrees forward - _ammobox setVectorUp [0.99,0,0.01]; //box is banked ~90 degrees to the right$/Code$ + In OFP v1.96, the mapAnim series of commands, together with forceMap can only be used in the intro and mission, as it is not possible to access the map from the outro. (not checked, sourced from an old copy of the OFPEC comref) - Nothing + Nothing + - setVehicleAmmoDef + get3DENLayerEntities - Sets how much ammunition (compared to the configuration of magazines defined in the vehicle's class) the vehicle has. Note that the ammo will only be added to local turrets. To check the locality of turret use turretLocal. + Return all entities and sub-layer in Eden Entity layer. - https://community.bistudio.com/wiki/setVehicleAmmoDef + https://community.bistudio.com/wiki/get3DENLayerEntities - Object setVehicleAmmoDef Number + get3DENLayerEntities Number - unit setVehicleAmmoDef value + get3DENLayerEntities layerID - $Code$player setVehicleAmmoDef 0;$/Code$ + $Code$_myLayer = -1 add3DENLayer "CTRG"; + player set3DENLayer _myLayer; + _entities = get3DENLayerEntities _myLayer;$/Code$ - local / global + undefined / undefined - (December 20, 2014) - For vehicles this command operates relative to its stock magazine loadout (i.e. its CfgVehicles magazines[] values). Thus setVehicleAmmoDef 1 will fully restore a vehicle to its default ammunition capacity, resetting any changes made by intentionally/implicitly adding/removing magazines. - Use setVehicleAmmo to operate in relation to a vehicle's current magazine loadout. - -- Actium ( talk ) 22:49, 20 December 2014 (CET) - Nothing + Array + - setVehicleAmmo + waypointPosition - Sets how much ammunition (compared to a full state defined by the vehicle type) the vehicle has. Note that the ammo will be added only to local turrets. To check locality of turret use turretLocal. - The value ranges from 0 to 1. + Get Waypoint 's Position. Note : This function is identical to getWPPos. - https://community.bistudio.com/wiki/setVehicleAmmo + https://community.bistudio.com/wiki/waypointPosition - Object setVehicleAmmo Number + waypointPosition Array - vehicleName setVehicleAmmo value + waypointPosition waypoint - $Code$player setVehicleAmmo 0;$/Code$ - - $Code$_vehicle setVehicleAmmo 1;$/Code$ + $Code$_wPos = waypointPosition [_groupOne, 1];$/Code$ - local / global + undefined / undefined - This command does not add magazines to vehicle weapons that normally start with more than one magazine. It can however, remove these magazines. - - A2:OA v1.59 - Magazines of vehicle turrets are also refilled by this command. - - If you 'unit/vehicle setVehicleAmmo 0;' an unit/vehicle first, you cannot refill it with 'unit/vehicle setVehicleAmmo 1;'. - You need to execute where the unit is local. - You need to execute on the effectiveCommander of a vehicle. - - In ArmA 3, using this command seems correctly rearm the vehicle and its turrets in all situations (tested with beta 0.72). - - In ArmA 3, when using this on a player, this command can only reduce the number of magazine in relation to the current ammo quantity of the unit. For example if player has 8 magazines, player setVehicleAmmo 0.5; will leave unit with 4 mags. Executing player setVehicleAmmo 0.5; again will leave unit with 2 mags. player setVehicleAmmo 0.5; again - 1 mag. player setVehicleAmmo 0; will remove all mags. If player had 10 mags with 30 bullets in each, player setVehicleAmmo 0.01; will leave player with loaded mag with 3 bullets in it (300 x 0.01 = 3) - - (December 20, 2014) - This command does not operate compared to a full state defined by the vehicle type, but rather relative to a vehicle's current magazine loadout. To get the former behaviour use setVehicleAmmoDef, which utilizes the vehicles default magazine loadout (i.e. its CfgVehicles magazines[] values). - Nothing + Array + - setVehicleArmor + menuAction - Sets the armor (or health for men) state of the vehicle (a value from 0 to 1). - Works like setDamage only in reverse: player setVehicleArmor 1 is the same as player setDamage 0, and player setVehicleArmor 0 is the same as player setDamage 0.97 + Returns action stored in item on given path. - https://community.bistudio.com/wiki/setVehicleArmor + https://community.bistudio.com/wiki/menuAction - Object setVehicleArmor Number + menuAction Array - vehicleName setVehicleArmor value + menuAction [idc, path] - $Code$player setVehicleArmor 0.5;$/Code$ - + - local / global + undefined / undefined - Nothing + String + - setVehicleCargo + setSize - Load cargo vehicle inside vehicle if possible, returns bool based on whether the vehicle was able to be loaded. Can also be used to unload a specific loaded vehicle or all loaded vehicles. + Sets the size (radius) of a location. + The width is 2 * x, the height is 2 * y. - https://community.bistudio.com/wiki/setVehicleCargo + https://community.bistudio.com/wiki/setSize - Object setVehicleCargo Object + Location setSize Array - vehicle setVehicleCargo cargo + location setSize size - $Code$// Blackfish with no vehicle cargo loaded - _success = blackfish setVehicleCargo offroad; //true$/Code$ - - $Code$// Blackfish with full cargo already loaded - _success = blackfish setVehicleCargo offroad; //false$/Code$ - - $Code$// Unload specific loaded vehicle - _success = objNull setVehicleCargo offroad;$/Code$ - - $Code$// Unload all vehicles - _success = blackfish setVehicleCargo objNull ;$/Code$ + $Code$myLocation setSize [10,30]$/Code$ undefined / undefined - (July 4, 2016) - From biforums : - "objnull setVehicleCargo cargo vehicle - will unload specific loaded vehicle" and "transporting vehicle setVehicleCargo objnul - unload all vehicles" - Boolean + Nothing + - setVehicleId + assignAsCommander - Sets id (integer value) to vehicle. By this id vehicle is referenced by triggers and waypoints. + Assign a unit as commander of a vehicle. Used together with orderGetIn to order subordinate units to get in as commander of a specific vehicle. Before usage of this command a subordinate unit hasn't got the option to get into the commander place of the vehicle. - https://community.bistudio.com/wiki/setVehicleId + https://community.bistudio.com/wiki/assignAsCommander - Object setVehicleId Number + Object assignAsCommander Object - vehicleName setVehicleId id + unitName assignAsCommander vehicleName - $Code$player setVehicleId 1$/Code$ + $Code$_soldier1 assignAsCommander _tank + [_soldier1] orderGetIn true$/Code$ - undefined / undefined + global / global - Nothing + Nothing + - setVehicleLock + setCuratorCameraAreaCeiling - Sets vehicle lock. Possible values: - "UNLOCKED" - "DEFAULT" - "LOCKED" - "LOCKEDPLAYER" + Sets maximal height to which curator camera can move. - https://community.bistudio.com/wiki/setVehicleLock + https://community.bistudio.com/wiki/setCuratorCameraAreaCeiling - Object setVehicleLock String + Object setCuratorCameraAreaCeiling Number - vehicleName setVehicleLock lockState + curatorObj setCuratorCameraAreaCeiling height - $Code$_veh1 setVehicleLock "LOCKED";$/Code$ + $Code$myCurator setCuratorCameraAreaCeiling 50;$/Code$ - local / global + undefined / undefined - (October 22, 2014) - In Arma 3: - setVehicleLock "UNLOCKED" = same as " lock 0" - setVehicleLock "DEFAULT" = same as " lock 1" - setVehicleLock "LOCKED" = same as " lock 2" - setVehicleLock "LOCKEDPLAYER" = same as " lock 3" - - (March 4, 2015) - DEFAULT lock is default vehicle lock when vehicle placed in editor. If player is in a group of AIs and not the leader, he will not be able to enter this vehicle as he will not have GetIn action for this vehicle. + This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - setVehiclePosition + alive - Moves the object to a given position (same as createVehicle placement algorithm). Uses either the position that's defined by the position param, or one of the marker positions from the markers array. The object is placed inside a circle with position as its center and placement as its radius. The type of placement could also be controlled with special. - If position is in water and vehicle can float, it is placed on water surface, otherwise it is placed on the ground, even if ground is under water. If roof surfaces support walking, units will be placed on roofs if such position is given. + Check if given vehicle/person/building is alive (i.e. not dead or destroyed). alive objNull returns false. - https://community.bistudio.com/wiki/setVehiclePosition + https://community.bistudio.com/wiki/alive - Object setVehiclePosition Array + alive Object - object setVehiclePosition [position, markers, placement, special] + alive object - $Code$player setVehiclePosition [[1000,2000], ["Pos1","Pos2","Pos3"], 0, "CAN_COLLIDE"]; - // Will place the player at either [1000,2000], or one of the three markers positions.$/Code$ - - $Code$heli setVehiclePosition [ player, [], 0, "FLY"];$/Code$ - - $Code$_cam = "camera" camCreate [0,0,0]; - _cam setDir random 360; - _cam setVehiclePosition [[5000,5000], [], 1000, "NONE"]; - _cam setPosWorld ( getPosWorld _cam vectorAdd [0,0,1.8]); - _cam cameraEffect ["Internal", "Back"];$/Code$ + $Code$// SQS: + ?!( alive player ) : exit$/Code$ - $Code$private _tablePos = player getRelPos [3, 0]; - private _table = "Land_CampingTable_F" createVehicle [0,0,0]; - private _laptop = "Land_Laptop_unfolded_F" createVehicle [0,0,0]; - _table setPos _tablePos; - _laptop setVehiclePosition [_tablePos vectorAdd [0.5, 0.2, 10], [], 0, "CAN_COLLIDE"]; - _laptop attachTo [_table];$/Code$ + $Code$// SQF: + if (! alive player ) exitWith {};$/Code$ - global / global + global / undefined - (June 24, 2015) - If you need to set direction as well, set it before using setVehiclePosition. The command will use existing dir of the object for its calculations. - $Code$ player setDir random 360; - player setVehiclePosition [ player, [], 100, "none"];$/Code$ + (October 19, 2015) + Alive or not could be the question! in multi-player, missions come with respawn module(s). When a player is dead shot, (alive player) will return false, then almost immediately true if the "revive" respawn template is enabled, then could turn on false if time for assistance is elapsed or if the player activates the respawn menu before; and finally true after player respawns. Just be aware that in that case (respawn + revive enabled), the status of the player is toggling: true false true false true. Then, alive status while player is waiting for being rescued could lead to some error scripts as player is supposed to be alive but in limbo and the dead entity "player" passed to server. - Boolean + Boolean + - setVehicleRadar + getDescription - Sets the AI rules of Radar usage (Emission Control). Automatic means Radar switched on only when in Combat. The command doesn't affect player-controlled vehicles. + Returns the string representation of unit as an four slots array. - https://community.bistudio.com/wiki/setVehicleRadar + https://community.bistudio.com/wiki/getDescription - Object setVehicleRadar Number + getDescription Object - vehicle setVehicleRadar rules + getDescription unit - $Code$_vehicle setVehicleRadar 1;$/Code$ - + undefined / undefined + Return value fixed in revision 0.51.103185. + + (September 21, 2014) + Pretty useless command tbh, return is something like this: + ["B_Soldier_F","Combat Fatigues (MTP)","Carrier Lite (Green)",""] or ["ERROR","ERROR","ERROR","ERROR"] - Nothing + Array + - setVehicleReceiveRemoteTargets + loadBackpack - Sets that the vehicle will be able to receive targets acquired by someone else via datalink from the Side center. + Returns current sum of mass from items stored in a backpack. - https://community.bistudio.com/wiki/setVehicleReceiveRemoteTargets + https://community.bistudio.com/wiki/loadBackpack - Object setVehicleReceiveRemoteTargets Boolean + loadBackpack Object - vehicle setVehicleReceiveRemoteTargets bool + loadBackpack unit - $Code$( vehicle player ) setVehicleReceiveRemoteTargets true;$/Code$ + $Code$myVariable = loadBackpack myUnit;$/Code$ undefined / undefined @@ -63300,55 +65714,68 @@ - Nothing + Number + - setVehicleReportOwnPosition + simulWeatherSync - Sets that the vehicle will share its own position via datalink to the Side center. + Synchronizes Simul Weather with Arma weather, generates all keyframes. - https://community.bistudio.com/wiki/setVehicleReportOwnPosition + https://community.bistudio.com/wiki/simulWeatherSync - Object setVehicleReportOwnPosition Boolean + simulWeatherSync - vehicle setVehicleReportOwnPosition report + simulWeatherSync - $Code$( vehicle player ) setVehicleReportOwnPosition true;$/Code$ - + undefined / undefined + (May 4, 2016) + The behavior of this command is similar to forceWeatherChange, however it leaves current weather transitions intact. Its main purpose would be to refresh the cloud cover to properly reflect current overcast, as they can sometime get out of sync, especially when using setTimeMultiplier and setAccTime. - Nothing + Nothing + - setVehicleReportRemoteTargets + canAddItemToBackpack - Sets that the vehicle will share targets that were acquired by its own sensors via datalink to the Side center. + Checks if given object can be stored into soldier's backpack. - https://community.bistudio.com/wiki/setVehicleReportRemoteTargets + https://community.bistudio.com/wiki/canAddItemToBackpack - Object setVehicleReportRemoteTargets Boolean + Object canAddItemToBackpack String + + Object canAddItemToBackpack Array - vehicle setVehicleReportRemoteTargets bool + unit canAddItemToBackpack item + + unit canAddItemToBackpack [item, count] - $Code$( vehicle player ) setVehicleReportRemoteTargets true;$/Code$ + $Code$_item = "HandGrenade"; + _fits = player canAddItemToBackpack _item; + if (_fits) then { + player addItemToBackpack _item; + } else { + hint "no room!"; + };$/Code$ undefined / undefined @@ -63356,296 +65783,308 @@ - Nothing + Boolean - Boolean + - setVehicleTIPars + synchronizedObjects - Sets the "heat" state of different vehicle parts (for TI detection). This allows simulation of heated up parts of a vehicle without it actually having to utilize them. (0: cold, 1: hot) + Return the list of objects synchronized with the given unit. - https://community.bistudio.com/wiki/setVehicleTIPars + https://community.bistudio.com/wiki/synchronizedObjects - Object setVehicleTIPars Array + synchronizedObjects Object - vehicle setVehicleTIPars [engine, wheels, weapon] + synchronizedObjects unit - $Code$vehicle player setVehicleTIPars [1,1,1];$/Code$ + $Code$_objects = synchronizedObjects _logic;$/Code$ - undefined / undefined + local / undefined + This command only returns the LEADER of a vehicle that is synchronized. You have to use the "vehicle" + command to select the actual vehicle. + This command only returns the synchronized objects when used on intelligent objects such as units or + logic objects. All other objects returns an empty array. + In MP this command returns only values when the object is local. otherwise it returns an empty array. + + (February 26, 2015) + When returning the synchronized objects, they are returned in the order that they were placed on the map + + (October 27, 2016) + In Eden you can synchronize both units and their vehicles separately by syncing the gamelogic (or whatever) to the vehicle itself, and then the driver (or whatever other passengers) of the vehicle. To use an entire group, just sync all units within that group to the gamelogic (not just the leader or group icon). By doing this you can execute commands on each unit in a group and just the crew/single unit of a vehicle, or just the vehicle and not the crew, or both the vehicle and the crew. - Nothing + Array + - setVehicleVarName + countEnemy - Sets string representation of an object to a custom string. For example it is possible to return "MyFerrari" instead of default "ce06b00# 164274: offroad_01_unarmed_f.p3d" when querying object as string: - $Code$ hint str _offroad; //MyFerrari$/Code$ - When a vehicle is created and named in the editor, the name becomes both the variable containing the vehicle object and the string representation of the vehicle object. vehicleVarName on the other hand is only string representation of the object. So if you want to refer to the actual object by its vehicleVarName, an extra step needed to assign the object to a variable of the same name. For example to see and refer to offroad as myFerrari: - $Code$_offroad setVehicleVarName "MyFerrari"; MyFerrari = _offroad;$/Code$ - In multiplayer environment setVehicleVarName has to be executed on every PC if you want the custom name to be known everywhere. If vehicle is created and named in the editor, the vehicle name will be known globally automatically. - To reset vehicleVarName and str representation of the object to original form set vehicleVarName to an empty string: - $Code$_offroad setVehicleVarName "";$/Code$ + Count how many units in the array are considered enemy to the given unit. - https://community.bistudio.com/wiki/setVehicleVarName + https://community.bistudio.com/wiki/countEnemy - Object setVehicleVarName String + Object countEnemy Array - object setVehicleVarName name + unitName countEnemy arrayName - $Code$player setVehicleVarName "aP";$/Code$ + $Code$_num = player countEnemy list _triggerOne;$/Code$ - global / local + global / undefined + (August 3, 2006) + Notes from before the conversion: + The countEnemy command seem to count the number of units from the array that are considered to be of the given type by the whole side, not just the specified unit. + + (December 15, 2006) + The unit that's checking (left side of the command) needs a certain level of knowledge about the target (about.1) before the enemy units are actually counted. (OFP & ArmA) - Nothing + Number + - setVelocityModelSpace + setDate - Sets the velocity (speed vector) of the given vehicle relative to its model. + Sets the actual mission date and time. - https://community.bistudio.com/wiki/setVelocityModelSpace + https://community.bistudio.com/wiki/setDate - Object setVelocityModelSpace Array + setDate Array - vehicle setVelocityModelSpace [x, y, z] + setDate [year, month, day, hour, minute] - $Code$car setVelocityModelSpace [0, 10, 0]; //pushes car forward$/Code$ + $Code$setDate [1986, 2, 25, 16, 0]; //(4:00pm February 25, 1986)$/Code$ + + $Code$// Set real date: + //postInit = 1; + if ( isServer ) then { + waitUntil { time 0}; + setDate ( missionStart select [0,5]); + };$/Code$ - local / global + local / local + This scripting command must be executed on the server to work properly in multiplayer + + This command is special in that it is "smart". If you add 120 minutes, for example, it will actually advance hours by 2, and so on. + 10:00, 7/12/2010 (BST) + + This command sets the date for the southern hemisphere only, i.e. when the map is in northern hemisphere a date [2010,12,7,17,0] is in day light and and date [2010,6,7,17,0] is in darkness. + 21:35, 31 October 2011 (EET) + + In multiplayer, the effect of this command is local, not global. The date from the server is synchronized with clients when they join the game (including start of the mission and joining in progress). E.g. if this command is executed on server in the init.sqf before the mission starts, every client will be synchronized with server as mission is started. However, if you run this command in the middle of the mission, effect is local. + 10 September 2013 (EET) + + This command is JIP compatible. Players joining after mission start will get current server date set up. + + (October 4, 2014) + Since an unknown version of ARMA 3, this command now has global effect when executed on the server. + + (February 5, 2015) + Arma 3 1.38.128937- Leapyear BUG - setdate [2016,12,31,23,59] yields an ingame date of the 1st of January 2017. If left to tick over from the 30th of December it ticks to 1st January skipping the 31st of December entirely. + Feedback_Link + + (April 23, 2017) + Regarding execution in the middle of a session, the post of MulleDK13 is not entirely true. If you don't change the year, you are perfectly fine when executing the command on the server only. However, the server does not sync the year. Hence, if you do change the year, you have to execute the command on the server, clients and JIP to account for the missing sync. e.g. + $Code$[[], { setDate [1986, 2, 25, 16, 0]}] remoteExec [" call ",0,"JIP_id_setDate"];$/Code$ - Nothing + Nothing + - setVelocityTransformation + getPilotCameraTarget - Interpolate and sets vectors. For additional info see this resource. + Returns the target of the object airplane or helicopter pilotCamera tracking. - https://community.bistudio.com/wiki/setVelocityTransformation + https://community.bistudio.com/wiki/getPilotCameraTarget - Object setVelocityTransformation Array + getPilotCameraTarget Object - objectName setVelocityTransformation [position1, position2, velocity1, velocity2, direction1, direction2, up1, up2, time] + getPilotCameraTarget object - $Code$_tracker setVelocityTransformation [ - getPosASL _currentPos, - getPosASL _nextPos, - velocity _currentVelocity, - velocity _nextVelocity, - vectorDir _currentVectorDir, - vectorDir _nextVectorDir, - vectorUp _currentVectorUp, - vectorUp _nextVectorUp, - _timeDiff - ];$/Code$ - - $Code$// Bob on imaginary stairway to heaven: - bob = createAgent ["C_man_1", player getRelPos [5, 0], [], 0, "CAN_COLLIDE"]; - bob switchMove "ladderciviluploop"; - pos1 = getPosASL bob; - pos2 = pos1 vectorAdd [0,0,0.75]; - bob addEventHandler ["AnimDone", - { - pos1 = pos2; - pos2 = pos2 vectorAdd [0,0,0.75] - }]; - onEachFrame - { - if (! alive bob) then - { - onEachFrame {}; - bob switchMove ""; - bob removeAllEventHandlers "AnimDone"; - }; - bob setVelocityTransformation [ - pos1, - pos2, - [0,0,0], - [0,0,0], - [0,1,0], - [0,1,0], - [0,0,1], - [0,0,1], - moveTime bob - ]; - };$/Code$ + $Code$_pilotCamTrack = ( getPilotCameraTarget vehicle player ) select 0; + _pilotCamTargetPos = ( getPilotCameraTarget vehicle player ) select 1; + _pilotCamTarget = ( getPilotCameraTarget vehicle player ) select 2;$/Code$ - undefined / undefined + local / undefined - (Aug 4, 2014 – 12:35) - (A3 1.24) Generally speaking setVelocityTransformation is more likely a combination of setPosASL, setVectorDirAndUp (or BIS_fnc_setPitchBank ) and time multiplier. It can be used as a position tracker with all necessary information collected, copied and then released within one function. Here’s a simple reproduction on how setVelocityTransformation works in game: - $Code$ - private ["_dataOld","_dataNext","_capturedData","_obj","_fps","_startTrackingTime","_stepOld","_stepNext","_tracker","_tempTime"]; - _stepOld = 0; - _tempTime = 0; - _stepNext = 1; - while { true } do { - _capturedData = _capturedData + [[ getPosASL _obj, velocity _obj, vectorDir _obj, vectorUp _obj]]; - sleep _fps; - _tempTime = _tempTime + _fps; - if (_tempTime = _startTrackingTime) then { - _dataOld = _capturedData select _stepOld; - _dataNext = _capturedData select _stepNext; - _stepOld = _stepOld + 1; - _stepNext = if (_stepNext = ( count _capturedData)) then [{_stepOld},{_stepNext + 1}]; - _tracker setVelocityTransformation - [_dataOld select 0,_dataNext select 0,_dataOld select 1,_dataNext select 1, - _dataOld select 2,_dataNext select 2,_dataOld select 3,_dataNext select 3,1]; - }; - };$/Code$ - Tracker starts coping the route and stance from the object when time start counting. TimeDiff determines the distance multiply between the current position and the next position. - Nothing + Array + - setVelocity + isMarkedForCollection - Set velocity (speed vector) of a vehicle. Units are in metres per second. + Checks whether the object is marked for weapons collection. - https://community.bistudio.com/wiki/setVelocity + https://community.bistudio.com/wiki/isMarkedForCollection - Object setVelocity Array + isMarkedForCollection Object - vehicleName setVelocity [x, y, z] + isMarkedForCollection object - $Code$_truck1 setVelocity [20, 0, 0];$/Code$ - - $Code$// Advanced method used for relative acceleration: - _vel = velocity _vehicle; - _dir = direction _vehicle; - _speed = 10; comment "Added speed"; - _vehicle setVelocity [ - (_vel select 0) + ( sin _dir * _speed), - (_vel select 1) + ( cos _dir * _speed), - (_vel select 2) - ];$/Code$ + $Code$_marked = isMarkedForCollection _truck$/Code$ - local / global + global / undefined - (20 Jun, 2014) - (ArmA3 1.22) setVelocity will be affected by setDir and setVectorDirAndUp. So use it after them. - Nothing + Boolean + - setViewDistance + libraryCredits - Set rendering distance, in metres. Default is 900m (in OFP) or 1,200m (in ArmA), accepted range is 500m to 5,000m (in OFP) or 10,000m (in ArmA). Setting view distance to = 0 resets the value to the one set in Options- Video- General- Visibility- Overall + Returns the credits for the libraries used by the game. - https://community.bistudio.com/wiki/setViewDistance + https://community.bistudio.com/wiki/libraryCredits - setViewDistance Number + libraryCredits - setViewDistance distance + libraryCredits - $Code$setViewDistance 2250;$/Code$ - - $Code$//reset view distance in Arma 3 - setViewDistance -1;$/Code$ + $Code$hint str libraryCredits ; // as in Arma2 OA 1.62.95208 + /* + [ + [ + "Botan", + "1999-2012 Jack Lloyd, 2001 Peter J Jones, 2004-2007 Justin Karneges, 2004 Vaclav Ovsik, 2005 Matthew Gregan, 2005-2006 Matt Johnston, 2006 Luca Piccarreta, 2007 Yves Jerschow, 2007-2008 FlexSecure GmbH, 2007-2008 Technische Universitat Darmstadt, 2007-2008 Falko Strenzke, 2007-2008 Martin Doering, 2007 Manuel Hartl, 2007 Christoph Ludwig, 2007 Patrick Sona, 2010 Olivier de Gaalon" + ], + [ + "rapidjson", + "2011 Milo Yip" + ], + [ + "libcurl", + "Copyright (c) 1996 - 2012, Daniel Stenberg" + ], + [ + "GameSpy", + "2009 GameSpy Industries, Inc." + ], + [ + "Theora", + "2002-2009 by the Xiph.Org Foundation http://www.xiph.org/" + ], + [ + "OggVorbis", + "1994-2002 by the Xiph.Org Foundation http://www.xiph.org/" + ], + [ + "Intel JPEG Library", + "1998 Intel Corporation" + ], + [ + "Matrix Template Library", + "2001-2005 The Trustees of Indiana University" + ], + [ + "Matrix Template Library", + "1998-2001 University of Notre Dame" + ], + [ + "Speex", + "2002-2006 Jean-Marc Valin" + ], + [ + "LZO Professional", + "1996-2011 Markus Franz Xaver Johannes Oberhumer" + ], + [ + "NVIDIA FXAA by TIMOTHY LOTTES", + "2010, 2011 NVIDIA CORPORATION" + ], + [ + "Jimenez's MLAA", + "2012 2011 by Jorge Jimenez, Belen Masia, Jose I. Echevarria, Fernando Navarro and Diego Gutierrez" + ] + ] + */$/Code$ - undefined / local + undefined / undefined - In OFP v1.96, view distance also defines the maximum distance between a unit and any other unit they can know about. Higher view distance will involve more AI simulation cycles for every unit, which causes low performance. - - I tested the above and it seems to apply in Arma 2 as well. AI at a bit above 500m would stop engaging when I lowered the view distance down to 500m and re-engaged when I increased it back. - - In ArmA 2 viewDistance can be set up to 15 km with this command ( while from interface only 10 km ) - - (October 15, 2014) - In Arma 3, Values below 200 have no visible effect. - - (November 20, 2014) - To clarify Bernagee's post, values under 200 have no effect. Tested by setViewDistance below 200, then hint viewDistance. It will not go below 200. Also, as object view distance can only be, at a maximum, the view distance, object view distance will also be reset to 200. - - (June 8, 2015) - Client-side max view distance is limited by the server's view distance. - Tested in Arma 3. - Nothing + Array + - setVisibleIfTreeCollapsed + enableAIFeature - Sets whether or not the object is visible even if the tree is collapsed. - i - Some Old Editor Command + Enable/disable given AI feature. Feature may be one of: + "AwareFormationSoft", "CombatFormationSoft". - https://community.bistudio.com/wiki/setVisibleIfTreeCollapsed + https://community.bistudio.com/wiki/enableAIFeature - Control setVisibleIfTreeCollapsed Array + String enableAIFeature Boolean - map setVisibleIfTreeCollapsed [object, visible] + feature enableAIFeature enabled - $Code$_map setVisibleIfTreeCollapsed ["_unit_0", true]$/Code$ + $Code$"AwareFormationSoft" enableAIFeature true$/Code$ undefined / undefined @@ -63653,133 +66092,118 @@ - Nothing + Nothing + - setWPPos + moveInAny - Set waypoint position + Moves unit to the first available seat in a vehicle. The order of priorities is the same order used in squad command when you order subordinates to get in vehicle to any position and is the same order used in Zeus when you drag units to a vehicle. Seat assignment seems to use the following priority logic: + driver ( moveInDriver ) - commander turret ( moveInCommander ) - gunner turret ( moveInGunner ) - remaining turrets ( moveInTurret ) - cargo ( moveInCargo ). + NOTE : This command will move player into the locked vehicle or seat just as well. - https://community.bistudio.com/wiki/setWPPos + https://community.bistudio.com/wiki/moveInAny - Array setWPPos Array + Object moveInAny Object - waypoint setWPPos pos + unit moveInAny vehicle - $Code$[_groupOne, 1] setWPPos markerPos "MarkerOne";$/Code$ + $Code$player moveInAny tank;$/Code$ - undefined / local + local / global - Nothing + Boolean + - setWaves + ctrlSetFontHeightSecondary - Changes the waves value smoothly during the given time (in seconds). A time of zero means there will be an immediate change. - NOTE : This command will have no effect (even though the value of waves changes) unless Manual Override option is selected in the editor in the Intel, which is normally off. + Sets the font size of the secondary text of given control. - https://community.bistudio.com/wiki/setWaves + https://community.bistudio.com/wiki/ctrlSetFontHeightSecondary - Number setWaves Number + Control ctrlSetFontHeightSecondary Number - time setWaves value + ctrl ctrlSetFontHeightSecondary value - $Code$180 setWaves.5;$/Code$ - - $Code$0 setWaves 1;$/Code$ + $Code$_control ctrlSetFontHeightSecondary 0.05;$/Code$ - undefined / local + undefined / undefined - Nothing + Nothing + - setWaypointBehaviour + getPlayerScores - Switches the unit behaviour when the waypoint becomes active. - Possible values are: - "UNCHANGED" - "CARELESS" - "SAFE" - "AWARE" - "COMBAT" - "STEALTH" - See the AIBehaviour page for details of the effect of this command on AI units. + In MP: returns the unit's table of scores (infantry kills, soft vehicle kills, armor kills, air kills, deaths, total score). In SP: empty array [] - https://community.bistudio.com/wiki/setWaypointBehaviour + https://community.bistudio.com/wiki/getPlayerScores - Array setWaypointBehaviour String + getPlayerScores Object - waypoint setWaypointBehaviour mode + getPlayerScores unitName - $Code$[_grp, 2] setWaypointBehaviour "AWARE";$/Code$ + $Code$getPlayerScores BIS_player1;$/Code$ - undefined / global + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - - (August 26, 2008) - Modes are case sensitive - "safe" won't work, while "SAFE" is ok. - Nothing + Array + - setWaypointCombatMode + configName - The group combat mode is switched when the waypoint becomes active. - Possible mode values are: - "NO CHANGE" (No change) - " BLUE " (Never fire) - " GREEN " (Hold fire - defend only) - " WHITE " (Hold fire, engage at will) - " YELLOW " (Fire at will) - " RED " (Fire at will, engage at will) + Returns name of config entry. - https://community.bistudio.com/wiki/setWaypointCombatMode + https://community.bistudio.com/wiki/configName - Array setWaypointCombatMode String + configName Config - waypoint setWaypointCombatMode mode + configName config - $Code$[_grp, 2] setWaypointCombatMode "RED";$/Code$ + $Code$_name = configName ( configFile "CfgVehicles"); + // Result is "CfgVehicles"$/Code$ undefined / undefined @@ -63787,89 +66211,129 @@ - Nothing + String + - setWaypointCompletionRadius + modParams - The completion radius allows units to call the waypoint completed once they are inside of the given circle. + Returns list of mod parameters according to given options, values are in same order as the given options. Available options: + "name" : String - name to be shown (Arma 3 instead of A3, etc.) + "picture" : String - picture shown in Mod Launcher + "logo" : String - logo to be shown in Main Menu + "logoOver" : String - logo to be shown in Main Menu when mouse is over + "logoSmall" : String - small version of logo, prepared for drawing small icons + "tooltip" : String - tooltip to be shown on mouse over + "tooltipOwned" : String - tooltip to be shown on mouse over the icon when DLC is owned by player + "action" : String - url to be triggered when mod button is clicked + "actionName" : String - what to put on Action Button + "overview" : String - overview text visible in expansion menu + "hidePicture" : Boolean - do not show mod picture icon in the main menu mod list + "hideName" : Boolean - do not show mod name in the main menu mod list + "defaultMod" : Boolean - default mods cannot be moved or disabled by Mod Launcher + "serverOnly" : Boolean - mod doesn't have to be installed on client in order to play on server with this mod running + "active" : Boolean - active mod (activated through command line or stored in profile by mod launcher) + NOTE that "active" does not actually tell you if a mod ( is running / pretends to be running ) - https://community.bistudio.com/wiki/setWaypointCompletionRadius + https://community.bistudio.com/wiki/modParams - Array setWaypointCompletionRadius Number + modParams Array - waypoint setWaypointCompletionRadius radius + modParams [modClass, options] - $Code$[grp, 2] setWaypointCompletionRadius 30;$/Code$ + $Code$_data = modParams ["Kart", ["name", "logo", "picture"]];$/Code$ undefined / undefined - (29 January 2010‎, 14:12) - The completion radius is currently important for units moving in the Combat mode. - With default completion radius = 0 the leader always finishes in the exact location of the waypoint. - By providing a completion radius you allow him to plan his road to a cover nearby instead. - This does not necessarily mean the waypoint is complete once they are inside of the circle. - The way it works now it is complete once unit is inside and does not think it would be reasonable to move any closer. + (April 24, 2017) + This command used to spam. rpt when queried mod didn't exist, making it little awkward to use for testing if mod is active. For example: + $Code$_superDuperModEnabled = modParams ["super_duper", ["active"]] param [0, false];$/Code$ + Since v1.69 the command would fail silently if mod doesn't exist. - Nothing + Array + - setWaypointDescription + playActionNow - Sets the description shown in the HUD while the waypoint is active. + When used on a person, a smooth transition to the given action will be initiated, but all previous playAction are discarded. + For Arma 3 actions see: playAction/actions. - https://community.bistudio.com/wiki/setWaypointDescription + https://community.bistudio.com/wiki/playActionNow - Array setWaypointDescription String + Object playActionNow String - waypoint setWaypointDescription text + soldier playActionNow action - $Code$[_grp, 2] setWaypointDescription "Move here.";$/Code$ + $Code$soldierOne playActionNow "SitDown";$/Code$ + + $Code$rabbitTwo playActionNow "WalkF";$/Code$ - undefined / undefined + local / global + (October 12, 2010) + Some other possible playactions: + "walkf" - walk forward + "walkb" - walk backwards + "walkr" - strafe right + "walkl" - strafe left + "grabdrag" - initiate First Aid dragging animation + "stopdrag" - stops First Aid dragging animation + "reloadMagazine" - reloads the current magazine + "gestureFreeze" - hand signal "Freeze" + "GestureGo" + "GestureCover" + "GestureAttack" + "GestureCeaseFire" + "GestureFollow" + "GestureUp" + "GestureAdvance" + "GesturePoint" + Note that playAction works regardless of stance (rifle up, down, crouched, prone). - Nothing + Nothing + - setWaypointForceBehaviour + ctrlParentControlsGroup - Forces the behavior of waypoint, disables AUTOCOMBAT. + Returns the parent control of a given child control - https://community.bistudio.com/wiki/setWaypointForceBehaviour + https://community.bistudio.com/wiki/ctrlParentControlsGroup - Waypoint setWaypointForceBehaviour Boolean + ctrlParentControlsGroup Control - waypoint setWaypointForceBehaviour state + ctrlParentControlsGroup ctrl - $Code$[grp, 2] setWaypointForceBehaviour true ;$/Code$ + $Code$_ctrlCombo = _ctrl controlsGroupCtrl 100;//Control + ctrlParentControlsGroup _ctrlCombo;//Parent control group (_ctrl)$/Code$ undefined / undefined @@ -63877,181 +66341,230 @@ - Nothing + Control + - setWaypointFormation + setMarkerColorLocal - Switches the group formation when the waypoint becomes active. - Possible values are: - "NO CHANGE" - "COLUMN" - "STAG COLUMN" - "WEDGE" - "ECH LEFT" - "ECH RIGHT" - "VEE" - "LINE" - "FILE" - "DIAMOND" + Sets marker color for the given marker locally. Marker color names and their corresponding RGBA values for Arma 3 could be found in here: CfgMarkerColors_Arma_3 - https://community.bistudio.com/wiki/setWaypointFormation + https://community.bistudio.com/wiki/setMarkerColorLocal - Array setWaypointFormation String + String setMarkerColorLocal String - waypoint setWaypointFormation formation + markerName setMarkerColorLocal color - $Code$[_grp, 2] setWaypointFormation "LINE";$/Code$ + $Code$"MarkerOne" setMarkerColorLocal "ColorBlack";$/Code$ - undefined / global + global / local - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - setWaypointHousePosition + side - For waypoints attached to a house, this defines the target house position. + Returns the side of a unit, vehicle, object or location. + a renegade soldier's side will return a sideEnemy + an empty vehicle will return civilian + a crewed vehicle will return, if present, commander's gunner's driver's or cargo's side, in this order + a captive or dead unit will return civilian. Use side group _unit to get the underlying side + you can use playerSide to know the real player's side + converting a side to string ( via str or format } will not return the side command: + east = "EAST" + west = "WEST" + resistance = "GUER" + civilian = "CIV" + sideUnknown = "UNKNOWN" + sideEnemy = "ENEMY" + sideFriendly = "FRIENDLY" + sideLogic = "LOGIC" + sideEmpty = "EMPTY" + sideAmbientLife = "AMBIENT LIFE" - https://community.bistudio.com/wiki/setWaypointHousePosition + https://community.bistudio.com/wiki/side - Array setWaypointHousePosition Number + side Object/Group/Location - waypoint setWaypointHousePosition pos + side object - $Code$[_grp, 2] setWaypointHousePosition 1;$/Code$ + $Code$if ( side player == west ) then { hint "Player is on the West side" };$/Code$ + + $Code$_sideAlsoWorkingForDead = side group player ;$/Code$ + + $Code$_sideLocation = side myLocation;$/Code$ + + $Code$if (side player != playerSide ) then { hint "player is renegade or dead"; };$/Code$ - undefined / undefined + global / undefined + In ArmA, the following objects are on side civilian : dead bodies and vehicles, empty vehicles, all mission editor placed objects (that do not have an inherit side), all objects with interactive components such as ladders and doors, man made structures such as buildings (including classless wrp placed objects), docks, high tension powerlines, see-saws, large rubbish bins, fountains. Basically if an object uses a non-simple damage or physics simulation it is likely to be on the civilian side. + NOTE: If you need to know the side of a dead body, you can use faction command as a workaround -- Killzone_Kid + + In OFP v1.96, the side return value for a vehicle is based on the side of its commander, then gunner, then driver, then cargo. It will retain its side value until it is either empty, or a unit of another side takes over in a equal or higher role, irrespective of the side of other units still on board. This can be used to simulate friendly fire, as a vehicle can be made to appear to be an enemy even though all units on board are actually friendly. + + As CEEB says above, in ArmA2, side for a vehicle often depends on who the command or driver is, for example, A KA52, piloted by a USMC guy will have side WEST. For an accurate result of what 'where the vehicle was made', use faction. This ignores the pilot/commander, so in my example here, this KA52 will always return faction "RU". Note that faction returns different values to side though. + February 4, 2011 + + Side values for ambient life (animals) are bizarre. side _unit returns "CIV", but playerSide returns "AMBIENT LIFE" when the player is an animal. In that case, playerSide == side player returns false! + Fortunately, you can easily check if a unit is an animal with _unit isKindOf "ANIMAL"' - Nothing + Side + - setWaypointLoiterRadius + camSetBank - Assignes loiter radius to waypoint + Sets camera bank angle. Does not commit changes. + This command is non-functional ! - https://community.bistudio.com/wiki/setWaypointLoiterRadius + https://community.bistudio.com/wiki/camSetBank - Waypoint setWaypointLoiterRadius Number + Object camSetBank Number - waypoint setWaypointLoiterRadius radius + camera camSetBank bank - $Code$[_grp, 2] setWaypointLoiterRadius 200;$/Code$ + $Code$_camera camSetBank -0.1$/Code$ undefined / undefined + (Apr 15, 2010) + Command is non-functional. Instead, use fn vbs setPitchBank in VBS2, or setVectorUp or this user function in Arma. - Nothing + Nothing + - setWaypointLoiterType + hintCadet - Sets the waypoint loiter type. + Shows a text hint only when in cadetMode. + The text can contain several lines. \n is used to indicate the end of a line. - https://community.bistudio.com/wiki/setWaypointLoiterType + https://community.bistudio.com/wiki/hintCadet - Waypoint setWaypointLoiterType String + hintCadet String - waypoint setWaypointLoiterType type + hintCadet text - $Code$[_grp, 2] setWaypointLoiterType "CIRCLE";$/Code$ - - $Code$[_grp, 2] setWaypointLoiterType "CIRCLE_L";$/Code$ + $Code$hintCadet "Press W to move forward";$/Code$ - undefined / undefined + undefined / local + hintCadet can be used with formatting like this: + $Code$ hintCadet format ["Hello %1", player ]$/Code$ - Nothing + Nothing + - setWaypointName + overcastForecast - Changes the waypoint name. + Return the overcast forecast. - https://community.bistudio.com/wiki/setWaypointName + https://community.bistudio.com/wiki/overcastForecast - Waypoint setWaypointName String + overcastForecast - waypoint setWaypointName name + overcastForecast - $Code$[_grp,2] setWaypointName "myName";$/Code$ - + undefined / undefined - Nothing + Number + - setWaypointPosition + parseSimpleArray - Moves the waypoint to a random position in a circle with the given center and radius. + Converts given, formatted as simple array, String into a valid Array. Simple array is array consisting of Numbers, Strings, Booleans and Arrays of all of the above. For example: [1,"2",true,[4,"five",false]]. The string representation of this array compatible with parseSimpleArray will be "[1,""2"",true,[4,""five"",false]]" accordingly. + This command is built for speed and security and because of this has several limitations. There is limited error reporting about format errors as the command expects well formatted array as argument. To be able to see exact format expected, you can just copy output result of str command applied to an array for reference: copyToClipboard str str [1,"2",true,[4,"five",false]] (notice the use of double str with copyToClipboard ). + In any case here are the explicit rules: + no spaces are permitted between array elements: [1,2,3] - correct, [1, 2, 3] - incorrect! + only double quotes " supported for Strings : ["hello"] - correct, ['hello'] - incorrect! + use " to escape ", for example ["hello"] converted to string should look like this: "[""hello""]" + no spaces should exist before or after array brackets: "[1,2,3]" - correct, "[1,2,3] " - incorrect! + To simplify, your constructed array format should be the same as Arma array converted to string with str : + $Code$_arr1 = getUnitLoadout player ; + _arr2 = parseSimpleArray str _arr1; + hint str (_arr1 isEqualTo _arr2); //true + $/Code$ + Because of this strictness the command is on average 3x faster than similar call compile string array method. And because call compile is not required, it is also more secure and primarily intended for use with callExtension to parse the String output into Array. - https://community.bistudio.com/wiki/setWaypointPosition + https://community.bistudio.com/wiki/parseSimpleArray - Array setWaypointPosition Array + parseSimpleArray String - waypoint setWaypointPosition [center, radius] + parseSimpleArray stringArray - $Code$[_grp, 2] setWaypointPosition [ position player, 0];$/Code$ + $Code$_arr = parseSimpleArray "[1,2,3]";$/Code$ + + $Code$_bool = true ; + _num = 123.45; + _str = "ok"; + _arr = [1,false,"cool"]; + _res = parseSimpleArray format ["[%1,%2,%3,%4]", _bool, _num, str _str, str _arr]; + // Note how _bool and _num do not need str, however if used anyway, the result in this case would be identical + hint str _res; // [true,123.45,"ok",[1,false,"cool"]]$/Code$ undefined / undefined @@ -64059,31 +66572,28 @@ - Nothing + Array + - setWaypointScript + vest - Attaches a script to a scripted waypoint. In early versions of Arma, command consisted of a script name and additional script arguments and the script had to use SQS -Syntax. The script receives the following arguments in _this variable: [group, position, target] + [the optional passed arguments]. The optional arguments are appended to the end of the return array. - In Arma 3, command argument can be a String with code, a reference to.sqf script (it will have to explicitly end with.sqf ) or a reference to.sqs script. - See Mission editor Description for more information about scripted waypoints. + Returns name of vest. - https://community.bistudio.com/wiki/setWaypointScript + https://community.bistudio.com/wiki/vest - Array setWaypointScript String + vest Object - waypoint setWaypointScript command + vest unit - $Code$[_grp, 2] setWaypointScript "find.sqs player ";$/Code$ - - $Code$[_grp, 2] setWaypointScript "somescript.sqf [1,2,3,4,5,6,7,8]";$/Code$ + $Code$_myVest = vest player;$/Code$ undefined / undefined @@ -64091,425 +66601,357 @@ - Nothing + String + - setWaypointSpeed + actionParams - Switches the group speed mode when the waypoint becomes active. - Possible values are: - "UNCHANGED" - "LIMITED" - "NORMAL" - "FULL" + Returns Array with params for given user action id (similar to addAction param array). The output array is of the following format: + [title, script, arguments, priority, showWindow, hideOnUse, shortcut, condition, radius, unconscious, textWindowBackground, textWindowForeground, selection], where: + title: String - action title text + script: String - script file or script expression assigned to the action + arguments: Anything or nil - arguments passed to the action + priority: Number - action priority on the action menu + showWindow: Boolean - whether the action is shown in the center of the screen too + hideOnUse: Boolean - whether the action menu should close after selecting the action + shortcut: String - action bindings to some existing engine action if any + condition: String - expression returning true or nil for action to appear on the action menu + radius: Number - max distance to entity at which action becomes available. -1 means it is engine default (~15m) + unconscious: Boolean - whether the action is available to unconscious person + textWindowBackground: String - same as textWindowBackground in setUserActionText + textWindowForeground: String - same as textWindowForeground in setUserActionText + selection: String - named selection in Geometry LOD to which the action is attached + New array element selection is available since Arma 3 v1.69.140846 - https://community.bistudio.com/wiki/setWaypointSpeed + https://community.bistudio.com/wiki/actionParams - Array setWaypointSpeed String + Object actionParams Number - waypoint setWaypointSpeed mode + entity actionParams id - $Code$[_grp, 2] setWaypointSpeed "FULL";$/Code$ + $Code$_params = player actionParams 0;$/Code$ - undefined / global + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Array/Nothing + - setWaypointStatements + enableEngineArtillery - The waypoint is done only when the condition is fulfilled. When the waypoint is done, the statement expression is executed. - Within the Condition & Statement code string: - this refers to the group leader - thisList refers to an array containing each unit in the group + Enable/disable the artillery engine. This allows the user to use the artillery computer on mortar/artillery, and for AI to use it for indirect fire. - https://community.bistudio.com/wiki/setWaypointStatements + https://community.bistudio.com/wiki/enableEngineArtillery - Array setWaypointStatements Array + enableEngineArtillery Boolean - waypoint setWaypointStatements [condition, statement] + enableEngineArtillery enabled - $Code$new_wp setWaypointStatements [" true ", " hint 'hello'; hint 'goodbye'"];$/Code$ - - $Code$new_wp setWaypointStatements [" true ", " diag_log ['GroupLeader: ', this ]; diag_log ['Units: ', thislist ]"];$/Code$ + $Code$enableEngineArtillery false;$/Code$ - undefined / undefined + undefined / local - (May 21, 2016) - Within the completion statement currentWaypoint will give the index of the waypoint being completed (as opposed to the following one). - This is particularly useful if you need a self deleting waypoint: $Code$ setWaypointStatements [" true "," deleteWaypoint [ group this, currentWaypoint ( group this)]"]$/Code$ - - (May 9, 2017) - The condition block carries the same rules as functions which return a value. The return value must be of type Boolean. I can bypass the use of triggers in this manner. - $Code$_wp setWaypointStatements [" code code code; _returnBool ", " onActivation block; "];$/Code$ - Nothing + Nothing + - setWaypointTimeout + setDebriefingText - Defines the time between condition satisfaction and waypoint finish (randomly from min to max, with an average value mid). + Sets debriefing text for endType defined in CfgDebriefing. + This command is broken. https://feedback.bistudio.com/T85682 - https://community.bistudio.com/wiki/setWaypointTimeout + https://community.bistudio.com/wiki/setDebriefingText - Array setWaypointTimeout Array + String setDebriefingText Array - waypoint setWaypointTimeout [min, mid, max] + endType setDebriefingText [title, description] - $Code$[_grp, 2] setWaypointTimeout [5, 10, 6];$/Code$ + $Code$_currentObjective = ( taskDescription ( currentTask player )) select 2; + "endDeath" setDebriefingText ["You Lose","All of your men were killed while assaulting the " + _currentObjective];$/Code$ undefined / undefined - (00:32, 12 December 2010) - The example doesn't seem to make sense, according to the listed syntax. It seems to set a Max time greater than the Mid time. - - (03:30, 12 December 2010) - If mid is greater than max, the result will be really near the mid value. - Results with the values of the example: 8.237, 9.383, 10.425, 9.417, 9.43401, 10.425, 9.90601, 9.96701, 9.42401, 9.42502, 9.96698, 9.89999... - Nothing + Nothing + - setWaypointType + waypointVisible - Changes the waypoint type. - Type can be: - "MOVE" - "DESTROY" - "GETIN" - "SAD" - "JOIN" - "LEADER" - "GETOUT" - "CYCLE" - "LOAD" - "UNLOAD" - "TR UNLOAD" - "HOLD" - "SENTRY" - "GUARD" (for use with GUARDED BY trigger or createGuardedPoint ) - "TALK" - "SCRIPTED" - "SUPPORT" - "GETIN NEAREST" - "DISMISS" - "LOITER" (new in Arma 3) - "AND" (only for game logics) - "OR" (only for game logics) - More details at Waypoint types. + Returns the visibility of the waypoint. + Returns 0 ( Number ) for a non valid waypoint. - https://community.bistudio.com/wiki/setWaypointType + https://community.bistudio.com/wiki/waypointVisible - Array setWaypointType String + waypointVisible Array - waypoint setWaypointType type + waypointVisible waypoint - $Code$[_grp, 2] setWaypointType "HOLD";$/Code$ + $Code$_visible = waypointVisible [groupOne, 1];$/Code$ + + $Code$_visible = waypointVisible [group player, currentWayPoint (group player)];$/Code$ undefined / undefined - (07:44, 23 November 2007) - For waypoint types description look at - ArmA: Mission_Editor - OFP: Mission_Editor - Using Move With a game logic group will move the logic to the set location just like setpos. In the editor only AND and OR type of waypoints are available for GAME LOGICS but you can use CYCLE type as well in setWaypointType. - $Code$_wp = group logic1 addWaypoint [ getPos player, 1]; - [ group logic1, 1] setWPPos getPos player ; - [ group logic1, 1] setWaypointType "move";$/Code$ - - (23:07, 18 October 2013 (CEST)) - To clear up any confusion regarding the syntax, follow this example where grp01 is the name of a group of AI units: - $Code$_wp = grp01 addWaypoint [[25295,21919,85], 0]; - _wp setWaypointType "MOVE"; - _wp1 = grp01 addWaypoint [[25381,21882,70], 0]; - _wp1 setWaypointType "MOVE"; - _wp2 = grp01 addWaypoint [[ 25332,21782,78], 0]; - _wp2 setWaypointType "CYCLE"; //Use the variable (_wp2), not [grp01, 0]$/Code$ - - (December 22, 2015) - To spawn a helicopter with troops inside and make them land and unload. - - (May 6, 2017) - To use the LAND function in a waypoint, you must set "A3\functions_f\waypoints\fn_wpLand.sqf" as the script for that waypoint. - - (May 30, 2017) - In ArmA3 1.70.141838, if you add a MOVE waypoint very soon after a LOITER waypoint, ( assuming that the index of the MOVE waypoint is HIGHER than the index of the LOITER waypoint ) - then the LOITER waypoint will be considered as a MOVE waypoint. - And, if you add another waypoint after ( for example ) more than 1 second after adding the LOITER waypoint, - then the LOITER waypoint will NOT complete even when its condition has been met. - There are two ways to quit an existing LOITER waypoint that was added more than about 1 second ago; use the setCurrentWaypoint command OR add a waypoint that has the same ID as the LOITER waypoint. - The difference between those two methods is that the lather prevents the LOITER waypoint from executing its statement. - Nothing + Boolean + - setWaypointVisible + setSuppression - Sets the visibility of the waypoint. + Sets the person's suppression, from 0 to 1. - https://community.bistudio.com/wiki/setWaypointVisible + https://community.bistudio.com/wiki/setSuppression - Array setWaypointVisible Boolean + Object setSuppression Number - waypoint setWaypointVisible visible + unit setSuppression value - $Code$[grp, 2] setWaypointVisible false ;$/Code$ - - $Code$[ group player, currentWaypoint ( group player )] setWaypointVisible false ;$/Code$ + $Code$AI_unit_1 setSuppression 1;$/Code$ - undefined / global + undefined / undefined - (September 23, 2015) - This does not apply to Zeus/Curator view... so this command won't hide the Waypoint lines and icons from your view as a Zeus when units are in your EditableAddons list. - Nothing + Nothing + - setWeaponReloadingTime + aimPos - Sets states and/or makes an action of/on weapon. Reload time is between 0 and 1 inclusive, where 1 is 100% of maximum reloading time. + Returns the position of the object other units can aim to. - https://community.bistudio.com/wiki/setWeaponReloadingTime + https://community.bistudio.com/wiki/aimPos - Object setWeaponReloadingTime Array + aimPos Object - vehicle setWeaponReloadingTime [gunner, muzzleName, reloadTime] + aimPos object - $Code$_done = _vehicle setWeaponReloadingTime [ gunner ( vehicle player ), currentMuzzle ( gunner ( vehicle player )), 0.5];$/Code$ + $Code$aimPos player$/Code$ - undefined / undefined + global / undefined - (January 15, 2012) - The description is confusing to me. What the command essential does is to set the reloading state/time of the given weapon. For example you can fire a missile, and make the weapon available to fire again instantly if you apply 0. - Or you can delay or stop the reload event indefinitely. The 0-1 range is a percentage - the reload time is taken from the weapons's config value (either reloadTime or magazineReloadTime - not sure). The effect is one time only each - it does not modify the weapon's general reload time. - Works also for infantry weapons - probably useful weapons with longer reload time like sniper weapons or launchers: - player setWeaponReloadingTime [player,currentWeapon player,0]; - No idea what's point of the return value. - - (May 14, 2017) - Note that setWeaponReloadingTime is only having effect on a current weapon state (loaded projectile) so since the projectile is fired the next one will be reverted to a weapon config defaults. To keep the fire rate speed changed over time, use this code: - $Code$player addEventHandler ["FiredMan",{ - params ["","_weapon","_muzzle"]; - private _type = _weapon call BIS_fnc_itemType; - private _time = -1; - switch (_type select 1) do { - case 'SniperRifle' : {_time = 0.5}; - case 'AssaultRifle' : {}; - case 'Handgun' : {}; - case 'Rifle' : {}; - case 'SubmachineGun' : {}; - case 'MachineGun' : {}; - case 'Mortar' : {}; - case 'GrenadeLauncher' : {}; - case 'BombLauncher' : {}; - case 'MissileLauncher' : {}; - case 'RocketLauncher' : {}; - case 'Cannon' : {}; - case 'Throw' : {}; - }; - if (_time isEqualTo -1) exitWith {}; - (vehicle player) setWeaponReloadingTime [(vehicle player), _muzzle, _time]; - }]; - $/Code$ - This Event Handler makes the gun of specific type shoot at a desired rate on each weapon state (sniper rifle will shoot 50% faster in this example). For more information about weapon kinds are there, visit BIS_fnc_itemType. + (July 7, 2015) + Generally returns the center position of the object (middle of the geometry, not the model's [0,0,0]). - Boolean + Array + - setWindDir + removeWeaponGlobal - Changes the wind direction smoothly during the given time (in seconds). A time of zero means there will be an immediate change. - NOTE : Effect is global only when executed on the server. On clients wind direction will sync to server value in a while. + Remove a weapon from a unit. An attempt to remove a weapon, which is not in unit's possession, is simply ignored. - https://community.bistudio.com/wiki/setWindDir + https://community.bistudio.com/wiki/removeWeaponGlobal - Number setWindDir Number + Object removeWeaponGlobal String - time setWindDir value + unit removeWeaponGlobal weapon - $Code$60 setWindDir 180$/Code$ + $Code${ + _x removeWeaponGlobal "Laserdesignator"; + } forEach allUnits ;$/Code$ + + $Code${ + if ( typeOf _x == "O_Heli_Attack_02_black_F") then { + _x removeWeaponGlobal "rockets_Skyfire"; + }; + } forEach vehicles ;$/Code$ - undefined / global + global / global - (April 12, 2014) - Seems to make wind [0,0] in MP. (ArmA 3 1.00) - Nothing + Nothing + - setWindForce + removeMagazinesTurret - Set max. wind overall wind changes in time. A time of zero means there will be an immediate change. A wind level of zero is minimal changes and a wind level of one means that wind can change rapidly. + Removes all magazines of the given type from given vehicle. Use turret path [-1] for driver's turret. - https://community.bistudio.com/wiki/setWindForce + https://community.bistudio.com/wiki/removeMagazinesTurret - Number setWindForce Number + Object removeMagazinesTurret Array - time setWindForce wind + vehicle removeMagazinesTurret [magazineName, turretPath] - $Code$1800 setWindForce 0.5$/Code$ + $Code$vehicle player removeMagazinesTurret ["60rnd_cmflaremagazine",[-1]]$/Code$ + + $Code$_tank removeMagazinesTurret ["20Rnd_120mmSABOT_M1A2",[0]]$/Code$ - undefined / undefined + local / global + (July 30, 2011) + Here's how you would remove all machine gun ammo from an M1A2 TUSK: + remove the gunner's M240 ammo. + $Code$this removeMagazinesTurret ["1200Rnd_762x51_M240",[0]];$/Code$ + remove the commander's M2 ammo. + $Code$this removeMagazinesTurret ["100Rnd_127x99_M2",[0,0]];$/Code$ + remove the loader's M240 ammo. + $Code$this removeMagazinesTurret ["100Rnd_762x51_M240",[0,1]];$/Code$ - Nothing + Nothing + - setWindStr + addCuratorEditingArea - Changes the wind strength smoothly during the given time (in seconds). A time of zero means there will be an immediate change. + Adds or changes curator edit area (depends on if ID is already used). - https://community.bistudio.com/wiki/setWindStr + https://community.bistudio.com/wiki/addCuratorEditingArea - Number setWindStr Number + Object addCuratorEditingArea Array - time setWindStr value + curatorObj addCuratorEditingArea [editAreaID,position,radius] - + $Code$myCurator addCuratorEditingArea [4, position player,1000];$/Code$ + undefined / undefined - Nothing + Nothing + - setWind + pixelGrid - Set current (forced == false) or permanent (forced == true) wind vector. - NOTE : The effect is global only if command is executed on the server. Wind set locally will sync back to server value in a while. + Returns grid size based on screen resolution, UI size and configs: uiScaleFactor, uiScaleMaxGrids. - https://community.bistudio.com/wiki/setWind + https://community.bistudio.com/wiki/pixelGrid - setWind Array + pixelGrid - setWind [x, y, forced] + pixelGrid - $Code$setWind [10, 10, true];$/Code$ + $Code$_gridHeight = pixelH * pixelGrid ;$/Code$ - undefined / global + undefined / undefined - Nothing + Number + - show3DIcons + loadOverlay - Toggle the drawing of 3D icons. + Creates the load overlay dialog for the specified type of overlay. i Some Old Editor Command - https://community.bistudio.com/wiki/show3DIcons + https://community.bistudio.com/wiki/loadOverlay - Control show3DIcons Boolean + Control loadOverlay Config - map show3DIcons bool + map loadOverlay config @@ -64519,442 +66961,362 @@ - Nothing + Nothing + - showChat + ln - Shows/hides the whole chat window. + Natural logarithm of x. - https://community.bistudio.com/wiki/showChat + https://community.bistudio.com/wiki/ln - showChat Boolean + ln Number - showChat bool + ln x - $Code$showChat false ;$/Code$ + $Code$_nlog = ln 10 + // Result is 2.302$/Code$ - undefined / local + undefined / undefined - Nothing + Number + - showCinemaBorder + addVehicle - Forces drawing of cinema borders when using custom camera camCreate. This is normally used in cutscenes to indicate player has no control. + Adds a specified vehicle for use by a specified AI led group taking into account vehicle's cost. The vehicle will be considered as an available vehicle for use by this group. + When vehicle is added in this way, it can appear as a target for the enemy even if the vehicle is currently free of the crew. Vehicles with crew, which are placed in the editor, get automatically added to the group. To remove vehicle from a group, use leaveVehicle. - https://community.bistudio.com/wiki/showCinemaBorder + https://community.bistudio.com/wiki/addVehicle - showCinemaBorder Boolean + Group addVehicle Object - showCinemaBorder show + groupName addVehicle vehicleName - $Code$showCinemaBorder false ;$/Code$ + $Code$_grp addVehicle _vehicle$/Code$ + + $Code$// Using on crewed vehicle: + group tank addVehicle tank;$/Code$ - undefined / undefined + local / undefined - (13 October 2007) - This command does only work when Mission is started. Use waitUntil { time 0}; to be sure it works. + (22 Nov, 2008 00:40) + This command works best when used on empty vehicles. If used on a vehicle already driven by a member of another group, the driver will continue under his own group's orders, which may not benefit the addVehicle group. + More than one vehicle can be added to a group, and more than one group can be added to a vehicle. + When deciding whether to board a vehicle, AI leaders seem to only consider the transport benefit of a vehicle, ignoring any combat benefits the vehicle may provide. - Nothing + Nothing + - showCommandingMenu + menuPicture - Create the commanding menu described by the given config class or menu name. When the name is empty, the current menu is hidden. - If commanding menu has "expression" set up, the expression will receive the following arguments when user activated the menu item: - Local variable _target : Object - Target under the cursor. This works in both 3D and 2D (when cursor is over the unit icon on the map). - Local variable _pos : Array - Cursor position. - Local variable _is3D : Boolean - false if cursor is over the map, otherwise true. + Returns picture set into item on given path - https://community.bistudio.com/wiki/showCommandingMenu + https://community.bistudio.com/wiki/menuPicture - showCommandingMenu String + menuPicture Array - showCommandingMenu name + menuPicture [idc, path] - $Code$showCommandingMenu "";$/Code$ - - $Code$showCommandingMenu "MyClassName";$/Code$ - - $Code$showCommandingMenu "#USER:Tag_Menu_myMenu_0";$/Code$ - - $Code$showCommandingMenu "RscMainMenu";$/Code$ - + undefined / undefined - (July 22nd, 2012) - //This script will create a custom menu, and display it once. - MY_SUBMENU_inCommunication = - [ - ["User submenu",true], - ["Option-1", [2], "", -5, [["expression", "player sidechat ""-1"" "]], "0", "0", "\ca\ui\data\cursor_support_ca"], - ["Option 0", [3], "", -5, [["expression", "player sidechat "" 0"" "]], "1", "0", "\ca\ui\data\cursor_support_ca"], - ["Option 1", [4], "", -5, [["expression", "player sidechat "" 1"" "]], "1", "CursorOnGround", "\ca\ui\data\cursor_support_ca"] - ]; - MY_MENU_inCommunication = - [ - // First array: "User menu" This will be displayed under the menu, bool value: has Input Focus or not. - // Note that as to version Arma2 1.05, if the bool value set to false, Custom Icons will not be displayed. - ["User menu",false], - // Syntax and semantics for following array elements: - // ["Title_in_menu", [assigned_key], "Submenu_name", CMD, [["expression",script-string]], "isVisible", "isActive", optional icon path ] - // Title_in_menu: string that will be displayed for the player - // Assigned_key: 0 - no key, 1 - escape key, 2 - key-1, 3 - key-2,..., 10 - key-9, 11 - key-0, 12 and up... the whole keyboard - // Submenu_name: User menu name string (eg "#USER:MY_SUBMENU_NAME" ), "" for script to execute. - // CMD: (for main menu:) CMD_SEPARATOR -1; CMD_NOTHING -2; CMD_HIDE_MENU -3; CMD_BACK -4; (for custom menu:) CMD_EXECUTE -5 - // script-string: command to be executed on activation. (no arguments passed) - // isVisible - Boolean 1 or 0 for yes or no, - or optional argument string, eg: "CursorOnGround" - // isActive - Boolean 1 or 0 for yes or no - if item is not active, it appears gray. - // optional icon path: The path to the texture of the cursor, that should be used on this menuitem. - ["First", [0], "", -5, [["expression", "player sidechat ""First"" "]], "1", "1"], - ["Second", [2], "", -5, [["expression", "player sidechat ""Second"" "]], "1", "1"], - ["Submenu", [3], "#USER:MY_SUBMENU_inCommunication", -5, [["expression", "player sidechat ""Submenu"" "]], "1", "1"] - ]; - showCommandingMenu "#USER:MY_MENU_inCommunication"; - // Appendix, list of optional argument strings - HasRadio - CanAnswer - IsLeader - IsAlone - IsAloneInVehicle - IsCommander - VehicleCommander - CommandsToGunner - CommandsToPilot - NotEmpty - NotEmptySoldiers - NotEmptyCommanders - NotEmptyMainTeam - NotEmptyRedTeam - NotEmptyGreenTeam - NotEmptyBlueTeam - NotEmptyYellowTeam - NotEmptySubgroups - NotEmptyInVehicle - SelectedTeam - SelectedUnit - FuelLow - AmmoLow - Injured - Multiplayer - AreActions - CursorOnGroupMember - CursorOnHoldingFire - CursorOnEmptyVehicle - CursorOnVehicleCanGetIn - CursorOnFriendly - CursorOnEnemy - CursorOnGround - CanSelectUnitFromBar - CanDeselectUnitFromBar - CanSelectVehicleFromBar - CanDeselectVehicleFromBar - CanSelectTeamFromBar - CanDeselectTeamFromBar - FormationLine - FormationDiamond - SomeSelectedHoldingFire - PlayableLeader - PlayableSelected - IsWatchCommanded - IsSelectedToAdd - HCIsLeader - HCCursorOnIcon - HCCursorOnIconSelectable - HCCanSelectUnitFromBar - HCCanDeselectUnitFromBar - HCCanSelectTeamFromBar - HCCanDeselectTeamFromBar - HCNotEmpty - PlayerVehicleCanGetIn - IsXbox - IsTeamSwitch - CursorOnNotEmptySubgroups - SomeSelectedHaveTarget - CursorOnGroupMemberSelected - HCCursorOnIconSelectableSelected - HCCursorOnIconenemy - PlayerOwnRadio - CursorOnNeedFirstAID - CursorOnNeedHeal - - (July 23, 2016) - You can combine the argument strings (see the above note) together to create OR conditions. - Hence $Code$"HasRadioIsLeader"$/Code$ is true when the unit is a leader or has a radio. - Nothing + String + - showCompass + setCustomAimCoef - Shows or hides the compass on the map screen, if enabled for the mission and you possess the item. (default true ) + Set custom aim precision coefficient for weapon sway - https://community.bistudio.com/wiki/showCompass + https://community.bistudio.com/wiki/setCustomAimCoef - showCompass Boolean + Object setCustomAimCoef Number - showCompass show + unit setCustomAimCoef coef - $Code$showCompass false ;$/Code$ + $Code$player setCustomAimCoef 1;$/Code$ undefined / undefined - (16 Aug, 2009) - In Arma 2, the Compass is now an inventory item. Class path is CfgWeapons- ItemCompass. Use the commands addWeapon and removeWeapon to add or remove it from a unit's inventory. (example: player addweapon "ItemCompass") - Nothing + Nothing + - showCuratorCompass + while - Hides or shows compass in curator interface. + Repeats Code while condition is true. A part of while do construct. - https://community.bistudio.com/wiki/showCuratorCompass + https://community.bistudio.com/wiki/while - showCuratorCompass Boolean + while Code - showCuratorCompass bool + while condition - $Code$showCuratorCompass true;$/Code$ + $Code$while {a b} do {a = a + 1};$/Code$ + + $Code$// A practical example: Repair all members of a group to such a level that they are able to stand up: + { + while {! canStand _x && alive _x } do { + _x setDamage ( damage _x - 0.01); + }; + } forEach units group unitname;$/Code$ undefined / undefined + (May 14, 2008) + The boolean code that's used to evaluate the while condition can be preceded by code that executes a regular command. + $Code$ while {_a =_a + 1; _a 10} do {...}$/Code$ + + (August 30, 2014) + In non-scheduled environment, while do loop is limited to 10,000 iterations, after which it exits even if condition is still true. In scheduled environment no such limit exists. - Nothing + While_Type + - showGPS + setUserActionText - Shows or hides the GPS receiver on the map screen, if enabled for the mission and you possess the item. (default false ) + Changes user added action (see addAction ) menu item text. + Since Arma 3 v1.61.136587 it is possible to set 2 more optional texts, one for background and one for foreground when action is displayed on the screen ( showWindow = true ) - https://community.bistudio.com/wiki/showGPS + https://community.bistudio.com/wiki/setUserActionText - showGPS Boolean + Object setUserActionText Array - showGPS show + object setUserActionText [actionIndex, textMenu, textWindowBackground, textWindowForeground] - $Code$showGPS true ;$/Code$ + $Code$_id = player addAction ["Hello", ""]; + player setUserActionText [_id, "Good Bye"];$/Code$ + + $Code$_id = billboard addAction ["Some Action", {}]; + billboard setUserActionText [ + _id, + "Some Action", + " t color='#ff0000' Background----------------- /t br/ Multiline br/ Multiline br/ Multiline br/...", + " t color='#00ff00' -----------------Foreground /t " + ];$/Code$ - undefined / undefined + global / local - (16 Aug, 2009) - In Arma 2, the GPS is now an inventory item. Class path is CfgWeapons- ItemGPS. Use the commands addWeapon and removeWeapon to add or remove it from a unit's inventory. (example: player addweapon "ItemGPS") - - (14 Jun, 2010) - In Arma 2 GPS is also an item, so will not be removed by removeAllWeapons, even though it can be removed by removeWeapon and added by addWeapon. To remove all items use the removeAllItems command (though this will also remove basic items such as map and compass). - Nothing + Nothing + - showHUD + waypointAttachedObject - Enable / disable showing of HUD. Defines visibility of weapon crosshair and any informational tags that appear when pointing the weapon at an object as well as availability of the default action menu. Unfortunately, it also hides icons drawn with drawIcon3D. - Appearance of HUD can also be controlled with showHUD param in description.ext. NOTE: As of Arma 3 v1.49.131879 there is a showHUD[] array param, that is identical in format to the extended showHUD command. When showHUD[] array param is present in description.ext, it will disable showHUD command entirely, allowing mission makers to permanently alter visibility of some HUD elements. + Gets the object attached to the waypoint. - https://community.bistudio.com/wiki/showHUD + https://community.bistudio.com/wiki/waypointAttachedObject - showHUD Boolean - - showHUD Array + waypointAttachedObject Array - showHUD enable - - showHUD [hud, info, radar, compass, direction, menu, group, cursors, panels] + waypointAttachedObject waypoint - $Code$showHUD false ;$/Code$ - - $Code$// Hide vehicle radar and compass: - showHUD [ true, true, false, false, true, true, true, true ];$/Code$ - - $Code$// Check if HUD visibility is hardcoded in mission config and showHUD command is overriden: - _disabledShowHUD = isArray ( missionConfigFile "showHUD");$/Code$ + $Code$waypointAttachedObject [groupOne,1]$/Code$ - undefined / local + undefined / undefined - (August 17, 2015) - Last param, "cursors" controls visibility of the action menu as well as weapon cursors. However if 1st param "hud" hides and disables action menu, last param "cursors" only hides it. So you get invisible action menu that is fully operational. inGameUISetEventHandler will still fire on interaction, giving the information about selected item on the action menu even if you cannot see it. Unfortunately it also hides icons drawn with drawIcon3D. - Nothing - Nothing + Object + - showLegend + cameraEffectEnableHUD - Show/hide map legend. - i - Some Old Editor Command + Enable / disable showing of in-game UI during currently active camera effect. - https://community.bistudio.com/wiki/showLegend + https://community.bistudio.com/wiki/cameraEffectEnableHUD - Control showLegend Boolean + cameraEffectEnableHUD Boolean - map showLegend bool + cameraEffectEnableHUD enable - + $Code$cameraEffectEnableHUD true ;$/Code$ + undefined / undefined + (November 3, 2015) + Must be executed after camCommit. - Nothing + Nothing + - showMap + currentTask - Enable Map (default true ) + Return current task of given person. - https://community.bistudio.com/wiki/showMap + https://community.bistudio.com/wiki/currentTask - showMap Boolean + currentTask Object - showMap show + currentTask person - $Code$showMap false$/Code$ - + undefined / undefined - In ArmA 2 - This command no longer works. The map is now an inventory item. It is kept under the weapon class name "itemmap". - Example: $Code$unitname removeweapon "itemmap"$/Code$ To add again use $Code$unitname addweapon "itemmap"$/Code$. - Nothing + Task + - showNewEditorObject + getStatValue - Show the add editor object dialog,type is editor object type,class is,class definition to automatically select,side filters by a certain,side,pos is position to create the object. - i - Some Old Editor Command + Returns value of the given stat. - https://community.bistudio.com/wiki/showNewEditorObject + https://community.bistudio.com/wiki/getStatValue - Control showNewEditorObject Array + getStatValue String - map showNewEditorObject [type,class,side,position] + getStatValue name - + $Code$getStatValue "ExpWarlockDown"; //Checks if the "Warlock Down" Achivement was already aquired$/Code$ + undefined / undefined - Any_Value + Number + - showPad + ppEffectEnable - Shows or hides the notebook on the map screen, if enabled for the mission. (default true ). It is no longer relevant to Arma 2. + Enable / disable Post process effects - https://community.bistudio.com/wiki/showPad + https://community.bistudio.com/wiki/ppEffectEnable - showPad Boolean + String ppEffectEnable Boolean + + Number ppEffectEnable Boolean + + Array ppEffectEnable Boolean - showPad show + effect ppEffectEnable enable + + effect ppEffectEnable enable + + [effect1,] ppEffectEnable enable - $Code$showPad false$/Code$ + $Code$"colorCorrections" ppEffectEnable true ;$/Code$ + + $Code$_hndl ppEffectEnable true ;$/Code$ + + $Code$[_hndl1, _hndl2] ppEffectEnable true ;$/Code$ undefined / undefined @@ -64962,85 +67324,93 @@ - Nothing + Nothing - Nothing - Nothing + - showRadio + locked - Shows or hides the radio on the map screen, if enabled for the mission and you possess the item. (default true ) + Check if vehicle is locked for Persons. If it is locked, Persons cannot mount / dismount without order. - https://community.bistudio.com/wiki/showRadio + https://community.bistudio.com/wiki/locked - showRadio Boolean + locked Object - showRadio show + locked vehicle - $Code$showRadio false$/Code$ + $Code$_locked = locked _jeepOne;$/Code$ - undefined / undefined + global / undefined - (16 Aug, 2009) - In Arma 2, the radio is now an item in ArmA 2. Class path is CfgWeapons- ItemRadio. Use the command addWeapon and removeWeapon to remove it from a unit's inventory. (example: player removeweapon "ItemRadio") + (March 4, 2013) + From Arma 3 version 0.50 is return value Number : + -1 - Object is null + 0 - Unlocked + 1 - Default + 2 - Locked + 3 - Locked for player - Nothing + Number + - showScoretable + setHideBehind - Forces the score table to be shown, hidden or reset to default functionality. Forcing score table will make it show even in SP. When score table is forced opened it cannot be closed manually, when it is force closed, it cannot be opened manually. + Sets the data for hiding. objectWhereHide can be taken using findCover. hidePosition can be taken using getHideFrom. Command is not functional in ArmA 2. + This command is not implemented - https://community.bistudio.com/wiki/showScoretable + https://community.bistudio.com/wiki/setHideBehind - showScoretable Number + Object setHideBehind Array - showScoretable force + object setHideBehind [objectWhereHide, hidePosition] - $Code$showScoretable 1;$/Code$ - + undefined / undefined - Nothing + Nothing + - showSubtitles + get3DENMouseOver - Enables / disables showing of subtitles in a chat. Only scripted/engine chatter is affected, player manual chat is unaffected. Returns the previous state. + Returns the Eden Entity the mouse is hovering over in Eden Editor. - https://community.bistudio.com/wiki/showSubtitles + https://community.bistudio.com/wiki/get3DENMouseOver - showSubtitles Boolean + get3DENMouseOver - showSubtitles enable + get3DENMouseOver - $Code$showSubtitles false;$/Code$ + $Code$systemChat str get3DENMouseOver ;// returns: ["Object",B Alpha 1-1:1]$/Code$ undefined / undefined @@ -65048,115 +67418,220 @@ - Boolean + Array + - showUAVFeed + createVehicle - Shows/hides video feed transmitted from UAV. When enabled, the video is streamed to following texture - "#(argb,512,512,1)r2t(uavpipsingleview,1.25)" - in the feed window. The feed window IGUI display idd is 315. The actual feed control idc is 102. - $Code$_UAVFeedDisplay = uiNamespace getVariable "RscAvCamera";$/Code$ + Creates an empty object of given classname type (See Arma 3 Assets or createVehicle/vehicles ) + For a class reference from older games see Classes. + Some special 'Scripted' vehicle classes: + DemoCharge_Remote_Ammo_Scripted - same as DemoCharge_Remote_Ammo but will explode when destroyed or setDamage 1; + SatchelCharge_Remote_Ammo_Scripted - same as SatchelCharge_Remote_Ammo but will explode when destroyed or setDamage 1; + ClaymoreDirectionalMine_Remote_Ammo_Scripted - same as ClaymoreDirectionalMine_Remote_Ammo but will explode when destroyed or setDamage 1; + GroundWeaponHolder_Scripted - same as GroundWeaponHolder but will not be auto-deleted when empty + WeaponHolderSimulated_Scripted - same as WeaponHolderSimulated but will not be auto-deleted when empty + Randomization: + In Arma 3 many vehicles will get randomized in appearance by default in order to add some variety to the game. It is possible to override this default behavior by setting BIS_enableRandomization variable to false in the vehicle namespace: + $Code$_veh = "C_Offroad_01_F" createVehicle position player ; + [_veh, true, true, true ] call bis_fnc_initVehicle;$/Code$ + or + $Code$[this, true, true, true ] call bis_fnc_initVehicle;$/Code$ + if done in mission editor init field. + Check Vehicle Customization (VhC) page for more info about the parameters. - https://community.bistudio.com/wiki/showUAVFeed + https://community.bistudio.com/wiki/createVehicle - showUAVFeed Boolean + String createVehicle Position + + createVehicle Array - showUAVFeed show + type createVehicle position + + createVehicle [type, position, markers, placement, special] - $Code$showUAVFeed true ;$/Code$ + $Code$_jeep = "Jeep" createVehicle position player ;$/Code$ + + $Code$_heli = "AH1Z" createVehicle getMarkerPos "hspawn";$/Code$ + + $Code$_veh = createVehicle ["ah1w", position player, [], 0, "FLY"];$/Code$ + + $Code$_veh = createVehicle ["2S6M_Tunguska", getMarkerPos "marker1", ["marker2","marker3"], 0, "NONE"];$/Code$ + + $Code$// Objects such as + //test_EmptyObjectForBubbles + //test_EmptyObjectForFireBig + //test_EmptyObjectForSmoke + //create additional emitters, which are stored in "effects" variable on the object. Since Arma 3 v1.71 these emitters are automatically deleted when object is deleted + [] spawn + { + _fire = "test_EmptyObjectForFireBig" createVehicle position player ; + sleep 5; + deleteVehicle _fire; + };$/Code$ + + $Code$// The following explosives (with ending _Scripted) + //DemoCharge_Remote_Ammo_Scripted + //SatchelCharge_Remote_Ammo_Scripted + //ClaymoreDirectionalMine_Remote_Ammo_Scripted + //can be set off by applying setDamage 1 to them for ease of scripting: + _claymore = "ClaymoreDirectionalMine_Remote_Ammo_Scripted" createVehicle position player ; + 0 = _claymore spawn + { + uiSleep 5; + _this setDamage 1; + };$/Code$ + + $Code$// How to add inventory to objects without inventory: + _boxes = "Land_Pallet_MilBoxes_F" createVehicle position player ; + _cargo = "Supply500" createVehicle [0,0,0]; + _cargo attachTo [_boxes, [0,0,0.85]]; + // optional for objects that can take damage + _boxes addEventHandler ["Killed", + { + { + detach _x, + deleteVehicle _x; + } + forEach attachedObjects (_this select 0); + }];$/Code$ + + $Code$// Drop weapon: + _wh = "GroundWeaponHolder_Scripted" createVehicle position player ; + player action ["DropWeapon", _wh, currentWeapon player ];$/Code$ - undefined / undefined + undefined / global + (August 13, 2006) + Using main syntax of this command sets the created vehicle not exactly at the given position, you have to setPos it there, if accuracy counts. + + (Jan 20, 2006) + Using main syntax of this command sets the created vehicle in the nearest possible position. You can create a dozen of tanks with it - they will appear side by side. + + (December 13, 2006) + Observe that buildings with the default destrType will not work correctly in multiplayer in Armed Assault when created with this command. The Destruction effect will only be displayed where the building is local. + + (Oct 18, 2009) + As of Arma2, this command cannot be used to create game logics (source). Use createUnit instead. + + (January 14, 2011) + In multiplayer, only run this command on one machine. It will create a the vehicle on all machines every time it is called on any machine. + + (January 26 2014) + Using getPosATL should work, if otherwise you are struggling to get a the proper position coordinates. + + (September 12, 2014) + "vehclass" createVehicle pos is the same if not faster than createVehicle ["vehclass", pos, [], 0, "NONE"] + + (August 22, 2015) + GroundWeaponHolder class is automatically deleted when empty after 0.5 to 1 seconds in A3 1.48. The exact delay is random but never lower than 0.50 secs after creation. You can stop deletion by adding something (cargo) to it within 0.5 seconds. + + (December 1, 2015) + The short syntax creates vehicles at ground level ignoring the Z in pos + $Code$"vehclass" createVehicle pos$/Code$ This is equivalent to $Code$createVehicle ["vehclass", [pos select 0, pos select 1, 0], [], 0, "NONE"]$/Code$ + + (May 16, 2017) + For the alternative syntax, if the vehicle has canFloat = 1; in its config class (e.g. boats and wheeled APCs), the command expects PositionAGL, and otherwise always PositionATL. - Boolean + Object - Object + - showWarrant + setVehicleTIPars - Enable ID card (default false ). Obsolete command. + Sets the "heat" state of different vehicle parts (for TI detection). This allows simulation of heated up parts of a vehicle without it actually having to utilize them. (0: cold, 1: hot) - https://community.bistudio.com/wiki/showWarrant + https://community.bistudio.com/wiki/setVehicleTIPars - showWarrant Boolean + Object setVehicleTIPars Array - showWarrant show + vehicle setVehicleTIPars [engine, wheels, weapon] - + $Code$vehicle player setVehicleTIPars [1,1,1];$/Code$ + undefined / undefined - Nothing + Nothing + - showWatch + setAmmoCargo - Shows or hides the watch on the map screen, if enabled for the mission and you possess the item. (default true ) + Set amount of ammo resources in cargo space of a rearm vehicle. Ammo resource is used to resupply vehicles that take ammo. Soldiers use individual magazines instead. Amount: 1 is full cargo. + The actual quantity to work with is determined by the model's class in CfgVehicles - https://community.bistudio.com/wiki/showWatch + https://community.bistudio.com/wiki/setAmmoCargo - showWatch Boolean + Object setAmmoCargo Number - showWatch show + vehicleName setAmmoCargo ammoCargo - $Code$showWatch false ;$/Code$ + $Code$_ammoTruck1 setAmmoCargo 0.5;$/Code$ - undefined / undefined + local / global - (16 Aug, 2009) - In Arma 2, the Watch is now an inventory item. Class path is CfgWeapons- ItemWatch. Use the commands addWeapon and removeWeapon to add or remove it from a unit's inventory. (example: player addweapon "ItemWatch") + (31 Aug, 2011) + While the amount of total 'ammo' that can be reloaded is defined in the truck/supply point's CfgVehicles entry, the amount each round of ammunition takes from that total is defined in the CfgAmmo 'Cost' entry for that round. + Your typical truck has 300000 ammo capacity, and the tunguska's missiles have a Cost of 50000. So the tunguska can reload a total of 6 missiles from the ammo truck before the ammo capacity is depleted and needs to be set with setAmmoCargo. + A similar thing applies with a vehicle's cfgVehicle Cost entry for repairing, and the vehicle's fuelCapacity entry when refuelling. + + (July 10, 2015) + (ArmA 3 1.44) setAmmoCargo will have no effect if the vehicle doesn't support getAmmoCargo. - Nothing + Nothing + - showWaypoints + taskType - Shows/Hides task HUD markers and waypoints that will fade out in time. Dependable on difficulty settings. + Returns the type of the given task - https://community.bistudio.com/wiki/showWaypoints + https://community.bistudio.com/wiki/taskType - showWaypoints Boolean + taskType Task - showWaypoints enabled + taskType task - $Code$showWaypoints true ;$/Code$ + $Code$_type = taskType ( currentTask player );$/Code$ undefined / undefined @@ -65164,31 +67639,28 @@ - Nothing + String + - showWaypoint + waypointTimeoutCurrent - Sets the condition determining when the waypoint is shown. - Possible values are: - "NEVER" - never show it - "EASY" - show only in cadet mode - "ALWAYS" - always show it + Gets the current waypoint timeout or -1 if countdown is not in progress. - https://community.bistudio.com/wiki/showWaypoint + https://community.bistudio.com/wiki/waypointTimeoutCurrent - Array showWaypoint String + waypointTimeoutCurrent Group - waypoint showWaypoint show + waypointTimeoutCurrent waypoint - $Code$[_grp, 2] showWaypoint "ALWAYS";$/Code$ + $Code$_timeout = waypointTimeoutCurrent groupOne;$/Code$ undefined / undefined @@ -65196,83 +67668,97 @@ - Nothing + Number + - shownArtilleryComputer + removeSecondaryWeaponItem - Checks whether the player has the artillery computer currently open. + Removes given weapon item from the secondary weapon cargo space. This command also supports weapon magazines. - https://community.bistudio.com/wiki/shownArtilleryComputer + https://community.bistudio.com/wiki/removeSecondaryWeaponItem - shownArtilleryComputer + Object removeSecondaryWeaponItem String - shownArtilleryComputer + unit removeSecondaryWeaponItem item - $Code$if ( shownArtilleryComputer ) then { hint "Artillery Computer shown on screen"; };$/Code$ + $Code$player removeSecondaryWeaponItem ( secondaryWeaponItems select 0);$/Code$ - undefined / undefined + local / global - Boolean + Nothing + - shownChat + lbCurSel - Returns true if chat window is enabled. Chat window can be disabled with showChat command. + Returns the index of the selected item of the listbox or combobox with id idc of the topmost user dialog. For listbox LB_MULTI (multi-selection) use lbSelection. - https://community.bistudio.com/wiki/shownChat + https://community.bistudio.com/wiki/lbCurSel - shownChat + lbCurSel Number + + lbCurSel Control - shownChat + lbCurSel idc + + lbCurSel control - $Code$_bool = shownChat ;$/Code$ + $Code$_index = lbCurSel 101;$/Code$ + + $Code$lbCurSel _ctrl;$/Code$ undefined / undefined + More information on the LB command family can be found here + + (July 11, 2014) + If nothing is selected this command returns -1 - Boolean + Number - Number + - shownCompass + removeWeaponAttachmentCargo - Checks if client has Compass enabled in description.ext ( showCompass param) or force enabled with showCompass command. + Remove attachment linked to a weapon from the vehicle cargo space. + This is unoffical documentation. All Information here is as it exists in the Engine. It might not reflect the reality. - https://community.bistudio.com/wiki/shownCompass + https://community.bistudio.com/wiki/removeWeaponAttachmentCargo - shownCompass + Object removeWeaponAttachmentCargo Array - shownCompass + vehicle removeWeaponAttachmentCargo [weaponID,creatorID,attachment] - $Code$if ( shownCompass ) then { hint "You have Compass enabled"};$/Code$ + $Code$rearmTruckOne removeWeaponAttachmentCargo[weaponID,creatorID,"attachment"]$/Code$ undefined / undefined @@ -65280,138 +67766,194 @@ - Boolean + Nothing + - shownCuratorCompass + controlNull - Returns true if compass is shown. + A non-existing Control. To compare non-existent objects use isNull or isEqualTo : + controlNull == controlNull ; // false + isNull controlNull ; // true + controlNull isEqualTo controlNull ; // true - https://community.bistudio.com/wiki/shownCuratorCompass + https://community.bistudio.com/wiki/controlNull - shownCuratorCompass + controlNull - shownCuratorCompass + controlNull - + $Code$! isNull controlNull ; // false$/Code$ + + $Code$str controlNull ; // No control$/Code$ + undefined / undefined - Boolean + Control + - shownGPS + lockCargo - Checks if client has GPS reciever enabled in description.ext ( showGPS param) or force enabled with showGPS command. + Lock all cargo positions of a vehicle or lock by index. This command must be executed where vehicle is local. - https://community.bistudio.com/wiki/shownGPS + https://community.bistudio.com/wiki/lockCargo - shownGPS + Object lockCargo Boolean + + Object lockCargo Array - shownGPS + vehicle lockCargo lock + + vehicle lockCargo [index, lock] - $Code$if ( shownGPS ) then { hint "You have GPS reciever enabled"};$/Code$ + $Code$vehicleName lockCargo true ;$/Code$ + + $Code$vehicleName lockCargo [0, true ];$/Code$ - undefined / undefined + local / global - Boolean + Nothing - Nothing + - shownHUD + eyePos - Returns array of Booleans corresponding to the visibility of various HUD elements (see extended showHUD ). + Returns the object's eyes / main turret position. - https://community.bistudio.com/wiki/shownHUD + https://community.bistudio.com/wiki/eyePos - shownHUD + eyePos Object - shownHUD + eyePos object - $Code$_hudStatus = shownHUD ;$/Code$ + $Code$eyePos player$/Code$ - undefined / undefined + global / undefined - Array + Array + - shownMap + lnbSetColor - Checks if client has Map enabled in description.ext ( showMap param) or force enabled with showMap command. + Sets the color of the item with the given position of the 2D listbox. Color is in format Color. - https://community.bistudio.com/wiki/shownMap + https://community.bistudio.com/wiki/lnbSetColor - shownMap + lnbSetColor Array + + Control lnbSetColor Array - shownMap + lnbSetColor [idc,[row,column],color] + + _ctrl lnbSetColor [ [row,column],color] - $Code$if ( shownMap ) then { hint "You have Map enabled"};$/Code$ + $Code$_ctrl lnbSetColor [ [0,0], [1,0,0,1] ];$/Code$ - undefined / undefined + local / local + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Boolean + Nothing - Nothing + - shownPad + enableVehicleSensor - Checks if client has Notepad enabled. + Enable/disable given sensor - https://community.bistudio.com/wiki/shownPad + https://community.bistudio.com/wiki/enableVehicleSensor - shownPad + Object enableVehicleSensor Array - shownPad + vehicle enableVehicleSensor [componentName, state] - $Code$if ( shownPad ) then { hint "You have Notepad enabled."};$/Code$ + $Code$vehicle player enableVehicleSensor ["PassiveRadarSensorComponent",false]; // disables passive radar$/Code$ undefined / undefined @@ -65419,27 +67961,28 @@ - Boolean + Nothing + - shownRadio + HUDMovementLevels - Check if player has Radio enabled. + Returns movement borders for HUD [min speed, max speed, min alt, max alt, min dir, max dir, position[x,y,z] or target] - https://community.bistudio.com/wiki/shownRadio + https://community.bistudio.com/wiki/HUDMovementLevels - shownRadio + HUDMovementLevels - shownRadio + HUDMovementLevels - $Code$if ( shownRadio ) then { hint "You have Radio enabled."};$/Code$ + $Code$HUDMovementLevels;//[0,0,0,0,0,0,[0,0,0]]$/Code$ undefined / undefined @@ -65447,56 +67990,66 @@ - Boolean + Array + - shownScoretable + directSay - Returns the state of the score table set with showScoretable command. - Since Arma 3 v1.63.137869, the previous functionality of this command (score table visibility check) is moved to visibleScoretable command. Please update your scripts and sorry for any inconvinience. + Sends given audio message to the direct channel. Command operates just like xxxxRadio commands, but the sound is played over direct channel and is independent of fadeRadio. The message is defined in CfgRadio in the description.ext file or config radio protocol or a kbAddTopic. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). + Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. - https://community.bistudio.com/wiki/shownScoretable + https://community.bistudio.com/wiki/directSay - shownScoretable + Object directSay String - shownScoretable + unit directSay radioName - $Code$_state = shownScoretable ;$/Code$ + $Code$player directSay configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ - undefined / undefined + global / local + (December 3, 2016) + To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: + $Code$ player directSay "#MySound.ogg";$/Code$ - Number + Nothing + - shownUAVFeed + getObjectArgument - Returns true if video feed transmitted from UAV is shown. A getter for showUAVFeed + Return name of object argument in mission editor. + i + Some Old Editor Command - https://community.bistudio.com/wiki/shownUAVFeed + https://community.bistudio.com/wiki/getObjectArgument - shownUAVFeed + Control getObjectArgument Array - shownUAVFeed + map getObjectArgument [object, argument] - $Code$_bool = shownUAVFeed ;$/Code$ + $Code$// returns string "[1009.0351, 1319.4928]" + ( findDisplay 128 displayCtrl 51) getObjectArgument ["_unit_1", "POSITION"] + // returns array [1009.0351, 1319.4928] + ( findDisplay 128 displayCtrl 51) evalObjectArgument ["_unit_1", "POSITION"]$/Code$ undefined / undefined @@ -65504,54 +68057,58 @@ - Boolean + String + - shownWarrant + ctrlSetScale - Check if player has ID card enabled. Obsolete command. + Sets wanted scale for control animation. Top left corner remains same. This command requires ctrlCommit. - https://community.bistudio.com/wiki/shownWarrant + https://community.bistudio.com/wiki/ctrlSetScale - shownWarrant + Control ctrlSetScale Number - shownWarrant + control ctrlSetScale scale - + $Code$_control ctrlSetScale 0.5; + _control ctrlCommit 0;$/Code$ + undefined / undefined - Boolean + Nothing + - shownWatch + setVehicleRadar - Checks if client has Watch enabled in description.ext ( showWatch param) or force enabled with showWatch command. + Sets the AI rules of Radar usage (Emission Control). Automatic means Radar switched on only when in Combat. The command doesn't affect player-controlled vehicles. - https://community.bistudio.com/wiki/shownWatch + https://community.bistudio.com/wiki/setVehicleRadar - shownWatch + Object setVehicleRadar Number - shownWatch + vehicle setVehicleRadar rules - $Code$if ( shownWatch ) then { hint "You have Watch enabled"};$/Code$ + $Code$_vehicle setVehicleRadar 1;$/Code$ undefined / undefined @@ -65559,27 +68116,35 @@ - Boolean + Nothing + - sideAmbientLife + setWaypointCombatMode - Returns side of ambient life, for example ambient life placed in Eden Editor. + The group combat mode is switched when the waypoint becomes active. + Possible mode values are: + "NO CHANGE" (No change) + " BLUE " (Never fire) + " GREEN " (Hold fire - defend only) + " WHITE " (Hold fire, engage at will) + " YELLOW " (Fire at will) + " RED " (Fire at will, engage at will) - https://community.bistudio.com/wiki/sideAmbientLife + https://community.bistudio.com/wiki/setWaypointCombatMode - sideAmbientLife + Array setWaypointCombatMode String - sideAmbientLife + waypoint setWaypointCombatMode mode - $Code$_sideAmbientLife = sideAmbientLife ;$/Code$ + $Code$[_grp, 2] setWaypointCombatMode "RED";$/Code$ undefined / undefined @@ -65587,33 +68152,34 @@ - Side + Nothing + - sideChat + commandChat - Types text to the side radio channel. Must have assigned "ItemRadio" to see or transmit the messages. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) + Types text to the command radio channel. Must have assigned "ItemRadio" to see or transmit the messages. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) - https://community.bistudio.com/wiki/sideChat + https://community.bistudio.com/wiki/commandChat - Object sideChat String + Object commandChat String - Array sideChat String + Array commandChat String - unitName sideChat chatText + unitName commandChat chatText - [side, identity] sideChat chatText + [side, identity] commandChat chatText - $Code$_soldierOne sideChat "Show this text";$/Code$ + $Code$_soldierOne commandChat "Show this text";$/Code$ - $Code$[ west, "HQ"] sideChat "Hi there";$/Code$ + $Code$[ playerSide, "HQ"] commandChat "Do this! That's an order!";$/Code$ $Code$driver vehicle player sideChat "sideChat"; driver vehicle player globalChat "globalChat"; @@ -65627,30 +68193,30 @@ global / local - In OFP v1.96, sideChat messages can be sent from 2 abstract sources: "Papa_Bear" and "Base FireFly". Use sideChat on an array in the form [SIDE,"base"],[SIDE,"HQ"],[SIDE,"Papa_bear"] or [SIDE,"airbase"], where SIDE is the side broadcasting. "HQ", "base" and "Papa_bear" seem to be the same object. The callsign strings can be re-defined using a stringTable.csv file, using STR_CFG_PAPABEAR and STR_CFG_FIREFLYBASE. Example : [EAST,"base"] sideChat "Return to base!". - Nothing - Nothing + Nothing - Nothing + - sideEmpty + isFormationLeader - Returns empty side, for example static buildings in Eden Editor. + Returns true if the specified unit is subgroup leader. - https://community.bistudio.com/wiki/sideEmpty + https://community.bistudio.com/wiki/isFormationLeader - sideEmpty + isFormationLeader Object - sideEmpty + isFormationLeader unit - $Code$_sideEmpty = sideEmpty ;$/Code$ + $Code$_isLeader = isFormationLeader player ;$/Code$ undefined / undefined @@ -65658,123 +68224,143 @@ - Side + Boolean + - sideEnemy + lifeState - The enemy side (used for renegades). Unit of this side is enemy to everyone. - To become one, you can attack members of your own side or use addRating. - When below a rating of -2000 units switch automatically to this side. + Returns the life state of the given unit. Can be one of: + (Pre-Arma 3) + "ALIVE" + "DEAD" + "DEAD-RESPAWN" + "DEAD-SWITCHING" + "ASLEEP" + "UNCONSCIOUS" + (Arma 3) + "HEALTHY" + "DEAD" + "DEAD-RESPAWN" + "DEAD-SWITCHING" + "INCAPACITATED" + "INJURED" + In Arma 3 lifeState seems to change to "INJURED" when damage aliveUnit = 0.1 (0.1 seems to be the value defined in config under "InjuredTreshold"). - https://community.bistudio.com/wiki/sideEnemy + https://community.bistudio.com/wiki/lifeState - sideEnemy + lifeState Object - sideEnemy + lifeState unit - $Code$if ( side player == sideEnemy ) then { - hint "We've got a renegade!"; - };$/Code$ + $Code$_ls = lifeState loon;$/Code$ - undefined / undefined + global / undefined - Side + String + - sideFriendly + switch - The Friendly side (used for captives). + Creates a switch type that can be used inside a switch do -block - https://community.bistudio.com/wiki/sideFriendly + https://community.bistudio.com/wiki/switch - sideFriendly + switch Anything - sideFriendly + switch arg - + $Code$_mySwitch = switch "Test"; + _mySwitch do {/*Something*/};$/Code$ + + $Code$switch (_a) do { case 1 : { /*...code...*/ }; case 2 : { /*...code...*/ }; default { /*...code...*/ }; }; switch (_condition) do { + case 1: { hint "1" }; + case 2: { hint "2" }; + default { hint "default" }; + }; switch (_condition) do { + case "string1"; + case "string2": { hint "string1 or string2" }; + case "string3"; + case "string4": { hint "string3 or string4" }; + default { hint "default" }; + };$/Code$ + undefined / undefined - Side + Switch_Type + - sideLogic + mapAnimDone - The Logic side. - Side of Game Logics and Modules. + Check if map animation is finished. - https://community.bistudio.com/wiki/sideLogic + https://community.bistudio.com/wiki/mapAnimDone - sideLogic + mapAnimDone - sideLogic + mapAnimDone - $Code$if ( side _obj == sideLogic ) then { - hint "It's a logic!"; - };$/Code$ - + - undefined / undefined + local / local + In OFP v1.96, the mapAnim series of commands, together with forceMap can only be used in the intro and mission, as it is not possible to access the map from the outro. (not checked, sourced from an old copy of the OFPEC comref) - Side + Boolean + - sideUnknown + dialog - The unknown side. - Used when the side of a unit is unknown, e.g. for spotted targets with insufficient information. + Tests whether any user dialog is open. - https://community.bistudio.com/wiki/sideUnknown + https://community.bistudio.com/wiki/dialog - sideUnknown + dialog - sideUnknown + dialog - $Code$//soldier1 and soldier2 of different sides and out of sight - soldier1 reveal soldier2; - hint str (soldier1 nearTargets 1000); - //returns: [[[1557.96,5047.4,1.32402],"SoldierWB",UNKNOWN,0.0155183,soldier2,5]] - soldier1 reveal [soldier2,1.5]; - //returns: [[[1556.52,5050.08,1.32402],"SoldierWB",WEST,0.0211193,soldier2,5]]$/Code$ + $Code$if (! dialog ) then { createDialog "Dialog1";};$/Code$ undefined / undefined @@ -65782,161 +68368,117 @@ - Side + Boolean + - side + formationLeader - Returns the side of a unit, vehicle, object or location. Once dead, a unit will be on the civilian side. Query the side of the Group to get a reliable result. - When used in conjunction with a format statement hint format ["%1", side player ], the returned strings are: " WEST ", " EAST ", " GUER ", " CIV ", " LOGIC ", " ENEMY " (eg: renegades), " FRIENDLY ", " AMBIENT LIFE ", " EMPTY " or " UNKNOWN ". + Return leader of the formation. - https://community.bistudio.com/wiki/side + https://community.bistudio.com/wiki/formationLeader - side Object/Group - - side Location + formationLeader Object - side object - - side location + formationLeader unitName - $Code$if ( side player == west ) then { hint "Player is on the West side"};$/Code$ - - $Code$_sideAlsoWorkingForDead = side group player ;$/Code$ - - $Code$_sideLocation = side myLocation;$/Code$ - - $Code$// SQS - ? ( side player == west ) : hint "Player is on the West side."$/Code$ + $Code$? (formationLeader player != leader player) : + hint "Formation leader is not the group leader."$/Code$ undefined / undefined - In ArmA, the following objects are on side civilian : dead bodies and vehicles, empty vehicles, all mission editor placed objects (that do not have an inherit side), all objects with interactive components such as ladders and doors, man made structures such as buildings (including classless wrp placed objects), docks, high tension powerlines, see-saws, large rubbish bins, fountains. Basically if an object uses a non-simple damage or physics simulation it is likely to be on the civilian side. - NOTE: If you need to know the side of a dead body, you can use faction command as a workaround -- Killzone_Kid - - In OFP 1.96, side return value for empty vehicles will be civilian. - - In OFP v1.96, the side return value for a vehicle is based on the side of it's commander, then gunner, then driver, then cargo. It will retain it's side value until it is either empty, or a unit of another side takes over in a equal or higher role, irrespective of the side of other units still on board. This can be used to simulate friendly fire, as a vehicle can be made to appear to be an enemy even though all units on board are actually friendly. - - Units with negative score(rating) are sideEnemy. - - The Side for civilians is civilian and the string name of the side is "CIV". For Resistance/Independent (Guerilla) they are resistance and "GUER". - - As CEEB says above, in ArmA2, side for a vehicle often depends on who the command or driver is, for example, A KA52, piloted by a USMC guy will have side WEST. For an accurate result of what 'where the vehicle was made', use faction. This ignores the pilot/commander, so in my example here, this KA52 will always return faction "RU". Note that faction returns different values to side though. - - Side values for ambient life (animals) are bizarre. side _unit returns "CIV", but playerSide returns "AMBIENT LIFE" when the player is an animal. In that case, playerSide == side player returns false! - Fortunately, you can easily check if a unit is an animal with _unit isKindOf "ANIMAL"' - - Units who set via 'this setcaptive true' are always on side civilian. - - (July 30, 2015) - This is probably the most confusing section of the wiki so here I give my clarification: - In ArmA3 1.48, forEach'ing playableUnits to find certain players from certain sides, you will need to do it like this: - $Code$if (side _x isEqualTo EAST) then { diag_log format["%1's side is %2", name _x, side _x];$/Code$ - Instead, this page might trick you into thinking that you will need to check for player's side like this: - $Code$side _x isEqualTo "EAST"$/Code$ ^^^^^ That does NOT work. + (December 2, 2006) + Return value is NULL-OBJECT if no group members exist. - Side - Side + Object + - sideRadio + ctrlRemoveAllEventHandlers - Sends the audio message to the side radio channel. Must have assigned "ItemRadio" to send or receive the transmission. The message is defined in CfgRadio in the description.ext file or config radio protocol. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). - Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. + Remove all event handlers from the given control. - https://community.bistudio.com/wiki/sideRadio + https://community.bistudio.com/wiki/ctrlRemoveAllEventHandlers - Object sideRadio String - - Array sideRadio String + Control ctrlRemoveAllEventHandlers String - unit sideRadio radioName - - [side, identity] sideRadio radioName + control ctrlRemoveAllEventHandlers handlerName - $Code$_soldierOne sideRadio "messageOne";$/Code$ - - $Code$player sideRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ - - $Code$[ west, "Base"] sideRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ - + - global / local + undefined / undefined - (03:47, 12 February 2007) - In OFP v1.96, sideRadio messages can be sent from 2 abstract sources: "Papa_Bear" and "Base FireFly". Use sideRadio on an array in the form [SIDE,"base"],[SIDE,"HQ"],[SIDE,"Papa_bear"] or [SIDE,"airbase"], where SIDE is the side broadcasting. "HQ", "base" and "Papa_bear" seem to be the same object. The callsign strings can be re-defined using a stringTable.csv file, using STR_CFG_PAPABEAR and STR_CFG_FIREFLYBASE. Example : [EAST,"base"] sideRadio "returnToBase". - - (December 3, 2016) - To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: - $Code$ player sideRadio "#MySound.ogg";$/Code$ - Nothing - Nothing + Nothing + - simpleTasks + getArtilleryComputerSettings - Return all simple tasks assigned to given person. + Returns settings from artillery computer currently opened by player. - https://community.bistudio.com/wiki/simpleTasks + https://community.bistudio.com/wiki/getArtilleryComputerSettings - simpleTasks Object + getArtilleryComputerSettings - simpleTasks person + getArtilleryComputerSettings - + $Code$hint str getArtilleryComputerSettings ; //["Semi (medium)","HE Mortar Shells",0]$/Code$ + undefined / undefined - Array + Array + - simulCloudDensity + radioChannelSetLabel - Returns density of clouds at given position. + Set the custom radio channel's label. - https://community.bistudio.com/wiki/simulCloudDensity + https://community.bistudio.com/wiki/radioChannelSetLabel - simulCloudDensity Position + Number radioChannelSetLabel String - simulCloudDensity pos + index radioChannelSetLabel label - $Code$simulCloudDensity (getPos player)$/Code$ + $Code$5 radioChannelSetLabel "Q-dance Radio";$/Code$ undefined / undefined @@ -65944,82 +68486,122 @@ - Number + Nothing + - simulCloudOcclusion + isBleeding - Returns clouds occlusion between two given points (0 - no clouds, 1 - full clouds). + Returns whether the unit is bleeding. - https://community.bistudio.com/wiki/simulCloudOcclusion + https://community.bistudio.com/wiki/isBleeding - simulCloudOcclusion Array + isBleeding Object - simulCloudOcclusion [pos1,pos2] + isBleeding unit - $Code$canSeeSun = ( simulCloudOcclusion == 0)$/Code$ + $Code$if ( isBleeding player ) then { player groupChat "I'm bleeding!!"; }$/Code$ undefined / undefined - (8 August, 2014) - The simulCloudOcclusion command is not recognized on dedicated servers, and will produce an error. If you use this command, it cannot be anywhere within a script that is run on the dedicated server, or the entire script will halt. To get around this, you can use: $Code$if ! isDedicated then {[] execVM "simulCloudOcclusionScript.sqf"};$/Code$ - Number + Boolean + - simulInClouds + lnbClear - Returns if given position is in clouds. + Clears all items in the given listbox or combobox. - https://community.bistudio.com/wiki/simulInClouds + https://community.bistudio.com/wiki/lnbClear - simulInClouds Position + lnbClear Number + + lnbClear Control - simulInClouds pos + lnbClear idc + + lnbClear ctrl - $Code$simulInClouds (getPos player)$/Code$ + $Code$lnbClear _ctrl;$/Code$ undefined / undefined + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: + $Code$ + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Boolean + Nothing - Nothing + - simulWeatherSync + menuSetValue - Synchronizes Simul Weather with Arma weather, generates all keyframes. + Sets new value into menu entry on given path. - https://community.bistudio.com/wiki/simulWeatherSync + https://community.bistudio.com/wiki/menuSetValue - simulWeatherSync + menuSetValue Array - simulWeatherSync + menuSetValue [idc, path, value] @@ -66027,340 +68609,298 @@ undefined / undefined - (May 4, 2016) - The behavior of this command is similar to forceWeatherChange, however it leaves current weather transitions intact. Its main purpose would be to refresh the cloud cover to properly reflect current overcast, as they can sometime get out of sync, especially when using setTimeMultiplier and setAccTime. - Nothing + Nothing + - simulationEnabled + or - Check if the entity has enabled simulation. + Returns true only if one or both conditions are true. In case of the alternative syntax, lazy evaluation is used (if left operand is true, evaluation of the right side is skipped completely). + Identical to: a || b - https://community.bistudio.com/wiki/simulationEnabled + https://community.bistudio.com/wiki/or - simulationEnabled Object + Boolean or Boolean + + Boolean or Code - simulationEnabled entity + a or b + + a or b - + $Code$if ((OBJ1) or (_enemycount == 0)) then { hint "you win !"}$/Code$ + + $Code$if (( count _array == 0) or {(_array select 0) != player }) then { hint "It works! Without lazy evaluation it would throw an error if array was empty."}$/Code$ + undefined / undefined + (March 29, 2015) + The examples suggest that you can only use two conditions with or. You can use more if you want. + It is not recommended to use a lot of conditions because the check will take longer to complete. - Boolean + Boolean - Boolean + - sin + create3DENEntity - Sine of x, argument in Degrees. + Create new Eden Entity. Used for creating individual entities; to create a composition (e.g., infantry squad), use create3DENComposition. + This is the only way how to add new editable entities to Eden Editor scenario. Other 'create' commands like createVehicle or createUnit will still work, but the resulting entity won't be editable. - https://community.bistudio.com/wiki/sin + https://community.bistudio.com/wiki/create3DENEntity - sin Number + create3DENEntity Array + + Group create3DENEntity Array - sin x + create3DENEntity [mode, class, position, ] + + group create3DENEntity [mode, class, position, ] - $Code$_sine = sin 30;//result is 0.5$/Code$ + $Code$dude1 = create3DENEntity ["Object","B_Soldier_F", screenToWorld [0.5,0.5]];$/Code$ + + $Code$dude2 = ( group dude1) create3DENEntity ["Object","B_Soldier_AR_F", screenToWorld [0.5,0.5]];$/Code$ + + $Code$myMarker = create3DENEntity ["Marker","mil_warning", position player ];$/Code$ + + $Code$mytrigger = create3DENEntity ["Trigger","EmptyDetectorArea10x10", position player ];$/Code$ undefined / undefined + (March 29, 2016) + The classnames for triggers can be found in the config class CfgNonAIVehicles + + (June 14, 2016) + Mode can also be "Logic". Not sure if it's a replacement for "System" or a it's a completely separate mode. - Number + EdenEntity - EdenEntity + - size + enableStamina - Returns a location's size. + Enable/disable stamina system - https://community.bistudio.com/wiki/size + https://community.bistudio.com/wiki/enableStamina - size Location + Object enableStamina Boolean - size location + unit enableStamina enabled - $Code$_locSize = size myLocation$/Code$ + $Code$player enableStamina true;$/Code$ - undefined / undefined + local / global - Array + Nothing + - sizeOf + ctrlSetBackgroundColor - Returns the diameter of bounding sphere of the object of given type in meters. Size returned is usually bigger than the biggest size of the object along any of the axes. For example if object is 10 x 4 x 5 the sizeOf value returned expected to be around 10. If you need to estimate the size of the object more precisely, use boundingBox or boundingBoxReal. - NOTE: The object has to be present in current mission to be able to read its size (otherwise zero will be returned). + Sets background color of given control. - https://community.bistudio.com/wiki/sizeOf + https://community.bistudio.com/wiki/ctrlSetBackgroundColor - sizeOf String + Control ctrlSetBackgroundColor Array - sizeOf type + control ctrlSetBackgroundColor color - $Code$_dimension = sizeOf "M1Abrams"; //returns 10.7833$/Code$ + $Code$_control ctrlSetBackgroundColor [1, 0, 0, 1]$/Code$ undefined / undefined + (May 10, 2017) + According to https://feedback.bistudio.com/T78904 + This definetly doesn't work with RscButton's. \br + According to ( https://resources.bisimulations.com/wiki/ctrlSetBackgroundColor ) this "Only affects Comboboxes, Static Text, Structured Text or Maps. " - Number + Nothing + - skillFinal + commandTarget - Returns final, recalculated sub skill value of given unit. (with regard to AI Level coefficient (Difficulty settings)). + Order the given unit(s) to target the given target (via the radio). Command given to the player, puts a red square with words Target and Distance on player's HUD at target location. If player in vehicle and has radar facilities, it also adds target marker to the radar. - https://community.bistudio.com/wiki/skillFinal + https://community.bistudio.com/wiki/commandTarget - Object skillFinal String + Object commandTarget Object - unitName skillFinal sub-skill + unitName commandTarget target - $Code$cursorTarget skillFinal "Endurance"$/Code$ + $Code$_ESoldier1 commandTarget _WSoldier1;$/Code$ + + $Code$player commandTarget bob;$/Code$ - undefined / undefined + local / global - Since 1.40 the command works also in MP environment - - (January 31, 2015) - Number + Nothing + - skill + visibleScoretable - Returns current level of ability of person, in range between 0 and 1. Skill 1 is highest skill. + Checks whether the score table is visible. - https://community.bistudio.com/wiki/skill + https://community.bistudio.com/wiki/visibleScoretable - skill Object - - Object skill String + visibleScoretable - skill unitName - - unitName skill skillType + visibleScoretable - $Code$_skill = skill unit1$/Code$ - - $Code$_myEndurance = player skill "Endurance"$/Code$ + $Code$_visible = visibleScoretable ;$/Code$ undefined / undefined - Skill of AI units set via the slider in unit placement screen varies from 0.2 to 1.0. - If superAI is enabled all units have skill of 1.0 regardless of the skill slider - Number - Number + Boolean + - skipTime + currentMagazine - Jumps the specified number of hours forward or backward. The time of day and tides are adjusted, but no changes are made to any units. If present, the lower level of clouds instantly jump to the position they would be in if time had passed normally. + Returns class name of currently loaded vehicle's magazine. - https://community.bistudio.com/wiki/skipTime + https://community.bistudio.com/wiki/currentMagazine - skipTime Number + currentMagazine Object - skipTime duration + currentMagazine vehicle - $Code$skipTime 5;$/Code$ + $Code$_magazineClass = currentMagazine player ;//Example: "30Rnd_545x39_AK"$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - - To simulate a smooth time-lapse effect (e.g. in cut-scenes), you can use the following code: - $Code$while {true} do {skiptime 0.00333; sleep 0.1};$/Code$ - - To skip forward to a specific time, irrespective of the current mission time, use - $Code$skipTime (_timeToSkipTo - daytime + 24 ) % 24;$/Code$ - - In ArmA & OFP, skipTime does not actually estimate weather changes beyond moving the clouds across the sky. Weather counters continue as if no time has passed. The setDate command can be used instead of skiptime to change the time without the visual give-away of the lower clouds jumping. - - I cannot confirm this for OA 1.60 beta (85889): - MP: Even though the immediate effect of skipTime is only local, - the new time will propagate through the network after 30 seconds or so. - Instead the date, which includes time, is synced automatically for new JIP clients - NOT for present instances. - So one has to apply skipTime on all instances in MP (server + all present clients). - - This command is blocking and in some cases it may take up to 1.5 seconds (probably depends on CPU) for it to calculate the changes to the environment, during which the game will microfreeze. It largely depends on weather changes, which are quite random. However one thing remains consistent, skipTime 24 hours is always almost instant. This is quite helpful when used in conjunction with commands such as setOvercast for instant and seamless effect. To try it yourself use this script: - $Code$[] spawn { - for "_i" from 1 to 24 do { - _time = diag_tickTime ; - skipTime _i; - diag_log [_i, diag_tickTime - _time]; - sleep 3; - }; - };$/Code$ - One of the results (results will vary depending on weather conditions): - $Code$[1,1.44507] - [2,1.46118] - [3,1.33105] - [4,1.396] - [5,0.0310059] - [6,1.37891] - [7,1.4502] - [8,1.37817] - [9,1.37695] - [10,1.37012] - [11,1.448] - [12,1.32593] - [13,1.45508] - [14,1.448] - [15,0.0349121] - [16,0.0368652] - [17,1.25903] - [18,1.38599] - [19,1.4519] - [20,0.052002] - [21,0.0400391] - [22,0.0490723] - [23,1.35205] - [24,0.0151367] //this is always the lowest$/Code$ - - In Arma 3 (around v1.14) skipTime executed on the server will get synced in 5 seconds or so with all the clients. It will also be JIP compatible. skipTime executed on a client will change time on client for about 5 seconds after which it will sync back to server time. + (October 4, 2010) + See notes of currentWeapon. - Nothing + String + - sleep + ctrlSetFontP - Suspends code execution for given time in seconds. The sleep precision is given by a framerate, the delay given is the minimal delay expected. Must be called inside of a context which is interruptible, i.e. a script executed by execVM or spawn. + Sets P font of given HTML control or its size. - https://community.bistudio.com/wiki/sleep + https://community.bistudio.com/wiki/ctrlSetFontP - sleep Number + Control ctrlSetFontP String/Number - sleep delay + control ctrlSetFontP fontOrSize - $Code$[] spawn { sleep 5; hint "after 5 sec..."};$/Code$ + $Code$_control ctrlSetFontP "TahomaB"$/Code$ + + $Code$_control ctrlSetFontP 0.05$/Code$ undefined / undefined - this command will suspend the script indefinitely if game simulation is paused in SP. To avoid this, use uiSleep. - - (December 20, 2006) - Sleep suspends both SQF functions and SQF scripts. In functions, the calling script is still in suspension due to waiting for a return from the call command. The game engine will continue, however. See Function for more detail. - - (February 12, 2007) - Sleep durations between.0005 and.02 will cause the same delay (roughly.02 seconds). Delays of.0005 and less have no effect (ie, the sleep call will return immediately). - - The comment above is a little misleading. The game engine appears to work by processing frames and then checking to see whether scripts are available to execute. Sleep causes the script/function to be suspended until at least the specified time has elapsed. To wait for the next frame, or give other scripts a chance to run, use Sleep 0.001. - - (July 16, 2007) - For scripts called by the Init Event Handler the first sleep command will suspend the script at the briefing screen at the start of a mission. The script will continue after the briefing screen, when actually "in game". - - (July 12, 2014) - Sleep will treat negative values as if they were 0. (Tested in Arma 3 v1.22) - - (October 18, 2014) - For server scripts, if you are creating "while true" timers, it is best to use uiSleep instead, as the sleep from that command is not slowed down by simulation / server lag, so the timers will execute at intervals that are much closer to real time, even under heavy lag. - Nothing + Nothing + - sliderPosition + lockIdentity - Return current thumb position of slider idc of topmost user dialog. + Locks the identity of a person. This will disable default identity. - https://community.bistudio.com/wiki/sliderPosition + https://community.bistudio.com/wiki/lockIdentity - sliderPosition Number - - sliderPosition Control + lockIdentity Object - sliderPosition idc - - sliderPosition control + lockIdentity unit - $Code$_slidepos1 = sliderPosition 105;$/Code$ + $Code$_success = lockIdentity player;$/Code$ undefined / undefined @@ -66368,63 +68908,65 @@ - Number - Number + Boolean + - sliderRange + addItemCargo - Return limits, as an Array [min, max] of slider idc of topmost user dialog. + Creates new items and stores them in given container. Works with items, weapons and magazines. For global variant see addItemCargoGlobal - https://community.bistudio.com/wiki/sliderRange + https://community.bistudio.com/wiki/addItemCargo - sliderRange Number - - sliderRange Control + Object addItemCargo Array - sliderRange idc - - sliderRange control + box addItemCargo [item, count] - $Code$_slidelimits1 = sliderRange 105;$/Code$ + $Code$supplyBox addItemCargo ["optic_ARCO", 10];$/Code$ - undefined / undefined + local / local - Array - Array + Nothing + - sliderSetPosition + isEqualTypeParams - Set current thumb position of slider idc of topmost user dialog. + Compares types of all elements of input array to types of all elements of template array. Similar to isEqualTypeArray however this command is designed for fast validation of functions params, so there are differences: + Input can be anything but will be expected to be an Array, otherwise false is returned + Input array can be longer but not shorter than template array, will return false if shorter + nil could be used in template type array as a wild card to allow any type match - https://community.bistudio.com/wiki/sliderSetPosition + https://community.bistudio.com/wiki/isEqualTypeParams - sliderSetPosition Array - - Control sliderSetPosition Number + Anything isEqualTypeParams Array - sliderSetPosition [idc, pos] - - control sliderSetPosition pos + input isEqualTypeParams template - $Code$sliderSetPosition [101, 50];$/Code$ + $Code$[1,2, player,"10"] isEqualTypeParams [0,0, objNull,""]; //true + 123 isEqualTypeParams [0,0, objNull,""]; //false + [] isEqualTypeParams [0,0, objNull,""]; //false + [1,2, player ] isEqualTypeParams [0,0, objNull,""]; //false + [1,2, player,"10", true ] isEqualTypeParams [0,0, nil,""]; //true + [1,2, getPos player,"10", true ] isEqualTypeParams [0,0, nil,""]; //true$/Code$ undefined / undefined @@ -66432,97 +68974,106 @@ - Nothing - Nothing + Boolean + - sliderSetRange + joinAs - Set limits of slider idc of topmost user dialog. + Joins the unit to the given group, if position id is available, this one is used. - https://community.bistudio.com/wiki/sliderSetRange + https://community.bistudio.com/wiki/joinAs - sliderSetRange Array - - Control sliderSetRange Array + Object joinAs Array - sliderSetRange [idc, min, max] - - control sliderSetRange [min, max] + unit joinAs [group, id] - $Code$sliderSetRange [101, 0, 100];$/Code$ + $Code$player joinAs [_group, 4];$/Code$ + + $Code$// To get the position id: + getUnitPositionId = { + private ["_vvn", "_str"]; + _vvn = vehicleVarName _this; + _this setVehicleVarName ""; + _str = str _this; + _this setVehicleVarName _vvn; + parseNumber (_str select [(_str find ":") + 1]) + }; + player joinAs [ createGroup west, 5]; + _id = player call getUnitPositionId; + hint str _id; //5$/Code$ - undefined / undefined + global / global - Nothing - Nothing + Nothing + - sliderSetSpeed + onDoubleClick - Set speed of slider with id idc of topmost user dialog. - Click to arrow - move by line - Click to scale outside thumb - move by page. + Defines an action performed when the user double clicks on the map. Command receives:,_pos array position,_units array selected units,_shift,_alt bool key state + i + Some Old Editor Command - https://community.bistudio.com/wiki/sliderSetSpeed + https://community.bistudio.com/wiki/onDoubleClick - sliderSetSpeed Array - - Control sliderSetSpeed Array + Control onDoubleClick String - sliderSetSpeed [idc,line,page] - - control sliderSetSpeed [line, page] + map onDoubleClick command - $Code$sliderSetSpeed [101, 0.5, 2];$/Code$ - + undefined / undefined - Nothing - Nothing + Nothing + - sliderSpeed + mapCenterOnCamera - Return speed, as an Array [min, max] of slider idc of topmost user dialog. + control mapCenterOnCamera boolean syntax enables/disables continuous centering of the main map type control on the camera position. Needs to be executed once. + mapCenterOnCamera control syntax centers mini map type control on camera. The command returns world position of the camera. Needs to be executed each frame (preferably inside onDraw EH). - https://community.bistudio.com/wiki/sliderSpeed + https://community.bistudio.com/wiki/mapCenterOnCamera - sliderSpeed Number + Control mapCenterOnCamera Boolean - sliderSpeed Control + mapCenterOnCamera Control - sliderSpeed idc + mainmap mapCenterOnCamera enable - sliderSpeed control + mapCenterOnCamera minimap - $Code$_slidespeed1 = sliderSpeed 105;$/Code$ + $Code$//--- Minimap update + (( uiNamespace getVariable "BIS_UAV_DISPLAY") displayCtrl 112410) mapCenterOnCamera true ;$/Code$ undefined / undefined @@ -66530,29 +69081,38 @@ - Array - Array + Nothing - Array + - slingLoadAssistantShown + canAddItemToUniform - Returns true of Sling Load Assistant is open + Checks if given object can be stored into soldier's uniform. - https://community.bistudio.com/wiki/slingLoadAssistantShown + https://community.bistudio.com/wiki/canAddItemToUniform - slingLoadAssistantShown + Object canAddItemToUniform String + + Object canAddItemToUniform Array - slingLoadAssistantShown + unit canAddItemToUniform item + + unit canAddItemToUniform [item, count] - $Code$waitUntil { slingLoadAssistantShown }; - hint "You lack rudimentary motor skills and basic eye-hand coordination."; - //scold user for unethical practices$/Code$ + $Code$_item = "HandGrenade"; + _fits = player canAddItemToUniform _item; + if (_fits) then { + player addItemToUniform _item; + } else { + hint "no room!"; + };$/Code$ undefined / undefined @@ -66560,63 +69120,98 @@ - Boolean + Boolean - Boolean + - soldierMagazines + enableSimulation - Get array with all magazines of the given unit. + Enable / disable simulation for given entity. - https://community.bistudio.com/wiki/soldierMagazines + https://community.bistudio.com/wiki/enableSimulation - soldierMagazines Object + Object enableSimulation Boolean - soldierMagazines unit + entity enableSimulation state - $Code$soldierMagazines player ;[ - "6.5mm 30Rnd STANAG Mag(30/30)[id/cr:1/0](5x)", - "9mm 16Rnd Mag(16/16)[id/cr:7/0](2x)", - "RGO Frag Grenade(1/1)[id/cr:10/0](2x)", - "Smoke Grenade (White)(1/1)[id/cr:12/0](1x)", - "Smoke Grenade (Green)(1/1)[id/cr:13/0](1x)", - "Chemlight (Green)(1/1)[id/cr:14/0](2x)", - "Titan AT Missile(1/1)[id/cr:16/0](2x)" - ]$/Code$ + $Code$player enableSimulation false;$/Code$ - undefined / undefined + global / local + (15 July, 2009) + enableSimulation will "freeze" the unit, including animations, eye blinking, etc ; you cannot switchMove or playMove. + the unit can still take damages and report status and enemies by radio. + + (19 July, 2011) + Nou/Jaynus have discovered something quite important about the Arma2 engine: + Orient yourself to the enableSimulation command in ARMA 2: + If simulation is disabled on objects (this enablesimulation false), they do not send updates across the network, drastically reducing traffic across the network by an order of magnitude. What this means in practicality is that it is possible to have huge mission maker created cities with no or negligible impact on mission performance. Mission placed objects is the most common cause of performance woes - so this is huge news, and was previously undocumented, both on the BIS wiki and elsewhere. + There are some quirks. + While an object which has enableSimulation false set on it will take damage, it will not display any animations or damage states until enableSimulation is enabled back onto it. If you want to disable simulation on a unit and then show it as dieing once it is hit or damaged, add an eventhandler onto it which enables simulation on the object when it is hit or killed. Hit handler for best visual, killed handler for best performance. + This discovery will be the basis of a new unit caching script by Jaynus. + This also has importance in a technical sense: bandwith is the most significant factor in mission performance. The lower the server bandwith, the better the performance. + + (9 Sept, 2011) + Objects with disabled simulation are not calculated for lightsources beyond the global light (moon/sun), so any light sources you create will not light them. + + (12 Nov, 2011) + Contrary to Krause's suggestions above, using "this enableSimulation False" on static objects has no effect on a dedicated server's bandwidth usage or FPS (as per current 1.59 Release version). + + (8 May, 2012) + re: Homer. + Yep. That's because this functionality is now part of the basic arma netcode. Pretty nice :) + + (October 3, 2014) + Units with disabled simulation will not be affected by gravity. + + (October 21, 2014) + Units that have been previously subjected to enableSimulation false; or enableSimulationGlobal false; may stay unrecognised for a long time even after simulation was re-enabled, returning objNull as cursorTarget. Force revealing units with reveal command usually solves the problem. For example: $Code${ player reveal _x} forEach allUnits ;$/Code$ + + (May 23, 2015) + After using enableSimulation false or enableSimulationGlobal false on an object, setPos will still update its position across the network in MP. + + (December 2, 2015) + After using enableSimulation false or enableSimulationGlobal false on a vehicle (car, helo), don't forget to re-enable simulation on this vehicle before a player jumps into it. Otherwise, he will be stick in it, with a black screen and no way to escape! + + (February 5, 2016) + cursorTarget returns a null_object for objects with disabled simulation. But you can find them with other commands such nearEntities. + + (September 1, 2016) + Since Arma 3 1.56 the object can also be returned with cursorObject even if the simulation is not enabled - Array + Nothing + - someAmmo + pi - Check if unit has some ammo. + pi (180 degrees converted to Radians ). - https://community.bistudio.com/wiki/someAmmo + https://community.bistudio.com/wiki/pi - someAmmo Object + pi - someAmmo unitName + pi - $Code$? not (someAmmo _loon1) : hint "Loon1 is out of ammo!"$/Code$ + $Code$_radians = 2*pi + // Result is 6.2830$/Code$ undefined / undefined @@ -66624,203 +69219,163 @@ - Boolean + Number + - sort + backpackMagazines - Attempts to sort given array either in ascending ( true ) or descending ( false ) order. All array elements should be one of the following types: - String - array of strings (["a","b","c"...]) - Number - array of numbers ([1,2,3...]) - Array - array of subarrays ([["a",1,2],["b",3,4],["c",5,6]...]). Subarrays should be of the same structure. Subarray elements other than String or Number will be ignored during sorting. - Mixed arrays (["a",1,[true]...]) are not supported and results are undefined. + Get array with all magazines from backpack of the given unit. - https://community.bistudio.com/wiki/sort + https://community.bistudio.com/wiki/backpackMagazines - Array sort Boolean + backpackMagazines Object - array sort order + backpackMagazines unit - $Code$_arr = [5.21725,1.30859,4,5.03028,1]; - _arr sort true ; - hint str _arr; //[1,1.30859,4,5.03028,5.21725]$/Code$ - - $Code$_dev = ["ja","pa","pa","tram","tara"]; - _dev sort false ; - hint str _dev; //["tram","tara","pa","pa","ja"]$/Code$ - - $Code$#define ASC true - #define DESC false - _scores = [[123,"bob",15],[123,"bill",20],[200,"dave",21],[200,"steve",11]]; - _scores sort DESC; - hint str _scores; //[[200,"steve",11],[200,"dave",21],[123,"bob",15],[123,"bill",20]]$/Code$ - - $Code$// Sort buildings by distance and return position of the most distant building: - _buildings = player nearObjects ["Land_Cargo_Patrol_V1_F", 500]; - _buildings = _buildings apply { [_x distance player, _x] }; - _buildings sort false ; - hint format [ - "Most distant building is at %1, distance %2 m", - getPos (_buildings select 0 select 1), - round (_buildings select 0 select 0) - ];$/Code$ + $Code$backpackMagazines player ;[ + "Titan AT Missile(1/1)[id/cr:16/0](2x)" + ]$/Code$ undefined / undefined - (April 16, 2015) - The algorithm for sorting subarrays: compare 1st element, if equal compare 2nd, if equal compare 3rd...etc. - Nothing + Array + - soundVolume + stance - Check current sound volume (set by fadeSound ). + Returns the stance of the given unit. It can be one of: + "STAND" + "CROUCH" + "PRONE" + "UNDEFINED" (for example, swimming) + "" (on non-person object ) - https://community.bistudio.com/wiki/soundVolume + https://community.bistudio.com/wiki/stance - soundVolume + stance Object - soundVolume + stance unit - $Code$_vol = soundVolume$/Code$ + $Code$if ( stance player == "STAND") then { hint "I am standing!"};$/Code$ - undefined / undefined + global / undefined - Number + String + - spawn + wingsForcesRTD - Adds given code to the scheduler. Exactly when the code will be executed is unknown, it depends on how busy is the engine and how filled up is the scheduler. Therefore spawn does not wait for the supplied code to finish, instead, spawn returns a Script handle to the scheduler task. scriptDone command can be used to check the code completion. Additional arguments are passed to the code in local variable _this. Since Arma 3 v1.55 the script handle also exists inside the code in _thisScript variable. + Returns force produced by wings. - https://community.bistudio.com/wiki/spawn + https://community.bistudio.com/wiki/wingsForcesRTD - Any_Value spawn Code + wingsForcesRTD Object - arguments spawn code + wingsForcesRTD RTD_helicopter - $Code$_handle = [] spawn { player globalChat "Hello world!"};$/Code$ - - $Code$// There is no guarantee that spawned scripts will be executed in the same order they spawned: - for "_i" from 0 to 100 do - { - _null = _i spawn - { - diag_log _this; - }; - }; - // // Result: 51,1,2...49,50,0,52,53...100$/Code$ + $Code$_wingForce = wingsForcesRTD _rtdHelo$/Code$ undefined / undefined - (5 March, 2009) - spawn cannot call other local functions on the same scope as itself. - It can, however, call other global functions: - $Code$_addOne = {TST=TST+1}; - TST_addOne = {TST=TST+1}; - _add = { - TST=TST+1; - player sideChat format ["added: %1",TST]; - [] call _addOne; - player sideChat format ["called local: %1",TST]; - [] call TST_addOne; - player sideChat format ["called global: %1",TST]; - }; - TST=0; - [] call _add; - [] spawn _add;$/Code$ - The call of _addOne from the spawned function does not do anything. - - (October 21, 2014) - spawn requires a script handle when used in the 2D editor. (A3) - In scripts and in the debug console, it is not required, but very useful for keeping track of running scripts. Having a script handle also makes it easy to terminate scripts at any time. - Since spawn creates a new scheduled environment, having an excess of open threads can make the scheduler queue extremely long, significantly increasing the execution time of each thread. (it takes an extremely large amount of threads, though) - - (August 25, 2015) - If you want to call a local function which has NOT been created inside a spawned function, then do this: - $Code$_fncOne = { systemChat"This is _fncOne" }; _fncTwo = { call (_this select 0) }; [_fncOne] spawn _fncTwo;$/Code$ + (March 19, 2015) + Advanced helicopter flight model MUST be enabled for this function to work, otherwise it returns an empty array. + Returns a 3x3 two-dimensional array. In the editor while climbing in a little bird, it returned this: + [ [ 0.3993577, 11.72865, -30.21434 ], [ 0.3053164, 11.17272, -30.17695 ], [ 94.33984, 51.3513, -40.4908 ] ] - Script_Handle + Array + - speaker + getTerrainHeightASL - Returns the speaker of a person. + Returns the terrain height above the sea for the given position. - https://community.bistudio.com/wiki/speaker + https://community.bistudio.com/wiki/getTerrainHeightASL - speaker Object + getTerrainHeightASL Position2D/Position3D - speaker person + getTerrainHeightASL position - $Code$speaker player$/Code$ + $Code$_height = getTerrainHeightASL ( position player );$/Code$ + + $Code$_height = getTerrainHeightASL [5213,3245];$/Code$ + + $Code$_seadepth = abs ( getTerrainHeightASL getPos player ); // sea depth at players position;$/Code$ undefined / undefined + (June 6, 2017) + This command can usefully return the depth of water at the given position when in water. Note that the number it returns is the depth, albiet expressed as a negative number. Use abs to always return a positive number. See example 3 - String + Number + - speed + removeAllMusicEventHandlers - Object speed (in km/h). Returns relative speed of given object along Y axis. An equivalent to: 3.6 * ( velocityModelSpace _obj select 1) + Removes all music track event handlers of given type. - https://community.bistudio.com/wiki/speed + https://community.bistudio.com/wiki/removeAllMusicEventHandlers - speed Object + removeAllMusicEventHandlers String - speed object + removeAllMusicEventHandlers type - $Code$if ( speed _truck1 = 100) then { hint "You're going too fast!"};$/Code$ + $Code$removeAllMusicEventHandlers "MusicStart"$/Code$ + + $Code$removeAllMusicEventHandlers "MusicStop"$/Code$ undefined / undefined @@ -66828,482 +69383,438 @@ - Number + Nothing + - speedMode + posScreenToWorld - Returns speed mode of the group, which can be any of the following: - "LIMITED" - "NORMAL" - "FULL" + Convert screen coordinates in map to world coordinates. - https://community.bistudio.com/wiki/speedMode + https://community.bistudio.com/wiki/posScreenToWorld - speedMode Object/Group + Control posScreenToWorld Array - speedMode groupName + map posScreenToWorld [x, y] - $Code$_grpspeed1 = speedMode grp1$/Code$ + $Code$_WorldCoord = _Control posScreenToWorld _ScreenCoord$/Code$ + + $Code$_WorldCoord = _Control posScreenToWorld [_x,_y]$/Code$ undefined / undefined + (April 7, 2007) + Notes: + You can get the screen coordinates by the UI Event Handlers onMouseButtonDown, onMouseButtonUp, onMouseButtonClick, onMouseButtonDblClick. + The return Array is in 2-D, you can use it with all set-position commands. + _x = returnArray select 0; + _y = returnArray select 1; - String + Array + - splitString + magazinesAmmoCargo - An SQF version of C++ strtok. Splits given string str into an array of tokens according to given delimiters. In addition, if empty string "" is used for delimiters, str is split by each character. + Returns an array of subarrays with the type names and ammo left of all the vehicle's cargo or container magazines. - https://community.bistudio.com/wiki/splitString + https://community.bistudio.com/wiki/magazinesAmmoCargo - String splitString String + magazinesAmmoCargo Object - str splitString delimiters + magazinesAmmoCargo vehicle - $Code$_str = "- This, is a sample string." splitString "-,. "; // ["This","is","a","sample","string"] - _str joinString " "; // "This is a sample string"$/Code$ - - $Code$"\A3\ui_f\data\map\vehicleicons\iconLogic_ca.paa" splitString "\."; - // ["A3","ui_f","data","map","vehicleicons","iconLogic_ca","paa"]$/Code$ - - $Code$"1:2:3" splitString ":"; // ["1","2","3"]$/Code$ - - $Code$["test","test"] joinString toString [12345] splitString toString [12345]; // ["test","test"]$/Code$ - - $Code$"Japa is the best!" splitString "" joinString " "; // "J a p a i s t h e b e s t !"$/Code$ - - $Code$_cmd = currentMagazineDetail player ; //"9mm 16Rnd Mag(13/16)[id/cr:10000011/0]" - _cmd splitString "([ ]/:)"; //["9mm","16Rnd","Mag","13","16","id","cr","10000011","0"]$/Code$ + $Code$magazinesAmmoCargo vehicle player ;$/Code$ - $Code$// Remove all \r\n from file: - loadFile "somefile.txt" splitString toString [13,10] joinString " "$/Code$ + $Code$magazinesAmmoCargo uniformContainer player ;[ + ["30Rnd_65x39_caseless_mag",30], + ["30Rnd_65x39_caseless_mag",30], + ["Chemlight_green",1] + ]$/Code$ undefined / undefined - (May 17, 2016) - This command is unreliable/broken when it comes to some non-ASCII characters (as of Arma 3 1.58): - $Code$"Mörser" splitString "" - - ["M"," "," ","r","s","e","r"] - "Mörser" splitString "ö" - - ["M","rser"] - "Mörser" splitString "ä" - - ["M"," rser"]$/Code$ - - (October 17, 2016) - This commands works only with ASCII chars, any chars with codes 127, also used in different languages, will be converted to [" ", " "]. Use toArray to preserve special characters: - $Code$_spaced = toArray "Mörser" apply { toString [_x]} joinString " "; // M ö r s e r$/Code$ - Array + Array + - sqrt + setWaypointCompletionRadius - Returns square root of x. + The completion radius allows units to call the waypoint completed once they are inside of the given circle. - https://community.bistudio.com/wiki/sqrt + https://community.bistudio.com/wiki/setWaypointCompletionRadius - sqrt Number + Array setWaypointCompletionRadius Number - sqrt x + waypoint setWaypointCompletionRadius radius - $Code$_sq = sqrt 9; // Result is 3$/Code$ + $Code$[grp, 2] setWaypointCompletionRadius 30;$/Code$ undefined / undefined - (18:05, 24 August 2014 (EST)) - Alternatively use "x^0.5" or "x^(1/2)". $Code$_sq = 9^0.5; //Result is 3 - _sq = 9^(1/2); //Result is 3$/Code$ - You can use this method to get any root. - Cubed root = x^(1/3) or x^0.333[repeating]. - Root 4 = x^(1/4) or x^0.25. + (29 January 2010‎, 14:12) + The completion radius is currently important for units moving in the Combat mode. + With default completion radius = 0 the leader always finishes in the exact location of the waypoint. + By providing a completion radius you allow him to plan his road to a cover nearby instead. + This does not necessarily mean the waypoint is complete once they are inside of the circle. + The way it works now it is complete once unit is inside and does not think it would be reasonable to move any closer. - Number + Nothing + - squadParams + configSourceAddonList - Returns data about squad of given unit loaded from squad.xml. - All items in returned array are String. + Returns an array of addons ( CfgPatches ) in which the given config class is defined. - https://community.bistudio.com/wiki/squadParams + https://community.bistudio.com/wiki/configSourceAddonList - squadParams Object + configSourceAddonList Config - squadParams unit + configSourceAddonList config - $Code$_info = squadParams player ;$/Code$ + $Code$_addons = configSourceAddonList ( configFile "CfgVehicles" "Man"); + hint str _addons; // ["A3_Data_F","A3_Characters_F","A3_Data_F_Curator","A3_Air_F_Heli"]$/Code$ - global / undefined + undefined / undefined - (July 19, 2015) - Returns an empty array in singleplayer. - Array + Array + - stance + tvText - Returns the stance of the given unit. It can be one of: - "STAND" - "CROUCH" - "PRONE" - "UNDEFINED" (for example, swimming) - "" (on non-person object ) + Returns shown text in the item on given path. IDC means id of parent Tree View. - https://community.bistudio.com/wiki/stance + https://community.bistudio.com/wiki/tvText - stance Object + tvText Array + + Control tvText Array - stance unit + tvText [idc, path] + + control tvText path - $Code$if ( stance player == "STAND") then { hint "I am standing!"};$/Code$ + $Code$tvText [101, [0]];$/Code$ + + $Code$_ctrl tvText [0,0,0];$/Code$ - global / undefined + undefined / undefined + (Sep 11 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - String + String - String + - startLoadingScreen + animate - Shows loading screen with the given text, using the given resource. While loading screen is shown, simulation and scene drawing is disabled, user control is disabled, mouse cursor is hidden, scripts run at full speed. The loading screen does not end by itself and needs endLoadingScreen command, so make sure there is one at the end of loading operation. - NOTE: The game simulation is disabled during Loading Screen operation (at least in SP), therefore any use of sleep command will pause the game indefinitely. If you have to "sleep", use uiSleep - By default (if custom resource is not provided) startLoadingScreen will use "RscDisplayNotFreeze" resource. If you are using custom resource (could be also defined in description.ext ), the following resource's controls are supported by the engine: - idc = 101; - text (type = 0;) or picture (type = 48;). The text will be set to the text provided by the command param. - idc = 103; - progress (type = 8;) or animated texture (type = 45;). This control indicates global hardcoded mission loading progress and is useless after mission is loaded. - idc = 104; - progress (type = 8;). This control's progress is initially set to 0 and can be manipulated with progressLoadingScreen command. - - - https://community.bistudio.com/wiki/startLoadingScreen - - - startLoadingScreen Array - - - startLoadingScreen [text, resource] - - - $Code$startLoadingScreen ["Loading My Mission, please wait..."];$/Code$ - - $Code$startLoadingScreen ["Can't skip loading time...", "MyLoadingRsc"];$/Code$ - - $Code$startLoadingScreen ["Loading My Mission"]; - //Batch of code - //Batch of code - //Batch of code - progressLoadingScreen 0.5; - //Batch of code - //Batch of code - //Batch of code - endLoadingScreen ;$/Code$ - - - undefined / undefined - - - (July 15, 2009) - As it stops simulation as well as scene drawing, be sure not to put any sleep (or waitUntil if you are checking for in-game changes ; waitUntil for var initialization or script loading is ok) command between startLoadingScreen and endLoadingScreen. - - (January 18, 2010) - edit 10:15 : Whatever transparence you define in your own resource, there will be a black screen to cache loading. - It's up to you to choose a nice blue background :-) - Resource has to be defined in description.ext ; it must NOT be defined as RscTitles ! Here is an example : - Details anzeigen - $Code$ - // basic defines - // - class RscText - { - type = 0; - idc = -1; - x = 0; - y = 0; - h = 0.037; - w = 0.3; - style = 0x100; - font = Zeppelin32; - SizeEx = 0.03921; - colorText[] = {1,1,1,1}; - colorBackground[] = {0, 0, 0, 0}; - linespacing = 1; - }; - class RscPicture - { - access=0; - type=0; - idc=-1; - style=48; - colorBackground[]={0,0,0,0}; - colorText[]={1,1,1,1}; - font="TahomaB"; - sizeEx=0; - lineSpacing=0; - text=""; - }; - class RscLoadingText : RscText - { - style = 2; - x = 0.323532; - y = 0.666672; - w = 0.352944; - h = 0.039216; - sizeEx = 0.03921; - colorText[] = {0.543,0.5742,0.4102,1.0}; - }; - class RscProgress - { - x = 0.344; - y = 0.619; - w = 0.313726; - h = 0.0261438; - texture = "\ca\ui\data\loadscreen_progressbar_ca.paa"; - colorFrame[] = {0,0,0,0}; - colorBar[] = {1,1,1,1}; - }; - class RscProgressNotFreeze - { - idc = -1; - type = 45; - style = 0; - x = 0.022059; - y = 0.911772; - w = 0.029412; - h = 0.039216; - texture = "#(argb,8,8,3)color(0,0,0,0)"; - }; - // - // the loading screen itself - // - class Harrier_loadingScreen - { - idd = -1; - duration = 10e10; - fadein = 0; - fadeout = 0; - name = "loading screen"; - class controlsBackground - { - class blackBG : RscText - { - x = safezoneX; - y = safezoneY; - w = safezoneW; - h = safezoneH; - text = ""; - colorText[] = {0,0,0,0}; - colorBackground[] = {0,0,0,1}; - }; - class nicePic : RscPicture - { - style = 48 + 0x800; // ST_PICTURE + ST_KEEP_ASPECT_RATIO - x = safezoneX + safezoneW/2 - 0.25; - y = safezoneY + safezoneH/2 - 0.2; - w = 0.5; - h = 0.4; - text = "img\nicePic.paa"; - }; - }; - class controls - { - class Title1 : RscLoadingText - { - text = "$STR_LOADING"; // "Loading" text in the middle of the screen - }; - class CA_Progress : RscProgress // progress bar, has to have idc 104 + Activates given object animation. Animation is defined in CfgModels Animations class of model.cfg or another model config. Since Arma 3 v1.65.138459 speed of animation can be altered with coefficient. + To animate door of the house from example below: house animate ["Door_1_rot", 1]; + class Animations { - idc = 104; - type = 8; // CT_PROGRESS - style = 0; // ST_SINGLE - texture = "\ca\ui\data\loadscreen_progressbar_ca.paa"; - }; - class CA_Progress2 : RscProgressNotFreeze // progress bar that will go reverse + class Door_1_rot { - idc = 103; + type = rotation ; + source = Door_1_source ; + selection = Door_1 ; + axis = Door_1_axis ; + memory = 1 ; + minValue = 0.1 ; + maxValue = 1 ; + angle0 = 0 ; + angle1 = ( rad 110 ); }; - class Name2: RscText // the text on the top-left + class Door_Handle_1_rot_1 { - idc = 101; - x = 0.05; - y = 0.029412; - w = 0.9; - h = 0.04902; - text = ""; - sizeEx = 0.05; - colorText[] = {0.543,0.5742,0.4102,1.0}; - }; + type = rotation ; + source = Door_1_handle_source ; + selection = Door_Handle_1 ; + axis = Door_Handle_1_axis ; + memory = 1 ; + minValue = 0 ; + maxValue = 0.1 ; + angle0 = 0 ; + angle1 = ( rad - 50 ); }; }; - $/Code$ + Since model.cfg is not always available for reference, most animation names could also be obtained from animationNames command. Class names listed in CfgVehicles AnimationSources bound to "Proxy" controller can also be animated with animate command (see createVehicle/vehicles ): offroad animate ["HideBackpacks", 0]; + It is recommended that animateSource command is used instead of animate whenever is possible, as it is more efficient and optimised for MP + Mixing animateSource command with animate command to animate the same part may produce some undefined behaviour + + + https://community.bistudio.com/wiki/animate + + + Object animate Array + + + objectName animate [animationName, phase, speed] + + + $Code$_building animate ["maindoor", 1];$/Code$ + + $Code$_building animate ["Door_1_rot", 1, true ];$/Code$ + + $Code$// Create Offroad and add flashing police light bar: + offroad = "C_Offroad_01_F" createVehicle ( player getRelPos [5, 0]); + offroad animate ["HidePolice", 0]; + offroad animate ["BeaconsStart", 1];$/Code$ + + + global / global + + + (Aug 2007) + Animations can be used on existing game models such as houses that have doors eg. The general syntax is house animate ["dvere1",1] to 'open' the door and house animate ["dvere1",0] to 'close it'. Whether used on Oem addons, or official ones, an internal working knowledge (via config.cpp) of the model's animated name(s) is required. + 'open' and 'close' are visual perceptions of the state of the model, and are a design decision of the p3d. Open does not, necessarily mean, 1, and close does not mean 0. + '0' and '1' are better seen as FULLY_OFF and FULLY_ON + If a door is initially closed in the model, FULLY_ON, will open it. If it is initialy OPEN visually, in the model, FULLY_ON will close it. + initphase=1; (in config cpp) does not alter open and close meanings, all it does, is, set the model to the 'on' (rather than 'off') state to begin with. Whether on means open or close visually, is a p3d design decision. - (February 19, 2015) - Based on what Lou Montana has previously said, the simulation does become disabled upon using this command. If you wish to use a delay 'sleep' will not work. The work around would be to use 'uiSleep' + (June 2011) + Also, to animate the object called "Bar Gate" in ArmA, use the following: $Code$myGate animate ["Bargate",1]$/Code$ to close it, and $Code$myGate animate ["Bargate", 0]$/Code$ to open it. - (November 21, 2015) - In Arma 3 default loading screen has no control do display text. The description of the command now contains information what is needed to create custom loading screen resource. + (June 21, 2015) + With this command you can switch the offroad police lights on like this : + $Code$_vehicle animate ["BeaconsStart",1];$/Code$ + And switch it off : + $Code$_vehicle animate ["BeaconsStart",0];$/Code$ + + (February 16, 2016) + Aparently "Bargate" was exchainged with "Door_1_rot" + Doesen't work: + $Code$object animate ["Bargate", 0];$/Code$ + Works: + $Code$object animate ["Door_1_rot", 0];$/Code$ + + (March 14, 2016) + To animate bargate use animateSource : + $Code$bargate animateSource ["Door_1_source", 1];$/Code$ + + (November 25, 2017) + For pop-up targets, you can keep the target down (until you tell it to pop up) with: + $Code$target1 animate ["terc", 1];$/Code$ + When you're ready for the target to pop up, you can use: + $Code$target1 animate ["terc", 0];$/Code$ + With this setting, the target will return to its usual behavior of going down when hit and automatically popping back up again. To make the target stay down after being hit, add the following line: + $Code$target1 addEventHandler ["HitPart", {target1 animate ["terc", 1];}];$/Code$ - Nothing + Nothing + - step + commandRadio - Optionally can set step. If you want to count down, step must be specified, and set negative. Default value is 1. + Sends the audio message to the command radio channel. Must have assigned "ItemRadio" to send or receive the transmission. The message is defined in CfgRadio in the description.ext file or config radio protocol. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). + Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. - https://community.bistudio.com/wiki/step + https://community.bistudio.com/wiki/commandRadio - For_Type step Number + Object commandRadio String + + Array commandRadio String - for step stepSize + unit commandRadio radioName + + [side, identity] commandRadio radioName - $Code$for "_x" from 20 to 10 step -2 do {..code..}$/Code$ + $Code$_soldierOne commandRadio "messageOne";$/Code$ + + $Code$player commandRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ + + $Code$[ west, "Base"] commandRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ - undefined / undefined + global / local + (June 24, 2010) + example: $Code$ _unit commandRadio "SentCmdHide";$/Code$ + radio command from CA_Dubbing config should work + + (December 3, 2016) + To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: + $Code$ player commandRadio "#MySound.ogg";$/Code$ - For_Type + Nothing - Nothing + - stopEngineRTD + getRelPos - Instant engines stop. + Returns position, which is given distance and relative direction away from original object. - https://community.bistudio.com/wiki/stopEngineRTD + https://community.bistudio.com/wiki/getRelPos - stopEngineRTD Object + Object getRelPos Array - stopEngineRTD heli + object getRelPos [distance, direction] - $Code$stopEngineRTD myHeli$/Code$ + $Code$// Find position 100 metres away at player's 3 o'clock: + _relpos = player getRelPos [100, 90];$/Code$ - undefined / undefined + global / undefined + getPos vs getRelPos: getRelPos operates similarly to getPos except in getRelPos the direction is calculated 'relative' to the current object direction whereas getPos's direction is from North. Thus while getPos can take a position array as it's starting point, getRelPos requires an object with its own azithmus heading. + + (3 March, 2016) - Array + Array + - stop + triggerAttachedVehicle - Stop AI unit. Stopped unit will not be able to move, fire, or change its orientation to follow a watched object. It may still change the stance if deemed appropriate (e.g. under fire). Use disableAI to disable specific AI capabilities. + Returns vehicle attached to the trigger (for example using triggerAttachVehicle ). + Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. - https://community.bistudio.com/wiki/stop + https://community.bistudio.com/wiki/triggerAttachedVehicle - Object stop Boolean + triggerAttachedVehicle Object - unitName stop toggle + triggerAttachedVehicle trigger - $Code$loon1 stop true$/Code$ + $Code$return = triggerAttachedVehicle triggerName;$/Code$ - local / global + global / local - (January 6, 2011) - This command appears to be local only. - Nothing + Object + - stopped + addMenu - Check if unit is stopped by stop command. + Adds a new menu button. Priority is optional. + i + Some Old Editor Command - https://community.bistudio.com/wiki/stopped + https://community.bistudio.com/wiki/addMenu - stopped Object + Control addMenu Array - stopped unitName + map addMenu [text,priority] - $Code$? (stopped _loon1) : hint "Loon1 is stopped"$/Code$ + $Code$example$/Code$ undefined / undefined @@ -67311,170 +69822,190 @@ - Boolean + Number + - str + removeWeapon - Converts any value into a string by placing " and " around the argument. Since Arma 3 v1.63.137891 this command will correctly escape all " inside a string: - $Code$// Before the fix: - hint str "string "" string"; // "string " string" - invalid string - call compile str "string "" string"; // ERROR - // After the fix: - hint str "string "" string"; // "string "" string" - valid string - call compile str "string "" string"; // OK - $/Code$ - When used on object, object debug name is returned. + Remove weapon from a unit. The unit must be local to the computer where command is executed. For a global version of this command see removeWeaponGlobal. + Note : It is possible to create invalid combinations with this command (ie, attempting to remove a weapon that a unit does not possess). When doing so, application behaviour is undefined. - https://community.bistudio.com/wiki/str + https://community.bistudio.com/wiki/removeWeapon - str Anything + Object removeWeapon String - str value + unit removeWeapon weapon - $Code$_s = str (2 + 3); - // The value of _s is the string "5"$/Code$ + $Code$player removeWeapon "BAF_L85A2_RIS_SUSAT";$/Code$ - $Code$a = []; - ac = 0; - while {ac 5} do { - ac = count a; - a set [ac, format ["Index %1", ac]]; - }; - hintSilent str a; - // Hints all of ["Index 0","Index 1","Index 2","Index 3","Index 4"] including brackets, quotes and commas.$/Code$ + $Code$An_2 removeWeapon "M240_veh";$/Code$ + + + local / global + + + (May 27, 2009) + CTD may occur in certain conditions: when shooter is AI and is currently shooting at target in some proximity (tested with M136 on ACE 1.08 and Compact Fix 1.14H+). Even "dropweapon" action may cause CTD with AI. + + + Nothing + + + + + + keyName + + + Returns the name of a button (on the keyboard, mouse or joystick) with the given code. + + + https://community.bistudio.com/wiki/keyName + + + keyName Number + + + keyName dikCode + + + $Code$_name = keyName 28; //result is "Enter"$/Code$ undefined / undefined - (September 29, 2009) - When applied to a unit, this returns the variable name that was assigned to the unit in the editor. For example, if you have created a playable unit with the name 'thePlayer' then you can use 'str player' to return "thePlayer"; - - (December 5, 2014) - If you try to count string, the added quotations marks are valid characters and will be counted. - - (July 15, 2017) - If you want to make empty string with str that doesn't have any quotation marks, but is still a String you can use text : - $Code$ str ""; // "" - count str ""; // 2 - str text ""; // - count str text ""; // 0$/Code$ - String + String + - sunOrMoon + taskHint - Returns the sun to moon transition state in range 0...1 + Shows info about new, changed or failed task. The text can contain several lines. \n is used to indicate the end of a line. + To maintain Arma 3 visual style, it's recommended to use BIS_fnc_showNotification instead. - https://community.bistudio.com/wiki/sunOrMoon + https://community.bistudio.com/wiki/taskHint - sunOrMoon + taskHint Array - sunOrMoon + taskHint [hintText, [r, g, b, a], icon] - $Code$_transitionState = sunOrMoon ;$/Code$ + $Code$taskhint ["Task failed!\nBad job!", [1, 0, 0, 1], "taskFailed"]$/Code$ undefined / undefined - (September 21, 2014) - Note that at a 0.99 value, the twilight is still quite dark. - Can be tested with : - $Code$//test - onEachFrame - { - systemchat format ["%1",sunOrMoon]; - };$/Code$ - - (May 18, 2017) - As of Arma 3 1.7, this returns either 1 for sun or 0 for moon. Nothing in between. + Here are the BIS colors: + $Code$ + taskHint ["New Task!\nHere's your new task!", [1, 1, 1, 1], "taskNew"]; + taskHint ["Task Assigned!\nDo this now!", [1, 1, 1, 1], "taskCurrent"]; + taskHint ["Task Succeeded!\nGood job!", [0.600000,0.839215,0.466666,1], "taskDone"]; + taskHint ["Task Failed!\nBad job!", [0.972549,0.121568,0,1], "taskFailed"]; + taskHint ["Task Canceled!\nNever mind!", [0.75,0.75,0.75,1], "taskFailed"]; + $/Code$ - Number + Nothing + - supportInfo + disableNVGEquipment - Creates a list of supported operators and type. Each field of array has the format: "x:name" Where x can be: - 't' - type - 'n' - null operator - 'u' - unary operator - 'b' - binary operator. - 'name' is the operator or type name (in case operator, type of input operands is included). - mask parameter can be an empty string, or one of field. In this case, function returns empty array, if operator is not included in the list. Limited wildcard support is available. Type x may be replaced with *, meaning all types. For the mask partial match may be used, like abc*, meaning any operators starting with 'abc' are reported, for example: *:name, t:*, t:name* or *:*. + Enables or disables transport NV (Night Vision). To disable TI (Thermal Imaging) use disableTIEquipment. - https://community.bistudio.com/wiki/supportInfo + https://community.bistudio.com/wiki/disableNVGEquipment - supportInfo String + Object disableNVGEquipment Boolean - supportInfo mask + vehicle disableNVGEquipment state - $Code$supportInfo "b:select*"; //Returns ["b:ARRAY select SCALAR","b:ARRAY select BOOL","b:CONFIG select SCALAR"]$/Code$ - - $Code$// Return all available commands: - _commands = supportInfo "";$/Code$ + $Code$myTank disableNVGEquipment true ;$/Code$ + + + global / global + + + + + Nothing + + + + + + blufor + + + Pre-defined variable for the blufor side. + Alias for west. + + + https://community.bistudio.com/wiki/blufor + + + blufor + + + blufor + + + $Code$if ( side player == blufor ) then { + hint "BLUFOR"; + };$/Code$ undefined / undefined - (July 22nd, 2012) - With CBA one can create a list of all available SQF commands in the RPT - [supportInfo ""] call cba_fnc_debug; - One can get CBA here. - - (September 24, 2014) - To get the list of all supported commands in Arma 3 one can simply: - $Code${ diag_log _x} forEach supportInfo "";$/Code$ - Array + Side + - suppressFor + shownGPS - Force suppressive fire from the unit. + Checks if client has GPS reciever enabled in description.ext ( showGPS param) or force enabled with showGPS command. - https://community.bistudio.com/wiki/suppressFor + https://community.bistudio.com/wiki/shownGPS - Object suppressFor Number + shownGPS - unit suppressFor duration + shownGPS - $Code$_soldier1 suppressFor 10 - // Will force soldier1 to do suppressive fire to known enemies during 10 seconds$/Code$ + $Code$if ( shownGPS ) then { hint "You have GPS reciever enabled"};$/Code$ undefined / undefined @@ -67482,61 +70013,57 @@ - Nothing + Boolean + - surfaceIsWater + addLiveStats - Returns whether water is at given position. + Adds score to the Xbox Live Statistics score for the given unit (or the commander unit of the given vehicle). (Also available in OFPE & VBS2) - https://community.bistudio.com/wiki/surfaceIsWater + https://community.bistudio.com/wiki/addLiveStats - surfaceIsWater Array + Object addLiveStats Number - surfaceIsWater position + unit addLiveStats score - $Code$_isWater= surfaceIsWater [1000, 3000];$/Code$ - - $Code$_isWater = surfaceIsWater position player ;$/Code$ + $Code$player addLiveStats 10$/Code$ undefined / undefined - (4 May, 2012) - Does not work with inland water. Works only with sea water. - Boolean + Nothing + - surfaceNormal + ctrlSetForegroundColor - Returns surface normal on given position. + Sets foreground color of given control. Color is in format Color. - https://community.bistudio.com/wiki/surfaceNormal + https://community.bistudio.com/wiki/ctrlSetForegroundColor - surfaceNormal Array + Control ctrlSetForegroundColor Array - surfaceNormal position + control ctrlSetForegroundColor color - $Code$_normal = surfaceNormal [300, 500];$/Code$ - - $Code$_normal = surfaceNormal position player ;$/Code$ + $Code$_control ctrlSetForegroundColor [1, 0, 0, 1]$/Code$ undefined / undefined @@ -67544,349 +70071,263 @@ - Array + Nothing + - surfaceType + setSimpleTaskType - Returns what surface type is at the given position. - See the spoiler for surface types: - Details anzeigen - A3 1.28: - "#GdtStratisConcrete" - "#GdtStratisDryGrass" - "#GdtStratisGreenGrass" - "#GdtStratisRocky" - "#GdtStratisForestPine" - "#GdtStratisBeach" - "#GdtStratisDirt" - "#GdtVRsurface01" - "#GdtDirt" - "#GdtGrassGreen" - "#GdtGrassDry" - "#GdtSoil" - "#GdtThorn" - "#GdtStony" - "#GdtConcrete" - "#GdtMarsh" - "#GdtBeach" - "#GdtSeabed" - "#GdtDead" - A3 1.66: - "#Default" - "#Water" - "#SurfRoadDirt" - "#SurfRoadConcrete" - "#SurfRoadTarmac" - "#SurfWood" - "#SurfMetal" - "#SurfRoofTin" - "#SurfRoofTiles" - "#SurfIntWood" - "#SurfIntConcrete" - "#SurfIntTiles" - "#SurfIntMetal" - "#SurfWater" - "#TEST_SurfNormal" - "#GdtStratisConcrete" - "#GdtStratisBeach" - "#GdtStratisDirt" - "#GdtStratisSeabedCluttered" - "#GdtStratisSeabed" - "#GdtStratisDryGrass" - "#GdtStratisGreenGrass" - "#GdtStratisRocky" - "#GdtStratisThistles" - "#GdtStratisForestPine" - "#GdtRubble" - "#GdtForestPine" - "#GdtConcrete" - "#GdtSoil" - "#GdtBeach" - "#GdtRock" - "#GdtDead" - "#GdtDirt" - "#GdtDesert" - "#GdtGrassGreen" - "#GdtGrassDry" - "#GdtGrassWild" - "#GdtWeed" - "#GdtWildField" - "#GdtThorn" - "#GdtStony" - "#GdtStonyThistle" - "#GdtMud" - "#GdtMarsh" - "#GdtSeabed" - "#concrete" - "#concrete_out" - "#concrete_inside" - "#dirtrunway" - "#road" - "#floor" - "#floor_inside" - "#carpet_inside" - "#carpet" - "#mud" - "#concrete_hall" - "#stones" - "#cardboard" - "#lino" - "#steel" - "#trash" - "#parquet" - "#sand" - "#metalPlate" - "#woodenFloor" - "#planks" - "#planks_inside" - "#grid" - "#rubble" - "#BuildingRubble" - "#tiling" - "#wavyMetal" - "#GdtVRsurface01" - "#surf_metal" - "#surf_roadconcrete" - "#surf_roaddirt" - "#surf_roadtarmac" - "#surf_rooftiles" - "#surf_rooftin" - "#surf_wood" - "#surfint_concrete" - "#surfint_metal" - "#surfint_tiles" - "#surfint_wood" - "#road_exp" - "#sand_exp" - "#SurfRoadDirt_exp" - "#SurfRoadConcrete_exp" - "#SurfRoadTarmac_exp" - "#SurfTrailDirt_exp" - "#concrete_exp" - "#concrete_in_exp" - "#concrete_hall_exp" - "#floor_exp" - "#floor_in_exp" - "#stones_exp" - "#planks_in_exp" - "#planks_exp" - "#softwood_in_exp" - "#steel_exp" - "#metalPlate_exp" - "#metalPlatePressed_exp" - "#metalPlate_in_exp" - "#grid_exp" - "#wavyMetal_exp" - "#carpet_exp" - "#carpet_in_exp" - "#mat_in_exp" - "#mud_exp" - "#straw_exp" - "#cardboard_exp" - "#lino_in_exp" - "#lino_exp" - "#roof_tiles_exp" - "#trash_exp" - "#rubble_exp" - "#BuildingRubble_exp" - "#GdtGrassShort" - "#GdtGrassTall" - "#GdtGrassLong" - "#GdtVolcanoBeach" - "#GdtRedDirt" - "#GdtAsphalt" - "#GdtField" - "#GdtForest" - "#GdtVolcano" - "#GdtCliff" + Attach type to the simple task. See Default Task Types. + + + https://community.bistudio.com/wiki/setSimpleTaskType + + + Task setSimpleTaskType String + + + task setSimpleTaskType taskType + + + $Code$( currentTask player ) setSimpleTaskType "attack";$/Code$ + + + undefined / undefined + + + + + Nothing + + + + + + tvDelete + + + Removes an item with given Tree View Path from Tree View. The paths of other items on the same branch are updated accordingly and may change. - https://community.bistudio.com/wiki/surfaceType + https://community.bistudio.com/wiki/tvDelete - surfaceType Array + tvDelete Array + + Control tvDelete Array - surfaceType position + tvDelete [idc, path] + + control tvDelete path - $Code$_surface = surfaceType [4500, 4500];$/Code$ + $Code$tvDelete [101, [0, 0]];$/Code$ - $Code$_surface = surfaceType position player ;$/Code$ + $Code$_ctrl tvDelete [0, 0];$/Code$ - undefined / undefined + local / local - (February 05, 2010) - In ArmA 2 returned value is "#UTGRASS" for natural surface and "#UTCONCRETE" for urban surface. - - (December 16, 2006) - Only seems to return either "#GRASSSOUTH" or "#GRASSGENERAL", even when you're in a building or in water. - - (December 30, 2006) - Another returned value is "#SANDGENERAL". However, when providing an exact [x,y] position the "surfaceType" function seems to return the general surface type of the environment rather than the exact type on that given position. + (Sep 11 2014) + (A3 1.28)tv command fmily overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - String + Nothing - Nothing + - swimInDepth + activatedAddons - Sets the target depth level for swimming soldier. Depth should be a negative number. + Returns a list of all activated addons. - https://community.bistudio.com/wiki/swimInDepth + https://community.bistudio.com/wiki/activatedAddons - Object swimInDepth Number + activatedAddons - unit swimInDepth value + activatedAddons - $Code$soldier swimInDepth -20;$/Code$ - - $Code$bob swimInDepth -10; - bob doMove ASLToAGL getPosASL player ;$/Code$ + $Code$_addons = activatedAddons ;$/Code$ undefined / undefined - (June 13, 2017) - Doesn't work with animals. + (March 28, 2014) + This command can return a large array, often too large to be diag_log'd or hinted. At the time of writing, my game returned an array with 389 elements. The code below will ignore all the BI addons (they start with a3_) and writes the rest (ie, all your custom addons) to the RPT. + $Code${ if (! (["a3_", _x] call BIS_fnc_inString )) then { diag_log _x;} } forEach activatedAddons ;$/Code$ - Nothing + Array + - switchAction + deleteGroup - When used on a person, the given action is started immediately (there is no transition). Use switchmove "" to switch back to the default movement if there is no transition back, otherwise the person may be stuck. + Destroys the given group. Group must be empty and local to the machine executing command. + NOTE: In Arma 3 you can find out locality of the group with local command, unlike with previous games. However owner and setOwner dont work with groups anywhere. The group will always be local to the client that created it, until the client disconnects, then the group becomes local to the server. + In Arma 3 when last unit leaves a group, the group gets auto deleted. Manually deleting all units from a group however, does not auto delete the empty group. To force the group to get auto-deleted when empty use deleteGroupWhenEmpty - https://community.bistudio.com/wiki/switchAction + https://community.bistudio.com/wiki/deleteGroup - Object switchAction String + deleteGroup Group - soldier switchAction action + deleteGroup group - $Code$soldierOne switchAction "SitDown"$/Code$ + $Code$deleteGroup _groupname$/Code$ - undefined / undefined + local / global + (December 17, 2006) + The deleteGroup Command does not work when there are living members of in the group. It doesn't error, it simply doesn't do anything. + + (07:50, 10 July 2007 (CEST)) + Living or not doesn't matter - you can't delete the group while it contains any units - even dead ones. It takes few seconds until a dead unit is automatically removed from its group. + + (September 12, 2013) + deleteGroup will only delete local groups even if called by server. Say we have a situation where client creates a group and puts a unit there and later unit dies\gets deleted, server will not be able to delete that empty group until client leaves the game and group ownership switches to server - Nothing + Nothing + - switchGesture + then - When used on a person,the given move is started immediately (there is no transition). + First or second element of array is executed depending on result of if condition. Result of the expression executed is returned as a result (result may be Nothing ). - https://community.bistudio.com/wiki/switchGesture + https://community.bistudio.com/wiki/then - Object switchGesture String + If_Type then Code/Array - soldier switchGesture moveName + if then else - $Code$soldierOne switchGesture "Wave";$/Code$ + $Code$if (a b) then { c = 1 };$/Code$ + + $Code$if (a b) then { + c = 1; + } else { + c = 2; + }; + hint str c;$/Code$ undefined / undefined - (August 31, 2010) - Rpt says "Not implemented" as of OA 1.54. + Any variables you declare within the body of an if /then statement (ie between the curly braces) are local to that 'if' statement, and are destroyed at the end of the statement. If you know you want to use the variable outside the 'if' statement, make sure your declare it before the 'if' statement. - Nothing + Anything + - switchableUnits + getForcedFlagTexture - Returns a list of playable units available for switching to. Command is relative to the client on which it is executed and will only show playable units for the same side as player 's group + player himself. The playableUnits command on the other hand will show all playable units regardless of the side. Exception is SP, where playable units from all sides will be accessible via this command. Dead units are automatically removed from the resulting array. Playable units that are already occupied by other human players will also not show in the results. - NOTE that in Multiplayer, switchableUnits are only available when respawn type is set to SIDE or GROUP. In all other cases it is an empty array []. + A getter for forceFlagTexture. Forced texture is different from your normal flag texture, which can be retrieved with flagTexture - https://community.bistudio.com/wiki/switchableUnits + https://community.bistudio.com/wiki/getForcedFlagTexture - switchableUnits + getForcedFlagTexture Object - switchableUnits + getForcedFlagTexture object - + $Code$getForcedFlagTexture player ;$/Code$ + - undefined / local + undefined / undefined - (July 06, 2011) - On dedicated server this command returns empty array. - Array + String + - switch + locationNull - Creates a switch type that can be used inside a switch do -block + A non-existing Location. To compare non-existent locations use isNull or isEqualTo : + locationNull == locationNull ; // false + isNull locationNull ; // true + locationNull isEqualTo locationNull ; // true - https://community.bistudio.com/wiki/switch + https://community.bistudio.com/wiki/locationNull - switch Anything + locationNull - switch arg + locationNull - $Code$_mySwitch = switch "Test"; - _mySwitch do {/*Something*/};$/Code$ + $Code$! isNull locationNull ; // false$/Code$ - $Code$switch (_a) do { case 1 : { /*...code...*/ }; case 2 : { /*...code...*/ }; default { /*...code...*/ }; }; switch (_condition) do { - case 1: { hint "1" }; - case 2: { hint "2" }; - default { hint "default" }; - }; switch (_condition) do { - case "string1"; - case "string2": { hint "string1 or string2" }; - case "string3"; - case "string4": { hint "string3 or string4" }; - default { hint "default" }; - };$/Code$ + $Code$str locationNull ; // No location$/Code$ + + $Code$position locationNull ; // [0,0,0]$/Code$ undefined / undefined @@ -67894,467 +70335,447 @@ - Switch_Type + Location + - switchCamera + enableDebriefingStats - Switch camera to given vehicle / camera. Mode is one of: - "INTERNAL" : 1st person - "GUNNER" : optics / sights - "EXTERNAL" : 3rd person - "GROUP" : group - "CARGO" : same as "INTERNAL" - If you switch to a unit in a vehicle, this command uses the correct turret. Control over the unit is not given to the player. Use selectPlayer or a combination of switchCamera and remoteControl to achieve this. + enable debrifing score table. - https://community.bistudio.com/wiki/switchCamera + https://community.bistudio.com/wiki/enableDebriefingStats - Object switchCamera String - - switchCamera Object + enableDebriefingStats Array - target switchCamera mode - - switchCamera target + enableDebriefingStats [left, top, width, height] - $Code$player switchCamera "Gunner";$/Code$ - - $Code$vehicle player switchCamera "External";$/Code$ + $Code$enableDebriefingStats [0.1, 0.1, 0.8, 0.8];$/Code$ undefined / undefined - (May 16, 2015) - Force top down view: $Code$cam = "Land_HandyCam_F" createVehicleLocal [0,0,0]; - cam hideObject true ; - cam attachTo [ player, [0,0,10]]; - cam setVectorUp [0,0.99,0.01]; - cam switchCamera "Internal"; - findDisplay 46 displayAddEventHandler ["MouseButtonDown", { - if (_this select 1 == 0) then { - player forceWeaponFire [ currentMuzzle player, currentWeaponMode player ]; - }; - false - }]; - findDisplay 46 displayAddEventHandler ["KeyDown", { - if (_this select 1 in actionKeys "ReloadMagazine") then { - reload player ; - }; - false - }];$/Code$ - Nothing - Nothing + Nothing + - switchLight + str - Controls whether a lamp is lit or not. For working with CfgNonAIVehicles class "StreetLamp" only. + Converts any value into a string by placing " and " around the argument. Since Arma 3 v1.63.137891 this command will correctly escape all " inside a string: + $Code$// Before the fix: + hint str "string "" string"; // "string " string" - invalid string + call compile str "string "" string"; // ERROR + // After the fix: + hint str "string "" string"; // "string "" string" - valid string + call compile str "string "" string"; // OK + $/Code$ + When used on object, object debug name is returned. - https://community.bistudio.com/wiki/switchLight + https://community.bistudio.com/wiki/str - Object switchLight String + str Anything - lamp switchLight mode + str value - $Code$( object 12345) switchLight "off"$/Code$ - - $Code$nearestObject [player, "Streetlamp"] switchLight "OFF"$/Code$ + $Code$_s = str (2 + 3); + // The value of _s is the string "5"$/Code$ - $Code$if ( count allMissionObjects "StreetLamp" == 0) then { - hint "Objects compatible with 'switchLight' are not found."; - } else { - hint "'switchLight' compatible objects are found!"; - };$/Code$ + $Code$a = []; + ac = 0; + while {ac 5} do { + ac = count a; + a set [ac, format ["Index %1", ac]]; + }; + hintSilent str a; + // Hints all of ["Index 0","Index 1","Index 2","Index 3","Index 4"] including brackets, quotes and commas.$/Code$ undefined / undefined - (January 23, 2010) - If you want turn street lamp off in ArmA2, the syntax is: - ID959522=position player nearestObject 959522 - ID959522 switchLight "off" + (September 29, 2009) + When applied to a unit, this returns the variable name that was assigned to the unit in the editor. For example, if you have created a playable unit with the name 'thePlayer' then you can use 'str player' to return "thePlayer"; - (September 16, 2013) - In ArmA3 use setHit instead: - $Code$_lamp = nearestObject [ player, "Lamps_base_F"]; - _lamp setHit ["light_1_hitpoint", 0.97]; //off - _lamp setHit ["light_1_hitpoint", 0]; //on$/Code$ - Switch all lights off in the 500 radius of player: - $Code${ - for "_i" from 0 to count getAllHitPointsDamage _x - 1 do - { - _x setHitIndex [_i, 0.97]; - }; - } - forEach nearestObjects - [ - player, - [ - "Lamps_base_F", - "PowerLines_base_F", - "PowerLines_Small_base_F" - ], - 500 - ];$/Code$ + (December 5, 2014) + If you try to count string, the added quotations marks are valid characters and will be counted. + + (July 15, 2017) + If you want to make empty string with str that doesn't have any quotation marks, but is still a String you can use text : + $Code$ str ""; // "" + count str ""; // 2 + str text ""; // + count str text ""; // 0$/Code$ - Nothing + String + - switchMove + configSourceMod - When used on a person, the given move is started immediately (there is no transition). Use switchmove "" to switch back to the default movement if there is no transition back, otherwise the person may be stuck. - List of moves in ArmA 2 - List of moves in Armed Assault - List of moves in Operation Flashpoint: Resistance + Returns modDir of the mod that given config class was loaded from. - https://community.bistudio.com/wiki/switchMove + https://community.bistudio.com/wiki/configSourceMod - Object switchMove String + configSourceMod Config - person switchmove movename + configSourceMod config - $Code$_loon1 switchMove "FXStandDip"$/Code$ + $Code$configSourceMod ( configFile "CfgVehicles" "Heli_Transport_04_base_F"); //Returns "heli"$/Code$ + + $Code$configSourceMod ( configFile "CfgVehicles" "Car"); //Returns "A3"$/Code$ - global / local + undefined / undefined - (March 25, 2007) - In some cases the movement won't stay. I.e. AI hostages that put their hands behind their heads (_hostage switchMove "AmovPercMstpSsurWnonDnon") won't hold their hands up, unless you first use disableAI "autoTarget" on them. They mostly put their hands down because they 'noticed' unknown objects. - - (August 03, 2008) - This command will not cause an AnimChanged or AnimDone event. However, playMove will. - - (November 12, 2016) - When using this command on the player unit outside unscheduled UI contexts, it will cause a minor camera glitch for a single frame. - For example, Draw3D and KeyDown are UI contexts and so are not affected by the glitch, but EachFrame and scheduled scripts are not UI contexts and are affected by the glitch. - Nothing + String + - synchronizeObjectsAdd + camCommitted - Add given objects to the unit's list of synchronized objects. + Checks if the conduction of the last camCommit call already finished. - https://community.bistudio.com/wiki/synchronizeObjectsAdd + https://community.bistudio.com/wiki/camCommitted - Object synchronizeObjectsAdd Array + camCommitted Object - unit synchronizeObjectsAdd [objects] + camCommitted camera - $Code$_acm = _groupLogic createUnit ["AmbientCombatManager",position player,[],0,"NONE"]; - _acm synchronizeObjectsAdd [player];$/Code$ + $Code$// SQS: + ; create a camera object + _cam = "camera" camCreate [5600,4800,10] + _cam camSetTarget player + _cam cameraEffect ["internal", "BACK"] + _cam camCommit 0 + ; smoothly move the camera to its new position in 6 seconds + _cam camSetPos [5680,4720,20] + _cam camCommit 6 + @ camCommitted _cam + ; proceed$/Code$ - global / global + undefined / undefined - Nothing + Boolean + - synchronizeObjectsRemove + enableDynamicSimulationSystem - Remove given objects from the unit's list of synchronized objects. + Enables or disables the whole Arma_3_Dynamic_Simulation system - https://community.bistudio.com/wiki/synchronizeObjectsRemove + https://community.bistudio.com/wiki/enableDynamicSimulationSystem - Object synchronizeObjectsRemove Array + enableDynamicSimulationSystem Boolean - unit synchronizeObjectsRemove [objects] + enableDynamicSimulationSystem enable - + $Code$enableDynamicSimulationSystem true ;$/Code$ + - global / global + undefined / undefined - Nothing + Nothing + - synchronizeTrigger + underwater - Synchronizes the trigger with zero or more waypoints. + Return whether object is fully underwater. From Arma 3 v1.66, this also works for units. - https://community.bistudio.com/wiki/synchronizeTrigger + https://community.bistudio.com/wiki/underwater - Object synchronizeTrigger Array + underwater Object - trigger synchronizeTrigger [waypoint1, waypoint2,] + underwater object - $Code$_trigger synchronizeTrigger []$/Code$ - - $Code$_trigger synchronizeTrigger [_waypoint1]$/Code$ + $Code$_isUnderwater = underwater player ;$/Code$ - $Code$_trigger synchronizeTrigger [_waypoint1, [_group5, 7], _waypoint3]$/Code$ + $Code$_isUnderwater = eyePos player select 2 0;$/Code$ undefined / undefined + (February 2, 2017) + This is still quite buggy and not always reliable. Code in Example 2 is a good alternative. - Nothing + Boolean + - synchronizeWaypoint + shownPad - Synchronizes the waypoint with other waypoints. Each waypoint is given as an array [group, index]. + Checks if client has Notepad enabled. - https://community.bistudio.com/wiki/synchronizeWaypoint + https://community.bistudio.com/wiki/shownPad - Array synchronizeWaypoint Array + shownPad - waypoint synchronizeWaypoint [waypoint1, waypoint2,] + shownPad - $Code$[_group1, 2] synchronizeWaypoint [ [_group2, 3] ];$/Code$ + $Code$if ( shownPad ) then { hint "You have Notepad enabled."};$/Code$ undefined / undefined - (March 31, 2008) - To 'unsynchronize' a waypoint use: Waypoint synchronizeWaypoint [] - Nothing + Boolean + - synchronizedObjects + daytime - Return the list of objects synchronized with the given unit. + Returns the current ingame time in hours. - https://community.bistudio.com/wiki/synchronizedObjects + https://community.bistudio.com/wiki/daytime - synchronizedObjects Object + daytime - synchronizedObjects unit + daytime - $Code$_objects = synchronizedObjects _logic;$/Code$ + $Code$; assumme it is 16:30 + _daytime = daytime + returns 16.5$/Code$ - local / undefined + undefined / undefined - This command only returns the LEADER of a vehicle that is synchronized. You have to use the "vehicle" - command to select the actual vehicle. - This command only returns the synchronized objects when used on intelligent objects such as units or - logic objects. All other objects returns an empty array. - In MP this command returns only values when the object is local. otherwise it returns an empty array. - - (February 26, 2015) - When returning the synchronized objects, they are returned in the order that they were placed on the map - - (October 27, 2016) - In Eden you can synchronize both units and their vehicles separately by syncing the gamelogic (or whatever) to the vehicle itself, and then the driver (or whatever other passengers) of the vehicle. To use an entire group, just sync all units within that group to the gamelogic (not just the leader or group icon). By doing this you can execute commands on each unit in a group and just the crew/single unit of a vehicle, or just the vehicle and not the crew, or both the vehicle and the crew. + (September 23, 2014) + To change daytime To 24 hour format with hours, minutes, and seconds use this: + $Code$// daytime = 1.66046 + _hour = floor daytime ; + _minute = floor (( daytime - _hour) * 60); + _second = floor ((((( daytime ) - (_hour))*60) - _minute)*60); + _time24 = text format ["%1:%2:%3",_hour,_minute,_second]; + //_time24 = 1:39:37$/Code$ + Note: Not perfect method, "12:03:06" will display as "12:3:6", more script needed to remove this. Other methods might exist for basic functionality. - Array + Number + - synchronizedTriggers + getBleedingRemaining - Returns the list of triggers synchronized with a given waypoint. + Returns how many seconds injured unit will continue leaving blood trail. If unit damage is 0.1, the return value is 0 and unit doesn't leave any blood trail. Use setBleedingRemaining to set different remaining time. - https://community.bistudio.com/wiki/synchronizedTriggers + https://community.bistudio.com/wiki/getBleedingRemaining - synchronizedTriggers Waypoint + getBleedingRemaining Object - synchronizedTriggers waypoint + getBleedingRemaining unit - + $Code$_bleedingRemaining = getBleedingRemaining _unit;$/Code$ + undefined / undefined - Array + Number + - synchronizedWaypoints + remove3DENLayer - Returns the list of waypoints synchronized with a given trigger or waypoint. + Remove Eden Editor editing layer. - https://community.bistudio.com/wiki/synchronizedWaypoints + https://community.bistudio.com/wiki/remove3DENLayer - synchronizedWaypoints Object/Waypoint + remove3DENLayer Number - synchronizedWaypoints obj + remove3DENLayer layerID - + $Code$_myLayer = -1 add3DENLayer "Enemy Base"; + remove3DENLayer _myLayer ;$/Code$ + undefined / undefined - Array + Boolean + - systemChat + getObjectProxy - Types text to the system radio channel. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) + Return the proxy object associated with the given editor object. + i + Some Old Editor Command - https://community.bistudio.com/wiki/systemChat + https://community.bistudio.com/wiki/getObjectProxy - systemChat String + Control getObjectProxy String - systemChat text + map getObjectProxy object - $Code$systemChat "Hello world!";$/Code$ - - $Code$driver vehicle player sideChat "sideChat"; - driver vehicle player globalChat "globalChat"; - driver vehicle player groupChat "groupChat"; - vehicle player vehicleChat "vehicleChat"; - driver vehicle player commandChat "commandChat"; - driver vehicle player customChat [1, "customChat"]; - systemChat "systemChat";$/Code$ + $Code$( findDisplay 128 displayCtrl 51) getObjectProxy "_unit_1" + // returns the object 'B 1-1-A:1 (Sean Johnson)'$/Code$ - undefined / local + undefined / undefined + classWorks in BIS RTE only? - Nothing + Object + - systemOfUnits + countSide - Returns the currently selected system of units. - 0: Metric - 1: Mixed (ground vehicles use Metric / air vehicles use Imperial) - 2: Imperial + Count how many units in the given array belong to given side. If the object in passed array is a Group, the leader of the group will be counted. - https://community.bistudio.com/wiki/systemOfUnits + https://community.bistudio.com/wiki/countSide - systemOfUnits + Side countSide Array - systemOfUnits + side countSide arrayName - $Code$_system = systemOfUnits;$/Code$ + $Code$_num = west countSide list _triggerOne;$/Code$ + + $Code$_numCivPlayable = civilian countSide playableUnits ;$/Code$ - undefined / undefined + global / undefined + (July 4, 2014) + The countSide command will also accept an array of groups. Tested in ARMA 3 v1.22 + + (October 19, 2014) + This command considers captive units as civilians, regardless of their group's side. - Number + Number + - tan + setVisibleIfTreeCollapsed - Tangent of x, argument in Degrees. + Sets whether or not the object is visible even if the tree is collapsed. + i + Some Old Editor Command - https://community.bistudio.com/wiki/tan + https://community.bistudio.com/wiki/setVisibleIfTreeCollapsed - tan Number + Control setVisibleIfTreeCollapsed Array - tan x + map setVisibleIfTreeCollapsed [object, visible] - $Code$_tangent = tan 45 - // Result is 1$/Code$ + $Code$_map setVisibleIfTreeCollapsed ["_unit_0", true]$/Code$ undefined / undefined @@ -68362,181 +70783,173 @@ - Number + Nothing + - targetKnowledge + deleteSite - Returns unit's knowledge about target. The returned array includes information whether the target is - known by group - known by the unit - last time the target was seen by the unit - last time the target endangered the unit - target side - position error - target position + Removes the site. + This command is considered deprecated and is no longer supported - https://community.bistudio.com/wiki/targetKnowledge + https://community.bistudio.com/wiki/deleteSite - Object targetKnowledge Object + deleteSite Object - unit targetKnowledge target + deleteSite site - $Code$_allInfo = _soldierOne targetKnowledge _jeepOne;$/Code$ - - $Code$_posError = (_soldierOne targetKnowledge _jeepOne) select 5;$/Code$ - + undefined / undefined - Array + Nothing + - targets + save3DENInventory - Retrives list of given unit targets matching specified filter. If the filter is not specified, all targets are returned. + Saves current state of entitie's inventory to SQM. - https://community.bistudio.com/wiki/targets + https://community.bistudio.com/wiki/save3DENInventory - Object targets Array + save3DENInventory Array - unit targets [enemyOnly, maxDistance, sides, maxAge, alternateCenter] + save3DENInventory entities - $Code$_targets = _unit targets [false, 300, [east,sideEnemy]]; //all targets of east or renegade side in 300m$/Code$ - - $Code$_targets = _unit targets [true, 300]; //enemy targets in 300m$/Code$ - - $Code$_targets = _unit targets []; //all targets$/Code$ + $Code$save3DENInventory [_soldier1,_solider2]$/Code$ - global / undefined + undefined / undefined - Array + Nothing + - targetsAggregate + lockedDriver - Aggregate candidates. + Check whether driver position of the vehicle turret is locked. - https://community.bistudio.com/wiki/targetsAggregate + https://community.bistudio.com/wiki/lockedDriver - Array targetsAggregate Array + lockedDriver Object - [speaker, side, unit, place, time] targetsAggregate candidates + lockedDriver vehicle - $Code$_aggregation = [_this,"","","",""] targetsAggregate _selected;//ca\characters\scripts\reactCore_Full.fsm$/Code$ - + undefined / undefined - Array + Boolean + - targetsQuery + unitRecoilCoefficient - Returns sorted array of targets, known to the enquirer (including own troops), where the accuracy coefficient reflects how close the result matches the query. This command could be CPU intensive. + Returns recoil coefficient of a soldier. - https://community.bistudio.com/wiki/targetsQuery + https://community.bistudio.com/wiki/unitRecoilCoefficient - Object targetsQuery Array + unitRecoilCoefficient Object - enquirer targetsQuery [targetIgnore, targetSide, targetType, targetPosition, targetMaxAge] + unitRecoilCoefficient soldier - $Code$// Return all known targets for player: - _targets = player targetsQuery [ objNull, sideUnknown, "", [], 0];$/Code$ - - $Code$// Prioritise all known OPFOR targets and return targets less than 10 seconds old: - _targets = player targetsQuery [ objNull, east, "", [], 10];$/Code$ + $Code$_myRecoil = unitRecoilCoefficient player$/Code$ undefined / undefined + (September 7, 2013) + If the unit doesn't exist / is null, -1 is returned. - Array + Number + - taskAlwaysVisible + setMarkerText - Returns true if the task is flagged to be always visible or false if not. + Sets the text label of an existing marker. - https://community.bistudio.com/wiki/taskAlwaysVisible + https://community.bistudio.com/wiki/setMarkerText - taskAlwaysVisible Task + String setMarkerText String - taskAlwaysVisible task + markerName setMarkerText text - $Code$_isAlwaysVisible = taskAlwaysVisible ( currentTask player );$/Code$ + $Code$"Marker1" setMarkerText "You are here.";$/Code$ - undefined / undefined + undefined / global + createMarker is GLOBAL in multiplayer, so all markers created with it exist for all clients. But they are not visible. Almost all setMarker commands can then be used for different effects on LOCAL clients. + BUT if you use the setMarkerText command, then the marker will become visible to all clients since the command is GLOBAL. - Boolean + Nothing + - taskChildren + menuSetAction - Return the child tasks of the specified task. + Sets new action into menu entry on given path. - https://community.bistudio.com/wiki/taskChildren + https://community.bistudio.com/wiki/menuSetAction - taskChildren Task + menuSetAction Array - taskChildren task + menuSetAction [idc, path, action] @@ -68546,301 +70959,447 @@ - Array + Number + - taskCompleted + execFSM - Return if task is completed. (state Succeeded, Failed or Canceled) + Executes scripted FSM and returns the FSM handle or 0 when failed. The FSM file is first searched in the mission folder, then in the campaign scripts folder and finally in the global scripts folder. Argument (if any) are available in _this variable inside FSM. In Arma 3 FSM handle is also available in _thisFSM variable. - https://community.bistudio.com/wiki/taskCompleted + https://community.bistudio.com/wiki/execFSM - taskCompleted Task + Anything execFSM String + + execFSM String - taskCompleted task + arguments execFSM filename + + execFSM filename - + $Code$_id = player execFSM "test.fsm";$/Code$ + + $Code$_handle = [_a, _b, _c] execFSM "test.fsm";$/Code$ + + $Code$_handle = execFSM "test.fsm";$/Code$ + undefined / undefined - Boolean + Number - Number + - taskCustomData + ropeAttachEnabled - Returns custom data attached to the local task or an empty array if there are no custom data attached. + Returns true if vehicle can be attached to ropes - https://community.bistudio.com/wiki/taskCustomData + https://community.bistudio.com/wiki/ropeAttachEnabled - taskCustomData Task + ropeAttachEnabled Object - taskCustomData task + ropeAttachEnabled vehicle - + $Code$ropeAttachEnabled veh1;$/Code$ + undefined / undefined - Array + Boolean + - taskDescription + setSkill - Returns the sub-parts of the task description. The returned Array is in format [Task description, Task title, Task waypoint description]. + Sets ability level of person (commander unit). Value of skill may vary from 0 to 1. + Available sub-skills are: + aimingShake + aimingSpeed + endurance + spotDistance + spotTime + courage + reloadSpeed + commanding + general + The value of a sub-skill is interpolated into a range defined in CfgAISkill. - https://community.bistudio.com/wiki/taskDescription + https://community.bistudio.com/wiki/setSkill - taskDescription Task + Object setSkill Number + + Object setSkill Array - taskDescription task + unit setSkill skill + + unit setSkill [skillName, value] - $Code$_taskDescArray = taskDescription _task;$/Code$ + $Code$_hero setSkill 1;$/Code$ + + $Code$_finalBoss setSkill ["reloadSpeed", 0.8]; _finalBoss setSkill ["aimingSpeed", 0.33];$/Code$ undefined / undefined - (November 14, 2014) - Be careful if you want to use this to retrieve the title of a task. - If the task has no description set, then "taskDescription" will only return an array of empty Strings. - Therefor always use setSimpleTaskDescription directly after creating a new task, even if you set the Description to "". + (August 4, 2006) + Approximate ranges are: + Novice 0.25 + Rookie = 0.25 and = 0.45 + Recruit 0.45 and = 0.65 + Veteran 0.65 and = 0.85 + Expert 0.85 + + (June 30, 2007) + If "SuperAI" is turned on in the Difficulty Menu, the skill level is always 1, no matter what was defined in the editor or via this command. - Array + Nothing - Nothing + - taskDestination + civilian - Returns the position of the task (as specified by destination parameter in config). + Pre-defined variable for the civilian side. + When used in a format statement ( hint format ["%1",civilian] ), the string returned is "CIV". - https://community.bistudio.com/wiki/taskDestination + https://community.bistudio.com/wiki/civilian - taskDestination Task + civilian - taskDestination task + civilian - $Code$if (! isNull currentTask player ) then { taskDestination currentTask player }; //return Position ( Array )$/Code$ + $Code$// SQS: + ?((side _unit) == civilian ) : hint "This is a civilian unit!"$/Code$ + + $Code$// SQF: + if (( side _unit) == civilian ) then { + hint "This is a civilian unit!"; + };$/Code$ undefined / undefined + In OFP v1.96, empty vehicles, objects and dead soldiers are on side civilian. - Array + Side + - taskHint + lnbDeleteColumn - Shows info about new, changed or failed task. The text can contain several lines. \n is used to indicate the end of a line. - To maintain Arma 3 visual style, it's recommended to use BIS_fnc_showNotification instead. + Removes column with given index from ListNBox control. - https://community.bistudio.com/wiki/taskHint + https://community.bistudio.com/wiki/lnbDeleteColumn - taskHint Array + lnbDeleteColumn Array + + Control lnbDeleteColumn Number - taskHint [hintText, [r, g, b, a], icon] + lnbDeleteColumn [idc,index] + + ctrl lnbDeleteColumn index - $Code$taskhint ["Task failed!\nBad job!", [1, 0, 0, 1], "taskFailed"]$/Code$ + $Code$_ctrl lnbDeleteColumn 1;$/Code$ - undefined / undefined + local / local - Here are the BIS colors: + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: $Code$ - taskHint ["New Task!\nHere's your new task!", [1, 1, 1, 1], "taskNew"]; - taskHint ["Task Assigned!\nDo this now!", [1, 1, 1, 1], "taskCurrent"]; - taskHint ["Task Succeeded!\nGood job!", [0.600000,0.839215,0.466666,1], "taskDone"]; - taskHint ["Task Failed!\nBad job!", [0.972549,0.121568,0,1], "taskFailed"]; - taskHint ["Task Canceled!\nNever mind!", [0.75,0.75,0.75,1], "taskFailed"]; + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 + $/Code$ + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Nothing + Nothing - Nothing + - taskMarkerOffset + commandingMenu - Returns model space position for the task marker + Return the name of the player actual topmost commanding menu. - https://community.bistudio.com/wiki/taskMarkerOffset + https://community.bistudio.com/wiki/commandingMenu - taskMarkerOffset Object + commandingMenu - taskMarkerOffset unit + commandingMenu - $Code$_offset = taskMarkerOffset player ;$/Code$ + $Code$waitUntil { commandingMenu == "RscStatus"}; hint "Press 4, I'm bleeding !";$/Code$ undefined / undefined + (July 15, 2009) + Possible values are : + "" - means menu is closed + "RscMainMenu" - Main menu, by pressing backspace + "RscMoveHigh" - Move menu (1) + "#WATCH" - Watch menu (2) + "#WATCH0" - Watch menu - next page (2-0) + "RscWatchDir" - Engage menu (3) + "RscWatchMoreDir" - Engage menu - watch a direction (3-8) + "#GET_IN" - Mount menu (4) + "RscStatus" - Status menu (5) + "RscCallSupport" - Mount menu - call support (5-1) + "#ACTION" - Action menu (6) + "RscCombatMode" - Combat mode menu (7) + "RscFormations" - Formation menu(8) + "RscTeam" - Team menu (9) + "RscSelectTeam" - Team menu - select team (0-5) + "RscReply" - Reply menu (0) + "#User:BIS_Menu_GroupCommunication" - Communication menu (0-8) + "#CUSTOM_RADIO" - Custom sounds menu (0-9) + "RscRadio" - Radio menu (0-0) + "RscGroupRootMenu" - "simplified" menu - Array + String + - taskNull + revealMine - A non-existing Task. To compare non-existent tasks use isNull or isEqualTo : - taskNull == taskNull ; // false - isNull taskNull ; // true - taskNull isEqualTo taskNull ; // true + Sets given mine as known to the side. (Knowledge about a mine is always shared across all units in a side.) - https://community.bistudio.com/wiki/taskNull + https://community.bistudio.com/wiki/revealMine - taskNull + Side revealMine Object - taskNull + side revealMine mine - $Code$! isNull taskNull ; // false$/Code$ - - $Code$str taskNull ; // No task$/Code$ + $Code$west revealMine _mine;$/Code$ undefined / undefined + (September 10, 2017) + Manual mine detection introduced in A3 v1.76 can be overridden with something like this: + $Code$0 spawn + { + while {true} do + { + if ("MineDetector" in items player ) then + { + { + if ( mineActive _x && !(_x mineDetectedBy playerSide )) then + { + playerSide revealMine _x; + }; + } forEach (player nearObjects ["MineBase", 10]); + uiSleep 0.1; + } + else + { + uiSleep 3; + }; + }; + };$/Code$ - Task + Nothing + - taskParent + tvClear - Return the parent task of the specified task. + Removes all items from Tree View with given idc. - https://community.bistudio.com/wiki/taskParent + https://community.bistudio.com/wiki/tvClear - taskParent Task + tvClear Number + + tvClear Control - taskParent task + tvClear idc + + tvClear control - + $Code$tvClear 101;$/Code$ + - undefined / undefined + local / local + (Sep 11 2014) + (A3 1.28)tv command family overview + $Code$ + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [ [],"Parent_A"]; + _CT_TREE tvAdd [ [0],"Child_A"]; + _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; + _CT_TREE tvAdd [ [],"Parent_B"]; + _CT_TREE tvAdd [ [1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; + $/Code$ - Task + Nothing - Nothing + - taskResult + ctrlSetFontHeightH3 - Send a result of the task to the task sender. + Sets H3 font size of given HTML control. - https://community.bistudio.com/wiki/taskResult + https://community.bistudio.com/wiki/ctrlSetFontHeightH3 - taskResult Task + Control ctrlSetFontHeightH3 Number - taskResult task + controlName ctrlSetFontHeightH3 height - + $Code$_control ctrlSetFontHeightH3 0.05$/Code$ + undefined / undefined - Array + Nothing + - taskState + loadMagazine - Returns the current state of a task. - Possible return values are: - None - Created - Assigned - Succeeded - Failed - Canceled + Initiates the loading action on given weapon of the turret of a transport. So the new magazine is not available instantly, yet according to the reloadTime. + The turret has to be manned. One can also change the magazine if its respective weapon is not selected. - https://community.bistudio.com/wiki/taskState + https://community.bistudio.com/wiki/loadMagazine - taskState Task + Object loadMagazine Array - taskState task + transport loadMagazine [turretPath, weaponName, magazineName] - $Code$tskSomeTask = player createSimpleTask ["NewTask"]; - hint format["Taskstate: %1", taskState tskSomeTask];$/Code$ + $Code$vehicle player loadMagazine [[0],"m256","20Rnd_120mmHE_M1A2"];$/Code$ undefined / undefined @@ -68848,27 +71407,28 @@ - String + Nothing + - taskType + ctrlSetFontHeightH4 - Returns the type of the given task + Sets H3 font size of given HTML control. - https://community.bistudio.com/wiki/taskType + https://community.bistudio.com/wiki/ctrlSetFontHeightH4 - taskType Task + Control ctrlSetFontHeightH4 Number - taskType task + controlName ctrlSetFontHeightH4 height - $Code$_type = taskType ( currentTask player );$/Code$ + $Code$_control ctrlSetFontHeightH4 0.05$/Code$ undefined / undefined @@ -68876,36 +71436,28 @@ - String + Nothing + - teamMemberNull + ctrlSetFontHeightH5 - A non-existent Team Member. To compare non-existent team members use isNull or isEqualTo : - teamMemberNull == teamMemberNull ; // false - isNull teamMemberNull ; // true - teamMemberNull isEqualTo teamMemberNull ; // true + Sets H5 font size of given HTML control. - https://community.bistudio.com/wiki/teamMemberNull + https://community.bistudio.com/wiki/ctrlSetFontHeightH5 - teamMemberNull + Control ctrlSetFontHeightH5 Number - teamMemberNull + controlName ctrlSetFontHeightH5 height - $Code$! isNull teamMemberNull ; // false$/Code$ - - $Code$str teamMemberNull ; // NULL - team member$/Code$ - - $Code$if (_teamMember isEqualTo teamMemberNull ) then { - hint "is null member"; - };$/Code$ + $Code$_control ctrlSetFontHeightH5 0.05$/Code$ undefined / undefined @@ -68913,27 +71465,28 @@ - Team_Member + Nothing + - teamMember + stopped - Return an agent for given person. + Check if unit is stopped by stop command. - https://community.bistudio.com/wiki/teamMember + https://community.bistudio.com/wiki/stopped - teamMember Object + stopped Object - teamMember person + stopped unitName - $Code$_agent = teamMember player ;$/Code$ + $Code$? (stopped _loon1) : hint "Loon1 is stopped"$/Code$ undefined / undefined @@ -68941,27 +71494,28 @@ - Team_Member + Boolean + - teamName + ctrlSetFontHeightH6 - Return a name of given team. + Sets H6 font size of given HTML control. - https://community.bistudio.com/wiki/teamName + https://community.bistudio.com/wiki/ctrlSetFontHeightH6 - teamName Team_Member + Control ctrlSetFontHeightH6 Number - teamName team + controlName ctrlSetFontHeightH6 height - $Code$_name = teamName _team;$/Code$ + $Code$_control ctrlSetFontHeightH6 0.05$/Code$ undefined / undefined @@ -68969,83 +71523,144 @@ - String + Nothing + - teamSwitchEnabled + ctHeaderCount - Check if Team Switch is currently enabled. - Team Switch is enabled by default. + Returns number of headers (rows not included) in the RscControlsTable. - https://community.bistudio.com/wiki/teamSwitchEnabled + https://community.bistudio.com/wiki/ctHeaderCount - teamSwitchEnabled + ctHeaderCount Control - teamSwitchEnabled + ctHeaderCount Control - + $Code$ctHeaderCount _control;$/Code$ + - undefined / undefined + local / local - Boolean + Number + - teamSwitch + ctrlMapCursor - Invoke the Team Switch dialog (force it even when conditions are not met). There has to be at least one playable unit for team switch to work, and for this command to work in MP, respawn type in description.ext should be 5 (SIDE). - NOTE: When player switches and leaves behind AI unit, you need to enable "TeamSwitch" AI on it _unit enableAI "TeamSwitch" so that the unit continues with waypoints + Changes the default cursor that appears when interacting with a map control to a custom one. Use an empty string to restore the default cursor. If the specified cursor does not exist, the default is used and no error is produced. ( NOT in case of ArmA 3. Using an empty string will result in an error: "No entry 'bin\config.bin/CfgWrapperUI/Cursors.' ). The cursor is the name of a config entry from CfgWrapperUI / Cursors. This command has the following specifics: + When used on Main Map ( findDisplay 12 displayCtrl 51) it is possible to override multiple default cursors. For example, while leaving default "Arrow" intact, it is possible to just override "Scroll" with lets say "Wait" (Example 3) + When used on a custom map, for example user made Mini Map, there is only one single cursor "" for everything, therefore only this cursor can be overridden (see Example 4 on how to override it) + Some possible class names (for the whole list see ctrlMapCursor/cursors ): + Arrow + Track + Move + Scroll + Rotate + Track3D + Move3D + Rotate3D + Raise3D + Wait + HC_move + HC_overFriendly + HC_overEnemy + HC_overMission + HC_unsel + NOTE1 : Cursor names are case sensitive. - https://community.bistudio.com/wiki/teamSwitch + https://community.bistudio.com/wiki/ctrlMapCursor - teamSwitch + Control ctrlMapCursor Array - teamSwitch + control ctrlMapCursor [defaultCursor, newCursor] - + $Code$_map ctrlMapCursor ["Track", "Arrow"];$/Code$ + + $Code$uiNamespace setVariable ["_map", findDisplay 12 displayCtrl 51]; + ( uiNamespace getVariable "_map") ctrlMapCursor ["Track","HC_overFriendly"];$/Code$ + + $Code$findDisplay 12 displayCtrl 51 ctrlMapCursor ["Scroll", "Wait"];$/Code$ + + $Code$// Cycle through all available cursors over custom map: + 0 = [] spawn + { + disableSerialization ; + _map = findDisplay 46 createDisplay "RscCredits" ctrlCreate ["RscMapControl", -1]; + _map ctrlSetPosition [0,0,1,1]; + _map ctrlCommit 0; + { + _map ctrlMapCursor ["", configName _x]; // -- the actual usage + hint format ["Current cursor: %1", configName _x]; + sleep 1; + } + forEach ("true" configClasses ( configFile "CfgWrapperUI" "Cursors")); + };$/Code$ + undefined / undefined + (February 8, 2016) + When using this command, the cursor will change for the whole display, resulting in visual glitches. Adding the onMouseMoving event handler can help solve this problem: + $Code$ + _control ctrlAddEventHandler ["MouseMoving",{ + _this params [ + ["_mapCtrl", controlNull,[[[controlNull]]]], + ["_xPos",-1,[0]], + ["_yPos",-1,[0]], + ["_mouseIn", false,[[[true]]]] + ]; + if (_mouseIn) then { + // Mouse is in control area + _mapCtrl ctrlMapCursor ["","Track"]; + } else { + // Mouse is out of control area, goes back to arrow + _mapCtrl ctrlMapCursor ["","Arrow"]; + }; + }]; + $/Code$ - Nothing + Nothing + - teamType + AISFinishHeal - Returns a type of given team. + Alternative Injury Simulation (AIS) end state. Used to tell engine that script side healing is done when using "HandleHeal" event handler. - https://community.bistudio.com/wiki/teamType + https://community.bistudio.com/wiki/AISFinishHeal - teamType Team_Member + AISFinishHeal Array - teamType team + AISFinishHeal [unit, healer, healercanheal] - $Code$_type = teamType _team;$/Code$ + $Code$AISFinishHeal [_wounded, _medic, true ];$/Code$ undefined / undefined @@ -69053,27 +71668,44 @@ - String + Nothing + - teams + onGroupIconOverLeave - Return a list of teams in the current mission. + Defines an action performed when pointer, previously positioned over icon, is moved away from it (3D or in a map). The code is executed once. + i + Since Arma 3 v1.57 a stackable version of this EH is available: GroupIconOverLeave - https://community.bistudio.com/wiki/teams + https://community.bistudio.com/wiki/onGroupIconOverLeave - teams + onGroupIconOverLeave String/Code - teams + onGroupIconOverLeave command - $Code$_teams = teams ;$/Code$ + $Code$onGroupIconOverLeave + { + // Passed values for _this are: + _is3D = _this select 0; + _group = _this select 1; + _wpID = _this select 2; + _posx = _this select 3; + _posy = _this select 4; + _shift = _this select 5; + _ctrl = _this select 6; + _alt = _this select 7; + _message = format ["____ Info ____"]; + {_message = _message + format ["\n %1",_x]} forEach _this; + hint _message; + }$/Code$ undefined / undefined @@ -69081,99 +71713,85 @@ - Array + Nothing + - terminate + camTarget - Terminate (abort) spawned or execVM 'd script. Note : The given script will not terminate immediately upon terminate command execution, it will do so the next time the script is processed by the scheduler. + Returns camera's target. - https://community.bistudio.com/wiki/terminate + https://community.bistudio.com/wiki/camTarget - terminate Script_Handle + camTarget Object - terminate scriptHandle + camTarget camera - $Code$_script = [] execVM "script.sqf"; - sleep 5; - terminate _script; - hint "'script.sqf' has been terminated after 5 seconds";$/Code$ - + undefined / undefined - Nothing + Object + - terrainIntersectASL + ctrlSetFontHeightH1 - Checks for intersection of terrain between two ASL positions. Returns true if intersects with terrain. For AGL variant, see terrainIntersect + Sets H1 font size of given HTML control. - https://community.bistudio.com/wiki/terrainIntersectASL + https://community.bistudio.com/wiki/ctrlSetFontHeightH1 - terrainIntersectASL Array + Control ctrlSetFontHeightH1 Number - terrainIntersectASL [pos1, pos2] + controlName ctrlSetFontHeightH1 height - $Code$_intersects = terrainIntersectASL [ getPosASL player, getPosASL chopper];$/Code$ - - $Code$_intersects = terrainIntersectASL [ eyePos player, eyePos enemy1];$/Code$ + $Code$_control ctrlSetFontHeightH1 0.05$/Code$ undefined / undefined - (may 31, 2012) - Please note the difference : - terrainIntersect - terrainIntersectASL - lineIntersect s - lineIntersect s With - lineIntersect s Objs - intersect - - (may 31, 2012) - This command is CPU intensive on the engine, be careful with its use. - Boolean + Nothing + - terrainIntersectAtASL + ctrlSetFontHeightH2 - Checks for intersection of terrain between two ASL positions. Same as terrainIntersectASL, only returns intersect position instead of Boolean + Sets H2 font size of given HTML control. - https://community.bistudio.com/wiki/terrainIntersectAtASL + https://community.bistudio.com/wiki/ctrlSetFontHeightH2 - terrainIntersectAtASL Array + Control ctrlSetFontHeightH2 Number - terrainIntersectAtASL [pos1, pos2] + controlName ctrlSetFontHeightH2 height - $Code$_posASL = terrainIntersectAtASL [ eyePos player, getPosASL chopper];$/Code$ + $Code$_control ctrlSetFontHeightH2 0.05$/Code$ undefined / undefined @@ -69181,107 +71799,107 @@ - Array + Nothing + - terrainIntersect + diag_list - Checks for intersection of terrain between two AGL positions. Returns true if intersects with terrain. For ASL variant see terrainIntersectASL + Returns an array of all diag modes available in the game. + Command is only available when using Arma 3 Diagnostics Exe on Dev-Branch. - https://community.bistudio.com/wiki/terrainIntersect + https://community.bistudio.com/wiki/diag_list - terrainIntersect Array + diag_list String - terrainIntersect [pos1, pos2] + diag_list name - $Code$_intersects = terrainIntersect [ getPos player, getPos chopper];$/Code$ + $Code$diag_list "toggle";$/Code$ - $Code$_intersects = terrainIntersect [ position player, position enemy1];$/Code$ + $Code$diag_list "drawMode"$/Code$ undefined / undefined - (may 31, 2012) - Please note the difference : - terrainIntersect - terrainIntersectASL - lineIntersect s - lineIntersect s With - lineIntersect s Objs - intersect - - (may 31, 2012) - This command is CPU intensive on the engine, be careful with its use. - - (Jun 23, 2012) - This command was changed to ATL and counterpart for ASL was added in build 94049. + (October 7, 2016) + Arma 3 Version 1.65.138660 + $Code$ diag_list "toggle";$/Code$ returns: + ["Force","Animation","Mines","HitPoints","AnimSrcUnit","AnimSrcTarget","Suspension", + "EPEForce","EPEVehicle","ParticleNames","Particles","SurfaceUnder","AISkill","AIDriving", + "AIAiming","AIBrain","AIDynamicError","AISuppression"] - Boolean + Array + - textLogFormat + ppEffectCommit - Debugging output. - This command is non-functional in the retail version + Commit post process effect in given time. - https://community.bistudio.com/wiki/textLogFormat + https://community.bistudio.com/wiki/ppEffectCommit - textLogFormat Array + String ppEffectCommit Number + + Number ppEffectCommit Number + + Array ppEffectCommit Number - textLogFormat [format, arg1, arg2,] + effect ppEffectCommit commit + + effect ppEffectCommit commit + + [effect1,] ppEffectCommit commit - + $Code$"colorCorrection" ppEffectCommit 3;$/Code$ + + $Code$_hndl ppEffectCommit 3;$/Code$ + + $Code$[_hndl1, _hndl2] ppEffectCommit 3;$/Code$ + undefined / undefined - Nothing + Nothing - Nothing - Nothing + - text + onBriefingGroup - Creates a structured text containing the given plain text if argument is String or returns location's text value if argument is Location (see Alt Syntax) + Select a sound declared in the Description.ext of the mission to be played the first time the Group tab is selected in the briefing. - https://community.bistudio.com/wiki/text + https://community.bistudio.com/wiki/onBriefingGroup - text String - - text Location + onBriefingGroup String - text string - - text location + onBriefingGroup soundName - $Code$_stxt2 = text "Hello world.";$/Code$ - - $Code$_townName = text myTownLocation;$/Code$ - - $Code$_loc = text nearestLocation [ position player, "NameMarine"]; //"Marina Bay"$/Code$ + $Code$onBriefingGroup "GroupVoiceOver"$/Code$ undefined / undefined @@ -69289,183 +71907,159 @@ - Structured_Text - String + Nothing + - textLog + tg - Dump argument value to debugging output. - This command is non-functional in the retail version + Identical to tan - https://community.bistudio.com/wiki/textLog + https://community.bistudio.com/wiki/tg - textLog Any_Value + tg Number - textLog anything + tg x - $Code$textLog player$/Code$ - + undefined / undefined - Nothing + Number + - tg + waypointAttachedVehicle - Identical to tan + Gets the vehicle attached to the waypoint. + A vehicle can be attached to a waypoint by + creating the waypoint on top of the vehicle (in the editor) + using waypointAttachVehicle - https://community.bistudio.com/wiki/tg + https://community.bistudio.com/wiki/waypointAttachedVehicle - tg Number + waypointAttachedVehicle Array - tg x + waypointAttachedVehicle waypoint - + $Code$waypointAttachedVehicle [groupOne,1]$/Code$ + + $Code$waypointAttachedVehicle [ group player, currentWaypoint group player ]$/Code$ + undefined / undefined - Number + Object + - then + selectLeader - First or second element of array is executed depending on result of if condition. Result of the expression executed is returned as a result (result may be Nothing ). + Select a group's leader. In MP the group has to be local to the PC executing the command. Locality of the group can be checked with local command and group ownership with groupOwner command. - https://community.bistudio.com/wiki/then + https://community.bistudio.com/wiki/selectLeader - If_Type then Code/Array + Group selectLeader Object - if then else + groupName selectLeader unitName - $Code$if (a b) then { c = 1 };$/Code$ + $Code$group player selectLeader player ;$/Code$ - $Code$if (a b) then { - c = 1; - } else { - c = 2; - }; - hint str c;$/Code$ + $Code$// Make unit a leader from server: + [ group _unit, _unit] remoteExec ["selectLeader", groupOwner group _unit];$/Code$ - undefined / undefined + local / global - Any variables you declare within the body of an if /then statement (ie between the curly braces) are local to that 'if' statement, and are destroyed at the end of the statement. If you know you want to use the variable outside the 'if' statement, make sure your declare it before the 'if' statement. - Anything + Nothing + - throw + vectorNormalized - Throws an exception. The exception is processed by first catch block. This command will terminate further execution of the code. - NOTE : Avoid using alternative shorthand syntax if you are planning on preparing your exception information dynamically, as it will have to be generated first regardless of the condition of the if statement before it, as shown in example 3. + Returns normalized vector (unit vector, vectorMagnitude = 1) of given vector. If given vector is 0 result is a 0 vector as well. - https://community.bistudio.com/wiki/throw + https://community.bistudio.com/wiki/vectorNormalized - throw Anything - - If_Type throw Anything + vectorNormalized Array - throw expression - - if throw exception + vectorNormalized vector - $Code$try { throw "invalid argument"} catch { hint str _exception};$/Code$ - - $Code$// Since Arma 3 v1.53.133045: - 123 try { if (_this != 123) throw "invalid argument"} catch { hint str _exception};$/Code$ - - $Code$// The correct usage of shorthand alt syntax: - try { - if (a b) throw "Error: some error"; /// OK - /// The command argument is static - } catch { - hint str _exception; - }; - try { - _someFunc = { - ..... - }; - if (a b) throw ( call _someFunc); /// NOT OK - /// The command argument is dynamic - /// _someFunc is called first to get the value regardless of (a b) outcome - } catch { - hint str _exception; - }; - try { - _someFunc = { - ..... - }; - if (a b) then { throw ( call _someFunc)}; /// OK - /// The command argument is dynamic - /// _someFunc is only called when (a b) is true - } catch { - hint str _exception; - };$/Code$ + $Code$vectorNormalized [12345,7890,38383]; //[0.300481,0.192045,0.934254] + vectorMagnitude [0.300481,0.192045,0.934254]; //1$/Code$ undefined / undefined + (19 Jul, 2014) + (ArmA3 1.26) Algorithm: + $Code$ + Vector = [x,y,z]; + Result = [x/( sqrt (x ^ 2 + y ^ 2 + z ^ 2)), y/( sqrt (x ^ 2 + y ^ 2 + z ^ 2)), z/( sqrt (x ^ 2 + y ^ 2 + z ^ 2))] + $/Code$ + In mathematics, a unit vector in a normed vector space is a vector whose length is 1. - Nothing - Nothing + Array + - timeMultiplier + to - Returns the value set with setTimeMultiplier. + Continue sequence of for var construct. It sets the end value of the index variable - https://community.bistudio.com/wiki/timeMultiplier + https://community.bistudio.com/wiki/to - timeMultiplier + For_Type to Number - timeMultiplier + forType to b - $Code$_multiplier = timeMultiplier ;$/Code$ + $Code$for "_x" from 10 to 20 do {/* Do something*/}$/Code$ undefined / undefined @@ -69473,238 +72067,205 @@ - Number + For_Type + - time + getCargoIndex - Returns time elapsed since mission started (in seconds). The value is different on each client. If you need unified time, use serverTime. + Returns index of the unit in cargo. 0,1,2... or -1 if not in cargo. - https://community.bistudio.com/wiki/time + https://community.bistudio.com/wiki/getCargoIndex - time + Object getCargoIndex Object - time + vehicle getCargoIndex unit - $Code$_future = time + 30; - waitUntil { time = _future}; /* continue after 30 seconds... */$/Code$ - - $Code$// Wait until mission fully started: - waitUntil { time 0};$/Code$ + $Code$player moveInCargo heli; + hint str (heli getCargoIndex player );$/Code$ - undefined / undefined + global / undefined - (August 4, 2006) - Notes from before the conversion: - Not to be confused with _time. Within a script, the reserved local variable _time returns the time elapsed since the script started running. Note that the value of time is not saved when the mission is saved and so will be reset to zero when a mission is restarted from a saved position. The value of _time is saved correctly and will resume from where it was. - _time has only special meaning in SQS scripts, in SQF script it is just another variable. -- Killzone_Kid - - (January 5, 2007) - Notes from before the conversion: - time works properly in sqf called with execVM command. In an other hand, _time does not works in sqf called with execVM command.(Arma v1.02.5103GER) - - (October 02, 2010) - On overloaded servers (below ~10 server FPS), time readings are unreliable. Seconds actually take longer. While the clients keep a steady tempo, server time lags behind, resulting in considerable offset between client and server time (easily 30 minutes for a 2 hour game). Client time is synchronised to server time during JIP, but other than that it runs independently. - - (30 Oct 2013) - Arma 3 JIP bug: - As of Arma 3 v1.02, for JIP clients 'time' value will start off counting from 0, not the real 'time' value. After about 2.5sec (on average), it will then jump to a high value and synchronise with the real 'time' value, which could be 900, for example. - Therefore, do not use 'time' for any start of mission init timeouts; it's unreliable. (It's odd that it doesn't synchronise at the same time as public variables.) - - (September 1, 2016) - In MP : Since per-client time and server time is unconsistant I strongly recommend execution of time-critical tasks from server-side scripts and with remoteExec or remoteExecCall ( Since only A3 1.50 alternative may be publicVariableClient with pre-defined handler) as this will eliminate any time calculation lags and make it reliable. - Number + Number + - titleCut + addBackpackCargo - this command was obsoleted, use cutText instead. + Add backpack(s) to the cargo space of vehicle. Classname list of available backpacks is here. + In Arma 3, arguments for this command must be local ( ). For global variant see addBackpackCargoGlobal - https://community.bistudio.com/wiki/titleCut + https://community.bistudio.com/wiki/addBackpackCargo - titleCut Array + Object addBackpackCargo Array - titleCut [text, type, speed] + vehicle addBackpackCargo [packClassName,count] - $Code$titleCut ["Hello, how are you?","Plain Down",3];$/Code$ + $Code$this addBackpackCargo ["TK_RPG_Backpack_EP1",2];$/Code$ + + $Code$_apc addBackpackCargo ["US_Patrol_Pack_EP1",4];$/Code$ - undefined / undefined + global / local - Nothing + Nothing + - titleFadeOut + inflamed - Terminate the title effect and set duration of the fade out phase to the given time. + Checks if fireplace is inflamed (burning) or not. To check if a unit is receiving damage from fire, use isBurning command. - https://community.bistudio.com/wiki/titleFadeOut + https://community.bistudio.com/wiki/inflamed - titleFadeOut Number + inflamed Object - titleFadeOut duration + inflamed fireplace - $Code$titleText ["Hi", "plain"]; titleFadeOut 2$/Code$ + $Code$_inflamed = inflamed _fireplaceOne;$/Code$ - undefined / undefined + global / undefined - Nothing + Boolean + - titleObj + addWeaponTurret - Shows object defined in global config in CfgTitles + Adds a weapon to the turret. Use turret path [-1] for driver's turret. - https://community.bistudio.com/wiki/titleObj + https://community.bistudio.com/wiki/addWeaponTurret - titleObj Array + Object addWeaponTurret Array - titleObj [class, type, speed, showInMap] + vehicle addWeaponTurret [weaponName, turretPath] - $Code$titleObj ["BISLogo", "PLAIN"]$/Code$ + $Code$_tank addWeaponTurret ["LMG_M200",[0,0]];$/Code$ - undefined / undefined + local / global - Nothing + Nothing + - titleRsc + setMarkerPosLocal - Display a resource defined in RscTitles. Also see cutRsc, with these two commands you can show two different resources at once. + Moves the marker. Pos format is Position2D. - https://community.bistudio.com/wiki/titleRsc + https://community.bistudio.com/wiki/setMarkerPosLocal - titleRsc Array + String setMarkerPosLocal Array - titleRsc [text, type, speed, showInMap] + markerName setMarkerPosLocal pos - $Code$titleRsc ["BIS", "PLAIN"]$/Code$ + $Code$"MarkerOne" setMarkerPosLocal getMarkerPos "MarkerTwo";$/Code$ - undefined / undefined + undefined / local - (30 Jun, 2008) - Using titleRsc (unlike cutRsc ) for a HUD will mean: - the HUD will remain visible when you access the map and overlay it. - using the 'Direct communication' chat channel messages will interfere with the HUD by hiding it, since it appears to use the same 'resource layer'. - - (September 25, 2014) - In OFP/CWA any x Rsc will hide all the elements of the HUD, including the map. - Nothing + Nothing + - titleText + sendTaskResult - Displays text across the screen. If used along with cutText two different texts (in different type styles) can be shown at once. The text can be displayed on multiple lines by using "\n" new line characters: - titleText ["line1\nline2\nline3", "PLAIN"];. Since Arma 3 v1.73.142260 this command supports Structured Text formatting. + Send a result of the task to the task sender. - https://community.bistudio.com/wiki/titleText + https://community.bistudio.com/wiki/sendTaskResult - titleText Array + Task sendTaskResult Array - titleText [text, type, speed, showInMap, isStructuredText] + task sendTaskResult [state,result,sentence] - $Code$titleText ["Show this text", "PLAIN"];$/Code$ - - $Code$titleText ["Your message", "BLACK", 2];$/Code$ - - $Code$// Since Arma 3 v1.73.142260: - titleText [" t color='#ff0000' size='5' RED ALERT! /t br/ ***********", "PLAIN", -1, true, true ];$/Code$ - + - undefined / local + undefined / undefined - (November 21, 2014) - The third parameter or 'speed', as it's called in the description, refers to the amount of time the message will be shown on-screen. Multiply each number by 10 to get the number of seconds it will be shown. You can even use floats as input, like 0.1, to show a message for only 1 second. - Note : Calculating the time with that method does not include the time it takes to fade in/out, which is about 1 second unless you use numbers lower than 1. - Note : Using anything lower than 0.001 seems to have no effect, or the effect is so little it's negligible. - (A3 1.34.128075) - Nothing + Nothing + - toArray + playableSlotsNumber - Converts the supplied String into an Array of Numbers. - The numbers in the created array are the decimal Unicode representations of characters. + Returns the number of available slots in mission per side (both empty and taken). In singleplayer mission, it returns number of playable units per side. - https://community.bistudio.com/wiki/toArray + https://community.bistudio.com/wiki/playableSlotsNumber - toArray String + playableSlotsNumber Side - toArray string + playableSlotsNumber side - $Code$hint format["%1",toArray("AaŒ")] - // returns "[65,97,338]"$/Code$ + $Code$_maxBluforPlayers = playableSlotsNumber blufor ;$/Code$ undefined / undefined @@ -69712,206 +72273,165 @@ - Array + Number + - toFixed + didJIPOwner - Converts a number into a string, keeping the specified number of decimals. If the desired number of decimals is higher than the actual number, nulls are added to create the desired decimal length. This command is almost identical in behaviour to JavaScript toFixed() - NOTE: Converted number is never presented in scientific notation unlike with other number to string commands. Also Arma's default string conversion limits numbers to 6 significant figures, whereas with this command it is possible to preserve some extra precision. - $Code$ str ( pi /100000); //"3.14159e-005" - scientific notation - ( pi /100000) toFixed 10; //"0.0000314159" - no scientific notation - str pi ; //"3.14159" - 6 significant figures (default) - pi toFixed 6; //"3.141593" - forced to 7 significant figures - pi toFixed 7; //"3.1415927" - forced to 8 significant figures$/Code$ - Since Arma 3 v1.71.141859 an alternative syntax is added, which takes no number and returns Nothing. Instead it acts as keyword and switches engine Number to String global conversion into desired format, from the moment it is applied until the end of script. To reset output back to default at any time, use toFixed -1. For example: - $Code$ systemChat str position player ; - call - { - toFixed 6; - systemChat str position player ; - }; - systemChat str position player ; - toFixed -1; - systemChat str position player ;$/Code$ - The result is: - [11580.3,11797.7,0.00146675] - [11580.341797,11797.737305,0.001467] - [11580.341797,11797.737305,0.001467] - [11580.3,11797.7,0.00146675] - Ideal to be used when saving data to a database when more precise positioning is required. + Checks if the current owner of supplied Object Joined In Progress. Server execution only. On clients returns false. - https://community.bistudio.com/wiki/toFixed + https://community.bistudio.com/wiki/didJIPOwner - Number toFixed Number - - toFixed Number + didJIPOwner Object - number toFixed decimals - - toFixed decimals - - - $Code$123 toFixed 2; //"123.00"$/Code$ - - $Code$2.34 toFixed 1; //"2.3" - 2.35 toFixed 1; //"2.4"$/Code$ - - $Code$// Convert position to string preserving position precision: - fn_posToString = - { - format [ - "[%1,%2,%3]", - _this select 0 toFixed 8, - _this select 1 toFixed 8, - _this select 2 toFixed 8 - ] - }; - str getPos player ; // "[3231.05,171.802,0.00143862]" - getPos player call fn_posToString; // "[3231.04882813,171.80192566,0.00143862]"$/Code$ - - $Code$// Same as Example 3 only using new alternative syntax: - str getPos player ; // "[3231.05,171.802,0.00143862]" - toFixed 8; - str getPos player ; // "[3231.04882813,171.80192566,0.00143862]"$/Code$ + didJIPOwner object + + + $Code$ownerDidJip = didJIPOwner tank;$/Code$ undefined / undefined - (September 2, 2016) - parseNumber (3.56346 toFixed 4); //0.0026 ms (10000 cycles) - [3.5634,4] call BIS_fnc_cutDecimals ; //0.0111 ms (10000 cycles) + This scripting command must be executed on the server to work properly in multiplayer - String - Nothing + Boolean + - toLower + swimInDepth - Converts the supplied string to all lowercase characters. + Sets the target depth level for swimming soldier. Depth should be a negative number. - https://community.bistudio.com/wiki/toLower + https://community.bistudio.com/wiki/swimInDepth - toLower String + Object swimInDepth Number - toLower string + unit swimInDepth value - $Code$hint toLower("AaBb1") - // returns "aabb1"$/Code$ + $Code$soldier swimInDepth -20;$/Code$ + + $Code$bob swimInDepth -10; + bob doMove ASLToAGL getPosASL player ;$/Code$ undefined / undefined + (June 13, 2017) + Doesn't work with animals. - String + Nothing + - toString + addRating - Converts the supplied Array of Numbers into a String. - The numbers in the array to be converted are the decimal Unicode representations of characters. + Add a number to the rating of a unit - negative values can be used to reduce the rating. + This command is usually used to reward for completed mission objectives. The rating is given at the end of the mission and is automatically adjusted when killing enemies or friendlies. + When the rating gets below -2000, the unit's side switches to "ENEMY" ( sideEnemy ) and the unit is attacked by everyone.(see Rating Values ) + See also: Arma_3:_Event_Handlers#HandleRating - https://community.bistudio.com/wiki/toString + https://community.bistudio.com/wiki/addRating - toString Array + Object addRating Number - toString array + unitName addRating rating - $Code$hint toString [65,97,338]; - // returns "AaŒ"$/Code$ - - $Code$["test","test"] joinString toString [12345] splitString toString [12345]; // ["test","test"]$/Code$ + $Code$player addRating 2000;$/Code$ - undefined / undefined + local / global - (February 10, 2015) - Tabs and new lines can be created with toString [9] and toString [10], respectively. Alternatively, a new line can also be created with toString [92,110] ("\n"). If you save these strings into a variable, they can be manipulated like any other string. For example, the following code will work just fine and return the expected output: - $Code$_tab = toString [9]; - for "_i" from 0 to 3 do - { - _tab = _tab + ( toString [9]); + (November 16, 2014) + Since there is no setRating command, its expected behaviour can scripted as such: + $Code$BNRG_fnc_setRating = { + _setRating = _this select 0; + _unit = _this select 1; + _getRating = rating _unit; + _addVal = _setRating - _getRating; + _unit addRating _addVal; }; - copyToClipboard format ["x%1x",tab];$/Code$ - - (August 25, 2015) - While you can convert any String to Array with toArray command, only numbers from 1 to 55295 (not 65535 as expected) can be successfully converted to String with toString and then back to Array with toArray without loss of data. + [1000,player] call BNRG_fnc_setRating//set player rating 1000$/Code$ + Using this example, no matter what the units rating was before, it will always set its rating to 1000. - String + Nothing + - toUpper + removeCuratorEditableObjects - Converts the supplied string to all uppercase characters. + Unregister objects which can be edited by a curator. - https://community.bistudio.com/wiki/toUpper + https://community.bistudio.com/wiki/removeCuratorEditableObjects - toUpper String + Object removeCuratorEditableObjects Array - toUpper string + curatorObj removeCuratorEditableObjects [[objects],removeCrew] - $Code$hint toUpper("AaBb1") - // returns "AABB1"$/Code$ + $Code$curatorModule removeCuratorEditableObjects [[ cursorTarget ],true]$/Code$ undefined / undefined + This scripting command must be executed on the server to work properly in multiplayer - String + Nothing + - to + getAnimSpeedCoef - Continue sequence of for var construct. It sets the end value of the index variable + Get coefficient for animation speed. - https://community.bistudio.com/wiki/to + https://community.bistudio.com/wiki/getAnimSpeedCoef - For_Type to Number + getAnimSpeedCoef Object - forType to b + getAnimSpeedCoef unit - $Code$for "_x" from 10 to 20 do {/* Do something*/}$/Code$ + $Code$getAnimSpeedCoef player ;$/Code$ undefined / undefined @@ -69919,1165 +72439,1199 @@ - For_Type + Number + - triggerActivated + getPylonMagazines - Returns true if the trigger has been activated. - Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. + Return array of magazines on pylons - https://community.bistudio.com/wiki/triggerActivated + https://community.bistudio.com/wiki/getPylonMagazines - triggerActivated Object + getPylonMagazines Object - triggerActivated trigger + getPylonMagazines vehicle - $Code$if ( triggerActivated trg1) then { - // Code - };$/Code$ + $Code$getPylonMagazines ( vehicle player )$/Code$ - global / local + undefined / undefined - If trigger already activated at least once, triggerActivated will only return false if trigger is set to activate Repeatedly. - In other words, a trigger set to activate Once will always return true once activated at least once (even if trigger is no longer activated). + (May 12, 2017) + The indexes of the returned array's elements are relative to the pylon IDs, such that element 0 is pylon 1, element 1 is pylon 2, etc. - Boolean + Array + - triggerActivation + doArtilleryFire - Returns trigger activation in the form [by, type, repeating]. - Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. + Orders a unit to reload defined magazine commence fire burst on the given position (silently). - https://community.bistudio.com/wiki/triggerActivation + https://community.bistudio.com/wiki/doArtilleryFire - triggerActivation Object + Object doArtilleryFire Array - triggerActivation trigger + unit doArtilleryFire [position, type, rounds] - + $Code$mortar1 doArtilleryFire [[3000, 120, 1000], "8Rnd_82mm_Mo_shells", 3];$/Code$ + - global / local + undefined / undefined - Array + Nothing + - triggerArea + execEditorScript - Returns currently monitored trigger area. The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. - NOTE : Since Arma 3 v1.59.135137, triggerArea returns 3rd dimension for the monitored area. If height is not set, the value for it would be -1; + Execute an editor script for the specified object. + i + Some Old Editor Command - https://community.bistudio.com/wiki/triggerArea + https://community.bistudio.com/wiki/execEditorScript - triggerArea Object + Control execEditorScript Array - triggerArea trigger + map execEditorScript [object,script] - $Code$_area = triggerArea sensor1; // result is [200, 120, 45, false]$/Code$ - - $Code$// Since Arma 3 v1.59.135137: - _area = triggerArea sensor1; // result is [200, 120, 45, false, -1];$/Code$ + $Code$_map execEditorScript ["_team_1","create"]$/Code$ - global / local + undefined / undefined - Array + Any_Value + - triggerAttachObject + groupId - Assigns a static object to the trigger. The activation source is changed to "STATIC". + Returns group name. - https://community.bistudio.com/wiki/triggerAttachObject + https://community.bistudio.com/wiki/groupId - Object triggerAttachObject Number + groupId Group - triggerName triggerAttachObject objectId + groupId group - $Code$_trigger triggerAttachObject 1234;$/Code$ + $Code$_name = groupId ( group player );$/Code$ - undefined / undefined + global / undefined - (October 31, 2013) - This command doesn't quite work in Arma 3 [1] - Further investigation reveals that objectId param for this command is some kind of map id and not the id you can see in the editor. This map id could be seen in multiplayer when looking at netId of the static objects, for example "1:-23984219837", the -23984219837 would be the objectId. Unfortunately it still doesn't work. - Nothing + String + - triggerAttachVehicle + addWeaponItem - Specifies the entity which will activate the selected trigger. - If [] is given, the trigger is decoupled from the assigned vehicle (example 2). - If the activation source is "VEHICLE", "GROUP", "LEADER" or "MEMBER", it's changed to "NONE". - If [vehicle] is given, the trigger is coupled to the vehicle or its group. - When the source is "GROUP", "LEADER" or "MEMBER", it's coupled to the group, otherwise it's coupled to the vehicle and the source is changed to "VEHICLE". + Adds a weapon item to the specified weapon. The item can be weapon magazine, in which case the amount of ammo and target muzzle could also be specified. - https://community.bistudio.com/wiki/triggerAttachVehicle + https://community.bistudio.com/wiki/addWeaponItem - Object triggerAttachVehicle Array + Object addWeaponItem Array - triggerName triggerAttachVehicle objects + unit addWeaponItem [weaponName, itemName] + + unit addWeaponItem [weaponName, [itemName, ammoCount, muzzleName]] - $Code$trigger triggerAttachVehicle [ player ];$/Code$ + $Code$player addWeaponItem ["arifle_MX_GL_ACO_F", "1Rnd_HE_Grenade_shell"];$/Code$ - $Code$trigger triggerAttachVehicle [];$/Code$ + $Code$player addWeaponItem ["arifle_MX_GL_ACO_F", ["1Rnd_HE_Grenade_shell", 1, "GL_3GL_F"]];$/Code$ - global / local + local / global - Nothing + Nothing + - triggerAttachedVehicle + setEditorMode - Returns vehicle attached to the trigger (for example using triggerAttachVehicle ). - Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. + Sets map mode to MAP,3D or PREVIEW. + i + Some Old Editor Command - https://community.bistudio.com/wiki/triggerAttachedVehicle + https://community.bistudio.com/wiki/setEditorMode - triggerAttachedVehicle Object + Control setEditorMode String - triggerAttachedVehicle trigger + map setEditorMode mode - $Code$return = triggerAttachedVehicle triggerName;$/Code$ - + - global / local + undefined / undefined - Object + Nothing + - triggerDynamicSimulation + disableTIEquipment - Controls ability of given unit to activate entities with disabled Arma_3_Dynamic_Simulation. If false dynamically disabled entities will not be activated by unit presence + Disables TI (Thermal Imaging) equipment for given vehicle. In older versions of Arma this command would also disable NV (Night Vision), but since Arma 3 v1.52.132676 this command disables only TI. Use disableNVGEquipment to disable NV. - https://community.bistudio.com/wiki/triggerDynamicSimulation + https://community.bistudio.com/wiki/disableTIEquipment - Object triggerDynamicSimulation Boolean + Object disableTIEquipment Boolean - unit triggerDynamicSimulation trigger + vehicle disableTIEquipment state - $Code$player triggerDynamicSimulation false ;$/Code$ + $Code$vehicle player disableTIEquipment true ;$/Code$ + + $Code$_tank disableTIEquipment true ;$/Code$ - undefined / undefined + global / global - Nothing + Nothing + - triggerStatements + removeItems - Returns trigger statements in the form [cond, activ, desactiv]. - Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. + Removes all items with given template from the inventory. - https://community.bistudio.com/wiki/triggerStatements + https://community.bistudio.com/wiki/removeItems - triggerStatements Object + Object removeItems String - triggerStatements trigger + unit removeItems item - + $Code$player removeItems "FirstAidKit";$/Code$ + - global / local + undefined / undefined - Array + Nothing + - triggerText + addMenuItem - Returns trigger text. - Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. + Creates a new menu item. Menu can be "file" or "view",index is index,as returned from addMenu command. priority is optional and determines,where in the menu the item will reside (higher priority items first). + i + Some Old Editor Command - https://community.bistudio.com/wiki/triggerText + https://community.bistudio.com/wiki/addMenuItem - triggerText Object + Control addMenuItem Array - triggerText trigger + map addMenuItem [menu or index,text,command,priority] - $Code$result = triggerText triggerName;$/Code$ - + - global / local + undefined / undefined - String + Number + - triggerTimeoutCurrent + ppEffectForceInNVG - Returns trigger timeout or -1 if countdown is not in progress. - Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. + Forces use of Post process effects in NVG. - https://community.bistudio.com/wiki/triggerTimeoutCurrent + https://community.bistudio.com/wiki/ppEffectForceInNVG - triggerTimeoutCurrent Object + Number ppEffectForceInNVG Boolean - triggerTimeoutCurrent trigger + number ppEffectForceInNVG bool - $Code$_remaining = triggerTimeoutCurrent _trigger;$/Code$ + $Code$_ppGrain ppEffectForceInNVG true ;$/Code$ - global / local + undefined / undefined - (November 26, 2013) - Triggers have their own schedule. If you create a trigger with timeout and try to read triggerTimeoutCurrent immediately it will return -1. This is because the countdown will not start until the next scheduled trigger check is due, and this could take up to 0.5 seconds. - Number + Nothing + - triggerTimeout + setUnconscious - Returns trigger timeout in the form [min, mid, max, interruptable]. - Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. + Since Arma 3 v1.63.136889, this command sets unit into incapacitated state and lifeState command returns "INCAPACITATED". Animation played while incapacitated depends on the injuries received. - https://community.bistudio.com/wiki/triggerTimeout + https://community.bistudio.com/wiki/setUnconscious - triggerTimeout Object + Object setUnconscious Boolean - triggerTimeout trigger + unit setUnconscious set - + $Code$_unit setUnconscious true;$/Code$ + - global / local + local / global - Array + Nothing + - triggerType + getPos - Returns trigger type (see setTriggerType ). - Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. + Returns the object position in format PositionAGLS. Z value is height over the surface underneath. + Since Arma 3 v1.55.133361, an alternative syntax is added that allows to get position given distance and heading away from original object or position, the equivalent of BIS_fnc_relPos - https://community.bistudio.com/wiki/triggerType + https://community.bistudio.com/wiki/getPos - triggerType Object + getPos Object/Location + + Object/Position2D/Position3D getPos Array - triggerType trigger + getPos object + + origin getPos [distance, heading] - $Code$_type = triggerType tr1;$/Code$ + $Code$hintSilent str getPos player ;$/Code$ + + $Code$// getPos vs. other methods (over sea) + diag_log getPos ship; // [2412.01, 6036.33, -0.839965] + diag_log getPosATL ship; // [2412.01, 6036.33, 19.4266] + diag_log getPosASL ship; // [2412.01, 6036.33, -0.920066] + diag_log getPosASLW ship; // [2412.01, 6036.33, -0.865981] + diag_log visiblePosition ship; // [2412.02, 6036.33, -0.837952] + diag_log visiblePositionASL ship; // [2412.02, 6036.33, -0.91798] + diag_log position ship; // [2412.01, 6036.33, -0.839965]$/Code$ + + $Code$// getPos vs. other methods (over land) + diag_log getPos car; // [2508.64, 5681.47, 0.0609589] + diag_log getPosATL car; // [2508.64, 5681.47, 0.0356369] + diag_log getPosASL car; // [2508.64, 5681.47, 71.718] + diag_log getPosASLW car; // [2508.64, 5681.47, 71.718] + diag_log visiblePosition car; // [2508.64, 5681.47, 0.0609512] + diag_log visiblePositionASL car; // [2508.64, 5681.47, 71.718] + diag_log position car; // [2508.64, 5681.47, 0.0609589]$/Code$ + + $Code$// Find position 100 metres and 45 degrees from player position: + player getPos [100,45];$/Code$ - global / local + global / undefined + (16 Feb, 2007) + getPos obj select 2 + might return the vertical position above ground level, but for a stacked object, it returns the vertical position above the object beneath it. The same problem exists for getPosASL. There was a discussion thread in the BIS forums which suggested the use of the command modelToWorld instead to get around this issue where an absolute vertical position is required. ArmA Ver 1.02. + + (6 Feb, 2011) + The z height returned changes dynamically with the height of waves beneath the object, if the object is located over sea. The z height returned by getPosATL and getPosASL does not change like this. This was tested by continuously retrieving the position of a static object, like the cross in the empty/corpses category, placed over sea or land. + getPos behaves similar to + _obj modelToWorld [0.0, 0.0, 0.0] + but it does not give the same result, therefore + (_obj modelToWorld [0.0, 0.0, 0.0]) is not the same as (getPos _obj). + + (23 Nov, 2011) + You can use getPos and setPos on triggers. - String + Array - Array + - true + addMagazine - Always true + Add a magazine to a person. Infantry units can only carry a specific number of magazines, once the magazine slots are filled (or uniform/vest/bagpack are full in Arma3), any further addMagazine commands are ignored. + NOTE: use addMagazine before addWeapon for the weapon to be loaded. - https://community.bistudio.com/wiki/true + https://community.bistudio.com/wiki/addMagazine - true + Object addMagazine String + + Object addMagazine Array - true + unitName addMagazine magazineName + + unitName addMagazine [magazineName, ammoCount] - $Code$_var = true ; - systemChat str _var; //true$/Code$ + $Code$player addMagazine "30Rnd_556x45_STANAG";$/Code$ + + $Code$player addMagazine ["30Rnd_556x45_STANAG", 15]; // since Arma 2 OA 1.62$/Code$ + + $Code$nonLocalUnit addMagazine ["30Rnd_556x45_STANAG", 15]; // global argument since Arma 3$/Code$ + + $Code$player addMagazine ["30Rnd_556x45_STANAG", 9999]; // will give a 30 rounds magazine anyway$/Code$ - undefined / undefined + local / global + (August 2, 2006) + If the unit has magazines already, you may need to use the commands removeMagazine or removeMagazines to make space for the mags you want to add. + + (February 21, 2010) + In turreted vehicles the magazine is added to the first turret with primaryGunner = 1; set in the Vehicles turret config part (and the magazine is ONLY added to the very first turret if more than one is configged with primaryGunner = 1; ). + + (May 12, 2010) + When wanting to add many magazines to an object's init-line it can be easier to use loops than to just repeat the addMagazine command. + If you want to add N magazines to an object either of the two below ways are handy, the first for fewer magazines, and the latter when you want to add many since it then is the easiest of the two to read. + $Code${this addMagazine "magazineClassName"} forEach [1,2,3,...,N]; + for "_i" from 0 to (N - 1) do {this addMagazine "magazineClassName"};$/Code$ + + (November 28, 2017) + If adding a magazine to an empty artillery support with this command in ArmA 3, use reload. If you do not reload, Artillery calls will not fire rounds, because the AI won't reload automatically (tested with 82mm mortar) - Boolean + Nothing - Nothing + - try + hint - Defines a try-catch structure. This sets up an exception handling block. Any thrown exception in a try block is caught in a catch block. The structured exception block has the following form: - $Code$ try //begin of try-catch block - { //block, that can throw exception } - catch - { //block, that process an exception. Exception is described in _exception variable };$/Code$ + Outputs a multi-line hint message in the left upper corner of the screen (in the right upper corner in Arma). This version of hint is supposed to play a sound when hint is shown, but this varies between games and versions. Use hintSilent for soundless hint. + The effect of this command is local, i.e. the hint will only show on the computer command was executed. - https://community.bistudio.com/wiki/try + https://community.bistudio.com/wiki/hint - try Code - - Anything try Code + hint String/Structured_Text - try code - - args try code + hint text - + $Code$hint "Press W to move forward. \nPress S to move backwards." + outputs the following message: + Press W to move forward. + Press S to move backwards. + Known Problems: Avoid hint messages that exceed the screen, as this may lead to crashes.$/Code$ + - undefined / undefined + undefined / local - (June 9, 2015) - Do not expect this behave like Javascript try catch and ignore all errors. But it does have one useful behaviour. Normally when runtime error occurs in SQF (unlike when there is compile error) it continues to execute till the end. But if the script is placed in try {} scope and throw is used upon error, the script immediately terminates, exits the try {} scope and enters catch {} scope. This way it is possible to process possible exceptions in civilised manner. + Hint can be used with formatting like this: + $Code$ hint format ["Hello %1", player ]$/Code$ + + To remove the hint box from the screen, pass a null string ( "" ) to the command. + $Code$ hint ""$/Code$ + + hint happily accepts structured text : + $Code$_starL = " img image='\ca\ui\data\debr_star.paa' align='left'/ "; + _starL = _starL + _starL + _starL; + _starR = " img image='\ca\ui\data\debr_star.paa' align='right'/ "; + _starR = _starR + _starR + _starR; + _title = " t color='#ff0000' size='1.2' shadow='1' shadowColor='#000000' align='center' TITLE /t "; + _text = "Bla bla bla bla bla..."; + hint parseText (_starL + _starR + _title + _text); + $/Code$ + (Tested with 1.14, 1.15 beta and 1.16 beta) + + (October 20, 2014) + Be careful when using hints to visualize the effects of commands using the Debug Console. Hint can accept an undefined variable and neither the error nor the hint is shown, the command simply fails. Also notice how the hint command should be "hint str _o;" + $Code$for "_i" from 0 to 50 do + { + hint _o; + };$/Code$ + tested in A3 1.32.127785 In a script, an "undefined variable" error will be shown as expected. + + (October 21, 2014) + Contrary to what's written under "Examples", Arma 3 will happily display hints that far exceed screen space. However, as hints get longer, FPS suffers tremendously. + (tested in Debug Console, A3 1.32.127785, using: + $Code$hint str (( nearestObjects [player, ["BUILDING"], 100]) - [player]); [] spawn { sleep 5; systemChat str diag_fps;}; + hint str (( nearestObjects [player, ["BUILDING"], 1000]) - [player]); [] spawn { sleep 5; systemChat str diag_fps;};$/Code$ + Results were: 59.7015 and 5.17297, respectively. Drawing a hint even longer than this, such as nearestObjects with a radius of 10,000 or 100,000 reduces your FPS so much Arma 3 appears to crash, though it doesn't. + Unrelated: Hints will stay on screen for 30 seconds, then fade away over the course of 5 seconds. Tested with: (A3 1.32.127785) + $Code$hint "a";[] spawn{_counter = 0;while {true} do{sleep 1;_counter = _counter + 1;systemChat str _counter;};};$/Code$ + + (February 17, 2015) + An open dialog will pause the 30-second hint fade timer. + (A3 1.38.128937) + + (March 25, 2017) + The hint sound is audible only when you have the music volume turned up above 0 in the audio settings. Otherwise, it seems to act the same as hintSilent. + This is important because if you are running a hint that fires at 30 fps or more, the hint will slow down machines that have the music volume turned up but won't slow down machines that have the music volume turned off. + Best practice is to use hint for an alert to the player and use hintSilent for a makeshift display of data to the player that is updated fairly often. - Exception - Exception + Nothing + - turretLocal + setGroupId - Checks if a turret is local. - Some info on turrets: A vehicle turret will change locality when player gunner gets in it, just like vehicle changes locality when player driver gets in it. Many commands for turrets work only where turret is local. When gunner leaves turret it is supposed to change locality to the locality of the vehicle. + Sets a group's identity, how it will be displayed in chat, for example. While groups on the different sides can have identical ids, the groups on the same side cannot. When given id exists already, the group which currently has it will simply swap it with the current id of the group for which this id is intended. For example: + $Code$group1 = createGroup west ; + group2 = createGroup west ; + group1 setGroupId ["Active Group"]; + group2 setGroupId ["Inactive Group"]; + systemChat groupId group1; //"Active Group"; + systemChat groupId group2; //"Inactive Group"; + group2 setGroupId ["Active Group"]; + systemChat groupId group1; //"Inactive Group"; + systemChat groupId group2; //"Active Group";$/Code$ + The identity setup could also consist of format keywords (marked with %) and param keywords taken from CfgWorlds config. Basically it is like format command but with some special group keywords. For Arma 3 possible values are: + %GroupSquad + "Squad1" - 1 + "Squad2" - 2 + "Squad3" - 3 + "Squad4" - 4 + %GroupPlatoon + "Platoon1" - 1 + "Platoon2" - 2 + "Platoon3" - 3 + "Platoon4" - 4 + %GroupCompany + "CompanyAlpha" - Alpha + "CompanyBravo" - Bravo + "CompanyCharlie" - Charlie + "CompanyDelta" - Delta + "CompanyEcho" - Echo + "CompanyFoxtrot" - Foxtrot + "CompanyGolf" - Golf + "CompanyHotel" - Hotel + "CompanyIndia" - India + "CompanyKilo" - Kilo + "CompanyLima" - Lima + "CompanyMike" - Mike + "CompanyNovember" - November + "CompanyOscar" - Oscar + "CompanyPapa" - Papa + "CompanyQuebec" - Quebec + "CompanyRomeo" - Romeo + "CompanySierra" - Sierra + "CompanyTango" - Tango + "CompanyUniform" - Uniform + "CompanyVictor" - Victor + "CompanyWhiskey" - Whiskey + "CompanyXray" - X-Ray + "CompanyYankee" - Yankee + "CompanyZulu" - Zulu + %GroupNames + "Alpha" - Alpha + "Bravo" - Bravo + "Charlie" - Charlie + "Delta" - Delta + "Echo" - Echo + "Foxtrot" - Foxtrot + "Golf" - Golf + "Hotel" - Hotel + "November" - November + "Kilo" - Kilo + "Yankee" - Yankee + "Zulu" - Zulu + "Two" - Two + "Three" - Three + "Buffalo" - Buffalo + "Guardian" - Guardian + "Convoy" - Convoy + "Fox" - Fox + %GroupColors + "GroupColor1" - Black + "GroupColor2" - Red + "GroupColor3" - Green + "GroupColor4" - Blue + "GroupColor5" - Yellow + "GroupColor6" - Orange + "GroupColor7" - Pink + "GroupColor0" - + "Six" - Six + For global variant of this command use setGroupIdGlobal. - https://community.bistudio.com/wiki/turretLocal + https://community.bistudio.com/wiki/setGroupId - Object turretLocal Array + Object/Group setGroupId Array - vehicle turretLocal turretPath + group setGroupId [nameFormat, nameParam1,, nameParamN] - $Code$_isLocal = vehicle player turretLocal [0];$/Code$ + $Code$// Arma 3 : + group player setGroupId ["Some name for the group"]; + hint groupId group player ; //"Some name for the group" + player sideChat "lalala"; //Some name for the group (KK): "lalala"$/Code$ - $Code$if (heli turretLocal [1]) then {heli setVehicleAmmo 1};$/Code$ + $Code$// Arma 3 : + group player setGroupId ["%GroupNames :=: %GroupColors","Alpha","GroupColor2"]; + hint groupId group player ; //"Alpha :=: Red" + player sideChat "lalala"; //Alpha :=: Red (KK): "lalala"$/Code$ - $Code$if ( isNil {heli turretLocal [5]}) then { hint "Turret 5 is non-existent"};$/Code$ + $Code$// OFP : + _group1 setGroupId ["Delta","GroupColor4"]$/Code$ + + $Code$// ArmA / ArmA 2 : + _group1 setGroupId ["Assault Squad"]$/Code$ - global / undefined + global / local + Letter is one of: + "Alpha" + "Bravo" + "Charlie" + "Delta" + "Echo" + "Foxtrot" + "Golf" + "Hotel" + "Kilo" + "Yankee" + "Zulu" + "Buffalo" + "Convoy" + "Guardian" + "November" + "Two" + "Three" + "Fox" + Colour may be one of the following: + "GroupColor0" - (Nothing) + "GroupColor1" - Black + "GroupColor2" - Red + "GroupColor3" - Green + "GroupColor4" - Blue + "GroupColor5" - Yellow + "GroupColor6" - Orange + "GroupColor7" - Pink + "Six" - Six + + (August 4, 2006) + Notes from before the conversion: + Note that this command does not name the group. To call a group "grp1", for example, write this in the init field of the group leader : + grp1 = group this + + (December 9, 2006) + Selfdefined Callsigns: + In Armed Assault you're able to define the callsignletter by yourself. This can be for example "Fireteam", or "Specialforces". + this setgroupId ["Attackteam"] + + In OFP v1.96, the radio callsign strings for a mission can be redefined by creating a stringtable.csv in the mission folder. All string names except FOX can be found within the main stringtable.csv. Note "SIX" has a string suggesting it is a groupname, although the engine uses it as a colour. Some examples of the string names : STR_CFG_GRPNAMES_ALPHA, STR_CFG_GRPNAMES_FOX, STR_CFG_GRPCOL_BLACK, STR_CFG_GRPNAMES_SIX, STR_CFG_FIREFLYBASE, STR_CFG_PAPABEAR, STR_CFG_HQ_BASE, STR_CFG_HQ_BASE. + + (April 21, 2015) + List of available keywords from config: $Code$"if ((configName _x) select [0, 5] == 'group') then { + diag_log ('%' + configName _x); + for '_i' from 0 to count _x - 1 do { + diag_log ('* ""' + configName (_x select _i) + '"" - ' + getText ((_x select _i) 'name')); + }; + }; false" configClasses (configFile "CfgWorlds");$/Code$ - Boolean/Nothing + Nothing + - turretOwner + shownWatch - Returns id of the owner of the turret. Server only. Returns 0 on non-server and SP. - Some info on turrets: A vehicle turret will change locality when player gunner gets in it, just like vehicle changes locality when player driver gets in it. Many commands for turrets work only where turret is local. When gunner leaves turret it is supposed to change locality to the locality of the vehicle. A vehicle can have one owner while turrets have different owners. + Checks if client has Watch enabled in description.ext ( showWatch param) or force enabled with showWatch command. - https://community.bistudio.com/wiki/turretOwner + https://community.bistudio.com/wiki/shownWatch - Object turretOwner Array + shownWatch - vehicle turretOwner turretPath + shownWatch - $Code$_ownerId = vehicle player turretOwner [0];$/Code$ + $Code$if ( shownWatch ) then { hint "You have Watch enabled"};$/Code$ - global / undefined + undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Number + Boolean + - turretUnit + drop - Returns the unit in the vehicle turret. Driver turret [-1] is supported since Arma 3 v1.57.135045 + Creates a particle effect. + This command is used to create smoke, fire and similar effects. + The particles are single polygons with single textures that always face the player. + They can be set to dynamically change their position, size, direction, can be set to different weights and more or less dependant on the wind. - https://community.bistudio.com/wiki/turretUnit + https://community.bistudio.com/wiki/drop - Object turretUnit Array + drop Array - vehicle turretUnit turretpath + drop array - $Code$_vehicle turretUnit _thisTurret$/Code$ + $Code$drop ["cl_basic", "", "Billboard", 1, 1, [-3.5*( sin ( direction xural)), + -3.5*( cos ( direction xural)),0], [ random 0.1, random 0.1, random 0.5], 1, 0.005, 0.0042, + 0.7, [0.3,3], [[0.5,0.5,0.5,0],[0.7,0.7,0.7,0.5],[0.9,0.9,0.9,0]], [0,1,0,1,0,1], + 0.2, 0.2, "", "", xural]$/Code$ - undefined / undefined + undefined / local - Object + Nothing + - tvAdd + groupOwner - Adds an item with given text to Tree View control. The position on Tree View where to add the item and the actual path to this item once added are different. If item is added to existing item, then parent item path is used. If no parent exists, empty array [] is used. See Tree View Path for more information. + Returns ID of client to which the group is local. Can be run only from server. When called from client, it always returns 0 - https://community.bistudio.com/wiki/tvAdd + https://community.bistudio.com/wiki/groupOwner - tvAdd Array - - Control tvAdd Array + groupOwner Group - tvAdd [idc, pathParent, text] - - control tvAdd [pathParent, text] + groupOwner group - $Code$_index = _ctrl tvAdd [[], "Parent Item"];$/Code$ - - $Code$_index = tvAdd [101, [0], "First item"];$/Code$ + $Code$_clientID = groupOwner _someGroup;$/Code$ - undefined / undefined + global / undefined - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ + This scripting command must be executed on the server to work properly in multiplayer - Number - Number + Number + - tvClear + attackEnabled - Removes all items from Tree View with given idc. + Return whether a group's leader can issue attack commands to soldiers under his command. - https://community.bistudio.com/wiki/tvClear + https://community.bistudio.com/wiki/attackEnabled - tvClear Number - - tvClear Control + attackEnabled Object/Group - tvClear idc - - tvClear control + attackEnabled name - $Code$tvClear 101;$/Code$ + $Code$if (not attackEnabled _soldier) then {_soldier setCombatMode "Careless"}$/Code$ - local / local + global / undefined - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ - Nothing - Nothing + Boolean + - tvCollapseAll + setMarkerAlphaLocal - Collapses all tree items for the given Tree View. + Sets the marker alpha. The marker is only modified on the computer where the command is called. + When alpha equals 1, the marker is visible, but if alpha equals 0, then the marker is invisible. + Alpha can be numbers and fractions. - https://community.bistudio.com/wiki/tvCollapseAll + https://community.bistudio.com/wiki/setMarkerAlphaLocal - tvCollapseAll Number - - tvCollapseAll Control + String setMarkerAlphaLocal Number - tvCollapseAll idc - - tvCollapseAll control + marker setMarkerAlphaLocal alpha - $Code$tvCollapseAll 101;$/Code$ + $Code$"my_marker" setMarkerAlphaLocal 0.5;$/Code$ - $Code$tvCollapseAll _ctrl;$/Code$ + $Code$"enemy_convoy_marker" setMarkerAlphaLocal 0;$/Code$ - local / local + undefined / local + (January 7, 2010) + + The range for 'alpha' is 0... 1 - Nothing - Nothing + Nothing + - tvCollapse + removeOwnedMine - Collapses tree item pointed to by the path. IDC means id of parent Tree View. + Removes ownership over a remotely detonatable mine from the unit. - https://community.bistudio.com/wiki/tvCollapse + https://community.bistudio.com/wiki/removeOwnedMine - tvCollapse Array - - Control tvCollapse Array + Object removeOwnedMine Object - tvCollapse [idc, path] - - control tvCollapse path + unit removeOwnedMine mine - $Code$tvCollapse [101, [0]];$/Code$ - - $Code$_ctrl tvCollapse [0];$/Code$ + $Code$player removeOwnedMine SuperMine;$/Code$ - local / local + undefined / undefined - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ - Nothing - Nothing + Nothing + - tvCount + vehicles - Returns childrens count of item on given path. IDC means id of parent Tree View. + Returns an array of all vehicles available to current client. This command returns both empty and crewed vehicles but not soldiers. It will also return "WeaponHolderSimulated" of dead bodies (weapon on the ground). Vehicles created with createVehicleLocal will only be returned on the client that created them. - https://community.bistudio.com/wiki/tvCount + https://community.bistudio.com/wiki/vehicles - tvCount Array - - Control tvCount Array + vehicles - tvCount [idc, [path]] - - _ctrl tvCount [path] + vehicles - $Code$tvCount [101, [0]];$/Code$ - - $Code$_ctrl tvCount [1,0];$/Code$ + $Code$_vehicles = vehicles ;$/Code$ - local / local + undefined / local - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ - Number - Number + Array + - tvCurSel + canFire - Returns path to currently selected item. IDC means id of parent Tree View. + Returns true if the given vehicle is still able to fire. For the command to return true, vehicle must be alive, have weapon operator and the weapon cannot be damaged = 0.9 but can be empty due to running out of ammo. If mission starts with vehicle having no ammo or setVehicleAmmo 0 command is executed on the vehicle, then canFire will always report false for it. - https://community.bistudio.com/wiki/tvCurSel + https://community.bistudio.com/wiki/canFire - tvCurSel Number - - tvCurSel Control + canFire Object - tvCurSel idc - - tvCurSel control + canFire unitName - $Code$tvCurSel 101;$/Code$ + $Code$// SQS: + ?!( canFire _tank) : player sideChat "Tank disabled!"$/Code$ - $Code$tvCurSel _ctrl;$/Code$ + $Code$// SQF: + if ( ! ( canFire _tank)) then { + player sideChat "Tank disabled!"; + };$/Code$ - local / local + global / undefined - (Sep 11 2014) - (A3 1.28)tv command fmily overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ + (07:16, 20 January 2007 (CEST)) + true even if unit is out of ammo. Only false if gun is damaged. + + (05:20, 24 August 2008 (CEST)) + False if there is no gunner in the vehicle, regardless of damage level. + + (07:20, 23 April 2018 (UTC)) + This command seems to have evolved. Returns "true" (on Hunter, Ifrit) even if Gun's damage is set to 1 and turret also, as far there is a gunner. The only way to obtain a canFire "false" is to make the crew disembark (2 burned tires for example). Then no matter the gun state, if the gunner disembarks without order, the vehicle can't fire. In this case: can't move can't fire. + NB: if you jump into a hunter HMG after having setHitPointDamage(d) "hitTurret" and "hitGun" to 1, the turret can't rotate any more, the gun is pitched down but you can fire (trigger) to the ground. Difficult to check the behavior for each vehicles. - Array - Array + Boolean + - tvData + vestItems - Returns string data from item on given path. IDC means id of parent Tree View. + Get array with all items (of any kind, even weapons) from vest. - https://community.bistudio.com/wiki/tvData + https://community.bistudio.com/wiki/vestItems - tvData Array - - Control tvData Array + vestItems Object - tvData [idc, [path]] - - control tvData [path] + vestItems unit - $Code$tvData [101, [0]];$/Code$ - - $Code$(_display displayCtrl 101) tvData [0];$/Code$ + $Code$vestItems player ;[ + "30Rnd_65x39_caseless_mag", + "30Rnd_65x39_caseless_mag", + "16Rnd_9x21_Mag", + "16Rnd_9x21_Mag", + "HandGrenade", + "HandGrenade", + "SmokeShell", + "SmokeShellGreen", + "Chemlight_green", + "Chemlight_green" + ]$/Code$ - local / local + undefined / undefined - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ - String - String + Array + - tvDelete + ctrlSetEventHandler - Removes an item with given Tree View Path from Tree View. The paths of other items on the same branch are updated accordingly and may change. + Sets given event handler of given control. + The provided function should return true/false indicating that the event has handled this event fully or not and whether the engine should execute it's default code or not afterwards. + See User Interface Event Handlers for the full list of handler names. + If applicable, see DIK_KeyCodes for a list of key code constants, which are relevant to key related user interface events like: KeyDown & KeyUp. - https://community.bistudio.com/wiki/tvDelete + https://community.bistudio.com/wiki/ctrlSetEventHandler - tvDelete Array - - Control tvDelete Array + Control ctrlSetEventHandler Array - - tvDelete [idc, path] - - control tvDelete path - - - $Code$tvDelete [101, [0, 0]];$/Code$ - - $Code$_ctrl tvDelete [0, 0];$/Code$ - - - local / local - - - (Sep 11 2014) - (A3 1.28)tv command fmily overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ + + controlName ctrlSetEventHandler [handlerName, function] + + + $Code$_control ctrlSetEventHandler ["KeyDown", ""]$/Code$ + + $Code$(_display displayCtrl 108) ctrlSetEventHandler ["LBSelChanged","['ListChange',_this] call FireEvents"];$/Code$ + + + undefined / undefined + + + The article User Interface Event Handlers contains a list of event handler names. + Be aware though, that the preceding "on" in the listed names must be eliminated when used with the ctrlSetEventHandler command. + e.g. instead of $Code$ _control ctrlSetEventHandler [" OnLBSelChanged ", ""]; // WRONG $/Code$ + use + $Code$ _control ctrlSetEventHandler [" LBSelChanged ", ""]; // RIGHT $/Code$ - Nothing - Nothing + Nothing + - tvExpand + modelToWorldVisualWorld - Expands tree item pointed to by the path. IDC means id of parent Tree View. + Converts position from object model space to world space in render time. - https://community.bistudio.com/wiki/tvExpand + https://community.bistudio.com/wiki/modelToWorldVisualWorld - tvExpand Array - - Control tvExpand Array + Object modelToWorldVisualWorld Array - tvExpand [idc, path] - - control tvExpand path + obj modelToWorldVisualWorld modelPos - $Code$tvExpand [101, [0]];$/Code$ - - $Code$_ctrl tvExpand [1];$/Code$ + $Code$player modelToWorldVisualWorld [0,1,0]$/Code$ - local / local + undefined / undefined - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ + (May 28, 2017) + This command produces identical result to modelToWorldVisual command used in conjunction with AGLToASL + $Code$obj modelToWorldVisualWorld [1,2,3] isEqualTo AGLToASL (obj modelToWorldVisual [1,2,3]); // true$/Code$ - Nothing - Nothing + Array + - tvExpandAll + param - Expands all tree items for the given Tree View. + Extracts a single value with given index from input argument, similar to BIS_fnc_param. When used without argument, as shown in main syntax, internal variable _this, which is usually available inside functions and event handlers, is used as argument. If input argument is not an array, it will be converted to 1 element array. + If extracted item of input with given index is undefined, of the wrong type or of the wrong length (if the item is an array), default value is used instead. Since Arma 3 v1.53.132691, onscreen errors are displayed for when the input is of the wrong type or size. - https://community.bistudio.com/wiki/tvExpandAll + https://community.bistudio.com/wiki/param - tvExpandAll Number + param Array - tvExpandAll Control + Anything param Array - tvExpandAll idc + param [index, defaultValue, expectedDataTypes, expectedArrayCount] - tvExpandAll control + argument param [index, defaultValue, expectedDataTypes, expectedArrayCount] - $Code$tvExpandAll 101;$/Code$ + $Code$[1, 2, 3] call + { + private _one = param [0, 1]; + private _two = param [1, 2]; + private _three = param [2, 3]; + //..... + };$/Code$ - $Code$tvExpandAll _ctrl;$/Code$ + $Code$[123] call + { + private _val = param [0]; + }; + // Below would produce the same result as above + 123 call + { + private _val = param [0]; + };$/Code$ + + $Code$_z = position player param [2, 0]; + if (_z 10) then + { + hint "YOU ARE FLYING!"; + };$/Code$ + + $Code$fnc = + { + private _pos = param [0, [0,0,0], [ objNull, []], [2,3]]; + private _rad = param [1, 0, [0]]; + _pos nearObjects _rad; + }; + [ position player, 25] call fnc; //ok + [ player, 25] call fnc; //ok + [25, player ] call fnc; //default values are used$/Code$ - local / local + undefined / undefined + (November 8, 2016) + You can also use param in a complex with another commands. For example call, compile and format : + $Code$["var = 2"] call { + call compile format ["%1", param [0,"",[""]]]; // compiled param string value + hint str (var); // 2 + }; + $/Code$ - Nothing - Nothing + Anything - Anything + - tvPicture + getRemoteSensorsDisabled - Returns name of picture from item pointed to by path. IDC means id of parent Tree View. + Get status of disabled raycasts for remote entities. See disableRemoteSensors for detailed description. - https://community.bistudio.com/wiki/tvPicture + https://community.bistudio.com/wiki/getRemoteSensorsDisabled - tvPicture Array - - Control tvPicture Array + getRemoteSensorsDisabled - tvPicture [idc, [path]] - - _ctrl tvPicture [path] + getRemoteSensorsDisabled - $Code$tvPicture [101, [0]];$/Code$ - - $Code$_ctrl tvPicture [0,0,0];$/Code$ + $Code$_status = getRemoteSensorsDisabled ;$/Code$ - local / local + undefined / undefined - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ - String - String + Boolean + - tvSetColor + enableMimics - Sets text color on given Tree View Item + Enables/disables mimics on a given unit. - https://community.bistudio.com/wiki/tvSetColor + https://community.bistudio.com/wiki/enableMimics - tvSetColor Array - - Control tvSetColor Array + Object enableMimics Boolean - tvSetColor [idc, path, color] - - control tvSetColor [path, color] + unit enableMimics enabled - $Code$tvSetColor [101, [0,0], [1,0,0,1]];$/Code$ - - $Code$_ctrl tvSetColor [[0,0], [1,0,0,1]];$/Code$ + $Code$cursorTarget enableMimics false ;$/Code$ undefined / undefined @@ -71085,483 +73639,494 @@ - Nothing - Nothing + Nothing + - tvSetCurSel + rotorsForcesRTD - Sets cursor to given item on given path. IDC means id of parent Tree View. To deselect all items use [-1] for the path param ( available since Arma 3 v1.55.133898 ) + Returns force produced by rotors. - https://community.bistudio.com/wiki/tvSetCurSel + https://community.bistudio.com/wiki/rotorsForcesRTD - tvSetCurSel Array - - Control tvSetCurSel Array + rotorsForcesRTD Object - tvSetCurSel [idc, path] - - control tvSetCurSel path + rotorsForcesRTD RTD_helicopter - $Code$tvSetCurSel [101, [0]];$/Code$ - - $Code$_ctrl tvSetCurSel [0,0,0];$/Code$ - - $Code$[] spawn - { - disableSerialization ; - _CT_TREE = findDisplay 46 ctrlCreate ["RscTree", -1]; - _CT_TREE ctrlSetPosition [0,0,0.3,1]; - _CT_TREE ctrlCommit 0; - _CT_TREE tvAdd [[],"Parent_A"]; - _CT_TREE tvAdd [[0],"Child_A"]; - _CT_TREE tvAdd [[0,0],"Grandchild_A"]; - _CT_TREE tvAdd [[],"Parent_B"]; - _CT_TREE tvAdd [[1],"Child_B"]; - sleep 1; - hint "SELECT [0,0,0]"; - _CT_TREE tvSetCurSel [0,0,0]; - sleep 2; - hint "DESELECT ALL"; - _CT_TREE tvSetCurSel [-1]; - };$/Code$ + $Code$_rotorForces = rotorsForcesRTD _taru// Returns [[-465.981,351.941,45960.5],[-469.079,397.451,46933.3]]$/Code$ undefined / undefined - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [[],"Parent_A"]; - _CT_TREE tvAdd [[0],"Child_A"]; - _CT_TREE tvAdd [[0,0],"Grandchild_A"]; - _CT_TREE tvAdd [[],"Parent_B"]; - _CT_TREE tvAdd [[1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ + (November 4, 2014) + There is no official information I can find on what these values mean. According to my testing on the Mi-290 Taru, here is what I have come up with: + $Code$[[ rotor 1 roll +right/-left, rotor 1 pitch +down/-up, rotor 1 collective +up/-down ], + [ rotor 2 roll +right/-left, rotor 2 pitch +down/-up, rotor 2 collective +up/-down ]]$/Code$ + When yawing left and right, rotor 1 and 2 collective differ from each other. This is normal behaviour with coaxial rotors. Yawing right increase rotor 1 collective and decreases rotor 2 collective. Yawing left does the opposite. Rotor 1 in this example seems to be the bottom rotor. - Nothing - Nothing + Array + - tvSetData + mapAnimCommit - Sets string data to item on given path. IDC means id of parent Tree View. + Play map animation. - https://community.bistudio.com/wiki/tvSetData + https://community.bistudio.com/wiki/mapAnimCommit - tvSetData Array - - Control tvSetData Array + mapAnimCommit - tvSetData [idc, [path], data] - - _ctrl tvSetData [ [path], data] + mapAnimCommit - $Code$tvSetData [101, [0], "Test data"];$/Code$ - - $Code$_ctrl tvSetData [ [0,0,0], "Test data"];$/Code$ - + local / local - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ + In OFP v1.96, the mapAnim series of commands, together with forceMap can only be used in the intro and mission, as it is not possible to access the map from the outro. (not checked, sourced from an old copy of the OFPEC comref) - Nothing - Nothing + Nothing + - tvSetPictureColorDisabled + pushBack - Sets the color of left picture of a tree item defined by path when item is disabled + Insert an element to the back of the given array. This command modifies the original array. (see also: pushBackUnique ) - https://community.bistudio.com/wiki/tvSetPictureColorDisabled + https://community.bistudio.com/wiki/pushBack - Control tvSetPictureColorDisabled Array + Array pushBack Anything - control tvSetPictureColorDisabled [path, color] + array pushBack element - $Code$_control tvSetPictureColorDisabled [[0], [1,0,1,1]]$/Code$ + $Code$_arr = [1,2,3]; + _arr pushBack 4; + hint str _arr; //[1,2,3,4]$/Code$ + + $Code$_arr = [1,[2,4],3]; + (_arr select 1) pushBack [5,6]; + hint str _arr //[1,[2,4,[5,6]],3]$/Code$ undefined / undefined + (Aug 1, 2014) + (A3 1.26) It is recommended to use pushBack instead of BIS_fnc_arrayPush. + $Code$_array = [1,2,3]; + _array pushBack 4; //same as [_array, 4] call BIS_fnc_arrayPush ; + $/Code$ + + (August 23, 2014) + It's highly recommended to use the new pushBack command, up to 43% faster than set and up to 11843% faster a plus b ! + + (November 26, 2014) + pushBack does not support nil while set and a plus b do. For example: + $Code$_array = []; + for "_i" from 0 to 3 do + { + _array pushBack nil ; + }; + hint str _array; // hint is []$/Code$ + + (May 21, 2015) + Array "push" implementation using pushBack, alternative to BIS_fnc_arrayPush + $Code$KK_fnc_push = { + _this select 0 pushBack (_this select 1); + _this select 0 + }; + // Example + arr = [1,2,3]; + [arr, 4] call KK_fnc_push; //both arr and return of function are now [1,2,3,4]$/Code$ + + (October 5, 2016) + Note that pushBack does not create a new object. + Therefore, if you edit an object that was pushed back to an array, it also affects the object in the array. + e.g. + $Code$_first_squence = [1,2,3]; + _second_squence = [5,4]; + _first_squence pushBack _second_squence; + systemChat str _first_squence // prints [1,2,3,[5,4]]] + reverse _second_squence; + systemChat str _first_squence // prints [1,2,3,[4,5]]] + $/Code$ + If you pushBack an array for instance, you can just copy it to generate a new object. + e.g. + $Code$_first_squence pushBack +_second_squence; + $/Code$ - Nothing + Number + - tvSetPictureColorSelected + ctrlMapAnimAdd - Sets the color of the left picture of a tree item defined by path when item is selected + Adds the next frame to the map animation. - https://community.bistudio.com/wiki/tvSetPictureColorSelected + https://community.bistudio.com/wiki/ctrlMapAnimAdd - Control tvSetPictureColorSelected Array + Control ctrlMapAnimAdd Array - control tvSetPictureColorSelected [path, color] + map ctrlMapAnimAdd [time, zoom, position] - $Code$_control tvSetPictureColorSelected [[0], [1,0,1,1]]$/Code$ + $Code$_map ctrlMapAnimAdd [1, 0.1, getMarkerPos "anim1"]; + ctrlMapAnimCommit _map;$/Code$ + + $Code$// Center map on player: + _ctrl ctrlMapAnimAdd [0, 0.05, player ]; + ctrlMapAnimCommit _ctrl;$/Code$ - undefined / undefined + local / local + (17:11, 9 March 2010) + Besides Position2D, both Objects and Position3D work. + + (03:48, 27 August 2017) + Map control created with ctrlCreate have a weird behaviour. Control doesn't respect the aspects of Controls Group or Display itself. Results of ctrlMapAnimAdd applied to this control are also shifted for some reason. - Nothing + Nothing + - tvSetPictureColor + assignTeam - Sets the colour of the picture (set via tvSetPicture ) under the specified tree view path. + Assigns the unit (in case of a vehicle, its commander) to the given team. Team is an option in group control (unit management) menu that allows to split player group in teams and then give bulk order to separate teams. In order to operate properly, the command requires specific conditions: + The command requires player to be fully initialised + The unit getting assigned must be either player himself or a unit in player's group + Units in player's group as well as player himself can all have different teams assigned + The colour of the assigned team for a unit is seen on the group management UI as well as squad radar + The possible team values (colours) are: + "MAIN" - (white) + "RED" - (red) + "GREEN" - (green) + "BLUE" - (blue) + "YELLOW" - (yellow) + NOTE : In older version of the game the effect of this command is local - https://community.bistudio.com/wiki/tvSetPictureColor + https://community.bistudio.com/wiki/assignTeam - tvSetPictureColor Array - - Control tvSetPictureColor Array + Object assignTeam String - tvSetPictureColor [idc, path, color] - - ctrl tvSetPictureColor [path, color] + unit assignTeam team - $Code$tvSetPictureColor [101, [0,2], [1,0,1,1]];$/Code$ - - $Code$_tree tvSetPictureColor [[0,2], [1,0,1,1]];$/Code$ + $Code$_soldier2 assignTeam "RED";$/Code$ - local / local + global / global + (July 12, 2016) + Since Arma 3 v1.62 this command has global effects and is persistent even on machines that join in progress. - Nothing - Nothing + Nothing + - tvSetPictureRightColor + ammo - Sets color of the right picture on the tree view item defined by path + Check how many rounds are left in the currently loaded magazine in the given muzzle. Since Arma v1.55.133505 the command also returns ammo for units in vehicles. - https://community.bistudio.com/wiki/tvSetPictureRightColor + https://community.bistudio.com/wiki/ammo - tvSetPictureRightColor Array - - Control tvSetPictureRightColor Array + Object ammo String - tvSetPictureRightColor [idc, path, color] - - control tvSetPictureRightColor [path, color] + unit ammo muzzle - $Code$tvSetPictureRightColor [101, [0], [1,0,1,1]];$/Code$ + $Code$_count = player ammo "M16"; //returns 30 in case of a full magazine$/Code$ - $Code$_ctrl tvSetPictureRightColor [[0], [1,0,1,1]];$/Code$ + $Code$_count = player ammo "M203Muzzle";$/Code$ + + $Code$_count = player ammo primaryWeapon player ;$/Code$ - undefined / undefined + global / undefined + (February 17, 2012) + OA 1.60 : The command works (now?) also for units in vehicles. However only for the vehicle's gunners' weapons - aka those returned by "weapons vehicle". - Nothing - Nothing + Number + - tvSetPictureRightColorDisabled + setShotParents - Sets the color of the right picture of a tree item defined by path when item is disabled + Sets vehicle and instigator pair for the given projectile. - https://community.bistudio.com/wiki/tvSetPictureRightColorDisabled + https://community.bistudio.com/wiki/setShotParents - Control tvSetPictureRightColorDisabled Array + Object setShotParents Array - control tvSetPictureRightColorDisabled [path, color] + projectile setShotParents [vehicle, instigator] - $Code$_control tvSetPictureRightColorDisabled [[0], [1,0,1,1]]$/Code$ + $Code$myProjectile setShotParents [ vehicle bob, bob];$/Code$ + + $Code$tank addEventHandler ["Fired", {_this select 6 setShotParents [tank, commander tank]];$/Code$ - undefined / undefined + global / global + This scripting command must be executed on the server to work properly in multiplayer - Nothing + Nothing + - tvSetPictureRightColorSelected + setSide - Sets the color of the right picture of a tree item defined by path when item is selected + Sets a location's side. The default side is Unknown. - https://community.bistudio.com/wiki/tvSetPictureRightColorSelected + https://community.bistudio.com/wiki/setSide - Control tvSetPictureRightColorSelected Array + Location setSide Side - control tvSetPictureRightColorSelected [path, color] + location setSide side - $Code$_control tvSetPictureRightColorSelected [[0], [1,0,1,1]]$/Code$ + $Code$myLocation setSide resistance$/Code$ undefined / undefined + (16:00, 3 December 2013 (CEST)) + For units, vehicles you can use: " array joinSilent createGroup Side ", e.g. in init: "[this] joinSilent createGroup EAST;" described in the note below + + (19:05, 6 August 2009 (CEST)) + This is a frequent question on OFPEC, but produced here because it was difficult to find an answer to. setSide does not work for men, vehicles, etc.: it is intended for locations ( i.e., territory). If you want to switch a unit's ( e.g., the player's) side in the middle of a battle, make the unit joinSilent a group on the given side instead. If you want the unit to become the group leader after joining, use selectLeader. I haven't tested the idea of spawning a temporary unit of that side, assigning the player to that unit, setting the player as the leader, then deleting the original unit, but I don't see why it wouldn't work. (It begs the question why we don't have a setSide object function, though.) - Nothing + Nothing + - tvSetPictureRight + setDir - Sets right picture on the tree view item defined by path + Sets object heading. Angles are measured in degrees clockwise from north, and regular range goes from 0 to 360 (0° = N, 90° = E, 180° = S, 270° = W). Negative angles represent a counter-clockwise angle. - https://community.bistudio.com/wiki/tvSetPictureRight + https://community.bistudio.com/wiki/setDir - tvSetPictureRight Array - - Control tvSetPictureRight Array + Object setDir Number - tvSetPictureRight [idc, path, name] - - control tvSetPictureRight [path, name] + object setDir heading - $Code$tvSetPictureRight [101, [0], "picture"];$/Code$ + $Code$unit1 setDir 45; // will set unit1 to face North-East$/Code$ - $Code$_ctrl tvSetPictureRight [[0], "picture"];$/Code$ + $Code$unit1 setDir -675; // will also set unit1 to face North-East (= 45-360-360)$/Code$ + + $Code$unit1 setDir 30; + unit1 setFormDir 30; // needed for AI to keep the given direction$/Code$ - undefined / undefined + local / global + (May 9, 2007) + Though effects of this command remain local, you can do a setPos afterwards to synchronize the direction on all machines in MP. + $Code$myObj setDir 90; + myObj setPos getPos myObj;$/Code$ + + (January 9, 2009) + In ArmA, the effect of setDir is synchronized across the network. + + (April 5th, 2011) + In OA 1.59 the comment of Manny still holds true for createVehicle 'd empty vehicles by the server. + For the player object a local setDir alone is enough. + + (November 25, 2013) + In Arma 3, setDir affects vectorUp, vectorDir and velocity of the object it applied to. While this is not noticeable with stationary objects, a moving objects will have its orientation and velocity reset. So if you are planning on using setDir on a moving object, make sure you read the velocity value before and restore it after if you want the object to continue to move. + $Code$_vel = velocity _object; + _object setDir 45; + _object setVelocity _vel;$/Code$ + With orientation it is a bit more complicated. setDir resets vectorUp to [0,0,1] and changes vectorDir accordingly to accommodate set direction. If your object's vectorUp is not [0,0,1] and you want to keep it this way, then you have to use setVectorDirAndUp to change object's direction not setDir. This is also the reason why it is better to use setVectorDirAndUp instead of setDir on attached objects for a better control of object's orientation. + + (November 27, 2013) + Make sure you setDir BEFORE you set position. Setting direction after set position could lead to unpredictable behaviour. For example main part of the hospital building in Arma 3 can lose collision detection near both side entrances. AI will also get confused and will stop detecting obstacles if setDir is called after setPos. + + (February 9, 2018) + setDir is not propagated across the network when used on mines. Clients will see mines facing zero. This is especially noticeable on tripwire mines. + Use remoteExec to run the setDir command on the mine for all clients. - Nothing - Nothing + Nothing + - tvSetPicture + createMarker - Sets picture to item selected by path. IDC means id of parent Tree View. Name is picture name. The picture is searched in the mission directory. + Creates a new marker at the given position. The marker name has to be unique. - https://community.bistudio.com/wiki/tvSetPicture + https://community.bistudio.com/wiki/createMarker - tvSetPicture Array - - Control tvSetPicture Array + createMarker Array - tvSetPicture [idc, path, name] - - control tvSetPicture [path, name] + createMarker [name, position] - $Code$tvSetPicture [101, [0], "picture"];$/Code$ + $Code$_marker1 = createMarker ["Marker1", position player ];$/Code$ - $Code$_ctrl tvSetPicture [[0,0,0], getText ( configFile "CfgWeapons" "optic_NVS" "picture")];$/Code$ + $Code$_marker2 = createMarker ["Marker2", player ];$/Code$ - undefined / undefined + undefined / global - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ + $Code$_markerstr = createMarker ["markername",[_Xpos,_Ypos]]; + _markerstr setMarkerShape "ICON"; + _markerstr setMarkerType "hd_dot";$/Code$ + + (September 19, 2015) + createMarker accepts an object as position parameter as well (A3 - 1.50.131969). You could try this with the following code (both SP/MP) + $Code$_markerstr = createMarker ["markername", player]; + _markerstr setMarkerShape "RECTANGLE"; + _markerstr setMarkerSize [100,100];$/Code$ - Nothing - Nothing + String + - tvSetText + isTouchingGround - Sets string text to item on given path. IDC means id of parent Tree View. + Returns true if object is touching the ground. - https://community.bistudio.com/wiki/tvSetText + https://community.bistudio.com/wiki/isTouchingGround - tvSetText Array - - Control tvSetText Array + isTouchingGround Object - tvSetText [idc, path, text] - - control tvSetText [path, text] + isTouchingGround object - $Code$tvSetText [101, [0], "Test data"];$/Code$ - - $Code$_ctrl tvSetText [[0,0,0], "Test data"];$/Code$ + $Code$if ( isTouchingGround player ) then { hint "Terraferma!";};$/Code$ - undefined / undefined + global / undefined + (June 1, 2014) + If you are using this command as a validation method, it should not be the sole thing you are checking for, as the result is often inaccurate. For example, it returns false for some helicopters when landed on the roof of certain buildings, and it always returns false for boats, even if they are beached. + + (September 29, 2016) + In addition to previous statement: That behaviour is true, simply because isTouchingGround applied to a player unit (or any unit) is frozen to a last state when unit enters vehicle. + To get proper return from this command you should go for units vehicle : + $Code$_var = isTouchingGround player // Unreliable + _var = isTouchingGround (vehicle player) // Pretty reliable + $/Code$ + + (November 10, 2016) + This command returns always true if the falling object is attached to some other object with the command attachTo, like for vehicle air drop with parachute. + + (April 26, 2017) + Be aware: it's not reliable on remote objects. - Nothing - Nothing + Boolean + - tvSetTooltip + particlesQuality - Sets the tooltip text associated with the specified tree view path. + Returns current settings for particles quality (configure- video- general- particles). 0-low, 1-normal, 2-high - https://community.bistudio.com/wiki/tvSetTooltip + https://community.bistudio.com/wiki/particlesQuality - tvSetTooltip Array - - Control tvSetTooltip Array + particlesQuality - tvSetTooltip [idc, path, text] - - ctrl tvSetTooltip [path, text] + particlesQuality - $Code$tvSetTooltip [101, [0,2], "This is a tooltip"];$/Code$ - - $Code$_tree tvSetTooltip [[0,2], "This is a tooltip"];$/Code$ + $Code$_currentQuality = particlesQuality ;$/Code$ undefined / undefined @@ -71569,775 +74134,814 @@ - Nothing - Nothing + Number + - tvSetValue + markerText - Sets scalar data to item on given path. IDC means id of parent Tree View. If the given value is not integer, it will be converted to integer + Get marker text. - https://community.bistudio.com/wiki/tvSetValue + https://community.bistudio.com/wiki/markerText - tvSetValue Array - - Control tvSetValue Array + markerText String - tvSetValue [idc, [path], val] - - _ctrl tvSetValue [ [path], val] + markerText markerName - $Code$tvSetValue [101, [0], 555];$/Code$ - - $Code$_ctrl tvSetValue [ [0,0,0], 14];$/Code$ + $Code$hint format ["Marker Text: %1", markerText "Marker1"];$/Code$ - local / local + global / undefined - (September 11, 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ - Nothing - Nothing + String + - tvSortByValue + requiredVersion - Sorts children of given item by tvValue from highest to lowest by default. IDC means id of parent Tree View. + Check if version of application is available. If the current version is older than the required one, a warning message is shown and false is returned. + Version of format Major.Minor, e.g. 1.30 - https://community.bistudio.com/wiki/tvSortByValue + https://community.bistudio.com/wiki/requiredVersion - Control tvSortByValue Array - - tvSortByValue Array + requiredVersion String - control tvSortByValue [path, reversed] - - tvSortByValue [idc, path, reversed] + requiredVersion version - $Code$control tvSortByValue [[0], false ];$/Code$ - - $Code$tvSortByValue [102, [0], false ];$/Code$ + $Code$if !( requiredVersion "1.09") exitWith {};$/Code$ undefined / undefined + (March 12, 2008) + If the script contains a command that was introduced after the required version, it will still generate a syntax error, even if this test is done at the top of the script (as the whole script is parsed before execution). - Nothing - Nothing + Boolean + - tvSort + nearestTerrainObjects - Sorts childrens of given item by item name ( tvText ). IDC means id of parent Tree View. - Param reversed is optional. + Returns a list of nearest terrain objects of the given types to the given position or object, within the specified distance. If more than one object is found they will be ordered according to 3D distance to the object (i.e. the closest one will be first in the array). + In contrast to nearestObjects this command returns terrain placed objects like trees, rocks and buildings which don't necessarily need an associated config class. + position can use the format: + [[x,y,z], ["Type",...], radius] + or + [object, ["Type",...], radius] + To use it without any type filter: + [object or position, [], radius] + Possible type names: "TREE", "SMALL TREE", "BUSH", "BUILDING", "HOUSE", "FOREST BORDER", "FOREST TRIANGLE", "FOREST SQUARE", "CHURCH", "CHAPEL", "CROSS", "BUNKER", "FORTRESS", "FOUNTAIN", "VIEW-TOWER", "LIGHTHOUSE", "QUAY", "FUELSTATION", "HOSPITAL", "FENCE", "WALL", "HIDE", "BUSSTOP", "ROAD", "FOREST", "TRANSMITTER", "STACK", "RUIN", "TOURISM", "WATERTOWER", "TRACK", "MAIN ROAD", "ROCK", "ROCKS", "POWER LINES", "RAILWAY", "POWERSOLAR", "POWERWAVE", "POWERWIND", "SHIPWRECK", "TRAIL" + Since Arma 3 v1.61.136035 it is possible to switch the sorting algorithm off by providing optional param, which significantly increases the performance of this command, especially if the search is performed with large radius. + Since Arma 3 v1.65.138818 it is possible to switch search and sorting mode between 2D and 3D - https://community.bistudio.com/wiki/tvSort + https://community.bistudio.com/wiki/nearestTerrainObjects - Control tvSort Array - - tvSort Array + nearestTerrainObjects Array - control tvSort [path, reversed] - - tvSort [idc, path, reversed] + nearestTerrainObjects [position, types, radius, sort, 2Dmode] - $Code$control tvSort [[0], true ];$/Code$ + $Code$nearestTerrainObjects [ player, ["Tree","Bush"], 200];$/Code$ - $Code$tvSort [102, [0], true ];$/Code$ + $Code$nearestTerrainObjects [ player, ["House"], 200];$/Code$ + + $Code$nearestTerrainObjects [[2716,2949,0], ["Chapel","Fuelstation"], 100];$/Code$ + + $Code$// Return every terrain object in 50 metres radius around player sorted, closest first: + nearestTerrainObjects [ player, [], 50]$/Code$ + + $Code$// Return every terrain object in 50 metres radius around player unsorted: + nearestTerrainObjects [ player, [], 50, false ]$/Code$ + + $Code$// Hide all terrain objects command could find: + if ( isServer ) then + { + { + _x hideObjectGlobal true ; + } + forEach nearestTerrainObjects + [ + [ worldSize /2, worldSize /2], + [], + worldSize, + false + ]; + };$/Code$ undefined / undefined - - - Nothing - Nothing + (October 31, 2016) + Since Arma 3 v1.65.138818 the default sorting is done according to 3D distance not distance2D as before. This is an attempt to correct some very old bug in implementation. + + (December 28, 2016) + Be aware that some terrain objects types might be tricky to be found, such as terrain rocks and boulders which are not considered to be "ROCKS" or "ROCK", but "HIDE". Example: + $Code$nearestTerrainObjects [player, ["HIDE"], 20]; // [939688: bluntstone_01.p3d,939691: garbagebags_f.p3d,939671: wreck_car_f.p3d,939692: junkpile_f.p3d]$/Code$ + + (October 31, 2017) + Here is a readout for Altis (as of 1.76), showing you the actual usefulness of the different object-types (some of them are apparently not used/defined at all). + Especially the road type names sadly return nothing. + TREE: 263630 + SMALL TREE: 0 + BUSH: 747193 + BUILDING: 0 + HOUSE: 17472 + FOREST BORDER: 0 + FOREST TRIANGLE: 0 + FOREST SQUARE: 0 + CHURCH: 54 + CHAPEL: 165 + CROSS: 0 + BUNKER: 0 + FORTRESS: 0 + FOUNTAIN: 0 + VIEW-TOWER: 0 + LIGHTHOUSE: 7 + QUAY: 0 + FUELSTATION: 32 + HOSPITAL: 1 + FENCE: 47940 + WALL: 38943 + HIDE: 655066 + BUSSTOP: 0 + ROAD: 0 + FOREST: 0 + TRANSMITTER: 23 + STACK: 48 + RUIN: 3 + TOURISM: 1 + WATERTOWER: 10 + TRACK: 0 + MAIN ROAD: 0 + ROCK: 5483 + ROCKS: 0 + POWER LINES: 2224 + RAILWAY: 0 + POWERSOLAR: 10 + POWERWAVE: 51 + POWERWIND: 128 + SHIPWRECK: 43 + TRAIL: 0 + + + Array + - tvText + kbWasSaid - Returns shown text in the item on given path. IDC means id of parent Tree View. + Check if given item was said by person to someone. See Conversations for more details. - https://community.bistudio.com/wiki/tvText + https://community.bistudio.com/wiki/kbWasSaid - tvText Array - - Control tvText Array + Object kbWasSaid Array - tvText [idc, path] - - control tvText path + person kbWasSaid [receiver, topic, sentenceID, maxAge] - $Code$tvText [101, [0]];$/Code$ - - $Code$_ctrl tvText [0,0,0];$/Code$ + $Code$player kbWasSaid [otherUnit, "myTopic", "mySentenceID", 3];$/Code$ undefined / undefined - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ - String - String + Boolean + - tvTooltip + setAttributes - Gets the tooltip text associated with the specified tree view path. + Returns a structured text created by the given structured or plain text by setting attributes to the given values. - https://community.bistudio.com/wiki/tvTooltip + https://community.bistudio.com/wiki/setAttributes - tvTooltip Array - - Control tvTooltip Array + String/Structured_Text setAttributes Array - tvTooltip [idc, path] - - ctrl tvTooltip path + text setAttributes [name1, value1, name2, value2,] - $Code$_text = tvTooltip [101, [0,2]];$/Code$ - - $Code$_text = _treeCtrl tvTooltip [0,2];$/Code$ + $Code$txt = img setAttributes ["image", "data\iSoldier.paa"]$/Code$ undefined / undefined + (November 9, 2014) + This command doesn't seem to work in Arma 3. - String - String + Structured_Text + - tvValue + allGroups - Returns scalar data from item on given path. IDC means id of parent Tree View. + Return a list of all groups created on the following sides east, west, resistance / independent and civilian only. Does not contain groups of sideLogic. - https://community.bistudio.com/wiki/tvValue + https://community.bistudio.com/wiki/allGroups - tvValue Array - - Control tvValue Array + allGroups - tvValue [idc, [path]] - - _ctrl tvValue [path] + allGroups - $Code$tvValue [101, [0]];$/Code$ + $Code${( leader _x) sideChat "Go ! Go ! Go !"} forEach allGroups ;$/Code$ - $Code$_ctrl tvValue [0,0,0];$/Code$ + $Code$// All groups with players: + private _allGroupsWithPlayers = []; + {_allGroupsWithPlayers pushBackUnique group _x} forEach allPlayers ;$/Code$ - local / local + undefined / undefined - (Sep 11 2014) - (A3 1.28)tv command family overview - $Code$ - //tv command family available for CT_TREE (type 12) - private ["_count","_current","_data","_text","_value","_pic"]; - _CT_TREE tvAdd [ [],"Parent_A"]; - _CT_TREE tvAdd [ [0],"Child_A"]; - _CT_TREE tvAdd [ [0,0],"Grandchild_A"]; - _CT_TREE tvAdd [ [],"Parent_B"]; - _CT_TREE tvAdd [ [1],"Child_B"]; - _count = _CT_TREE tvCount []; //return 2 - _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A - _current = tvCurSel _CT_TREE; //return [0,0,0] - _CT_TREE tvSetData [_current,"I'm grandchild_A"]; - _data = _CT_TREE tvData _current; // "I'm grandchild_A" - _text = _CT_TREE tvText _current; //"Grandchild_A" - _CT_TREE tvSetValue [_current,14]; - _value = _CT_TREE tvValue _current; // 14 - _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; - _pic = _CT_TREE tvPicture _current; - _CT_TREE tvExpand [1]; - _CT_TREE tvSort [[], false ]; - _CT_TREE tvSortByValue [[], false ]; - _CT_TREE tvDelete [0,0]; //remove child_b - tvClear 12; - _CT_TREE tvCollapse []; - $/Code$ - Number - Number + Array + - type + setVehicleVarName - Returns a string of a location's class name. + Sets string representation of an object to a custom string. For example it is possible to return "MyFerrari" instead of default "ce06b00# 164274: offroad_01_unarmed_f.p3d" when querying object as string: + $Code$ hint str _offroad; //MyFerrari$/Code$ + When a vehicle is created and named in the editor, the name becomes both the variable containing the vehicle object and the string representation of the vehicle object. vehicleVarName on the other hand is only string representation of the object. So if you want to refer to the actual object by its vehicleVarName, an extra step needed to assign the object to a variable of the same name. For example to see and refer to offroad as myFerrari: + $Code$_offroad setVehicleVarName "MyFerrari"; MyFerrari = _offroad;$/Code$ + In multiplayer environment setVehicleVarName has to be executed on every PC if you want the custom name to be known everywhere. If vehicle is created and named in the editor, the vehicle name will be known globally automatically. + To reset vehicleVarName and str representation of the object to original form set vehicleVarName to an empty string: + $Code$_offroad setVehicleVarName "";$/Code$ - https://community.bistudio.com/wiki/type + https://community.bistudio.com/wiki/setVehicleVarName - type Location + Object setVehicleVarName String - type location + object setVehicleVarName name - $Code$_locationType = type myLocation$/Code$ + $Code$player setVehicleVarName "aP";$/Code$ - undefined / undefined + global / local - String + Nothing + - typeName + openCuratorInterface - Returns the data type of an expression. - The type is returned as on of the following all-uppercase strings: - " ARRAY " - " BOOL " - " CODE " - " CONFIG " - " CONTROL " - " DISPLAY " - " GROUP " - " LOCATION " - " OBJECT " - " SCALAR " - " SCRIPT " - " SIDE " - " STRING " - " TEXT " - " TEAM_MEMBER " - " NAMESPACE " - They represent the available data types in ArmA. + Force opens curator interface. - https://community.bistudio.com/wiki/typeName + https://community.bistudio.com/wiki/openCuratorInterface - typeName Anything + openCuratorInterface - typeName anything + openCuratorInterface - $Code$_msg = "hello"; _result = typeName _msg; //_result will be "STRING"$/Code$ - - $Code$_unit = player ; _result = typeName _unit; //_result becomes "OBJECT"$/Code$ + $Code$// Open interface: + openCuratorInterface ;$/Code$ - $Code$// Values representing direct Data Types : - hint typeName 0; //SCALAR - hint typeName ""; //STRING - hint typeName true ; //BOOL - hint typeName []; //ARRAY - hint typeName {}; //CODE - hint typeName objNull ; //OBJECT - hint typeName grpNull ; //GROUP - hint typeName controlNull ; //CONTROL - hint typeName teamMemberNull ; //TEAM_MEMBER - hint typeName displayNull ; //DISPLAY - hint typeName taskNull ; //TASK - hint typeName locationNull ; //LOCATION - hint typeName sideUnknown ; //SIDE - hint typeName text ""; //TEXT - hint typeName configFile ; //CONFIG - hint typeName configNull ; //CONFIG (Since Arma 3 v1.53.133130) - hint typeName missionNamespace ; //NAMESPACE$/Code$ + $Code$// Close interface: + findDisplay 312 closeDisplay 2;$/Code$ - $Code$if ( typeName _this != "ARRAY") exitWith { - hint "_this is not an array!" - } - //is the same as - if ( typeName _this != typeName []) exitWith { - hint "_this is not an array!" - } - //is the same as - if !(_this isEqualType []) exitWith { - hint "_this is not an array!"$/Code$ + $Code$// Detect if user used "Zeus" key to open curator interface in the absence of event handler for it: + findDisplay 46 displayAddEventHandler ["KeyDown", { + if ( inputAction "CuratorInterface" 0) then { + hint "Curator interface is open"; + }; + false + }];$/Code$ undefined / undefined - (September 25, 2016) - typeName of nil is ANY, however this is not possible to test as script command is just ignored when any argument is nil - String + Nothing + - typeOf + unitBackpack - Returns the config class name of given object or "" if object doesn't have config class. + Returns unit's backpack - https://community.bistudio.com/wiki/typeOf + https://community.bistudio.com/wiki/unitBackpack - typeOf Object + unitBackpack Object - typeOf object + unitBackpack unit - $Code$if ( typeOf vehicle player == "B_Heli_Light_01_armed_F") then { hint "Player is in AH-9 Pawnee"};$/Code$ + $Code$myBackpack = unitBackpack player$/Code$ + + $Code$clearMagazineCargo unitBackpack player$/Code$ + + $Code$player action ["gear", unitBackpack player]$/Code$ undefined / undefined - (August 4, 2006) - (CWR 1.90)Try using this on an object pre-placed in the mission editor (such as a house): hint format ["%1", typeOf object xxx] Now place an object in the editor, save the map, and open up the Mission.sqm. Find the line: vehicle = "XXX", and replace XXX with the name of the object that you found above. Save it, and load the map. (this method is no longer available since ArmA) + (Apr 29, 2014) + In ArmA3 ver 1.16, we can use either backpackContainer or unitBackpack at present since both of them enjoy same operand type and return value. - String + Object + - UAVControl + lbSetValue - Returns array with current operator of UAV and his vehicle role in UAV. + Sets the additional integer value in the item with the given index of the listbox or combobox with id idc of the topmost user dialog to the given value. - https://community.bistudio.com/wiki/UAVControl + https://community.bistudio.com/wiki/lbSetValue - UAVControl Object + lbSetValue Array + + Control lbSetValue Array - UAVControl uav + lbSetValue [idc, index, value] + + control lbSetValue [index, value] - $Code$UAVControl uav;$/Code$ + $Code$lbSetValue [101, 0, 1];$/Code$ + + $Code$_control lbSetValue [0, 1];$/Code$ undefined / undefined + More information on the LB command family can be found here + + (September 21, 2014) + lbSetValue only accepts integer, no decimal number. + Example: + CONTROL lbSetValue [index,10]; // value will be 10 + CONTROL lbSetValue [index,3.1]; // value will be 3 - Array + Nothing - Nothing + - uiNamespace + setObjectTextureGlobal - Returns the global namespace attached to user interface. + Set the texture of the given selection on all computers in a network session. NOTES : + Do not put global commands such this one into init field in editor and expect it to work in Multiplayer. See Talk:setObjectTextureGlobal for the explanation. + Not all objects could be textured this way. To find out, run getObjectTextures command on an object. Empty array [] usually indicates it cannot be textured. + All textures must have resolution 2^x / 2^y (e.g. 16 / 16, 16 / 32, 64 / 256, 512 / 512, etc). The largest texture size commonly supported by graphics cards and RV engine is 4096x4096 - https://community.bistudio.com/wiki/uiNamespace + https://community.bistudio.com/wiki/setObjectTextureGlobal - uiNamespace + Object setObjectTextureGlobal Array - uiNamespace + obj setObjectTextureGlobal [selection, texture] - $Code$uiNamespace setVariable ["LIB_interruptDisplay", _display];$/Code$ + $Code$player setObjectTextureGlobal [0, "\MyAddon\blue.paa"];$/Code$ - $Code$uiNamespace setVariable ["myVar", 46]; - with uiNamespace do { - hint str myVar; //46 - };$/Code$ + $Code$//set up persistent texture keeper + player addEventHandler ["Take", { + ( getObjectTextures player + [ uniformContainer player getVariable "texture"]) + params ["_texUniform", "_texInsignia", "_texCustom"]; + if ( isNil "_texCustom") exitWith {}; + if (_texUniform == _texCustom) exitWith {}; + player setObjectTextureGlobal [0, _texCustom]; + false + }]; + //Example: make current uniform persistently blue + _texture = "#(rgb,8,8,3)color(0,0,1,1)"; //blue texture + player setObjectTextureGlobal [0, _texture]; //set it on player + uniformContainer player setVariable ["texture", _texture, true ]; //store it on uniform$/Code$ - undefined / undefined + global / global - variables in uiNamespace are not lost between mission changes, they are carried over. Also take note that the server can make use of uiNamespace. + (March 8, 2015) + The effect is persistent and will be synchronized for players who join in progress. (Tested with Arma 3 v1.40) - (29 September, 2014) - ^The same can be said with parsingNamespace. + (December 29, 2015) + In some cases the ".paa" files do not work. Instead you can try ".jpg" files. + + (October 24, 2016) + Sometimes it could be necessary to set default material on an object for the texture to take effect: + $Code$_block = createVehicle ["Land_VR_Block_02_F", player getPos [20, getDir player ], [], 0, "CAN_COLLIDE"]; + _block setObjectMaterialGlobal [0, "\a3\data_f\default.rvmat"]; + _block setObjectTextureGlobal [0, "#(rgb,8,8,3)color(1,0,0,1)"];$/Code$ + Courtesy of Larrow - Namespace + Nothing + - uiSleep + type - Suspend execution of script for given uitime. uiSleep is a sleep method to delay script execution where script time/simulation time is stopped. uiSleep is basically using the system time (uiTime more specifically) and not simulation time. So in the cases where sleep command would get stuck indefinitely, uiSleep can still be used to effectively delay script execution. For example in a mission briefing or an editor or when simulation is paused in general. + Returns a string of a location's class name. - https://community.bistudio.com/wiki/uiSleep + https://community.bistudio.com/wiki/type - uiSleep Number + type Location - uiSleep delay + type location - $Code$uiSleep 0.5$/Code$ + $Code$_locationType = type myLocation$/Code$ undefined / undefined - (March 28, 2016) - If the game is paused in SP (via ESC) the sleep command will stop working, to prevent that use uiSleep. - Nothing + String + - unassignCurator + allDisplays - Unassign curator (will destroy both sides of connection). + Returns a list of all opened GUI displays. Other displays, such as IGUI displays could be accessed via uiNamespace variable, which is updated every time display is opened or closed. For example, to access IGUI displays: + $Code$ uiNamespace getVariable ["IGUI_displays", []];$/Code$. Other display variables: + 3DENDisplays_displays + 3DENDisplaysTemp_displays + GUI_displays + IGUI_displays + Loading_displays + CuratorDisplays_displays + BootcampDisplays_displays + CuratorTitles_displays + BootcampTitles_displays + KartDisplays_displays - https://community.bistudio.com/wiki/unassignCurator + https://community.bistudio.com/wiki/allDisplays - unassignCurator Object + allDisplays - unassignCurator curatorObj + allDisplays - $Code$unassignCurator myCurator;$/Code$ + $Code$_allDisps = allDisplays ;$/Code$ undefined / undefined - This scripting command must be executed on the server to work properly in multiplayer - Nothing + Array + - unassignItem + actionIDs - Unassigns existing item and tries to put it into inventory. If there is no space in inventory the item simply disappears. + Returns Array of Numbers, where numbers are IDs of all user actions added to given entity with addAction command. - https://community.bistudio.com/wiki/unassignItem + https://community.bistudio.com/wiki/actionIDs - Object unassignItem String + actionIDs Object - unit unassignItem item + actionIDs entity - $Code$bluforUnit unassignItem "NVGoggles"; - bluforUnit removeItem "NVGoggles"; - opforUnit unassignItem "NVGoggles_OPFOR"; - opforUnit removeItem "NVGoggles_OPFOR"; - independentUnit unassignItem "NVGoggles_INDEP"; - independentUnit removeItem "NVGoggles_INDEP";$/Code$ + $Code$_actions = actionIDs player ;$/Code$ - global / global + undefined / undefined - Nothing + Array + - unassignTeam + setSystemOfUnits - Unassigns the unit (in the case of a vehicle its commander unit) from his team. This is equal to unit assignTeam "MAIN". + Set system of units. - https://community.bistudio.com/wiki/unassignTeam + https://community.bistudio.com/wiki/setSystemOfUnits - unassignTeam Object + setSystemOfUnits Number - unassignTeam vehicleName + setSystemOfUnits value - $Code$unassignTeam _soldier2$/Code$ + $Code$myNum = 5; + myNumNew = setSystemOfUnits myNum;$/Code$ - local / undefined + undefined / undefined - Nothing + Nothing + - unassignVehicle + all3DENEntities - Unassigns individual unit from a vehicle, i.e removes assignedVehicleRole of the unit. If the unit is currently in that vehicle, the group leader will issue an order to disembark. + Returns an array of all currently placed Eden Editor entities, including groups, waypoints, and markers in following format: + [objects, groups, triggers, systems, waypoints, markers, layers, comments] + objects: Array of Objects + groups: Array of Groups + triggers: Array of Objects + systems: Array of Objects + waypoints: Array of Arrays in Waypoint format + markers: Array of Strings + layers: Array of Numbers + comments: Array of Numbers - https://community.bistudio.com/wiki/unassignVehicle + https://community.bistudio.com/wiki/all3DENEntities - unassignVehicle Object + all3DENEntities - unassignVehicle unitName + all3DENEntities - $Code$unassignVehicle player ;$/Code$ - - $Code${ unassignVehicle _x } forEach crew _vehiclename; - // Will make all the occupants of a vehicle disembark$/Code$ + $Code$systemChat str all3DENEntities ;$/Code$ - local / global + undefined / undefined - (August 4, 2006) - Notes from before the conversion: - Even though: - {unassignVehicle _x} forEach crew vehiclename - will make all the occupants of a vehicle disembark, if they are the original crew of the vehicle then they will just get back in again. - To prevent this happening also use allowGetIn as in the example below: - {unassignVehicle _x} forEach crew vehiclename; crew vehiclename allowGetIn false - Nothing + Array + - underwater + onTeamSwitch - Return whether object is fully underwater. From Arma 3 v1.66, this also works for units. + Defines an action performed when the team switch is finished. Commandset receives the following special variables: _from object previous unit, _to object current unit. Consecutive use of onTeamSwitch command will overwrite previously set commandset. + i + Since Arma 3 v1.57 a stackable version of this EH is available: TeamSwitch + NOTE: When player switches and leaves behind AI unit, you need to enable "TeamSwitch" AI on it onTeamSwitch {_from enableAI "TeamSwitch"}; so that the unit continues with waypoints - https://community.bistudio.com/wiki/underwater + https://community.bistudio.com/wiki/onTeamSwitch - underwater Object + onTeamSwitch String/Code - underwater object + onTeamSwitch commandset - $Code$_isUnderwater = underwater player ;$/Code$ - - $Code$_isUnderwater = eyePos player select 2 0;$/Code$ + $Code$onTeamSwitch {[_from, _to] execVM "myTeamSwitchScript.sqf";};$/Code$ undefined / undefined - (February 2, 2017) - This is still quite buggy and not always reliable. Code in Example 2 is a good alternative. - Boolean + Nothing + - uniformContainer + playScriptedMission - Returns a cargo container of a unit's uniform. + Load the given world, launch an empty mission and execute the given, expression. Config (optional) can reference to the config entry, replacing description.ext for this mission. - https://community.bistudio.com/wiki/uniformContainer + https://community.bistudio.com/wiki/playScriptedMission - uniformContainer Object + playScriptedMission Array - uniformContainer unit + playScriptedMission [world,expression,config,ignoreChildWindow] - $Code$hint str uniformContainer player ; //2df7dd00# 163941: dummyweapon.p3d$/Code$ - - $Code$hint str getMagazineCargo uniformContainer player ; - // [ - //["30Rnd_65x39_caseless_mag"], - //[3] - //]$/Code$ + $Code$playScriptedMission + [ + "desert_e", + { + private["_handle"]; + _handle = execVM "\ca\missions_e\data\scenes\credits1\init.sqf"; + }, + configFile/"CfgMissions"/"Cutscenes"/"Credits" + ];$/Code$ undefined / undefined + (December 31, 2015) + For this command to work, you will need to + call command with ignoreChildWindow param set to true (in VBS docs its called fromMission) + close any opened display (not sure about this part, but closing every display (but #0) seems to work): + If mission is run from 2D editor, you can just close RscDisplayArcadeMap display (idd 26) (because this was done from 2D editor, so RscDisplayArcadeMap is still active in background -- benargee ) + If mission is run from single mission browser, you can just close RscDisplaySingleMission (idd 2) + end mission + Debriefing will show and player will be moved to new mission after clicking on Continue. + Command is a bit bugged: + Third (config) param doesn't seem to work + If you run this command in mission loaded from pbo, said pbo won't be writable until you close the game (you can't update it) + Following code will change change island to Stratis and spawns player as basic soldier at [0,0,0] coordinates. + $Code$disableSerialization; + playScriptedMission ['Stratis',{ + createCenter west; + _grp = createGroup west; + _player = _grp createUnit ["B_Soldier_F",[0,0,0],[],0,"NONE"]; + selectPlayer _player; + },missionConfigFile, true]; + //Close all displays that could be the background display... this is essentialy forceEnd command + //Closing #0 will cause game to fail + _zero = findDisplay(0); + { + if (_x != _zero) then { + _x closeDisplay 1; + }; + } foreach allDisplays; + failMission "END1";$/Code$ + (tested in Arma 3 1.54.133741) - Object + Nothing + - uniformItems + setTriggerType - Get array with all items (of any kind, even weapons) from uniform. + Sets the type of action processed by the trigger after activation (no action, a waypoints switch or an end of mission): + "NONE" + "EAST G" - Guarded by OPFOR - use createGuardedPoint instead! + "WEST G" - Guarded by BLUFOR - use createGuardedPoint instead! + "GUER G" - Guarded by Independent - use createGuardedPoint instead! + "SWITCH" - Switch waypoints/break loop (see Triggers ) + "END1" - End #1 + "END2" - End #2 + "END3" - End #3 + "END4" - End #4 + "END5" - End #5 + "END6" - End #6 + "LOOSE" - Lose //it is not a typo on the wiki, it is indeed misspelt in the game engine. + "WIN" - (not found in ArmA) - https://community.bistudio.com/wiki/uniformItems + https://community.bistudio.com/wiki/setTriggerType - uniformItems Object + Object setTriggerType String - uniformItems unit + trigger setTriggerType action - $Code$uniformItems player ;[ - "FirstAidKit", - "30Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag" - ]$/Code$ + $Code$_trigger setTriggerType "END1"$/Code$ - undefined / undefined + global / local - Array + Nothing + - uniformMagazines + resetCamShake - Get array with all magazines from uniform of the given unit. + Stops any ongoing camera shake effects. Does not prevent new effects from being created. To disallow new effects altogether, enableCamShake should be used. - https://community.bistudio.com/wiki/uniformMagazines + https://community.bistudio.com/wiki/resetCamShake - uniformMagazines Object + resetCamShake - uniformMagazines unit + resetCamShake - $Code$uniformMagazines player ;[ - "6.5mm 30Rnd STANAG Mag(30/30)[id/cr:1/0](3x)" - ]$/Code$ + $Code$resetCamShake ;$/Code$ undefined / undefined @@ -72345,450 +74949,514 @@ - Array + Nothing + - uniform + menuText - Returns name of uniform. + Returns current text set in menu entry on given path. - https://community.bistudio.com/wiki/uniform + https://community.bistudio.com/wiki/menuText - uniform Object + menuText Array - uniform unit + menuText [idc, path] - $Code$_uniform = uniform _unit$/Code$ - + undefined / undefined - String + String + - unitAddons + respawnVehicle - Returns list with addons the unit belongs to. + Sets vehicle as respawnable in MP game. The vehicle will be spawned at the locality and coordinates it was prior to destruction. If respawn type is set to base respawn (type 3) and vehicle respawn marker is provided (respawn_vehicle_XXXSIDEXXX), vehicle will spawn on the marker. + NOTE : Command has to be executed where vehicle is local - https://community.bistudio.com/wiki/unitAddons + https://community.bistudio.com/wiki/respawnVehicle - unitAddons String + Object respawnVehicle Array - unitAddons className + vehicle respawnVehicle [delay, count] - $Code$hint str unitAddons typeOf player ; //["A3_Characters_F_BLUFOR"]$/Code$ + $Code$car respawnVehicle [5, 3]; + // 'car' will respawn at the predefined marker for the side after 5 seconds. The unit will respawn 3 times.$/Code$ + + $Code$car respawnVehicle [30]; + // 'car' will respawn at the predefined marker for the side after 30 seconds. The unit will respawn an unlimited number of times.$/Code$ - undefined / undefined + local / global - (Mar 31, 2014) - 1. (A3 1.14) Old BIS function BIS_fnc_unitAddon has been deprecated, please always use unitAddons instead. - $Code$ hint str ([player] call BIS_fnc_unitAddon ) // same as unitAddons ( typeOf player )$/Code$ - 2. To return the addon that a weapon belongs to, use BIS_fnc_weaponAddon instead. E.g. - $Code$ - (( primaryWeapon player ) call BIS_fnc_weaponAddon ); //return: "A3_Weapons_F_Rifles_Khaybar" - $/Code$ + (May 28, 2007) + For this command to work (in MP) you need the appropriate markers in the mission. + The markers are... + respawn_vehicle_west + respawn_vehicle_east + respawn_vehicle_guerilla + respawn_vehicle_civilian + Also, by default it will use respawnDelay from the description.ext as mentioned unless you specify + respawnVehicleDelay = x; + Where x is delay in seconds. + In Multiplayer the respawned vehicle remains local to the client who was the last driver of the vehicle or the client who was the leader of the last AI driver of the vehicle. + If the vehicle has yet to be driven or the AI driver is local to the Server then the respawned vehicle will be local to the Server. - Array + Nothing + - unitAimPositionVisual + kbRemoveTopic - Returns the position on the unit other units can aim at in render scope. See also aimPos, unitAimPosition. + Unregister conversation topic from given person. See Conversations for more details. - https://community.bistudio.com/wiki/unitAimPositionVisual + https://community.bistudio.com/wiki/kbRemoveTopic - unitAimPositionVisual Object + Object kbRemoveTopic String - unitAimPositionVisual unit + person kbRemoveTopic topicName - $Code$unitAimPositionVisual player ;$/Code$ + $Code$_unit1 kbRemoveTopic "howsTheWeather";$/Code$ - global / undefined + undefined / undefined - Array + Nothing + - unitAimPosition + magazinesAmmo - Returns the position on the unit other units can aim at. Same as aimPos only returns position in PositionAGL format and has render scope alternative unitAimPositionVisual. + Returns array of arrays of all vehicle's magazines and their ammo count (also works on supply boxes). When applied to a unit (soldier), the command behaves differently and will omit magazines already loaded into unit's weapons. Use magazinesAmmoFull to return all magazines. + Output format : + [[magazine1],[magazine2],[magazine3]...[magazineN]] + Magazine format : + 0: Magazine class name + 1: Magazine current ammo count - https://community.bistudio.com/wiki/unitAimPosition + https://community.bistudio.com/wiki/magazinesAmmo - unitAimPosition Object + magazinesAmmo Object - unitAimPosition unit + magazinesAmmo vehicle - $Code$unitAimPosition player ;$/Code$ + $Code$_magazinesAmmo = magazinesAmmo player ; + /* + [ + ["30Rnd_65x39_caseless_mag",30], + ["30Rnd_65x39_caseless_mag",30], + ["16Rnd_9x21_Mag",16], + ["SmokeShellGreen",1], + ["Chemlight_green",1], + ["HandGrenade",1] + ] + */$/Code$ + + $Code$_magazinesAmmo = magazinesAmmo Mi_48; + /* + [ + ["250Rnd_30mm_APDS_shells",250], + ["250Rnd_30mm_HE_shells",250], + ["8Rnd_LG_scalpel",8], + ["38Rnd_80mm_rockets",38] + ] + */$/Code$ - global / undefined + undefined / undefined + (December 20, 2014) + When used on vehicles this will only return all magazines associated with a single turretPath (which one depends on the actual armament of the vehicle, usually the first armed turretPath or alternatively turretPath [-1]). + If you want to get all turrets' magazines, use allTurrets and magazinesTurret. + -- Actium ( talk ) 15:41, 20 December 2014 (CET) - Array + Array + - unitBackpack + setSlingLoad - Returns unit's backpack + Creates sling loading from first object to second object if possible. To unload cargo, pass objNull as second param. - https://community.bistudio.com/wiki/unitBackpack + https://community.bistudio.com/wiki/setSlingLoad - unitBackpack Object + Object setSlingLoad Object - unitBackpack unit + vehicle setSlingLoad cargo - $Code$myBackpack = unitBackpack player$/Code$ - - $Code$clearMagazineCargo unitBackpack player$/Code$ + $Code$_success = heli1 setSlingLoad veh1;$/Code$ - $Code$player action ["gear", unitBackpack player]$/Code$ + $Code$// To unload cargo: + _success = heli setSlingLoad objNull ;$/Code$ undefined / undefined - (Apr 29, 2014) - In ArmA3 ver 1.16, we can use either backpackContainer or unitBackpack at present since both of them enjoy same operand type and return value. + (November 8, 2014) + "... if possible " + FYI, that only means that 'vehicle' has to be able to lift 'cargo'. The position/distance does not matter, 'cargo' is automatically moved to a position that is close enough but doesn't doesn't collide with 'vehicle'. (can also be used if 'vehicle' is not flying, in which case 'cargo' will be placed and attached on the ground next to it). - Object + Boolean + - unitIsUAV + allUnitsUAV - Returns true if the unit type is UAV - coresponding to transport param "isUAV" + Return a list of all UAV vehicles. - https://community.bistudio.com/wiki/unitIsUAV + https://community.bistudio.com/wiki/allUnitsUAV - unitIsUAV Object + allUnitsUAV - unitIsUAV unit + allUnitsUAV - $Code$_isUAV = unitIsUAV veh;$/Code$ + $Code$hint format ["No. of UAV(s) on the map: %1", count allUnitsUAV ];$/Code$ + + $Code${_x setDamage 1} forEach allUnitsUAV ;$/Code$ undefined / undefined + (October 10, 2014) + This command returns a list of all unmanned vehicles, not the UAV AI units inside them, as the name might otherwise suggest. - Boolean + Array + - unitPos + backpackCargo - Return the unit position rules. - The return value is always "Auto" unless the unit has gotten a setUnitPos command. In that case the value is the last stance the unit was ordered to. - Available modes are listed at setUnitPos. + Get array with backpacks from ammo box (or any general weapon holder container). - https://community.bistudio.com/wiki/unitPos + https://community.bistudio.com/wiki/backpackCargo - unitPos Object + backpackCargo Object - unitPos unit + backpackCargo box - $Code$hint str unitPos _unit;$/Code$ + $Code$hint str backpackCargo vehicle player ;$/Code$ - global / undefined + undefined / undefined - String + Array + - unitReady + setStamina - Check if the unit is ready. Unit is busy when it is given some command like move, until the command is finished. + Set units' stamina (seconds until depletion) - https://community.bistudio.com/wiki/unitReady + https://community.bistudio.com/wiki/setStamina - unitReady Object + Object setStamina Number - unitReady unitName + unit setStamina stamina - $Code$_it = unitReady _soldierOne;$/Code$ + $Code$player setStamina 42;$/Code$ undefined / undefined - (August 26, 2010) - Keep in mind that a) dead units are unitReady and b) that it takes a while until it get's known to group members that a unit is not alive anymore, which leads to c) the current leader of a group might be actually dead (until another group member takes command). - Why this is important? I'll give you an example: if you're using unitReady as a condition inside one of your fsm to advance whatever the fsm/group is doing, you really might wanna check that this unit is actually still alive. Otherwise you might end up with really fast and nasty loops in your fsm, eventually accompanied by a stream of radio commands that will last until finally a living leader is in command again.. and that could take a while... nasty, I tell you :) - - Regarding vehicles, there is only one single unit (from the vehicle crew) whose unitReady-status is affected by giving that vehicle (or that unit) commands. While it's the driver unit for a truck, it is the gunner unit for a mg-jeep or the commander for a tank. Generally it's always the unit "in control" of the vehicle. (because it's only that unit, that is seen as "full unit" to the "outside world". Only he can be adressed with commands.) - In consequence you can't just send vehicles around and check if they've arrived with something like: - waitUntil{(unitReady (driver _vehicle))}; // don't do this! - Because it's not guaranteed, that the driver is in command of the vehicle and only that unit will have it's unitReady status affected. - So in conclusion, if you need to check if a vehicle is ready, try something like this: _vehicleReady = { - private ["_veh", "_ready"]; - _veh = _this; - _ready = true; - { - if (!(isNull _x)) then - { - _ready = _ready && (unitReady _x); - }; - } forEach [ - (commander _veh), - (gunner _veh), - (driver _veh) - ]; - _ready - }; - - (November 21, 2015) - To check readiness of a vehicle, don't check it's crew, driver, gunner, commander, etc., but the vehicle itself, e.g.: - $Code$unitReady (vehicle driver _YourVehicle);$/Code$ - Only tested 11/21/2015 by me with A2 1.63.131129 and A3 1.52.132676 but possibly true since 1964. :P + (December 30, 2015) + "setStamina" has the same effect as "setFatigue". - Boolean + Nothing + - unitRecoilCoefficient + skipTime - Returns recoil coefficient of a soldier. + Jumps the specified number of hours forward or backward. The time of day and tides are adjusted, but no changes are made to any units. If present, the lower level of clouds instantly jump to the position they would be in if time had passed normally. - https://community.bistudio.com/wiki/unitRecoilCoefficient + https://community.bistudio.com/wiki/skipTime - unitRecoilCoefficient Object + skipTime Number - unitRecoilCoefficient soldier + skipTime duration - $Code$_myRecoil = unitRecoilCoefficient player$/Code$ + $Code$skipTime 5;$/Code$ undefined / undefined - (September 7, 2013) - If the unit doesn't exist / is null, -1 is returned. + This scripting command must be executed on the server to work properly in multiplayer + + To simulate a smooth time-lapse effect (e.g. in cut-scenes), you can use the following code: + $Code$while {true} do {skiptime 0.00333; sleep 0.1};$/Code$ + + To skip forward to a specific time, irrespective of the current mission time, use + $Code$skipTime (_timeToSkipTo - daytime + 24 ) % 24;$/Code$ + + In ArmA & OFP, skipTime does not actually estimate weather changes beyond moving the clouds across the sky. Weather counters continue as if no time has passed. The setDate command can be used instead of skiptime to change the time without the visual give-away of the lower clouds jumping. + + I cannot confirm this for OA 1.60 beta (85889): + MP: Even though the immediate effect of skipTime is only local, + the new time will propagate through the network after 30 seconds or so. + Instead the date, which includes time, is synced automatically for new JIP clients - NOT for present instances. + So one has to apply skipTime on all instances in MP (server + all present clients). + + This command is blocking and in some cases it may take up to 1.5 seconds (probably depends on CPU) for it to calculate the changes to the environment, during which the game will microfreeze. It largely depends on weather changes, which are quite random. However one thing remains consistent, skipTime 24 hours is always almost instant. This is quite helpful when used in conjunction with commands such as setOvercast for instant and seamless effect. To try it yourself use this script: + $Code$[] spawn { + for "_i" from 1 to 24 do { + _time = diag_tickTime ; + skipTime _i; + diag_log [_i, diag_tickTime - _time]; + sleep 3; + }; + };$/Code$ + One of the results (results will vary depending on weather conditions): + $Code$[1,1.44507] + [2,1.46118] + [3,1.33105] + [4,1.396] + [5,0.0310059] + [6,1.37891] + [7,1.4502] + [8,1.37817] + [9,1.37695] + [10,1.37012] + [11,1.448] + [12,1.32593] + [13,1.45508] + [14,1.448] + [15,0.0349121] + [16,0.0368652] + [17,1.25903] + [18,1.38599] + [19,1.4519] + [20,0.052002] + [21,0.0400391] + [22,0.0490723] + [23,1.35205] + [24,0.0151367] //this is always the lowest$/Code$ + + In Arma 3 (around v1.14) skipTime executed on the server will get synced in 5 seconds or so with all the clients. It will also be JIP compatible. skipTime executed on a client will change time on client for about 5 seconds after which it will sync back to server time. - Number + Nothing + - unitsBelowHeight + getStamina - Returns units in group/array below given height Above The Land (ATL). Current unit height ATL could be found with - _height = ( getPosATL _unit) select 2; + Get current stamina (~ seconds until depletion) - https://community.bistudio.com/wiki/unitsBelowHeight + https://community.bistudio.com/wiki/getStamina - Group/Array unitsBelowHeight Number + getStamina Object - units unitsBelowHeight height + getStamina unit - $Code$_allOnGroudUnits = group player unitsBelowHeight 10;$/Code$ - - $Code$_units = allUnits unitsBelowHeight 30;$/Code$ + $Code$getStamina player;$/Code$ - global / undefined + undefined / undefined - (Nov 12, 2009) - the height is calculated above terrain level (ATL), not water level or building level. - Array + Number + - units + teams - Returns an array with all the units in the group or group of the unit. For a destroyed object an empty array is returned. + Return a list of teams in the current mission. - https://community.bistudio.com/wiki/units + https://community.bistudio.com/wiki/teams - units Group/Object + teams - units groupOrUnit + teams - $Code$_myUnitCount = count units group player ;$/Code$ - - $Code$_isInMyGroup = _soldier1 in units player ;$/Code$ + $Code$_teams = teams ;$/Code$ undefined / undefined - (September 24, 2009) - The returned array on MP clients is not updated when team members die (only when they are deleted). ( Tested on VBS2 ) - Array + Array + - unlinkItem + ropeDetach - Unassign and delete existing item from its assigned slot. If item does not exist or is not in the assigned slot, command simply fails. + Detach a rope from an object. - https://community.bistudio.com/wiki/unlinkItem + https://community.bistudio.com/wiki/ropeDetach - Object unlinkItem String + Object ropeDetach Object - unit unlinkItem item + vehicle ropeDetach rope - $Code$bluforUnit unlinkItem "NVGoggles"; - opforUnit unlinkItem "NVGoggles_OPFOR"; - independentUnit unlinkItem "NVGoggles_INDEP";$/Code$ + $Code$vehicle player ropeDetach myRope;$/Code$ - global / global + undefined / undefined - Nothing + Nothing + - unlockAchievement + addSecondaryWeaponItem - Unlock the given achievement. + Adds weapon item to the weapon cargo space. This is used for infantry weapons. + As of Arma 3 DEV 1.37, this command also supports weapon magazines. - https://community.bistudio.com/wiki/unlockAchievement + https://community.bistudio.com/wiki/addSecondaryWeaponItem - unlockAchievement String + Object addSecondaryWeaponItem String - unlockAchievement name + unit addSecondaryWeaponItem item - undefined / undefined + local / global - (February 10, 2016) - This is an obsolete command used in the experimental Arma 2 Xbox 360 version. - https://forums.bistudio.com/topic/187873-unlockachievment-command/ - Boolean + Nothing + - unregisterTask + isPipEnabled - Unregister a task type. + Returns true if Picture in Picture (Render to Texture) is enabled. - https://community.bistudio.com/wiki/unregisterTask + https://community.bistudio.com/wiki/isPipEnabled - Team_Member unregisterTask String + isPipEnabled - teamMember unregisterTask name + isPipEnabled - $Code$player unregisterTask taskName;$/Code$ + $Code$PIPon = isPipEnabled;$/Code$ undefined / undefined @@ -72796,789 +75464,1077 @@ - Boolean + Boolean + - updateDrawIcon + curatorEditableObjects - Updates the icon to be shown in 2D editor for the specified editor,object. If maintain size is false,icon will not scale depending on the,scale of the map. If maintain size is a number,the icon will maintain,size if map scale is below that number. - i - Some Old Editor Command + Returns all editable objects which belong to a curator. - https://community.bistudio.com/wiki/updateDrawIcon + https://community.bistudio.com/wiki/curatorEditableObjects - Control updateDrawIcon Array + curatorEditableObjects Object - map updateDrawIcon [object,string identifier,color,offset,width,height,maintain size,angle,shadow] + curatorEditableObjects curatorObj - + $Code$_objects = curatorEditableObjects myCurator;$/Code$ + - undefined / undefined + global / undefined - Nothing + Array + - updateMenuItem + createDiaryLink - Sets the text and command for the menu item. index is index as returned from addMenuItem command. command is optional. - i - Some Old Editor Command + Create a link to the section of diary given by subject. Record is selected based on given object (diary record,task or unit). - https://community.bistudio.com/wiki/updateMenuItem + https://community.bistudio.com/wiki/createDiaryLink - Control updateMenuItem Array + createDiaryLink Array - map updateMenuItem [menu item index,text,command] + createDiaryLink [subject,object,text] - + $Code$_link = createDiarySubject ["Group", player,"Player"]$/Code$ + + $Code$diaryRec1 = player createDiaryRecord ["diary", ["Record 1", "We can't refer to next record (("]]; + diaryRec2 = player createDiaryRecord ["diary", ["Record 2", "Got to " + ( createDiaryLink ["Diary", diaryRec1, "record 1"])]]; + diaryRec3 = player createDiaryRecord ["diary", ["Record 3", "Got to " + ( createDiaryLink ["Diary", diaryRec2, "record 2"])]];$/Code$ + + $Code$funcProcessDiaryLink = { + processDiaryLink createDiaryLink ["diary", _this, ""]; + }; + diaryRec1 = player createDiaryRecord ["diary", ["Record 1", + "In this example, we can go to any next record: go to execute expression='diaryRec2 call funcProcessDiaryLink' Record 2 /execute " + ]]; + diaryRec2 = player createDiaryRecord ["diary", ["Record 2", + "Go to execute expression='diaryRec3 call funcProcessDiaryLink' Record 3 /execute " + ]]; + diaryRec3 = player createDiaryRecord ["diary", ["Record 3", + "Go to execute expression='diaryRec1 call funcProcessDiaryLink' Record 1 /execute " + ]];$/Code$ + undefined / undefined - Nothing + String + - updateObjectTree + removeAllContainers - Update the editor object tree. - i - Some Old Editor Command + Removes all containers from the unit. - https://community.bistudio.com/wiki/updateObjectTree + https://community.bistudio.com/wiki/removeAllContainers - updateObjectTree Control + removeAllContainers Object - updateObjectTree map + removeAllContainers unit - + $Code$removeAllContainers player;$/Code$ + undefined / undefined + (2013) + This will remove the Uniform, Vest and Backpack from a unit leaving them unable to hold or pickup inventory items. - Nothing + Nothing + - useAISteeringComponent + showUAVFeed - Enable the new AI driving, used to test the old and new AI driving. + Shows/hides video feed transmitted from UAV. When enabled, the video is streamed to following texture + "#(argb,512,512,1)r2t(uavpipsingleview,1.25)" + in the feed window. The feed window IGUI display idd is 315. The actual feed control idc is 102. + $Code$_UAVFeedDisplay = uiNamespace getVariable "RscAvCamera";$/Code$ - https://community.bistudio.com/wiki/useAISteeringComponent + https://community.bistudio.com/wiki/showUAVFeed - useAISteeringComponent Boolean + showUAVFeed Boolean - useAISteeringComponent state + showUAVFeed show - $Code$useAISteeringComponent true$/Code$ + $Code$showUAVFeed true ;$/Code$ - undefined / global + undefined / undefined - Nothing + Boolean + - useAudioTimeForMoves + selectionNames - Switch between elapsed game time and audio time being used as animation timer. Used for audio/animation synchronization. + Returns the list of model selections - https://community.bistudio.com/wiki/useAudioTimeForMoves + https://community.bistudio.com/wiki/selectionNames - Object useAudioTimeForMoves Boolean + selectionNames Object - soldier useAudioTimeForMoves toggle + selectionNames object - $Code$player useAudioTimeForMoves true$/Code$ + $Code$_house= "Land_i_House_Small_02_V3_F" createVehicle _pos; + selectionNames _house; + //[ + //"door_1","door_2","damt_1","door_handle_1","door_handle_2","glass_1_hide", + //"glass_2_hide","glass_3_hide","glass_1_unhide","glass_2_unhide","glass_3_unhide", + //"glass_4_hide","glass_4_unhide" + //]$/Code$ undefined / undefined + (June 5, 2016) + selectionNames returns an array of named selections from only the resolution LODs. - Nothing + Array + - vectorAdd + lbSetPictureRightColorSelected - Adds two 3D vectors. + Sets the selected color of the second (right aligned) picture of the item with the given index of the listbox with id idc of the topmost user dialog to the given color. Color is in format Color. Color which consists from only zeros means disable this override. - https://community.bistudio.com/wiki/vectorAdd + https://community.bistudio.com/wiki/lbSetPictureRightColorSelected - Array vectorAdd Array + lbSetPictureRightColorSelected Array + + Control lbSetPictureRightColorSelected Array - vector1 vectorAdd vector2 + lbSetPictureRightColorSelected [idc, index, color] + + control lbSetPictureRightColorSelected [index, color] - $Code$hint str ( velocity unit1 vectorAdd velocity unit2);$/Code$ + $Code$lbSetPictureRightColorSelected [101, 0, [0, 1, 0, 0.5]];$/Code$ - $Code$[5,10,5] vectorAdd [5,5,10]; //returns [10,15,15]$/Code$ + $Code$_ctrl lbSetPictureRightColorSelected [0, [1, 1, 1, 1]];$/Code$ undefined / undefined - (28 Jun, 2014) - (ArmA3 1.22)Algorithm: - $Code$ - Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; - Result = [x1 + x2,y1 + y2,z1 + z2;] - $/Code$ - It is recommended to use vectorAdd instead of BIS_fnc_vectorAdd. + More information on the LB command family can be found here - Array + Nothing - Nothing + - vectorCos + loadIdentity - Cosine of angle between two 3D vectors. + Loads person's identity from Objects.sav file in campaign directory (from entry name). - https://community.bistudio.com/wiki/vectorCos + https://community.bistudio.com/wiki/loadIdentity - Array vectorCos Array + Object loadIdentity String - vector1 vectorCos vector2 + person loadIdentity name - $Code$_cos = getPos player vectorCos [0,0,2];$/Code$ + $Code$_ok = player loadIdentity "playerIdentity"$/Code$ undefined / undefined - (28 Jun, 2014) - (ArmA3 1.22)Algorithm: - $Code$ - Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; - Result = ((x1 * x2) + (y1 * y2) + (z1 * z2))/(( sqrt (x1 ^ 2 + y1 ^ 2 + z1 ^ 2))*( sqrt (x2 ^ 2 + y2 ^ 2 + z2 ^ 2))) - $/Code$ - Given two vectors of attributes, A and B, the cosine similarity, cos(θ), is represented using a dot product and magnitude. The resulting similarity values indicating intermediate similarity or dissimilarity between two vectors. - Number + Boolean + - vectorCrossProduct + backpackItems - Cross product of two 3D vectors. - In layman's terms, if you have a polygon (surface) defined by 3 points, you can find a normal to it (just like terrain surfaceNormal ). To invert direction of the normal, swap arguments around. + Get array with all items (of any kind, even weapons) in backpack of the given unit. - https://community.bistudio.com/wiki/vectorCrossProduct + https://community.bistudio.com/wiki/backpackItems - Array vectorCrossProduct Array + backpackItems Object - vector1 vectorCrossProduct vector2 + backpackItems unit - $Code$_vector = [1,1,1] vectorCrossProduct [2,2,2];$/Code$ - - $Code$_vectorUp = [0,1,0] vectorCrossProduct [-1,0,0]; //[0,-0,1]$/Code$ - - $Code$_vectorSide = ( vectorDir player ) vectorCrossProduct ( vectorUp player );$/Code$ + $Code$backpackItems player ;[ + "hgun_P07_F", + "Titan_AT" + ]$/Code$ undefined / undefined - (28 Jun, 2014) - (ArmA3 1.22)Algorithm: - $Code$ - Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; - Result = [(y1 * z2) – (z1 * y2),(z1 * x2) – (x1 * z2),(x1 * y2) – (y1 * x2)]; - $/Code$ - It is recommended to use vectorCrossProduct instead of BIS_fnc_crossProduct. - Array + Array + - vectorDiff + targetsQuery - Subtracts one 3D vector from another. (vector1 - vector2) + Returns sorted array of targets, known to the enquirer (including own troops), where the accuracy coefficient reflects how close the result matches the query. This command could be CPU intensive. - https://community.bistudio.com/wiki/vectorDiff + https://community.bistudio.com/wiki/targetsQuery - Array vectorDiff Array + Object targetsQuery Array - vector1 vectorDiff vector2 + enquirer targetsQuery [targetIgnore, targetSide, targetType, targetPosition, targetMaxAge] - $Code$hint str ( velocity car vectorDiff velocity bike);$/Code$ + $Code$// Return all known targets for player: + _targets = player targetsQuery [ objNull, sideUnknown, "", [], 0];$/Code$ + + $Code$// Prioritise all known OPFOR targets and return targets less than 10 seconds old: + _targets = player targetsQuery [ objNull, east, "", [], 10];$/Code$ undefined / undefined - (28 Jun, 2014) - (ArmA3 1.22)Algorithm: - $Code$ - Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; - Result = [x1 – x2,y1 – y2,z1 – z2;] - $/Code$ - It is recommended to use vectorDiff instead of BIS_fnc_vectorDiff. - Array + Array + - vectorDirVisual + drawRectangle - Return object's normalized direction vector in world space ( [x,y,z] ) in render time scope. - A unit facing North would return [0,1,0] - A unit facing East would return [1,0,0] - A unit facing South would return [0,-1,0] - A unit facing West would return [-1,0,0] + Draws a rectangle on the map. - https://community.bistudio.com/wiki/vectorDirVisual + https://community.bistudio.com/wiki/drawRectangle - vectorDirVisual Object + Control drawRectangle Array - vectorDirVisual objectName + map drawRectangle [c, a, b, angle, color, fill] - $Code$_dirVector = vectorDirVisual _unit;$/Code$ + $Code$_ctrl drawRectangle [ + getPos player, + 20, + 20, + getDir player, + [0,0,1,1], + "" + ];$/Code$ + + $Code$_ctrl drawRectangle [ + player, + 10, + 20, + getDir player, + [1,1,1,1], + "#(rgb,8,8,3)color(1,0,0,1)" + ];$/Code$ - global / undefined + undefined / undefined + (March 22, 2014) + Map example: $Code$( findDisplay 12 displayCtrl 51) ctrlAddEventHandler ["Draw",{ + (_this select 0) drawRectangle [ + getPos player, + 20, + 20, + getDir player, + [0,0,1,1], + "" + ]; + }];$/Code$ + Be careful when using this command. Unlike map markers, the draw commands can decrease your framerate. - Array + Nothing + - vectorDir + actionKeys - Return object's normalized direction vector in world space ( [x,y,z] ). - A unit facing North would return [0,1,0] - A unit facing East would return [1,0,0] - A unit facing South would return [0,-1,0] - A unit facing West would return [-1,0,0] + Returns Array containing dikCodes of keys, buttons and combos assigned to the given user action. Action names could be found in config class ControllerSchemes or user action names or user profile, for example: + keyWatch [] = { 24 }; + To retrieve the value, use the property name without 'key': + $Code$ actionKeys "Watch"; // 24$/Code$ + In addition, some of the actions are also listed in here: inputAction/actions - https://community.bistudio.com/wiki/vectorDir + https://community.bistudio.com/wiki/actionKeys - vectorDir Object + actionKeys String - vectorDir objectName + actionKeys userAction - $Code$_dirVector = vectorDir _unit;$/Code$ + $Code$_array = actionKeys "ReloadMagazine"$/Code$ - global / undefined + undefined / undefined + (May 11, 2016) + If an action key is configured with a modifier (e.g. "Right Ctrl + M" for "MiniMapToggle"), the DIK code returned by this command has a weird value, equivalent to the following: + Left Ctrl + Key = 486539264 + DIK + Left Shift + Key = 704643072 + DIK + Left Alt + Key = 939524096 + DIK + Right Ctrl + Key = -1660944384 + DIK + Right Shift + Key = 905969664 + DIK + Right Alt + Key = -1207959552 + DIK + For example, to detect if actionKeys "NetworkPlayers" contain a match for "Right Ctrl + P", one must do the following: + $Code$ if (-1660944359 in actionKeys "NetworkPlayers") then$/Code$ + with -1660944359 being equal to -1660944384 + 25, and 25 being the DIK code for the "P" key. + This increases the difficulty of accurately comparing key codes to actionKeys in UI event handlers. Those strange numbers are probably due to bit flags being added to the DIK value by the game engine for easier storage in the ArmaProfile. + In case of mouse buttons, actionKeys will also return values that are different from those in "MouseButton" UI events: + LMB: MouseButton 0 = actionKeys 65536 + RMB: MouseButton 1 = actionKeys 65665 (65536 + 1 + 128) + MMB: MouseButton 2 = actionKeys 65538 (65536 + 2) + 4MB: MouseButton 3 = actionKeys 65539 (65536 + 3) + 5MB: MouseButton 4 = actionKeys 65540 (65536 + 4) + The values above are valid for a right-handed mouse configuration, and may or may not differ for a left-handed config. + + (August 6, 2016) + The method described by @AgentRev does not work. + All numbers in SQF are floats and those are only precise up to 6...7 digits. + $Code$486539264 + 19 == 486539264 + 20 + - true + $/Code$ + The DIK codes for 'LCtrl + R' and 'LCtrl + T' are indistinguishable. - Array + Array + - vectorDistanceSqr + setUnitRank - Squared distance between two 3D vectors. + Sets rank of given unit. + Possible rank values, and the associated rating that is automatically given: + PRIVATE: 0 + CORPORAL: 500 + SERGEANT: 1500 + LIEUTENANT: 2500 + CAPTAIN: 3500 + MAJOR: 5000 + COLONEL: 7500 + Since Arma 3 v1.67 this command is - https://community.bistudio.com/wiki/vectorDistanceSqr + https://community.bistudio.com/wiki/setUnitRank - Array vectorDistanceSqr Array + Object setUnitRank String - vector1 vectorDistanceSqr vector2 + unitName setUnitRank rank - $Code$_distSqr = getPos player vectorDistanceSqr [0,0,2];$/Code$ + $Code$player setUnitRank "COLONEL"$/Code$ - undefined / undefined + global / local - (28 Jun, 2014) - (ArmA3 1.22)Algorithm: - $Code$ - Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; - Result = (x2 - x1) ^ 2 + (y2 - y1) ^ 2 + (z2 - z1) ^ 2; - $/Code$ + (Mar 26, 2009) + Changing a unit's rank using either setUnitRank or setRank will also REPLACE their current rating dependent on their new rank (colonels have a rating of 7500 etc). That is to say REPLACE, not add to: the unit's old rating will disappear with the rank change. + + (December 24, 2015) + In Arma 3, if the rank is not spelled correctly or the string is empty, it will default to Private. This command is not case sensitive. For Arma 3 the rating set by this command is as follows. + (PRIVATE: 0) + (CORPORAL: 50) + (SERGEANT: 150) + (LIEUTENANT: 250) + (CAPTAIN: 350) + (MAJOR: 500) + (COLONEL: 750) The rating listed here will be present on base type respawn. - Number + Nothing + - vectorDistance + isVehicleRadarOn - Distance between two 3D vectors. + Returns true if vehicle has active sensors on - https://community.bistudio.com/wiki/vectorDistance + https://community.bistudio.com/wiki/isVehicleRadarOn - Array vectorDistance Array + isVehicleRadarOn Object - vector1 vectorDistance vector2 + isVehicleRadarOn vehicle - $Code$_euclideanDist = getPosASL player vectorDistance [0,0,0];$/Code$ - - $Code$( getPosASL _a) vectorDistance ( getPosASL _b); /* same as */( getPosATL _a) distance ( getPosATL _b);$/Code$ + $Code$isVehicleRadarOn vehicle player ; // returns true if radar is turned on$/Code$ undefined / undefined - (28 Jun, 2014) - (ArmA3 1.22)Algorithm: - $Code$ - Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; - Result = sqrt ((x2 - x1) ^ 2 + (y2 - y1) ^ 2 + (z2 - z1) ^ 2); - $/Code$ - Number + Boolean + - vectorDotProduct + localize - Dot product of two 3D vectors. + Used to internationalise text messages. A string is returned from Stringtable.csv (or Stringtable.xml ) which corresponds to the stringName. - https://community.bistudio.com/wiki/vectorDotProduct + https://community.bistudio.com/wiki/localize - Array vectorDotProduct Array + localize String - vector1 vectorDotProduct vector2 + localize stringName - $Code$_dot = [1,0,1] vectorDotProduct [0,0,2];$/Code$ + $Code$hint localize "STR_WEST"; // - "BLUFOR" (in Arma2)$/Code$ + + $Code$hint format ["Go %1", localize "STR_Q_NORTH"]; // - "Go North"$/Code$ + + $Code$hint format [ localize "STR_ACTION_DROP_WEAPON", localize "STR_SN_RIFLE"]; // - "Drop Rifle" + // STR_ACTION_DROP_WEAPON contains "Drop %1", STR_SN_RIFLE contains "Rifle"$/Code$ - undefined / undefined + undefined / local - (28 Jun, 2014) - (ArmA3 1.22)Algorithm: - $Code$ - Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; - Result = (x1 * x2) + (y1 * y2) + (z1 * z2) - $/Code$ - It is recommended to use vectorDotProduct instead of BIS_fnc_dotProduct. + (September 12, 2014) + The command localize will strip all HTML tags from your stringtable.xml entries, however there is a way to trick it by substituting tags with HTML code instead: + ?xml version="1.0" encoding="utf-8"? + Key ID= "STR_TEST_KK" + Original ![CDATA[ t color='#ff0000' This doesn't work /t ]] /Original + /Key + Key ID= "STR_TEST_KK2" + Original t color='#ff0000' This works /t /Original + /Key + $Code$ hint parseText localize "str_test_kk"; //no change of colour$/Code$ + $Code$ hint parseText localize "str_test_kk2"; //hint content is in red$/Code$ - Number + String + - vectorFromTo + tvSetCurSel - Unit vector, equal to direction from vector1 to vector2. In other words this command produces vectorNormalized between given 2 points. To get a normal vector use vectorDiff. + Sets cursor to given item on given path. IDC means id of parent Tree View. To deselect all items use [-1] for the path param ( available since Arma 3 v1.55.133898 ) - https://community.bistudio.com/wiki/vectorFromTo + https://community.bistudio.com/wiki/tvSetCurSel - Array vectorFromTo Array + tvSetCurSel Array + + Control tvSetCurSel Array - vector1 vectorFromTo vector2 + tvSetCurSel [idc, path] + + control tvSetCurSel path - $Code$[1,2,3] vectorFromTo [4,5,6]; //[0.57735,0.57735,0.57735] - //is the same as - vectorNormalized ([4,5,6] vectorDiff [1,2,3]); //[0.57735,0.57735,0.57735]$/Code$ + $Code$tvSetCurSel [101, [0]];$/Code$ + + $Code$_ctrl tvSetCurSel [0,0,0];$/Code$ + + $Code$[] spawn + { + disableSerialization ; + _CT_TREE = findDisplay 46 ctrlCreate ["RscTree", -1]; + _CT_TREE ctrlSetPosition [0,0,0.3,1]; + _CT_TREE ctrlCommit 0; + _CT_TREE tvAdd [[],"Parent_A"]; + _CT_TREE tvAdd [[0],"Child_A"]; + _CT_TREE tvAdd [[0,0],"Grandchild_A"]; + _CT_TREE tvAdd [[],"Parent_B"]; + _CT_TREE tvAdd [[1],"Child_B"]; + sleep 1; + hint "SELECT [0,0,0]"; + _CT_TREE tvSetCurSel [0,0,0]; + sleep 2; + hint "DESELECT ALL"; + _CT_TREE tvSetCurSel [-1]; + };$/Code$ undefined / undefined - (19 Jul, 2014) - (ArmA3 1.26) Algorithm: + (Sep 11 2014) + (A3 1.28)tv command family overview $Code$ - Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; - Result = [(x1 – x2)/( sqrt ((x1 – x2) ^ 2 + (y1 – y2) ^ 2 + (z1 – z2) ^ 2)), - (y1 – y2)/( sqrt ((x1 – x2) ^ 2 + (y1 – y2) ^ 2 + (z1 – z2) ^ 2)), - (z1 – z2)/( sqrt ((x1 – x2) ^ 2 + (y1 – y2) ^ 2 + (z1 – z2) ^ 2))]; + //tv command family available for CT_TREE (type 12) + private ["_count","_current","_data","_text","_value","_pic"]; + _CT_TREE tvAdd [[],"Parent_A"]; + _CT_TREE tvAdd [[0],"Child_A"]; + _CT_TREE tvAdd [[0,0],"Grandchild_A"]; + _CT_TREE tvAdd [[],"Parent_B"]; + _CT_TREE tvAdd [[1],"Child_B"]; + _count = _CT_TREE tvCount []; //return 2 + _CT_TREE tvSetCurSel [0,0,0]; //select grandchild_A + _current = tvCurSel _CT_TREE; //return [0,0,0] + _CT_TREE tvSetData [_current,"I'm grandchild_A"]; + _data = _CT_TREE tvData _current; // "I'm grandchild_A" + _text = _CT_TREE tvText _current; //"Grandchild_A" + _CT_TREE tvSetValue [_current,14]; + _value = _CT_TREE tvValue _current; // 14 + _CT_TREE tvSetPicture [_current, getText ( configFile "CfgWeapons" "optic_NVS" "picture")]; + _pic = _CT_TREE tvPicture _current; + _CT_TREE tvExpand [1]; + _CT_TREE tvSort [[], false ]; + _CT_TREE tvSortByValue [[], false ]; + _CT_TREE tvDelete [0,0]; //remove child_b + tvClear 12; + _CT_TREE tvCollapse []; $/Code$ - Array + Nothing - Nothing + - vectorMagnitudeSqr + flag - Squared magnitude of a 3D vector. + Returns the original flag pole of the flag the unit is carrying. - https://community.bistudio.com/wiki/vectorMagnitudeSqr + https://community.bistudio.com/wiki/flag - vectorMagnitudeSqr Array + flag Object - vectorMagnitudeSqr vector + flag unit - $Code$_sizeSqr = vectorMagnitudeSqr [0,3,4]; //25$/Code$ + $Code$_flag = flag _soldier;$/Code$ - undefined / undefined + global / undefined - (28 Jun, 2014) - (ArmA3 1.22)Algorithm: - $Code$ - Vector = [x,y,z]; - Result = (x ^ 2) + (y ^ 2) + (z ^ 2) - $/Code$ - It is recommended to use vectorMagnitudeSqr instead of BIS_fnc_magnitudeSqr. - Number + Object + - vectorMagnitude + lnbSetCurSelRow - Magnitude of a 3D vector. + Selects the row with the given index of the 2D listbox. - https://community.bistudio.com/wiki/vectorMagnitude + https://community.bistudio.com/wiki/lnbSetCurSelRow - vectorMagnitude Array + lnbSetCurSelRow Array + + Control lnbSetCurSelRow Number - vectorMagnitude vector + lnbSetCurSelRow [idc, index] + + ctrl lnbSetCurSelRow index - $Code$_size = vectorMagnitude [0,3,4]; //5$/Code$ - - $Code$_speed = vectorMagnitude velocity player ; // return velocity of player in m/s - _speed = ( vectorMagnitude velocity player ) * 3.6; // return velocity of player in Km/h - _speed = ( vectorMagnitude velocity player ) * 2.23694; // return velocity of player in mph$/Code$ + $Code$disableSerialization ; + _ctrl = ( findDisplay 300) displayCtrl 304; + _ctrl lnbSetCurSelRow 1;$/Code$ undefined / undefined - (28 Jun, 2014) - (ArmA3 1.22)Algorithm: + (Sep 9 2014) + (A3 1.28)As for invisible data processing, lnbAddArray, lnbAddColumn, lnbData, lnbGetColumnsPosition, lnbSetColumnsPos, lnbSetData, lnbSetText, lnbSetValue, lnbText and lnbValue store data types into exact position of the listNbox with different spaces. Accessing data with coordinate command at nearly the same syntax: $Code$ - Vector = [x,y,z]; - Result = sqrt ((x ^ 2) + (y ^ 2) + (z ^ 2)) + //Set same value to one position of a Control + _ctrl lnbSetData [ [0,0],"#1"]; + lnbSetColumnsPos [102, [0,1], 1]; + _ctrl lnbSetText [ [0,1], "#1"]; + _ctrl lnbSetValue [ [0,0],1]; + //Accessing the value disregard affecting one another. + _ctrl lnbData [0,0]; //"#1" + lnbGetColumnsPosition _ctrl //[1]; + _ctrl lnbText [0,0];//"#1" + _ctrl lnbValue [0,0];//1 $/Code$ - It is recommended to use vectorMagnitude instead of BIS_fnc_magnitude. + For a direct visible control over CT_LISTNBOX: + $Code$ + 0 = [_CT_LISTNBOX] spawn { + private ["_CT_LISTNBOX","_color","_current","_pic"]; + disableSerialization ; + _CT_LISTNBOX = _this select 0; + { + _CT_LISTNBOX lnbAddRow [ getText (_x "displayNameShort"), getText (_x "displayName")]; + _CT_LISTNBOX lnbSetPicture [ [_foreachIndex,0], getText (_x "texture")]; + } forEach (" isClass _x" configClasses ( configFile "CfgRanks")); + _CT_LISTNBOX lnbSetCurSelRow 0; + _current = lnbCurSelRow _CT_LISTNBOX; + _color = _CT_LISTNBOX lnbColor [_current,0]; + _CT_LISTNBOX lnbSetColor [ [_current,1], [(_color select 0)/2,0,0,1] ]; + _CT_LISTNBOX lnbDeleteColumn 0; + _CT_LISTNBOX lnbDeleteRow 1; + sleep 1; + lnbClear _CT_LISTNBOX;//Clear all items but control still remains just invisible. + }; + $/Code$ + A combined use of both invisible and visible data processing commands alive the Control. - Number + Nothing - Nothing + - vectorModelToWorldVisual + setWaypointBehaviour - Converts vector from model to world space in render time scope. + Switches the unit behaviour when the waypoint becomes active. + Possible values are: + "UNCHANGED" + "CARELESS" + "SAFE" + "AWARE" + "COMBAT" + "STEALTH" + See the AIBehaviour page for details of the effect of this command on AI units. - https://community.bistudio.com/wiki/vectorModelToWorldVisual + https://community.bistudio.com/wiki/setWaypointBehaviour - Object vectorModelToWorldVisual Array + Array setWaypointBehaviour String - object vectorModelToWorldVisual modelDir + waypoint setWaypointBehaviour mode - $Code$// Convert model space vector [0,-10,4] to world space; vector gets rotated according to _airplane: - _airplane vectorModelToWorldVisual [0,-10,4];$/Code$ + $Code$[_grp, 2] setWaypointBehaviour "AWARE";$/Code$ - undefined / undefined + undefined / global + This scripting command must be executed on the server to work properly in multiplayer + + (August 26, 2008) + Modes are case sensitive - "safe" won't work, while "SAFE" is ok. - Array + Nothing + - vectorModelToWorld + difficultyEnabled - Converts vector direction from model to world space. + This command is deprecated since Arma 3 1.58. Since this version it always returns false. Use difficultyOption instead. See Arma 3 Difficulty Overhaul for further details. + Former functionality: + Checks specific difficulty settings of the current user. Difficulty flag names can be found in the ArmA profile file under class Difficulties/xxx/Flags (xxx being regular or veteran). + Note: stress damage for some reason is a separate difficulty so difficultyEnabled "stressDamageEnabled" might not return correct set value. There are however 2 dedicated commands for it: + enableStressDamage + isStressDamageEnabled + Note: auto trim is also for some reason a separate difficulty so difficultyEnabled "autoTrimEnabled" might not return correct set value. There are also 2 dedicated commands for it: + enableAutoTrimRTD + isAutoTrimOnRTD - https://community.bistudio.com/wiki/vectorModelToWorld + https://community.bistudio.com/wiki/difficultyEnabled - Object vectorModelToWorld Array + difficultyEnabled String - object vectorModelToWorld modelDir + difficultyEnabled flagName - $Code$// Convert model space vector [0,-10,4] to world space; vector gets rotated according to _airplane: - _airplane vectorModelToWorld [0,-10,4];$/Code$ + $Code$hint str ( difficultyEnabled "armor");$/Code$ + + $Code$// List current difficulty settings: + call { + private ["_diff", "_cfg", "_flags", "_res"]; + _diff = []; + _cfg = configFile "CfgDifficulties"; + { + _flags = _cfg configName _x "Flags"; + for "_i" from 0 to count _flags - 1 do { + _diff pushBack configName (_flags select _i); + }; + } forEach ("true" configClasses _cfg); + _diff = _diff arrayIntersect _diff; + _diff sort true ; + _res = text ""; + { + _res = composeText [_res, parseText format [ + " t align='left' %1 - %2 /t ", + _x, + [0, 1] select difficultyEnabled _x + ], lineBreak ]; + } forEach _diff; + hint _res; + };$/Code$ undefined / undefined + (June 29, 2015) + Arma 3 Flags: + 3rdPersonView + armor + autoAim + autoGuideAT + autoSpot + autoTrimEnabled + cameraShake + clockIndicator + deathMessages + enemyTag + extendetInfoType + friendlyTag + hud + hudGroupInfo + hudPerm + hudWp + hudWpPerm + map + mineTag + netStats + roughLanding + stanceIndicator + stressDamageEnabled + unlimitedSaves + vonID + weaponCursor + windEnabled + + Possible Values for Arma 2: + 3rdPersonView + armor + autoSpot + autoGuideAT + autoAim + allowSeagull + clockIndicator + deathMessages + enemyTag + friendlyTag + hud + hudPerm + hudWp + hudWpPerm + map + netStats + suppressPlayer + tracers + realisticFatigue + ultraAI + unlimitedSaves + weaponCursor - Array + Boolean + - vectorMultiply + onBriefingTeamSwitch - Multiplies 3D vector by a scalar. + Select a sound declared in the Description.ext of the mission to be played the first time the TeamSwitch tab is selected in the briefing. - https://community.bistudio.com/wiki/vectorMultiply + https://community.bistudio.com/wiki/onBriefingTeamSwitch - Array vectorMultiply Number + onBriefingTeamSwitch String - vector vectorMultiply scalar + onBriefingTeamSwitch soundName - $Code$_newVector = [1,2,3] vectorMultiply 3; //[3,6,9]$/Code$ + $Code$onBriefingTeamSwitch "TeamSwitchVoiceOver"$/Code$ undefined / undefined - (28 Jun, 2014) - (ArmA3 1.22)Algorithm: - $Code$ - Vector = [x,y,z]; scalar = a; - Result = [(x * a),(y * a),(z * a)]; - $/Code$ - It is recommended to use vectorMultiply instead of BIS_fnc_vectorMultiply. This is a very useful function, as it can be used with the velocity command to move an object from one position to another. (ie vector1 to vector2 ) - ensure both positions are found using getPosASL. - $Code$ - _obj setVelocity ((( getPosASL _target) vectorDiff ( getPosASL _obj)) vectorMultiply 2); - $/Code$ - Array + Nothing + - vectorNormalized + parsingNamespace - Returns normalized vector (unit vector, vectorMagnitude = 1) of given vector. If given vector is 0 result is a 0 vector as well. + Returns the global namespace attached to config parser. - https://community.bistudio.com/wiki/vectorNormalized + https://community.bistudio.com/wiki/parsingNamespace - vectorNormalized Array + parsingNamespace - vectorNormalized vector + parsingNamespace - $Code$vectorNormalized [12345,7890,38383]; //[0.300481,0.192045,0.934254] - vectorMagnitude [0.300481,0.192045,0.934254]; //1$/Code$ + $Code$parsingNamespace setVariable ["var1",101.23124]; + _profVar1 = parsingNamespace getVariable "var1";$/Code$ undefined / undefined - (19 Jul, 2014) - (ArmA3 1.26) Algorithm: - $Code$ - Vector = [x,y,z]; - Result = [x/( sqrt (x ^ 2 + y ^ 2 + z ^ 2)), y/( sqrt (x ^ 2 + y ^ 2 + z ^ 2)), z/( sqrt (x ^ 2 + y ^ 2 + z ^ 2))] - $/Code$ - In mathematics, a unit vector in a normed vector space is a vector whose length is 1. + (January 27, 2015) + Any global variable defined in a config using __EXEC() will be stored in this namespace. + For example in the description.ext: + $Code$__EXEC(testVar = 1);$/Code$ + The variable "testVar" can be accessed during mission run time using getVariable + $Code$ hint str ( parsingNamespace getVariable ["testVar", 0]);$/Code$ + The above example would print 1. + This example however: + $Code$__EXEC(_testVar = 1);$/Code$ + Would print 0, because adding an underscore will make the variable local to the config in the same way that it would make it local to a script. + See PreProcessor Commands for more details on __EXEC() - Array + Namespace + - vectorUpVisual + hcLeader - Return object's up vector in world Position coordinates ( [x, y, z] ) in render time scope. + Returns group's high command commander. - https://community.bistudio.com/wiki/vectorUpVisual + https://community.bistudio.com/wiki/hcLeader - vectorUpVisual Object + hcLeader Group - vectorUpVisual objectName + hcLeader group - $Code$_vUp = vectorUpVisual vehicle player ;$/Code$ + $Code$_leader = hcLeader groupName;$/Code$ - global / undefined + undefined / undefined + (September 2, 2009) + hcLeader returns 'NULL_OBJECT' if you use it on your HC commander's group in a HC setup with subordinates. It seems to work as expected if you don't use subordinates. - Array + Object + - vectorUp + onMapSingleClick - Return object's up vector in world Position coordinates ( [x, y, z] ). + Define action performed when user clicks in map by executing command string. + the string receives 5 (localised in scope) variables: + _this: Anything - Params passed to onMapSingleClick + _pos: Array - Clicked position + _units: Array - Units which were selected (via function keys) before opening the map ( may be non-functional in Arma ) + _shift: Boolean - Whether Shift was pressed when clicking on the map + _alt: Boolean - Whether Alt was pressed when clicking on the map + In Arma 3 the code should return true only if you wish to override default engine handling of the mouse click on map (see example #4) For older games, when click is processed, code should ultimately return true back to the engine. If false is returned, default processing by the game engine is done. Return value of any other type (including Nothing ) is an error. In such case default processing by the game engine is done, and error message may be displayed. + The code is executed on every click, until the Command is + removed via onMapSingleClick "", or + replaced by onMapSingleClick "SomeOtherCommand(s)" + i + Since Arma 3 v1.57 a stackable version of this EH is available: MapSingleClick + In order to keep compatibility between official and community content the functions BIS_fnc_addStackedEventHandler and BIS_fnc_removeStackedEventHandler should be used instead. - https://community.bistudio.com/wiki/vectorUp + https://community.bistudio.com/wiki/onMapSingleClick - vectorUp Object + onMapSingleClick String/Code + + Anything onMapSingleClick String/Code - vectorUp objectName + onMapSingleClick command + + params onMapSingleClick command - $Code$objVector = vectorUp myObject;$/Code$ + $Code$onMapSingleClick "'SoldierWB' createUnit [_pos, group player ]; true"; + // ArmA: Creates a soldier unit at the position clicked.$/Code$ + + $Code$onMapSingleClick "grp1 move _pos; onMapSingleClick ''; true "; + // ArmA: Orders "grp1" to move to position clicked. Disables further map-click actions.$/Code$ + + $Code$onMapSingleClick "'SoldierWB' createUnit [_pos, group player ]; true "; + // OFP: In OFP single quotes cannot be used for string definition, so two double-quotes have to be used instead.$/Code$ + + $Code$//The following code will disable Shift+click waypoint marker creation + onMapSingleClick {_shift};$/Code$ + + $Code$//Pass params to onMapSingleClick code + player onMapSingleClick { hint ("Hello " + name _this)}; //Hello KK$/Code$ + + $Code$//Pass params to onMapSingleClick code and disable Shift+click waypoint marker creation + player onMapSingleClick " hint (""Hello "" + name _this ); _shift"; //Hello KK$/Code$ - global / undefined + undefined / undefined - (28 Jun, 2014) - (ArmA3 1.22) Returns the pitch and bank of an object in degrees, use BIS_fnc_getPitchBank instead. + (8 July, 2009) + See my Multiple OnMapSingleClick script to allow you to add multiple events to the onMapSingleClick event. Some minor editing of the scripts would be required to use them in Arma. + + (April 1, 2016) + _units param is supposed to return what groupSelectedUnits returns. Player must be leader and some units in the group must be selected on the group bar. However selected units are connected with group orders menu, which interferes with map click. In other words, when you click on the main map, the map gets focus and group orders menu closes, deselecting any selected unit, so _units is [] pretty much all the time. - Array + Nothing - Nothing + - vectorWorldToModelVisual + inPolygon - Converts vector direction from world to model space in render time scope. + Checks whether position is inside given polygon - https://community.bistudio.com/wiki/vectorWorldToModelVisual + https://community.bistudio.com/wiki/inPolygon - Object vectorWorldToModelVisual Array + Array inPolygon Array - object vectorWorldToModelVisual worldDir + position inPolygon polygon - $Code$// Convert world space vector [0,-10,4] to model space of object _airplane: - _airplane vectorWorldToModelVisual [0,-10,4];$/Code$ + $Code$_isInside = [100,100,0] inPolygon [[0,0,0],[1000,1000,0],[1000,0,0]];$/Code$ undefined / undefined @@ -73586,57 +76542,75 @@ - Array + Boolean + - vectorWorldToModel + assert - Converts vector direction from world to model space. + Tests a condition and if the condition is false, displays error on screen (if -showscripterrors enabled) and logs error into.rpt file. It does not interrupt the script execution. + If script was pre-processed with preprocessFileLineNumbers, it will also show/log the error line number and the file name. - https://community.bistudio.com/wiki/vectorWorldToModel + https://community.bistudio.com/wiki/assert - Object vectorWorldToModel Array + assert Boolean - object vectorWorldToModel worldDir + assert condition - $Code$// Convert world space vector [0,-10,4] to model space of object _airplane: - _airplane vectorWorldToModel [0,-10,4];$/Code$ + $Code$assert (1 2);$/Code$ + + $Code$// Check function params (Faster alternative to BIS_fnc_param ) + some_func = { + _0 = _this select 0; + _1 = _this select 1; + _2 = _this select 2; + if (! assert ( + typeName _0 == "ARRAY" && + typeName _1 == "STRING" && + typeName _2 == "SCALAR" + )) exitWith {/*optional error logging*/}; + hint "Alright!"; + }; + [1,2,3] call some_func; //assert error + [[1],"2",3] call some_func; //Alright!$/Code$ undefined / undefined + (May 15, 2010) + Returns false, if condition is false, and returns true, if condition is true. - Array + Boolean + - vehicleCargoEnabled + rectangular - Check if the vehicle has enabled transporting other vehicles or not. + Checks if a location is rectangular (returns true) or elliptical (returns false). - https://community.bistudio.com/wiki/vehicleCargoEnabled + https://community.bistudio.com/wiki/rectangular - vehicleCargoEnabled Object + rectangular Location - vehicleCargoEnabled vehicle + rectangular location - $Code$// Blackfish (Vehicle Transport) with given variable name blackfish - _canTransportVehicles = vehicleCargoEnabled blackfish; //returns true$/Code$ + $Code$_isRect = rectangular myLocation;$/Code$ undefined / undefined @@ -73644,99 +76618,102 @@ - Boolean + Boolean + - vehicleChat + isGroupDeletedWhenEmpty - Types text to the vehicle radio channel. The text will be visible only on the PC where command was executed. If you need the message to show on all computers, you have to execute it globally (see remoteExec ) - Note: Object parameter must be a vehicle, not a player. - Note: If you are in a crew seat (i.e. driver, gunner or commander), then it will include that role in the chat name output (Eg: Driver (you_name): "Message"). + Checks if the given group marked for auto-deletion when empty. See deleteGroupWhenEmpty. - https://community.bistudio.com/wiki/vehicleChat + https://community.bistudio.com/wiki/isGroupDeletedWhenEmpty - Object vehicleChat String + isGroupDeletedWhenEmpty Group - vehicleName vehicleChat chatText + isGroupDeletedWhenEmpty group - $Code$vehicle player vehicleChat "Show this text";$/Code$ - - $Code$driver vehicle player sideChat "sideChat"; - driver vehicle player globalChat "globalChat"; - driver vehicle player groupChat "groupChat"; - vehicle player vehicleChat "vehicleChat"; - driver vehicle player commandChat "commandChat"; - driver vehicle player customChat [1, "customChat"]; - systemChat "systemChat";$/Code$ + $Code$_isMarked = isGroupDeletedWhenEmpty _group;$/Code$ - global / local + undefined / undefined - Nothing + Boolean + - vehicleRadio + getPosASL - Sends the audio message to the vehicle radio channel. The message is defined in CfgRadio in the description.ext file or config radio protocol. The transmission will play only on the PC where command was executed. If you need the transmission to play on all computers, you have to execute it globally (see remoteExec ). - Note: When transmitting unit gets killed, transmission will be interrupted, however when receiving unit gets killed, the transmission continues to play. + Returns the object position height above sea level. - https://community.bistudio.com/wiki/vehicleRadio + https://community.bistudio.com/wiki/getPosASL - Object vehicleRadio String + getPosASL Object - unit vehicleRadio radioName + getPosASL object - $Code$_soldierOne vehicleRadio "messageOne";$/Code$ + $Code$_AslPos = getPosASL player ;$/Code$ - $Code$player vehicleRadio configName selectRandom ("true" configClasses ( configFile "CfgRadio"));$/Code$ + $Code$hint format ["position above sea level: %1", ( getPosASL player ) select 2];$/Code$ - global / local + global / undefined - (December 3, 2016) - To transmit user custom sounds (see Multiplayer_Custom_Sounds_Tutorial ), prefix the full filename including file extension with #. For example if there is a custom user sound file called MySound.ogg, to play it on the radio use: - $Code$ player vehicleRadio "#MySound.ogg";$/Code$ + (23 Feb, 2007) + $Code$ getPosASL _obj select 2;$/Code$ + might sometimes return the vertical position above sea level, but over land for stacked objects, it returns the vertical position above the object beneath it or at least affected by this offset. The same problem exists for getPos. There was a discussion thread in the BIS forums which suggested the use of the command modelToWorld instead to get around this issue where an absolute vertical position is required. ArmA Ver 1.02. + + (27 Mar, 2014) + According to Code Optimisation, this function is the fastest (2x) and should be used instead of getPos, getPosATL and position. + Conversion keep this speed ratio and is structured like: $Code$ ASLtoATL getPosASL Object ;$/Code$ - Nothing + Array + - vehicleReceiveRemoteTargets + setMusicEffect - Gets whether the vehicle can acquire targets via datalink from the Side center. + Defines the music track played on activation. + Track is a subclass name of CfgMusic. In addition, "$STOP$" (stops the current music track). - https://community.bistudio.com/wiki/vehicleReceiveRemoteTargets + https://community.bistudio.com/wiki/setMusicEffect - vehicleReceiveRemoteTargets Object + Object setMusicEffect String + + Array setMusicEffect String - vehicleReceiveRemoteTargets vehicle + trigger setMusicEffect track + + waypoint setMusicEffect track - $Code$vehicleReceiveRemoteTargets ( vehicle player );$/Code$ + $Code$_trigger setMusicEffect "Track1"$/Code$ + + $Code$[_group1,1] setMusicEffect "$STOP$"$/Code$ undefined / undefined @@ -73744,27 +76721,28 @@ - Boolean + Nothing - Nothing + - vehicleReportOwnPosition + sendAUMessage - Gets whether the vehicle shares its own position via datalink with the Side center. + Send the command to the list of clients. - https://community.bistudio.com/wiki/vehicleReportOwnPosition + https://community.bistudio.com/wiki/sendAUMessage - vehicleReportOwnPosition Object + sendAUMessage Array - vehicleReportOwnPosition vehicle + sendAUMessage [clientList, command] - $Code$vehicleReportOwnPosition ( vehicle player );$/Code$ + $Code$sendAUMessage [[dpnid1, dpnid2], "ConnectTo: 192.168.1.66"]$/Code$ undefined / undefined @@ -73772,27 +76750,28 @@ - Boolean + Nothing + - vehicleReportRemoteTargets + switchAction - Gets whether the vehicle shares acquired targets via datalink with the Side center. + When used on a person, the given action is started immediately (there is no transition). Use switchmove "" to switch back to the default movement if there is no transition back, otherwise the person may be stuck. - https://community.bistudio.com/wiki/vehicleReportRemoteTargets + https://community.bistudio.com/wiki/switchAction - vehicleReportRemoteTargets Object + Object switchAction String - vehicleReportRemoteTargets vehicle + soldier switchAction action - $Code$vehicleReportRemoteTargets ( vehicle player );$/Code$ + $Code$soldierOne switchAction "SitDown"$/Code$ undefined / undefined @@ -73800,290 +76779,255 @@ - Boolean + Nothing + - vehicleVarName + currentChannel - Returns the name of the variable which contains a primary editor reference to this object. This is the variable given in the Insert Unit dialog / name field, in the editor. It can be changed using setVehicleVarName. - If object refers to a vehicle that wasn't given a name in the editor, the return value is an empty string, "". - Since it is possible to setVehicleVarName individually on each PC, the value of vehicleVarName returned will be local to the PC on which command is executed. + Returns currently selected user chat channel on the UI (selected with and in MP). Correspondence between channel and number: + 0 = Global + 1 = Side + 2 = Command + 3 = Group + 4 = Vehicle + 5 = Direct + 6-15 = Custom Radio (see radioChannelCreate ) - https://community.bistudio.com/wiki/vehicleVarName + https://community.bistudio.com/wiki/currentChannel - vehicleVarName Object + currentChannel - vehicleVarName object + currentChannel - $Code$hint vehicleVarName player ;$/Code$ + $Code$_selected = currentChannel ; // 3 - for example for the Group$/Code$ - global / local + undefined / undefined - (April 19, 2015) - To get variable names referencing an object in mission namespace: - $Code$KK_fnc_objectVarNames = { - private "_names"; - _names = []; - { - if ( missionNamespace getVariable _x isEqualTo _this) then { - _names pushBack _x; - }; - } forEach allVariables missionNamespace ; - _names - }; - //example - myGroup = group player ; - aGroup = group player ; - hint str ( group player call KK_fnc_objectVarNames); //["agroup","mygroup"]$/Code$ - String + Number + - vehicles + set3DENAttribute - Returns an array of all vehicles available to current client. This command returns both empty and crewed vehicles but not soldiers. It will also return "WeaponHolderSimulated" of dead bodies (weapon on the ground). Vehicles created with createVehicleLocal will only be returned on the client that created them. + Set one of entity attributes. + ! + Attributes are available only within the Eden Editor workspace. You cannot access them in scenario preview or exported scenario! - https://community.bistudio.com/wiki/vehicles + https://community.bistudio.com/wiki/set3DENAttribute - vehicles + EdenEntity set3DENAttribute Array - vehicles + entity set3DENAttribute [class, value] - $Code$_vehicles = vehicles ;$/Code$ + $Code$player set3DENAttribute ["allowDamage", false ]; + // Mark player as invincible$/Code$ - undefined / local + undefined / undefined - Array + Boolean + - vehicle + triggerStatements - Vehicle in which given unit is mounted. If none, unit is returned. Alternatively, use objectParent + Returns trigger statements in the form [cond, activ, desactiv]. + Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. - https://community.bistudio.com/wiki/vehicle + https://community.bistudio.com/wiki/triggerStatements - vehicle Object + triggerStatements Object - vehicle unitName + triggerStatements trigger - $Code$// SQS - ? vehicle player != player : hint "Player is in a vehicle"$/Code$ - - $Code$// SQF - if ( vehicle player != player ) then { hint "Player is in a vehicle"};$/Code$ - + - undefined / undefined + global / local - Object + Array + - velocityModelSpace + progressLoadingScreen - Returns the velocity (speed vector) of the vehicle as an array with format [x, y, z]. Vector is in model space. + If loading screen is shown, sets progress bar to the given value (interval is from 0 to 1]) - https://community.bistudio.com/wiki/velocityModelSpace + https://community.bistudio.com/wiki/progressLoadingScreen - velocityModelSpace Object + progressLoadingScreen Number - velocityModelSpace vehicle + progressLoadingScreen progress - $Code$velocityModelSpace _chopper; - comment "Returns [X (left(-) right(+)), Y (backward(-) forward(+)), Z (down(-) up(+))]";$/Code$ + $Code$startLoadingScreen ["Loading My Mission"]; + //Batch of code + //Batch of code + //Batch of code + progressLoadingScreen 0.5; + //Batch of code + //Batch of code + //Batch of code + endLoadingScreen ;$/Code$ undefined / undefined - (December 11, 2014) - This function is useful for helicopters as it returns Z vector like an indicator of thrust/load ratio. More or less climb (+) or descent (-) tendency but: - As X,Y,Z vectors are relative to vehicle attitude, this function doesn't return a climb or descend rate (as the attitude of the vehicle can be far from horizontal). You can get negative Z vector, in jets, while climbing fast, peeling off in the sky! - More or less, you can use as a Z accelerometer factor but invert the sign: +G acceleration (negative vector below the jet) is -Z here. - If not "physically" correct, the behavior is sufficient enough for Arma flight model. - - (June 21, 2015) - Previous note is physically incorrect. Velocity can not be used to give information about Thrust/Load ratio or G-Forces/acceleration. To get acceleration you have to create the derivative of velocity after time dv/dt - the difference of velocity between 2 timesteps divided by the time that passed between the 2 steps. - Array + Nothing + - velocity + addItemToBackpack - Return velocity (speed vector) of Unit as an array with format [x, y, z]. Units are in metres per second. + Create new item and store it to soldier's backpack. The item can also be a weapon or a magazine. - https://community.bistudio.com/wiki/velocity + https://community.bistudio.com/wiki/addItemToBackpack - velocity Object + Object addItemToBackpack String - velocity vehicleName + unit addItemToBackpack item - $Code$_vector = velocity jeep;$/Code$ + $Code$player addItemToBackpack "arifle_MXM_Hamr_pointer_F";$/Code$ - $Code$if ( velocity _plane1 select 2 50) then { hint "Aircraft is climbing up too fast!"};$/Code$ + $Code$player addItemToBackpack "itemGPS";$/Code$ - undefined / undefined + global / global - Array + Nothing + - verifySignature + menuSort - Check if file is signed by any key present in game keys folders. Note: On client, it does not check against the keys accepted by server. + Sorts subentries of item on given path by their text. - https://community.bistudio.com/wiki/verifySignature + https://community.bistudio.com/wiki/menuSort - verifySignature String + menuSort Array - verifySignature filename + menuSort [idc, path, reversed] - $Code$verifySignature "@MyAddon\Addons\SomeAddon.pbo";$/Code$ - - $Code$verifySignature "@MyAddon\Somefnc.dll";$/Code$ - + undefined / undefined - Boolean + Nothing + - vestContainer + nearestBuilding - Returns a cargo container of a unit's vest. + Finds the nearest building to a given object or position. A "building" is defined as an object that is of class "House" and contains a path LOD. - https://community.bistudio.com/wiki/vestContainer + https://community.bistudio.com/wiki/nearestBuilding - vestContainer Object + nearestBuilding Object/Array - vestContainer unit + nearestBuilding position - $Code$hint str vestContainer player ; //2df7d600# 163942: dummyweapon.p3d$/Code$ + $Code$_nBuilding = nearestBuilding player ;$/Code$ - $Code$hint str getMagazineCargo vestContainer player ; - // [ - //[ - //"30Rnd_65x39_caseless_mag", - //"16Rnd_9x21_Mag", - //"HandGrenade", - //"APERSMine_Range_Mag", - //"SmokeShell", - //"SmokeShellGreen", - //"Chemlight_green" - //],[ - //2, - //2, - //2, - //3, - //1, - //1, - //2 - //] - //]$/Code$ + $Code$_nBuilding = nearestBuilding position player ;$/Code$ undefined / undefined + (February 18, 2016) + This command doesn't return any house or building placed in editor (with createVehicle ). Use nearestObjects instead: + $Code$ nearestObjects [ player, ["House", "Building"], 50] select 0$/Code$ - Object + Object + - vestItems + stopEngineRTD - Get array with all items (of any kind, even weapons) from vest. + Instant engines stop. - https://community.bistudio.com/wiki/vestItems + https://community.bistudio.com/wiki/stopEngineRTD - vestItems Object + stopEngineRTD Object - vestItems unit + stopEngineRTD heli - $Code$vestItems player ;[ - "30Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag", - "16Rnd_9x21_Mag", - "16Rnd_9x21_Mag", - "HandGrenade", - "HandGrenade", - "SmokeShell", - "SmokeShellGreen", - "Chemlight_green", - "Chemlight_green" - ]$/Code$ + $Code$stopEngineRTD myHeli$/Code$ undefined / undefined @@ -74091,34 +77035,30 @@ - Array + Array + - vestMagazines + netObjNull - Get array with all magazines from vest of the given unit. + A non existing network object. Not used in scripting anywhere in game. - https://community.bistudio.com/wiki/vestMagazines + https://community.bistudio.com/wiki/netObjNull - vestMagazines Object + netObjNull - vestMagazines unit + netObjNull - $Code$vestMagazines player ;[ - "6.5mm 30Rnd STANAG Mag(30/30)[id/cr:4/0](2x)", - "9mm 16Rnd Mag(16/16)[id/cr:7/0](2x)", - "RGO Frag Grenade(1/1)[id/cr:10/0](2x)", - "Smoke Grenade (White)(1/1)[id/cr:12/0](1x)", - "Smoke Grenade (Green)(1/1)[id/cr:13/0](1x)", - "Chemlight (Green)(1/1)[id/cr:14/0](2x)" - ]$/Code$ + $Code$netObjNull == netObjNull // Returns false$/Code$ + + $Code$netObjNull isEqualTo netObjNull // Returns true$/Code$ undefined / undefined @@ -74126,111 +77066,155 @@ - Array + NetObject + - vest + playSound - Returns name of vest. + Selects sound from Description.ext#CfgSounds or config.cpp. - https://community.bistudio.com/wiki/vest + https://community.bistudio.com/wiki/playSound - vest Object + playSound String + + playSound Array - vest unit + playSound soundName + + playSound [soundName, isSpeech] - $Code$_myVest = vest player;$/Code$ + $Code$playSound "soundname"$/Code$ + + $Code$// Start a sound and then stop it after 1.2 second: + playSound "AlarmCar"; + [] spawn + { + _sound = ASLToAGL [0,0,0] nearestObject "#soundonvehicle"; + sleep 1.2; + deleteVehicle _sound; + };$/Code$ + + $Code$// Start a sound and wait until it is finished: + playSound "Alarm"; + hint "Started!"; + [] spawn + { + _sound = ASLToAGL [0,0,0] nearestObject "#soundonvehicle"; + waitUntil { isNull _sound}; + hint "Finished!"; + };$/Code$ - undefined / undefined + undefined / local + (August 4, 2006) + Notes from before the conversion: + For dialogue involving living units it is better to use say, playSound will play a sound at the location of the player, say will play a sound at the location of the unit that is speaking, and it will only play that sound if the unit is alive. + + (December 28, 2014) + As you may have noticed, the parameter for playsound/say3d that deals with the "volume" of the sound played has little to do with the effective loudness heard in game. What it is alters is the drop off for fading the sound at a distance. A higher decibel or integer value will increase the distance before any sort of fading will take place. The actual volume of the sound file played will factor in to this, as it does throughout the playing action. + Amplifying the Sound + Modifying the effective volume of sounds played by the engine is possible by "spamming" the sounds. By quickly playing the sounds overtop of one another, you can effectively amplify the volume + This example, + $Code$ + playSound "soundname"; + playSound "soundname"; + $/Code$ + Will effectively amplify the sound by a sensed 2x. The volume of the sound file itself will still affect the sound volume as it appears as though the arma engine has no normalization for sound files added to it. + This technique may cause issues in sound quality in large multiplayer servers. I observed multiple instances when a triggered sound amplified with this method was out of sync with each other. Timing of the individual commands sent over the network is probably the issue. Recommend you compile your amplification code into a single finished function for better syncing for clients not activating the action/far away from the activation position. - String + Nothing - Nothing + - viewDistance + hcRemoveAllGroups - Returns the rendering distance. + Remove all groups from unit's high command bar. - https://community.bistudio.com/wiki/viewDistance + https://community.bistudio.com/wiki/hcRemoveAllGroups - viewDistance + hcRemoveAllGroups Object - viewDistance + hcRemoveAllGroups unit - $Code$hint ("my view distance is " + str viewDistance + " meters");$/Code$ - + undefined / undefined - Number + Nothing + - visibleCompass + behaviour - Checks if the player has compass opened and visible + Return the behaviour of a unit. For Arma 3 behaviour explanation see Arma_3_AI_Behavior - https://community.bistudio.com/wiki/visibleCompass + https://community.bistudio.com/wiki/behaviour - visibleCompass + behaviour Object - visibleCompass + behaviour unitName - $Code$if ( visibleCompass ) then { hint "Compass is visible"};$/Code$ + $Code$_soldier setBehaviour "CARELESS"; + _b = behaviour _soldier; //returns "CARELESS"$/Code$ - undefined / undefined + global / undefined + (14 Feb 2010) + Although behaviour is called on an individual unit, what you are really getting back is the behaviour of that unit's group. Behaviour is a group setting. - Boolean + String + - visibleGPS + ctrlSetModel - Checks if the player has GPS receiver opened and visible + Sets model for 3D Dialog Control. - https://community.bistudio.com/wiki/visibleGPS + https://community.bistudio.com/wiki/ctrlSetModel - visibleGPS + Control ctrlSetModel String - visibleGPS + control ctrlSetModel model - $Code$if ( visibleGPS ) then { hint "GPS is visible"};$/Code$ + $Code$_control3D ctrlSetModel "\a3\Ui_f\objects\Compass.p3d";$/Code$ undefined / undefined @@ -74238,27 +77222,28 @@ - Boolean + Nothing + - visibleMap + setFromEditor - Return true if the main map is shown (active). + Set if given team member was inserted directly from editor. - https://community.bistudio.com/wiki/visibleMap + https://community.bistudio.com/wiki/setFromEditor - visibleMap + Team_Member setFromEditor Boolean - visibleMap + teamMember setFromEditor fromEditor - $Code$if (visibleMap) then {hint "You're showing the map !"}$/Code$ + $Code$_teamMember setFromEditor true$/Code$ undefined / undefined @@ -74266,361 +77251,536 @@ - Boolean + Nothing + - visiblePositionASL + startLoadingScreen - Returns an object's rendered 3D position ASL (z value above sea level) in render time scope. + Shows loading screen with the given text, using the given resource. While loading screen is shown, simulation and scene drawing is disabled, user control is disabled, mouse cursor is hidden, scripts run at full speed. The loading screen does not end by itself and needs endLoadingScreen command, so make sure there is one at the end of loading operation. + NOTE: The game simulation is disabled during Loading Screen operation (at least in SP), therefore any use of sleep command will pause the game indefinitely. If you have to "sleep", use uiSleep + By default (if custom resource is not provided) startLoadingScreen will use "RscDisplayNotFreeze" resource. If you are using custom resource (could be also defined in description.ext ), the following resource's controls are supported by the engine: + idc = 101; - text (type = 0;) or picture (type = 48;). The text will be set to the text provided by the command param. + idc = 103; - progress (type = 8;) or animated texture (type = 45;). This control indicates global hardcoded mission loading progress and is useless after mission is loaded. + idc = 104; - progress (type = 8;). This control's progress is initially set to 0 and can be manipulated with progressLoadingScreen command. - https://community.bistudio.com/wiki/visiblePositionASL + https://community.bistudio.com/wiki/startLoadingScreen - visiblePositionASL Object + startLoadingScreen Array - visiblePositionASL object + startLoadingScreen [text, resource] - $Code$playerRenderedPosASL = visiblePositionASL player;$/Code$ + $Code$startLoadingScreen ["Loading My Mission, please wait..."];$/Code$ + + $Code$startLoadingScreen ["Can't skip loading time...", "MyLoadingRsc"];$/Code$ + + $Code$startLoadingScreen ["Loading My Mission"]; + //Batch of code + //Batch of code + //Batch of code + progressLoadingScreen 0.5; + //Batch of code + //Batch of code + //Batch of code + endLoadingScreen ;$/Code$ undefined / undefined + (July 15, 2009) + As it stops simulation as well as scene drawing, be sure not to put any sleep (or waitUntil if you are checking for in-game changes ; waitUntil for var initialization or script loading is ok) command between startLoadingScreen and endLoadingScreen. + + (January 18, 2010) + edit 10:15 : Whatever transparence you define in your own resource, there will be a black screen to cache loading. + It's up to you to choose a nice blue background :-) + Resource has to be defined in description.ext ; it must NOT be defined as RscTitles ! Here is an example : + Show text + $Code$ + // basic defines + // + class RscText + { + type = 0; + idc = -1; + x = 0; + y = 0; + h = 0.037; + w = 0.3; + style = 0x100; + font = Zeppelin32; + SizeEx = 0.03921; + colorText[] = {1,1,1,1}; + colorBackground[] = {0, 0, 0, 0}; + linespacing = 1; + }; + class RscPicture + { + access=0; + type=0; + idc=-1; + style=48; + colorBackground[]={0,0,0,0}; + colorText[]={1,1,1,1}; + font="TahomaB"; + sizeEx=0; + lineSpacing=0; + text=""; + }; + class RscLoadingText : RscText + { + style = 2; + x = 0.323532; + y = 0.666672; + w = 0.352944; + h = 0.039216; + sizeEx = 0.03921; + colorText[] = {0.543,0.5742,0.4102,1.0}; + }; + class RscProgress + { + x = 0.344; + y = 0.619; + w = 0.313726; + h = 0.0261438; + texture = "\ca\ui\data\loadscreen_progressbar_ca.paa"; + colorFrame[] = {0,0,0,0}; + colorBar[] = {1,1,1,1}; + }; + class RscProgressNotFreeze + { + idc = -1; + type = 45; + style = 0; + x = 0.022059; + y = 0.911772; + w = 0.029412; + h = 0.039216; + texture = "#(argb,8,8,3)color(0,0,0,0)"; + }; + // + // the loading screen itself + // + class Harrier_loadingScreen + { + idd = -1; + duration = 10e10; + fadein = 0; + fadeout = 0; + name = "loading screen"; + class controlsBackground + { + class blackBG : RscText + { + x = safezoneX; + y = safezoneY; + w = safezoneW; + h = safezoneH; + text = ""; + colorText[] = {0,0,0,0}; + colorBackground[] = {0,0,0,1}; + }; + class nicePic : RscPicture + { + style = 48 + 0x800; // ST_PICTURE + ST_KEEP_ASPECT_RATIO + x = safezoneX + safezoneW/2 - 0.25; + y = safezoneY + safezoneH/2 - 0.2; + w = 0.5; + h = 0.4; + text = "img\nicePic.paa"; + }; + }; + class controls + { + class Title1 : RscLoadingText + { + text = "$STR_LOADING"; // "Loading" text in the middle of the screen + }; + class CA_Progress : RscProgress // progress bar, has to have idc 104 + { + idc = 104; + type = 8; // CT_PROGRESS + style = 0; // ST_SINGLE + texture = "\ca\ui\data\loadscreen_progressbar_ca.paa"; + }; + class CA_Progress2 : RscProgressNotFreeze // progress bar that will go reverse + { + idc = 103; + }; + class Name2: RscText // the text on the top-left + { + idc = 101; + x = 0.05; + y = 0.029412; + w = 0.9; + h = 0.04902; + text = ""; + sizeEx = 0.05; + colorText[] = {0.543,0.5742,0.4102,1.0}; + }; + }; + }; + $/Code$ + + (February 19, 2015) + Based on what Lou Montana has previously said, the simulation does become disabled upon using this command. If you wish to use a delay 'sleep' will not work. The work around would be to use 'uiSleep' + + (November 21, 2015) + In Arma 3 default loading screen has no control do display text. The description of the command now contains information what is needed to create custom loading screen resource. - Array + Nothing + - visiblePosition + visiblePositionASL - Returns an object's rendered position (z value above surface underneath) in render time scope. Same as getPosVisual + Returns an object's rendered 3D position ASL (z value above sea level) in render time scope. - https://community.bistudio.com/wiki/visiblePosition + https://community.bistudio.com/wiki/visiblePositionASL - visiblePosition Object + visiblePositionASL Object - visiblePosition object + visiblePositionASL object - $Code$playerRenderedPos = visiblePosition player;$/Code$ + $Code$playerRenderedPosASL = visiblePositionASL player;$/Code$ undefined / undefined - (February 4, 2015) - Z (visiblePosition select 2) works but if unit/object is in a building, Z remains at ground level. If you need Z depending on building floors/stages, use getPosAtl select 2 instead. - Array + Array + - visibleScoretable + getEditorCamera - Checks whether the score table is visible. + Fetches a reference to the mission editor camera. + i + Some Old Editor Command - https://community.bistudio.com/wiki/visibleScoretable + https://community.bistudio.com/wiki/getEditorCamera - visibleScoretable + getEditorCamera Control - visibleScoretable + getEditorCamera map - $Code$_visible = visibleScoretable ;$/Code$ - + undefined / undefined - Boolean + Object + - visibleWatch + || - Checks if the player has watch opened and visible + Returns true only if one or both conditions are true. In case of the alternative syntax(code as right argument), lazy evaluation is used (if left operand is true, evaluation of the right side is skipped completely). Identical to: a or b - https://community.bistudio.com/wiki/visibleWatch + https://community.bistudio.com/wiki/a_or_b - visibleWatch + Boolean || Boolean/Code - visibleWatch - + - $Code$if ( visibleWatch ) then { hint "Watch is visible"};$/Code$ - + undefined / undefined - Boolean + Boolean + - WFSideText + date - Returns the un localized text value of an object's side / a group's side or a side as: - east, opfor - "East" - west, blufor - "West" - resistance, independent - "Resistance" - civilian - "Civilian" - sideUnknown - "Unknown" - sideEnemy - "Unknown" - sideFriendly - "Unknown" - sideLogic - "Unknown" - sideEmpty - "Unknown" - sideAmbientLife - "Unknown" + Return the actual mission date and time as an array [ year, month, day, hour, minute ]$/Code$. Month is a full number between 1 and 12, day is between 1 and 31, hour is between 0 and 23 and minute is between 0 and 59. - https://community.bistudio.com/wiki/WFSideText + https://community.bistudio.com/wiki/date - WFSideText Object/Group/Side + date - WFSideText param + date - $Code$WFSideText player ;$/Code$ - - $Code$WFSideText group player ;$/Code$ + $Code$_now = date ; // _now = [2014,10,30,2,30] (Oct. 30th, 2:30am) + _hour = _now select 3; + _min = _now select 4;$/Code$ - $Code$WFSideText west$/Code$ + $Code$if ( date select 3 = 19) then { // 7pm + hintSilent "ah, Arma sunset"; //...cue bad guys + };$/Code$ undefined / undefined - (August 17, 2014) - WF stands for Warfare + (January 23, 2018) + a useful command here: + $Code$_curDate = date; + _ddMMyyyy = format ["%3/%2/%1", + _curDate select 0, + (if (_curDate select 1 10) then { "0" } else { "" }) + str (_curDate select 1), + (if (_curDate select 2 10) then { "0" } else { "" }) + str (_curDate select 2)];$/Code$ + it can be shortened to: (no variable but more request to date ) + $Code$_ddMMyyyy = format ["%3/%2/%1", + date select 0, + (if (date select 1 10) then { "0" } else { "" }) + str (date select 1), + (if (date select 2 10) then { "0" } else { "" }) + str (date select 2)];$/Code$ - String + Array + - waitUntil + forceRespawn - Suspends execution of function or SQF based script until given condition is satisfied. This command will loop and call the code inside {} mostly every frame (depends on complexity of condition and overall engine load) until the code returns true. The execution of the rest of the script therefore will be suspended until waitUntil completes. - If the very first execution of the code returns true the command will exit immediately, therefore it will not produce any "Suspending not allowed in this context" error when used inside non-scheduled script. For all other uses it must be executed in environment that allows suspension ( canSuspend ), such as spawned or execVMed code. + Forces unit to respawn. The effect as if the player pressed RESPAWN button in the game pause menu, the unit is killed only there is no "so and so was killed" message and no score adjustment. - https://community.bistudio.com/wiki/waitUntil + https://community.bistudio.com/wiki/forceRespawn - waitUntil Code + forceRespawn Object - waitUntil condition + forceRespawn unit - $Code$waitUntil { not alive player };$/Code$ - - $Code$_i = 0; waitUntil { _i = _i + 1; _i = 100 };$/Code$ - - $Code$waitUntil { sleep 0.1; not alive player };$/Code$ - - $Code$// An on-the-fly custom event handler : - _myEH = ["ZoomIn"] spawn { - while { true } do { - waitUntil { - inputAction ( _this select 0) == 1; - }; - diag_log format ["%1 @ %2", _this select 0, diag_tickTime ]; - }; - }; - // Although perhaps better to use onEachFrame, depending on the application.$/Code$ + $Code$forceRespawn player ;$/Code$ - undefined / undefined + local / global - (September 20, 2013) - In case you have more complex code inside waitUntil loop, to be on the safe side always return boolean at the end of the scope: - $Code$ player addEventHandler ["Fired", { - _null = (_this select 6) spawn { - _p = [0,0,0]; - waitUntil { - if ( isNull _this) exitWith { true }; - _p = getPos _this; - false // -- boolean at the end of the scope - }; - hint str _p; - }; - }];$/Code$ - - (December 20, 2006) - waitUntil suspends both SQF functions and SQF scripts. In functions, the calling script is still in suspension due to waiting for a return from the call command. The game engine will continue, however. See Function for more detail. - - (April 2, 2010) - If WaitUntil uses an undefined call code, WaitUntil won't release, even when this code is separated from other conditions through or. Be warned that this won't cause an error message. - - (Jan 07, 2011) - By default the cycle time for the condition check is per frame. Look at the example 3, how to set it at a lower rate yourself. - Often times one does not need per frame checking. Saves a lot CPU checks; especially when the condition is complex to compute. - - (December 13, 2014) - If you want to use waitUntil together with exitWith, remember that the loop only exits if the code block returns true. - It should look like this: - $Code$ - waitUntil { - // exit loop if the unit gets deleted - if (isNull _unit) exitWith {true}; // has to return true to continue - !alive _unit; - }; - $/Code$ - Nothing + Nothing + - waves + forceFlagTexture - Return waves value. + Forces a flag texture onto a flag carrier (unit, vehicle or flag pole). No flag holder is required. If "" is used as texture, the texture is removed. This will override regularly owned flags. This type of flag texture cannot be retrieved using flagTexture. + Note : Forced flag texture is an additional flag texture, which visually overrides original flag texture and therefore is very expensive to simulate, so please use the functionality sparingly. - https://community.bistudio.com/wiki/waves + https://community.bistudio.com/wiki/forceFlagTexture - waves + Object forceFlagTexture String - waves + object forceFlagTexture texture - $Code$waveIntensity = waves ;$/Code$ + $Code$player forceFlagTexture "\A3\Data_F\Flags\Flag_red_CO.paa";$/Code$ - undefined / undefined + global / global - Number + Nothing + - waypointAttachObject + getHitPointDamage - Attaches a static object via it's numeric ID to the given waypoint. - The alternative syntax is (at least) available since Arma 2. + Return current level of damage for a specific Hit Point (specified by its config class). If you need to get damage of a selection instead of hit point, use getHit. + 0: no damage + 1: full damage - https://community.bistudio.com/wiki/waypointAttachObject + https://community.bistudio.com/wiki/getHitPointDamage - Array waypointAttachObject Number - - Array waypointAttachObject Object + Object getHitPointDamage String - waypoint waypointAttachObject objectID - - waypoint waypointAttachObject object + vehicle getHitPointDamage hitPointName - $Code$[_grp, 2] waypointAttachObject 1234$/Code$ - - $Code$_wp = group player addWaypoint [[1907.5,5746.5,0.00144196],0]; - _wp waypointAttachObject (( waypointPosition _wp) nearestObject 66220);$/Code$ + $Code$(vehicle player) getHitPointDamage "hitEngine";$/Code$ - undefined / undefined + global / undefined - (June 20, 2014) - In Arma 3 1.22 only the alternative syntax is working. + Common ObjectRTD TKOH Hit Points: + HitEngine (engine #1) + HitEngine2 (engine #2) + HitEngine3 (engine #3) + HitHRotor (main rotor) + HitVRotor (tail rotor) + HitBatteries (electrical systems) + HitLight (landing light) + HitHydraulics (entire hydraulics system) + HitTransmission (engine transmission) + HitGear (landing gear) + HitFuel (all fuel tanks) + HitHStabilizerL1 (first left horizontal stabilizer) + HitHStabilizerR1 (first right horizontal stabilizer) + HitVStabilizer1 (first vertical stabilizer) + HitTail (tail boom) + HitPitotTube (all pitot tubes) + HitStaticPort (all static ports) + HitStarter1 (starter for engine #1) + HitStarter2 (starter for engine #2) + HitStarter3 (starter for engine #3) + HitAvionics + HitHull + HitMissiles + HitRGlass + HitLGlass + HitGlass1 + HitGlass2 + HitGlass3 + HitGlass4 + HitGlass5 + HitGlass6 + + (March 4, 2017) + Note that vehicles with multiple turrets have multiple HitTurret and HitGun classes that can't be distinguished based on the Hitpoint class name. They can only be distinguished by their selection names. The selection names do not necessarily correspond to a common nomenclature, especially for mod vehicles. There can also be multiple empty Hitpoint Class names on a vehicle or infantry unit. They can be hitpoints for vehicle headlights or be the result of a bad config/model, as hitpoints that have an undefined named selection in their config class or are missing their named selection in the model will result in an empty HitPoint class name. - Nothing - Nothing + Number/Nothing + - waypointAttachVehicle + reveal - Attaches a Unit to the given Waypoint. + Reveals a target to a group. If toWhom is a unit, unit's group is considered. If toWhom is a vehicle, vehicle commander's group is considered. + The knowledge value will be set to the highest level any unit of the revealing side has about the revealed target. If the revealing side has no knowledge about the revealed target, the value will be set to 1. + Since ARMA 2 OA 1.60 the alternative syntax is available. Values greater than or equal 1.5 reveal the side of the target, too. + The knowledge level can only be increased, not decreased by this command. + In MP targetKnowledge and knowsAbout infos get updated only on the PC where command was executed. - https://community.bistudio.com/wiki/waypointAttachVehicle + https://community.bistudio.com/wiki/reveal - Array waypointAttachVehicle Object + Object/Group reveal Object + + Object/Group reveal Array - waypoint waypointAttachVehicle vehicleName + toWhom reveal target + + toWhom reveal [target, accuracy] - $Code$[_grp, 2] waypointAttachVehicle vehicle player$/Code$ + $Code$_soldierOne reveal _soldierTwo; //soldierOne knowsAbout information about soldierTwo is updated$/Code$ - $Code$[_grp, 2] waypointAttachVehicle _soldier1$/Code$ + $Code$player reveal cursorObject ; //player knowsAbout information about object under cursor is updated$/Code$ + + $Code$_soldierOne reveal [_soldierTwo, 1.5];$/Code$ - undefined / undefined + global / local - (June 19, 2010) - You can attach waypoint only to vehicle inserted from classic editor. Trying to attach it to dynamically spawned ( createUnit, createVehicle ) won't work. Engine will then try to find suitable target by itself, affecting game performance. + (January 15, 2007) + In OFP v1.96, When a target is revealed to a unit, it's knowsAbout rating is set to 1, unless it was already more than 1 in which case reveal does nothing. See knowsAbout for more details about knowsAbout ratings and limitations. + + (January 24, 2008) + Use reveal to allow client to see a created vehicle faster - the associated menu interaction will become available therefore, like the player has option to get in sooner. + _tank = "M1A1" createVehicle (position player); + player reveal _tank; + //get in user actions become available instantly + + (January 15, 2012) + The same idea from Doolittle's note applies to beaming of units. If you setPos an unit or a player, reveal (all) nearby objects and vehicles to make the interaction possible a lot quicker. + + (January 15, 2012) + Revealing a targetUnit will also add it to nearTargets database of the given sourceUnit. The quality/detail level of the info depends on the knowsAbout value used with reveal. More detail in the nearTargets page. + + (October 21, 2014) + Units that have been previously subjected to enableSimulation false; or enableSimulationGlobal false; may stay unrecognised for a long time even after simulation was re-enabled, returning objNull as cursorTarget. Force revealing units with reveal command usually solves the problem. For example: $Code${ player reveal _x} forEach allUnits ;$/Code$ - Nothing + Nothing - Nothing + - waypointAttachedObject + tvSort - Gets the object attached to the waypoint. + Sorts childrens of given item by item name ( tvText ). IDC means id of parent Tree View. + Param reversed is optional. - https://community.bistudio.com/wiki/waypointAttachedObject + https://community.bistudio.com/wiki/tvSort - waypointAttachedObject Array + Control tvSort Array + + tvSort Array - waypointAttachedObject waypoint + control tvSort [path, reversed] + + tvSort [idc, path, reversed] - $Code$waypointAttachedObject [groupOne,1]$/Code$ + $Code$control tvSort [[0], true ];$/Code$ + + $Code$tvSort [102, [0], true ];$/Code$ undefined / undefined @@ -74628,144 +77788,155 @@ - Object + Nothing - Nothing + - waypointAttachedVehicle + putWeaponPool - Gets the vehicle attached to the waypoint. - A vehicle can be attached to a waypoint by - creating the waypoint on top of the vehicle (in the editor) - using waypointAttachVehicle + Transfer weapons and magazines from weapon pool into cargo of object obj. Used in campaign to transfer weapons into next mission. - https://community.bistudio.com/wiki/waypointAttachedVehicle + https://community.bistudio.com/wiki/putWeaponPool - waypointAttachedVehicle Array + putWeaponPool Object - waypointAttachedVehicle waypoint + putWeaponPool object - $Code$waypointAttachedVehicle [groupOne,1]$/Code$ - - $Code$waypointAttachedVehicle [ group player, currentWaypoint group player ]$/Code$ - + undefined / undefined - Object + Nothing + - waypointBehaviour + triggerType - Gets the waypoint behavior. + Returns trigger type (see setTriggerType ). + Note: The trigger could be local or remote but the result returned by this command will be for the trigger condition set up locally on the client that executed the command. See createTrigger for more info. - https://community.bistudio.com/wiki/waypointBehaviour + https://community.bistudio.com/wiki/triggerType - waypointBehaviour Array + triggerType Object - waypointBehaviour waypoint + triggerType trigger - $Code$waypointBehaviour [groupOne,1]$/Code$ + $Code$_type = triggerType tr1;$/Code$ - undefined / undefined + global / local - String + String + - waypointCombatMode + lbSize - Gets the waypoint combat mode. + Return number of items of listbox or combobox with id idc of topmost user dialog. - https://community.bistudio.com/wiki/waypointCombatMode + https://community.bistudio.com/wiki/lbSize - waypointCombatMode Array + lbSize Number + + lbSize Control - waypointCombatMode waypoint + lbSize idc + + lbSize control - $Code$waypointCombatMode [groupOne,1]$/Code$ + $Code$_size = lbSize 101;$/Code$ + + $Code$_size = lbSize _control;$/Code$ - undefined / undefined + local / local + More information on the LB command family can be found here - String + Number - Number + - waypointCompletionRadius + setGroupOwner - Gets the radius around the waypoint where the waypoint is completed. + Changes the ownership of a group (and all its units) to a given client. Group leader can't be a player. Only works when called from a server. Returns true if locality was changed. For agents use setOwner command. - https://community.bistudio.com/wiki/waypointCompletionRadius + https://community.bistudio.com/wiki/setGroupOwner - waypointCompletionRadius Array + Group setGroupOwner Number - waypointCompletionRadius waypoint + group setGroupOwner clientID - $Code$_radius = waypointCompletionRadius [groupOne, 1];$/Code$ + $Code$_localityChanged = _someGroup setGroupOwner ( owner _playerObject);$/Code$ undefined / undefined + This scripting command must be executed on the server to work properly in multiplayer + + (July 30, 2015) + In ArmA3 1.48, setGroupOwner does NOT work if group has no units - Number + Boolean + - waypointDescription + removeAllOwnedMines - Gets the waypoint description. + Removes ownership of all owned mines/explosive devices of the given unit - https://community.bistudio.com/wiki/waypointDescription + https://community.bistudio.com/wiki/removeAllOwnedMines - waypointDescription Array + removeAllOwnedMines Object - waypointDescription waypoint + removeAllOwnedMines unit - $Code$waypointDescription [groupOne,1]$/Code$ + $Code$removeAllOwnedMines player ;$/Code$ undefined / undefined @@ -74773,66 +77944,59 @@ - String + Nothing + - waypointForceBehaviour + clearWeaponCargoGlobal - Returns true if the waypoint behavior is forced. + Removes all weapons from the vehicle cargo space. MP synchronized. - https://community.bistudio.com/wiki/waypointForceBehaviour + https://community.bistudio.com/wiki/clearWeaponCargoGlobal - waypointForceBehaviour Waypoint + clearWeaponCargoGlobal Object - waypointForceBehaviour waypoint + clearWeaponCargoGlobal unit - $Code$_isForced = waypointForceBehaviour [groupOne, 1];$/Code$ + $Code$clearWeaponCargoGlobal jeepOne;$/Code$ - undefined / undefined + global / global - Boolean + Nothing + - waypointFormation + isEqualType - Gets the waypoint formation. - Possible values are: - "NO CHANGE" - "COLUMN" - "STAG COLUMN" - "WEDGE" - "ECH LEFT" - "ECH RIGHT" - "VEE" - "LINE" - "FILE" - "DIAMOND" + Compares 2 values by their type. A much faster alternative to typeName a == typeName b. - https://community.bistudio.com/wiki/waypointFormation + https://community.bistudio.com/wiki/isEqualType - waypointFormation Array + Anything isEqualType Anything - waypointFormation waypoint + val1 isEqualType val2 - $Code$waypointFormation [groupOne,1]$/Code$ + $Code$_var = [1,2,3]; + _var isEqualType 0; //false + _var isEqualType []; //true$/Code$ undefined / undefined @@ -74840,233 +78004,320 @@ - String + Boolean + - waypointHousePosition + hideSelection - Gets the house position assigned to the waypoint. + Hides or enables the given selection for the object - https://community.bistudio.com/wiki/waypointHousePosition + https://community.bistudio.com/wiki/hideSelection - waypointHousePosition Array + object hideSelection Array - waypointHousePosition waypoint + object hideSelection [selection, hidden] - $Code$waypointHousePosition [groupOne,1]$/Code$ - + - undefined / undefined + local / global + (April 28, 2016) + Only seems to work for objects created with createSimpleObject, and will only work for certain selections. - Number + Nothing + - waypointLoiterRadius + canStand - Gets the waypoint loiter radius. Waypoint uses format Waypoint. + Returns if the given soldier is able to stand up. - https://community.bistudio.com/wiki/waypointLoiterRadius + https://community.bistudio.com/wiki/canStand - waypointLoiterRadius Waypoint + canStand Object - waypointLoiterRadius Waypoint + canStand unitName - $Code$_radius = waypointLoiterRadius [groupOne, 1];$/Code$ + $Code$// SQS : + ?!( canStand player ) : player groupChat "My legs! They hit my legs!"$/Code$ + + $Code$if (! canStand player ) then + { + player groupChat "My legs! They hit my legs!"; + };$/Code$ - undefined / undefined + global / undefined + The command may return true for dead units. - Number + Boolean + - waypointLoiterType + setUnitPosWeak - Gets the waypoint loiter type. Waypoint uses format Waypoint. + Set unit position rules. Mode may be one of: + "DOWN" - person goes prone and stays prone. + "UP" - person stands and stays standing. + "Middle" - Kneel Position. ArmA version 1.04 + "AUTO" - person chooses mode according to circumstances. - https://community.bistudio.com/wiki/waypointLoiterType + https://community.bistudio.com/wiki/setUnitPosWeak - waypointLoiterType Waypoint + Object setUnitPosWeak String - waypointLoiterType Waypoint + unit setUnitPosWeak mode - $Code$_type = waypointLoiterType [groupOne, 1]$/Code$ + $Code$_soldier disableAI "FSM"; + _soldier setUnitPosWeak "DOWN";$/Code$ - undefined / undefined + local / global + This command is the lowest level of priority for setting unit position and to be used in scripted + FSM's. + The current priorities are: + 1. Unit pos commanded (from the commanding menu, higher priority). + 2. Unit pos scripted (from setUnitPos scripting command, medium priority). + 3. Unit pos FSM / setUnitPosWeak (used in the formation FSM, lowest priority). + Command most likely only works if run before join into group after createUnit array. - String + Nothing + - waypointName + attachTo - Gets the waypoint name. + Attaches an object to another object. The offset is applied to the object center unless a memory point is provided. If no offset is specified, the offset used will be the current relative positioning of objects against each other. - https://community.bistudio.com/wiki/waypointName + https://community.bistudio.com/wiki/attachTo - waypointName Waypoint + Object attachTo Array - waypointName waypoint + object1 attachTo [object2, offset, memPoint] - $Code$_wpName = waypointName [_grp,2];$/Code$ + $Code$player attachTo [car, [0, 0, 1] ];$/Code$ + + $Code$player attachTo [tank, [0, -1, 0], "Usti hlavne"];$/Code$ + + $Code$// Automatic offset: + ammoCrate attachTo [ player ];$/Code$ + + $Code$To set orientation of attached object use setVectorDirAndUp command: + _expl1 = "DemoCharge_Remote_Ammo" createVehicle position player ; + _expl1 attachTo [ player, [-0.1, 0.1, 0.15], "Pelvis"]; + _expl1 setVectorDirAndUp [ [0.5, 0.5, 0], [-0.5, 0.5, 0] ]; + _expl2 = "DemoCharge_Remote_Ammo" createVehicle position player ; + _expl2 attachTo [ player, [0, 0.15, 0.15], "Pelvis"]; + _expl2 setVectorDirAndUp [ [1, 0, 0], [0, 1, 0] ]; + _expl3 = "DemoCharge_Remote_Ammo" createVehicle position player ; + _expl3 attachTo [ player, [0.1, 0.1, 0.15], "Pelvis"]; + _expl3 setVectorDirAndUp [ [0.5, -0.5, 0], [0.5, 0.5, 0] ];$/Code$ - undefined / undefined + global / global + (June 6, 2009) + You can use setDir to change the direction of the attached object. The direction is relative to the object you attach it to, so setDir 180 won't point to the south but to the rear of the object you attach it to. + Use setPos to synchronize the direction of the object in a network game. + Example code: + $Code$ + _obj setDir 180; + _obj setPos getPos _obj;$/Code$ + + (September 17, 2011) + Some objects you cannot attach anything to. To be more precise, you can attach objects to them, but the behaviour is unexpected. For instance: $Code$ + SuitcaseObject attachTo [FoldingTableObject, [0,0,0]];$/Code$ + You would expect the suitcase to jump to the pivot point of the table, and stick to it. + Instead, the suitcase will freeze in it's original position. Even if the table is moved, the suitcase will be unaffected: it will not follow the table, it will not even respond to actions it reacted to prior to being attached: pushing, being shot at, etc.. It's just an object frozen in space. In MP it's even weirder, the suitcase would turn invisible. + Dodgy objects when it comes to attaching things to them: most in Objects(small), Objects(signs), all of Objects(helpers) categories, etc.. + + (March 28, 2014) + If you attach an explosive charge to an object (e.g. ammobox), the charge will not detonate when you simply set the damage to 1. You must detach it before. + $Code$ private ["_target"]; + _target = your_ammobox ; + // create and attach charge + private ["_charge"]; + _charge = "DemoCharge_Remote_Ammo_Scripted" createVehicle position player ; + _charge attachTo [_target, [0,0,0.2]]; + _charge setVectorDirAndUp [[0.5,0.5,0],[-0.5,0.5,0]]; + // now detonate charge + detach _charge; //Important! + _charge setDamage 1; + $/Code$ + + (1 Jun, 2014) + (ArmA3 ver 1.20) attachTo overwrites setVectorDirAndUp if attached obj was changed to attach another one. + $Code$ + _obj attachTo [_logic,[0,0,0]]; + _obj setVectorDirAndUp [[0,1,0],[0,0,-1]]; + _obj attachTo [_logic,[0,0,2]]; //vector no changes + _obj attachTo [_anotherOne,[0,0,0]]; //vector changes to default + $/Code$ + + (September 25, 2014) + Attaching an object does not update the accessibility of a place for the AI. The command shouldn't be used for positioning large static objects - the AI will simply walk thru such objects. + + (September 1, 2016) + Using attachTo with an objects that have ragdoll physics (such as ammo boxes, containers, etc.) may cause unexpected behaviour. When you do so, if the attached object intersect origin object, origin object may gain some + enormous collision properties even if the collision model for the attached object is not present localy to origin object, until detached. Vehicles may start flipping with no mass calculation (ie tank might fly), player object might gain inifinite + Z-vector velocity on any interaction with terrain relief and other objects. - String + Nothing + - waypointPosition + getConnectedUAV - Get Waypoint 's Position. Note : This function is identical to getWPPos. + Returns UAV if unit has connection to some UAV. - https://community.bistudio.com/wiki/waypointPosition + https://community.bistudio.com/wiki/getConnectedUAV - waypointPosition Array + getConnectedUAV Object - waypointPosition waypoint + getConnectedUAV unit - $Code$_wPos = waypointPosition [_groupOne, 1];$/Code$ - + undefined / undefined - Array + Object + - waypointScript + lbTextRight - Gets the waypoint script. + Returns the shown right text in the item with the given index of the listbox or combobox with id idc of the topmost user dialog. - https://community.bistudio.com/wiki/waypointScript + https://community.bistudio.com/wiki/lbTextRight - waypointScript Array + lbTextRight Array + + Control lbTextRight Number - waypointScript waypoint + lbTextRight [idc, index] + + control lbTextRight index - $Code$waypointScript [groupOne,1]$/Code$ + $Code$_text = lbTextRight [101, 0];$/Code$ + + $Code$_text = _control lbTextRight 0;$/Code$ - undefined / undefined + local / local - String + String - String + - waypointShow + ropeLength - Gets the waypoint show/hide status. - Possible values are: - "NEVER" - never show it - "EASY" - show only in cadet mode - "ALWAYS" - always show it - "ERROR" - when set to any different string + Return rope length in meters (set by ropeCreate, ropeCut, ropeUnwind ) - https://community.bistudio.com/wiki/waypointShow + https://community.bistudio.com/wiki/ropeLength - waypointShow Array + ropeLength Object - waypointShow waypoint + ropeLength rope - $Code$_wpShow = waypointShow [groupOne,1];$/Code$ + $Code$_length = ropeLength ( ropes heli1 select 0);$/Code$ undefined / undefined + (March 19, 2016) + When a rope gets stretched ropeLength will still return the same length as before. - String + Number + - waypointSpeed + tan - Gets the waypoint speed. - Possible values are: - "UNCHANGED" - "LIMITED" - "NORMAL" - "FULL" + Tangent of x, argument in Degrees. - https://community.bistudio.com/wiki/waypointSpeed + https://community.bistudio.com/wiki/tan - waypointSpeed Array + tan Number - waypointSpeed waypoint + tan x - $Code$_speed = waypointSpeed [groupOne,1];$/Code$ + $Code$_tangent = tan 45 + // Result is 1$/Code$ undefined / undefined @@ -75074,27 +78325,39 @@ - String + Number + - waypointStatements + get3DENSelected - Gets the waypoint statements. + Returns an array of all selected Eden Editor Entities, including groups, waypoints, and markers. In case a wrong type is used the command will return [[],[],[],[],[],[]] and an error message is displayed. - https://community.bistudio.com/wiki/waypointStatements + https://community.bistudio.com/wiki/get3DENSelected - waypointStatements Array + get3DENSelected String - waypointStatements waypoint + get3DENSelected type - $Code$waypointStatements [groupOne,1]$/Code$ + $Code$systemChat str ( get3DENSelected ""); + /* outputs: [ + [B Alpha 2-1:1],//objects + [B Alpha 2-1],//groups + [164494: no shape ],//triggers + [ No center Charlie 1-2:4],//logic + [ [B Alpha 2-1,0] ],//waypoints + ["Hotel_Whiskey"]//markers + ]*/$/Code$ + + $Code$systemChat str ( get3DENSelected "object"); + // outputs: [B Alpha 2-1:1]$/Code$ undefined / undefined @@ -75102,27 +78365,29 @@ - Array + Array + - waypointTimeoutCurrent + do3DENAction - Gets the current waypoint timeout or -1 if countdown is not in progress. + Performs given Eden Editor action. + See the list of all actions. - https://community.bistudio.com/wiki/waypointTimeoutCurrent + https://community.bistudio.com/wiki/do3DENAction - waypointTimeoutCurrent Group + do3DENAction String - waypointTimeoutCurrent waypoint + do3DENAction action - $Code$_timeout = waypointTimeoutCurrent groupOne;$/Code$ + $Code$do3DENAction "MissionSave";// saves the scenario$/Code$ undefined / undefined @@ -75130,27 +78395,28 @@ - Number + Nothing + - waypointTimeout + getSoundControllerResult - Gets the waypoint timeout values. + Returns the calculated value of simple expression in config. - https://community.bistudio.com/wiki/waypointTimeout + https://community.bistudio.com/wiki/getSoundControllerResult - waypointTimeout Array + Object getSoundControllerResult Config - waypointTimeout waypoint + obj getSoundControllerResult configEntry - $Code$waypointTimeout [groupOne,1]$/Code$ + $Code$_result = ( vehicle player ) getSoundControllerResult ( configFile "cfgVehicles" typeOf ( vehicle player ) "sounds" "idle_ext" "volume");$/Code$ undefined / undefined @@ -75158,115 +78424,102 @@ - Array + Number + - waypointType + addEditorObject - Gets the waypoint type. - Type can be: - "MOVE" - "DESTROY" - "GETIN" - "SAD" - "JOIN" - "LEADER" - "GETOUT" - "CYCLE" - "LOAD" - "UNLOAD" - "TR UNLOAD" - "HOLD" - "SENTRY" - "GUARD" - "TALK" - "SCRIPTED" - "SUPPORT" - "GETIN NEAREST" - "DISMISS" - "AND" - "OR" - More details at Waypoint types. + Add an object to the editor and assign arguments. Create script is,called with _new equal to true. Returns the ID of the new EditorObject.,Subtype class is optional. + i + Some Old Editor Command - https://community.bistudio.com/wiki/waypointType + https://community.bistudio.com/wiki/addEditorObject - waypointType Array + Control addEditorObject Array - waypointType waypoint + map addEditorObject [type,[name1,value1,],subtype class] - $Code$waypointType [groupOne,1],$/Code$ - + undefined / undefined - (August 6, 2015) - With the new sling loading in Arma 3, 2 new waypoint types are added aswell being: - Drop Cargo and Lift Cargo. - The names for these 2 waypoints are: - "UNHOOK" and "HOOK". - String + String + - waypointVisible + camSetDir - Returns the visibility of the waypoint. - Returns 0 ( Number ) for a non valid waypoint. + Sets the orientation of the given camera in the direction of the given vector. Needs camCommit. - https://community.bistudio.com/wiki/waypointVisible + https://community.bistudio.com/wiki/camSetDir - waypointVisible Array + Object camSetDir Array - waypointVisible waypoint + camera camSetDir direction - $Code$_visible = waypointVisible [groupOne, 1];$/Code$ - - $Code$_visible = waypointVisible [group player, currentWayPoint (group player)];$/Code$ + $Code$pos1 = player modelToWorld [0,5,5]; + cam = "camera" camCreate pos1; + cam cameraEffect ["INTERNAL", "BACK"]; + pos2 = player modelToWorld [0,50,50]; + cam camSetPos pos2; + cam camSetDir (pos2 vectorFromTo pos1); + cam camCommit 5; + 0 = [] spawn + { + waitUntil { camCommitted cam}; + cam camSetPos pos1; + cam camCommit 5; + };$/Code$ - undefined / undefined + local / local + (May 9, 2016) + cameraEffect "INTERNAL" works better than "EXTERNAL" with this command. - Boolean + Nothing + - waypointsEnabledUAV + camPrepareFocus - Checks if the UAV has waypoints enabled. + focusRange is in format [distance,blur]. Prepares the camera focus blur. + [-1,1] will reset default values (auto focusing), [-1,-1] will disable postprocessing (all is focused). - https://community.bistudio.com/wiki/waypointsEnabledUAV + https://community.bistudio.com/wiki/camPrepareFocus - waypointsEnabledUAV Object + Object camPrepareFocus Array - waypointsEnabledUAV uav + camera camPrepareFocus focusRange - $Code$_uav enableUAVWaypoints false ; - hint str waypointsEnabledUAV _uav; // returns false$/Code$ + $Code$_camera camPrepareFocus [50, 1]$/Code$ undefined / undefined @@ -75274,119 +78527,92 @@ - Boolean + Nothing + - waypoints + enableIRLasers - Returns an array of waypoints for the specified unit/group. + Allows the AI to use IR lasers - https://community.bistudio.com/wiki/waypoints + https://community.bistudio.com/wiki/enableIRLasers - waypoints Group + Object/Group enableIRLasers Boolean - waypoints groupName + thing enableIRLasers value - $Code$waypoints player ;$/Code$ - - $Code$_wPosArray = waypoints group10; - // could return [[EAST 1-1-A,0],[EAST 1-1-A,1],[EAST 1-1-A,2]]$/Code$ + $Code$(units group player) enableIRLasers true$/Code$ - global / undefined - - - - - Array - - - - - weaponAccessoriesCargo - - - Returns array with all items assigned to the given weapon in given cargo container. - - - https://community.bistudio.com/wiki/weaponAccessoriesCargo - - - Object weaponAccessoriesCargo Array - - - container weaponAccessoriesCargo [weaponId, creatorId] - - - - - undefined / undefined + local / global - Array + Nothing + - weaponAccessories + tvSetPictureRight - Get array with all items linked to a given weapon. + Sets right picture on the tree view item defined by path - https://community.bistudio.com/wiki/weaponAccessories + https://community.bistudio.com/wiki/tvSetPictureRight - Object weaponAccessories String + tvSetPictureRight Array + + Control tvSetPictureRight Array - unit weaponAccessories weapon + tvSetPictureRight [idc, path, name] + + control tvSetPictureRight [path, name] - $Code$player weaponAccessories primaryWeapon player ; ["","acc_pointer_IR","optic_Aco",""]$/Code$ + $Code$tvSetPictureRight [101, [0], "picture"];$/Code$ + + $Code$_ctrl tvSetPictureRight [[0], "picture"];$/Code$ undefined / undefined - (October 26, 2014) - To check if currently selected muzzle has a silencer: - $Code$hasSilencer = player weaponAccessories currentMuzzle player param [0, ""] != "";$/Code$ - - (March 16, 2015) - Since revision 129742, this command also returns an attached bipod. - Array + Nothing - Nothing + - weaponCargo + removeAllCuratorCameraAreas - Get array with weapons from ammo box (or any general weapon holder container). + Delete all curator camera areas. - https://community.bistudio.com/wiki/weaponCargo + https://community.bistudio.com/wiki/removeAllCuratorCameraAreas - weaponCargo Object + removeAllCuratorCameraAreas Object - weaponCargo box + removeAllCuratorCameraAreas curatorObj - $Code$hint str weaponCargo backpackContainer player ;$/Code$ + $Code$removeAllCuratorCameraAreas myCurator;$/Code$ undefined / undefined @@ -75394,614 +78620,454 @@ - Array + Nothing + - weaponDirection + removeMusicEventHandler - Returns the direction that the vehicle weapon is aiming in. - For addons the weapon name must be an entry in CfgWeapons. - Returns an array in format [x, y, z] + Removes specified music track event handler. - https://community.bistudio.com/wiki/weaponDirection + https://community.bistudio.com/wiki/removeMusicEventHandler - Object weaponDirection String + removeMusicEventHandler Array - vehicleName weaponDirection weaponName + removeMusicEventHandler [type, id] - $Code$_weaponVectorDir = player weaponDirection currentWeapon player ;$/Code$ + $Code$removeMusicEventHandler ["MusicStart", 12];$/Code$ - $Code$// Draw AI eye direction (green) and weapon direction (red) in 3D: - bob = createGroup east createUnit ["O_Soldier_F", [0,0,0], [], 0, "NONE"]; - bob setVehiclePosition [ player modelToWorld [0,100,0], [], 0, "NONE"]; - onEachFrame - { - _beg = ASLToAGL eyePos bob; - _endE = (_beg vectorAdd ( eyeDirection bob vectorMultiply 100)); - drawLine3D [ _beg, _endE, [0,1,0,1]]; - _endW = (_beg vectorAdd (bob weaponDirection currentWeapon bob vectorMultiply 100)); - drawLine3D [_beg, _endW, [1,0,0,1]]; - };$/Code$ + $Code$removeMusicEventHandler ["MusicStop", 12];$/Code$ + + $Code$hnd_stop = addMusicEventHandler ["MusicStop",{}]; + removeMusicEventHandler ["MusicStop",hnd_stop];$/Code$ - global / undefined + undefined / undefined - (August 18, 2007) - Works great in multiplayer. - The numbers are representing offset as follows : [X axis,Y axis,Z axis] - The return array can be processed-converted into degrees as follows: - $Code$_array = _this weaponDirection "weapon class" ; - _dir_degrees = (_array select 0) atan2 (_array select 1);$/Code$ - - (November 11, 2007) - WeaponClass can only be the primary turret of the vehicle. For example it is not possible to get direction of commander's M2 on M1Abrams. - - (November 13, 2007) - For an alternative to the weaponDirection command, see the following post on the offical forums. On how to obtain the direction of multiple turrets on vehicles. - Turret Animations - new forum - - (December 9, 2014) - The suggestion above using atan2 and weaponDirection get the direction the barrel of a weapon is pointing, but this is not the same as the direction a shell will be fired (verify this by getting in an M4 Scorcher, parking it on a slope, elevating the barrel "across" the slope and watching the shell come out in third person). - Array + Nothing + - weaponInertia + setSimpleTaskCustomData - Returns current rate of how much the weapon view is distorted because of quick aiming + Set custom data for the task. Tooltip will be drawn in task list on the right side. Description will be drawn in task description panel on the bottom. - https://community.bistudio.com/wiki/weaponInertia + https://community.bistudio.com/wiki/setSimpleTaskCustomData - weaponInertia Object + Task setSimpleTaskCustomData Array - weaponInertia unit + task setSimpleTaskCustomData [IconPath, tooltip, description] - $Code$_inertia = weaponInertia player ;$/Code$ - + undefined / undefined - Array + Nothing + - weaponLowered + setHitPointDamage - True if given soldier's weapon is lowered. + Set the current level of damage for a specific Hit Point (specified by its config class). + 0: no damage + 1: full damage + See also BIS_fnc_setHitPointDamage for setting hit with dependency - https://community.bistudio.com/wiki/weaponLowered + https://community.bistudio.com/wiki/setHitPointDamage - weaponLowered Object + Object setHitPointDamage Array - weaponLowered unit + vehicle setHitPointDamage [hitPointName, damage, useEffects] - $Code$isWeaponLowered = weaponLowered player;$/Code$ + $Code$vehicle player setHitPointDamage ["hitEngine2", 1.0];$/Code$ + + $Code$player setHitPointDamage ["hitHead", 0.5]; + player setHitPointDamage ["hitBody", 0.5]; + player setHitPointDamage ["hitHands", 0.5]; + player setHitPointDamage ["hitLegs", 0.5];$/Code$ - undefined / undefined + local / global - (November 11, 2016) - This command seems to work for player only, not for AI. + (August 30, 2012) + This command is using the Hit Points (defined in the HitPoints class in the config) while setHit is using Named Selections (defined in the model itself). + + (November 10, 2016) + This command has no affect when allowDamage is false. + + (November 14, 2016) + Mention that setHitPointDamage only can be executed localy, while the getHitPointDamage is global. - Boolean + Nothing + - weaponState + getPosATL - Returns the currently selected weapon state for unit or vehicle. - Since Arma 3 v1.69.140397 this command has been improved and extended: - It is now possible to query any weapon of a vehicle without the need to place a weapon operator first, provided the weapon or muzzle is specified in optional param. By default a vehicle has no weapons selected, so querying currently selected weapon returns no weapon, unless weapon is specified. - Driver turret can now be accessed as well with turret path [-1]. - Muzzle name is supported as well as weapon name. Weapon search gets priority, but if there is no weapon with given name, the muzzles will be searched. + Returns the position of an object relative to the terrain. - https://community.bistudio.com/wiki/weaponState + https://community.bistudio.com/wiki/getPosATL - weaponState Object - - weaponState Array + getPosATL Object - weaponState unit - - weaponState [vehicle, turretPath, weapon] + getPosATL object - $Code$_wsPlayer = weaponState player ; // ["arifle_MXC_ACO_F","arifle_MXC_ACO_F","Single","30Rnd_65x39_caseless_mag",30]$/Code$ - - $Code$_wsVehicle = weaponState [_apc, [0]]; // ["autocannon_40mm_CTWS","HE","player","60Rnd_40mm_GPR_Tracer_Red_shells",60]$/Code$ - - $Code$_wsVehicle = weaponState [_apc, [0], "AP"]; // ["autocannon_40mm_CTWS","AP","player","40Rnd_40mm_APFSDS_Tracer_Red_shells",40]$/Code$ + $Code$_objPosition = getPosATL player$/Code$ - undefined / undefined + global / undefined + (December 18, 2015) + If one desires to retrieve an object from an array of object, be sure to wrap your array information in parenthesis. e.g. getPosATL ( myArray select 0 ) ; - Array - Array + Array + - weaponsItemsCargo + moveOut - Returns an array with subarrays contains class names and also names of connected items of all the vehicle's cargo weapons in weaponsItems format. If weapon has no magazine, an empty array [] is returned instead of magazine info. + Moves the soldier out of vehicle, immediately, without animation. - https://community.bistudio.com/wiki/weaponsItemsCargo + https://community.bistudio.com/wiki/moveOut - weaponsItemsCargo Object + moveOut Object - weaponsItemsCargo vehicle + moveOut soldier - $Code$weaponsItemsCargo vehicle player ;$/Code$ + $Code${ if ( lifeState _x == "UNCONSCIOUS") then { moveOut _x}} forEach crew cursorTarget ;$/Code$ - $Code$weaponsItemsCargo _weaponholder;$/Code$ + $Code$// Move out player just before he dies: + player addEventHandler [ + "HandleDamage", + format [ + ' if ( switch (_this select 1) do { + case "": {_this select 2 = 1}; + case "head": {_this select 2 = %1}; + case "body": {_this select 2 = %2}; + default { false }; + }) then { moveOut player }', + getNumber ( configFile "CfgFirstAid" "CriticalHeadHit"), + getNumber ( configFile "CfgFirstAid" "CriticalBodyHit") + ] + ];$/Code$ - undefined / undefined + global / global + (September 12, 2010) + Seems to work only for unconscious - NOT for dead bodies. setPos /ATL/ASL seems to the only working for dead bodies. + + (December 30, 2017) + moveOut currently doesn't work for units with setUnconscious true. Use _unit setPos (_unit modelToWorldVisual [0,0,0]) instead. - Array + Nothing + - - weaponsItems - - - Returns an array with subarrays contains class names and also names of connected items of all the vehicle's weapons. - Since Arma 3 v1.21.124406 it is possible to query weapon holders and ammo crates with this command. If weapon has no magazine, an empty array [] is returned instead of magazine info. - - - https://community.bistudio.com/wiki/weaponsItems - - - weaponsItems Object - - - weaponsItems vehicle - - - $Code$hint str weaponsItems player ;[ - [//=PRIMARY= - "arifle_MX_ACO_pointer_F",//weapon - "muzzle_snds_H",//suppressor - "acc_pointer_IR",//laser - "optic_Aco",//optics - [//loaded magazine - "30Rnd_65x39_caseless_mag",//mag type - 30//mag ammo count - ], - "bipod_01_F_blk"//bipod - ], - [//=SECONDARY= - "launch_NLAW_F", - "", - "", - "", - [ - "NLAW_F", - 1 - ], - "" - ], - [//=HANDGUN= - "hgun_P07_F", - "muzzle_snds_L", - "", - "", - [ - "16Rnd_9x21_Mag", - 11 - ], - "" - ] - ]$/Code$ - - $Code$hint str weaponsItems vehicle player ;[ - [ - "gatling_30mm", - "", - "", - "", - [ - "250Rnd_30mm_HE_shells", - 250 - ], - "" - ], - [ - "missiles_SCALPEL", - "", - "", - "", - [ - "8Rnd_LG_scalpel", - 8 - ], - "" - ], - [ - "rockets_Skyfire", - "", - "", - "", - [ - "38Rnd_80mm_rockets", - 38 - ], - "" - ] - ]$/Code$ + + hcSelected + + + Returns selected groups in high command. + + + https://community.bistudio.com/wiki/hcSelected + + + hcSelected Object + + + hcSelected unit + + + $Code$array = hcSelected unit;$/Code$ undefined / undefined - (August 17, 2013) - Be careful with this function. The weapons are listed in the order they were taken by the unit, with the most recent at the bottom of the array. Therefore, do not assume the first one is always the primary weapon, and so on. - Also, here's how the primary weapon looks if it has a grenade launcher with a loaded grenade: - $Code$[ - "arifle_MX_GL_F", - "muzzle_snds_H", - "acc_pointer_IR", - "optic_Aco", - [ - "30Rnd_65x39_caseless_mag", - 30 - ], - [ - "1Rnd_HE_Grenade_shell", - 1 - ], - "" - ]$/Code$ - - (October 25, 2014) - The output of this command is an array of arrays and is as follows: (If the unit only has 1 weapon, output is an array within an array.) - $Code$[ - [ - ((_arr select 0) select 0) //STRING - The weapon's classname - ((_arr select 0) select 1) //STRING - Classname of the unit's equipped 'Muzzle/Barrel Accessory' - ((_arr select 0) select 2) //STRING - Classname of the unit's equipped 'Side Accessory' - ((_arr select 0) select 3) //STRING - Classname of the unit's equipped 'Top/Optic Accessory' - ((_arr select 0) select 4) //ARRAY - Magazine information - [ - (((_arr select 0) select 4) select 0) //STRING - Classname of the loaded magazine - (((_arr select 0) select 4) select 1) //SCALAR(Number) - Amount of bullets in the mag - ] - ] //If unit has more than one weapon, the output will follow the same pattern as above except with a new element - ]$/Code$ - Array + Array + - weaponsTurret + isVehicleSensorEnabled - Returns all weapons of given turret. Use turret path [-1] for driver's turret. + Returns class name (to identify list based on component name) and info if given sensor is enabled - https://community.bistudio.com/wiki/weaponsTurret + https://community.bistudio.com/wiki/isVehicleSensorEnabled - Object weaponsTurret Array + Object isVehicleSensorEnabled String - vehicle weaponsTurret turretPath + vehicle isVehicleSensorEnabled componentName - $Code$_weapons = vehicle player weaponsTurret [0,0]$/Code$ - - $Code$_weapons = _tank weaponsTurret [0]$/Code$ - - $Code$_driverWeapon = _ka50pilot weaponsTurret [-1]$/Code$ - - $Code$_weaponsForAnyTurrentPosition = (vehicle player) weaponsTurret ((assignedVehicleRole player) select 1)$/Code$ + $Code$vehicle player isVehicleSensorEnabled "PassiveRadarSensorComponent"; // [ ["PassiveRadarSensorComponent",true] ]$/Code$ - global / undefined + undefined / undefined - (11 March 2011) - Use assignedVehicleRole in combination to easily determine the weapons for any vehicle position. You need to check for -1 if the unit is in the driver/pilot position. See example 3 and 4. - - (11 March 2011) - funcGetTurretsWeapons = { - private ["_result", "_getAnyMagazines", "_findRecurse", "_class"]; - _result = []; - _getAnyMagazines = { - private ["_weapon", "_mags"]; - _weapon = configFile "CfgWeapons" _this; - _mags = []; - { - _mags = _mags + getArray ( - (if (_x == "this") then { _weapon } else { _weapon _x }) "magazines" - ) - } foreach getArray (_weapon "muzzles"); - _mags - }; - _findRecurse = { - private ["_root", "_class", "_path", "_currentPath"]; - _root = (_this select 0); - _path = +(_this select 1); - for "_i" from 0 to count _root -1 do { - _class = _root select _i; - if (isClass _class) then { - _currentPath = _path + [_i]; - { - _result set [count _result, [_x, _x call _getAnyMagazines, _currentPath, str _class]]; - } foreach getArray (_class "weapons"); - _class = _class "turrets"; - if (isClass _class) then { - [_class, _currentPath] call _findRecurse; - }; - }; - }; - }; - _class = ( - configFile "CfgVehicles" ( - switch (typeName _this) do { - case "STRING" : {_this}; - case "OBJECT" : {typeOf _this}; - default {nil} - } - ) "turrets" - ); - [_class, []] call _findRecurse; - _result; - }; - This call: - "M1A2_US_TUSK_MG_EP1" call funcGetTurretsWeapons - will return all turrets weapons, its magazines and its paths: - [ - ["M256", ["20Rnd_120mmSABOT_M1A2", "20Rnd_120mmHE_M1A2"], [0], "bin\config.bin/CfgVehicles/M1A2_US_TUSK_MG_EP1/Turrets/MainTurret"], - ["M240_veh", ["100Rnd_762x51_M240", "1200Rnd_762x51_M240"], [0], "bin\config.bin/CfgVehicles/M1A2_US_TUSK_MG_EP1/Turrets/MainTurret"], - ["M2BC", ["100Rnd_127x99_M2"], [0, 0], "bin\config.bin/CfgVehicles/M1A2_US_TUSK_MG_EP1/Turrets/MainTurret/Turrets/CommanderOptics"], - ["SmokeLauncher", ["SmokeLauncherMag"], [0, 0], "bin\config.bin/CfgVehicles/M1A2_US_TUSK_MG_EP1/Turrets/MainTurret/Turrets/CommanderOptics"], - ["M240_veh_2", ["100Rnd_762x51_M240", "1200Rnd_762x51_M240"], [0, 1], "bin\config.bin/CfgVehicles/M1A2_US_TUSK_MG_EP1/Turrets/MainTurret/Turrets/LoaderTurret"] - ] - denisko.redisko (denvdmj) - Array + Array + - weapons + weaponCargo - Returns array of names of all Unit 's weapons. + Get array with weapons from ammo box (or any general weapon holder container). - https://community.bistudio.com/wiki/weapons + https://community.bistudio.com/wiki/weaponCargo - weapons Object + weaponCargo Object - weapons vehicleName + weaponCargo box - $Code$_wArray = weapons player ;$/Code$ + $Code$hint str weaponCargo backpackContainer player ;$/Code$ undefined / undefined - (12:07, 20 January 2007) - (A1 1.02) this command returns only weapons defined for the primary turret of the vehicle. - for ex. only ["D81", "PKT"] for t72, not ["D81", "PKT","DSHKM"] - - (06:01, 3 March 2007 (CET)) - - (11 March 2011) - Use weaponsTurret to determine the weapons of a non gunner/turret position. - - (25 November 2011) - This command does not include non-turret weapons, such as smoke, flare or chaff launchers which are usually declared in the root of the vehicle's class, rather than in the Turrets hierarchy. (Unsure whether it excludes it because it is not in the turret or because these are not considered true weapons via some property.) - - (18 June 2013) - Lists also weapons in inventory from Arma 3 ver. 0.70. - Array + Array + - weightRTD + vectorDotProduct - Returns weight of RTD helicopter. + Dot product of two 3D vectors. - https://community.bistudio.com/wiki/weightRTD + https://community.bistudio.com/wiki/vectorDotProduct - weightRTD Object + Array vectorDotProduct Array - weightRTD helicopter + vector1 vectorDotProduct vector2 - $Code$_taruWeight = weightRTD taru// Returns [7000,300,1990.56,0,0]$/Code$ + $Code$_dot = [1,0,1] vectorDotProduct [0,0,2];$/Code$ undefined / undefined + (28 Jun, 2014) + (ArmA3 1.22)Algorithm: + $Code$ + Vector1 = [x1,y1,z1]; Vector2 = [x2,y2,z2]; + Result = (x1 * x2) + (y1 * y2) + (z1 * z2) + $/Code$ + It is recommended to use vectorDotProduct instead of BIS_fnc_dotProduct. - Array + Number + - west + playersNumber - West side. + Returns count of occupied role selection slots for given side. Players who claimed a slot in the lobby but didn't start the mission are counted as well. If disabledAI = 0; in description.ext or Enable AI option is checked in 3DEN, AI bots will be treated as valid players and will be counted too. Multiplayer only, in singleplayer always returns 0. - https://community.bistudio.com/wiki/west + https://community.bistudio.com/wiki/playersNumber - west + playersNumber Side - west + playersNumber side - $Code$// SQS: - ?((side _unit) == west ) : hint "This is a western unit!"$/Code$ - - $Code$// SQF: - if (( side _unit) == west ) then { - hint "This is a western unit!"; - };$/Code$ + $Code$_west = playersNumber west ; + _east = playersNumber east ; + _civ = playersNumber civilian ; + hint format ["West:%1 East:%2, Civ:%3", _west, _east, _civ];$/Code$ undefined / undefined + (April 13, 2015) + playersNumber returns playable AI as well as human players. It does not include non playable AI. [NOTE: This was observed in ArmA 1.05] + To get the amount of players that are on the same side as the person executing the script: + $Code$playersNumber playerSide;$/Code$ - Side + Number + - while + numberToDate - Repeats Code while condition is true. A part of while do construct. + Convert float number to a date. - https://community.bistudio.com/wiki/while + https://community.bistudio.com/wiki/numberToDate - while Code + numberToDate Array - while condition + numberToDate [year,time] - $Code$while {a b} do {a = a + 1};$/Code$ - - $Code$// A practical example: Repair all members of a group to such a level that they are able to stand up: - { - while {! canStand _x && alive _x } do { - _x setDamage ( damage _x - 0.01); - }; - } forEach units group unitname;$/Code$ + $Code$_date = numberToDate [2008,0.5324]; //[2008,7,13,7,49]$/Code$ undefined / undefined - (May 14, 2008) - The boolean code that's used to evaluate the while condition can be preceded by code that executes a regular command. - $Code$ while {_a =_a + 1; _a 10} do {...}$/Code$ - - (August 30, 2014) - In non-scheduled environment, while do loop is limited to 10,000 iterations, after which it exits even if condition is still true. In scheduled environment no such limit exists. - While_Type + Array + - windDir + player - Returns the current wind azimuth. + Person controlled by player. + In MP this value is different on each computer and on dedicated server this value is null. + In Intros and Outros this isn't set by default and must be assigned. - https://community.bistudio.com/wiki/windDir + https://community.bistudio.com/wiki/player - windDir + player - windDir + player - $Code$if ( windDir 45 || windDir 315) then { - hint "I feel a northern wind"; - };$/Code$ + $Code$player addRating 500;$/Code$ undefined / undefined + (20 Jul, 2010) + Before you use the player object (usually to avoid JIP issues) all you need is to run: + waitUntil {!isNull player}; + Anything else you see in other scripts is equivalent and/or redundant. Of course JIP players may need more than just the player to point at the actual JIP player unit, but that's script/mission-specific. + + (27 Jan, 2008) + ( isNull player ) is true for JIP players on their client during initialization. + After initialization, it will be set, making it valid again. + To cater for this, some people use code similar to the following in their spawned scripts: + if (!isServer && (player != player)) then + { + waitUntil {player == player}; + waitUntil {time 10}; + }; + // 'player' will now be valid + _action = player addAction ["heal", "heal.sqf", [], -1, false, false, ""]; + See JIP/player topic for additional helpful information. + + (June 26, 2014) + player can actually be REMOTE object on player's PC: http://www.youtube.com/watch?v=m6IILtfa3cQ - Number + Object + - windStr + fromEditor - Returns the current wind strength. + Return if given team was inserted directly from mission editor. - https://community.bistudio.com/wiki/windStr + https://community.bistudio.com/wiki/fromEditor - windStr + fromEditor Team_Member - windStr + fromEditor teamMember - $Code$10 setWindStr (0.5 * windStr );$/Code$ + $Code$_fromEditor = fromEditor _member$/Code$ undefined / undefined @@ -76009,190 +79075,147 @@ - Number + Boolean + - wind + removeHandgunItem - Returns the current wind vector (in m/s) as array [x, z, y]. + Removes given weapon item from the handgun weapon cargo space. + As of Arma 3 DEV 1.37, this command also supports weapon magazines. - https://community.bistudio.com/wiki/wind + https://community.bistudio.com/wiki/removeHandgunItem - wind + Object removeHandgunItem String - wind + unit removeHandgunItem item - $Code$_windarray = wind ;$/Code$ + $Code$player removeHandgunItem "muzzle_snds_L";$/Code$ - undefined / undefined + local / global - In OFP 1.96, wind speed and direction are directly related to overcast. - Array + Nothing + - wingsForcesRTD + worldName - Returns force produced by wings. + Return the name of the currently loaded world. - https://community.bistudio.com/wiki/wingsForcesRTD + https://community.bistudio.com/wiki/worldName - wingsForcesRTD Object + worldName - wingsForcesRTD RTD_helicopter + worldName - $Code$_wingForce = wingsForcesRTD _rtdHelo$/Code$ + $Code$_name = worldName ;$/Code$ undefined / undefined - (March 19, 2015) - Advanced helicopter flight model MUST be enabled for this function to work, otherwise it returns an empty array. - Returns a 3x3 two-dimensional array. In the editor while climbing in a little bird, it returned this: - [ [ 0.3993577, 11.72865, -30.21434 ], [ 0.3053164, 11.17272, -30.17695 ], [ 94.33984, 51.3513, -40.4908 ] ] - Array + String + - with + unitAimPositionVisual - Creates a With Type that is used inside a do construct in order to execute code inside a given namespace. - when used in a do-construct in scripts with allowed suspension, an unexpected namespace switch could happen (see note below) - NOTE for the reasons unknown, namespace switching might unexpectedly occur inside some scopes ( for, if, try, call ) started in scheduled scripts ( canSuspend true) after small suspension if with was not the main scope. For example: - $Code$[] spawn - { - with uiNamespace do - { - for "_i" from 1 to 1 do - { - systemChat str [ - currentNamespace isEqualTo uiNamespace, - currentNamespace isEqualTo missionNamespace - ]; - // result [true, false] - sleep 0.05; // -- small suspension - systemChat str [ - currentNamespace isEqualTo uiNamespace, - currentNamespace isEqualTo missionNamespace - ]; - // result [false, true] -- switching - }; - }; - };$/Code$ - However if with used in parent scope, everything works correctly: - $Code$ with uiNamespace do - { - [] spawn - { - for "_i" from 1 to 1 do - { - systemChat str [ - currentNamespace isEqualTo uiNamespace, - currentNamespace isEqualTo missionNamespace - ]; - // result [true, false] - sleep 0.05; // -- small suspension - systemChat str [ - currentNamespace isEqualTo uiNamespace, - currentNamespace isEqualTo missionNamespace - ]; - // result [true, false] -- NO switching - }; - }; - };$/Code$ - To eliminate possibility of error you can also use setVariable or getVariable with desired Namespace, which is also scheduled environment save. + Returns the position on the unit other units can aim at in render scope. See also aimPos, unitAimPosition. - https://community.bistudio.com/wiki/with + https://community.bistudio.com/wiki/unitAimPositionVisual - with Namespace + unitAimPositionVisual Object - with namespace + unitAimPositionVisual unit - $Code$_myWithType = with uiNamespace ;$/Code$ - - $Code$with missionNamespace do {global = global + 1};$/Code$ + $Code$unitAimPositionVisual player ;$/Code$ - undefined / undefined + global / undefined - With_Type + Array + - worldName + setPilotLight - Return the name of the currently loaded world. + Switches headlights of a vehicle on/off. Note that the vehicle has to be local, for global variant use Arma 3 Actions " LightOn "/" LightOff " - https://community.bistudio.com/wiki/worldName + https://community.bistudio.com/wiki/setPilotLight - worldName + Object setPilotLight Boolean - worldName + vehicle setPilotLight set - $Code$_name = worldName ;$/Code$ + $Code$car setPilotLight true ;$/Code$ - undefined / undefined + local / global - String + Nothing + - worldSize + missionVersion - Returns config size of the current world. + Returns the version of the current mission. + Mission from the 2D Editor : 12 + Mission from the Eden Editor : 15 and higher (for example current version for Eden Editor mission in Arma 3 v1.57 is 51) - https://community.bistudio.com/wiki/worldSize + https://community.bistudio.com/wiki/missionVersion - worldSize + missionVersion - worldSize + missionVersion - $Code$_size = worldSize ; //8192$/Code$ + $Code$_version = missionVersion ;$/Code$ undefined / undefined @@ -76200,33 +79223,96 @@ - Number + Number + - worldToModelVisual + customChat - Converts position from world space to object model space in render time scope. + Sends the chat message to the custom radio channel. The radio channel needs to be created on the server before hand, with radioChannelCreate command. - https://community.bistudio.com/wiki/worldToModelVisual + https://community.bistudio.com/wiki/customChat - Object worldToModelVisual Array + Object customChat Array - object worldToModelVisual worldPosition + unit customChat [channel, message] - $Code$_relPos = myObject worldToModelVisual [0,0,0];$/Code$ - - $Code$_relPos = player worldToModelVisual position car;$/Code$ - - $Code$_relPos = car worldToModelVisual [12000,5000];$/Code$ + $Code$_unit customChat [1, "Hi, I am a custom chat message"];$/Code$ - $Code$_relPos = unit worldToModelVisual position tank;$/Code$ + $Code$driver vehicle player sideChat "sideChat"; + driver vehicle player globalChat "globalChat"; + driver vehicle player groupChat "groupChat"; + vehicle player vehicleChat "vehicleChat"; + driver vehicle player commandChat "commandChat"; + driver vehicle player customChat [1, "customChat"]; + systemChat "systemChat";$/Code$ + + + global / local + + + + + Nothing + + + + + + removeTeamMember + + + Remove given member from given team. Effect is local, unless both member and team are local to PC on which command is executed, then effect is global. + + + https://community.bistudio.com/wiki/removeTeamMember + + + Team_Member removeTeamMember Team_Member + + + team removeTeamMember member + + + $Code$_team removeTeamMember _teamMember;$/Code$ + + + local / local + + + + + Nothing + + + + + + collapseObjectTree + + + Collapse the object tree. + i + Some Old Editor Command + + + https://community.bistudio.com/wiki/collapseObjectTree + + + collapseObjectTree Control + + + collapseObjectTree map + + + $Code$collapseObjectTree _map,$/Code$ undefined / undefined @@ -76234,31 +79320,30 @@ - Array + Nothing + - worldToModel + isMultiplayer - Converts position from world space to object model space. + Return true if multiPlayer. - https://community.bistudio.com/wiki/worldToModel + https://community.bistudio.com/wiki/isMultiplayer - Object worldToModel Array + isMultiplayer - model worldToModel position + isMultiplayer - $Code$_relPos = myObject worldToModel [0,0,0];$/Code$ - - $Code$_relPos = player worldToModel position car;$/Code$ - - $Code$_relPos = car worldToModel [12000,5000];$/Code$ + $Code$if (isMultiplayer) then { + //...block + }$/Code$ undefined / undefined @@ -76266,39 +79351,44 @@ - Array + Boolean + - worldToScreen + lbData - Converts position in world space into screen (UI) space. If a specified position is not within the current screen view, an empty array is returned. + Returns the additional text (invisible) in an item with the given index of the listbox or combobox with id idc of the topmost user dialog. - https://community.bistudio.com/wiki/worldToScreen + https://community.bistudio.com/wiki/lbData - worldToScreen Array + lbData Array + + Control lbData Number - worldToScreen position + lbData [idc, index] + + control lbData index - $Code$_screenPos = worldToScreen getPos soldier1;$/Code$ + $Code$_data = lbData [101, 0];$/Code$ - $Code$_screenPos = worldToScreen ( player modelToWorld [0,10,0]);$/Code$ + $Code$_data = _control lbData 0;$/Code$ - undefined / undefined + local / local - (august 19th, 2012) - please take safezones in consideration : the returned result can be out of the [0,0]..[1,1] range and can also be a filled array even if the position is not displayed on your monitor - this command thinks of triplescreens configurations as well. [] returned = not rendered + More information on the LB command family can be found here - Array + String - String + diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/SQFCommandCollector.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/SQFCommandCollector.java index fbd03015..23f1ff91 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/SQFCommandCollector.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/SQFCommandCollector.java @@ -72,27 +72,25 @@ public class SQFCommandCollector { * The character that is used in order to mark optional parameters */ public static final char OPTIONAL_MARKER = '?'; - + /** - * A set of essential commands that are forced to be included in the - * collection process + * A set of essential commands that are forced to be included in the collection + * process */ - public static final String[] ESSENTIAL_COMMANDS = { "if", "then", "else", - "while", "do", "for", "with", "switch", "from", "to", "step", - "count", "forEach" }; - + public static final String[] ESSENTIAL_COMMANDS = { "if", "then", "else", "while", "do", "for", "with", "switch", + "from", "to", "step", "count", "forEach" }; + /** - * A list of operators that are not retrieved by the normal command - * collection as they are listed in a different format + * A list of operators that are not retrieved by the normal command collection + * as they are listed in a different format */ - public static final String[] MANUAL_COMMANDS = { "!", "==", "!=", "<", "<=", - ">", ">=", "&&", "||", "+", "-", "*", "/", "^", "%", ">>", ":" }; - + public static final String[] MANUAL_COMMANDS = { "!", "==", "!=", "<", "<=", ">", ">=", "&&", "||", "+", "-", "*", + "/", "^", "%", ">>", ":" }; + /** * The corresponding command descriptions to {@link #MANUAL_COMMANDS} */ - public static final String[] MANUAL_COMMANDS_DESCRIPTION = { - "Negates the given Boolean value. Synonym for 'not'.", + public static final String[] MANUAL_COMMANDS_DESCRIPTION = { "Negates the given Boolean value. Synonym for 'not'.", "Check if one value is equal to another. Both values need to be of the same type.", "Returns whether one value is not equal to another. Both values have need be of the same type.", "Checks if the left number is smaller than the right one", @@ -116,79 +114,54 @@ public class SQFCommandCollector { "Returns the remainder of a corresponding division", "Returns subentry of config entry with given name. Identical to config/name.", "Helper construct used in a switch-construct" }; - + /** * The corresponding syntaxes to {@link #MANUAL_COMMANDS} */ - public static final String[][] MANUAL_COMMANDS_SYNTAX = { - { "! " + EDataType.BOOLEAN }, - { EDataType.ANYTHING + " == " + EDataType.ANYTHING }, - { EDataType.ANYTHING + " != " + EDataType.ANYTHING }, - { EDataType.NUMBER + " < " + EDataType.NUMBER }, - { EDataType.NUMBER + " <= " + EDataType.NUMBER }, - { EDataType.NUMBER + " > " + EDataType.NUMBER }, - { EDataType.NUMBER + " >= " + EDataType.NUMBER }, - { EDataType.BOOLEAN + " && " + EDataType.BOOLEAN - + DataTypeList.TYPE_SEPERATOR + EDataType.CODE }, - { EDataType.BOOLEAN + " || " + EDataType.BOOLEAN - + DataTypeList.TYPE_SEPERATOR + EDataType.CODE }, - { EDataType.NUMBER + " + " + EDataType.NUMBER, - EDataType.STRING + " + " + EDataType.STRING, - EDataType.ARRAY + " + " + EDataType.ARRAY, - "+ " + EDataType.NUMBER, "+ " + EDataType.ARRAY, + public static final String[][] MANUAL_COMMANDS_SYNTAX = { { "! " + EDataType.BOOLEAN }, + { EDataType.ANYTHING + " == " + EDataType.ANYTHING }, { EDataType.ANYTHING + " != " + EDataType.ANYTHING }, + { EDataType.NUMBER + " < " + EDataType.NUMBER }, { EDataType.NUMBER + " <= " + EDataType.NUMBER }, + { EDataType.NUMBER + " > " + EDataType.NUMBER }, { EDataType.NUMBER + " >= " + EDataType.NUMBER }, + { EDataType.BOOLEAN + " && " + EDataType.BOOLEAN + DataTypeList.TYPE_SEPERATOR + EDataType.CODE }, + { EDataType.BOOLEAN + " || " + EDataType.BOOLEAN + DataTypeList.TYPE_SEPERATOR + EDataType.CODE }, + { EDataType.NUMBER + " + " + EDataType.NUMBER, EDataType.STRING + " + " + EDataType.STRING, + EDataType.ARRAY + " + " + EDataType.ARRAY, "+ " + EDataType.NUMBER, "+ " + EDataType.ARRAY, "+ " + EDataType.STRING }, - { EDataType.NUMBER + " - " + EDataType.NUMBER, - EDataType.ARRAY + " - " + EDataType.ARRAY, + { EDataType.NUMBER + " - " + EDataType.NUMBER, EDataType.ARRAY + " - " + EDataType.ARRAY, "- " + EDataType.NUMBER }, { EDataType.NUMBER + " * " + EDataType.NUMBER }, - { EDataType.NUMBER + " / " + EDataType.NUMBER, - EDataType.CONFIG + " / " + EDataType.STRING }, - { EDataType.NUMBER + " ^ " + EDataType.NUMBER }, - { EDataType.NUMBER + " % " + EDataType.NUMBER }, - { EDataType.CONFIG + " >> " + EDataType.STRING }, - { EDataType.SWITCH_TYPE + " : " + EDataType.CODE } }; - + { EDataType.NUMBER + " / " + EDataType.NUMBER, EDataType.CONFIG + " / " + EDataType.STRING }, + { EDataType.NUMBER + " ^ " + EDataType.NUMBER }, { EDataType.NUMBER + " % " + EDataType.NUMBER }, + { EDataType.CONFIG + " >> " + EDataType.STRING }, { EDataType.SWITCH_TYPE + " : " + EDataType.CODE } }; + /** * The corresponding wiki page adresses for {@link #MANUAL_COMMANDS} */ - public static final String[] MANUAL_COMMANDS_WIKI = { - "https://community.bistudio.com/wiki/!_a", - "https://community.bistudio.com/wiki/a_%3D%3D_b", - "https://community.bistudio.com/wiki/a_!%3D_b", - "https://community.bistudio.com/wiki/a_less_b", - "https://community.bistudio.com/wiki/a_less%3D_b", - "https://community.bistudio.com/wiki/a_greater_b", - "https://community.bistudio.com/wiki/a_greater%3D_b", - "https://community.bistudio.com/wiki/a_%26%26_b", - "https://community.bistudio.com/wiki/a_or_b", - "https://community.bistudio.com/wiki/valuea_plus_valueb", - "https://community.bistudio.com/wiki/a_-_b", - "https://community.bistudio.com/wiki/a_*_b", - "https://community.bistudio.com/wiki/a_/_b", - "https://community.bistudio.com/wiki/a_%5E_b", - "https://community.bistudio.com/wiki/a_%25_b", + public static final String[] MANUAL_COMMANDS_WIKI = { "https://community.bistudio.com/wiki/!_a", + "https://community.bistudio.com/wiki/a_%3D%3D_b", "https://community.bistudio.com/wiki/a_!%3D_b", + "https://community.bistudio.com/wiki/a_less_b", "https://community.bistudio.com/wiki/a_less%3D_b", + "https://community.bistudio.com/wiki/a_greater_b", "https://community.bistudio.com/wiki/a_greater%3D_b", + "https://community.bistudio.com/wiki/a_%26%26_b", "https://community.bistudio.com/wiki/a_or_b", + "https://community.bistudio.com/wiki/valuea_plus_valueb", "https://community.bistudio.com/wiki/a_-_b", + "https://community.bistudio.com/wiki/a_*_b", "https://community.bistudio.com/wiki/a_/_b", + "https://community.bistudio.com/wiki/a_%5E_b", "https://community.bistudio.com/wiki/a_%25_b", "https://community.bistudio.com/wiki/config_greater_greater_name", "https://community.bistudio.com/wiki/a:b" }; - + /** * The corresponding return values to {@link #MANUAL_COMMANDS} */ - public static final String[][] MANUAL_COMMANDS_RETURN_TYPE = { - { EDataType.BOOLEAN.toString() }, { EDataType.BOOLEAN.toString() }, - { EDataType.BOOLEAN.toString() }, { EDataType.BOOLEAN.toString() }, + public static final String[][] MANUAL_COMMANDS_RETURN_TYPE = { { EDataType.BOOLEAN.toString() }, + { EDataType.BOOLEAN.toString() }, { EDataType.BOOLEAN.toString() }, { EDataType.BOOLEAN.toString() }, + { EDataType.BOOLEAN.toString() }, { EDataType.BOOLEAN.toString() }, { EDataType.BOOLEAN.toString() }, { EDataType.BOOLEAN.toString() }, { EDataType.BOOLEAN.toString() }, - { EDataType.BOOLEAN.toString() }, { EDataType.BOOLEAN.toString() }, - { EDataType.BOOLEAN.toString() }, - { EDataType.NUMBER.toString(), EDataType.STRING.toString(), - EDataType.ARRAY.toString(), EDataType.NUMBER.toString(), - EDataType.ARRAY.toString(), EDataType.STRING.toString() }, - { EDataType.NUMBER.toString(), EDataType.ARRAY.toString(), - EDataType.NUMBER.toString() }, - { EDataType.NUMBER.toString() }, - { EDataType.NUMBER.toString(), EDataType.CONFIG.toString() }, - { EDataType.NUMBER.toString() }, { EDataType.NUMBER.toString() }, - { EDataType.CONFIG.toString() }, { EDataType.NOTHING.toString() } }; - + { EDataType.NUMBER.toString(), EDataType.STRING.toString(), EDataType.ARRAY.toString(), + EDataType.NUMBER.toString(), EDataType.ARRAY.toString(), EDataType.STRING.toString() }, + { EDataType.NUMBER.toString(), EDataType.ARRAY.toString(), EDataType.NUMBER.toString() }, + { EDataType.NUMBER.toString() }, { EDataType.NUMBER.toString(), EDataType.CONFIG.toString() }, + { EDataType.NUMBER.toString() }, { EDataType.NUMBER.toString() }, { EDataType.CONFIG.toString() }, + { EDataType.NOTHING.toString() } }; + /** * The string represnetation of the webadress to the BIKI API */ @@ -197,12 +170,12 @@ public class SQFCommandCollector { * The name of the main page where all the commands are listed */ private final String mainPageName; - + /** * The list of processed Keywords */ private KeywordList list; - + /** * Creates an instance of this collector * @@ -214,17 +187,16 @@ public class SQFCommandCollector { public SQFCommandCollector(String apiAdress, String mainPageName) { Assert.isTrue(apiAdress != null && !apiAdress.isEmpty()); Assert.isTrue(mainPageName != null && !mainPageName.isEmpty()); - + this.apiAdress = apiAdress; this.mainPageName = mainPageName; } - + /** * Starts the collection of the SQF commands * * @param monitor - * The IProgressMonitor used to watch this - * collection + * The IProgressMonitor used to watch this collection * @param repeat * The URL to repeat. This is only if one command has failed and * should be repeated. If there is no such command this argument @@ -232,78 +204,71 @@ public SQFCommandCollector(String apiAdress, String mainPageName) { * @return The KeywordList conatining the gathered keywords * @throws SQDevCollectionException */ - public KeywordList collect(IProgressMonitor monitor, URL repeat) - throws SQDevCollectionException { + public KeywordList collect(IProgressMonitor monitor, URL repeat) throws SQDevCollectionException { monitor.subTask("Initializing"); - + SQFCommandPageProvider provider; try { provider = new SQFCommandPageProvider(apiAdress, mainPageName); } catch (IOException e1) { e1.printStackTrace(); - + // rethrow exception - throw new SQDevCollectionException(e1.getMessage(), null, - new KeywordList()); + throw new SQDevCollectionException(e1.getMessage(), null, new KeywordList()); } - + if (repeat != null) { provider.popBack(repeat); } - + // create keywordList list = new KeywordList(); - - monitor.beginTask("Gathering SQF commands", - provider.size() + MANUAL_COMMANDS.length); - + + monitor.beginTask("Gathering SQF commands", provider.size() + MANUAL_COMMANDS.length); + // Add a few operators manually for (int i = 0; i < MANUAL_COMMANDS.length; i++) { if (monitor.isCanceled()) { // if the job was cancelled return the current state of the list return list; } - + String currentCommand = MANUAL_COMMANDS[i]; String currentDescription = MANUAL_COMMANDS_DESCRIPTION[i]; - + monitor.subTask("Current Command: \"" + currentCommand + "\""); - - SQFCommand command = new SQFCommand(currentCommand, - currentDescription); - + + SQFCommand command = new SQFCommand(currentCommand, currentDescription); + for (int k = 0; k < MANUAL_COMMANDS_SYNTAX[i].length; k++) { String currentSyntax = MANUAL_COMMANDS_SYNTAX[i][k]; - DataTypeList returnTypes = DataTypeList - .fillWith(MANUAL_COMMANDS_RETURN_TYPE[i][k]); + DataTypeList returnTypes = DataTypeList.fillWith(MANUAL_COMMANDS_RETURN_TYPE[i][k]); try { - Syntax syntax = Syntax.parseSyntax(currentSyntax, - currentCommand); - + Syntax syntax = Syntax.parseSyntax(currentSyntax, currentCommand); + command.addSyntax(syntax); - + command.setReturnType(syntax, returnTypes); } catch (BadSyntaxException e) { - throw new SQDevCollectionException(e.getMessage(), null, - list); + throw new SQDevCollectionException(e.getMessage(), null, list); } } - + try { String url = MANUAL_COMMANDS_WIKI[i]; - + if (!url.isEmpty()) { command.setWikiPage(new URL(url)); } } catch (MalformedURLException e) { throw new SQDevCollectionException(e.getMessage(), null, list); } - + list.addKeyword(command); - + monitor.worked(1); } - + int size = provider.size(); // go through each link and gather respective information for (int i = 0; i < size; i++) { @@ -311,85 +276,89 @@ public KeywordList collect(IProgressMonitor monitor, URL repeat) // if the job was cancelled return the current state of the list return list; } - + URL currentCommandURL = provider.next(); - + // get the name of the current command String strURL = currentCommandURL.toString(); String name = strURL.substring(strURL.lastIndexOf("/") + 1).trim(); - - // display which cammand currently is processed + + // display which command currently is processed monitor.subTask("Current Command: \"" + name + "\""); - - SQFCommand command = processCommand(new SQFCommand(name), - currentCommandURL); - + + SQFCommand command = processCommand(new SQFCommand(name), currentCommandURL); + if (command != null) { list.addKeyword(command); } - + monitor.worked(1); } - + return list; } - + /** - * Gets the trimmed content of the specified site + * Gets the content of the specified site * * @param url * The URL to the site + * @param removeHTMLTags + * Whether all HTML tags should get removed * @return The site's content as a String * @throws SQDevCollectionException */ - public static String getSite(URL url) throws IOException { + public static String getSite(URL url, boolean removeHTMLTags) throws IOException { // read the site's content InputStream in = url.openStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(); - + byte[] bArray = new byte[in.available()]; - + in.read(bArray); - + out.write(bArray); - + int next; while ((next = in.read()) > 0) { out.write((char) next); } - + String content = out.toString(); - + // replace html escape characters Pattern escapePattern = Pattern.compile("&#[0-9]+;"); Matcher matcher = escapePattern.matcher(content); - + while (matcher.find()) { int pos1 = matcher.start(); int pos2 = matcher.end(); - + String prefix = content.substring(0, pos1); String fragment = content.substring(pos1, pos2); - char escapeCharacter = (char) Integer - .parseInt(fragment.substring(2, fragment.length() - 1)); + char escapeCharacter = (char) Integer.parseInt(fragment.substring(2, fragment.length() - 1)); String postfix = content.substring(pos2); - + if (escapeCharacter == (char) 160) { // replace non-breaking spaces with normal ones escapeCharacter = ' '; } - + content = prefix + escapeCharacter + postfix; - + matcher = escapePattern.matcher(content); } - + + if (removeHTMLTags) { + content = content.replaceAll("<.*?>", ""); + } + return content.replace(""", "\"").replace("&", "&"); } - + /** - * Will process the given commandPage and feed the gathered information into - * the given SQFCommand + * Will process the given commandPage and feed the gathered information into the + * given SQFCommand * * @param command * The command the gathered information should be associated with @@ -398,88 +367,82 @@ public static String getSite(URL url) throws IOException { * @return The command filled with information or null * @throws SQDevCollectionException */ - private SQFCommand processCommand(SQFCommand command, URL commandPage) - throws SQDevCollectionException { + private SQFCommand processCommand(SQFCommand command, URL commandPage) throws SQDevCollectionException { // get site content String siteContent; try { - siteContent = formatCommandPageContent(getSite(commandPage)); + siteContent = formatCommandPageContent(getSite(commandPage, false)); } catch (IOException e) { // rethrow throw new SQDevCollectionException(e, commandPage, list); } - + String[] categories = categorizeContent(siteContent); - + if (!commandPage.toString().endsWith(command.getKeyword()) - || !categories[CATEGORY_SYNTAX].toLowerCase() - .contains(command.getKeyword().toLowerCase())) { + || !categories[CATEGORY_SYNTAX].toLowerCase().contains(command.getKeyword().toLowerCase())) { // The current command should be integrated in the previous command // with this name or stripped out TODO return null; } - + // store information try { // commandInfo String commandInfo = categories[CATEGORY_COMMAND_INFO]; applyCommandInfo(command, commandInfo); - + // wikiPage command.setWikiPage(commandPage); - + // description String description = categories[CATEGORY_DESCRIPTION]; if (description.startsWith("Description:\n")) { // remove that unnecessary line - description = description - .substring(description.indexOf("\n") + 1); + description = description.substring(description.indexOf("\n") + 1); } - + if (!description.isEmpty()) { command.setDescription(description); } - + // syntax String syntax = categories[CATEGORY_SYNTAX]; - + if (!syntax.isEmpty()) { if (command.getKeyword().toLowerCase().equals("private")) { // exception for private as a keyword - syntax = syntax.substring(0, syntax.toLowerCase() - .lastIndexOf("alternative syntax")); + syntax = syntax.substring(0, syntax.toLowerCase().lastIndexOf("alternative syntax")); } - + applySyntax(command, syntax); } else { throw new SQDevCollectionException( - "The command \"" + command.getKeyword() - + "\" does not specify a syntax!", - commandPage, list); + "The command \"" + command.getKeyword() + "\" does not specify a syntax!", commandPage, list); } - + // examples String examples = categories[CATEGORY_EXAMPLES]; - + if (!examples.isEmpty()) { applyExamples(command, examples); } - + // Notes String notes = categories[CATEGORY_NOTES]; - + if (!notes.isEmpty()) { applyNotes(command, notes); } } catch (SQDevException e) { e.printStackTrace(); - + throw new SQDevCollectionException(e, commandPage, list); } - + return command; } - + /** * Extracts the relevant parts and formats the content of a commandPage * @@ -489,174 +452,158 @@ private SQFCommand processCommand(SQFCommand command, URL commandPage) */ private String formatCommandPageContent(String content) { String[] tagsToRemove = { "script", "style", "header", "head" }; - + for (String currentTag : tagsToRemove) { // remove tags - boolean proceed = content.contains("<" + currentTag) - && content.contains(""); - + boolean proceed = content.contains("<" + currentTag) && content.contains(""); + while (proceed) { - String fragment1 = content.substring(0, - content.indexOf("<" + currentTag)); - String fragment2 = content - .substring(content.indexOf("<" + currentTag)); + String fragment1 = content.substring(0, content.indexOf("<" + currentTag)); + String fragment2 = content.substring(content.indexOf("<" + currentTag)); String fragment3 = fragment2 - .substring(fragment2.indexOf("") - + 3 + currentTag.length()); - + .substring(fragment2.indexOf("") + 3 + currentTag.length()); + content = fragment1 + fragment3; - - proceed = content.contains("<" + currentTag) - && content.contains(""); + + proceed = content.contains("<" + currentTag) && content.contains(""); } } - + if (content.contains("

")) { // if there are notes attached make sure that every note has a date // attached (even an empty one) - - String fragment1 = content - .substring(0, content.indexOf("
")) - .trim(); - String fragment2 = content - .substring(content.indexOf("
")).trim(); - + + String fragment1 = content.substring(0, content.indexOf("
")).trim(); + String fragment2 = content.substring(content.indexOf("
")).trim(); + boolean proceed = true; - + while (proceed) { // add the necessary "Posted on" - if (!fragment1.substring(fragment1.lastIndexOf("\n")) - .contains("
Posted on")) { - fragment1 = fragment1 - + "\n
Posted on\n"; + if (!fragment1.substring(fragment1.lastIndexOf("\n")).contains("
Posted on")) { + fragment1 = fragment1 + "\n
Posted on\n"; } - + // check if there are futher notes - proceed = fragment2.substring(fragment2.indexOf("\n")) - .contains("
"); - + proceed = fragment2.substring(fragment2.indexOf("\n")).contains("
"); + if (proceed) { // reassemble fragments to process further notes - String previousNoteLine = fragment2.substring(0, - fragment2.indexOf("\n")); - String helper = fragment2 - .substring(previousNoteLine.length()); - String fragment3 = helper.substring(0, - helper.indexOf("
")); - - fragment1 += "\n" + previousNoteLine + "\n" - + fragment3.trim(); + String previousNoteLine = fragment2.substring(0, fragment2.indexOf("\n")); + String helper = fragment2.substring(previousNoteLine.length()); + String fragment3 = helper.substring(0, helper.indexOf("
")); + + fragment1 += "\n" + previousNoteLine + "\n" + fragment3.trim(); fragment1 = fragment1.trim(); - - fragment2 = fragment2.substring( - previousNoteLine.length() + fragment3.length()); + + fragment2 = fragment2.substring(previousNoteLine.length() + fragment3.length()); fragment2 = fragment2.trim(); } else { // reset content content = fragment1 + "\n" + fragment2; } } - + // make sure that the user name stands in it's own line - content = content.replace("
", - "\n
"); + content = content.replace("
", "\n
"); } - + // mark parameter content = content.replace("
", "\nparam:\n"); - + // keep code markdown content = content.replace("", " " + SQDev.CODE.getOpener()); content = content.replace("", SQDev.CODE.getCloser() + " "); - - String commandInfoLine = content - .substring(content.indexOf("
")); - commandInfoLine = commandInfoLine.substring(0, - commandInfoLine.indexOf("\n")); - + + String commandInfoLine = content.substring(content.indexOf("
")); + commandInfoLine = commandInfoLine.substring(0, commandInfoLine.indexOf("\n")); + + // remove command info(s) from page as it sometimes appears in inappropriate + // positions + content = content.replaceAll("
"); while (proceed) { String fragment1 = content.substring(0, content.indexOf("<")); String fragment2 = content.substring(content.indexOf("<")); String fragment3 = fragment2.substring(fragment2.indexOf(">") + 1); - + content = fragment1 + " " + fragment3; - + proceed = content.contains("<") && content.contains(">"); } - + // remove tabs while (content.contains("\t")) { content = content.replace("\t", ""); } - + while (content.contains("\n ")) { content = content.replace("\n ", "\n"); } - + // reduce lineBreaks while (content.contains("\n\n")) { content = content.replace("\n\n", "\n"); } - + // remove all unnecessary HTML escape stuff content = content.replaceAll("&[^;\\s]*;", " "); - + while (content.contains(" ")) { content = content.replace(" ", " "); } - + while (content.contains(" .")) { content = content.replace(" .", "."); } - + content = content.trim(); - + // add information about the command String commandInfo = ""; - + if (commandInfoLine.contains("arguments_local.gif")) { commandInfo += "Arguments: " + ELocality.LOCAL + "\n"; } - + if (commandInfoLine.contains("arguments_global.gif")) { commandInfo += "Arguments: " + ELocality.GLOBAL + "\n"; } - + if (commandInfoLine.contains("effects_local.gif")) { commandInfo += "Effects: " + ELocality.LOCAL + "\n"; } - + if (commandInfoLine.contains("effects_global.gif")) { commandInfo += "Effects: " + ELocality.GLOBAL + "\n"; } - + if (commandInfoLine.contains("Exec_Server.gif")) { commandInfo += "ServerExecution: true"; } else { commandInfo += "ServerExecution: false"; } - + // add the gathered information to the content if (!commandInfo.isEmpty()) { - content = "#CommandInfo\n" + commandInfo.trim() - + "\n#EndCommandInfo\n\n" + content; + content = "#CommandInfo\n" + commandInfo.trim() + "\n#EndCommandInfo\n\n" + content; } - + // make sure that commas are set properly while (content.contains(" ,")) { content = content.replace(" ,", ","); } - + // make sure points are set properly while (content.contains(" .")) { content = content.replace(" .", "."); } - + return content; } - + /** * This will categorize the formatted content of a commandPage * @@ -666,99 +613,92 @@ private String formatCommandPageContent(String content) { */ private String[] categorizeContent(String content) { String[] categories = new String[5]; - + String commandInfo = "\n"; String description = "\n"; String syntax = "\n"; String examples = "\n"; String notes = "\n"; - + // add the command infos - commandInfo += content.substring(content.indexOf("\n") + 1, - content.indexOf("#EndCommandInfo") - 1); - - content = content.substring(content.indexOf("#EndCommandInfo") + 15) - .trim(); - + commandInfo += content.substring(content.indexOf("\n") + 1, content.indexOf("#EndCommandInfo") - 1); + + content = content.substring(content.indexOf("#EndCommandInfo") + 15).trim(); + // add the name of the command - commandInfo = "Name: " + content.substring(0, content.indexOf("\n")) - .trim().replace(" ", "_") + "\n" + commandInfo; - + commandInfo = "Name: " + content.substring(0, content.indexOf("\n")).trim().replace(" ", "_") + "\n" + + commandInfo; + content = content.substring(content.indexOf("\n") + 1); - + String currentCategory = ""; - + // categorize the content for (String currentLine : content.split("\n")) { currentLine = currentLine.trim(); - + if (currentLine.startsWith("Only post proven facts here.")) { // skip this line continue; } - + // check for a change of categories switch (currentLine) { - case "Description": - case "Syntax": - case "Examples": - case "Notes": - currentCategory = currentLine; - break; - case "Additional Information": - case "Bottom Section": - currentCategory = ""; - break; + case "Description": + case "Syntax": + case "Examples": + case "Notes": + currentCategory = currentLine; + break; + case "Additional Information": + case "Bottom Section": + currentCategory = ""; + break; } - + if (currentCategory.isEmpty() && currentLine.startsWith("Posted")) { currentCategory = "Notes"; } else { if (!currentCategory.isEmpty() - && (currentLine.startsWith("Categories") - || currentLine.startsWith("Retrieved from"))) { + && (currentLine.startsWith("Categories") || currentLine.startsWith("Retrieved from"))) { currentCategory = ""; } } - + // add line to respective category switch (currentCategory) { - case "Description": - if (!currentLine.equals(currentCategory)) { - description += currentLine + "\n"; - } - break; - case "Syntax": - if (!currentLine.equals(currentCategory)) { - syntax += currentLine + "\n"; - } - break; - case "Examples": - if (!currentLine.equals(currentCategory)) { - examples += currentLine + "\n"; - } - break; - case "Notes": - if (!currentLine.equals(currentCategory)) { - notes += currentLine + "\n"; - } - break; + case "Description": + if (!currentLine.equals(currentCategory)) { + description += currentLine + "\n"; + } + break; + case "Syntax": + if (!currentLine.equals(currentCategory)) { + syntax += currentLine + "\n"; + } + break; + case "Examples": + if (!currentLine.equals(currentCategory)) { + examples += currentLine + "\n"; + } + break; + case "Notes": + if (!currentLine.equals(currentCategory)) { + notes += currentLine + "\n"; + } + break; } } - + categories[CATEGORY_COMMAND_INFO] = commandInfo; - categories[CATEGORY_DESCRIPTION] = description - .substring(description.indexOf("\n")).trim(); - categories[CATEGORY_SYNTAX] = syntax.substring(syntax.indexOf("\n")) - .trim(); - categories[CATEGORY_EXAMPLES] = examples - .substring(examples.indexOf("\n")).trim(); - categories[CATEGORY_NOTES] = notes.substring(notes.indexOf("\n")) - .trim(); - + categories[CATEGORY_DESCRIPTION] = description.substring(description.indexOf("\n")).trim(); + categories[CATEGORY_SYNTAX] = syntax.substring(syntax.indexOf("\n")).trim(); + categories[CATEGORY_EXAMPLES] = examples.substring(examples.indexOf("\n")).trim(); + categories[CATEGORY_NOTES] = notes.substring(notes.indexOf("\n")).trim(); + return categories; } - + /** * Applies the given commandInfo to the given command * @@ -768,101 +708,88 @@ private String[] categorizeContent(String content) { * The info to add up * @throws SQDevException */ - private void applyCommandInfo(SQFCommand command, String info) - throws SQDevException { - String name = info - .substring(info.indexOf("Name:") + 5, info.indexOf("\n")) - .trim(); - + private void applyCommandInfo(SQFCommand command, String info) throws SQDevException { + String name = info.substring(info.indexOf("Name:") + 5, info.indexOf("\n")).trim(); + if (!name.toLowerCase().equals(command.getKeyword().toLowerCase())) { - throw new SQDevException( - "The given commandInfo does not specify the same name (\"" - + name + "\") as the SQFCommand object (\"" - + command.getKeyword() + "\")!"); + throw new SQDevException("The given commandInfo does not specify the same name (\"" + name + + "\") as the SQFCommand object (\"" + command.getKeyword() + "\")!"); } - + // remove processed line info = info.substring(info.indexOf("\n") + 1); - + for (String currentLine : info.split("\n")) { currentLine = currentLine.trim(); - + if (currentLine.startsWith("Arguments:")) { // store argument's locality String argumentsLocality = currentLine.substring(10).trim(); - - command.setArgumentLocality( - ELocality.resolve(argumentsLocality)); + + command.setArgumentLocality(ELocality.resolve(argumentsLocality)); } else { if (currentLine.startsWith("Effects:")) { // store effects locality String effectsLocality = currentLine.substring(8).trim(); - - command.setEffectLocality( - ELocality.resolve(effectsLocality)); + + command.setEffectLocality(ELocality.resolve(effectsLocality)); } else { if (currentLine.equals("ServerExecution: true")) { // add a note when a server execution is necessary - command.addNote( - "This scripting command must be executed on the server" - + " to work properly in multiplayer"); + command.addNote("This scripting command must be executed on the server" + + " to work properly in multiplayer"); } } } } } - + /** * Adds the given examples to the given SQFCommand * * @param command * The command theexamples should get added to * @param examples - * The String containing the examples indexed by "Example 1:" and - * so on + * The String containing the examples indexed by "Example 1:" and so + * on */ private void applyExamples(SQFCommand command, String examples) { boolean proceed = true; int counter = 1; - + if (examples.contains("Example needed")) { return; } - + examples = examples.trim(); - + while (proceed) { String exampleNum = "Example " + counter + ":"; - + if (examples.startsWith(exampleNum)) { // if there is an example with this number - examples = examples.substring( - examples.indexOf(exampleNum) + exampleNum.length()) - .trim(); - + examples = examples.substring(examples.indexOf(exampleNum) + exampleNum.length()).trim(); + counter++; - + String nextExampleNum = "Example " + counter + ":"; - + if (examples.contains(nextExampleNum)) { // only take the content until next example starts - String currentExample = examples - .substring(0, examples.indexOf(nextExampleNum)) - .trim(); - + String currentExample = examples.substring(0, examples.indexOf(nextExampleNum)).trim(); + command.addExample(currentExample); - + // remove processed examples from the examples String - examples = examples.substring(currentExample.length()) - .trim(); - + examples = examples.substring(currentExample.length()).trim(); + proceed = !examples.isEmpty(); } else { // the complete content belongs to the current example if (!examples.isEmpty()) { command.addExample(examples); } - + proceed = false; } } else { @@ -870,7 +797,7 @@ private void applyExamples(SQFCommand command, String examples) { } } } - + /** * Applies the given notes to the given command * @@ -880,38 +807,36 @@ private void applyExamples(SQFCommand command, String examples) { * The notes to apply * @throws SQDevException */ - private void applyNotes(SQFCommand command, String notes) - throws SQDevException { + private void applyNotes(SQFCommand command, String notes) throws SQDevException { String currentNote = ""; boolean skippedName = false; - + if (!notes.contains("Posted on")) { - throw new SQDevException("The notes of " + command.getKeyword() - + "are not in the proper format!"); + throw new SQDevException("The notes of " + command.getKeyword() + "are not in the proper format!"); } - + for (String currentLine : notes.split("\n")) { if (currentLine.startsWith("Posted on")) { if (!currentNote.isEmpty()) { // add the previous note to the command command.addNote(currentNote.trim()); - + // reset currentNote currentNote = ""; } - + // a new note is beginning -> start with post date String date = currentLine.substring(9).trim(); - + if (date.contains("-")) { // don't store time date = date.substring(0, date.indexOf("-")).trim(); } - + if (!date.isEmpty()) { currentNote += "(" + date + ")\n"; } - + // indicate that the name has not yet been skipped skippedName = false; } else { @@ -924,15 +849,15 @@ private void applyNotes(SQFCommand command, String notes) } } } - + if (!currentNote.isEmpty()) { command.addNote(currentNote); } } - + /** - * Applies the given syntax to the given command after having brought it - * into the proper format + * Applies the given syntax to the given command after having brought it into + * the proper format * * @param command * The command the notes should be applied to @@ -941,153 +866,132 @@ private void applyNotes(SQFCommand command, String notes) * command * @throws SQDevException */ - private void applySyntax(SQFCommand command, String syntaxContent) - throws SQDevException { - + private void applySyntax(SQFCommand command, String syntaxContent) throws SQDevException { + String[][] syntaxes = splitSyntaxes(syntaxContent, command); - + for (String[] currentSyntax : syntaxes) { String syntax = currentSyntax[SYNTAXPART_SYNTAX]; - + // add the raw syntax to the command command.addRawSyntax(syntax); - + Pattern arrayPattern = Pattern.compile("\\[[^\\[\\]]*\\]"); Matcher arrayMatcher = arrayPattern.matcher(syntax); - + // replace all array constructs with Array type keyword while (arrayMatcher.find()) { syntax = arrayMatcher.replaceAll(EDataType.ARRAY.toString()); - + arrayMatcher = arrayPattern.matcher(syntax); } - - syntax = processSyntax(syntax, currentSyntax[SYNTAXPART_PARAMETERS], - command); - - DataTypeList returnTypes = DataTypeList - .fillWith(currentSyntax[SYNTAXPART_RETURN_VALUE]); - + + syntax = processSyntax(syntax, currentSyntax[SYNTAXPART_PARAMETERS], command); + + DataTypeList returnTypes = DataTypeList.fillWith(currentSyntax[SYNTAXPART_RETURN_VALUE]); + try { if (syntax.contains(String.valueOf(OPTIONAL_MARKER))) { // create own syntaxes for each optional parameter String[] areas = TextUtils.getTextAreas(syntax); int commandIndex = -1; - + List possibleLeadingArgCombinations = new ArrayList(); List possibleTrailingArgCombinations = new ArrayList(); - + for (int i = 0; i < areas.length; i++) { String currentArea = areas[i]; - - if (currentArea.toLowerCase() - .equals(command.getKeyword().toLowerCase())) { + + if (currentArea.toLowerCase().equals(command.getKeyword().toLowerCase())) { commandIndex = i; continue; } - - if (currentArea - .endsWith(String.valueOf(OPTIONAL_MARKER))) { + + if (currentArea.endsWith(String.valueOf(OPTIONAL_MARKER))) { if (commandIndex < 0) { // optional arg before command StringBuilder builder = new StringBuilder(); - + for (int j = 0; j < i; j++) { // assemble parameter combi - builder.append(areas[j].replace( - String.valueOf(OPTIONAL_MARKER), "") - + " "); + builder.append(areas[j].replace(String.valueOf(OPTIONAL_MARKER), "") + " "); } - - possibleLeadingArgCombinations - .add(builder.toString().trim()); + + possibleLeadingArgCombinations.add(builder.toString().trim()); } else { // optional arg after command StringBuilder builder = new StringBuilder(); - + for (int j = commandIndex + 1; j <= i; j++) { // assemble parameter combi - builder.append(areas[j].replace( - String.valueOf(OPTIONAL_MARKER), "") - + " "); + builder.append(areas[j].replace(String.valueOf(OPTIONAL_MARKER), "") + " "); } - - possibleTrailingArgCombinations - .add(builder.toString().trim()); + + possibleTrailingArgCombinations.add(builder.toString().trim()); } } } - + // make sure the loops below iterates at least once if (possibleLeadingArgCombinations.size() == 0) { // In case there are only non-optional leading params StringBuilder builder = new StringBuilder(); - + for (int i = 0; i < commandIndex; i++) { builder.append(areas[i] + " "); } - - possibleLeadingArgCombinations - .add(builder.toString().trim()); + + possibleLeadingArgCombinations.add(builder.toString().trim()); } if (possibleTrailingArgCombinations.size() == 0) { // In case there are only non-optional trailing params StringBuilder builder = new StringBuilder(); - + for (int i = commandIndex + 1; i < areas.length; i++) { builder.append(areas[i] + " "); } - - possibleTrailingArgCombinations - .add(builder.toString().trim()); + + possibleTrailingArgCombinations.add(builder.toString().trim()); } - - //TODO: optional args don't process properly... See addMenu - + + // TODO: optional args don't process properly... See addMenu + // add all possible syntax variants for (String currentLeadingCombination : possibleLeadingArgCombinations) { for (String currentTrailingCombination : possibleTrailingArgCombinations) { - Syntax parsedSyntax = Syntax.parseSyntax( - currentLeadingCombination + " " - + command.getKeyword() + " " - + currentTrailingCombination, - command.getKeyword()); - + Syntax parsedSyntax = Syntax.parseSyntax(currentLeadingCombination + " " + + command.getKeyword() + " " + currentTrailingCombination, command.getKeyword()); + command.addSyntax(parsedSyntax); - + command.setReturnType(parsedSyntax, returnTypes); } } - - if (possibleLeadingArgCombinations.size() - + possibleTrailingArgCombinations.size() != 0) { + + if (possibleLeadingArgCombinations.size() + possibleTrailingArgCombinations.size() != 0) { // add complete syntax - Syntax parsedSyntax = Syntax.parseSyntax(syntax - .replace(String.valueOf(OPTIONAL_MARKER), ""), + Syntax parsedSyntax = Syntax.parseSyntax(syntax.replace(String.valueOf(OPTIONAL_MARKER), ""), command.getKeyword()); - + command.addSyntax(parsedSyntax); - + command.setReturnType(parsedSyntax, returnTypes); } } else { - Syntax parsedSyntax = Syntax.parseSyntax(syntax, - command.getKeyword()); - + Syntax parsedSyntax = Syntax.parseSyntax(syntax, command.getKeyword()); + command.addSyntax(parsedSyntax); - + command.setReturnType(parsedSyntax, returnTypes); } } catch (BadSyntaxException e) { - throw new SQDevException( - "Failed at parsing syntax for command \"" - + command.getKeyword() + "\""); + throw new SQDevException("Failed at parsing syntax for command \"" + command.getKeyword() + "\""); } } - + System.out.println(command.getSyntaxes()); } - + /** * Replaces the parameters in the syntax with the actual data types * @@ -1100,45 +1004,40 @@ private void applySyntax(SQFCommand command, String syntaxContent) * @return The processed syntax with data types instead of placeholders * @throws SQDevException */ - private String processSyntax(String syntax, String parameter, - SQFElement element) throws SQDevException { + private String processSyntax(String syntax, String parameter, SQFElement element) throws SQDevException { for (String currentParameter : parameter.split("param:\n")) { // process each listed parameter currentParameter = currentParameter.trim(); - + if (currentParameter.isEmpty()) { continue; } - + // make a copy in order to avoid case sensitive problems String syntaxCopy = syntax.toLowerCase(); - + String[] elements = TextUtils.getTextAreas(currentParameter); - + // make sure parameter are in proper format if (!elements[0].contains(":") || elements.length == 1) { - if (elements.length > 2 && (elements[1].equals(":") - || elements[1].equals("-"))) { + if (elements.length > 2 && (elements[1].equals(":") || elements[1].equals("-"))) { // add needed colon elements[0] = elements[0] + ":"; // Move parameter data type elements[1] = elements[2]; } else { - throw new SQDevException( - "Unexpected parameter format - missing\":\" at " - + elements[0]); + throw new SQDevException("Unexpected parameter format - missing\":\" at " + elements[0]); } } - - String parameterName = elements[0] - .substring(0, elements[0].indexOf(":")).toLowerCase(); - + + String parameterName = elements[0].substring(0, elements[0].indexOf(":")).toLowerCase(); + // remove dots from dataType String value = elements[1].replace(".", ""); - + String[] syntaxElements = TextUtils.getTextAreas(syntax); String[] syntaxCopyElements = TextUtils.getTextAreas(syntaxCopy); - + for (int i = 0; i < syntaxCopyElements.length; i++) { if (syntaxCopyElements[i].equals(parameterName)) { // replace placeholder with actual value @@ -1147,20 +1046,20 @@ private String processSyntax(String syntax, String parameter, break; } } - + // convert syntax back to String StringBuilder builder = new StringBuilder(); - + for (String currentElement : syntaxElements) { builder.append(" " + currentElement); } - + syntax = builder.toString().trim(); } - + return syntax; } - + /** * Brings the given syntaxContent into the proper format * @@ -1170,143 +1069,117 @@ private String processSyntax(String syntax, String parameter, */ private String formatSyntaxContent(String syntaxContent) { syntaxContent = syntaxContent.trim(); - + while (Character.isDigit(syntaxContent.charAt(0))) { syntaxContent = syntaxContent.substring(1).trim(); } - + // check for return value if (!syntaxContent.contains("Return Value:")) { // add a Nothing-return value syntaxContent += " Return Value: Nothing"; } else { // make sure that a return value is specified - if (syntaxContent.substring(syntaxContent.indexOf("Return Value:")) - .trim().isEmpty()) { + if (syntaxContent.substring(syntaxContent.indexOf("Return Value:")).trim().isEmpty()) { syntaxContent += " Nothing"; } } - + if (syntaxContent.startsWith("Syntax:")) { // make the syntax start directly without prefix "Syntax:" syntaxContent = syntaxContent.substring(7).trim(); } - + if (syntaxContent.contains("Parameters:")) { // remove unnecessary statement - syntaxContent = syntaxContent.substring(0, - syntaxContent.indexOf("Parameters:")) + "\n" - + syntaxContent.substring( - syntaxContent.indexOf("Parameters:") + 11); + syntaxContent = syntaxContent.substring(0, syntaxContent.indexOf("Parameters:")) + "\n" + + syntaxContent.substring(syntaxContent.indexOf("Parameters:") + 11); } - + // make each syntax part stand in it's own line - - syntaxContent = syntaxContent.substring(0, - syntaxContent.indexOf("Return Value:")) + "\n" - + syntaxContent - .substring(syntaxContent.indexOf("Return Value:")); - - syntaxContent = syntaxContent - .substring(0, syntaxContent.indexOf("Return Value:") + 13) - .trim() - + " " - + syntaxContent - .substring(syntaxContent.indexOf("Return Value:") + 13) - .trim(); - - String syntaxLine = syntaxContent.substring(0, - syntaxContent.indexOf("\n")); - + + syntaxContent = syntaxContent.substring(0, syntaxContent.indexOf("Return Value:")) + "\n" + + syntaxContent.substring(syntaxContent.indexOf("Return Value:")); + + syntaxContent = syntaxContent.substring(0, syntaxContent.indexOf("Return Value:") + 13).trim() + " " + + syntaxContent.substring(syntaxContent.indexOf("Return Value:") + 13).trim(); + + String syntaxLine = syntaxContent.substring(0, syntaxContent.indexOf("\n")); + if (syntaxLine.contains("=")) { // remove asignments from syntax - syntaxLine = syntaxLine.substring(syntaxLine.indexOf("=") + 1) - .trim(); + syntaxLine = syntaxLine.substring(syntaxLine.indexOf("=") + 1).trim(); } - + // remove version tags that are not necessarily between brackets - syntaxLine = syntaxLine.replaceAll("[sS]ince [aA]rm[aA][^)]*", ""); - - return syntaxLine - + syntaxContent.substring(syntaxContent.indexOf("\n")); + syntaxLine = syntaxLine.replaceAll("[sS]ince [aA]rm[aA][^)]*", "").replaceAll("[(][^)]*\\z", ""); + + return syntaxLine + syntaxContent.substring(syntaxContent.indexOf("\n")); } - + /** - * Splits the given syntax(es) and return them in an array (everything - * properly formatted) + * Splits the given syntax(es) and return them in an array (everything properly + * formatted) * * @param syntaxContent * The syntaxes with the respective information * @param The * SQFElement the syntaxes belong to * @return A two-dimensional array where the first dimension stands for - * different syntaxes (alternatives syntaxes) and the second - * dimension is as following: + * different syntaxes (alternatives syntaxes) and the second dimension + * is as following: *
  • index 0: The raw syntax
  • - *
  • index 1: The parameters (each prefixed by "param:\n") with - * their description
  • + *
  • index 1: The parameters (each prefixed by "param:\n") with their + * description
  • *
  • index 2: The return value
  • * @throws SQDevException */ - private String[][] splitSyntaxes(String syntaxContent, SQFElement element) - throws SQDevException { + private String[][] splitSyntaxes(String syntaxContent, SQFElement element) throws SQDevException { // split the syntaxes and their components - ArrayList> syntaxes = new ArrayList>( - 1); - - for (String currentSyntaxContent : syntaxContent - .split("Alternative Syntax")) { + ArrayList> syntaxes = new ArrayList>(1); + + for (String currentSyntaxContent : syntaxContent.split("Alternative Syntax")) { // format the content currentSyntaxContent = formatSyntaxContent(currentSyntaxContent); - - ArrayList currentSyntaxComponents = new ArrayList( - 3); - + + ArrayList currentSyntaxComponents = new ArrayList(3); + // get the syntax - String currentSyntax = currentSyntaxContent.substring(0, - currentSyntaxContent.indexOf("\n")); - + String currentSyntax = currentSyntaxContent.substring(0, currentSyntaxContent.indexOf("\n")); + // trim syntaxContent to remove processed line - currentSyntaxContent = currentSyntaxContent - .substring(currentSyntax.length()).trim(); - + currentSyntaxContent = currentSyntaxContent.substring(currentSyntax.length()).trim(); + // get the parameters - String currentParameter = currentSyntaxContent.substring(0, - currentSyntaxContent.indexOf("Return Value:")); - + String currentParameter = currentSyntaxContent.substring(0, currentSyntaxContent.indexOf("Return Value:")); + // trim syntaxContent to remove processed line - currentSyntaxContent = currentSyntaxContent - .substring(currentParameter.length()).trim(); - + currentSyntaxContent = currentSyntaxContent.substring(currentParameter.length()).trim(); + currentSyntaxContent += "\n"; - - String currentReturnValue = currentSyntaxContent.substring( - currentSyntaxContent.indexOf("Return Value:") + 13); - currentReturnValue = currentReturnValue.substring(0, - currentReturnValue.indexOf("\n")); - + + String currentReturnValue = currentSyntaxContent + .substring(currentSyntaxContent.indexOf("Return Value:") + 13); + currentReturnValue = currentReturnValue.substring(0, currentReturnValue.indexOf("\n")); + // store the gathered values - currentSyntaxComponents.add(SYNTAXPART_SYNTAX, - formatRawSyntax(currentSyntax)); - currentSyntaxComponents.add(SYNTAXPART_PARAMETERS, - formatParameters(currentParameter, element)); + currentSyntaxComponents.add(SYNTAXPART_SYNTAX, formatRawSyntax(currentSyntax)); + currentSyntaxComponents.add(SYNTAXPART_PARAMETERS, formatParameters(currentParameter, element)); currentSyntaxComponents.add(SYNTAXPART_RETURN_VALUE, - formatReturnValue(currentReturnValue, - element.getKeyword())); - + formatReturnValue(currentReturnValue, element.getKeyword())); + syntaxes.add(currentSyntaxComponents); } - + String[][] syntaxArray = new String[syntaxes.size()][]; - + for (int i = 0; i < syntaxes.size(); i++) { - syntaxArray[i] = syntaxes.get(i) - .toArray(new String[syntaxes.get(i).size()]); + syntaxArray[i] = syntaxes.get(i).toArray(new String[syntaxes.get(i).size()]); } - + return syntaxArray; } - + /** * Brings the given raw syntax into a proper format * @@ -1318,13 +1191,13 @@ private String formatRawSyntax(String syntax) { // remove round brackets Pattern bracketPattern = Pattern.compile("\\([^\\(\\)]*\\)"); Matcher bracketMatcher = bracketPattern.matcher(syntax); - + while (bracketMatcher.find()) { syntax = bracketMatcher.replaceAll(""); - + bracketMatcher = bracketPattern.matcher(syntax); } - + final List allowedSpecials = new ArrayList() { private static final long serialVersionUID = -7392233157557632681L; @@ -1349,10 +1222,10 @@ private String formatRawSyntax(String syntax) { System.out.println("Omitting character " + c); } } - + return out.toString(); } - + /** * Brings the given parameters into the proper format * @@ -1363,58 +1236,54 @@ private String formatRawSyntax(String syntax) { * @return The formatted parameters * @throws SQDevException */ - private String formatParameters(String parameters, SQFElement element) - throws SQDevException { + private String formatParameters(String parameters, SQFElement element) throws SQDevException { String[] paramArray = parameters.split("param:\n"); parameters = ""; - + for (String currentParameter : paramArray) { if (currentParameter.isEmpty()) { continue; } // process alternative data types - parameters += "$PARAM$ " - + formatAlternativeDataTypes(currentParameter); + parameters += "$PARAM$ " + formatAlternativeDataTypes(currentParameter); } - + String[] areas; try { areas = TextUtils.getTextAreas(parameters); } catch (BadSyntaxException e) { throw new SQDevException("Can't format parameter", e); } - + StringBuilder builder = new StringBuilder(); - + boolean matchedColon = false; boolean matchedDataType = false; boolean markedOptional = false; boolean optionalMarkingNeeded = false; int dataTypeEndOffset = -1; - + for (int i = 0; i < areas.length; i++) { String currentArea = areas[i]; - + if (currentArea.toLowerCase().contains("optional")) { if (!markedOptional) { // check that it's at an appropriate position - if (dataTypeEndOffset < 0 - || builder.length() - dataTypeEndOffset < 40 - || ArrayUtils.containsElementInmaxDistance(areas, - "$param$", i, 3)) { - + if (dataTypeEndOffset < 0 || builder.length() - dataTypeEndOffset < 40 + || ArrayUtils.containsElementInmaxDistance(areas, "$param$", i, 3)) { + // mark optional parameter if (dataTypeEndOffset < 0) { optionalMarkingNeeded = true; } else { builder.insert(dataTypeEndOffset, OPTIONAL_MARKER); } - + markedOptional = true; } } } - + if (currentArea.startsWith("(")) { if (matchedDataType) { // only maintain brackets after dataType has been @@ -1423,53 +1292,49 @@ private String formatParameters(String parameters, SQFElement element) } } else { switch (currentArea.toLowerCase()) { - case "$param$": - // maintan proper format - currentArea = "param:\n"; - - // new parameter beginning -> reset colon and dataType - // matches - matchedColon = false; - matchedDataType = false; - markedOptional = false; - optionalMarkingNeeded = false; - dataTypeEndOffset = -1; - break; - - default: - if (matchedColon) { - // colon has been matched therefore this must be the - // data type - matchedDataType = true; - - if (optionalMarkingNeeded && Character - .isLetter(currentArea.trim().charAt(0))) { - currentArea += OPTIONAL_MARKER; - optionalMarkingNeeded = false; - } + case "$param$": + // maintan proper format + currentArea = "param:\n"; + + // new parameter beginning -> reset colon and dataType + // matches + matchedColon = false; + matchedDataType = false; + markedOptional = false; + optionalMarkingNeeded = false; + dataTypeEndOffset = -1; + break; + + default: + if (matchedColon) { + // colon has been matched therefore this must be the + // data type + matchedDataType = true; + + if (optionalMarkingNeeded && Character.isLetter(currentArea.trim().charAt(0))) { + currentArea += OPTIONAL_MARKER; + optionalMarkingNeeded = false; } + } } - - if (matchedDataType && dataTypeEndOffset < 0 - && Character.isLetter(currentArea.trim().charAt(0))) { - dataTypeEndOffset = builder.length() + currentArea.length() - + 1; + + if (matchedDataType && dataTypeEndOffset < 0 && Character.isLetter(currentArea.trim().charAt(0))) { + dataTypeEndOffset = builder.length() + currentArea.length() + 1; } - + builder.append(" " + currentArea); - + if (currentArea.endsWith(":")) { matchedColon = true; } } } - - parameters = builder.toString().trim().replace(" :", ":").replace(" / ", - DataTypeList.TYPE_SEPERATOR); - + + parameters = builder.toString().trim().replace(" :", ":").replace(" / ", DataTypeList.TYPE_SEPERATOR); + return parameters; } - + /** * Formats alternative data types (this is when more than one dataType is * allowed) by seperating them with a "/" @@ -1482,45 +1347,43 @@ private String formatAlternativeDataTypes(String input) { // look for alternative data types int pos1 = input.indexOf(":"); String prefix = input.substring(0, pos1 + 1); - + int pos2 = input.length(); - + if (input.contains("-") && input.indexOf("-") > prefix.length() - 1) { pos2 = input.indexOf("-"); } - + String relevantPart = input.substring(pos1 + 1, pos2); String postfix = input.substring(pos2, input.length()); - - + + // prevent trailing commas from being misinterpreted Pattern pattern = Pattern.compile("\\bor\\b"); - + Matcher matcher = pattern.matcher(relevantPart); - + if (matcher.find()) { relevantPart = relevantPart.substring(0, matcher.start()) + relevantPart.substring(matcher.start()).replace(",", " "); } - - + + // replace all seperators by slash - relevantPart = relevantPart.replace(",", DataTypeList.TYPE_SEPERATOR) - .replaceAll("\\bor\\b", DataTypeList.TYPE_SEPERATOR); - + relevantPart = relevantPart.replace(",", DataTypeList.TYPE_SEPERATOR).replaceAll("\\bor\\b", + DataTypeList.TYPE_SEPERATOR); + // make sure the seperators are not seperated from the next word while (relevantPart.contains(" /")) { - relevantPart = relevantPart.replace(" /", - DataTypeList.TYPE_SEPERATOR); + relevantPart = relevantPart.replace(" /", DataTypeList.TYPE_SEPERATOR); } while (relevantPart.contains("/ ")) { - relevantPart = relevantPart.replace("/ ", - DataTypeList.TYPE_SEPERATOR); + relevantPart = relevantPart.replace("/ ", DataTypeList.TYPE_SEPERATOR); } - + return prefix + relevantPart + postfix; } - + /** * Brings the given returnValue into the proper format * @@ -1531,69 +1394,66 @@ private String formatAlternativeDataTypes(String input) { * @return The formatted returnValue * @throws SQDevException */ - private String formatReturnValue(String returnValue, String commandName) - throws SQDevException { + private String formatReturnValue(String returnValue, String commandName) throws SQDevException { returnValue = returnValue.replace(".", " ").trim().toLowerCase(); - + // remove everything that stands in between round brackets Pattern bracketPattern = Pattern.compile("\\([^\\(\\)]*\\)"); Matcher bracketMatcher = bracketPattern.matcher(returnValue); - + while (bracketMatcher.find()) { returnValue = bracketMatcher.replaceAll(""); - + bracketMatcher = bracketPattern.matcher(returnValue); } - + // prevent trailing commas from being misinterpreted Pattern pattern = Pattern.compile("\\bor\\b"); - + Matcher matcher = pattern.matcher(returnValue); - + if (matcher.find()) { returnValue = returnValue.substring(0, matcher.start()) + returnValue.substring(matcher.start()).replace(",", " "); } - - + + // process multiple return values - returnValue = returnValue.replace(",", DataTypeList.TYPE_SEPERATOR) - .replaceAll("\\bor\\b", DataTypeList.TYPE_SEPERATOR); - + returnValue = returnValue.replace(",", DataTypeList.TYPE_SEPERATOR).replaceAll("\\bor\\b", + DataTypeList.TYPE_SEPERATOR); + // remove leading whitespace in fromt of seperator while (returnValue.contains(" " + DataTypeList.TYPE_SEPERATOR)) { - returnValue = returnValue.replace(" " + DataTypeList.TYPE_SEPERATOR, - DataTypeList.TYPE_SEPERATOR); + returnValue = returnValue.replace(" " + DataTypeList.TYPE_SEPERATOR, DataTypeList.TYPE_SEPERATOR); } // remove trailing whitespace in fromt of seperator while (returnValue.contains(DataTypeList.TYPE_SEPERATOR + " ")) { - returnValue = returnValue.replace(DataTypeList.TYPE_SEPERATOR + " ", - DataTypeList.TYPE_SEPERATOR); + returnValue = returnValue.replace(DataTypeList.TYPE_SEPERATOR + " ", DataTypeList.TYPE_SEPERATOR); } - + if (returnValue.contains("-")) { // remove extra info returnValue = returnValue.substring(0, returnValue.indexOf("-")); returnValue = returnValue.trim(); } - + if (returnValue.contains(":")) { // remove extra info returnValue = returnValue.substring(0, returnValue.indexOf(":")); returnValue = returnValue.trim(); } - + if (returnValue.contains(" ")) { // remove additional stuff returnValue = returnValue.substring(0, returnValue.indexOf(" ")); returnValue = returnValue.trim(); } - + returnValue = formatDataType(returnValue, commandName); - + return returnValue; } - + /** * Formats the given dataType according to EDataType * @@ -1605,47 +1465,41 @@ private String formatReturnValue(String returnValue, String commandName) * @throws SQDevException * If the dataType couldn't be resolved */ - private String formatDataType(String type, String commandName) - throws SQDevException { + private String formatDataType(String type, String commandName) throws SQDevException { StringBuilder newDataType = new StringBuilder(); - - boolean isOptionalType = type.trim() - .endsWith(String.valueOf(OPTIONAL_MARKER)); - + + boolean isOptionalType = type.trim().endsWith(String.valueOf(OPTIONAL_MARKER)); + if (isOptionalType) { type = type.substring(0, type.indexOf(OPTIONAL_MARKER)); } - + // remove unfitting characters for (char currentChar : new char[] { '.', ':', '-' }) { type = type.replace(currentChar, ' '); } - + type = type.trim(); - + for (String currentType : type.split(DataTypeList.TYPE_SEPERATOR)) { if (currentType.isEmpty()) { continue; } - + EDataType dataType = EDataType.resolve(currentType); - + if (dataType == null) { - throw new SQDevException("Unknown dataType \"" + currentType - + "\" in command \"" + commandName + "\""); + throw new SQDevException("Unknown dataType \"" + currentType + "\" in command \"" + commandName + "\""); } else { - newDataType.append((newDataType.length() == 0) - ? dataType.toString() + newDataType.append((newDataType.length() == 0) ? dataType.toString() : DataTypeList.TYPE_SEPERATOR + dataType.toString()); } } - + if (newDataType.length() == 0) { - throw new SQDevException( - "Empty data type in command \"" + commandName + "\""); + throw new SQDevException("Empty data type in command \"" + commandName + "\""); } - - return (isOptionalType) ? newDataType.toString() + OPTIONAL_MARKER - : newDataType.toString(); + + return (isOptionalType) ? newDataType.toString() + OPTIONAL_MARKER : newDataType.toString(); } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/SQFCommandPageProvider.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/SQFCommandPageProvider.java index ed7f9174..b02b8bdb 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/SQFCommandPageProvider.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/SQFCommandPageProvider.java @@ -83,7 +83,7 @@ protected void initialize() throws IOException { final Pattern continuePattern = Pattern.compile("cmcontinue.*?\\n"); - String content = SQFCommandCollector.getSite(requestURL); + String content = SQFCommandCollector.getSite(requestURL, true); // gather the complete list while (content.contains("cmcontinue")) { siteContent.append(content); @@ -94,11 +94,11 @@ protected void initialize() throws IOException { final String cont = content .substring(matcher.start(), matcher.end()).replace("\"", "") - .replace(" ", "").replace(":", "="); + .replace(" ", "").replace(":", "=").replace(",", ""); requestURL = new URL(base + "&" + cont); - content = SQFCommandCollector.getSite(requestURL); + content = SQFCommandCollector.getSite(requestURL, true); } siteContent.append(content); @@ -133,18 +133,18 @@ protected void initialize() throws IOException { urlSearchAdress.setLength(urlSearchAdress.length() - 1); urlPageContent.append(SQFCommandCollector - .getSite(new URL(urlSearchAdress.toString()))); + .getSite(new URL(urlSearchAdress.toString()), true)); } // strip out the actual URLs from this page commandURLs = new Stack(); final Matcher urlMatcher = Pattern - .compile("\"fullurl\":\\s\"") + .compile("\"fullurl\":\\s*\".*?\",") .matcher(urlPageContent.toString()); while (urlMatcher.find()) { commandURLs.add(new URL(urlPageContent - .substring(urlMatcher.start() + 21, urlMatcher.end() - 2))); + .substring(urlMatcher.start() + 10, urlMatcher.end() - 1).replace("\"", "").trim())); } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IParseResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IParseResult.java new file mode 100644 index 00000000..cd362bd7 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IParseResult.java @@ -0,0 +1,37 @@ +package raven.sqdev.interfaces; + +import java.util.Collection; + +import dataStructures.IBuildableIndexTree; +import dataStructures.IToken; +import dataStructures.ITokenSource; +import raven.sqdev.misc.Marker; + +/** + * This interface describes an object that contains the result of parsing some + * content + * + * @author Raven + * + */ +public interface IParseResult { + + + /** + * Gets the {@linkplain IBuildableIndexTree} resulting from parsing the + * respective input + */ + public IBuildableIndexTree getTree(); + + /** + * Gets the token buffer holding the tokens corresponding to the indices as + * listed in the tree retrieved via {@link #getTree()} + */ + public ITokenSource getTokenBuffer(); + + /** + * Gets the markers that have been produced during parsing + */ + public Collection getMarkers(); + +} diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseInformation.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFInformation.java similarity index 97% rename from plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseInformation.java rename to plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFInformation.java index 9ede6d7a..ee8910e0 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseInformation.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFInformation.java @@ -14,7 +14,7 @@ * @author Raven * */ -public interface ISQFParseInformation { +public interface ISQFInformation { /** * Gets the binary SQF operators diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseSupplier.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseSupplier.java new file mode 100644 index 00000000..c36dc3d2 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseSupplier.java @@ -0,0 +1,26 @@ +package raven.sqdev.interfaces; + +import java.util.Map; + +import dataStructures.AbstractSQFTokenFactory; +import raven.sqdev.misc.Macro; + +/** + * An interface describing an object that supplies the necessary information and + * infrastructure for setting up a SQF lexer and parser + * + * @author Raven + * + */ +public interface ISQFParseSupplier { + /** + * Gets the map of defined macros + */ + public Map getMacros(); + + /** + * Gets the {@linkplain AbstractSQFTokenFactory} that should be used in order to + * create the tokens in the lexer + */ + public AbstractSQFTokenFactory getTokenFactory(); +} diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ITreeProcessingResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ITreeProcessingResult.java new file mode 100644 index 00000000..50848873 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ITreeProcessingResult.java @@ -0,0 +1,39 @@ +package raven.sqdev.interfaces; + +import java.util.Collection; +import java.util.Map; + +import org.eclipse.jface.text.Position; + +import raven.sqdev.infoCollection.base.Variable; +import raven.sqdev.misc.Marker; + +/** + * Interface for an object that holds the information about the result of + * processing a given parse tree + * + * @author Raven + * + */ +public interface ITreeProcessingResult { + + /** + * Gets a collection of all areas that have been determined to be foldable + */ + public Collection getFoldableAreas(); + + /** + * Gets the markers that have been produced during tree processing + */ + public Collection getMarkers(); + + /** + * Gets a map of all encountered global variable declarations + */ + public Map getDeclaredGlobalVariables(); + + /** + * Gets a map of all encountered local variable declarations + */ + public Map getDeclaredLocalVariables(); +} diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/BasicErrorListener.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/BasicErrorListener.java index 73acc64f..7ea229df 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/BasicErrorListener.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/BasicErrorListener.java @@ -19,13 +19,13 @@ public class BasicErrorListener extends BaseErrorListener { /** * The result of this parsing */ - protected ParseResult result; + protected ParseResultOld result; /** * Create an instance of this error listener */ public BasicErrorListener() { - result = new ParseResult(); + result = new ParseResultOld(); } @Override @@ -78,7 +78,7 @@ public void reportError(int offset, int length, String msg) { /** * Gets the parse result */ - public ParseResult getParseResult() { + public ParseResultOld getParseResult() { return result; } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseResultOld.java similarity index 95% rename from plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseResult.java rename to plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseResultOld.java index 4019dc4d..d4a356ea 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseResult.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseResultOld.java @@ -8,7 +8,8 @@ import raven.sqdev.interfaces.IMarkerSupport; import raven.sqdev.misc.Marker; -public class ParseResult implements IMarkerSupport { +@Deprecated +public class ParseResultOld implements IMarkerSupport { /** * The list of reported markers @@ -20,7 +21,7 @@ public class ParseResult implements IMarkerSupport { private ParseTree tree; - public ParseResult() { + public ParseResultOld() { markers = new ArrayList(); } @@ -71,7 +72,7 @@ public void applyMarkersTo(IMarkerSupport support) { * @param other * The other parse result to merge into this one */ - public void mergeWith(ParseResult other) { + public void mergeWith(ParseResultOld other) { other.merging(); markers.addAll(other.getMarkers()); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java index 541fdb3e..77444359 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java @@ -20,9 +20,14 @@ import org.eclipse.core.runtime.IPath; import dataStructures.CharacterInputStream; +import dataStructures.SQFTreeWalker; import lexer.SQFLexer; +import parser.SQFParser; import raven.sqdev.infoCollection.base.Variable; -import raven.sqdev.interfaces.ISQFParseInformation; +import raven.sqdev.interfaces.IParseResult; +import raven.sqdev.interfaces.ISQFInformation; +import raven.sqdev.interfaces.ISQFParseSupplier; +import raven.sqdev.interfaces.ITreeProcessingResult; import raven.sqdev.misc.CharacterPair; import raven.sqdev.misc.Pair; import raven.sqdev.misc.TextUtils; @@ -31,9 +36,10 @@ import raven.sqdev.parser.preprocessor.PreprocessorParseListener; import raven.sqdev.parser.preprocessor.PreprocessorParseResult; import raven.sqdev.parser.preprocessor.PreprocessorParser; -import raven.sqdev.parser.sqf.SQFParseInformation; -import raven.sqdev.parser.sqf.SQFParseResult; +import raven.sqdev.parser.sqf.SQFInformation; +import raven.sqdev.parser.sqf.SQFParseResultOld; import raven.sqdev.parser.sqf.SQFValidatorOLD; +import raven.sqdev.sqf.processing.SQFProcessor; /** * A class containing utility methods for parsing processes @@ -46,30 +52,95 @@ public class ParseUtil { * The lexer instance used by this class */ protected static SQFLexer sqfLexer; + /** + * The parser instance used by this class + */ + protected static SQFParser sqfParser; /** * The error listener instance used by this class */ - protected static SQFLexAndParseListener errorListener; + protected static SQFLexAndParseListener errorListener = new SQFLexAndParseListener(); - public static final SQFParseResult parseSQF(InputStream input, ISQFParseInformation parseInfo) throws IOException { + /** + * Parses the content represented by the given InputStream + * + * @param input + * The InputStream used to retrieve the characters of the content + * that should be parsed + * @param supplier + * The {@linkplain ISQFParseSupplier} providing all necessary extras + * for parsing + * @return The result of parsing the given content. + * @throws IOException + */ + public static final SQFParseResult parseSQF(InputStream input, ISQFParseSupplier supplier) throws IOException { if (sqfLexer == null) { sqfLexer = new SQFLexer(errorListener); } - // TODO: set token factory for lexer -> should be retrieved from - // parseInformation - SQFParseResult result = new SQFParseResult(); sqfLexer.reset(true); - sqfLexer.setMacros(parseInfo.getMacros().keySet()); - errorListener.setResult(result); + sqfLexer.setMacros(supplier.getMacros().keySet()); + sqfLexer.setTokenFactory(supplier.getTokenFactory()); + errorListener.setMarkerStorage(result); CharacterInputStream inStream = new CharacterInputStream(input); sqfLexer.lex(inStream); - // TODO: adjust ParseResult to carry tokenBuffer and parseTree + if (sqfParser == null) { + sqfParser = new SQFParser(errorListener); + sqfParser.setErrorListener(errorListener); + } + + sqfParser.parse(sqfLexer); + + return result; + } + + /** + * Processes the SQF tree contained in the given parse result. Part of this + * processing is the SQF validation + * + * @param parseResult + * The parse result containing the tree to process + * @param info + * The {@linkplain ISQFInformation} containing essential information + * about SQF + * @return The {@linkplain ITreeProcessingResult} containing all results of + * processing the given tree + */ + public static final ITreeProcessingResult processSQF(SQFParseResult parseResult, ISQFInformation info) { + TreeProcessingResult result = new TreeProcessingResult(); + result.setMarkers(parseResult.getMarkers()); + + SQFProcessor validator = new SQFProcessor(info, result); + + SQFTreeWalker walker = new SQFTreeWalker(parseResult.getTree(), parseResult.getTokenBuffer(), validator); + walker.walk(); + + return result; + } + + /** + * Parses and process the given input as SQF + * + * @param input + * The input to process + * @param supplier + * The {@linkplain ISQFParseSupplier} providing all necessary extras + * for parsing + * @param info + * The {@linkplain ISQFInformation} containing essential information + * about SQF + * @return The {@linkplain ITreeProcessingResult} containing all results of + * processing the given tree + * @throws IOException + */ + public static final ITreeProcessingResult parseAndProcessSQF(InputStream input, ISQFParseSupplier supplier, + ISQFInformation info) throws IOException { + return processSQF(parseSQF(input, supplier), info); } /** @@ -82,8 +153,8 @@ public static final SQFParseResult parseSQF(InputStream input, ISQFParseInformat * @return The parseResult containing all necessary information about the * parsing (including the parseTree) */ - public static final SQFParseResult parseSQFOld(String input, ISQFParseInformation parseInfo) { - SQFParseResult result = new SQFParseResult(); + public static final SQFParseResultOld parseSQFOld(String input, ISQFInformation parseInfo) { + SQFParseResultOld result = new SQFParseResultOld(); BasicErrorListener listener = new BasicErrorListener(); @@ -181,8 +252,8 @@ public static final SQFParseResult parseSQFOld(String input, ISQFParseInformatio * The necessary ParseInformation * @return The result of the validation */ - public static final SQFParseResult validateSQFOld(ParseTree tree, BufferedTokenStream tokenStream, - ISQFParseInformation info) { + public static final SQFParseResultOld validateSQFOld(ParseTree tree, BufferedTokenStream tokenStream, + ISQFInformation info) { Assert.isNotNull(tokenStream); Assert.isNotNull(tree); Assert.isNotNull(info); @@ -203,10 +274,10 @@ public static final SQFParseResult validateSQFOld(ParseTree tree, BufferedTokenS * The input to process * @param parseInfo * The {@link SQFParseInformation}} for this parsing process - * @return The {@link SQFParseResult} of this parsing and validating + * @return The {@link SQFParseResultOld} of this parsing and validating */ - public static final SQFParseResult parseAndValidateSQFOld(String input, ISQFParseInformation parseInfo) { - SQFParseResult result = parseSQFOld(input, parseInfo); + public static final SQFParseResultOld parseAndValidateSQFOld(String input, ISQFInformation parseInfo) { + SQFParseResultOld result = parseSQFOld(input, parseInfo); result.mergeWith(validateSQFOld(result.getParseTree(), result.getTokenStream(), parseInfo)); return result; diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFLexAndParseListener.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFLexAndParseListener.java index 3f685180..fae6e8cf 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFLexAndParseListener.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFLexAndParseListener.java @@ -4,43 +4,49 @@ import dataStructures.IErrorListener; import dataStructures.SQFToken; -import raven.sqdev.parser.sqf.SQFParseResult; +import raven.sqdev.interfaces.IMarkerSupport; public class SQFLexAndParseListener implements IErrorListener { /** * The parse result to add the errors to */ - protected SQFParseResult result; + protected IMarkerSupport markerStorage; - public SQFLexAndParseListener() { - this(new SQFParseResult()); + public SQFLexAndParseListener(IMarkerSupport markerStorage) { + assert (markerStorage != null); + + this.markerStorage = markerStorage; } - public SQFLexAndParseListener(SQFParseResult result) { - this.result = result; + public SQFLexAndParseListener() { + } @Override public void error(String msg, SQFToken token) { - result.addMarker(IMarker.PROBLEM, token.start(), token.length(), msg, IMarker.SEVERITY_ERROR); + if (markerStorage == null) { + throw new IllegalStateException( + "Marker storage may not be null. Has to be set via setMarkerStorage() before calling this method!"); + } + markerStorage.createMarker(IMarker.PROBLEM, token.start(), token.length(), msg, IMarker.SEVERITY_ERROR); } /** * Gets the parse result */ - public SQFParseResult getResult() { - return result; + public IMarkerSupport getMarkerStorage() { + return markerStorage; } /** * Sets the parse result * - * @param result - * The {@linkplain SQFParseResult} object to report to + * @param storage + * The {@linkplain IMarkerSupport} to report errors to */ - public void setResult(SQFParseResult result) { - this.result = result; + public void setMarkerStorage(IMarkerSupport storage) { + this.markerStorage = storage; } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java new file mode 100644 index 00000000..4c9f55e3 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java @@ -0,0 +1,102 @@ +package raven.sqdev.parser.misc; + +import java.util.ArrayList; +import java.util.Collection; + +import dataStructures.IBuildableIndexTree; +import dataStructures.ITokenSource; +import dataStructures.SQFToken; +import raven.sqdev.interfaces.IMarkerSupport; +import raven.sqdev.interfaces.IParseResult; +import raven.sqdev.misc.Marker; + +public class SQFParseResult implements IParseResult, IMarkerSupport { + + /** + * The tree stored in this result + */ + protected IBuildableIndexTree tree; + /** + * The token buffer holding the tokens corresponding to the stored tree + */ + protected ITokenSource tokenBuffer; + /** + * A collection of markers that have been created during parse-tree-creation + */ + protected Collection markers; + + public SQFParseResult() { + + } + + @Override + public IBuildableIndexTree getTree() { + return tree; + } + + /** + * Sets the tree for this instance + * + * @param tree + * The tree to store + */ + public void setTree(IBuildableIndexTree tree) { + assert (tree != null); + + this.tree = tree; + } + + @Override + public ITokenSource getTokenBuffer() { + return tokenBuffer; + } + + /** + * Sets the token buffer for this instance + * + * @param buffer + * The token buffer corresponding to the stored tree + */ + public void setTokenBuffer(ITokenSource buffer) { + assert (buffer != null); + + this.tokenBuffer = buffer; + } + + @Override + public Collection getMarkers() { + return markers; + } + + @Override + public void createMarker(String type, int offset, int length, String message, int severity) { + if (markers == null) { + markers = new ArrayList(); + } + markers.add(new Marker(type, offset, length, message, severity)); + } + + /** + * Sets the markers for this result. This method is intended for marker + * collections that are passed from through the line and is therefore for + * preventing the instantiation of a new collection + * + * @param markers + * The marker collection to contribute to + */ + public void setMarkers(Collection markers) { + assert (markers != null); + + this.markers = markers; + } + + /** + * Resets all fields of this instance + */ + public void reset() { + markers = null; + tree = null; + tokenBuffer = null; + } + +} diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java index b543a93d..42b5d38a 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java @@ -19,7 +19,7 @@ public SQFTokenFactory(Collection binaryKeywords, Collection una } @Override - public void initialize() { + protected void doInitialize() { for (String currentOperator : unaryKeywords) { lookupTable.put(currentOperator.toLowerCase(), UNARY); } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/TreeProcessingResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/TreeProcessingResult.java new file mode 100644 index 00000000..5169ede2 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/TreeProcessingResult.java @@ -0,0 +1,108 @@ +package raven.sqdev.parser.misc; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.jface.text.Position; + +import raven.sqdev.infoCollection.base.Variable; +import raven.sqdev.interfaces.IMarkerSupport; +import raven.sqdev.interfaces.ITreeProcessingResult; +import raven.sqdev.misc.Marker; + +public class TreeProcessingResult implements ITreeProcessingResult, IMarkerSupport { + + /** + * A collection of markers that have been created during tree-processing + */ + protected Collection markers; + /** + * A map containing all encountered local variables + */ + protected Map localVariables; + /** + * A map containing all encountered global variables + */ + protected Map globalVariables; + /** + * A collection holding all areas that have been determined to be foldable + */ + protected Collection foldableAreas; + + + public TreeProcessingResult() { + foldableAreas = new ArrayList<>(); + localVariables = new HashMap<>(); + globalVariables = new HashMap<>(); + } + + @Override + public Collection getFoldableAreas() { + return foldableAreas; + } + + /** + * Adds an area that should be foldable + * + * @param area + * The area to add + */ + public void addFoldableArea(Position area) { + assert (area != null); + + foldableAreas.add(area); + } + + @Override + public Collection getMarkers() { + return markers; + } + + @Override + public Map getDeclaredGlobalVariables() { + return globalVariables; + } + + @Override + public Map getDeclaredLocalVariables() { + return localVariables; + } + + /** + * Sets the variables stored in this result + * + * @param localVariables + * The local variables to set + * @param globalVariables + * The global variables to set + */ + public void setVariables(Map localVariables, Map globalVariables) { + this.localVariables = localVariables; + this.globalVariables = globalVariables; + } + + @Override + public void createMarker(String type, int offset, int length, String message, int severity) { + if (markers == null) { + markers = new ArrayList(); + } + markers.add(new Marker(type, offset, length, message, severity)); + } + + /** + * Sets the markers for this result. This method is intended for marker + * collections that are passed from through the line and is therefore for + * preventing the instantiation of a new collection + * + * @param markers + * The marker collection to contribute to + */ + public void setMarkers(Collection markers) { + assert (markers != null); + + this.markers = markers; + } + +} diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseResult.java index b7643a2c..cd42bb91 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseResult.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseResult.java @@ -4,9 +4,9 @@ import java.util.Map; import raven.sqdev.misc.Macro; -import raven.sqdev.parser.misc.ParseResult; +import raven.sqdev.parser.misc.ParseResultOld; -public class PreprocessorParseResult extends ParseResult { +public class PreprocessorParseResult extends ParseResultOld { /** * The list of defined macros diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseInformation.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFInformation.java similarity index 95% rename from plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseInformation.java rename to plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFInformation.java index d0dd9049..b79940f0 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseInformation.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFInformation.java @@ -11,7 +11,7 @@ import raven.sqdev.infoCollection.base.KeywordList; import raven.sqdev.infoCollection.base.SQFCommand; import raven.sqdev.infoCollection.base.Variable; -import raven.sqdev.interfaces.ISQFParseInformation; +import raven.sqdev.interfaces.ISQFInformation; import raven.sqdev.misc.Macro; import raven.sqdev.misc.SQDevInfobox; import raven.sqdev.parser.misc.ParseUtil; @@ -23,7 +23,7 @@ * @author Raven * */ -public class SQFParseInformation implements ISQFParseInformation { +public class SQFInformation implements ISQFInformation { /** * The SQF keywords to use */ @@ -44,7 +44,7 @@ public class SQFParseInformation implements ISQFParseInformation { /** * Creates a new instance of this class */ - public SQFParseInformation(Map macros) { + public SQFInformation(Map macros) { this(false, macros); } @@ -59,7 +59,7 @@ public SQFParseInformation(Map macros) { * @param macros * A map of defined macros the SQF parser should be aware of */ - public SQFParseInformation(boolean refresh, Map macros) { + public SQFInformation(boolean refresh, Map macros) { this.macros = macros; macroNames = new ArrayList(); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseResultOld.java similarity index 94% rename from plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseResult.java rename to plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseResultOld.java index 705e66f6..032cb312 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseResult.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseResultOld.java @@ -9,7 +9,7 @@ import org.eclipse.jface.text.Position; import raven.sqdev.infoCollection.base.Variable; -import raven.sqdev.parser.misc.ParseResult; +import raven.sqdev.parser.misc.ParseResultOld; /** * A basic implementation of an {@link ISQFParseResult} @@ -17,7 +17,8 @@ * @author Raven * */ -public class SQFParseResult extends ParseResult { +@Deprecated +public class SQFParseResultOld extends ParseResultOld { /** * A list of local variables declared during the parsing @@ -42,7 +43,7 @@ public class SQFParseResult extends ParseResult { private BufferedTokenStream tokenStream; - public SQFParseResult() { + public SQFParseResultOld() { foldingAreas = new ArrayList(); declaredLocalVariables = new HashMap(); declaredGlobalVariables = new HashMap(); @@ -147,12 +148,12 @@ public boolean providesTokenStream() { * during that process (unless they are null). * * If you want to only merge the reported markers then cast the argument to a - * {@link SQFParseResult}} + * {@link SQFParseResultOld}} * * @param other * The SQFParseResult to merge into this one */ - public void mergeWith(SQFParseResult other) { + public void mergeWith(SQFParseResultOld other) { super.mergeWith(other); foldingAreas.addAll(other.getFoldingAreas()); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java index 8307194e..c0bea315 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java @@ -23,7 +23,7 @@ import raven.sqdev.exceptions.SQDevEditorException; import raven.sqdev.infoCollection.base.SQFCommand; import raven.sqdev.infoCollection.base.Variable; -import raven.sqdev.interfaces.ISQFParseInformation; +import raven.sqdev.interfaces.ISQFInformation; import raven.sqdev.misc.DataTypeList; import raven.sqdev.misc.EDataType; import raven.sqdev.misc.Macro; @@ -52,6 +52,7 @@ * @author Raven * */ +@Deprecated public class SQFValidatorOLD extends SQFBaseListener { /** @@ -61,13 +62,13 @@ public class SQFValidatorOLD extends SQFBaseListener { protected static final int CREATED_STATE = -10; /** - * The parse reult object that holds information about the parse result + * The parse result object that holds information about the parse result */ - private SQFParseResult parseResult; + private SQFParseResultOld parseResult; /** * The information that are needed in order to parse the input properly */ - private ISQFParseInformation info; + private ISQFInformation info; /** * A list of found localVariables @@ -95,12 +96,12 @@ public class SQFValidatorOLD extends SQFBaseListener { * Creates a new instance of this validator. * * @param info - * The {@link SQFParseInformation} needed to parse the input properly + * The {@link SQFInformation} needed to parse the input properly * @param currentStream * The CommonTokenStream associated with the respective * parse tree */ - public SQFValidatorOLD(ISQFParseInformation info, BufferedTokenStream currentStream) { + public SQFValidatorOLD(ISQFInformation info, BufferedTokenStream currentStream) { this(info, null, currentStream); } @@ -108,15 +109,15 @@ public SQFValidatorOLD(ISQFParseInformation info, BufferedTokenStream currentStr * Creates a new instance of this validator. * * @param info - * The {@link SQFParseInformation} needed to parse the input properly + * The {@link SQFInformation} needed to parse the input properly * @param parseResult - * The {@link SQFParseResult} to report any parsing results to. If + * The {@link SQFParseResultOld} to report any parsing results to. If * thi is null a new one will be created * @param currentStream * The CommonTokenStream associated with the respective * parse tree */ - public SQFValidatorOLD(ISQFParseInformation info, SQFParseResult parseResult, BufferedTokenStream currentStream) { + public SQFValidatorOLD(ISQFInformation info, SQFParseResultOld parseResult, BufferedTokenStream currentStream) { Assert.isNotNull(info); Assert.isNotNull(currentStream); @@ -126,7 +127,7 @@ public SQFValidatorOLD(ISQFParseInformation info, SQFParseResult parseResult, Bu if (parseResult != null) { this.parseResult = parseResult; } else { - this.parseResult = new SQFParseResult(); + this.parseResult = new SQFParseResultOld(); } localVariables = new HashMap(); @@ -944,9 +945,9 @@ private void getVariableDeclaration(TerminalNodeImpl node, List varlis /** * Gets the parse result. This implementation always returns an instance of - * {@link SQFParseResult}. + * {@link SQFParseResultOld}. */ - public SQFParseResult getParseResult() { + public SQFParseResultOld getParseResult() { return parseResult; } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java index b7be2f25..0029c9e5 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java @@ -16,14 +16,14 @@ import raven.sqdev.constants.ProblemMessages; import raven.sqdev.exceptions.SQDevException; import raven.sqdev.infoCollection.base.Keyword; -import raven.sqdev.interfaces.ISQFParseInformation; +import raven.sqdev.interfaces.ISQFInformation; import raven.sqdev.misc.EDataType; import raven.sqdev.misc.FileUtil; import raven.sqdev.misc.Macro; import raven.sqdev.misc.Marker; import raven.sqdev.parser.misc.ParseUtil; -import raven.sqdev.parser.sqf.SQFParseInformation; -import raven.sqdev.parser.sqf.SQFParseResult; +import raven.sqdev.parser.sqf.SQFInformation; +import raven.sqdev.parser.sqf.SQFParseResultOld; public class SQFParserTest { @@ -37,7 +37,7 @@ public class SQFParserTest { @Test public void variableDeclarations() { - SQFParseResult result = process(getContent(VARIABLE_DECLARATION)); + SQFParseResultOld result = process(getContent(VARIABLE_DECLARATION)); // Assert that there are no errors in this file assertTrue("The file \"" + VARIABLE_DECLARATION_PATH + "\" is not expected to contain erros!", @@ -98,7 +98,7 @@ public void variableDeclarations() { @Test public void error_typeMismatch() { String input; - SQFParseResult result; + SQFParseResultOld result; Marker expectedMarker; @@ -160,7 +160,7 @@ public void error_typeMismatch() { @Test public void error_missingSemicolon() { String input; - SQFParseResult result; + SQFParseResultOld result; Marker expectedMarker; Map macros = new HashMap(); macros.put("CHECK_TRUE",new Macro("CHECK_TRUE")); @@ -193,7 +193,7 @@ public void error_missingSemicolon() { @Test public void error_unbalancedCharacterPair() { String input; - SQFParseResult result; + SQFParseResultOld result; Marker expectedMarker; @@ -280,11 +280,11 @@ protected static void assertMarkersEqual(Marker expected, Marker actual) { * Checks whether the given parseResult contains the given amount of markers * * @param result - * The {@link SQFParseResult} to check + * The {@link SQFParseResultOld} to check * @param amount * The amount of markers that are expected to be present */ - protected static void assertMarkerAmountEquals(SQFParseResult result, int amount) { + protected static void assertMarkerAmountEquals(SQFParseResultOld result, int amount) { if (result.getMarkers().size() == amount) { return; } @@ -333,9 +333,9 @@ protected static Marker createWarningMarker(int offset, int length, String msg) * The input to process * @param macros * The list of macros that should be existent in the given input - * @return The resulting {@link SQFParseResult} + * @return The resulting {@link SQFParseResultOld} */ - protected static SQFParseResult process(String input, Map macros) { + protected static SQFParseResultOld process(String input, Map macros) { return ParseUtil.parseAndValidateSQFOld(input, getSQFParseInformation(macros)); } @@ -345,9 +345,9 @@ protected static SQFParseResult process(String input, Map macros) * * @param input * The input to process - * @return The resulting {@link SQFParseResult} + * @return The resulting {@link SQFParseResultOld} */ - protected static SQFParseResult process(String input) { + protected static SQFParseResultOld process(String input) { return process(input, new HashMap()); } @@ -385,8 +385,8 @@ protected static String getContent(File file) { * @param macros * The macro-list that should be used */ - protected static ISQFParseInformation getSQFParseInformation(Map macros) { - return new SQFParseInformation(macros) { + protected static ISQFInformation getSQFParseInformation(Map macros) { + return new SQFInformation(macros) { @Override protected String getKeywordContent() { try { diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java similarity index 95% rename from plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java rename to plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java index d6d2f97f..5bb35bb1 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java @@ -1,4 +1,4 @@ -package raven.sqdev.sqf.validation; +package raven.sqdev.sqf.processing; import java.util.HashMap; import java.util.HashSet; @@ -7,8 +7,8 @@ import org.eclipse.core.resources.IMarker; -import dataStructures.ICharacterBuffer; import dataStructures.ISQFTreeListener; +import dataStructures.ITokenSource; import dataStructures.IndexTreeElement; import dataStructures.SQFToken; import dataStructures.TokenBuffer; @@ -16,13 +16,14 @@ import raven.sqdev.exceptions.ValidationException; import raven.sqdev.infoCollection.base.SQFCommand; import raven.sqdev.infoCollection.base.Variable; -import raven.sqdev.interfaces.ISQFParseInformation; +import raven.sqdev.interfaces.ISQFInformation; +import raven.sqdev.interfaces.ITreeProcessingResult; import raven.sqdev.misc.DataTypeList; import raven.sqdev.misc.EDataType; -import raven.sqdev.parser.sqf.SQFParseResult; +import raven.sqdev.parser.misc.TreeProcessingResult; import raven.sqdev.parser.sqf.SQFSyntaxProcessor; -public class SQFValidator implements ISQFTreeListener { +public class SQFProcessor implements ISQFTreeListener { /** * A {@linkplain DataTypeList} containing the datatype ANYTHING @@ -48,11 +49,11 @@ public class SQFValidator implements ISQFTreeListener { /** * The buffer holding all tokens */ - protected TokenBuffer tokenBuffer; + protected ITokenSource tokenBuffer; /** * The object containing all results of parsing and validating */ - protected SQFParseResult result; + protected TreeProcessingResult result; /** * The set of so far declared variables. All names are in lowercase */ @@ -60,16 +61,16 @@ public class SQFValidator implements ISQFTreeListener { /** * The object holding all necessary meta-information */ - protected ISQFParseInformation parseInformation; + protected ISQFInformation parseInformation; /** * A map of all resolved return values */ protected Map resolvedReturnValues; - public SQFValidator(ISQFParseInformation info) { + public SQFProcessor(ISQFInformation info, TreeProcessingResult result) { declaredVariables = new HashSet<>(); - result = new SQFParseResult(); + this.result = result; resolvedReturnValues = new HashMap<>(); } @@ -345,7 +346,7 @@ protected void info(IndexTreeElement node, String message) { * The problem message */ protected void addProblemMarker(int severity, int start, int length, String message) { - result.addMarker(IMarker.PROBLEM, start, length, message, severity); + result.createMarker(IMarker.PROBLEM, start, length, message, severity); } /** @@ -502,7 +503,7 @@ protected DataTypeList getReturnValues(IndexTreeElement node) { /** * Gets the result of this validation */ - public SQFParseResult getResult() { + public ITreeProcessingResult getResult() { return result; } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/BinaryExpressions.sqf b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/BinaryExpressions.sqf similarity index 100% rename from plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/BinaryExpressions.sqf rename to plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/BinaryExpressions.sqf diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java new file mode 100644 index 00000000..2ea52242 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java @@ -0,0 +1,91 @@ +package raven.sqdev.sqf.processing.tests; + +import static org.junit.Assert.*; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; + +import dataStructures.AbstractSQFTokenFactory; +import raven.sqdev.exceptions.SQDevException; +import raven.sqdev.interfaces.ISQFParseSupplier; +import raven.sqdev.misc.FileUtil; +import raven.sqdev.misc.Macro; +import raven.sqdev.parser.misc.ParseUtil; +import raven.sqdev.parser.misc.SQFTokenFactory; +import raven.sqdev.parser.sqf.SQFInformation; + +public class SQFProcessingTest { + + public static final File KEYWORD_FILE = new File( + makeOSCompatible(System.getProperty("user.dir") + "/resources/sqf/SQFKeywords.txt")); + + protected static SQFInformation info; + protected static ISQFParseSupplier supplier; + protected static Map macros; + + @Before + public void setUp() throws Exception { + macros = new HashMap<>(); + + info = getSQFInformation(macros); + SQFTokenFactory factory = new SQFTokenFactory(info.getBinaryKeywords(), info.getUnaryKeywords()); + supplier = new ISQFParseSupplier() { + + @Override + public AbstractSQFTokenFactory getTokenFactory() { + return factory; + } + + @Override + public Map getMacros() { + return macros; + } + }; + } + + @Test + public void test() throws IOException { + ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player setPos getPos player".getBytes()), supplier, + info); + } + + + /** + * Makes the given path (that uses "/" as a FileSeparator) compatible with the + * current OS by using the actual OS-FileSeparator + * + * @param path + * The path to process + * @return The processed path + */ + protected static String makeOSCompatible(String path) { + return path.replace("/", File.separator); + } + + /** + * Gets the needed SQFInformation + * + * @param macros + * The macro-list that should be used + */ + protected static SQFInformation getSQFInformation(Map macros) { + return new SQFInformation(macros) { + @Override + protected String getKeywordContent() { + try { + return FileUtil.getContent(KEYWORD_FILE); + } catch (SQDevException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + }; + } + +} diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/SQFValidationTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/SQFValidationTest.java deleted file mode 100644 index 342af4bf..00000000 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/SQFValidationTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package raven.sqdev.sqf.validation.tests; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -public class SQFValidationTest { - - @Before - public void setUp() throws Exception { - } - - @Test - public void test() { - fail("Not yet implemented"); - } - -} diff --git a/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor.class b/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor.class index d3fb5fe3e5b1ef7a3e5fa578712697d7485eb39e..59742dd9738cdc90c300981fb62422d9eb3b2ab3 100644 GIT binary patch delta 105 zcmexg@TXwHaYnU?^CXyq1Kl>h=oMi~)0ph5qBwC47f59CDp6y8|C|(SE=FTUQ+7rZ vMh1<^FGW?EfnuBa#N3&fw0vOv$u$x&Op7%p3rMI={x1R63RYGt$s`W|JM$p% delta 99 zcmexU@V{WfaYpUQiAoY2!GUf8iABY!8z1+IFlJ0H6xC-1^CvG5HRiGAVl-wnWoI;D tWKf;FPE>U>mzX;fqx$4PNwvw<5;06mH6|O1s!skV;fBz(xk{2r9sqTF9{K

    5GT8{oJIim(@1K)m&BgG7;T1c>OGXBb$rJfh znSo-HxA84yTC6eoJfG_1CVn@NQjqW@0ZB&P$$rP5%f-*_0lGyGs=;LJ@eN>2^XEXiPG(9)QE zkzY;FS~Cn}*e{TZ-;4|zAW@OYYk9cXf>Mi1b4oUs2|Q$C)B%brNPFg` Date: Fri, 30 Mar 2018 10:31:57 +0200 Subject: [PATCH 05/23] little tweaks --- .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 95339 -> 94886 bytes .../raven/sqdev/parser/misc/ParseUtil.class | Bin 13175 -> 13299 bytes .../raven/sqdev/parser/misc/ParseUtil.java | 3 +++ .../processing/tests/SQFProcessingTest.java | 5 ++++- 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar b/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar index a97392d004e1ea6e15c428c0bd40d0da391c679d..1c7d4781210e895129f2b2f6e6c4b8c655ec089e 100644 GIT binary patch delta 16488 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 UPVg>Wken+3AG%KO6B!2kKV)YOK>z>% delta 16962 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 delta 4723 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 getMacros() { @Test public void test() throws IOException { - ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player setPos getPos player".getBytes()), supplier, + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player setPos getPos player".getBytes()), supplier, info); + // TODO: It claims there is a semicolon missing + assertTrue(result.getMarkers().size() == 0); } From e88760cda01939615be05c6629f003434e696ea1 Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Fri, 30 Mar 2018 15:56:52 +0200 Subject: [PATCH 06/23] bug fixes in SQFProcessor and related classes; started implementing TestCases --- .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 94886 -> 94903 bytes .../raven/sqdev/parser/misc/ParseUtil.class | Bin 13299 -> 13343 bytes .../sqdev/parser/sqf/SQFSyntaxProcessor.class | Bin 6964 -> 7417 bytes .../raven/sqdev/parser/misc/ParseUtil.java | 4 +- .../sqdev/parser/misc/SQFParseResult.java | 5 +- .../sqdev/parser/misc/SQFTokenFactory.java | 4 +- .../parser/misc/TreeProcessingResult.java | 4 +- .../sqdev/parser/sqf/SQFSyntaxProcessor.java | 69 ++++++++----- .../sqdev/sqf/processing/SQFProcessor.java | 92 +++++++++++------- .../processing/tests/SQFProcessingTest.java | 79 ++++++++++++++- 10 files changed, 187 insertions(+), 70 deletions(-) diff --git a/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar b/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar index 1c7d4781210e895129f2b2f6e6c4b8c655ec089e..0810813a4facd95649328704cf14bb8cabc1facc 100644 GIT binary patch delta 8395 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 Ym6xUp8u~v9s`t2Z9ZU9smFU delta 8390 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class index 7bc2ec5635506a6a1219c11d613fa96414c25cf5..1d651d521f631a8934458ef27b201e998d7c1c7e 100644 GIT binary patch delta 1221 zcmZ9Kdu&s66vxl^^l@+N?Y6G6?T&Tp9^JaGTU{kHsR8~#iF0nz#As@i<)$m^aO-AQ zhh~QT=O4z9kRK?2_y}l7j2NQD7PyKiiokS$FMQw=@qze+DWEWaT?s*RbMN_`&pGFJ z&-ZtJrw5--mL0sfYc~-s;&z1?R4?3a?~Cnc6ikS)wOW)YrJ_ge5JyyR_Ca+R%2;|d zo){m`o^k{{PRE2XJTzcrM$@9tUMX6=on<>T+C-b3^bB@sF!735HE75ifXe zD0@T0lX$8Se^WyeZwb_H2^<8uR~ZvV`2Nh$aQG%;JlSiEIdOp8D&7Uz`ZLL)aRrCO zq1tvF5f^IjR%h_OM&vW`zdrTr^Y@&566dT1<@GDZ?Aj{O(* z&BHH1BVwDcQMCGQsrd@D;D2RfMmmwosQ5;#^Ht+pvDG)}_zuMV52*M-TvLBf%Sn){ zf8}U8VZ@U|seyzHoVtW=l&HIiei7U2<5j;&iSsfN6LQz2ks26Iq*eSO!VMKTlU?4> z1MA2%^eE)?Wl6o(rFHYQL++}9j&IWb2wh0h*^tzunMSlruGT4`asOlAdS z4Rp8OQHbwV*eT;nR0nH?m`faO3b^LDRHIog11$@*3baJT62IH!;Bt-5u?KYhCA!w{ zD6!C4Cs$xl;Y!eT^6#But>2zK=AVYO6|}U_k67w=iIXjEYY5aXZmX;l+saC^p}=u8 zJV7@35OtZ9iREdcHx$g#>Ksj)G!<(Ly+n1QBiOarOOq6)hiDP4p^CyiEEbWVl=Ngd zt)~rAzDgZ5LXQ!XmvnlZHj;(H*-gQl?GbFp%VZ@TIod2UU9xJ0^exg>1>1HY-x~_$ zuv5OTO7Ha?_6l$3vZ;L(kr)1LnZ?*&s6vSBvYu$Yi371brh9@OyklY}CXEM&^LTG3 zKD5xC5`R*}pLy{4mH5jd{@R1%SK<>ze8Pk8FXJ}3%a29=lLtRv<`Vx}#J_uRx`>4{ zvSw-)f65*=%Ko(Z^LP}q_)B^^&f;8AH=3ksr(|O$Jr@h+>G@t0=VPHf{^>JmU#vY( z`=eG9b1~hTXGCqfEyrxKC1%O9Eo#?ox;@9LiD#w!Em6f}N31Q+S4CA_S*WXp?2;U| z>S~VNQHSm*WM7@*1)|~FyH;1RF1v8hAXnpIIj3@3!3()Yc2q;RvloxZnY2(h*K(bl zaTi6&!9IE7%PGk9$dW?0l8+m>QO-Ip=P|-fayMqb)Wh7&Ez*|DRRD7wl(lU%U9kTG DblpM% delta 1128 zcmY+CYiv_x7{{Og)5|&S&bF>+R!+CB-KAUCcFYblLlY7SVwls#L_tf`rfy|hvK1}M zT%tig`GNRpF9Lp0f)YRZ#Z+5Zb)YCt#?X4fE8f7n;)S71wD_LY5X{Lr@B99q|MQ&Z z^6niuH|#oAo|z@0YdNYAgPO&@DqYmpIiK%ZRFDweR49a9`Y;-6! zk#jghIzr<9ss=INpoz4v$yLy3A3g1)XK+x%42nYd*4SUxFpERtr0<6MS2R3{r%d}1 z4I_9B)MW+;i#wa9@TMp=dFtn=PQ`JMEjckVx=q0eP-wa}WKr?9X!qZxF5n%F+;~^) z@UOJLui+#<5VQVuk&i&N$t{_| zLHr`tws=8W(qi6#7Pmh%s& zEhJ(dkLa$hQad*(xCH7kh0`Is%ZW0bFh7SCwt!YkzPi!L%r@!Ec91pH*SX0Q98uU& z5lBayINRn_Rjx8s+H^3ambpfw^IR*g32u;vI*pdtEglJ8U&D04$yZ@mVGroK%8zZi zOTiN4h)W%}StD{*@@DwOaaT=lW9T#-PmoPMM61Nwut#hT_pb5MgA}EQC`Q}KV_vC> zodjj%Nh)b4Jx(B%A~a6Bh{;O^?WR3sp=fR)e3RWtyYT{9$-s-EIp%TaZ;3|pI3VAb zA_s6dk5@%sY~91JQ;)o=M`cLH8&pk%DA{FTqMb#|B?>s!AJ#En#6m(YI^HUvbP(@Z z=njcLtl*Dze0nARtb)JL@zs_1Oa-6O@y%r%kx{;@@E>&ibeT(hwt|1v@p}b}-k$Bg zMVyy8?veRv%jG|YMf@R82L8kaQR->9cPSAq;Nn1$jwZSaG#9rPQBD}v0#n>(*z$}b zbHY+!Yus+w411oHBKFHdpN%U;Ruho|JL9UM7^*3*&f_^l&9f`+FdU{>&vU&PShe|q zt9gY?z(K=o;8EFsH{HWtZjk+Nq}#a>J7n)WsE>WzBxl!4adNOB0%$?FVO!MaYFL&@Nr~m)} diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFSyntaxProcessor.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFSyntaxProcessor.class index fa3183e82de9f8908f6033502d691b854187f3c4..01f2b3c8f3f56b04dae4ef18ecb6b1e0f4495d13 100644 GIT binary patch literal 7417 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 diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java index af6c5ead..c789ad5c 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java @@ -118,9 +118,9 @@ public static final ITreeProcessingResult processSQF(SQFParseResult parseResult, TreeProcessingResult result = new TreeProcessingResult(); result.setMarkers(parseResult.getMarkers()); - SQFProcessor validator = new SQFProcessor(info, result); + SQFProcessor processor = new SQFProcessor(info, result, sqfLexer); - SQFTreeWalker walker = new SQFTreeWalker(parseResult.getTree(), parseResult.getTokenBuffer(), validator); + SQFTreeWalker walker = new SQFTreeWalker(parseResult.getTree(), parseResult.getTokenBuffer(), processor); walker.walk(); return result; diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java index 4c9f55e3..c195f365 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java @@ -26,7 +26,7 @@ public class SQFParseResult implements IParseResult, IMarkerSupport { protected Collection markers; public SQFParseResult() { - + markers = new ArrayList<>(); } @Override @@ -78,8 +78,7 @@ public void createMarker(String type, int offset, int length, String message, in /** * Sets the markers for this result. This method is intended for marker - * collections that are passed from through the line and is therefore for - * preventing the instantiation of a new collection + * collections that are passed from through the line. * * @param markers * The marker collection to contribute to diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java index 42b5d38a..eb24045b 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java @@ -30,9 +30,11 @@ protected void doInitialize() { if (hasSpecialPrecedence(currentOperator)) { lookupTable.put(currentOperator, specialOperators.get(currentOperator)); } else { - lookupTable.put(currentOperator, UNARY); + lookupTable.put(currentOperator, BINARY); } } + + lookupTable.put("=", specialOperators.get("=")); } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/TreeProcessingResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/TreeProcessingResult.java index 5169ede2..63a44654 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/TreeProcessingResult.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/TreeProcessingResult.java @@ -36,6 +36,7 @@ public TreeProcessingResult() { foldableAreas = new ArrayList<>(); localVariables = new HashMap<>(); globalVariables = new HashMap<>(); + markers = new ArrayList<>(); } @Override @@ -93,8 +94,7 @@ public void createMarker(String type, int offset, int length, String message, in /** * Sets the markers for this result. This method is intended for marker - * collections that are passed from through the line and is therefore for - * preventing the instantiation of a new collection + * collections that are passed from through the line. * * @param markers * The marker collection to contribute to diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java index e0e8a17c..71223e4b 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java @@ -3,8 +3,6 @@ import java.util.ArrayList; import java.util.List; -import org.eclipse.core.runtime.Assert; - import raven.sqdev.constants.ProblemMessages; import raven.sqdev.exceptions.SQDevCoreException; import raven.sqdev.exceptions.SQDevException; @@ -19,7 +17,7 @@ public class SQFSyntaxProcessor { /** * The command whose syntax should be checked */ - private SQFCommand command; + private SQFCommand operator; /** * The potential datatypes of the left argument */ @@ -46,10 +44,13 @@ public class SQFSyntaxProcessor { */ private ERelativePosition markerPosition; - public SQFSyntaxProcessor(SQFCommand command) { - Assert.isNotNull(command); - this.command = command; + public SQFSyntaxProcessor() { + } + + + public SQFSyntaxProcessor(SQFCommand command) { + setOperator(command); } /** @@ -81,9 +82,9 @@ protected void validate() { validated = true; // check possible argument constellations the command accepts - boolean canBeBinary = command.isBinaryOperator(); - boolean canBeUnary = command.isUnaryOperator(); - boolean canBeNular = command.isNularOperator(); + boolean canBeBinary = operator.isBinaryOperator(); + boolean canBeUnary = operator.isUnaryOperator(); + boolean canBeNular = operator.isNularOperator(); // check arguments to determine which constellation can be achieved with // given arguments @@ -106,7 +107,7 @@ protected void validate() { // the command can't be used with the given amount of arguments if (leftArgumentTypes != null && rightArgumentTypes != null) { // tried to use as binary operator - errorMessage = ProblemMessages.operatorIsNotBinary(command.getKeyword()); + errorMessage = ProblemMessages.operatorIsNotBinary(operator.getKeyword()); activeSyntax = null; @@ -114,16 +115,16 @@ protected void validate() { } if (rightArgumentTypes != null) { - if (command.isBinaryOperator()) { + if (operator.isBinaryOperator()) { // command is binary but only one arg provided - errorMessage = ProblemMessages.missingArgLeft(command.getKeyword()); + errorMessage = ProblemMessages.missingArgLeft(operator.getKeyword()); activeSyntax = null; markerPosition = ERelativePosition.CENTER; } else { // operator is nular but has one argument provided - errorMessage = ProblemMessages.operatorIsNular(command.getKeyword()); + errorMessage = ProblemMessages.operatorIsNular(operator.getKeyword()); activeSyntax = null; @@ -134,7 +135,7 @@ protected void validate() { } // command must be nular but there must be an argument provided - errorMessage = ProblemMessages.operatorIsNotNular(command.getKeyword()); + errorMessage = ProblemMessages.operatorIsNotNular(operator.getKeyword()); activeSyntax = null; @@ -143,7 +144,7 @@ protected void validate() { return; } - List possibleSyntaxes = new ArrayList(command.getSyntaxes()); + List possibleSyntaxes = new ArrayList(operator.getSyntaxes()); DataTypeList validProvidedLeftTypes = new DataTypeList(); DataTypeList validGeneralLeftTypes = new DataTypeList(); @@ -199,8 +200,7 @@ protected void validate() { if (leftArgumentTypes != null && validProvidedLeftTypes.isEmpty()) { // left argument is invalid errorMessage = ProblemMessages.expectedTypeButGot( - validGeneralLeftTypes.toArray(new EDataType[validGeneralLeftTypes.size()]), - leftArgumentTypes); + validGeneralLeftTypes.toArray(new EDataType[validGeneralLeftTypes.size()]), leftArgumentTypes); activeSyntax = null; @@ -248,8 +248,7 @@ protected void validate() { // The right argument is invalid as the program reached this part of the // code errorMessage = ProblemMessages.expectedTypeButGot( - validGeneralRightTypes.toArray(new EDataType[validGeneralRightTypes.size()]), - rightArgumentTypes); + validGeneralRightTypes.toArray(new EDataType[validGeneralRightTypes.size()]), rightArgumentTypes); activeSyntax = null; @@ -304,8 +303,8 @@ private DataTypeList getTypesForSide(Syntax syntax, boolean leftSide) { .getElement((leftSide) ? 0 : ((syntax.isBinary()) ? 2 : (syntax.isNular()) ? 0 : 1)); if (!element.isLeafElement()) { - throw new SQDevCoreException("Expected element from the syntax for command \"" - + syntax.getCommandName() + "\" to be a leaf element"); + throw new SQDevCoreException("Expected element from the syntax for command \"" + syntax.getCommandName() + + "\" to be a leaf element"); } DataTypeList dataTypes = new DataTypeList(); @@ -340,9 +339,33 @@ private DataTypeList getTypesForSide(Syntax syntax, boolean leftSide) { */ public DataTypeList getReturnValues() { if (activeSyntax == null) { - return command.getAllReturnTypes(); + return operator.getAllReturnTypes(); } else { - return command.getReturnTypes(activeSyntax); + return operator.getReturnTypes(activeSyntax); } } + + /** + * Resets this processor for another usage + */ + public void reset() { + operator = null; + leftArgumentTypes = null; + rightArgumentTypes = null; + validated = false; + errorMessage = null; + activeSyntax = null; + markerPosition = null; + } + + /** + * Sets the operator to be processed by this processor + * + * @param operator + * The operator to process + */ + public void setOperator(SQFCommand operator) { + assert (operator != null); + this.operator = operator; + } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java index 5bb35bb1..8972719a 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java @@ -61,17 +61,41 @@ public class SQFProcessor implements ISQFTreeListener { /** * The object holding all necessary meta-information */ - protected ISQFInformation parseInformation; + protected ISQFInformation sqfInformation; /** * A map of all resolved return values */ protected Map resolvedReturnValues; + /** + * The {@linkplain SQFSyntaxProcessor} to use internally + */ + protected SQFSyntaxProcessor syntaxProcessor; - public SQFProcessor(ISQFInformation info, TreeProcessingResult result) { + /** + * Creates a new instance of this processor + * + * @param info + * The {@linkplain ISQFInformation} holding all necessary meta + * information about the available commands + * @param result + * The {@linkplain TreeProcessingResult} to put all results of this + * processing to + * @param tokenBuffer + * The buffer holding all tokens to the tree that is going to be + * processed + */ + public SQFProcessor(ISQFInformation info, TreeProcessingResult result, ITokenSource tokenBuffer) { + assert (info != null); + assert (result != null); + assert (tokenBuffer != null); + declaredVariables = new HashSet<>(); this.result = result; + this.sqfInformation = info; + this.tokenBuffer = tokenBuffer; resolvedReturnValues = new HashMap<>(); + syntaxProcessor = new SQFSyntaxProcessor(); } @Override @@ -98,22 +122,21 @@ public void binaryExpression(SQFToken expression, IndexTreeElement node) { default: // "normal" binary operator - SQFCommand operator = parseInformation.getBinaryOperators().get(operatorName.toLowerCase()); + SQFCommand operator = sqfInformation.getBinaryOperators().get(operatorName.toLowerCase()); if (operator != null) { DataTypeList leftTypes = getReturnValues(node.getChildren().get(0)); DataTypeList rightTypes = getReturnValues(node.getChildren().get(1)); - // TODO: consider using static processor for all statements - SQFSyntaxProcessor processor = new SQFSyntaxProcessor(operator); - processor.setLeftArgumentTypes(leftTypes.toArray()); - processor.setRightArgumentTypes(rightTypes.toArray()); + syntaxProcessor.setOperator(operator); + syntaxProcessor.setLeftArgumentTypes(leftTypes.toArray()); + syntaxProcessor.setRightArgumentTypes(rightTypes.toArray()); - if (!processor.isValid()) { + if (!syntaxProcessor.isValid()) { int[] positionData; try { - switch (processor.getErrorMarkerPosition()) { + switch (syntaxProcessor.getErrorMarkerPosition()) { case CENTER: positionData = new int[] { expression.start(), expression.length() }; break; @@ -136,11 +159,11 @@ public void binaryExpression(SQFToken expression, IndexTreeElement node) { error(node, ProblemMessages.internalError()); } - error(positionData[0], positionData[1], processor.getErrorMessage()); + error(positionData[0], positionData[1], syntaxProcessor.getErrorMessage()); } // map the resolved processor to the respective node - resolvedReturnValues.put(node, processor.getReturnValues()); + resolvedReturnValues.put(node, syntaxProcessor.getReturnValues()); } else { // apparently it is not a binary operator -> shouldn't even be reachable error(expression, ProblemMessages.operatorIsNotBinary(operatorName)); @@ -433,14 +456,32 @@ protected DataTypeList getReturnValues(IndexTreeElement node) { return resolvedReturnValues.get(node); } - if (node.getIndex() > 0) { + if (node.getIndex() >= 0) { SQFToken token = tokenBuffer.get(node.getIndex()); + // handle primitives first + switch (token.type()) { + case CURLY_BRACKET_OPEN: + return CODE; + case ERROR_TOKEN: + return ANYTHING; + case NUMBER: + return NUMBER; + case SQUARE_BRACKET_OPEN: + return ARRAY; + case STRING: + return STRING; + case SUBSTRING: + return STRING; + default: + // do nothing -> wil be handled below + } + switch (token.operatorType()) { case MACRO: return ANYTHING; case BINARY: - SQFCommand operator = parseInformation.getBinaryOperators().get(token.getText().toLowerCase()); + SQFCommand operator = sqfInformation.getBinaryOperators().get(token.getText().toLowerCase()); if (operator == null) { // If it is not recognized it will be handled elsewhere return ANYTHING; @@ -448,7 +489,7 @@ protected DataTypeList getReturnValues(IndexTreeElement node) { return operator.getAllReturnTypes(); } case NULAR: - operator = parseInformation.getNularOperators().get(token.getText().toLowerCase()); + operator = sqfInformation.getNularOperators().get(token.getText().toLowerCase()); if (operator == null) { // If it is not recognized it will be handled elsewhere return ANYTHING; @@ -456,34 +497,13 @@ protected DataTypeList getReturnValues(IndexTreeElement node) { return operator.getAllReturnTypes(); } case UNARY: - operator = parseInformation.getUnaryOperators().get(token.getText().toLowerCase()); + operator = sqfInformation.getUnaryOperators().get(token.getText().toLowerCase()); if (operator == null) { // If it is not recognized it will be handled elsewhere return ANYTHING; } else { return operator.getAllReturnTypes(); } - case OTHER: - // check token type - switch (token.type()) { - case CURLY_BRACKET_OPEN: - return CODE; - case ERROR_TOKEN: - return ANYTHING; - case NUMBER: - return NUMBER; - case SQUARE_BRACKET_OPEN: - return ARRAY; - case STRING: - return STRING; - case SUBSTRING: - return STRING; - default: - // Shouldn't be reached - error(token, ProblemMessages.internalError()); - return ANYTHING; - - } default: // Shouldn't get reached error(node, ProblemMessages.internalError()); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java index 6fa4ff33..5265e444 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java @@ -12,6 +12,7 @@ import org.junit.Test; import dataStructures.AbstractSQFTokenFactory; +import raven.sqdev.constants.ProblemMessages; import raven.sqdev.exceptions.SQDevException; import raven.sqdev.interfaces.ISQFParseSupplier; import raven.sqdev.interfaces.ITreeProcessingResult; @@ -36,6 +37,8 @@ public void setUp() throws Exception { info = getSQFInformation(macros); SQFTokenFactory factory = new SQFTokenFactory(info.getBinaryKeywords(), info.getUnaryKeywords()); + factory.initialize(); + supplier = new ISQFParseSupplier() { @Override @@ -51,11 +54,81 @@ public Map getMacros() { } @Test - public void test() throws IOException { - ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player setPos getPos player".getBytes()), supplier, + public void assignments() throws IOException { + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("myVar = 3".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 1); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredGlobalVariables().keySet().contains("myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("myVar = 3;".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 1); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredGlobalVariables().keySet().contains("myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("_myVar = 3".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("_myVar = 3;".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("private _myVar = 3".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("private _myVar = 3;".getBytes()), supplier, info); - // TODO: It claims there is a semicolon missing + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("_myVar = []".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("_myVar = [];".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("_myVar = {}".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("_myVar = {};".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + } + + @Test + public void assignmentErros() throws IOException { + ITreeProcessingResult result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("someOperator myVar = 3".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 1); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals("Missing ';'", + result.getMarkers().iterator().next().getMessage()); + assertTrue(result.getDeclaredGlobalVariables().keySet().contains("myvar")); } From f2798378a3abe1844212e13f0218c4f8d9da387e Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Sun, 1 Apr 2018 15:00:28 +0200 Subject: [PATCH 07/23] adjusted gitignore to ignore compiled class-files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 96374c4e..34cf1e69 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ $RECYCLE.BIN/ Network Trash Folder Temporary Items .apdisk + +# java class files +plugin/*/bin/ From 7e6c600fd30fb329905cb4af08b9120bb2a45f94 Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Sun, 1 Apr 2018 15:01:59 +0200 Subject: [PATCH 08/23] fixed little bugs + expanded test cases for assignments --- .../sqdev/constants/ProblemMessages.java | 2 +- .../sqdev/interfaces/ISQFInformation.java | 12 +-- .../raven/sqdev/parser/misc/ParseUtil.java | 2 +- .../sqdev/parser/sqf/SQFInformation.java | 80 +++---------------- .../src/raven/sqdev/parser/sqf/SQFLexer.java | 20 +++-- .../sqdev/sqf/processing/SQFProcessor.java | 61 ++++++++++++-- .../processing/tests/SQFProcessingTest.java | 34 +++++++- 7 files changed, 116 insertions(+), 95 deletions(-) diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java index 732812e6..a49532b1 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java @@ -334,7 +334,7 @@ public static final String privateVariablesMustBeLocal() { } /** - * The error message for interal erros + * The error message for internal errors */ public static final String internalError() { return "!!! Internal error !!!"; diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFInformation.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFInformation.java index ee8910e0..c23450de 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFInformation.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFInformation.java @@ -1,6 +1,6 @@ package raven.sqdev.interfaces; -import java.util.List; +import java.util.Collection; import java.util.Map; import raven.sqdev.infoCollection.base.SQFCommand; @@ -24,7 +24,7 @@ public interface ISQFInformation { /** * Gets the binary SQF operators keywords as string */ - public List getBinaryKeywords(); + public Collection getBinaryKeywords(); /** * Gets the unary SQF operators @@ -34,7 +34,7 @@ public interface ISQFInformation { /** * Gets the unary SQF operators keywords as string */ - public List getUnaryKeywords(); + public Collection getUnaryKeywords(); /** * Gets the nular SQF operators @@ -44,7 +44,7 @@ public interface ISQFInformation { /** * Gets the nular SQF operators keywords as string */ - public List getNularKeywords(); + public Collection getNularKeywords(); /** * Gets the configured magic variables @@ -54,7 +54,7 @@ public interface ISQFInformation { /** * Gets the configured magic variable-keywords as string */ - public List getMagicVariableNames(); + public Collection getMagicVariableNames(); /** * Gets the configured macros @@ -64,5 +64,5 @@ public interface ISQFInformation { /** * Gets the configured macro-keywords as string */ - public List getMacroNames(); + public Collection getMacroNames(); } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java index c789ad5c..e4e82cf5 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java @@ -81,7 +81,7 @@ public static final SQFParseResult parseSQF(InputStream input, ISQFParseSupplier SQFParseResult result = new SQFParseResult(); - sqfLexer.reset(true); + sqfLexer.reset(false); sqfLexer.setMacros(supplier.getMacros().keySet()); sqfLexer.setTokenFactory(supplier.getTokenFactory()); errorListener.setMarkerStorage(result); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFInformation.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFInformation.java index b79940f0..43435d13 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFInformation.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFInformation.java @@ -1,12 +1,9 @@ package raven.sqdev.parser.sqf; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; - import raven.sqdev.infoCollection.base.Keyword; import raven.sqdev.infoCollection.base.KeywordList; import raven.sqdev.infoCollection.base.SQFCommand; @@ -30,16 +27,11 @@ public class SQFInformation implements ISQFInformation { private static KeywordList keywords; private static Map binaryOperator; - private static List binaryKeywords; private static Map unaryOperator; - private static List unaryKeywords; private static Map nularOperator; - private static List nularKeywords; private static Map magicVars; - private static List magicVarNames; private Map macros; - private List macroNames; /** * Creates a new instance of this class @@ -61,18 +53,11 @@ public SQFInformation(Map macros) { */ public SQFInformation(boolean refresh, Map macros) { this.macros = macros; - macroNames = new ArrayList(); - - loadMacronames(); if (refresh || keywords == null) { binaryOperator = new HashMap(); - binaryKeywords = new ArrayList(); unaryOperator = new HashMap(); - unaryKeywords = new ArrayList(); nularOperator = new HashMap(); - nularKeywords = new ArrayList(); - magicVarNames = new ArrayList(); String savedKeywords = getKeywordContent(); @@ -108,8 +93,6 @@ public SQFInformation(boolean refresh, Map macros) { } magicVars = ParseUtil.getDefaultMagicVars(); - - loadNames(); } } @@ -121,47 +104,6 @@ protected String getKeywordContent() { return manager.getResourceContent("SQFKeywords.txt"); } - /** - * Initializes all name-lists except the macro-namelist (see - * {@link #loadMacronames()}) - */ - private void loadNames() { - Iterator> it = binaryOperator.entrySet().iterator(); - - while (it.hasNext()) { - binaryKeywords.add(it.next().getValue().getKeyword()); - } - - it = unaryOperator.entrySet().iterator(); - - while (it.hasNext()) { - unaryKeywords.add(it.next().getValue().getKeyword()); - } - - it = nularOperator.entrySet().iterator(); - - while (it.hasNext()) { - nularKeywords.add(it.next().getValue().getKeyword()); - } - - Iterator> varIt = magicVars.entrySet().iterator(); - - while (varIt.hasNext()) { - magicVarNames.add(varIt.next().getValue().getKeyword()); - } - } - - /** - * Initializes the macro-namelist - */ - private void loadMacronames() { - Iterator> it = macros.entrySet().iterator(); - - while (it.hasNext()) { - macroNames.add(it.next().getValue().getKeyword()); - } - } - @Override public Map getBinaryOperators() { return binaryOperator; @@ -188,28 +130,28 @@ public Map getMacros() { } @Override - public List getBinaryKeywords() { - return new ArrayList(binaryKeywords); + public Collection getBinaryKeywords() { + return new ArrayList(binaryOperator.keySet()); } @Override - public List getUnaryKeywords() { - return new ArrayList(unaryKeywords); + public Collection getUnaryKeywords() { + return new ArrayList(unaryOperator.keySet()); } @Override - public List getNularKeywords() { - return new ArrayList(nularKeywords); + public Collection getNularKeywords() { + return new ArrayList(nularOperator.keySet()); } @Override - public List getMagicVariableNames() { - return new ArrayList(macroNames); + public Collection getMagicVariableNames() { + return new ArrayList(magicVars.keySet()); } @Override - public List getMacroNames() { - return new ArrayList(macroNames); + public Collection getMacroNames() { + return new ArrayList(macros.keySet()); } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFLexer.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFLexer.java index f63279d5..a74aae6b 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFLexer.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFLexer.java @@ -2,7 +2,9 @@ package raven.sqdev.parser.sqf; - import java.util.List; + import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -90,21 +92,17 @@ public Vocabulary getVocabulary() { - protected List binaryOperators; - protected List unaryOperators; - protected List macroNames; + protected Collection binaryOperators; + protected Collection unaryOperators; + protected Collection macroNames; - public SQFLexer(CharStream input, List binaryOperators, List unaryOperators, List macroNames) { + public SQFLexer(CharStream input, Collection binaryOperators, Collection unaryOperators, Collection macroNames) { this(input); // make operators lowercase - for(int i=0; i can't really validate -> assume + // it's valid + declaredVariables.add(getFullText(variableNode)); + // abort as other checks and routines don't apply to macros + return; + } + + if (!varOperatorToken.getText().toLowerCase().equals("private")) { // only private is allowed as a modifier error(tokenBuffer.get(node.getIndex()), ProblemMessages.privateIsOnlyValidModifierForAssignments()); } @@ -520,6 +532,43 @@ protected DataTypeList getReturnValues(IndexTreeElement node) { } } + /** + * Gets the full text of a {@linkplain IndexTreeElement} which is the text of + * all its associated tokens + * + * @param node + * The node whose text should be obtained + * @return The text corresponding to the given node + */ + protected String getFullText(IndexTreeElement node) { + StringBuilder builder = new StringBuilder(); + + Collection indices = new ArrayList<>(); + getAllTokenIndices(node, indices); + + indices.stream().filter((e) -> { + return e.intValue() >= 0; + }).sorted().forEach((element) -> builder.append(tokenBuffer.get(element.intValue()).getText())); + + return builder.toString(); + } + + /** + * Gets all token indices associated with the given node and its sub-nodes + * + * @param node + * The node to process + * @param indices + * An integer collection to store the indices in + */ + protected void getAllTokenIndices(IndexTreeElement node, Collection indices) { + indices.add(node.getIndex()); + + if (node.hasChildren()) { + node.getChildren().forEach((e) -> getAllTokenIndices(e, indices)); + } + } + /** * Gets the result of this validation */ diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java index 5265e444..55a10cef 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java @@ -33,7 +33,7 @@ public class SQFProcessingTest { @Before public void setUp() throws Exception { - macros = new HashMap<>(); + macros = new HashMap(); info = getSQFInformation(macros); SQFTokenFactory factory = new SQFTokenFactory(info.getBinaryKeywords(), info.getUnaryKeywords()); @@ -117,6 +117,22 @@ public void assignments() throws IOException { assertTrue(result.getDeclaredLocalVariables().size() == 1); assertTrue(result.getMarkers().size() == 0); assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + + macros.put("GVAR", new Macro("GVAR")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("GVAR(myVar) = {}".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 1); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredGlobalVariables().keySet().contains("GVAR(myVar)")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("GVAR(myVar) = {}".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 1); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredGlobalVariables().keySet().contains("GVAR(myVar)")); + + macros.clear(); } @Test @@ -129,6 +145,22 @@ public void assignmentErros() throws IOException { assertEquals("Missing ';'", result.getMarkers().iterator().next().getMessage()); assertTrue(result.getDeclaredGlobalVariables().keySet().contains("myvar")); + + result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("= 3".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals("Missing ';'", + result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("=".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals("Missing ';'", + result.getMarkers().iterator().next().getMessage()); } From 78931c3732292ba8985fdbebbcac9e0ac639b3cf Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Sun, 1 Apr 2018 15:04:27 +0200 Subject: [PATCH 09/23] removed class files --- .../sqdev/editors/BasicCodeEditor$1.class | Bin 1279 -> 0 bytes .../sqdev/editors/BasicCodeEditor$2.class | Bin 801 -> 0 bytes .../sqdev/editors/BasicCodeEditor$3.class | Bin 1047 -> 0 bytes .../raven/sqdev/editors/BasicCodeEditor.class | Bin 17034 -> 0 bytes .../editors/BasicCompletionProposal$1.class | Bin 1053 -> 0 bytes .../editors/BasicCompletionProposal$2.class | Bin 1329 -> 0 bytes .../editors/BasicCompletionProposal.class | Bin 5465 -> 0 bytes .../editors/BasicContentAssistProcessor.class | Bin 3898 -> 0 bytes .../sqdev/editors/BasicDocumentProvider.class | Bin 1680 -> 0 bytes .../sqdev/editors/BasicFoldingManager.class | Bin 2972 -> 0 bytes .../editors/BasicInformationControl$1.class | Bin 1013 -> 0 bytes .../editors/BasicInformationControl$2.class | Bin 1520 -> 0 bytes ...asicInformationControl$InfoComposite.class | Bin 765 -> 0 bytes .../editors/BasicInformationControl.class | Bin 7084 -> 0 bytes .../sqdev/editors/BasicKeywordProvider.class | Bin 2488 -> 0 bytes .../sqdev/editors/BasicMarkerManager.class | Bin 4598 -> 0 bytes .../editors/BasicParseTimeListener$1.class | Bin 952 -> 0 bytes .../editors/BasicParseTimeListener.class | Bin 2085 -> 0 bytes .../sqdev/editors/BasicPartitionScanner.class | Bin 3938 -> 0 bytes .../BasicSourceViewerConfiguration.class | Bin 10136 -> 0 bytes .../sqdev/editors/BasicTextHover$1.class | Bin 993 -> 0 bytes .../raven/sqdev/editors/BasicTextHover.class | Bin 3029 -> 0 bytes .../raven/sqdev/editors/CharacterPair.class | Bin 1260 -> 0 bytes .../editors/CharacterPairHandler$1.class | Bin 687 -> 0 bytes .../sqdev/editors/CharacterPairHandler.class | Bin 6591 -> 0 bytes .../raven/sqdev/editors/ColorManager.class | Bin 1695 -> 0 bytes .../sqdev/editors/EditorKeyEventManager.class | Bin 2191 -> 0 bytes .../sqdev/editors/EditorKeyEventQueue.class | Bin 2311 -> 0 bytes .../raven/sqdev/editors/KeywordScanner.class | Bin 8634 -> 0 bytes .../sqdev/editors/MarkerInformation.class | Bin 3976 -> 0 bytes .../sqdev/editors/MultiKeywordScanner$1.class | Bin 1398 -> 0 bytes .../sqdev/editors/MultiKeywordScanner.class | Bin 4457 -> 0 bytes .../editors/NonRuleBasedDamagerRepairer.class | Bin 3678 -> 0 bytes .../raven/sqdev/editors/WordDetector.class | Bin 677 -> 0 bytes .../sqdev/editors/activator/Activator.class | Bin 1335 -> 0 bytes .../IllegalConstructorException.class | Bin 1867 -> 0 bytes .../IllegalModificationException.class | Bin 1114 -> 0 bytes .../exceptions/SQDevEditorException.class | Bin 1076 -> 0 bytes .../sqdev/editors/other/ConfigEditor.class | Bin 3214 -> 0 bytes .../editors/sqdevEditor/SQDevFileEditor.class | Bin 2901 -> 0 bytes .../stringTableEditor/Language$1.class | Bin 635 -> 0 bytes .../editors/stringTableEditor/Language.class | Bin 2608 -> 0 bytes .../StringTableCellEditingSupport$1.class | Bin 1539 -> 0 bytes .../StringTableCellEditingSupport$2.class | Bin 3863 -> 0 bytes .../StringTableCellEditingSupport.class | Bin 4605 -> 0 bytes .../StringTableCellLabelProvider.class | Bin 2614 -> 0 bytes .../StringTableContainer.class | Bin 4255 -> 0 bytes .../StringTableContentProvider.class | Bin 1161 -> 0 bytes .../StringTableEditor$1.class | Bin 2269 -> 0 bytes .../StringTableEditor$10.class | Bin 894 -> 0 bytes .../StringTableEditor$11.class | Bin 1440 -> 0 bytes .../StringTableEditor$12$1.class | Bin 3321 -> 0 bytes .../StringTableEditor$12.class | Bin 2377 -> 0 bytes .../StringTableEditor$13.class | Bin 1039 -> 0 bytes .../StringTableEditor$14.class | Bin 2506 -> 0 bytes .../StringTableEditor$15.class | Bin 1701 -> 0 bytes .../StringTableEditor$16.class | Bin 1034 -> 0 bytes .../StringTableEditor$17.class | Bin 1049 -> 0 bytes .../StringTableEditor$18.class | Bin 1019 -> 0 bytes .../StringTableEditor$2.class | Bin 3766 -> 0 bytes .../StringTableEditor$3$1.class | Bin 2177 -> 0 bytes .../StringTableEditor$3$2.class | Bin 1057 -> 0 bytes .../StringTableEditor$3.class | Bin 2713 -> 0 bytes .../StringTableEditor$4.class | Bin 2280 -> 0 bytes .../StringTableEditor$5.class | Bin 2456 -> 0 bytes .../StringTableEditor$6.class | Bin 1985 -> 0 bytes .../StringTableEditor$7.class | Bin 3119 -> 0 bytes .../StringTableEditor$8.class | Bin 1465 -> 0 bytes .../StringTableEditor$9.class | Bin 2009 -> 0 bytes .../stringTableEditor/StringTableEditor.class | Bin 26994 -> 0 bytes .../stringTableEditor/StringTableKey.class | Bin 5015 -> 0 bytes .../StringTablePackage.class | Bin 4192 -> 0 bytes ...StringTableSourceViewerConfiguration.class | Bin 1899 -> 0 bytes .../StringTableXMLEditor.class | Bin 5095 -> 0 bytes .../stringtableParsing/StringTable.tokens | 19 -------- .../StringTableBaseListener.class | Bin 8792 -> 0 bytes .../StringTableBaseVisitor.class | Bin 9093 -> 0 bytes .../stringtableParsing/StringTableLexer.class | Bin 5432 -> 0 bytes .../StringTableLexer.tokens | 19 -------- .../StringTableListener.class | Bin 4733 -> 0 bytes .../StringTableParser$ContainerContext.class | Bin 3219 -> 0 bytes ...ngTableParser$ContainerEndTagContext.class | Bin 2421 -> 0 bytes ...TableParser$ContainerStartTagContext.class | Bin 2647 -> 0 bytes .../StringTableParser$ContentContext.class | Bin 2623 -> 0 bytes ...StringTableParser$KeyCloseTagContext.class | Bin 2383 -> 0 bytes .../StringTableParser$KeyContext.class | Bin 3156 -> 0 bytes ...StringTableParser$KeyStartTagContext.class | Bin 2599 -> 0 bytes ...gTableParser$LanguageCloseTagContext.class | Bin 2422 -> 0 bytes .../StringTableParser$LanguageContext.class | Bin 3400 -> 0 bytes ...ngTableParser$LanguageOpenTagContext.class | Bin 2408 -> 0 bytes ...ringTableParser$PackageEndTagContext.class | Bin 2399 -> 0 bytes ...ngTableParser$PackageStartTagContext.class | Bin 2624 -> 0 bytes .../StringTableParser$PkgContext.class | Bin 3184 -> 0 bytes .../StringTableParser$ProjectContext.class | Bin 4046 -> 0 bytes ...ringTableParser$ProjectEndTagContext.class | Bin 2402 -> 0 bytes ...ngTableParser$ProjectStartTagContext.class | Bin 2628 -> 0 bytes .../StringTableParser.class | Bin 17609 -> 0 bytes .../StringTableVisitor.class | Bin 5978 -> 0 bytes .../StringTableWalkListener.class | Bin 6533 -> 0 bytes .../bin/raven/sqdev/activator/Activator.class | Bin 898 -> 0 bytes .../constants/ISQDevColorConstants.class | Bin 897 -> 0 bytes .../sqdev/constants/ProblemMessages.class | Bin 5543 -> 0 bytes .../constants/SQDevPreferenceConstants.class | Bin 2710 -> 0 bytes .../raven/sqdev/constants/TextConstants.class | Bin 637 -> 0 bytes .../sqdev/exceptions/BadSyntaxException.class | Bin 1054 -> 0 bytes .../FailedAtCreatingFileException.class | Bin 1083 -> 0 bytes .../IllegalAccessStateException.class | Bin 1081 -> 0 bytes .../IllegalConstructorException.class | Bin 1843 -> 0 bytes .../IllegalModificationException.class | Bin 1090 -> 0 bytes .../IllegalRGBSyntaxException.class | Bin 1075 -> 0 bytes .../exceptions/SQDevCollectionException.class | Bin 1666 -> 0 bytes .../sqdev/exceptions/SQDevCoreException.class | Bin 1012 -> 0 bytes .../exceptions/SQDevEditorException.class | Bin 1060 -> 0 bytes .../sqdev/exceptions/SQDevException.class | Bin 1024 -> 0 bytes .../SQDevFileIsInvalidException.class | Bin 1104 -> 0 bytes .../SQDevFileNoSuchAttributeException.class | Bin 1072 -> 0 bytes .../SQDevIllegalFileChangeException.class | Bin 1093 -> 0 bytes .../exceptions/SQDevSyntaxException.class | Bin 1039 -> 0 bytes .../exceptions/activator/Activator.class | Bin 920 -> 0 bytes .../AbstractFileSystemChangeListener.class | Bin 1453 -> 0 bytes .../fileSystemListener/EFileChangeType.class | Bin 1197 -> 0 bytes .../FileSystemChangeAdapter.class | Bin 2268 -> 0 bytes .../FileSystemChangeEvent.class | Bin 1783 -> 0 bytes .../FileSystemWatcher$1.class | Bin 3589 -> 0 bytes .../FileSystemWatcher.class | Bin 6179 -> 0 bytes .../SQFCommandCollector$1.class | Bin 972 -> 0 bytes .../infoCollection/SQFCommandCollector.class | Bin 32155 -> 0 bytes .../SQFCommandPageProvider.class | Bin 4231 -> 0 bytes .../infoCollection/base/ELocality$1.class | Bin 602 -> 0 bytes .../infoCollection/base/ELocality$2.class | Bin 603 -> 0 bytes .../infoCollection/base/ELocality$3.class | Bin 606 -> 0 bytes .../sqdev/infoCollection/base/ELocality.class | Bin 1859 -> 0 bytes .../sqdev/infoCollection/base/Keyword.class | Bin 4320 -> 0 bytes .../infoCollection/base/KeywordList.class | Bin 6062 -> 0 bytes .../infoCollection/base/SQFCommand.class | Bin 16831 -> 0 bytes .../infoCollection/base/SQFElement.class | Bin 3040 -> 0 bytes .../sqdev/infoCollection/base/Variable.class | Bin 1062 -> 0 bytes .../IAdditionalProposalInformation.class | Bin 352 -> 0 bytes .../sqdev/interfaces/IEditorKeyHandler.class | Bin 466 -> 0 bytes .../IFileSystemChangeListener.class | Bin 285 -> 0 bytes .../IKeywordListChangeListener.class | Bin 394 -> 0 bytes .../sqdev/interfaces/IKeywordProvider.class | Bin 517 -> 0 bytes .../sqdev/interfaces/IMacroSupport.class | Bin 370 -> 0 bytes .../bin/raven/sqdev/interfaces/IManager.class | Bin 183 -> 0 bytes .../sqdev/interfaces/IMarkerSupport.class | Bin 200 -> 0 bytes .../sqdev/interfaces/IPluginListener.class | Bin 219 -> 0 bytes .../IProposalInformationCategory.class | Bin 295 -> 0 bytes .../sqdev/interfaces/IReplaceTester.class | Bin 182 -> 0 bytes .../raven/sqdev/interfaces/ISaveable.class | Bin 313 -> 0 bytes .../sqdev/interfaces/IUpdateListener.class | Bin 158 -> 0 bytes .../sqdev/interfaces/IVersionListener.class | Bin 204 -> 0 bytes ...bstractAdditionalProposalInformation.class | Bin 3762 -> 0 bytes .../raven/sqdev/misc/AdvancedLineReader.class | Bin 5508 -> 0 bytes .../bin/raven/sqdev/misc/ArrayUtils.class | Bin 721 -> 0 bytes .../bin/raven/sqdev/misc/CharacterPair.class | Bin 2666 -> 0 bytes .../bin/raven/sqdev/misc/ColorUtils.class | Bin 1833 -> 0 bytes .../bin/raven/sqdev/misc/DataTypeList.class | Bin 3978 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$1.class | Bin 799 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$10.class | Bin 646 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$11.class | Bin 671 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$12.class | Bin 618 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$13.class | Bin 644 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$14.class | Bin 590 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$15.class | Bin 640 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$16.class | Bin 593 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$17.class | Bin 651 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$18.class | Bin 608 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$19.class | Bin 592 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$2.class | Bin 745 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$20.class | Bin 608 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$21.class | Bin 869 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$22.class | Bin 591 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$23.class | Bin 1297 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$24.class | Bin 1275 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$25.class | Bin 1275 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$26.class | Bin 1228 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$27.class | Bin 1277 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$28.class | Bin 1279 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$29.class | Bin 1277 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$3.class | Bin 1295 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$30.class | Bin 1279 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$31.class | Bin 1277 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$32.class | Bin 1281 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$33.class | Bin 1287 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$34.class | Bin 688 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$35.class | Bin 589 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$36.class | Bin 591 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$37.class | Bin 695 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$38.class | Bin 664 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$39.class | Bin 591 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$4.class | Bin 605 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$40.class | Bin 589 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$41.class | Bin 662 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$42.class | Bin 590 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$43.class | Bin 592 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$44.class | Bin 591 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$45.class | Bin 603 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$46.class | Bin 593 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$47.class | Bin 660 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$48.class | Bin 656 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$5.class | Bin 580 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$6.class | Bin 589 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$7.class | Bin 590 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$8.class | Bin 590 -> 0 bytes .../bin/raven/sqdev/misc/EDataType$9.class | Bin 664 -> 0 bytes .../bin/raven/sqdev/misc/EDataType.class | Bin 7624 -> 0 bytes .../bin/raven/sqdev/misc/FileUtil.class | Bin 5291 -> 0 bytes .../bin/raven/sqdev/misc/LineBuffer.class | Bin 3146 -> 0 bytes .../bin/raven/sqdev/misc/ListUtils.class | Bin 1052 -> 0 bytes .../bin/raven/sqdev/misc/Macro.class | Bin 730 -> 0 bytes .../bin/raven/sqdev/misc/Marker.class | Bin 2405 -> 0 bytes .../sqdev/misc/MultiPreferenceStore.class | Bin 7218 -> 0 bytes .../bin/raven/sqdev/misc/Pair.class | Bin 1246 -> 0 bytes .../bin/raven/sqdev/misc/SQDev.class | Bin 6571 -> 0 bytes .../bin/raven/sqdev/misc/SQDevComposite.class | Bin 439 -> 0 bytes .../bin/raven/sqdev/misc/SQDevInfobox$1.class | Bin 1927 -> 0 bytes .../bin/raven/sqdev/misc/SQDevInfobox.class | Bin 3640 -> 0 bytes .../sqdev/misc/SQDevPreferenceUtil.class | Bin 6886 -> 0 bytes .../raven/sqdev/misc/SQDevProjectNature.class | Bin 1007 -> 0 bytes .../StringProposalInformationCategory.class | Bin 1904 -> 0 bytes .../StyledProposalInformationCategory.class | Bin 3654 -> 0 bytes .../bin/raven/sqdev/misc/StyledRegion.class | Bin 2188 -> 0 bytes .../bin/raven/sqdev/misc/TextUtils.class | Bin 9241 -> 0 bytes .../bin/raven/sqdev/misc/TreeUtils.class | Bin 2078 -> 0 bytes .../bin/raven/sqdev/misc/UpdateReporter.class | Bin 1571 -> 0 bytes .../raven/sqdev/misc/VersionChangeEvent.class | Bin 1391 -> 0 bytes .../parser/misc/BasicErrorListener.class | Bin 2090 -> 0 bytes .../raven/sqdev/parser/misc/ParseUtil.class | Bin 13343 -> 0 bytes .../parser/preprocessor/Preprocessor.tokens | 31 ------------- .../PreprocessorBaseListener.class | Bin 4780 -> 0 bytes .../PreprocessorBaseVisitor.class | Bin 4939 -> 0 bytes .../PreprocessorErrorListener.class | Bin 1535 -> 0 bytes .../preprocessor/PreprocessorLexer.class | Bin 6075 -> 0 bytes .../preprocessor/PreprocessorLexer.tokens | 31 ------------- .../preprocessor/PreprocessorListener.class | Bin 2254 -> 0 bytes .../PreprocessorParseListener$1.class | Bin 2138 -> 0 bytes .../PreprocessorParseListener$2.class | Bin 2163 -> 0 bytes .../PreprocessorParseListener.class | Bin 9540 -> 0 bytes .../PreprocessorParseResult.class | Bin 1331 -> 0 bytes .../PreprocessorParser$DefineContext.class | Bin 3090 -> 0 bytes .../PreprocessorParser$ErrorContext.class | Bin 2824 -> 0 bytes .../PreprocessorParser$IncludeContext.class | Bin 2284 -> 0 bytes .../PreprocessorParser$MacroArgsContext.class | Bin 2735 -> 0 bytes .../PreprocessorParser$OtherContext.class | Bin 2214 -> 0 bytes .../PreprocessorParser$PrepIfContext.class | Bin 3405 -> 0 bytes ...rParser$PreprocessorStatementContext.class | Bin 3394 -> 0 bytes .../PreprocessorParser$StartContext.class | Bin 3521 -> 0 bytes .../PreprocessorParser$UndefineContext.class | Bin 2244 -> 0 bytes .../preprocessor/PreprocessorParser.class | Bin 15230 -> 0 bytes .../preprocessor/PreprocessorVisitor.class | Bin 3065 -> 0 bytes .../bin/raven/sqdev/parser/sqf/SQF.tokens | 42 ------------------ .../sqdev/parser/sqf/SQFBaseListener.class | Bin 7921 -> 0 bytes .../sqdev/parser/sqf/SQFBaseVisitor.class | Bin 8122 -> 0 bytes .../bin/raven/sqdev/parser/sqf/SQFLexer.class | Bin 10750 -> 0 bytes .../raven/sqdev/parser/sqf/SQFLexer.tokens | 40 ----------------- .../raven/sqdev/parser/sqf/SQFListener.class | Bin 3855 -> 0 bytes .../parser/sqf/SQFParser$ArrayContext.class | Bin 2294 -> 0 bytes .../sqf/SQFParser$AssignmentContext.class | Bin 2279 -> 0 bytes .../SQFParser$BinaryExpressionContext.class | Bin 2702 -> 0 bytes .../parser/sqf/SQFParser$CodeContext.class | Bin 2118 -> 0 bytes .../sqf/SQFParser$CommonErrorContext.class | Bin 2676 -> 0 bytes .../parser/sqf/SQFParser$ErrorContext.class | Bin 1441 -> 0 bytes .../sqf/SQFParser$InlineCodeContext.class | Bin 1700 -> 0 bytes .../sqf/SQFParser$MacroArgumentContext.class | Bin 2353 -> 0 bytes .../parser/sqf/SQFParser$MacroContext.class | Bin 2355 -> 0 bytes .../SQFParser$NularExpressionContext.class | Bin 968 -> 0 bytes .../sqf/SQFParser$NularOperatorContext.class | Bin 1477 -> 0 bytes .../parser/sqf/SQFParser$NumberContext.class | Bin 1318 -> 0 bytes .../sqf/SQFParser$OperatorContext.class | Bin 1645 -> 0 bytes .../sqf/SQFParser$ParenthesisContext.class | Bin 1754 -> 0 bytes .../SQFParser$PrimaryExpressionContext.class | Bin 2165 -> 0 bytes .../sqf/SQFParser$PunctuationContext.class | Bin 1361 -> 0 bytes .../parser/sqf/SQFParser$StartContext.class | Bin 1598 -> 0 bytes .../sqf/SQFParser$StatementContext.class | Bin 1898 -> 0 bytes .../parser/sqf/SQFParser$StringContext.class | Bin 1318 -> 0 bytes .../SQFParser$UnaryExpressionContext.class | Bin 2151 -> 0 bytes .../raven/sqdev/parser/sqf/SQFParser.class | Bin 23896 -> 0 bytes .../sqdev/parser/sqf/SQFSyntaxProcessor.class | Bin 7417 -> 0 bytes .../raven/sqdev/parser/sqf/SQFVisitor.class | Bin 5104 -> 0 bytes .../parser/sqf/tests/SQFParserTest$1.class | Bin 1214 -> 0 bytes .../parser/sqf/tests/SQFParserTest.class | Bin 10736 -> 0 bytes .../tests/TestScripts/VariableDeclaration.sqf | 39 ---------------- .../pluginManagement/ESQDevPlugin$1.class | Bin 616 -> 0 bytes .../pluginManagement/ESQDevPlugin$2.class | Bin 613 -> 0 bytes .../pluginManagement/ESQDevPlugin$3.class | Bin 626 -> 0 bytes .../pluginManagement/ESQDevPlugin$4.class | Bin 613 -> 0 bytes .../pluginManagement/ESQDevPlugin$5.class | Bin 611 -> 0 bytes .../pluginManagement/ESQDevPlugin$6.class | Bin 616 -> 0 bytes .../pluginManagement/ESQDevPlugin$7.class | Bin 620 -> 0 bytes .../sqdev/pluginManagement/ESQDevPlugin.class | Bin 2833 -> 0 bytes .../pluginManagement/ResourceManager.class | Bin 8986 -> 0 bytes .../SQDevEclipseEventManager$1$1.class | Bin 3191 -> 0 bytes .../SQDevEclipseEventManager$1.class | Bin 2327 -> 0 bytes .../SQDevEclipseEventManager.class | Bin 1601 -> 0 bytes .../pluginManagement/SQDevPluginManager.class | Bin 4174 -> 0 bytes .../pluginManagement/VersionManager.class | Bin 4761 -> 0 bytes .../bin/raven/sqdev/styles/BoldStyle.class | Bin 672 -> 0 bytes .../bin/raven/sqdev/styles/CodeStyle.class | Bin 1784 -> 0 bytes .../bin/raven/sqdev/styles/SQDevStyle.class | Bin 3652 -> 0 bytes .../bin/raven/sqdev/syntax/Syntax.class | Bin 5941 -> 0 bytes .../raven/sqdev/syntax/SyntaxElement.class | Bin 4167 -> 0 bytes .../bin/raven/sqdev/activator/Activator.class | Bin 1303 -> 0 bytes .../sqfeditor/SQFKeywordProvider.class | Bin 1779 -> 0 bytes ...$DecreasingCharArrayLengthComparator.class | Bin 909 -> 0 bytes .../sqfeditor/SQFStringPartitionRule.class | Bin 3738 -> 0 bytes .../editors/sqfeditor/SQF_Editor$1.class | Bin 2618 -> 0 bytes .../sqdev/editors/sqfeditor/SQF_Editor.class | Bin 14460 -> 0 bytes .../exceptions/IllegalBlankException.class | Bin 1101 -> 0 bytes .../bundles/rptViewerFindDialog.properties | 4 -- .../bin/raven/sqdev/ui/Activator.class | Bin 862 -> 0 bytes .../ui/commands/CreatePluginInfo$1.class | Bin 1645 -> 0 bytes .../sqdev/ui/commands/CreatePluginInfo.class | Bin 2204 -> 0 bytes .../ui/commands/ShowParseTreeHandler.class | Bin 1845 -> 0 bytes .../ui/perspectives/SQDevPerspective.class | Bin 1537 -> 0 bytes .../sqdev/ui/util/GraphicsSupport$1.class | Bin 1500 -> 0 bytes .../raven/sqdev/ui/util/GraphicsSupport.class | Bin 3736 -> 0 bytes .../sqdev/ui/util/ITreeTextProvider.class | Bin 208 -> 0 bytes .../bin/raven/sqdev/ui/util/IndexPair.class | Bin 3359 -> 0 bytes .../util/JFileChooserConfirmOverwrite.class | Bin 980 -> 0 bytes ...tAdaptor$AntlrTreeChildrenIterable$1.class | Bin 1737 -> 0 bytes ...outAdaptor$AntlrTreeChildrenIterable.class | Bin 1204 -> 0 bytes ...r$AntlrTreeChildrenReverseIterable$1.class | Bin 1782 -> 0 bytes ...tor$AntlrTreeChildrenReverseIterable.class | Bin 1246 -> 0 bytes .../sqdev/ui/util/TreeLayoutAdaptor.class | Bin 2707 -> 0 bytes .../raven/sqdev/ui/util/TreeViewer$1.class | Bin 921 -> 0 bytes .../raven/sqdev/ui/util/TreeViewer$2.class | Bin 893 -> 0 bytes .../raven/sqdev/ui/util/TreeViewer$3.class | Bin 1006 -> 0 bytes .../raven/sqdev/ui/util/TreeViewer$4.class | Bin 1496 -> 0 bytes .../raven/sqdev/ui/util/TreeViewer$5.class | Bin 1803 -> 0 bytes .../raven/sqdev/ui/util/TreeViewer$6.class | Bin 962 -> 0 bytes .../TreeViewer$DefaultTreeTextProvider.class | Bin 1127 -> 0 bytes .../sqdev/ui/util/TreeViewer$EmptyIcon.class | Bin 896 -> 0 bytes .../ui/util/TreeViewer$TreeNodeWrapper.class | Bin 990 -> 0 bytes .../TreeViewer$VariableExtentProvide.class | Bin 1863 -> 0 bytes .../bin/raven/sqdev/ui/util/TreeViewer.class | Bin 21559 -> 0 bytes .../raven/sqdev/ui/views/RPTViewer$1$1.class | Bin 1969 -> 0 bytes .../raven/sqdev/ui/views/RPTViewer$1.class | Bin 3798 -> 0 bytes .../raven/sqdev/ui/views/RPTViewer$2.class | Bin 1099 -> 0 bytes .../raven/sqdev/ui/views/RPTViewer$3.class | Bin 1903 -> 0 bytes .../raven/sqdev/ui/views/RPTViewer$4.class | Bin 1035 -> 0 bytes .../raven/sqdev/ui/views/RPTViewer$5$1.class | Bin 1160 -> 0 bytes .../raven/sqdev/ui/views/RPTViewer$5$2.class | Bin 1160 -> 0 bytes .../raven/sqdev/ui/views/RPTViewer$5$3.class | Bin 1160 -> 0 bytes .../raven/sqdev/ui/views/RPTViewer$5.class | Bin 2348 -> 0 bytes .../bin/raven/sqdev/ui/views/RPTViewer.class | Bin 23446 -> 0 bytes .../raven/sqdev/actions/WikiAction$1.class | Bin 1075 -> 0 bytes .../bin/raven/sqdev/actions/WikiAction.class | Bin 1771 -> 0 bytes .../bin/raven/sqdev/activator/Activator.class | Bin 1021 -> 0 bytes .../FailedAtCreatingFileException.class | Bin 1083 -> 0 bytes .../IllegalAccessStateException.class | Bin 1081 -> 0 bytes .../IllegalRGBSyntaxException.class | Bin 1075 -> 0 bytes .../sqdev/exceptions/SQDevCoreException.class | Bin 1012 -> 0 bytes .../sqdev/exceptions/SQDevException.class | Bin 1024 -> 0 bytes .../SQDevFileIsInvalidException.class | Bin 1104 -> 0 bytes .../SQDevFileNoSuchAttributeException.class | Bin 1072 -> 0 bytes .../SQDevIllegalFileChangeException.class | Bin 1093 -> 0 bytes .../SQDevInvalidPreferenceException.class | Bin 1781 -> 0 bytes ...AdditionalKeywordProposalInformation.class | Bin 4611 -> 0 bytes .../sqdevFile/ESQDevFileAnnotation$1.class | Bin 751 -> 0 bytes .../sqdevFile/ESQDevFileAnnotation$2.class | Bin 774 -> 0 bytes .../sqdevFile/ESQDevFileAnnotation.class | Bin 2847 -> 0 bytes .../sqdevFile/ESQDevFileAttribute$1.class | Bin 879 -> 0 bytes .../sqdevFile/ESQDevFileAttribute$2.class | Bin 837 -> 0 bytes .../sqdevFile/ESQDevFileAttribute$3.class | Bin 828 -> 0 bytes .../sqdevFile/ESQDevFileAttribute$4.class | Bin 851 -> 0 bytes .../sqdev/sqdevFile/ESQDevFileAttribute.class | Bin 2691 -> 0 bytes .../sqdev/sqdevFile/ESQDevFileType$1.class | Bin 2643 -> 0 bytes .../sqdev/sqdevFile/ESQDevFileType.class | Bin 4031 -> 0 bytes .../bin/raven/sqdev/sqdevFile/SQDevFile.class | Bin 9557 -> 0 bytes .../raven/sqdev/startup/SQDevStarter.class | Bin 7938 -> 0 bytes .../bin/raven/sqdev/util/Activator.class | Bin 774 -> 0 bytes .../bin/raven/sqdev/util/EFileType$1.class | Bin 1699 -> 0 bytes .../bin/raven/sqdev/util/EFileType$2.class | Bin 1450 -> 0 bytes .../bin/raven/sqdev/util/EFileType$3.class | Bin 2270 -> 0 bytes .../bin/raven/sqdev/util/EFileType$4.class | Bin 630 -> 0 bytes .../bin/raven/sqdev/util/EFileType$5.class | Bin 630 -> 0 bytes .../bin/raven/sqdev/util/EFileType$6.class | Bin 1611 -> 0 bytes .../bin/raven/sqdev/util/EFileType$7.class | Bin 824 -> 0 bytes .../bin/raven/sqdev/util/EFileType$8$1.class | Bin 1772 -> 0 bytes .../bin/raven/sqdev/util/EFileType$8.class | Bin 4689 -> 0 bytes .../bin/raven/sqdev/util/EFileType$9.class | Bin 4249 -> 0 bytes .../bin/raven/sqdev/util/EFileType.class | Bin 5463 -> 0 bytes .../bin/raven/sqdev/util/EProjectType.class | Bin 6146 -> 0 bytes .../bin/raven/sqdev/util/EditorUtil.class | Bin 1940 -> 0 bytes .../bin/raven/sqdev/util/FileSystemUtil.class | Bin 5554 -> 0 bytes .../bin/raven/sqdev/util/ProjectUtil$1.class | Bin 1771 -> 0 bytes .../bin/raven/sqdev/util/ProjectUtil.class | Bin 13059 -> 0 bytes .../raven/sqdev/util/SQDevInformation.class | Bin 3558 -> 0 bytes .../sqdev/util/SQDevProjectBuilder.class | Bin 8356 -> 0 bytes .../bin/raven/sqdev/util/StringUtils.class | Bin 3307 -> 0 bytes .../bin/raven/sqdev/util/Util$1.class | Bin 1684 -> 0 bytes .../bin/raven/sqdev/util/Util.class | Bin 9321 -> 0 bytes .../ISQDevInformationProvider.class | Bin 223 -> 0 bytes .../wizards/SQDevBaseNewFileWizard.class | Bin 383 -> 0 bytes .../wizards/SQDevBaseNewProjectWizard.class | Bin 2321 -> 0 bytes .../sqdev/wizards/activator/Activator.class | Bin 1060 -> 0 bytes .../FailedAtCreatingFileException.class | Bin 1099 -> 0 bytes .../wizards/export/SQDevExportWizard$1.class | Bin 1983 -> 0 bytes .../wizards/export/SQDevExportWizard.class | Bin 4209 -> 0 bytes .../export/SQDevExportWizardPage$1.class | Bin 913 -> 0 bytes .../export/SQDevExportWizardPage$2.class | Bin 1715 -> 0 bytes .../export/SQDevExportWizardPage.class | Bin 4371 -> 0 bytes .../importWizard/SQDevImportWizard$1.class | Bin 1483 -> 0 bytes .../importWizard/SQDevImportWizard.class | Bin 1543 -> 0 bytes .../SQDevImportWizardPage$1.class | Bin 943 -> 0 bytes .../SQDevImportWizardPage$2.class | Bin 1815 -> 0 bytes .../importWizard/SQDevImportWizardPage.class | Bin 4923 -> 0 bytes .../sqdevProject/SQDevProjectWizard.class | Bin 1602 -> 0 bytes .../SQDevProjectWizardPage$1.class | Bin 944 -> 0 bytes .../SQDevProjectWizardPage$2.class | Bin 2039 -> 0 bytes .../SQDevProjectWizardPage$3.class | Bin 944 -> 0 bytes .../SQDevProjectWizardPage$4.class | Bin 944 -> 0 bytes .../SQDevProjectWizardPage$5.class | Bin 1048 -> 0 bytes .../sqdevProject/SQDevProjectWizardPage.class | Bin 9882 -> 0 bytes .../sqfNewFileWizard/SqfNewFileWizard.class | Bin 2977 -> 0 bytes .../SqfNewFileWizardPage$1.class | Bin 952 -> 0 bytes .../SqfNewFileWizardPage.class | Bin 5752 -> 0 bytes .../stringtable/StringTableWizard.class | Bin 1563 -> 0 bytes .../stringtable/StringTableWizardPage.class | Bin 4210 -> 0 bytes .../preferences/activator/Activator.class | Bin 1166 -> 0 bytes .../SQDevPreferenceInitializer.class | Bin 5209 -> 0 bytes .../sqdev/preferences/pages/EStatus.class | Bin 1506 -> 0 bytes .../pages/ISQDevPreferencePage.class | Bin 198 -> 0 bytes .../pages/SQDevEditorPreferencePage.class | Bin 4521 -> 0 bytes .../pages/SQDevGeneralPreferencePage$1.class | Bin 3136 -> 0 bytes .../pages/SQDevGeneralPreferencePage.class | Bin 5177 -> 0 bytes .../pages/SQDevLinkingPreferencePage.class | Bin 1494 -> 0 bytes .../pages/SQDevMiscPreferencePage$1.class | Bin 1199 -> 0 bytes .../pages/SQDevMiscPreferencePage$2.class | Bin 1250 -> 0 bytes .../pages/SQDevMiscPreferencePage$3$1.class | Bin 1416 -> 0 bytes .../pages/SQDevMiscPreferencePage$3.class | Bin 5763 -> 0 bytes .../pages/SQDevMiscPreferencePage.class | Bin 5245 -> 0 bytes .../pages/SQDevPreferencePage.class | Bin 8806 -> 0 bytes .../pages/SQDevViewsPreferencePage.class | Bin 2457 -> 0 bytes .../AbstractSQDevPreferenceEditor.class | Bin 11044 -> 0 bytes .../BooleanSQDevPreferenceEditor$1.class | Bin 1446 -> 0 bytes .../BooleanSQDevPreferenceEditor.class | Bin 4864 -> 0 bytes .../ColorSQDevPreferenceEditor$1.class | Bin 2045 -> 0 bytes .../ColorSQDevPreferenceEditor.class | Bin 5877 -> 0 bytes .../ComboSQDevPreferenceEditor$1.class | Bin 1418 -> 0 bytes .../ComboSQDevPreferenceEditor.class | Bin 5741 -> 0 bytes .../DirectorySQDevPreferenceEditor$1.class | Bin 1045 -> 0 bytes .../DirectorySQDevPreferenceEditor$2.class | Bin 1984 -> 0 bytes .../DirectorySQDevPreferenceEditor.class | Bin 8366 -> 0 bytes .../ISQDevPreferenceEditor.class | Bin 1383 -> 0 bytes .../IntegerSQDevPreferenceEditor$1.class | Bin 1553 -> 0 bytes .../IntegerSQDevPreferenceEditor.class | Bin 5447 -> 0 bytes .../MultiStringPreferenceEditor$1.class | Bin 1471 -> 0 bytes ...ngPreferenceEditor$1ContainerUpdater.class | Bin 1163 -> 0 bytes .../MultiStringPreferenceEditor$2.class | Bin 1831 -> 0 bytes .../MultiStringPreferenceEditor$3$1.class | Bin 1964 -> 0 bytes .../MultiStringPreferenceEditor$3.class | Bin 3077 -> 0 bytes .../MultiStringPreferenceEditor$4.class | Bin 2248 -> 0 bytes .../MultiStringPreferenceEditor$5.class | Bin 1124 -> 0 bytes .../MultiStringPreferenceEditor$6.class | Bin 3173 -> 0 bytes .../MultiStringPreferenceEditor.class | Bin 10878 -> 0 bytes .../ValueSQDevPreferenceEditor$1.class | Bin 1266 -> 0 bytes .../ValueSQDevPreferenceEditor.class | Bin 5076 -> 0 bytes .../sqdev/preferences/util/EStatus.class | Bin 1500 -> 0 bytes .../util/ISQDevPreferenceEditorListener.class | Bin 252 -> 0 bytes .../preferences/util/SQDevChangeEvent.class | Bin 821 -> 0 bytes .../SQDevInvalidPreferenceException.class | Bin 1793 -> 0 bytes .../util/SQDevPreferenceComposite.class | Bin 968 -> 0 bytes 463 files changed, 225 deletions(-) delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCodeEditor$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCodeEditor$2.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCodeEditor$3.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCodeEditor.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCompletionProposal$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCompletionProposal$2.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCompletionProposal.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicContentAssistProcessor.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicDocumentProvider.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicFoldingManager.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicInformationControl$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicInformationControl$2.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicInformationControl$InfoComposite.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicInformationControl.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicKeywordProvider.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicMarkerManager.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicParseTimeListener$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicParseTimeListener.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicPartitionScanner.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicSourceViewerConfiguration.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicTextHover$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicTextHover.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/CharacterPair.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/CharacterPairHandler$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/CharacterPairHandler.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/ColorManager.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/EditorKeyEventManager.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/EditorKeyEventQueue.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/KeywordScanner.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/MarkerInformation.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/MultiKeywordScanner$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/MultiKeywordScanner.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/NonRuleBasedDamagerRepairer.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/WordDetector.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/activator/Activator.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/exceptions/IllegalConstructorException.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/exceptions/IllegalModificationException.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/exceptions/SQDevEditorException.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/other/ConfigEditor.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/sqdevEditor/SQDevFileEditor.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/Language$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/Language.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableCellEditingSupport$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableCellEditingSupport$2.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableCellEditingSupport.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableCellLabelProvider.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableContainer.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableContentProvider.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$10.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$11.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$12$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$12.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$13.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$14.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$15.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$16.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$17.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$18.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$2.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$3$1.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$3$2.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$3.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$4.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$5.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$6.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$7.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$8.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$9.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableKey.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTablePackage.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableSourceViewerConfiguration.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTable.tokens delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableBaseListener.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableBaseVisitor.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableLexer.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableLexer.tokens delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableListener.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$ContainerContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$ContainerEndTagContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$ContainerStartTagContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$ContentContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$KeyCloseTagContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$KeyContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$KeyStartTagContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$LanguageCloseTagContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$LanguageContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$LanguageOpenTagContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$PackageEndTagContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$PackageStartTagContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$PkgContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$ProjectContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$ProjectEndTagContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$ProjectStartTagContext.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableVisitor.class delete mode 100644 plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableWalkListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/activator/Activator.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/ISQDevColorConstants.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/ProblemMessages.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/SQDevPreferenceConstants.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/TextConstants.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/BadSyntaxException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/FailedAtCreatingFileException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/IllegalAccessStateException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/IllegalConstructorException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/IllegalModificationException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/IllegalRGBSyntaxException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevCollectionException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevCoreException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevEditorException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevFileIsInvalidException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevFileNoSuchAttributeException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevIllegalFileChangeException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevSyntaxException.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/activator/Activator.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/AbstractFileSystemChangeListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/EFileChangeType.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemChangeAdapter.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemChangeEvent.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemWatcher$1.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemWatcher.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/SQFCommandCollector$1.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/SQFCommandCollector.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/SQFCommandPageProvider.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/ELocality$1.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/ELocality$2.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/ELocality$3.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/ELocality.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/Keyword.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/KeywordList.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/SQFCommand.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/SQFElement.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/Variable.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IAdditionalProposalInformation.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IEditorKeyHandler.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IFileSystemChangeListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IKeywordListChangeListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IKeywordProvider.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IMacroSupport.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IManager.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IMarkerSupport.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IPluginListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IProposalInformationCategory.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IReplaceTester.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/ISaveable.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IUpdateListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IVersionListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/AbstractAdditionalProposalInformation.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/AdvancedLineReader.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/ArrayUtils.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/CharacterPair.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/ColorUtils.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/DataTypeList.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$1.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$10.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$11.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$12.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$13.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$14.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$15.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$16.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$17.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$18.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$19.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$2.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$20.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$21.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$22.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$23.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$24.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$25.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$26.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$27.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$28.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$29.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$3.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$30.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$31.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$32.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$33.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$34.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$35.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$36.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$37.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$38.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$39.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$4.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$40.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$41.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$42.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$43.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$44.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$45.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$46.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$47.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$48.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$5.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$6.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$7.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$8.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$9.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/FileUtil.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/LineBuffer.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/ListUtils.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/Macro.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/Marker.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/MultiPreferenceStore.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/Pair.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDev.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDevComposite.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDevInfobox$1.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDevInfobox.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDevPreferenceUtil.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDevProjectNature.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/StringProposalInformationCategory.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/StyledProposalInformationCategory.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/StyledRegion.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/TextUtils.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/TreeUtils.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/UpdateReporter.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/VersionChangeEvent.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/BasicErrorListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/Preprocessor.tokens delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorBaseListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorBaseVisitor.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorErrorListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorLexer.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorLexer.tokens delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener$1.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener$2.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseResult.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$DefineContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$ErrorContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$IncludeContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$MacroArgsContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$OtherContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$PrepIfContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$PreprocessorStatementContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$StartContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$UndefineContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorVisitor.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQF.tokens delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFBaseListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFBaseVisitor.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFLexer.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFLexer.tokens delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFListener.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$ArrayContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$AssignmentContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$BinaryExpressionContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$CodeContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$CommonErrorContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$ErrorContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$InlineCodeContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$MacroArgumentContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$MacroContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$NularExpressionContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$NularOperatorContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$NumberContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$OperatorContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$ParenthesisContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$PrimaryExpressionContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$PunctuationContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$StartContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$StatementContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$StringContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$UnaryExpressionContext.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFSyntaxProcessor.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFVisitor.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/tests/SQFParserTest$1.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/tests/SQFParserTest.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/tests/TestScripts/VariableDeclaration.sqf delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$1.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$2.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$3.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$4.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$5.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$6.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$7.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ResourceManager.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/SQDevEclipseEventManager$1$1.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/SQDevEclipseEventManager$1.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/SQDevEclipseEventManager.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/SQDevPluginManager.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/VersionManager.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/styles/BoldStyle.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/styles/CodeStyle.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/styles/SQDevStyle.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/syntax/Syntax.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/syntax/SyntaxElement.class delete mode 100644 plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/activator/Activator.class delete mode 100644 plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQFKeywordProvider.class delete mode 100644 plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQFStringPartitionRule$DecreasingCharArrayLengthComparator.class delete mode 100644 plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQFStringPartitionRule.class delete mode 100644 plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor$1.class delete mode 100644 plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor.class delete mode 100644 plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/exceptions/IllegalBlankException.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/bundles/rptViewerFindDialog.properties delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/Activator.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/commands/CreatePluginInfo$1.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/commands/CreatePluginInfo.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/commands/ShowParseTreeHandler.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/perspectives/SQDevPerspective.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/GraphicsSupport$1.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/GraphicsSupport.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/ITreeTextProvider.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/IndexPair.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/JFileChooserConfirmOverwrite.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenIterable$1.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenIterable.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenReverseIterable$1.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenReverseIterable.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$1.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$2.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$3.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$4.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$5.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$6.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$DefaultTreeTextProvider.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$EmptyIcon.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$TreeNodeWrapper.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$VariableExtentProvide.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$1$1.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$1.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$2.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$3.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$4.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$1.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$2.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$3.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5.class delete mode 100644 plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/actions/WikiAction$1.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/actions/WikiAction.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/activator/Activator.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/FailedAtCreatingFileException.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/IllegalAccessStateException.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/IllegalRGBSyntaxException.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevCoreException.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevException.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevFileIsInvalidException.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevFileNoSuchAttributeException.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevIllegalFileChangeException.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevInvalidPreferenceException.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/miscellaneous/AdditionalKeywordProposalInformation.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAnnotation$1.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAnnotation$2.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAnnotation.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute$1.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute$2.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute$3.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute$4.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileType$1.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileType.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/SQDevFile.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/startup/SQDevStarter.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/Activator.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$1.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$2.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$3.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$4.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$5.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$6.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$7.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$8$1.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$8.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$9.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EProjectType.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EditorUtil.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/FileSystemUtil.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/ProjectUtil$1.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/ProjectUtil.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/SQDevInformation.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/SQDevProjectBuilder.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/StringUtils.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/Util$1.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/util/Util.class delete mode 100644 plugin/Raven.SQDev.Util/bin/raven/sqdev/utilInterfaces/ISQDevInformationProvider.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/SQDevBaseNewFileWizard.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/SQDevBaseNewProjectWizard.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/activator/Activator.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/exceptions/FailedAtCreatingFileException.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/export/SQDevExportWizard$1.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/export/SQDevExportWizard.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/export/SQDevExportWizardPage$1.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/export/SQDevExportWizardPage$2.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/export/SQDevExportWizardPage.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizard$1.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizard.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizardPage$1.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizardPage$2.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqdevProject/SQDevProjectWizard.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqdevProject/SQDevProjectWizardPage$1.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqdevProject/SQDevProjectWizardPage$2.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqdevProject/SQDevProjectWizardPage$3.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqdevProject/SQDevProjectWizardPage$4.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqdevProject/SQDevProjectWizardPage$5.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqdevProject/SQDevProjectWizardPage.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqfNewFileWizard/SqfNewFileWizard.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqfNewFileWizard/SqfNewFileWizardPage$1.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqfNewFileWizard/SqfNewFileWizardPage.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/stringtable/StringTableWizard.class delete mode 100644 plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/stringtable/StringTableWizardPage.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/activator/Activator.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/initializer/SQDevPreferenceInitializer.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/EStatus.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/ISQDevPreferencePage.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevEditorPreferencePage.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevGeneralPreferencePage$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevGeneralPreferencePage.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevLinkingPreferencePage.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$2.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$3$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$3.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevPreferencePage.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevViewsPreferencePage.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/AbstractSQDevPreferenceEditor.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/BooleanSQDevPreferenceEditor$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/BooleanSQDevPreferenceEditor.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ColorSQDevPreferenceEditor$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ColorSQDevPreferenceEditor.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ComboSQDevPreferenceEditor$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ComboSQDevPreferenceEditor.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/DirectorySQDevPreferenceEditor$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/DirectorySQDevPreferenceEditor$2.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/DirectorySQDevPreferenceEditor.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ISQDevPreferenceEditor.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/IntegerSQDevPreferenceEditor$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/IntegerSQDevPreferenceEditor.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$1ContainerUpdater.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$2.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$3$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$3.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$4.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$5.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$6.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ValueSQDevPreferenceEditor$1.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ValueSQDevPreferenceEditor.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/EStatus.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/ISQDevPreferenceEditorListener.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/SQDevChangeEvent.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/SQDevInvalidPreferenceException.class delete mode 100644 plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/SQDevPreferenceComposite.class diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCodeEditor$1.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCodeEditor$1.class deleted file mode 100644 index 02760f60c6e9631290aa45ea686c6456b8e88ecb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1279 zcmb7ET~8B16g{^s6xs!91yn#qX{9a5QV8zJUwrT{nHcXZ8zd&gvdQk;d*^NJm9Qvbu~0n!OwJCz8gVR)3sJBw%%V)_JuOIB zDf|b_^HUl&^{ofOc~ukp5p7Z@?oXAu9fSYeuNiZNn1L1TG+kfmMok90Zr#FtJYeFt z_6^KT=0eD6YfWqEtu}@4OCRG*={Ub#h-ET{<3J{B7|wS*#%~%H@Ak3ui1j$H1Er}W z^q0ntkSTpa_I>C$#NSjHKuFOvhFLd(?2aqA$}8a-2BTE(*wgIQN*~bw86!VXiKJtU z6C(LL@`spaC3A>;Wc!BvF(yx4jP)Z*$C!!1G!lntWCYz@ZYqq6I9`BC51> lrmfgc5Ph4tbz=+-rIc?dGzh0ibro?yDncqzkb(jisvz~Yu}8^P?rzw1^1qPy zkb2<81;JlJ%$kTp4=7l&cjoQPo0&KM{_E^3fG5}qQ4@G*<(zct-sdz=DOaVjE`1@L z%DN_}UInx|Ap(ItW5+3Fg_=4_Gh->WGhM1vN>9wlrLWAWJCS-!hq;`VWCd2siE^!d zE;3l6$^j=lQ(BeJ1(IZ`jP_6<@O?HQa3RJDRwLALF-C|>0`mjZQ>@1;6 zj2pNq5KX0Z)YsElSxt5;S_wpsr=|5c*d^h;o?#&3u<#v5!sW#1#w?&DAV`GWXE z6|?TK>V~Hg-_T?~<{Xb+#s;4PSFpKYIpou`G*m&wv-PjR$N+eCNyZ^Baex!o>gp diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCodeEditor$3.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCodeEditor$3.class deleted file mode 100644 index 91287570a9c3b4e5aaa1f476c6e47ea5618bd56b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1047 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 O4`*QPtNi~H`1ikQ17t)1 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCompletionProposal$1.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCompletionProposal$1.class deleted file mode 100644 index 76da3ca557d2072d2ba530a265e150a873662c4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1053 zcmb7DVQW({6g_EcpRG?O=^;L{w)2V zLj`|;KT5pmia5$9eGp#m&AsQIdvf#Z_xGOwp5jr248vn9MpAS4p(96Jc9b{P@t4A> zq+tfbRC;CfTWf~KiL_jckYgzI#Ypf}=q}%B_hsTE%y>IY5gmsJM#QUb-L0!zT1;&T3{(3Mi8I678Oo9X!R2 z>KDWt$GGx&9CJ1J#wQ{BE9S|LDJOWZ;X3^pZeU@8vW46U$`35QuV#;N^Akm65K!{t mtZ!q4g_EcWLcm(a9XikA?l^vh7=y4@v4)4V3oJuT`u+gHQY7dA diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCompletionProposal$2.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCompletionProposal$2.class deleted file mode 100644 index 1805f551b1029caddd9516b1d194368b924aab97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1329 zcmb7ET~pIQ6g^9;u_Z#OilQJ060cHvqR$GBCohqU<*JE&a~rZHv1iluBDq zY%QF!Yz7_=h4eR+45YTb+`54zQKYI{-0?)9xwX4vJKSmuzQ>7J3p*ZnYoQW;Jr_?D z!|AXgbZ(7^)gh9Vi1@tb>bcne<@$>?V8>Tt-7*< zhH$jC$=`=Du2k4cV-lAPTx6K)#kYjD;o0GiRL$2F6H~a%VAgr~Myj{l+;9M?SrnV7{KLz;A-3LSWMhhgD}YE<~1a0#NVE~u2oJaPsW7-oBG zJ^^atIu;qmh+gaHkT=WHle9w?@|FJL`}z}uN-5;AY@om}e>BVSPMRp<2K@>(jMtTH z`7Xm;Uwcl-z>o_6Ed@hvF#K@AC`C=Sl*6BkXa`LXFwW|(-L`4VJ@Xw;YVyVl9yX+F z;1)x12v3-}gS!lqQU7A6b(i44a16^wR%@_1X@i;--{-3A*;;dL-~q#8Z(|2@$(RS$ z#vJ)8L5B&;WFnK%+X&qT&QLr>Z}({)MbgW~eR_O?`60%PN3r+|Bi;{WXl@cGicTO) zBf~kI@2b3_9Fa=4_!$?z;0i+~^%2+hv2>`GMUoIdDeEtc(KvzMvFhXjv#UxPSivgk fCSVbM1Z%iSV-o9hAl{2|P%J@pKTJkvM|}MSr*m?I diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCompletionProposal.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicCompletionProposal.class deleted file mode 100644 index 79c6cdd5221b06366ae5c839616a876d1d3c32c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5465 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 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicContentAssistProcessor.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicContentAssistProcessor.class deleted file mode 100644 index 26b3ca8063be5568c7dfa29761c428428e430f02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3898 zcmcInYgZFj6x}xjM#CT#U!c_Dt0t&SwLS?|5wJ!hK2R*hwhohGP4A>Y zJpN1)iE)AGke!h+G@(t!TC5XjiYLa`f-b30utuOgZRX`@adt{N*Yqh%3Us7xL$}6t z$Ml~|FQeYH=?WZtn&Nu&(d?~;JzFSxa)=j8dZwKxxdq$REdox((+yZmT_cy{rks~f zGL@KYv~301%atTs(TS}Jx&(Hvu1du=bPKfRq&I9E#aSkV!0vdWk@{45S2Bj}=uz;B zz_#je7CqC_!Vq5Pt%@DkDX@k3H*6N?h#kcz5QBE6K5W1eH? zb5y?@uPWG6ldR#IioJ-_C(lmXWOGP&8Rd=isSZdl_AA&Yu&dgKWyhqPk}3|MPhb;$ zDIcJ$nJYTFA7g=|)X)%R%q}{H48zL}CJkCv8CYg6 z$b0jon+dnR>~|2Di+Ulc;HbccfQ#VWpyTNG(yRe796?(vPJmnb1=^OjP)x-D-r$*> z)2*T;Zf6bdkZoBk6Xb#EcM5|FPLuK_fTeX6XD~z@*K?#k%jBuS3EygrBNu7L2#;Vx zR_Yg;-3MbB#+&}}KPPbZsimXt30|2diSbsPM_R!JX7Z9#HO8vAh*A2LH7!p%0w>}j zPC#+Cm=DO&E<4OEL-%B|l#Ri14G;-DkIO2qgf!WXCo>AhUVw;0FUjp%tx#RT3KSjW>nq8rnfoQ$Nm0zGw^VDMa)8z-3<_w(+iig)lX>$hv(=V@it zPARx0aJ)eYGnV(9(Zol;?d7AT$_B)Q*7CadfZds~vlHVA4}zhmlU1(N@v3M-gq zaeF4~S2l_@m=VAlSj@LkyQfg@A3bc#rscP(9WmsP_hV}d{7_;zaDZpWuaBuzs-}j! z^PZM-^un}hxLRsf&&gz!*CnAEiB&rMT`!eqsAq%fR|m`Q#w~L}KVwH}gk0VAxZf^y z1(D)I!I4?>uHT@S!c#I-V9o7HiE9tngGBWUoWR-&V=UKItCdp6J#8fbA_j%1t7@Mc zyepR>fz7oe!o5OyOh{J=QT0IhSRIF&mSB>xrBbL(u`_9(7+Noy5act)z$77xvf$f3fVhx-<>MWFjvyu5&2qrE?)eF2FDX#LSAI5P1V$NHPQqKh~#un3O$PcS^u zd*Ct7E+Q2{e@j=(A})#G<_WG&^ma9ObM@LHZbZ=4ynx9cv9YT;xceRNEkOSh@==tx z6HQN$o9HmRo0>$&Z6O|GcI*)iiUw}=1&;5fdkJjCK04ONapfq^;W#EanHU&?hY@^E za=zx(cl%uEP{r+sDBup=rIT>rl9Y9LK&c`r+sfxT%v0Mg%-}BWk^WN{#eKYw7JNXN zp31HdE4x0b?0UdmA9GhX#6N^o7%&B${One6LctM*vjM346MPyHj?=vQp^6CK%P@E? zdwSIx`*P4C73(7<>jgfezhO%3=hc^8iFPGGQ^VB~n!p#&AUR%F@=L^5)j3&L g@+(GWHEVCxk&NJ*fQfJM9j_haWSCd~?`nAY7kCR)9RL6T diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicDocumentProvider.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicDocumentProvider.class deleted file mode 100644 index cf653e01cd40e36fb0d485084e680695a310231f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmb7E|4-9E6#v{dD2y_c@kJ075OwP|ihzI&#fTvx4kT_NA^udlV-`j`+iubSN+Yl! zi9br>-(-yMy3sAjAY@tZdcF7g^4`1q{rAUD0JB(@5MYSgT7{dc^C{0OD$g6PWjpF? z%`x;hmR>&Krn_ld6(i4W2_c4A%Py!~FB&C>t7XHFaQSCf&Cz4kDDsPu43eX3rpaxF zM5ZO-re?c_YglHswmHqvRXSf2v8hZm``)gmbJZhW^BEi4DY|{hFb(%5LogQKVhF8R zc^*a(-7-26X6VTnCf_I@>~K4$?G!mfZ^qKK;+AF`;=R5Yaz7f*mCAkkda8&!THx+Q zL*yV9zk&ZwF!al4L%W2*t4ei|D2xGgGjwNNP2XSFN_8WVW=$fYD#^J?N`;_%G9+|R zX$b7xH^W>kv!_)wwWyf|_1(@M*WL8>*lAIXF&X#qK*B?YWD7BNxyT)LRdX6C<#w3F zJd)9isIdD)MhtO=A(FLXnY%`zZ1X(LTx#LmmlCH6_Q&EMnq+2O+b|2HVH^q35lM!( zu~zx0Nm%nUowN42->8?M#<#jKi75#xbxsRgm$j{or!rXKvA41_4=xss@2 zbe#l^oFSF`h4?APx0Pc|i2pGjSD|dAk|#(7kW8ImCIBUMgpp)JzCt+x7ATdAl!G+- zv4kPKz$ncpu#5y=VHzvcL93o9rAAyAMH1+@NV3`~vj`W6#h<C_P1PgEwWjP^UZA(=R6RSY2RyyE z_H?x12USZ}T&EUFYe8AJBKc)xg?>HYz83f@7+SZktZv6wUFKh=e#H+RrIkNL|6Pmz zoOA`wzU=ltb2g={&|LSZ<2lhOfeY#X!{A6+AaRDalZd0=#0Crq#M2|?9&8mzmF8ut z>adV0okeQVUQQA5)T~T-b=TdS#2|(YY-h1Lp{)3Uw1T=9Ig8R74?`J5CU#&atKo#x zel$&8QY76dM@QZB9g<=ckS6(&axVmSo9KgS;4Ojvc7-q6;XJFH#4!5Rt-U4;^e7fM zo}8{P&dQ)<&$_JqK*6urZrKhT_1zREqIoA27%6lT?G;=l{2T4Lxh8?f18EBkHIryD z?!Y-O3YHnQz*p-Yy#dmVl>3lD&OlaROB*dB)rii-VH_cqsxrDHmj$+_M>=qCbYR}V zI|3&=tNO1SL`8Ab#CytF51o~5w=NC5{{mY&?6x|m56AJLffE87*2Hh(Bd`kbT0Igt z@oN4w^H?V}Hly6qtts#1My;t~ohvWB%N zS)BeBr*vabl<&hdt{AwyrlveFaTT9X*WrM-`AiV~HM)~cISrIhHgJvI+$Kfq)Wmf~ zvxLX_ZQzDL`qgQ-Gf+rxOLm^6Os%)s`jPHt_{GIE;BaoMy0k z+|DQzD<udhQJNd5Qh<;#6r) z^CYMAT@x-G&Qe}&KIKZI2OcTC&QAn^WKloJ=N&c5ht|1rL=i&3ob)^yoN;YFIUMX= zdKP0Zea89Mg%}d*f#ANEKUHE#@|({J_g$22z()Sx#IM`DALF_!^8}l-16!VATPFL6 zpFd*w#uMy$gw#WAU?2YvQW-czQ)wE^&_E75IbrwfGi?S3@HW3_P`eX!bC4RbW*BMh z^jkWO^G+`FJyJKOepO3$1tS8#z~bgzwK=we58}9i!vMSeXBiD`W@)>%XVY{lek?T=i!ZGGL&Js>wJ7e3;b(o!}7AcMQttJ-3L`vcgbIb6zib5r>Q5mG9aaLVD8{^q&`rm`ZpGXlG z1Eqb>Nrjk3suQMpI1QL^gsTEL@e~W+agFIhb!%Bs2h=D)q8U)HYLlk!etipw4=lc@ ZI-^w;&tmZP{~GRbRjrm`#e(kMzX69i8yElp diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicInformationControl$1.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicInformationControl$1.class deleted file mode 100644 index 3c3e84eb940a804473a2bf14337a8de04f8ffb5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1013 zcmb7DU279T6g`u~#KhI6Rhz2SYMVmZpwobY5b1+KA&{!jQqZ@_<~EtIovky|)Ssmf zQc&;*_~e7XN4%2;X$dM>7jh*49$GabBi;KRjU@H7Ppy;B zmD6$C9HjP8d7YY8YP?O8YNLRhKzXP}N+!zmj^yw_#Uwp_ z@UlIP)3T&^jzHcIw5x70i_Q!*n%wwI8|}9RwrVqVZtM%>T4|4p5V#tlfXgLhF&CkT zvOu;L3g$Z6(5vIaF4;ZRO-Nv&lg299S5}AfB$x~21>`IQstqQ;6o>DpX9?Pti(Cl-dJ)xob1G(e|+_% zHj7S^HolptZ49F&$~khl&mPJ0x&%=!2dnUJli^iFiKAC|_ms~eQrfJ4Mznc~YoEq7 z^C33Qgzg_$;B&-1A$lD*_$_b~ixZS>rN9v6#fP(3uT3++`NFIR_O&;M8pe7f{m9Z^^#yP@^88wV90g{cc)GIDn5lK z0*NL*fY0I|jK7U%x793KB(TZu%$zyrJD2aA{rdCM7Xb5kV4#Cx+UIrQ*}>b2sN13< zwekb|ArGWe^fr`VH$7({!LSfFsmj2ySIU9*xuaJq1VH-Sed((m6>v8O z!qBC+WRRXEr=>W=FxI?7`nA;LNW|xS|yA6t0`Sf zVjP)}^(@0=t6K5PRqVKDM~m>3f?uo*gerNS^AhitWUmUvD&F@lGW zU~=Sevo&^pH(aTm!D)%0U{+Plcf?~EcKFy4KZuzyRT_y$p5v;3IC>`ZmZ})I%aD)L zc+AL~xDRUm?m*~bbL!jHh^EghdPH);C}PSSfDk5JGh4>+J%XRdi4APwDjSq@yPR6P(>DebCKn~1yFHDI){Q`-dbvwEnI zIP?efN1=|R3c;a*$kN#Fd7fwd>_4|RzX9x{8KFdYZ^cmR#Qn(SFp;_P#=7J{IF)tu ziLrg*mCB=pwDQl`e9CNeA3z{$j2`s7mOr_#IRuBldM)eTwT1~y#fUIX zSX+PUAv3Ac^6N$aSlXUAE+k=-pmU)ghw|=3vx!t@*{F8ABGaRQ!+Rv=~f;v((m|GcfF=jExh?SVf b0_TU-BA)YZ2`?Cxu!NU9*G3gzVHxxnCWF?# diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicInformationControl.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicInformationControl.class deleted file mode 100644 index 3016f2f90daed6d19d496f2140b8eb486a819d46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7084 zcmbVR349dQ9sXXjn@u(o0)d4jkZ^0V2`)s4LSifguqoltU^MY!*&UL>WjD-jIFx!@ zYY$tk)kdnVwHmdwqJ@n}Md$(5T5GAbht^hWTU)KYY-`m*zyHi+vzvqf&F`1IdGp@; zAK(9clV^@Ru@AspHQj?Og(@?+Nsk8N8^ijhfF3pyF*6=m6pS08rs%quxgnS^V$sG} zG-1Xf9=H_d#LSL>9*P)UaXqkpT`;5v68e@zVBy+$!VHEI!yU^}n0t(4O+)uD*^k-ExOa&L@_?Q*QJ*@)^Zx;L!VO@b296^fc; zpK>HD`ZzxwtA6`sWP9YuIeOC!dty@d`b60G!K^)Sqaq&F{G&?@GV{abUv{T% z)D5+9{|<+4od-eYlw*03v&)M$2nhmooDmS2TI)DW z59l0YUid2OZn}3Jr%{y%ignk!WOYCasC+)9^U<(7TxTY2VC{$`GK*kw6m2 zMC{e@Ej-C!uoDQgSOwcs51u+n3)XnC4+q48-&SZmISaNA6MpQB-G*(^qM^%_*X~IN zXXXq|9YyWB&}zgDw$sw3KCR&po)ioGK*O_`r%)P-Mb{Y}-KO3W;+-j?hf}qbalNVk zXgz+U;d%U+U8iKSP9qX#cP*vn1k#fSKT)U{oWw%i@kDGxU} z+@a2u*|^ztO%DG;!!IQRjpE@&bYtDTzz8QgW$9%Nzrrh2j7u%X6|8O%Wjt<joWcUG5tdd^|5@M_fxCGA|VF!TFXfp_S7lC#xJK+H#$1Gl4sMl zFgW%Xg_Q85Dn7qz;Nr_>Uyaq&IOQX;)Y8a+4w&DgCMc8*_W2a>;)WhoqEMM$Q}it% zy-P05@j%PDi}g*7yuU2zf0wH!vSVAarHhS*9-a~x5>vgZSd~fsr0On-7CJ~vtlJFf zyt*(%C#5>L%(gL2^F$+RPS@6OFBkJ$D275 z%S^922v0SkQ#d(?ByJ>)^m?QU+k~i4ZjVc*WZWkUb<}` zwhZ87%W^;M*GrlY(#s#hSUgM)JJRqdPRUX%Uy&R<$ak#70`F8dU*+b^O}>}W9R5AH zQlVL%#7ui|Z5EbiHDuSidNHHQ=c*~XF^QY*LXpqagVEJ|k;JEak>hhU+~86^mrdd} zg?o>_P}YM{)%)&2UUjzY8W4X04GTO%7}&J8s`{{>X9f_cq3;1NF&Dke zB>D}(@v9%Q(nB7=Kn4wEoUPB9u877 ziEsMzJb{6&u%pGLT#-2P`6u?_`*s}Vi#rGU@XUZ%c6R=NzI22F9_6QQWwEuBi7&<0 zhab{k?PNlH$B{OhZJU>Rj{HTtolF_ewJmV(t96NM++E@>t65%s0Ec^Ub@hH6UXW9g zlf(-Lag8-D@W}A<+FTi4+J#@ceYu_C+Po6$y}ZbBCGq+$ydn7V_st~!lEgpwVoj~L zB*&NM^Cs~xIsM*({F3~Gs3@^G94X09D#i2Rq+-YxQH1&)3uQi-5~@@{8TZ9}mtRHK>U#2XsmI!Y(Yu>!mvieY{a zXxy9nUwLp#>gA~Zm;L)#c&Yu{jvw8@SP(y&C-^s4B~{Tu_Tt3O%TI<&B|q{7--*V}PTCyqoSlUCMu2xT_|Mt{v`fhi;adEW6YcHI-v2 TRlJX*{K$XiAxzGOn?{9wqxQR^-A%Uc8?3s49 z`d!)F%bI1&bKGin#;97Q2j>3wj$3}{I(t^xbTzaI^gc88jBLfQx3bH{XJ*OM&@OPb z5yP@Q)7>;mW;MIe0wK_`6M$9)#`4X(Hl10gQX!<}*x8~{HM44W-l}>zfxeTi)2>-? zT+b{Ehz)^Gt12HYdrM$Yt&v;g-?UAaRK0m$_O54DvI?!UU~Sokx9ge$_gY?0wkUfg z9*Hr#%_Nv7B)KUnY@f7j%bOAiCsV5eZL?0VP4HpCk z>f)wd*Vvbs5hO4u*S)1fM^vCEZ`tP3?(?GQt{BA%Rrlwel2KVTTuVNy$u@7>V!-L9 z2wvwZWp{6xUPGz{vdL7_e#?HnH&W;OIy7`>xGIo2hp!P_!Jt62;2EWzMdMo)Mt8ME z(zWEd6s1-p)HJ4J9DM>8ZO5}V_ZwntHcw#0D3@RJ`gSY(St=s6+J)=5so@4wT(?-d ztK$}K^DvYg+cPYih7Bcy8f-XOxzvUP_)y13a&edvxuv42THr=YM$V#%xp2+r&YpQ{ zu#$30$H$VgJy>Vqz`k&tUW8A!Yg3{aR4-xh@p&xrP;&GISJCVsf{Q>XNUY{fmt?QgC+Nk~we5Zj<=GPr|rN1TOKYh53I2ZTztd z@axhh`<#Dgm-FxJVqDYBaR@zJ!>)`zUi&$-;_nA8q>nI=4j*DjUSjFrkyt;%n}->;n#qd}$#L~aw@?YpC^c6xU4{=$} z{LJNHNce8vfeD6joziYKz{V78%3mw`iJT^X5Wzg73h_lGosp177_BP~An#E3Bo*KF zA%}z23X=Q$yzzsEEUqccrwTJcg(I0`OoVVi<-x-TA*@M?M%B|y@eJaaYoJKfC=$4X z9HEu|IERxpt~te}EBLz#KIA7Q;;X&SFV<%b(0UD8SI|P9Ql;Kdi1G9b%w%3*?f^Y% z_~}W00`dLy5?CVoG6wJnG1jDXGsscA#uCQ@`D+2hIOHK#bPI|usyOl|96@=1#FKocf8!WmhQOI`1P)&Q rQ}-kY%V0P~(iupi+(4UBv@uGm`_hNdOPUzgNUt#szK$~aLoojX-kU;& diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicMarkerManager.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicMarkerManager.class deleted file mode 100644 index c7d6b991a851cec67913d9bcf2a9bb6075e9e615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4598 zcmb7IZFCe@8GdedH?t(eS0GJ;6c!3)H%qcjK`n%0DW5Bw4KyJ%fXc9$gn`X$Iy0M+ z+FDzy#a6M_j|#O)Ef%e)MGNUR=aeeP>Z$*F^r!#ym&bqop*8ElsRa51;Id;O#c^c{kRt7m(wr4s+M$U9o>GDy5aNoebodQjn%K2W; zvFzb4f%)4Dw(A+T*Kg#DW)zL2n=M|T-q%fFZ6+wMO5^Q?L35`vfsC~grN2wHeYr)? z%BM1x>v3~luQhBNUePfHHq~rznNxu8jkG;fa7GNzD%f3Hr4Y-d-qxUiI7A({ShnSD z6^O^@tn>ecqgEDT$;Gn-IkPMnqRy@tm9OfL-a1W6) z7jS09wE>;jC}Z)-k0qkN5ue5;4fhHxs5nddNylbT^$=ATXbvh}_J4xV347zCbW=D_ z#}Q0vf~hbx0^LMYzaoE45>ruM8Ae31Vfc;PUXx|Sq9ux@BSU;m~ZFK z>D4GcFR*NvLA3^Bh8I(ESn!z4vZykL596o=nZcx)LudfQGr{Ug^vh#89fPt?EF5J8 z^;Gox92Q)OzabsNkVvsug$!g|Or6R(0tZCoBKhqJ31MYUvpu#^F( zbd2Lsia2h#S*0t5ACiuEOvmHWNs(OMG#m--Z6V?Bji3!L?-ivtr(u%`_3=at5#H_z7NR z&EY)|R3rN_?70yhW(3Jn^;0%=L0|g`RBjBmvrCw%QoLwbTdU>Yn3{K3o!Q9%RQER1 zC2#IR$U{-5oY>T>%7EI;o+$uyQm*JY%uqks*|t>6EVrrtZm=g~#w)xF++8JVc5G+m z4z06fwVSJ2vW!;uFTAYFJ`M6AL~6Lg`)zi>Dwo@|U;GQPPc;hFMY){6 zgm}3h<+b23v<vk3&?p`ws>4$ zq}CVnosAyn5w0yoGoQEd?Kt_=ag4Q1pe5O~>@6&BOJ2e1wn?lRn800Eu&yn91&Paw zOOnrJsOK|De(Nc%gEH>sS|?WG9u7ru>jpM! zzn9}AItP-=?`RG;M_TJAu%U!c)!|^PcKsqWKCgu@k#iJl5$DM`HIQS7O86q{DqVbe{q<|Uq%ZkHx`e0dkV*a# zOO#5dC-7`pqhtx+6zIN)rsVpv#1~5VZXNihSpQS99>@mNi(JIURvPK6w>eA#>bJNx z98@qVUw)WqiyUd8r=g*mSxWG_s;P)^N;ANa=e9p6M z%W)Ea;P)^-6nn&8hG4JgmLmfqG4l@b2<#`9UgD*Xybh4lK_cQI?i?h?0siDZgnMxW zn{bqoH;AgEL{|=3n4}(p&E{>4IrKOzJjE95G}m6hC|=_Jt8no;JkaNuAk`#JQJZnR zhez=~Py88A;sZ7%f5p@IJI8)hTstDOUi6f49mit4Mhpq+9l_7=bK*Kp3tq=BxMnj;FX5Mj=LBBFukdTGy+>cX zrszJvV|W9X`TvCl%rHq8#&0M=CzZeVTXK`={|6QiYq&6lM%1YcxFB(V_#;H7kU&H& zy(zOnW5bFmtO%@W=q#^B0;|)MEeKUk%Ut@8Ote*HF=v#R$bT`9EEY`hCw0A|KEv05 zxLEaaMdHHhjf&846&oq{-!xS)a1(sWBH7MSa11pyyuqPP;iq0Lol|j;UXr!QuXzG* cF~7dip!7m-kO0A!1a2NP7`yR6)W9%n!^E_ODjXX%xD3^nc5niz#6fZ17in*l zWj%;P9v$;kYJF@pbm|P9JMcHRDfMbvs2U#Nk%@;4-tEh_@fgcg`e+6WYd16N61(N7 zb}T%_a}&=P8aGl++-}`UUG~C?e{rFp4v&PWDB9 z8V?xkJw^Ms8}Td?8Pz~pliUMyT|H!4=L$&;7FlQL>kaAJVtMVKu)SZHyC{9;wXM9- z(JQEvZc~i5E?|*PDhTcvMbfEJ7QIW@msq;Olg~de9kj2odQnErV2(Ohg~qMJp!YiQ yZ@@u|@VpX#X@oJxcgSmlZW%VooBqH96AgnPJW?xYV~b9M_6K-Lq6^aL(eocn$K`DR diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicParseTimeListener.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicParseTimeListener.class deleted file mode 100644 index 846ca27cfcdc3786cc382217ef39dc093f2fbdbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2085 zcma)7>sA|87~Ka#ri7`z2&Fd*w6rDxI#Q{&1!*A(8Vr{ngD+r|;?PlOJBH=C zR^i|=Mwl`c;Ed(;BGMdUx(=It>yLLEDxYDP(duCN2p|D7y6MZ@^;F3UR zI`DvsTI@~6*WXupi;v+X7_cR#ali25Dzsx z5EyQYSrd~QcXd31qP-pDOxKbQRTC3xP5Jpq$FzEyw1d3oO11Sw#|&nbRu|iLU>W77dAYmn%U6>6w&V)+ zuA_tn`q+?RjAdRr=67-C#cnL&sfJ}zv@HUvfvr$=I-a2{pf40lrDC~|TUyL>InZ9c z4Wr2(tl+r@>Ts;B_a?so;gOEd@Iv5BP;X8GFI(B)Y(euU#6O9?&6d<96*p85I~9kB zWjQph*9+!OoyC_Me4JVLqOju4$|f;WWiRqAIcF;gTxF)lcFzY0NX{IPbvu`1}Q2h8V>M*zz@tMo=>THpPDBQ@VEodIUW8Lxh%&~{;u!i zlkb1V;sGjM*u#X%uM;Z2n=uRzc)f@0rjOXmCYi}JXOAhiX$s>>OP=%1Jm;~7&zaxL u*pnFN^owS~_qnMO7Kb<_c>q-E;hja(m#F*dz?ZS%SNNJ^iWdDG`S}+dDliQI diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicPartitionScanner.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicPartitionScanner.class deleted file mode 100644 index 37b9ba0d7247fbccaf098eed6f946ad7b36404ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3938 zcmb7HYj+!072Q`-GO|3e6UC3X)a21T^l&^$nkFH3-P(@Rs+H|DvK{0E#8?_TlgJ}y zW@MTc3Wb!?0;Pq9M_XD_Sina}z;4KDSHH0qzkvV1UtksXof*lBqh;a`p3yyX?%Df1 z@AW^w`1@x7j^pXv2L3L*k0 zD)xeA6wBt4V`x|A^`fD<#*40ISIdT@o#&H#jnewP0^3H0bD7b?=;ZkL*u<1TJbOi7 z*0r*3EoeE{Hm!vLDveew$JH%&MlV;5C|U&C3xzq!rZ8GrTr@0KK=m!*o}3yh_+$c*UH+zKpSE~$66n9UNg~lf#@sU9A%SorIU^7mt&|J}y981jx-?!b zyJpt3JddJyL?EQ4qIi_=l&0Xz0{b@HKUKMESTXcskBYt6C$M!e;L(|ANa5t%6{F}5 zBxhpi#(t@KKwzR#BS>3bLGu6kJ!X|A=hysBOTV=k z5;!c$^$VPCM($y#_(YDVXh&NV#{|Sa$?Uj_?NV@pfLTs*eS5x*R7*) z+H~Dt7uT2k+7NhZo$h9xV__`R3*$&4xw*>VT+X?A@#?s~6cli4U`?iiLo$(U;O7Oy z%aOp@=3h2TU%>)vU@a+ih#2NE7{e8m65k9zK+_C0koR~?t4k`b z!IoP~rQvc}pr^6GMl0nq#~shcf#j?}XM=@0H|Fz9Gx=tn7l_%$VrAJI-~vYyn<{KM zkOf{;QAA1l^^%I0@h$r0+a&kKF<7hFS-I&IIa4NC_wvkQoih@0v`8!8Q}KOiC0eXl zu5Mb66uze72T~ZOBICsp;b}f^F0emK{N?iSo?=O}ojYX(u60Uq4oJ*5ReS?_E1txU zRr~~RaeC5Du39V_j^mvKJOWr$jics)TS#zZwBl|2Ou;(>k3EFCil5_MdP%r5x~mIx z)N0qeq6Cpq@QYfRHQZdH_?19!p-`H4%Y~)dwW%P3L#GQay_Nx*mXExG4_M4i{1@0F zH5nga@-M^4mpmp-yKC^l01mO_V!2AyE*fV|nX*Tk-sAdZ_Io9CSO=JCdNL{4zNTe!CaowU@&)g8|sP`roke7qX%o7s6Ng zJVC0!Zc^GqO1nvUKW{DvcaRI`N(Z(x%`&fcs!TidK)Km*;IN3Ppy$S$VdPux&0I)d78I^K}KW< zkK$?4Iz@;P9K@&x+T}xVb%uNPGVU^#%syLhBp@A&GQ37B02j1vm< zC&B}?1?QNQ7aEMW2gYfj!MHSfj=MtCmFd!13=*U}l}_Kqc>y|n7hetGb6g6%3wt4s zd1|xVbg==XyAIM#kgt*X*J(`UnaTe2A81X5iANl{{4?b~ zR-0F$MOKnQ@|Qh4-)2XEH|Ob!cKXf%N29(^h6f_o(xq*n0F@jj;M`h`^A3cf9q z<@@9(>lOCgt7ydyR>x}|;2wWtJ&rr@9fEQuFp3g7REPE@E+qortwX;aK=;(4UwscP zlERHO3K1`bT{H^3#pm1Xmv>lj?_w8jHqhv))99(w=y-sJlt>yf2~mjuV5h{3@|>wG5El8{^@jKO)iBd+aWLBybl$6)duwrz7c}$O=e0=KZ*F;YL{W_I-Bi zzyC_de<{64)0ba=ikmBV?{mB_)91V6_uKoV@B!WVkfc6hyWhfLe9ZrHKjc~R2X@z= zJok?Kbn0n+9>4L@x{bG3*?A$>SwHuD#BA(mZhp&-jMO6^h19=A=cLQ5&My$B%L*=u Ny)qjgQyRkW{s+)8wDSM} diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicSourceViewerConfiguration.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicSourceViewerConfiguration.class deleted file mode 100644 index 8ed63fd4d5c60fb7e3a0cffda742b8cf4fecd46b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10136 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 a@%oqfqC|%D?-_~ns*2uWoR+hJiXQ=peO3to diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicTextHover$1.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/BasicTextHover$1.class deleted file mode 100644 index b41ec432d4f1a190c907d5685791597d40df7dcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 993 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 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/CharacterPairHandler.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/CharacterPairHandler.class deleted file mode 100644 index 1b9a242ecc975e63d76009342e1468c2d0e3d443..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6591 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 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/ColorManager.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/ColorManager.class deleted file mode 100644 index ca5d654e0f3ce49d979a4e794bba72a709effcc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1695 zcma)6?QRoC6g}evHrZ_A*h$TI2vCUaxLGKaQk+sq!bggo0I5>Zf0OmdS-R}HyK7V4 zpnv)TeS!XMB_O0osQ)VUVfqA!_RQLrofe16(v0`sJLjHz?w$Gb?QgFET*3nbDS_Eg zwv=y2-_=yhRy8*c!pL3@ydbPfU)EJAqsSB&b?$uk247UFk2sBYvMz>J7{IMl79gDR`%cBXt!gUV-cR z!PBN^u`t-(#@D@FwD39fED~4XT)xe-U${}id_4Ko z!ZKEP-!$uH7%HDh&agf2Iab!4xTVMaw!qRpb*`wE>!^LMT_VJ$u5{JHm$=JH8%>h9 z@{UUXSM3A{>suV9|J1POArLs==r@Ls)ZoB&8z|34&Y3^Y1Ii`M1;y>UzksxIlIfV>= zIohoDDICIKehGa6I*31VPtleyKEu>5jtcBzR-p1T((}7GC-6H;FR;M>=LLTH`!Ahm z7&=dmOhKeHjv`C>XSmPdc#<#I#_Z%vGwKpPVW!JGp}DjzpYq=oT1Jt2gRFtMF&aL@ zRj#_&ADBpsQqt5&pq$cVs--`0>=jB6U*e1T9o(!Y-qJ4a4B_k2FN`1Rqc=x63Zz#g py?L$+3BB1iZigN-pn@v1PB3Z>>m;vfjX=CX(V$o09=}t#{||8aq_qG5 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/EditorKeyEventManager.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/EditorKeyEventManager.class deleted file mode 100644 index 0a4d29c9420edb2132480e1a45166f5d03779382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2191 zcmb7FZBrXn6n<_JvL!4p76P^Q4WyEn(#5t~Z4iY(3leCRN^N|b%jOogh7Im+sQi@n z5A>_fRBCmm)6e=7{4e5jH=7U`rqan|bNAeHpYxpOoOAQnzkj?0a1B2ghzVppxvgBw z|EZ$3Emd)Xn&(?{;qRi_nd4rtBwe|#JOc@VzK3#KT2<+;TesI9DmyTc6v))PbxYY* zXUkWX|0uBRx*yawtySeY4|a%Ca{NHK$`k0?kZz@_yecgM=~9SS51gts?RheEEC_V2 zIP0zq>YfsqKFVjZ)Xv*+1LZxCw(_lo7Wer^pu!aKl9P_>1XBX>Om$BZdR$wesIxN4^W%DEX!y1y2&f}bk^SHn~)(_<| zl*t~Mh*n_4#Jd<3IN?xb$p#S^Jm9_%*$Z8G4;cevOm$z)=B|k>a@5{cKeO@!O@y{y zDj2xLW;$+VyO76a6BZ@}QjeT!wNaU4D^l*n6*~)mqWeSxMhKku(AT9$0<33+I7!kD?}|TkUP+2uN@nK?v+5=KQ76ws8fs0k{uk^ zHyXuGHetzxffE9=N6yY0!Ra|0JUCT5Tg}PpmzB!l+dyDEb9@c-(DdO;6DzpO{BV!NV4I=PFkteJzL#$ z^rdmSb)@|=zO3g9!&EcQZwJ3IEh>LIdAY}sLXvCVZG3jqG86g%eYxl8$^D7G`_FN5 z7yZA6-a~x$&;uAk0;kZ6xA{bPnrHZSnr{N{;7o+~4`U=~o6YUw>@J3vpW@2+3tSX< zh5XW`{0of7@EGUv&+z{5xc(U3+E$3+DN=eh6$9O;1)l8vtvSRQ85m&(z**k4=lL1t zg)xE&UOrbbiW{^SkqLQS2)WKiyvPD`xJhPdT*NKRliLDut|Puj2@(c`!AUnbSJ=Z? z(_kPUnUYOY!-qh;Bni@x^7BwYi&jCd$7q2pg&=qM z9;1IUm;Vim`+28AtHnA_gh=`vy;}JtquMUhsw=AZ4Axjvx{W)0>Kd0L^t7%?eivUn zff+5oy0;&!QRo7dnZy95+5)Cq0n_-JGKx?}HrN1{_gishqByAtyc~iz^k`&qi_*=v S0jFBPsR&r$J2H;p`~LtGtN)$= diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/EditorKeyEventQueue.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/EditorKeyEventQueue.class deleted file mode 100644 index 1b74906e9322a84844666c2ae8be27b287a3ea36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2311 zcmb7F?M@p<6g^{17R&|+1VU3vHYE+V33gIKnqo>zzzGB!LZPJO-(U}Bsacct8iiNs z3-Gs*T2LFQ>91Dmdqm1pl%83CU=s@wS@Q1OnK^UMnRD;{``;gb0=SP20|9{%SMDn( zUVNEV`*D@Ey@FeeC;jK5I!JQPTPdlMG7uE#-jVwQYmwGlkFP&^& zxdMGDe@)4=^YIzil?N%i=p_W&SM8i5y^^a0W}2;;O4Vm#JDzg4WJVR^3$<)2ha{$n zXY5Kx=Jbi94I7(NNS7CL-=!(rvAt=5mT+WUAUIpdst{VxWugP7fhz*NO&EmGjjj*` zuA1mWKcy(DvM{IA2g1#GCG;^}Dcey?rQJ>CuF1_jHRwqdGBUp|U0aVU!JxNo7X>00 zVB}v4`E=(#$m3c#(lil)+2%7JC4D1qSC-*^MDR~fbE*#(D1o6oD9%%=-kd&|y99ZXhd+whG*a#lJco|Pe^ zoU*)aW$l)0)GBOQHRh-N$C6v@2$t0CPBG6_NUb6eqjty0^P>Clxuz*DaPg%RC4Wc@0B84>D ziKAYzDPFB2)ce7}vOu_Auk(DXPg^nZJyzN4NO{QzX485hAlN@98VsPS+McgGFRU|D za$Pp{TEh;l7D{eLJ+^gM8fcKEZW9g)TPYmrwf4$Bi?p z*R)1|#n3N&2|$DC!+{%hAgwhJ_Ujsm<%2xqIG}e$M}NbRPN~I53Hi}s61?Rj>3tfz zoQ{4gQ@_b*IaM8L^Hcg9!+dJ$I~DZ7=n-!HgDyV8qeqB7KSYNP@jZ5WWt7)jnG z@q6gSIB8GRoj+JRe~@$cdCCNL1QF;p_|CRgIk#S#2WO>u*i@Q__`0(B9VG}7HmNiG z8+~suxzRIqjOn-OJ4cu~L`-Y-Kyx|5+|nWX#(u}Vz+YHO>n&UqW8|5@&nNF+6O^A) z{w6ERMtzISGMZ%c33@QkTX{-mix|QZc`YNs=NuicjSwv-Q)8a=O~%q=d<{QP;c@D| oPBj9)8n@B9VqnrZp_PJ^#bE0-SVFjR!gYa4L|f`P(F6GLe+c$5wEzGB diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/KeywordScanner.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/KeywordScanner.class deleted file mode 100644 index aee6d7271947816bd1e565509bb0cfc35698645d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8634 zcmb7J3wRXQb^edEtC3cNu!IE2fRSw;(n@#@B-ln62av#ug=`Su3Yy2V8i|3`uDm-E zmTS9dlD2VPt=l>+v`Lfnf!jE(8yg9Q_>s18+9YlIOyBSH5w}g6HtEZ0)c@R>-JM;n z1o=Lrotb;@IsZN9KaYF;xo>~+MF6jp`z+K5ZpkI5olGMC(5N$=a7JA(o69Heb7szG zbECtlWG3U}EJOs`vbphulS;djc_(ppESYi=p7XGm$W5i4eBvno?oZ~O(vmvC_ONI- z<2gB9mQM@>;s@Qlci>DiGw$e{mv^%Qvy9TeJT_*$)by^Iy*kGd_HwkJxyH3Q=fm({wHV6hjYgv#^a+stgz#3EVEQ+AdB-g= z?8Kewk-G$K)pkK2?L@DQJ-C~sNls2WnNeD-+SElG4iNO#;~oZ<(Y4RUejH$S@UjKt zwbFBy*n4BxjyoG5IB3H{y*}M*qX98}dZUd-*!nbR;|4T0UrzzW##)L;Za!XV}I{G+8(pHlI`6w|v|yD!owTtUt1NuC z;HI$B{CO`io=Z-iaZ~xkfowXPi{Z_9tA)1+HdanN?~am1`9zlTHPfuO;Yw=s@0-1w-IVkjOxv|q5Jsv9d&7PrGS z)O8AHl`!W7`#Z}*u59ZJUN`0REfe9*tdsHxPW?P(V+EQTaUL@k9u{m3TewP6FC{Cz%4@f$z8QPL{zE>p5WK2k?W;*?IR7l8UKlAVyO>VdLF+52gAAO4|ua zjdU`^smG$NY$$N^ENKw zY3=?Vno6dZ3dobH@)vD<4A1x?hMe;!lIbZ@p}dF$5lr_v3Rckboor2`;#nKNf=>_- z%jT5Qd~I3q(C0zK_F8y;QC3(oq#H4dD;DMmxD;?DVK(ORNp=BV)|4JWXXmMq%L|FA z$~Oz2q90C`vBAwOiG!$LWXrtRZ=vJDgFIYlj9Yk_{IAAjozdrbOkG;#Ucv@t*{|97 zb$o{5N*DK)wc1-NN?9n=`v;VuM^`DIwecI;5Uq6c2f__{3@_kw%Hz)qj#ndWXafUb zeB~8kDb-A6F+7LgvhmwWQ?0~7%236>W8-)6d-M-8oXTcrUZsFmp;{P}e-6>g_XpSN zR|eGlYK<@1_#^zWCML%V(ylUNS@)U6K@s~?8*9-V!v*}gjla+wUgzg<75-N?{#qOI z)=buO$7afp5IisWGyU@x!|q(^Y@|84L}M)|gcyu7WC~LiF+*f|xCORRL{rLdegexc zK0hu^Yeu}G61ja{<`JweuOTy&g*q}=zO_A}IP^Q$-s=vwy$rXnvKlP!FGCCquaaM+ zoo}=)*9;k**Q<@nf7tkjF0LEXPc*+ClL8YK>Ia($3JizxG98RoNAhivh@R^&S6wIS z@xOwb0~w18`)xUAB0KGjDi6P9v%Y-u<-J57&3H}alWctVM~*& z^go);f=Qx+1Z918q5Ei_NS<@bQYBmceCb|eC3jbzjytcFJ`0&DCT+6DlGPOlm=w?5 zyjjY4?u3)rm(R18uw|`w(+zHZDC-SPrPJI;Dx2|=Zib&15obxm^meh-KPKyKX%{vu z);T}tRP^aV82WQNn6l+&!QE9dawX-L)=M9rXJT)ZO|r$3%_K!BzbPqf*(#mfl*@av zB�t2c1)zGZ1|5ZIrn5SklcHT0CmYHtk>{8J=$%5tW23w=45of_xa_cH zr@0(Blgtls2|MzX$D>HS(#^k-+gU-m>$t}2wd79TTr8Cg%F95b+#$Pd>D4-6`2~S| zuZ+8r*7DV~#wOWIXX0sndV?+dwArg=86~Iu6tHBt>xw>G`b~T2&*f2uOUrd=YFp9> zQwX=9v{CO&y$9rqoM}r3YVgB9E%Np>G zBZ3sKTO6#%81BMZ?8P}8;PL)mOz=#e!Et2qR!s714v)gak6;?lV1{ZQ!IPA5uWt^1 z|53itFvk31o_>tRsxeRMidyre#*a|r(|C%bQOfMa2k_&l!%uMhI3f##QfEOdoVU

    W2LgEbuFeHT6WlfDP3B1!;2L%h3Z8?E@Dt3EbgtLxVHur_ST@+UxtJq!cPY(K1vC?+y3rZe3-`XpT*Bzz+HU%g;%g6 zaHqb#j2_>ohl?)l341g`=apP`BaH-_t%;^;WB(ZEp6$Ubz6PmRzGXe{*+a+sN+v7k62;yXr1sU3-07-42FFL}TL%l<&>ri|?$H zwz@X!BMV=Synx>yscnx8?~cZG#vgLVpIpSsbr;ac#{shU%p)d&&eqa7xwKgNro zk7F~QML&-SBY2+oY0u#yvhPtI+un|=cpuLQPZ940d^*I_i$&vH#NUvKyeZ(!zs29t zIGZtrFXK}*Vn0dp_xJ~D9HFuQ5&vX(dK12aSNZhM#9|j${!3uiETRkaMnw5$;T;ws zMC!4b|5MAu-WFjA*wOEIz{7ng^Qww5P0&xBSm6UMq!O3w45LpD3LX zqZ@9Z1D@oU)&9bw+h`_^E0%9#ArL>#IT~*5@may)p6+?6sX@GFR-*A$VwI^`O$ESL z`S)w|;n!(`Z*b$^G^+gYX)mg3mj+Q)QI-f*N)t;XJ`*T?3u9ajvWW)qK8tn5044}F zv8Alc;Y#zr#+>;rY~%)Xi@y0ch0M>Awh#;QmiwNe^blEOT?kQ;EYc!cds$&|FhCURz9Owkn4=|@_<*+1Hl1jYt`MMD5l~F; zh$&0->Z1yvqa{-r_R99EfY|H?i}weBnv`B9J9f{?y2@?s34v)Uf@zWs%pL^8=J}>T zULhJjCwyXI*aN%<#k5= z8glIQvWxl@NGoabrlRE|(xNN-n zZh*a73G5_+ox%n=i7oP`kX^P0z}BFSaQ0A%!fE#5)Dn)5MPrF~;{2;DdvoB_cC``} z-(7=?XbN8LslkIK?LO(ou|m#Zt(*;M4(AFrgs+(%SxblSFY4+GblHLU1A+KZ(;;~@ ziWd@X7p-j@8!Lql%AqRgN5bg!r5gIji2iY+e_KdJIr@U#0`&J5b%oKZ_-g2%AbP)L z^7C~$dKE2ts;WTW)@{-=TcdiDc;ak{Oi2jS@%_v^PhzD!g;x1M2z^`8Ky3jXgJ__i LWq=;8kvIN7zBRTz diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/MarkerInformation.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/MarkerInformation.class deleted file mode 100644 index b94348fa32fe65c2517b14faf36eb2993c17800d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3976 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 H1@!y^YxQji diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/MultiKeywordScanner.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/MultiKeywordScanner.class deleted file mode 100644 index 23f69437d65992fed2fd95708cc8e4e818340305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4457 zcma)9S#uOs7(I7pl7^W!N=Oh8K_%!czyxtYgJFqVGyyacO>k>wI!T9NCie71gZmEd z`-01Z5BlN*mJ%vjTE19XR{1k5OCR(>pVjkq_ssMR9T=$U>AuUioO8bK-u(RU*WUrS z0v~ILC|qV6vt}_{ejsnoX3f0iluHI?rHgIbKa)3{+FFG~*^5thE1WkpZOj_kienYBGSa88bi|r08cxMF6|QQU-aZs` zQ_a3H@xFcdwyls9j10hA5ft)k`hD!=Frdo6($ZXWH37aYP zIx?hfRk-^;0b_{|2A8b}&r&8DBr!KrmBseZ9WAECC?`$F?-_L8nM?)D`6apSw856G zFH%lT?2e~K6WE4pHC&_6Q7<0xucHs!2~n<8bPTJ=7`uHW3+zJKy$7c$guc{x9R1j- zVFxvO_9mfY7j`SGAwzyB;;ON)vHdivxutGMJ|&Xtb=-g(6_(LMa|_HYZnkkLZ7rp( zn{^E07KJXWyw9+my%TP&`yz6 zBX?-nm~nfHY`8<}`6`7S;W}-RaUt?fjA^)w@z#l~*Q<_k93Y(*PZooR7lqxRu0emi zFM)e-pN4y>$-15Dtd9F(umcx)n$c0!LQoO1Kc^!Pwo`4&DDQEXvPF+Gd)qu*nl*h0 zg|8_cmMCJKH?ycHWbGjx1>v^KTieK)a8cAz5-!@k1%mDaIwl0&jt0+Uq{WWuay%y9 zXLUS?hnN%VR#@fP%k9`GV5RoLCokE-K6=X-QV%ui1 z+JVEaJT1f`SDwy8-uTK%;v@qnAvuQ<>I^{YPZD#lMR0R`q*SqU=8cw! zY-I@9o24)n^g+3B4it=X*(~E?q8dd6ZQy;C|9RKpNP<_`2z12c#>4jxj`1SF=Q4in zcXt5Y=~L)Te}nF^Q#k)5R;Dv2vHA;l>l!{gxgE&z*~`tBqYGPcAxBowG&f@{*6~-~ z#0fhiS6$@0xQ%O~oJ*uPp2EfH%skfD4R^Rx{fv1hquu2iy~tZ$Gn&9M`=%dtuWZgN;OYpDV?!oAkL%`nZL0 z+)g`DD9MNSOFzIJ91@PTbS8ERBjVS~FYXS{p&dtD`<@iEntjc;&%cGRnQJ|+_Pbes zLZc$6Br|4B?D-7KH!a|9h40ZnoZc9vBYq!LIR4)s)of!fsw+q#@C*g`ELQV(J&w}P zu|S5&S_DbvE`)Y5Mo~}%bwXuM2$h_>5c!X)h-pw7k5G-r7v&p~W5Wkwj$b0-wZh4y zJf?k44u^8GnjV3-8S6VV{2t5VI9A~UM)^@7(zUfn*ZNq|Ln9X#GJuIixR`0?;!}G4 z>?~Z^r*U!I=b~p(E@o<6h)0hHuOXZuc3+T(6XfB`KxRF)%zDnify|wm1H~I?+2>#f zIS?Tx>Xq_2KZC{gZ6NtXEre?Oh{?6gH})IT5CIx~#~Tu(3*e20T3lJzVrJt!DhrUx ztAg-r<{Qk7v0Xmwji)mN?lFaL@zesIiBQ5v=kWsVt&Yy)l{#Wxo&LaT{gKV`C#3ni z6~ACNe#2e(o!6>A0tgy@_)9Rx9wB{v9V_Uq1{HgAZ*#7u;%;BX+dLIZy6@m!Kk4iE zD+sn#ODb5%e-e+s0{B&%6_-=M?{h1wv4-DP_j?gjf78@IuBqm}_kl~;hpYm)InD8x G|NaNV3=}E= diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/NonRuleBasedDamagerRepairer.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/NonRuleBasedDamagerRepairer.class deleted file mode 100644 index 1f98ac3be3d2bcbf3c7018f49daea0abe6ab72a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3678 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 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/exceptions/IllegalModificationException.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/exceptions/IllegalModificationException.class deleted file mode 100644 index cb21bd167f0a92cbc44866c07e82a6cf065cff0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1114 zcma))&vVj16vw|y1JSgVwiJqOQLz4?v||qK4dv3-860%R0XcAT8@6;cO>h&aMKzwm$X?D#fBWU#hQW_I&7-}ianeJ|gBe)$SuA7v8>hN|L2;n~64t{B>) zD??uews_}=ekgq}ux)!#ucV7yLFWzTW-AOLvFj=>)Fjv zNv~JkZfieT?I*)vo{1pfy~xL3Qil9ApmnPJb8RwatZPP|A?ffzK!og6u|Had$}}W) zaiMfu#O~Bw3`$qaE&6OVV>3nI@zP0(Vnb~u=qKWq-nKC z3Z!9Ri5`$N5@8uD6lp+)Rt>0;QfpI{oe@@N2^lK48WD11RZJi~a#$mVX5}wp-JE5u z5i9=>)&@3XRv~89>H4|>W@Tr0gj=()4KlD9!HQ$q#F!Zyqf}^YBC=SFv9HKPlCTzG s3t3}?(k!`%>(qVSwEeMiLbfJkD<2OpcVXUnD= z`YN#HCr5Td*Y^Uu`tDTr&Z70R;i?IPuze?SxHU`|#)M2Dl`GnHsR9OGoSzct4PpL- z>7nq#x@dQ0^7Aizxj4%FB&3d9&kc_WGo_t6!8q}o(!vZL&B4MfAzg7j`L=s=DOF8e zwk2V);yYYGa2bx{MI*d&1H!Ay9h>(%-ytDas$7enu-n3G+0{_FUh8nDu6^XRk1WBw zkwG9@QT>0Ug#0+5cBTAVZ7yc4X-1xqbVN5`LT;?sUoD|L4vAe%l@6>u(bxiE@4jh` z#vt*jPAn1@q^Dh0yPb~W)A4=rWi`0Nx5^EpolrO*YDze4+N%0p<;d5rzJt|i@8qTK z3pT-b$uEwuh9puvn;a$ZfFq`0md80>+2@&fPL}(a{~AfsJX$OT(lC(W4=jyDSimAj z8j$5t1CCj#wW;!MA4`*jESFn~2+IRiOkh2hvBC_^%1>jhPO?^*mH!WG9UC#L5VOwt z___gRd3Udm$CI#iHn0)FiUZlmm>C=6RA_7>vRI6<@7Y9>u@++sIiruwNpcYnx%;|l f2Lt7ZY>miPOxBHlhONkfg>C*bxXyFVP2j~Jyr)d~6#v~2vLUPjp<1+R6;bo3thH8YgCZ{#4FL(H4Yf^|%@P*EZrp5w^!{D!73Z`snhR$%I!FZKHo0YgxFcmeSsT-g@Is8vKmiDe8hG@ zL=Yi{&isyI%9AsJM>!u%a1Bq1IEz7sZh~e_Z8s^SFa z9L@`Pnj!eVF=##{;u&0E=q1~;vT12NRd$%))qJyfqyrZ*B;e9+=9>?Rcn;4q^i9kx zj729?w-;vSCsXnHxvALo)Z9XJk|>B8W=2w#td`5G(kd@c$x`oGl3B>|LY*}!#}rDN zIeI1vE@D{3Wl$OUOm*ET+WQRW0(;UEObEEj5ZcxDbRlbLQBAi^crnJn`UOl-z3h5y z-dIz0FRn4{Po?%YG!7H(NGm5OK*rZ~TVq<|Nzy{Ty|G}ftzMZ84FYo%W;8HR9Eh1Jgh zM@v;WBH(4J?E2Eu^kswEUzVanbt6$QRmnN!MT((a$;$b>4|gE*s4X?c)rnd#(TOyc z1rWVW>T3h335#-}f^u~e?{HY} zG90RhRVTyiZv*dhsSldS3gF-G% z{gZAS0qO(P#3+yl8>@UXSFQAYaZ6U#C?rnhcTiDPbE2n#fy(vha`WDvQi2k^ay7Z8 z@!r!@f6*J{Wa9)4&^G$E)7QmsK=j{1w?-FyaMPM@PV~Evb{^0>7yU1W%Ge*;Mt8Cd z{~zcL{f-0vL+%ouuvaJSRb^Si$r8?lN(h%AMZ>@0*%Bh*ZHy%SqyEutj3@n*Wn6D_ zmvOU%>0fQTv-EqOtO9+6;4r#y6o+sOCkg8S`f1jmpgDaCLkLhe58^69NFt2ebmCwI zA?6ULry-J_#{%JZ^E-y)$1Qr|e)JNk#5V3E{jZeq>J}6iY5;t;$VK>ZsZMdPqnHju z!zw9cSVNX%E0nFHLbQgZcn9W$Y3~Prnn;k;1k=({+k_&I)b%rwD zF5|r|eCWcFpWqF(mGG(ie%pQ0=msaJp8^3y$ks3sbA_HqFiM|EjNvBzMloe$K3+kw zgE{7emyl87eo3gmB0W63d`F;wGki^J4_yD?Cim?de7ob@ceZa5?Q;2c4)+&YxNJxs TdoyO6ttf1F%rbm$Oa1U4Tsnpv diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/sqdevEditor/SQDevFileEditor.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/sqdevEditor/SQDevFileEditor.class deleted file mode 100644 index 6020a9c617d73cd7d4afb8ea379c758002da8d3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2901 zcmb7GOLG%P5dKDzEu*Y?7;IjF5FSDDLkk2OgLoKh0S4I^Y#eNoko9V87R$S0cO@VX zs#29yQk6q0RXHTN<&;Y<$w8(<6+a-?{Db_EIN$8b!m@=ihuxi-?e3ZWy8G+-`@g?l z062-KaYO`k*CzU5nvJ#HGd z{o3tUi)S`r7xu)ld%f*fD{0t^w*@*zZs#V3bHk(AdxJMdMzW(5_io+JWeGseap!bt z7ObKt^#`+tDRo~y_I0;Zke)s~<}!+=;mcc`6M$XVui+gW5J_eXWJd*X zOU|<8XlY?ax)a7sK?=0x9MdRF8m^`0)y0^9-|_^GHw;sdXN@x}6UTc3T`S{c*|W}| zQz%GN1wo%N=y5eqa+c>Oa0HtYNTDl^&Q%x(8>zI_v$YJq==-iUQ}U&TZuBrg%SNFj zdDe6?b+_)g>uU3$y1>y59#oz0xP}vWU!cWz#(4yLPGAS~_<>P2^nzi}>ESA)l|rwE zJ|(-E`8Omz)3u7q`2^DFSA}z$TPN45u3bq@Dts~;&f*+{Z{+h;=mffxb>6N6b4FRY zfQxYq2z0J=xgkWh?f8Z|u0r?{*=0k(*0hN1kigE>xLhh(1r~n`E(?f(1O{6V6ZOmNR-QW|vZS!=H3 z1`Z4Kt;bB`PRTXpq$M9ow@xq90+!a{0NHeaX?i|n!mHNY{Q@7K`NAS_+yw4mI*uuU z6DtG3at}y5Aj((nqv0+-6lnEACd)o%{V?+z0ywR9`dGs~e8NOET}d{n=1z?WI~pK4 zt)Rby84V@~_BH~wTCKlT%gT)MJ_E!!;=O|JIA>#sa0GO8E~2Hgf&`z| z3by@;ofYi+gMT8_<$vk`JE+}(7VPG|V-NfP0UYG27Fxg|9Of*h?kb^m@sy)xuKoNR zN2V5WH1`b2sWVM4`eM=ZzhVFGrhO+yx}GCF)m_0cJ|`D(s)93LMa91M*sn|fKEwH! z;yo|LpJQ;UExU*-)VWr{^$KoqG*++u4_&$0cDsTPenD$Ej#lu|@~Y8Qfm9Ag0|#g6 z6wpcM(!5#dbmbVj_)Vh+r`T$)@qHcrn89h5SU(ErMTtG*3C`g&exLIDB{}eG4B#7F z#J3!Ohb+Fw75sq9_z_p}6NUr8Itda%sRGu*{|_)v$o678?Jf}VYm~F$a8#t^DKsq+ z_vSc6oV`l${Ser*MDdkt9*|n1kw{fe#iGP5!$|kiP=t?o8B`S}U^F;WNBFaPCW@hq qM|=xBrjMbCK7N&nNc8u>m`aS$#`p>wk(!MNJ|#BF#^-_j7yknbXCpiS diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/Language$1.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/Language$1.class deleted file mode 100644 index b1ae9acbc3863d85ef5520bc49f28bd36fbf115f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 635 zcmb7B%TB^T6g@)=)CwwyxN*UP1!$yVj2nz0A&`(%HxTv%9m|-p)xN$QqdwU+ew;!Kx?*J}vSVn>2EZ~XotnkSZi6tBv`9WxfQ6N2c&X-DzvzBFZ z&yBe&+Wj(ghTdi>hSHVvWOU8Y?AZ4_;g%vpYnJ5-CMVJhe|Csh> z!GqL!*Os2RjUSdG$VOtQ+y08H1rKC8V&2rFwG0`~H;ica2MnewqPg#@NIo(&I^DlB z8mKeW=4;V%#2t@S)JnLD1xaUq9IV7dDk`c!d+w!6qE8=tE9HmuGj2q*_8o@G)bm6z zQalVrIBbE@#?q@mcM&D3%XGSgp7o96lOy&D<0WHk)6>kDRbr7B)fGa(KovWLl!(3D nGyp{Tm1?>B^7W;+STwaeAgg1KC=(vp?PnAK95tz)Kps z;157i2@Eplga(B<0R}H?2rvjTh-nBiP#K)jpfc!YkkHW0Kx6QV28}@vgI6{5Fxbc7 zH4Xb1^fH*x(90mi;EIM2gZ&JW8ur7_e<=-N91!Tul&e;@zP@bPa*71PnOf1TESYwh zr%Eza_%KNIb63j__0_F;nF<_?#`fmV`QFfwflew_bKO#r#k_)?Kt#rqmQfJw8vX;$i1?zX@oI(lAac@%jBR#;;1d2ETT-PTaT zD#cf^swJ0xX!>+MSkv$!Dgr^LzU*CGfxf7&zra&fLk$~b$E1*}!u6u8`y-_n(9HJGZHjx*8X`>BWB`QxQa zm7ZzUYl`XZ2ErMsMy+lat(kJg66krd>POij)yXKAs-|1F>1?_sE)HU{U2j(?Y)!9L z>8@~|mNPX(J@?Uj)H5}}iwz)3>r7JGWRlVnla%(Cq_nyurL83?Ei6fCS4m21N>bWT zlG1VlLPvNtktc;V@AL^bo@moa~a| zlmw^!5=144D-w)Ia5f;ps08Oip4^y3=R=<0xI`C1p5#S|UJnJO-X)19L#jlVC3+*& zEzwj+`;)@*HE`T0bT%+-6uKHXWfc4kM2&*dz=%-@G%#uuLc|&)LcDPz#Jor(*uW(s zY6F*vbT=?%JjC?xlza!S()SWAd(b1H(hJZ-r8+`oI!%Qdr$Qy^nabiY?YjZ2(aAjw z;sLF!UvLb+(kqjeR@f4~WL{}8MvdjxD)Et{+nCvPdVxb z4&ue*Te!Z3xy&Qv3nRWQEbQRz9lW=V<&n;jEm&J9Z()54cYY&jFBMg44pFC1$k6&c zOHD5U4AVQ}kRJi}slOBj%W(~`pKzVbljFN&IehO~^IigRY1&I*plLdYkMMCbfeSRy zoPS>f(}f$p_~XJPH*n53xPwp5>;~&u6HjXxq_yx>(?*;E=b+TEi0|O*zaUR6E_#Qt<`XhcK%A2^KD5mfqekwy1 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableCellEditingSupport$1.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableCellEditingSupport$1.class deleted file mode 100644 index f59e0cb2a6778bb0ffe57c18a705c8424d4feb89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1539 zcmb_cT~8B16g@)=3w03$6)P$WR%{Eh77>vm3Tr`F%$yc5S|$xRz$-T6-W9( zXofOyyxlEcc10nA%u*Y%gzGAl7^Qlx<_9vB(-3DE+~W;yy4>3}-<9`-Ej9Eo%=p2s zDQwrNg~Hr>&uw8g9C0Kl%*MGZKiKB3Q{fbxp+{DoF!h+E6+56UPY#zH&ymXvZ_*v{ znAv8CTYg3KfuUcAhTa5X7|_v&L55gb5eABmC*IZ%$|8vJ$S_p&ZSHRKz)^W^fpK+M zhV@PeOXcXWniEF3WSC4B|1C&9a{+3WG_T>-rP4Lw1a9MwhEWEq14Ynr7xx%?xowLu zOyw9hI#Y_B%yusf24*BMf(ae>k)k-Z?@8`>l-SXWNwBIsD2cuSn{e^hU-?U>0*4o-hoz>!YM`TZ%x(Q_Ry5oUkY)t(B3bv@S4=wY1hlX@rso z(l~Ntm9)AMb)2EQ!QHx0z1DW!oJDGl7>)JityT+A7ndZr_cwX1)s~5pUk_}t=D6f+ zqDhOk&L_4#{4**N^?SjyT|XpzQ^=}c(Xk4P9PbKwZli{K@nSt%$}+|OUlDCvI)J|6 zc_Oe}9)==>LDLtbw;OD5Pz@p7YF+g9AwlRB`dgs2LK4}juh6sKaP@PC12fH(Opl5i>?ue(EPiHnU%#$Ig(P9vVBv_y_b1Jvf;@#Y6Qsbut}0 z#iKLiKGN#hiQ>kI%TCBV1{F3-A%J-byMTTyQjk27Sf<0gq~2Y{3@qfZhUZw1WEsuS zEmvJ2`75}ZRM9$_WF(GjRP4hIdCF}@X+EN@SU^_(MJV1#;T=G~;H`2yyt=L`J zaoa%3`%%gpN+dVb0eJiAobXAL`gAUsNC=1%&w@K^@8@EIAR7`k6U9_%CSm?)SltvIv2#T*g&`I6;e9q*kxa*jvupfIyGkNaZNSp zi=td_(Dnme(w+fRd!FlMiqv9Y!(c79KOUsU?R-H8ekvsBy+}T24eN&FApyx32SwX& zzkz-aUIE8N|Cr^pM{zTdtTVUX*?sy%Fy}8hTZA(gy1BIhUp5SuaFRy}&!}7R^?;QClHOez9oAk5X#*<< z-JIoQEzcH+&m6`C8V2sV5@BlZVdz&zu*h0YMfVl?EOg$$qRyeAL{`l0REVQRc1eXL zFimt}TO8eVq#@`PQXqg$+wZsivg?afIyz*cNBDo#fIoZ%CVq^c#_}5g`e6 z+=0G0?rad2kWir?1Ci{R;?qcWRDL97cL~;Z8rafV=X9+h5pg<^jpJ?un`&JZGRK;5 zD?w_9?Kp$s)sY}t*BjlRR`2h-Azho@86x_398Me~>{_)pUxHL&6eR=8sUb7L zzBk(EIxbt^md^A-HM12xBnqQgR(KGkU&bijY2`)=o?9ug3S0t$^SA|q4Eh2H&XVnL zOF_RCSSEadppS8d6JP{ds4EjpI1F8kW->!Qex>khxf6Kq)OMlBj{ndl-dUY=6DM&> zu=yL-+J)GhrR~>ac24&$cvQ0l7fqeP`=bhv;qeGsa%Et11L;B$G8%YN;VC@La?Nz? zb6qE}%hDbK+hvZ5^)l*T!}n=pm-i#;)biY)RroEQGq9BLoHLRw4r?E^9s<`nDY)?+3>mWbds<^3&TdKJIs@r2z z*fEI?A)iM2;1uquVvvMALfFwfg}swVhzS1HR*|VfE)rki&|i_`Y+Hq0g*y$Otd-r} zu`0&8TU)C5rBF@duaC{H>e96IDDTM^*ez7P7ziF5|)N1+0!P z=)+RkHSI|AV_Wym>lG5^Y<=d!TI^XAX9q#~)hFJeNPWnn$Pbm(O?;rG0TI z`L$5<#)xB9a~s|zxC91mc#rUE;{N>*o&v7B`6YKNqPUq++&-8K*78u?86x;iV)bkd ws#eUX5c7%j<&^XB_mz8&a^Irdw;RcA#wS$Kgij$J$2b6gj`Q4^Gq!X49kFXWg8%>k diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableCellEditingSupport.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableCellEditingSupport.class deleted file mode 100644 index 0bf30314a1f5ef8261fe66abb4fcf0d6d5070a1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4605 zcmb_f`EwK39sfLA(h7M2WK5fGCCp?mF|?Hv$^bvH5Kr=YDQdd36-Nhc#CXvKOH>##wfx0!a*$rfjF z74>xxXg6UXEUuzui&uPn?+g{qJ{hMpn(UPL|PU#aS%y@%X2CY4lduqh5+lqr}A$Q zP^dd>;s_oh<)|X~EOqoI4c8N(#=g&E5u|X;z`F&yYB%CW@+O9HTwsF=#Al;aE+Zco zXzlJv8F-k~vIfl3wKswhJfhm*Q30m91~y5zs<%#>cnl<7(`+1oqXJvp)M& zm2)a8G-u#FYn1L_1ml=g>AqLsrL{@735C}4Vxoy;4NmH$R)DE4@B2-B03Q@+voe`s z+x28lvbuw-tnQMAKN=00l`}HusY$kMLU8oxvjOLAU1aq;*N`c>c*ZHZ@`S?~xV=tq zg^ZX*L1vFv6as0#^VW}gR{HF5EAJDwfioP!jqw>ExooZNr{(t9&1oyAjv@lLt~3NE z)qKyJ2qI*FRos8mU2sg2jW?tlSo1b!MFQn{r{RGbR0McY@({FAK+Crw47NTLg`79> zVSGe0l&ZSGW|DKYF8aL2BSTm>o^rzZRuw3Z{^cvG(VnQQv9=Y#C-6xFPjZSi7P@Yv zn)nnxtw+9QES?#p>z5PaU4vlpucP4d-y(u z8MKeaI;2-3Pzd^=i61FZgQ6Nit#cOJC`8vRoxt5UKL+TMkPFg|!doqmlwI=#&Iw?t z6ZkLG+3=U@{9ccZdPdPZt$9(Q*-EFS>vruGNUe4+YKprwSgNlsiAnWZ5E*rfg|s|k zXBqa+rV0b9g*eYrIZ|yhYq_p;v4hOf%9pAZen=nw9bXf84fDx5b}Y$_zaH`>fVNog zRhY5Bi`aO@7v9A04ZewOG|)+f?dagzZB(E*Zoy_=)!nUJV-@i>yj>d=8~H|}T*_Aw zorsmNrG#z9RqQ(c61rc;fItcRN2>Qj{Usb23Mj#7poBw1!D#S0g5q*CSi;c@*w*(d zMkZocaiWA#-j7ej`l7-9tC%R^eSMeds1+*QL74pRLOXUd;640wqnF?Pi17s3hx>SU zKkj1AgBZmzr17ku(g7W8B_)Xu!D1@yJSa?2s)g24$UxFhKP{c&U4YkqOj9$6)AZVj zmjBT>d0H5-4MYu`_5V}gJ3s(4$dxO8kyZlK7^)Uve@$VA`dEySm?{R#a_B`ky{}<* zk$dw3oYxTyTxz{UZJqJ$e&o+F@8?AH~PC6Vb~h1)KA|*DyQMcMS^~6hx19cC>_#m+%>dkJk~72CgG;g-sXrRLhNl#azI+iewYso~ooaER^RRrv$^={m9WN22J@*oQZez?(df|An~tD;~k$h>5==i+{kuKat13 za1Q^j!Pfao0nV2Tz%21&qD*yX5kJ9C>9>vAKLZ1zw+Z~5Pc^n~LFg^@dN*ref#5>t zF29NS9$Vg>L0&n95oV7(dkx#wp0xNa5%Smn>9VkGAVq5AcLp$tT(xJ?AzV`D(C*i~2BfP4=aeeteWH10c diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableCellLabelProvider.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableCellLabelProvider.class deleted file mode 100644 index d9ec1d24be8251226edb2b8fae949e8ab20d2203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2614 zcmbtVYjYE26n@@Z*feYbLn(x7$~9@4E?`9=P-_dtNGM245KwfReMzDr*HcWS1U^u-=olHp}GG!Sujxe^W zP@oEg)0t8q1h%P&VvE4`qS=r$t@^yQeSZRpqE*&wCEYeX{GG#yTQwbli^cz+E)Pqq zY3QyL$h;3r0Nu-8K2wTg5PKBt7C5?b##S{{B(aw$E7F~^YOQ*s&@kj9AATW@{Wz%L zfWWbhO?4$-#UZ2wVzkxC#!x!b!-2EpYD=a;0Y~#i@^Ku-Q3Xc?4s`o?M^MEv92e+Y ziBlk*F8qh}01`q#)=@JjNy!ekJdohKwQPg_#}W* zaAjTK@ESMWX};z2LJ#M>WU=@TZj`J*(nE7W#W+4C<&JaDsMvb5YL*?% z7h#Pm_)K7IbII#!C|Bg;I3_Tq;vy~uwGiC$y`?w#;Qr+z-_2=Yh0q6aS;gllFlR(G zCm*>2yV70kcO)~V7_JEP&sc8CY09#B-;_oSSNZ6CRHJ^I9PNrdXpf`1VUX`QuHj1s z*9CU0Ei4r`Fw2K8AGY)w8%dA%PVHsx#BfvK`1@VSdeePOXEEFo*vCbRtwc|mPO8DE z^=8wynrvMz%TnOBiaWT=vLx(Fwr$w~_Ixjy>y??`cGk-fduo|2iE;L{fDLU3Y%O

    S4o>r^#t95c0+uS7ELd z#Q59C-89cb{Kkiu`Jep-{V%u+VLN}f`I_4h;jRxm_y;}|Um71E!5#H{t4s@aVj!?7 z&QQ?9Z?jS*<`eh>E}pi6JPj?L&->@*v8B=^m8@G)l-@r&L&FB_{swj z_CZWDR4}wCLm$8%PO7~~;Q&VXdx|sYERNtZXG{^t`2tViCTGT74C5ZBfsGs-oW%Dy z?Smf=V6A|Eg0JxnK}X5tJ$%d544{JVpwssVpZYvk5n3NW83v^!BS}JegF`~$^&5=w zqu~Bui0!25koOcjy!=FQkGEX*H&kyY7M4*Pd5uAT)9^NJG}~~WBbs;=ESZ#5)N!At z3yfmik31C^TZuf^iJT6I&Y-jx+bM+JvSPvt7~dcRL&*PD-!iJMQ!aU1^#lZ-P%(rb F{sI22yxRZ( diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableContainer.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableContainer.class deleted file mode 100644 index e9901bbaafc811d48542c607ef0ca1ff97f859be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4255 zcmbtW{dW{+6@K2$CKEOTgoV(ig^*ClXX)A&(~pEeNU2hiAcTgJ7VKpAB}~{aW@b}T zv>z(g)~_noYHX?2Dpt_8+Ac-T@$@Hu@OS?Q{{VmVh|isw-OMJzqw(bI?&O{O-uv9= zKKH)wU;p)|KLgl}j}62W9(Alaolm*vGI}nhGqzW7+?4A%c7EoVHJ#N5{H4^y;>t)N z?^$+UI|kwk+oJn(wwq2pShh+)eHZ&P+oYg(IF?Un0v*^P5O?|!CuK{Q2?LD^>ql9-@ltMDJAQqIi$dDU zPFjvFWeFGK-Wl6fSOwEnd63by6P}emJ7yI_uMJiv!%8ST(!IJ8_DnY6b9lhO{R-=9 zHDlsI>{e(@2l6ENnlc`qp4Dk@pl3=P^qY7{jO&OeL2@23@u-lsDPQpH)ANCXMTnX* zrx}H+(7!s!EPs$S5w(WG^2;?+$Yu%2F60M9Tt`-Zw~7h`S`VliHnATg)DSTYXS4qS z!W8wzJc)91q}?JQ8SOOUS%nRQ)oyK;sv}&Nz7TjBd^tqDG zr}aQ2YR!76*{F^h@qJF}#9*qb1s;LMbRZKBjEJkCT$Q4-+0rG)q1@OJoX3O}Q6IHJ zFjm%0;K%rhfj4W;$ABFZKg9xTPW6stEtg%ju~PH!vcSawaqyOjA7Qs>@`6zD7S&Xk zrlz6?dC0hb2IPvCBcr=ME%yzDA^QEFOI{^}5EQ26>(?eGaa@G(8x!y1eT9ct!LKUYv2Qg9g7|8U!KMb-bAVB->x!MQ^EF;Ao?X8OcY8^ zT0d^fC95^4nSTIR^SMu4@{&Ln`Kd>Yf4m*=c@3|IF(mlm1%uCPxyE6@@AdreBJE@R z?d`3*j^@6}5K`+_66rs<|4f8IR!r{Xb4ilfQthe1T8A`Bw9MnX$xI zm&CdOo^*S{sAG(}rMmhKjM|I?-Vd>+V`$-lxgAHy{DcpsJ#blt(iLW%;KlP0zQmA{ ze*@G%(J63_ETiDkZDAd~9jtgn4$lzQDZ+Y|u%-zsa~oIzLyNE$x#|kJss;KWo+Mn6 z>|O#CeKdt^Q6Ja%Z_Ee5%=ny(l%=W4MN`Oyl7^>!Q23{Orz!4}o%Q1M!zJ!K-(672 z`p}({b2LO0-Mnq-<_jxse!AL$c9>4v?VE1}yi-wVuztYDbjMNtB; zqa8owP5u&&^7m=HiCG>fGEjO0v|)Pf)Y$9z0dsi>chho^B+inOOYFBm;+!wHI8@^P zkU7a&=mI-v&od`vz@w$~Uk8(ZgHYcn<7W$~ue;Xw8PpgT-)4GmmvLFt6@Uz8&1Kf^ z9k%qll=*u;xS;Dgs@!+*{m&Vug>Zhs2^c`))M@4-CwhqBGTllI`foy=5bCevy;1)D z>IMS7TOxcD%#|{JTOs%FeT&=$1L1uJyUI~~jRCJR%MT*Z`a@_Yf91WRU1P|b^qJ3A wYsePw3c}Wg=3!!ej^KYsi#YfE-fxwid60Z`Z%uS^xk5 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableContentProvider.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableContentProvider.class deleted file mode 100644 index 9ae39b6ae72869238ac709dfb23f9d954f1d1731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1161 zcmbtTZEw<06n-x4C<2qobSgto<_jB%{UC`SFvdt`LPT9sLt^%+v`2QaYq2dX{sw=+ z{sn$AG12H(f0XgGRAyj{SxnP=&pG!#=RD`R_x}9#C(&bVW0e%qCm0hS*Fu7eHl?sf@*jm1A(XA|Lw3PpxH7Qc>xLJr8^pj?E`L=Y=KU_ zdv=q(xY<^BQJhmEQKRXZI0ChQ=M>0zj@^m4MC~tC;B}XdlJ(qx!d-_B`P5jDd-dh* z+xyEg4VwZF_s=iibNbNIaD&hP+{!alLsek?6h42nPdX7;HA2&R_re?{2c9*&v2W2c z>F_yK&%UwuBeie~e8Ko%;m4rz%vX!Y3+z4MS@68F^BLJsY^0FqG0QV}lgidATlv{0 zTttCAegpFajo9bd2{;{ZUi%9u=D@=%vZT#bEjlX zEi4Pu*U-W+Yx80I7GSj>yQcJW!6tkA}g(EzM7Jtc-{l_Ss zY=ikEDae@RSpHdtu~@@V;su6K$}NgEFm&k9&>BWFx^%Q5!q6O34qaKx5tEgb1>pr4 zF?45LliLOESqih7F{CcVkZd%W{$aXQd-(xg3`Q*b|IlthHcg!R$#@}*z1Xi|A4B5F z_vv^R2k4e1;pc@-oQk3f&9FNb&u-^Cso@Yq-{V+2&!uH5EUPuthA5uXaG2rbWao0(YBtF*jv%JtD8uNE)2T<%5l4a{T;`q>8K+$FgBqC+(_II3 zynrx6D>qFcsk${7482=U zMKP=6GN>bev(AQ0itF+(|DW=qw_R3h*J( zJVGnAoYry`Pr7%c%1a$ETJ3qb)!iuHZ+F>kz743eMr86Vozs!`DUBR2*Scvq9~94o zWm6~WdE|REq?o0qm3B34h5gl3+3pp_#I|ltL20Bv5*Gfkh&!yVIwziJmru z$=Xh{Q}nJZ;l#iv&=VWzydC&FrEI~9+Wj%Q>0PHi%K9{R)5!1)da6;_3_^4c@X^3J z_I!ndYuKB(1N{zq*YW%nHQmI(EtIRvLu**9FCV*!KJ`*Hyts*zpCNg*`%I*D1Ltys z&FeUSyY4)Z8~hX(7}n6KY-}Ay}EF-^a{Y>Xm^5>dSF3|6d{-x_M=)Au(NzlRd7}o@zE-7n@ z8)yhLrBdWvckhXSAnxpcmLQOf&CDu#s|!x+{52|%KFYadMTey-jN`$2PyX2CDeeck z+scyk^hP?Z2Bw&ul&oj^t}Mw83h5jg3&uNV!+o9sQ~eL#}_!>|1N zhV*k4vk|cBL|`RaLyPw*=LB>UZMFiJab>~sifv$N^uHkaj;j|qqD{n6yW;4a$1ONG e12=Jtvm@N*{2K1yF55ac<{lofm+)D*mA^mk^yzB= diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$11.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$11.class deleted file mode 100644 index 51005b9bed648091b239080c9060093889d46636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1440 zcmbtU+iuf95Ix(Zb!uE1LK|*v=_QmnDKUXUFDZQ>6sb}Qh@v3D)5cy>7spP$P9lDV zzd(Y5c;Ey0D8#G@QrifGf+c%rXLshT&z#xsKfZngu!?OBBMh4%?+V|NM~>)P!f~S@ zl$MM_*KfYy4NvUEE^Gg+Cs!_ONHP?IuxSa~bK6o_hi|wotgb71g0fVF=hb*ac+bM1 z>pCK27>f>EnY+!fQ5zDsLP@q<-;K5zw(>(~G3yM;YT$@*Fq|_miZLAtOc>B`o*|J} z8zyV6FP?N-4H3p%Fl1_h&AmDgUByk`nN&YTry2GzM5X$xPTS#;U@-HwKXY1-xmCIO=eZh@Z|60-3K;C@?Jl9ZIy?(YqLI1tkr)7}kcAr2z{h>v3+|Ldslu zjp6lwsB@q!&5*YbTw7YZE#4GVmMrcVxQkVWl%#qpFT>Jl>8L8535<1blYEGqQy`~X z_k_$CCiWw4zun{QzTWlypcC5SvFj0JcCdh|Uer80zU>8)?vXta9R!YnE!9~WI}{}I zhg`aLHSjtupDJkV`o0LO9+y%`%u`Dy=!#oiv$y-@r_pU*Hp z#Cs-{FJ567P0S!obAw`(_X09BGF-$|Ka1>VDHM+}eT-|Fg<~we$L#N^8Bfm_3m>6> z0eQ;`B>{z!L6XdQOePjEmso_E$i-;c7`@O(0}8l@`-Ha^M>3Pb*U22g1~zF-Vg(gE MAWNrB>Y()e1j?a~E&u=k diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$12$1.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$12$1.class deleted file mode 100644 index 4a43640438f95c30e19047affab748fb83f9948b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3321 zcmbtWS##4?6#j1HMu|~FaM?I_*rK`Y-xNO3#%=;wBj|!84Yw&b{Z{bH20w{qJwT1K5G@ zWHd4KyIPssDer>8%PDS{zT%QsO2Mw+0bC;pnpD?|6A6=SV{HbLFR=3NH@qkb8&Z$Au`|?ycG=3DtHFXVzpF(jFu=QEK|^m7=x4$ zN0(+zn~#*H#s>o#dU|T~#2_ypcX^(>+}8Oi-?S90!+M5}qU%f*{Zk%y zbDCuunh2M}jyp)9BbEUWXJx1i>lPN9vGdNjb5X{N467!!vX&BY5r*rbl4%*-Z9$x2 z{Ye5zt(caj8bUf({Ryr<3?em(PHYn3cQLF;Waml>EbK(Lf+RLm_-MrOA#1isF>A*Ak5uoEvawD?X<7Q^zyd_&SvbYQoD z>17gEZ+oagMnpmf(hB;qmtx%^m;xteqS%jvG7b;`^`3mPilg8V21rXy*SY7#35Lp3 zpmzG!2}_4S!Lnb&llDx18*shS66A{Ts+ z-bXPkBg?R{AqE8_I7Wz5T?ng9C&fiQtEl+3!V%sSU~@vjYZ$FFj{?S8ym<}!X|~W( zyq&^n8B|5rJyKf*XD~*3l7Rz`Rhpu3O(ZgpF|l@%41FDM$T-Ka;gNULjw^Umly=!L zy`tlB5kYS&&@euW(l(0dql-r=OxO|?*i_c^{PYqS$jhJ}*%nl^nH>cMOpsem>dP9n ze38xd+?kM05+-5EI8Uu-R>H$w1ydlrA~wJ1&n*~XF_ckc*zv?Ea+F_+!hx&61Bq^S z`IJ*8GqyJh&TJ&)gb8H@7140y3C$ZJZ3Xz36kNuYI`C;QInt>7TD=QWqBbEtEWQE6 z!&;G$yNc^Fu2G|(MUFOvN$)ajs;{04bdHcD6n$U82l%i~Q7RSvPoXH~1S2fF=B4r6 z!L8QZ$-yRdS?bpR%fi{#9`<0GAY{GdQjaH(#p;@1XbJ%_>TCLW!XUs+#+P%d&_csw zpaVm6)G4_-KWtj0`O10d_X>zdS@%kgM-9p?UoV<=dK)if_=Y@53SmgaffgGv*Z zL=$jRd%GCGfcBUezXXN;t%%b85?bx0Z*gvEa`PQ1$(}oCOWsBM?cm^Z^o#}!q?>dO z%jsJoMmmlaSV?c1N3gmkik+d0B1HRT8qeRt&im*XyN}MX*oM2-htY;HcsPZIl?kfAG%?(?zj!5AQVL^bGAiVW_=w=@C0IYkCj_mB7(T^kwECQMSOIDG18he`29xmxd2AAduY{Yl*@Um~HN7J= UWPF2fX%!>detL_a@CyC@11qN3L?n4dN+34u7o7I8!ZEd?h~FoC*t0wmyK+8aeWb;QV0sv|qS zZJ(tN(9RU6)6DPyJXD80vJ6gKsK>1@tkr6F&+dM^-+BG_U#|dMLoJCBhMR%e;+`RX zw0X+A|{h`rF@6fP9T7I(Q7 zI=*+uHg`iFFpP#fj>ukNxKSDM%p!xO1{m1sQgc;o|$lO7mhlUrm8l^28=@_$@wT`EIk}$q36DuHqU) zQcy+wr;y=HuJXccnTFiHm=7o?3Gn9{uH%ayj7a|O|H4R?SP#tI9mf(zxj}1Bjni>c zLlG;~amp{!GR*cDd&E&rEN%YEkfTV$mt9h^iZ5k*?=bj77b$mdz`gBZ5m|Ui!#%7q zoHlLyEy-3K5pqwmY@xpiM;WzUHOwl{v8a5H zTguNUDZfNH>78@qoG1f)jc+Kc43<&BI#n=*d2HYzlynM@@HozRj-IlbV=|lHNa&P2 hDwT1$vUmlX(YGx;p=W}~?J1s-lp%ZRE`O_?#~X#qw-*2a diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$13.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$13.class deleted file mode 100644 index bd5f683e02358003772ddc81a25dd6d508e2959b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1039 zcmbVL+iuf95ItLmgt#UN0mA(rXc`bM6bV5J5(+^=N)b{}-naHBUF7ZtubqAu5*3IC zJ^&uzix9JJ#6$ByR7>lf9nYLOJ7@gk&$sUY9^-BWD+13_IU^m~k1@?cidAM(8`>;Y zdh%ZGBs3^o;pnKR{cy8_lE9itCm}_Nnpz6&eijnLWi}j9LQ$rSei_SYMyWtK+f}x` zA@Fo~%$hxcU?!7xBK0Jf6B5{15^6ZlV1)9P(kgo)kaU(zUbuU2$;5wE*T({-zKN*{ zfl~oapzN%AfC^6f@Nhan6-@!J<3j60rRi6fk1O;BAJY3s+=ZsXUR2GU~5S> z3)f%?xgWKC6;CKT)Qe()ZfE#EO$Scn-ul?bC0wcCvcQvLN*drQe1WQrBC@vqXj4G2 zu4_wD5b#GPPa}G*5>9I^-0{H&Ig{McfsPVmd8oH3+cj~3wrh9GOo<0H?wcgv)9=hQ zpKg=RdCcBuO=&-o){?~y*2?35W~I?^(gBU86V7>fRpImZRkoh<*~Qhn_YM$r?;oJn z{es4)BJd2q{UU)$dp~iO&jBZLIL@KPyTEx|m_xndNCzHtKNqX^6&H`-c)zgf{Vs4? hhp}@UhkFgz8OdYnj^s_;;=ROb-NqfZ9AQ_PpT7x_8kYb7 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$14.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$14.class deleted file mode 100644 index 0b2fde2e78db909be5e537f72b843c4247ed2f32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2506 zcmbtWYf~Fl7=8|$c0;;Q8VlaH+6IgoUd8i z(ldjbw%j(Q?Sy_UFoUq>c$F1v&6T+bGE4tP1}CO;Bm{>1TE&!Q*Qo~540b|OQd}6A zCF#m?==k28ZB;{A6F3~MJHg<%z_~()II$^p<|GA zM&|FG7FinS7hmm)16zybY&M85o1vvU_4eVCP}% zJ}`X?z86|d$67Xp3B0UhvXi>qlVY&=Pc!m#oRMcecHj&jHt0EH;4IFy=$Rxv7dwy` z=SX(AEv!YW%BW`XijEn9o>o+OU|<%n(uqyETaux`u}u3*LVP)g1s(JEz2t#`*O3!Q zI_ydo+nox2``dg2r+^E{>v)5u-%{N?HE;5~7-Eq>qlGz}WtxU0|(k zSrwVYB>|{ve9ORPl*ntq#t?O1f!uz1ZHmjbC3P%>QB!`sZD1Ae2bwfe(;uGv%~0@IwPuJ37HWB3Rf%`)rv^8c*&- znLpi`bplJ7tmR1=qZI(d6PxZ7(%I%zf~*C zMaLx#0}sStOl2=8TFxuGe!#(Al;OH>8}QY*>-DRWL)yOV?-ZrCC1B(|wweXk3IZ9h zWwS-{{{_+4rv@c=UHsLNB;L*4S$-=dHFEM6|J;G`d35Kf!lDy_L)v%f4GQVy+jx^-D*~VXeNSB;y^D9_NAJhWb!Be?%HC=80NOpIwC{03 z`vK$HkC@SZ!W`Fm?Puh)U$DaUn)WNC_8VO7cLdrWk#8fh{SDvf3D!`icPVVZh9nd7 xn8Zh@(9?D5Qe4D{Lu4aDy8c8?N575>y~H+&b-~3At_kM7hbng|zEdpn=O0$V*rEUc diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$15.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$15.class deleted file mode 100644 index 32f3a3b5cb2cf1e53536d7d29bacc779b8d29d89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1701 zcmbtUZBNrs6n^ejs4JC?w}J1d6SnbEhr9>_ln_h|LlaO;{8rkNQ7r9jyDj`I6Y=eX zKfoVlJa=6r>Idyy(%pN{J@>pk&pGGY_b*=oEaI_>l)zeGw#YNWw>Gs5vYp5eLL-a< z$E&|Ek6ha6h>U~ZC56h83PoVr59$V4uG0v~2-}fCY%U6o19HiV9N*ir%|=9lK!0@X zgoXP8tF<0|Rt40S=@#D5nZR;#E4y^YCi>SM&xtk#f?{$LF&x$852f$Yp@6dO+mwO8 zWgUI!m%FSE6_+%mF{C4dVS#i}s%C4BN6(t4M-+6Z5E!ocmgydvfg`Eu3KfZ~zng4ZEGA}_anW%@COsa|so$b4*L~Tr z&4_AF7?DSThFiF;Vp3owvGq7Z9d~e7AY)nxdk3rk$`Jy`5Eu5JaZ1cJbRA8 z@<-&}breVVU+X;Jc$F+h`Kv6fymG5yqH8K(O=*0-{2qfJaD^BB6K=}WXB1L+ z6${GowbbJ4#S2e)4ipN9sf=Jk8O4;6$DA_W@tThB%_x_X8Cv@E-sG diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$16.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$16.class deleted file mode 100644 index 889111fbc599ec76b3faeb6871d02bd051547e33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1034 zcmbVL+iuh_5Ix?6O`A1rSV}2(3ZW_sA|Rn6df}xiQl;f0mG<46xT)LVlsKDD;sKtJ zT7h`r1NbP!I9S2z%wj(XfZ4oqLMl?9}`(cGErq-n8=ic z(&>9K%;ZLW6m6Y837;-`a2bMqQHdxMI*r~A_hnpqXfrHKqAFd=Vpqh{M4Q`(i74ej znNn(5Ftp1(Wx^*6F9wq-4GLLd@G6mohX*Nj(;VfUhz~?638uZOv?^aRREy1FPUf`I zJn`@MAM7x=>v!cx~*$#MA)0X(Sj+-8CFg!maTO7B*8Ky)`axmc%gTIxJideo< znPiy#PiK#B=L&z`}=XzJAqe70y_)l4DXCQHs3%;pIq3fA2 zMjG59DjZtp&YJX=i3hePqFNw!mw6|q0A!vF_FVaCd%Z6jSps z+Q>{63{|tQbohwjd3QWzf{U~nW`-gS<2*A$mC*IcS)G5`gsZNrOqrJqpH?OZ9rvp} zdE)5}?(H(Tojj2>Ff=$koVTl4jv9O)4lZ)kF~{Jn*w99os(v$g-;+hD7(=t0$0FSo zg|Z5cHeK6khADb;ToMURz3~R6fQgT5xZ&YC!|If}aohxFsEL@2p~EN782p`lP{i`J zN+rYmf0lb_tw!~3WO15nGU%2x`+35#gpgr@46vvAgF>Ek^3-Oprcm+()3#man;Chl zlM1b+#vfgc5Pch)m^ceDA(ZcrLa0hW7!acL11?pODgqo@df(XFbcTcV zN)I>1Ad_q5QM_^Vr2Ft`0G}b+6=M-+LJ#9NgI$>v0qP8M)2K=p(rk-F+Iao#hg1}@ zuWTW;Gz|4(N7?QJhQN#d8KTUmfCbM$6R` z-M8;-G5D)_DjQ&EaRfN&yfYjPgdsefK1Rg469O@}AM&BiriTJ;3SSy#qwO&uD)t1JBVrEEA|< z{|9Dh?-D5-=W&57!$ou^P)ii)?s#vXkoFOM!KEWO{!cXhUsE`Ig5%*jW!9+hS+YJc Ob`!VB3klI-((?zLEEX03 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$2.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$2.class deleted file mode 100644 index c6758a5ad3dac437d3b1328bdf41c3c3eb5899f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3766 zcmd5<>rYfy5dV$4u&`VeP>~f>DxkZ(76BDmS|6aY3W%auklJ2$PuZ)>UEF&Y(AK`~ z`(aLi}i=pfxd?CN}Xy)1*m1wts>j`pw#=bM7u|!xj?PFD1D-d*{wMGxM97 z-x==x{rxQf4fw`^1%%B}bwuc1<9JYvctub%BT>U^m{Cn1JfIGQ#STm4?Vc?ut8>6k z$UUl#sNS%u4|?|w92Ei6flNY4Bs%C7fv`4g2(K|}dPlY3pfC+@yJna|7g0i{8Pbfh zT6Um4O%Hs0NVBGE=2L`bciN|TdImSx(rnSV1;&2{yM>Slq7ZqBAx$ zAfgs3g#7kMKn?e(QB9(h5ZYx>1Yf$&l+|%iIU!XKGVq)hld#6!J{OplhR@UEL?Ko< z;38~F6G{a|C?;g7fq*cKvU)=AV*om*!v~^5_?%dU5(icjisuSU>M3{vYX}OLO}7Yh zVQCSaQ112|p7(gaDTdfY8P+;bK2IS^6H-^fI=BhhY-W2TrUyBDYu%m{6N6E8IHUy( z?|$}#i#;rS*{DF31C^Yj*>R+5E2u^dfyVgpO9W~atVbQeA>-3d3YqA6%yvaI-DHyu z(&PrhsyR(sn$ovT3L2%&4DLNMl#M32mCI}8?5)$iX_b@Ids4wumbWLIY;db=gl&9| z+wYgPR)H1;t=Pfk5{T%gs_BebX=;_ufDrfH(C`Ms%6L4h5aq8%L;BHC4h=MrbzO_#D_rXnN$jZ;87uqOy6q6&%1p?tVjG z;2A>WBS+k&29BwNA`8zl{GDR7WH>Hxq93Zv@xUyDabFYs5>z1Ye3Bv>2z$~%Cw`mw z5_yc7TG+Z0d^rf=r~?{dk(J?@FA9z!%mi&%J;G${m#Vsg2!@%Q89hRQ+y5UpS+p2c zV8EGldxK1OOu-07lfsRJk@RDEbgoZif{}IL#5^?EA@rCNV|YPk=S4zUYLiX(uB^If zB%DarOA21bE6D&i5zanFfO8Rs^e>I8E*ZXT^Vbx-jyJgXmELndL{`DO3f{x}1SgYJk7j5*b#Py}`{a0%A>zZr z>XeIX8nXDT!1rmKc7;VceCf=&VFqJ1!f9dpElbgzq4?yj$l5`Rtn*V_l6}|3Xd?Yg z+UX<03>M&u7h|TZLB0-CT$_&Ds!^`4Zj;%rLmf^GYR>LREE*6yH3?!tDl1D8;;C7kSB-TjyZEl69t368k5>;{2XTJUxzyo9OS&KQe{qnlj=?1ro~*3=&)!H!x&FTy)$zB;z{F2}Go^ z%!_Q{CdPW>-(NxUQBw?V@H6Y3e##aKwWD55-`pqIi!%Xy9|L_N9CN=0a+VjQ7W2vG^&ZlyR* z<$U$5V>)-^6jkChRpSiR;4FD@fokzBt;ct~UZ#5dKpSw6HsKd)!ms4RZ`6$6X)Es2 zcKkstctEZAlXg)CwNVcFDWBJ6w3`ZP54otFig{hl>l*4HH+7PS_EHtEUh1M++D99C z-OS&b=^$;VLskj3aS?KvBuYsB`T!qt5qW3@KElUba5c0HXYdJQFv^p|r#K5cF7s6Q z89wJCyN_;sfiGD$&IpxbVG;hqHV4WasBk{S5(jJr53nukq5O|!48^4nc#{q1Sa|`y V!g*fpOzL0b691AtAS;^x{sF8TNK^m- diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$3$1.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$3$1.class deleted file mode 100644 index 0a577a2508db43b087be9d65c1defb0a878c062a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2177 zcmbtV-%}e^6#fp`vdwmp7y(NyZGosEkgf=73#}DXpg^ElB5KvvOZFPJBw5^DNEyd* z9IN)l@wvXJPd+na+?%n*b|5`MXRzt`sd2t7|H#)(6O3I^PBkzRhV$(g7kB)?tyl$5Hc_+5 zQDx!;vO*Y&7}OlQBpIr*SYRF2?^60zS!;w%ICZd*ydAJX=LM(g1TPc5OaG79BDX|i ziKs--AFQFEj;s^3oNLQC2#=dMf=;!2!i0{aYS(Kb4nyspG;s{3ff)Ktbm0UcmR9E7 zd8aB@b}Adv3%Nl^=G~$wuM5vnTxkk5Rc*q>N6$xUTvdBZ?yY*#_oYopr6bY(&9hm> zI1Vt5A*6H+6Hd2tqfObw(|CpuFK!A?6hn?u&OjO&9V7q2=}0+DjAD!(Fn?N98BUKx zFt%!xbE|>pmZx=`C7f&r*U~C*oeX60oQZKfPte)Bk`a2?_bst2tg@(LFFCgY)oLrztF#P0V7BP5oAwz3FI_BkMY@5T*`2I8@FB6V@{@k3|zp zt-Dr4g=gO~;oPBpu8QK8C`ki(EUHSans`n1hi*Imw(Cm*@iQ3VK^y(J1o40iJLkwU zlUq}J)lBVWWIfFe^Z(DYX7+hltp$u{S!{=mr{nE^F`=QxeYEE8ctttqlo?uIWRRa# zmvV2 z=O3c8IX?O}jE#1MUi3Hlf_^a&Q} zQ(U7v%!bc!gFeUm^aZx)E?oK&yYy8U;$)bdS~EnThHF^kPzUf93Y>rro}>l5j&;6o zk!R%_coQ0*0lm^I|IzkmD$@E9!%ON34qj78$9_mLQTB9c1I zl&5qilm0<)7>jOh^7dyf?jv{GLXpr&v%V+7SPqr&)I@uN^J(SnrQt}uh=QRO8KI;H zQn?Qq&tDj@LpVPUVmA?!ld1?C{w(@LMt#BX2jYX~fYMW$Nd1iPruiShXQQ-wgyL=* zi88oC2j@^STE&5dWg7*oIVht>C^U_0#g~bAJ$iR2vYcT;%}>K1?gg1Nj8Bb4!x&*_ z@v_}*CZK#|`rxNZ6SkUj5Ba-UUDLQut7qdH)-7Bote?fMgB#{iRwUIhRf0gg8~=bn zu=mqZ7K%L?b4Yz|wjR6<#sL%6O~N=;Jc+M_9;A^4m+)la@o}()yM&cNkVHJ!=COp$ zc}h+v=#&nE^D;?9wi^dZ358qS+XDYVOVz4rHBhaYMjH$7GHkwIVQq)c#;?-8cMPX} z{}`+7@2Gys9WU_L&I6bY`iP5sb~upTaS3&ngv+=xP4%3mNxt0viq&tpI+KGw!J^N3 nj{1q;GzUju12;Lkz-5~PZ)1~X5e?iyleHS#8Z6B+=)C>_WB?fi diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$3.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$3.class deleted file mode 100644 index 006c7945a35c4139cc42521c2798ac444dcc44b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2713 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 R8q?I378>-Vcu@e;=Wm-izGnac diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$6.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$6.class deleted file mode 100644 index f6c1b8e243a3ce36c417cf6fc9255800d9971b4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1985 zcmbtV>r&G|6#h0X6iR?vxrsNFDs8!h`>hBfgEPz&bq3{!|CVH@1VU1hZSeto2gk?I z5p?|F1NcymXOmJK{h_JtG`rc|bG~!Ve&_4=A78%#n8#KM8pDdu>%ujHQ%lqhVcF92 z10#^W?N(m$14nF!OUB;sE4jrKk_=;>UonK~*wsK7!I?A!d6R*$Cmdl)+jBQ9UX{XU zXqSg}keepNa*L29hVD9da;E1>ZoA6qT6|wym)7JirQB7ID-5gg9lhY@F|P=6)4pcA zwp?fUn2+x!DsU;j;Z-8>Z7*Xl>@y^{JWF(fp;t#6+STlujubl7?7EIlq|->CUq=@P z7!rA9)LW(tcvd?(5PnD#hHTk0xwFrGThXSmm{ga}&_Z@mS#pb1-kvktst6fTN>~iV zeEDy*+g3Cz753A(gOL>O(hbLEU9-SC?y1ZNeR1N|#irxDs#;u%vK>f4G)!X@4^qf6 zEXT%ZT!fB?7^A922u)yyjTRWyG!OGHU_6B)!&2cOYcQ z#~rs?lWJ#C#}bwqIvPnWkdpjIPSg)=q3)3${v$Ifsy#^pvdgQDR!Q%9HQy9ZZAUN+ z{Gqo~DoJ9>%I zCQu8uzY34O<5Kr*IXnnNfDuxg1pP53G8rX9Kqjk1C>%+GXh)-87j!z;O|vKTo}{s_ zIDU?v;>0;J#mRGIi=WZ=Av`@u&va--b<+wMqIYFYHn@Rd8X0clR>R+0I;jxmil30V zz-=0`(eyqIJztQI-lpE8OD(Vq%tjjv3N8T!H>?8JCXmvmkkzI!s?A_ro5!rS5W){c m5Dj<&!wOa@fKupzjgy--nre82bsCez)eXv2<-zD1etrV#vQ;1e diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$7.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$7.class deleted file mode 100644 index 7154abba46061faf60dd77d0be823a9dfdcd5c63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3119 zcmbtW`*Raj6#niu>21RTr4}UeER;5FX_wk+p+OWvkw6NSLaX@PY;N0aH@jhX(^6lE z3OYUqoYCp{7?p7xf6y6bFji+&@CTjoj}p&r(vnA8q-K)r?!9Nf^ZL#?_wRpx`3*o1 zE^|l>`)qYen2K{QC8iXS(p}4T6vwr7bL_O5G(^9@qzsj>H1%=>7+NfQOc9!)XB?q8 z)2<>2&2^L^VF=CDE%RVX&A7s5sCLJ7r)dvqOsr64ltA|DrtThK*dJLjO6xE~AZDdR zEf`kG2%C!VQH!{tlGL4mcnAdbBZClQe&EW z$*DEddTLC#`H+beLt7+qx3KnmVUD&A*J1-Ua@^0b>p#6BBa8>gf87;nhV2!4@}@Y- zh;LGqV>3fzIr6-aAA~p|g|G=*Wo*NC22QRVR$Y~$A<~+dP^VPIP|Y#rWO9NS5e;Dn znmBecgo|Obx-w{}?x>)8I~hZrVc1!Q>T!79zk(3i+=)FL3d6Qy0~QgL(S-*Y){%x-)^;r0BaK%E z3_BK4G-j)rab0tiK})A}dU|?fJcNgdfCO>G(y~s>GF{s;mbbJZLskv64pq{w%)rtFc>b3Ogm3_laXiY+Wn<1}?qG?V|M)=L;O zF{)}pnbO6ypeEoH+aa*p0(>`IaIR(MF!8XRM2 z@`KmuH|5TX*4wG3Qm3rx5E3}SF~Cq)US%>)VvxF}IG0ro>QCzy+_4ULaa5U@$}?@k&0H7@F5c<|eU~L!%N}R!3gE2I8&>m=rU90uEqI z#yDz<_}a}e!O(Nh>_0AMYCuG4Sw8i)NLy2)pxl&UAycHhhrwQXvE2I*Bco{sF)#{Q zOG&AD2`oPfMJ=(JWN|zM+{m-+REWn)@+F2wlI9zfaX_WbBPU0@sURE z>LFLvCI{4vPcDv^8MZFPjS+toa=f~TOsPdQT86Bwt%)PLK@r(dS-D=JQg81!HN$e~ zh&3SGaVsU`4ZKNHL$ihI=8qQnj=<1d*;nQ%9<$OJ0&#_(0y%D)!j2iL;|K@a>1b0$ zr#x0y=bdlpPNE-24XxMG-Clb3Rzhv)cL^p3Z>4)t_p zxDO3^6!tqwa$5VN{RY+#?7oFfvzXg`6Pt3_a$*jRKcj^qhmO9$ormslAcx+*VA~CZ z=I}^3m_w|ux}!dx!|_?{30MDx!1cmr4o`%ub2yX3(>bX1DPLqHzd8CX2Ex^UVq>MO zhtP2g`YhTjH$9+9A83uY*>My49MYcmRq(tYr2`VAOXU4qkfpcLAiaal(!1D3*GB0* zv`X)zi>}?$hd3x*!7=G7PD&qPQ2H22=@X=-S-8@tn3g`nW$ANVk-orH=__25zQzyI zHRPmka7+5mkL=NW^a_!sIN}^^ifs_TddD=1ZUerD1D9-T#Fxlo3ITNE15DFhkS678 zIFA|1?~7!47lOAj2+qMcHgLSek>Gg6{|*DqVce$kMb*N#@A3uumk8z}T>~_{U&kf7 L3y~3C(&_Ur&9j<= diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$8.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$8.class deleted file mode 100644 index a4f37e539ceb16eb08b8af9be6bfc4cabda6e829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1465 zcmbVM+iuf95IyUpag#VSExmAU8=9212{l(y6sSN^kSZnc&?*nSInI)9aqM7kQuQDB z0p9q4N(iZ?T%-zK`6Pr8<4uL2Tkb*9=}Z zc-Q0&Aw54Z1L+I5xn3C@zdxyKNb+akzbCnA+0nG^}+zHo(HXJ{-9jZzs*NpZQx5G{EP z9tT6xzzAXqM36F|;|xQ7>3@L6D#GPYI;}eQRkj%>DxPgQHOm)a_D`JAFi8x>VZ~+F zC`rkz<$CU3%j*P`?ty7C%!uIh`IV_=B*Vi&QTpyLE4DerZGOUfrm|yoEwdwqV=C9v`VO~cQO6aA%%41hU1=)N zz^qc*dH```kTsACL&oYIDLt2AL@i@@FyQI;)e%;5k10cHQ(E?ms?}B{pd-&P)t5Fy zVpFMmEF2O({ZFT^hT9m%%C7Br0rhp2%WbcrgR0=}kUeMMCT=l|+dij0Rup@U&an7* zO@t}j6^$mB;f>I069dUr6B!$>%l(pL1pyB*Pu&!udx@pfVN21UMz4-h^2h0~M0Plz zT*)6Iu~ImK@lGuoqi;ejrc=<~B2D(RvXdCc1X;8RXE8~>D5hwx2l(m)Fqc2TOzaJ2 zX}nx5d`0Fp(uFU`9AJUmBa!{+eq^6OA_zmx5+`Vf7}ee*r5#~X`+zy^BQn}&ENI6n z{JdhC`yD=qMO>w@DGI(sN;NDiQrZt>bgX<=(hKC$a1E<8Mq%OxUD2U3s%0AK`31}z BqjdlP diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$9.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableEditor$9.class deleted file mode 100644 index 272e3063cad4944fe888ed591c5ae91e36e16c02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2009 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 Zj(g?PRrn|7xmSh}|8P9QT;Dg>{{a-6wOIfF diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableKey.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableKey.class deleted file mode 100644 index 82b915e45a6a1fb107077f6ccf63c56e73c82115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5015 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 F{{w<2-sJ!Q diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableSourceViewerConfiguration.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableSourceViewerConfiguration.class deleted file mode 100644 index 853ef9f2287d7445301ec8c0a302d3b7c7fb122f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1899 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 U5KR^SiFf%cJN3U9wf~_0{|ocPxc~qF diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTable.tokens b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTable.tokens deleted file mode 100644 index 3002f98e..00000000 --- a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTable.tokens +++ /dev/null @@ -1,19 +0,0 @@ -PROJECT=6 -EQUALS=5 -CLOSE=4 -ANY=15 -PKG=8 -OPEN=3 -NAME=7 -OPEN_CLOSE=2 -CONTAINER=9 -STRING=12 -IDENTIFIER=11 -ID=13 -WS=14 -INFO_TAG=1 -KEY=10 -'>'=4 -'='=5 -'<'=3 -'Ymv`bJVh=egf$Ye5PbHS}MDMKfdZs_hAgQ93$ zal_?3Pu@Iv(~G|6dwTK4$(tu{o;-Q-=<}=UWqNwLY^y7WnXkL5`&a+3s=lwPW^VrT zM&N{F)TyPrm*;6+r}L&~JFf0}j%h7;#$1(_4adc6eTo-Nv!YXmON*xK zQHwenbP%{@(Wo1G)xgIl<`!wi)1Z^UF?n)GCD3`?v`p^=f%bs|vjjQ{_B`!^cG%br z8muRr?9VCtw8|TUhain7{p#HOn)X>8MpVUDF>1W0|6YVau{T!!vCQ z{n}f!odw;nysD$u2X)7PNnbYIie9q4QmtA=>FpJ7g~0hW7fN6oT`|3c8w7fIS21@C z93+Q8NuiS>OuT!>^83=lBe02i5tZX~=K9Czl|t2aaVFs~mlZsSf#N=l=l3Cnh!MfO zh}FdWXiQf{KSI#j`H>_x{0M6Zbo-&_*etaWC@PFa*@wjSkLDkT1dYH(9uJ|=?Ob;e z(_#&CMq@I~C^(R$#XXtK?}-S@@*YmBWObAdeODVprIZevVR6q?a#uPv%w5g3EElje zANosRd@aT*me|j&!59TN78tRyA+X+$lO@boXBA|ZmlooEKayW@j6^`=vBAXo@yy$> z6yrI7#Puq~bAlGcb0oBn_bsn*h&nonG3ywDzYy+n9_q~uyU^^R$mijQJqlyu0 zUU`d?fU(6~-*s@%X5?PZRmaE0sxL3y+#+>486f z>RJ+4tCnHhBmR&jWK`YH*rlL&DdkU~Dv)CvY?`4o?rQKwP^g z@&fxKTvOU4(3f7J!6Ken)msZ!>7Z8#?2Ot=RB5nG;EYm>xX?uH^zf^wK!ZyJ#&XkH zN(xS+Q43pJ3pK!B1qw>7_$d_UaU%ER=xSV(k)9~j02hFAZtY=OYw4yPf*K93 z;)0{zUf5xqqjvlf4X&xgOGpdWnP}Ae(knDr#nVb|Z_>6OxFbv}*5Dl#zXD`p@G%dh zS7`9Q%8YItL2yPlZZ!B%CDxk{{E&ddX-y85wM@!JIJNN^1eTNrq(2d`nys!s0;dQtF0QA6Syu$?s zw%}7+@mgc=Zo>;kI)a}z{E#H2ms9%u%7DT+y|5j>aRN#5c4hE(z)mTBdxX4OxxQVJ zy!{!x+hDhpzQaP^?Ofj-lDxqT-korll)fP$k4-xQcT4hyGkANUUrOIuA&-RufqNu* zr3~JF7?9F8Bjg?6`VLC+E@bcy!M#%Y=7hZaxW2=Zyo(t;9qyOXXA5}`aD5L-@@g5p zhwwi*nf!NE$UDOIJuJyv&EP!(N2T;#7xEtE`i@ERZe;L=;JB2&FNM6vxV{sTyst8N zkHbkReP0WC!(87fN!~XZyaGHSrSDrIZ-nbREy?>ngLekbO6mJa$Q$MQ&Pnoq$>5Da zQA*!UA#a@PD@pQx&EQQySxVn;Lf(0_?)eY29hKQnkw!c$WE z{u1z>hG)3G3-GKI?{6XRIpnp$^L(TH0=$TJ6?fAHRDj|Z`X#g%(VA$N&{ok}Xl=BY z(K={7v^BIZqg_G!3ffoEzJ~U7v~Qq&6YX1Q-$wf`+V{|2NBaTVkI;UM_6FKd(S8ma F{so^ho}>T( diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableBaseVisitor.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableBaseVisitor.class deleted file mode 100644 index c660ac5842dad8907ea517d00b6ace961888a1ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9093 zcmcJUZFdtz6vyv0rAupQ0ck-IpD5ZEA&Nx{eZUe5v`v$=2?5lC+hj<$-E7Kc6N`!{ ziqD82Mc?Q-zVHM1p*-H5%}$)dI-## zYKo5h%F zSh^XjO~%ZsVQD2AvrI~3^BX9o<}F)=X0e5TuaCfm;OP3-3G~fqhGxwXh>VTr2=vCw z1v&r`crFSG>?bgk&f z{$R%?T#=KW$!4eLQ2$8HHaxB7x78xeSgL7d)gl2p7DAp4hB?|M7B3qX-LMa_A`C|jzfl?@!M zlL^oHR?;f@Sh8#-tGYft00dr$!i#X6zyW4md{fg4CN&65jd=^O3Aw+)fJ zwM$^N>z)%BbUKM+pyI?e3EY)%*&a$J<2$D5t`gV?E{Aufqt65mGEbK2gScMC>|xJ$ zRie*LLcYGNb(z7OSqblqN57lAY2*S)Z(O0h^rnN+1#j9l2}IevNtN7tU!_Sqr{t_5wUL-J?SFvz39;AB`oo-k2b?4?@fS65d;cXJ#0k5;p+;OLt zWSwml^L0zAwhB1RESZ|+t?L$6*GmF-x-ry#tB_PT0nC=AF3h2Nj|uE|^3FEasoN4g zO>Y-{=g3l*w3z`5;SFf&r<-$GzYWQpTNm;5Kqlw5>oXrDa&DU*z6-E&FVoqhk&lur7xOtaWW9rQhVo-Cq>#LFIBf*;p>H5y|Uj= z{HnH0y=vBGE=bg?CM`GLxNDcx4mG6nO`DjnCo=g)#F5Q60$l`b~FXVFCi_fz7!TB*>A0(S{42H)$e z@0i&`+Ptr#0N(OcSUG%&?-VQ$NQD&~<#H{V92X?s7Zkvi>Z&}=UEtUh+(9I8jPu$q zDX>N0niP>57UvAIBi^7uiNJDbbvr-QH<~!%aA%_eI|SlV6xXMLMoLlucQ&Q^-extH zKvZvQRG>y69lGyshUl>AsNjkMSX-{k^IXG*ILB#G;0u}O#Z{}Pe?ICX-WL>jL|`TK z-FU53un>7QEAUw6zUq=~gO7Q@`+@>bWM*{ZJrGMp<3xcUWS;fboh;lSZ*5TEXQ{F9 zSP|J{;nA$XuTo>-NP3Kg=LL8Tf4PX@-#+|}?hr=&H4Fdu+y8|!53Djud`tX{Adl_EgxL1SXP6%5WsXY(#Z`s46#*^@DUM4A#XS__Rt2~<$Z%XXDDH_6cSC^7 z!A*|46%_YWh`a5Hi@=9i!g}DNdd2$~*75u?&fz=o32b1=%VVS%?_u1;sA1g3sADuR zmNDMPXkxT5Rxy5xaTnuf7(d7O5aX8^zry%6#&0lwi}5>*-(&m{<4+iW!T1#8GwA;x D`i_uX diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableLexer.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableLexer.class deleted file mode 100644 index 40088df5b8428d9b6e6596798f1043e23d546516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5432 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'=4 -'='=5 -'<'=3 -'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 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$KeyCloseTagContext.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$KeyCloseTagContext.class deleted file mode 100644 index a8933a2c0f526e78c0f5c0bca1d09a64e269f7ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2383 zcmb_eT~8ZF6g|U&7t9jCNoYa{g(OY=5wZ!TZGtIH;}FThe5kf8^{E={k+WghrL$v; z{FMBMKBOD~ao1(}tTB0=# zh6x90OfrnOgsO#yB4BusEtiJ~HC^!nvD-d65Ymuh$W+1x_v>7Gnq*=eRj<5=VW)D5 zWg;SDrOIA)iy^(YzqR{w@{-!{0#9vfDuYYXSHxmDS5L#jbq5(-Wk?-!DFVfC;Q$O% zUeE~-N#d&FN-(f8gF|K2T9t#QI3cC7IWkUAo*|LqjfOZT^`2d*x^*wox3!q7yyhM5`kZd*-ob0pP}E=(Rj(Cr z)t02_&PHv$|IFqvNj3_#T5+?Oqo<8W3{QtwGJ!h@7po4w!Ws$L(GpnZceQc2X>_B&##DqbkFH?5S%FY)S{=l{0Xd8o1(+cY< zQr0ySVkthBARq_K;WIv6ZNL0ff^2_+ z1xj%Hq6rFkKqyuW+lQvMNA#|l%o7v$Ev^s~mzX>r!Mg&jU(-szj`lEGLdII|NjTqS mG>;-Sh{kv15%-d|Z2reFL#e(u$)Di|TJ>KLhUa*JiGKm|%35&% diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$KeyContext.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$KeyContext.class deleted file mode 100644 index 717164c50057ee9a5ab645a8be747977a13705fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3156 zcmb_eU2hvj6g{&JS;uzL#)JTAfu=3Rj@xWoT4-bA7EDV`oTROd5idv^XXI|PS%=-V zmHd<Qxp(gD-~asaCx9#XT!$u5 za?Or(4DYKI*)imb<+ohV@O;;Dn!dSg%e$uQv2Rp^p;~uHx@YI*W~t@)a>Lg#Byg_f zHVxD9ZP(~rG2FJ}TWiu#%cXn2ZOdq`Kyp=XR(;d;Yi3hmDU+=nhC&x9g3k*Km0BxO z$B4lE5dtSb<|(8wDlpcR{tiinOy!~3F%8?KQzhH@@w0txMJHjn^IsQL%J_)RwcseLhE=%;LcIO2?&e7 zGEHHs1U9#Q%Qh;O=hM59s?~H%zwJ`SmwP4@j!soEuTtP-3UA;|hHPgFFf3>G=D%ezSVzc z#3Gg{+yT>hG$2@dVA(4?F9O&8%QJQTEb^Y)KL~mN)pB`i2g#g>2ctK+^WNE9@7_I^ z4}cTJPasikwcUoiZP`4+lY71(W>qog*)BUglEJMhJstO{{NMo(zcYA8s6!Oh*QhFz z$M(qzXYBfDP&e?-I}FpT^)Y@X0VC|agke5)zFp<0V4Ivt$74^Cc!u~EUp0*JsU|`D z8pqgAh0|~x<9y?`c$rTHaf1*VTS82n2p}eQLwplJOor1U2rj@RUL}YEdyW6SP7n=K z0q7<66fd2iPjO;5;J1C8^d6_Ta4O=|Cu=&CHN6|+yFQ3y4}ujwf+$m#a!jAeo%{`N z{}PZ>t|XKU?RyMsKLik`!f8EOI^IDhB#$fwDj_q-MX(pxDq*qXiN`(2(C8og7{z*w z&O|IzSi)VlrwKfbd$dy>g?p&6jkEoX?F8F8 GM*anIMqD)j diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$KeyStartTagContext.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$KeyStartTagContext.class deleted file mode 100644 index 2893767d6230fd901f62600c0a52f9e0542fc982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2599 zcmb_eZExFD6n?JL#cATMZGZx0zzSo_%Q|nNz}A$qk)@l}H0>G_iH~k_m3ejTa_vOj zPuYLq!}tP%4+y^U8+a8UZ4yZE2N1_E^-{%!M(P*e>!bUebDr~@d+hK2`RZ!`OSmgT zVptc(fZMA3NtX{)-Zec(xT@<3)9!i3j>WeO;nH4h1t$H_#Knbm{;=g4!qbgj&9Oax z;K`U^xaf$UYS^A7)WMP}`nG58an*Oj#dhD~(OHJndi`UDQlZ#LM0kR8Rp(;Qv<<82 zba|CwqDE^L43i47$T4Jk+|!+1ZZljiXxbRArW>ZsoBh2VE&@^v`G(UmthOOcpJZg5 z@a~%~!$#v2%S1%d^?M)PYP5*a=2pGQaHiJSY}Lu$(zmtd9fquSyWZ5bHLbo)))mt> zy;YxMa;-+HTh)r~EK+z$!3&rp5BrATw#RT{2MklDJ#cnOds5ls3`}ECsNTMan%(6G zBw?XQ#!2!VYRho-m;iyAL7F=0+Av*@+gwzOZ5eMcERSE^Ll-$L;DUm;aFJmqNMxul z8MX?is$8*6J!eJPGb|>{aST~1DV4IbyJ74{-Id`7W>8O`#bpJHK8tDJc!WgS=ydo# zsdw{4)oq)ue~qif#sgzusFp$3cXQ_f?|9UClP$An8(v?Kq8lsv^5~h>ae}Orb-lV; zEz(oQ+YC3xS29XBhYH?N@GjmXAqPH%BQ-EiS;$e|Iotq|Sf-hD{6LCZILcbV3f?DS zgM@4MO{+`yjN$r!)zH5{!9YtCNDf>%f^Pdsx+}_ql$|>|zaH)%&alcDej+_-0JWUH z=sI-mf^bGm9a+5$8UgedeHzL5B15ISSf^&45;Z?jAxm~2y*EBVg`!seL z%K7_HMyZ(5>o^}lTjYvDBVYa&3y&~W{ss%BFY%@XKe<%U7-4cxFe^O`yv>D(IJrD7 zp+NqM0fNoaw)B4i%A*1Ppa6fKG{6<8l*QG6?X{q`dl8d)Vp4g8v&5uAOqL`(F4KCQ zRysW~#ON>NrN4&)&c}@Av5F6f#!W(mSHZX3dd4wN!9EOv*KnIw|JRD4jystA7r-cV AJpcdz diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$LanguageCloseTagContext.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$LanguageCloseTagContext.class deleted file mode 100644 index c046acc434f649b368ef3511e09dc00aace261b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2422 zcmcImU2hXd6g}fjyos|RiGe^<8lX_{2Vo&iTZq$?)})dplSJ6{E1KAYS+dy;vtuj$ zDg1{%(3e)F6{TvWRxQ7&;?C^GO|b*91TQAAR3|DfM$`GNZs$L-0J3CuK8ek0BYS`p{gG)~XO^hSzffq5{ zt-ful2+e4@x=~wW$ZTw`t=~&t(kouzsa1_yI8Kpc85yn}lE5fu%B+)yRWDK^5VDkS z*f`6uJUo;8Ato@7^A0}51%{KRkXQSV;hWssmnz?&PV*BS3=4yWIRrM5OQbfp@9^EE zr^dvdXPDJ^@(v0b&k1ephm+>brr0GhZyky3h8O8uT*_A;@-BCMx~A^N)E#EW-=Yi1aN~7s>YHVz+CZsn6DpK629DBf zNgbr|?Ei<@x4Zj;Y;lMEq8MvyOj0Qy|p!;3+c@&ArMwyTg z-wN?qV>tDy^vUM}=V|O)^zj15Xg7*9J#BhhBrDU_!t|u|1IC`vJ_U!K`UI?}n54ZE zpTRLq(Hp~b&;NSjZx`%A?mr)Jw|nk01KdXkx&JcIo#r&vpsTM?c8$s|6wmyK6W`M| zE^SOGvJ#@T5rVC$!S9BL@)u ugRJ%9K*G5mqB)eXLNGojkGPk#W%WOdSxWVVNq!4o(yITZFnopE7=H)bljP0d)RU=-(zLb>-9e1H!Ll$5Kt4!B8vT+fn5U1sCUTic7(8iTaBzROS$ zn|cb_ZAuvWSivW_$&d&PG2F>k`o~~kI{hjXlpt$2j=1S2ZS5+O)<+9+R>p0HjkiwL zv#1R5l5XnGyl}p^dR=8o3A-}{33&xyAWH~Gn#E0rp>F_&lx}uf2h>4oj^D1Mz( z%zb`L5zXdE*Fi${8U(}C1>kOMU5a%|D3OrdcB<2%d%qPyvREQlQfF|q>8=G{(t6;IRb?Rf9j6J14W2m7{V}_(kU>o0IkTz}O8I2P(?qcv?LLp9W diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$LanguageOpenTagContext.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$LanguageOpenTagContext.class deleted file mode 100644 index 127a87df0826341a7e6dcb0ffd949479d659442d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2408 zcmcIm-*XdH6#j0uWZQIG+JIFn77&E|pe&TC(9{ZsI+K~uAlb?LZE`0p-R{P_H<|KB zfTPanpfmCh_<%1u`ryc`f0X07yW3dI7MmG(*?afoo^!tMeCM9cUw{Ap2Y^*7D#ET(c58B*oap`KFiE%>R zcSDBH>#w*{noQ&F<`%=TYQ53iWXP_&zN*JqDvtB;yoCj`d@>a!7(mvIwR_;?>I+z&C0C7iYJ9?mhGjDY;7{}`OYE0?I)q6YI477WYjvK&I1N=qee@7&?N zq?IPco*UIwvng6AX*MUcafD2kx7(seO5QwDrCV;OuWqGSf4~Ra_ULZfjqL}bt*FhW znr_$UsxL|1JL}Hc=$VailB|~(Jd}xc;(Q>Pr<(vQ(kWC{!S60vx5& z5*(!P!i$6JVQ+tUt&9;T(Ul?B4EnMyK65>4n1zwae_6K}&4`*$SG(%*FchJQDls3w z5#oua38a2aaF!;$L7yvNl6J?CrKd@6D`aKbTAG_Ne!=83+Gk+VQ=fqG2s5;|;xm}V zae8Bz8~R^O{LNA}&HeEKcXQ}IpW<$&xqq4JP7|6iX!JG8u34F-@~K~O@@Lw{;B&OX z_zGF$>nOyT_*jB~9I${lBT^>b!rOG3VG-{nVV7yuMKR`Pe;S62>+#J2M8=TNDZHDw zHYpUPM!x(UOHVLU{u4{3-*6@a4bF%v8-x26^Tu~kw1wDX2riHFc%R~3h&` zg2HHm?-1B|@aY{ACWhn r9!R)2WVDD1)``Z)%F;A&JiIU&MEn4*-6NXQ58&m%PxX)_; diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$PackageEndTagContext.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$PackageEndTagContext.class deleted file mode 100644 index 5d7795a8767b0b527240569e8fb44af986cf27cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2399 zcmb_eU2hvj6g@XiypFSJ6So8iCA82Fe>B}T1Zd+B3ML>6=R>vS*J@&q+-)|yVRmeV zpVI%pLwNzg1A<4200|_J;J+a5>~2g_I}l5G*_pkbd+#~-+_~##e}D5WfMu*(7$a;b z(UZOte%h8jN48xZsL%~S49o6-`I?-GheNa5bAu*_2p)FZ%3+#79m#)TEc4zQtRVL(_MF3AamxvX5y*6xPb zPg*G>58SAxhDpIj(J+}c#^;EnMXM$ES;PCMs&Uf|&AlxbYL7)vIG*79y0!CIwlufd zWZmufLU$GGy0O|=89cK#N|M!5qfuTf7x-!6HsRjrdM0qE;9$wdn^S(S~G{c69WJRF@#rOU+ zJ(l2Lb?1(ctk3oj$JWvaaS}~=6xD;SYRQjWkDFy~VC3I2?ZuO!>hp!Jcp?mCXraQ) zM{k07ju9>%6FvDf;0jOp6n~|F4DTk8=BLGPOKc@$EzV?8Un29A_hYd6X-bANWk-Rir~4so9t=KkYQcb>|O!Jw~lcEidlmM(pTi(l|I z2A|~>^b^wba}?rod@Mo04w%D>5h)8V;blHen8zzg*hOAVQBpJM&-)?cdi-((QL0bq z5?)PQ>l}(xBUkz!3r{dz`VI@luW@+{23#ttYz*#K%+haBw7J-$4=#tRxW@6WM;2Y;Q%i-Q#z|WS*HgPjHTzILzeE7@n4ReT!HAb^HjU vKar!qjwGD#Gnz*kt4!lv_K17QSl0gKnB!FMMal2ueO}EU62b@g5R?A^JCbNJ diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$PackageStartTagContext.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser$PackageStartTagContext.class deleted file mode 100644 index 5f7938d3e5e677e2be042b5c845b2c374e50cb73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2624 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 diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringtableParsing/StringTableParser.class deleted file mode 100644 index cdfbc2b784d9e54dead10027604e145943345f48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17609 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 Mf3Wqj{U?h557KL7kN^Mx diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/activator/Activator.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/activator/Activator.class deleted file mode 100644 index e966fbce31ca1a4635dcb39f3df216687f5f791e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcma)4O>Yx15PeRQY`bg{Xxj2kNJ>kRO85Y`Af!@2suU2YrFUmzwuX&2c)d&i78i;* z@B{c!h;cS8g#+O-_KZF6z4`d@^V@d-kI?f_VrUtWOU=`dW0`XiT9pf%7`}UU^H65k zPE5pQ7^`V2d8YU@&LXAx?kKf}a^CL0o&^}HkCj&T3Byvicf?TMOUBa25>^6KP-SQg zm6orv$w-<*F^VO_>M#jKd?bu={ybQ=$0}uL4;P3VFjP`2jAhvB4xPv(jTC=p#6*5d z%m@B7)8km~CECgpJ8+Wx=O>|@T9xS3!zx4by~qWRg^u|7i&MN7ppJ%*4P5hZm4RQB zQq=!aXc5VY)RrH-c_#Cs2}RTdxQ-h{7fCyhFg)z`{;23bUsNTpU9 zhMl6^#WR@|T^n8O14CzVuV{FwO{R{1Gr&DZ?`Qf-#JC|E7tp8aPv1@ea77+-Zg?*pTTYv33FIVMGJQckk;*A1O;}-@ofD~ S&>}5u0_-dxxKBz;=>7tZv&t&~ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/ISQDevColorConstants.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/ISQDevColorConstants.class deleted file mode 100644 index 705f17d572e7e8e4e60e15c282e69e2715f136d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 897 zcmaJ<%Wl&^6g^Y7Nt;Ylr<6yal=4mj#6Y{F3UZt@ShW*yoS?2MC$)m35T|w;mKC4C zC-4ct0tqC<--Cgdth2ZL4j=W>_=)ps%>S zp*Id)C44ba`hhck=Ji6ws#hK`@QS5sJ2l%>ZS4_5T5DTYtzjE_qegXhYP(OHR+S-R zG&R-O>!_BlRt!ol)s1H5uSmvJ>$>*GmN`?^tR_{_nx;uL84@kq(i?RK$yVt-zeT=A z-lR-{e4)cItNHtG5~mqf|7Sae6`bWbha8pMI$+a(EP&wx#~cz7yU3A@*(Hwo zm|f;rh}l(+RLrh(q+@oIgU77Eu^6*k9GRHi;aG~9!XYC;eK5R{+c9<(#S=3AeM`6AdvhEB=-WzyFhX- zkbDay*8<72KyoaQ{1Q^zk;O9MDN^6*E79}zBUW}LNqUbn?{Gd6S$vL{2(8AUZ&}d# zDMD*eNIsI}wvg*W4&<_27Wzu0CFx}MH6gS3D(6J{Mx-ezkK=FV#qo#ok-R7JMWKto z&)*i>lpo8M$d}%b>lxgocZs?My4xakYMpMkLG!K9WG#w2G|dCbyrc=fqS?KssofJN KqfXoxY~vSs2&|6) diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/ProblemMessages.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/ProblemMessages.class deleted file mode 100644 index 5c89521644264ae34323e329f4c28ffd2abf231c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5543 zcmb_gZE#dq8GcR@$Rz|40u3Z2^kn%+2!Ze=Rsz^0K#3-SHUY${aCi44xv+ch_TIY* zXsy*^1zX!vEw+>vP)Gb(M~6CgrjCxE{p0w@(O>@ax6U}@Oh<~(xgVR&as$lhWOnbl z=e+Ope!uU@e(=%H-v_W0Kd42OzhjbPhj|GJOI|^OomX_GG_1IjknA$cC=rS?$Jr zmuGz&@7}7#GJ%zqlmkU8msPHT<ea}w!YdPWNM8E6v_fvh$4coBH7D$8tUy=1hP?8yUX3oH$l?RQ<1%6~$jf6%l$ zeOU-eW}&hwLkF9_c5PZ^Ogcu=O{Qj)GxQK$A3)Kp)>wfN^Bi3>=-9q#*#j)bGY0ku zboI~T+Kju*6GJ^{9Hi|6#d5>f4?;`pdRKlXm6m}= z>HXMx=@VRse?VYyN~VjxoTN6~*sl|fYSd^7fkoL_+4bd`F>2+np`rq#T~E&G5^MyS z-UIth-_+*x-SaS^Tnv1gIXhQtUAQBAHT^SuMZ8@&-*$jVar+d}~@6m=Wj=WXEk&gJejv*^7xfhQh#$jUU;l0dNLDgpzJ4*jSb}|EB5?J*_yj{{sPVkT_G-l3aa%#vvWO2f{nJL=; z49y$VyISL^c%QT@(o88YXL?hIOmEy7P)FJK4SZFgC-Q%ZAeavEWT-HlLZewfrt((C z$vL)x^W2T+bZ1{@Fp$|+Od7ScXlHT`MR5Sw%GJYpFfn^BGE7-U)Nml4xF!{iJU3D+wvd)mxd*+J??L4&az1K(z? z4TXnNGt5e1UOB<8XU=ld zyAda+V{q5=MpzmHVLcjnTVU6bP?OT+@|da9DoWL`I=grub$#uV8OxuNsgo(*J(jQ_ zm1~>11Fq}v?s9{}yrYAu9&Jmd_a(Ok>c*U+n^8KunUfXQ+AaEOgbwzlYF>$fHm-PY z<##RLdifN5F6e$2#*ewELLI;LF|e3_Kz&HS=MuiPU@027qnRHiq^4_r4~-|9n%>2V z?ps*dw3=VH(Ebij%F&w3(3+`GDnMI158ApIZ9_6zDiN(~9<+@y+NNZ*Es1EG?}xS} z8EtnW+SYl{w#B;5KZcz1SB?7-QCGkcWe;`DCnbKYgjA(=?du)O-Ne9J1m-pg2KrkSksn^vI0_ z%uUOZfO&Aw&T&YH+k!(F3em(rQNwzHSQM!HDXKeCz3(RM?)L4wYuc}%qbE36&4ZSj zTNsYhpH>{diT&-}@7H9n$5e-tsn&!Tk0+g;uNK6(ap%>ZrZJ5f2;cO8!Z-aNgl`Ik zAJxKpqPngQx`l&FVKDW7L%tw07}z)1$}VrlPEY3~%-CF*XYp%#teKiE(UbNz>Cty)&L4w5Mo zCDV331-T5iw(QTKDs%j&W$9xuEl-lR1(TQx`9&)=so~y*AWJMpc({7+O`Ps-+dkTM z1#(jBdG01^4-s_kR34tM5=6Lh=klheAbKpXpeu*b+ZFWlU(k!c zWb}T8<@hyL;y2ia-}0A}-(e4ak7M`)ef`w%Tv^iwXOjpQp`{Fgvv*ms-+hC(I7-^v)=1O~5? z;qPS(#d-S3G#wm_w|V-=KLU(!ST^Hq)L73Yi2q`x_#ET%asftl`(uJf#KN- z2C<-w;cN34_*`sY@*ENka}4}?WZ?6x=+W481jm<%mUCkfV+OSx(W2sofpQ<_nnLG6vde~K7;&U;jyv!9Z<;nz;L~iVZ6j3@I8j63g7=P Dc-PZm diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/SQDevPreferenceConstants.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/SQDevPreferenceConstants.class deleted file mode 100644 index f9fb19eae3afc3cafd9088a02e49dd897da81329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2710 zcma);YjfK~6o$|CYC=m(p`~|vr%j8ULbYF) zDYC9M7;$HruLe=TTOx9skyx>za*@$hQ-vq5`ijUh6&V_zg# zjOwl*)r2EL+l3!j3Vz7`Rz1}A7{_8n`5!h3Ws$F;cA;=Y{+^-bb)jAl*oByG#2C3T!$2>bB|7v zt{u9`q#q4FZ(DEkgvd+WwKzd2^-A&wQdJ%KFM^4Ni)KCXP-J zanFu;%@;vXqH5ukx6>p+gGNIr%k7x2Yt`?+ZY>3kd^UJ|9{p7me4kWlpiO$RgK8O% zmzFJ-gUI*7{6YBnQ{?e*p+pOXUa7aUR;*qrUB;6qGjx}$BY%n-=yhmWC0b-OXGUTN z%lrB2u}&Ttv^_K$?25USp_CcjJxmmHMAYpSfp9eo=clN?F;vb6ZoI1yxN!v+jcxFi zsOs?MV&n@C?RnIoU+j5j4jE>%a&|-AVO4rp4 z9i`SO@+n|+CT~;CL3d5*Ft62of}6EF{_ib4He`}zd1UvE4atWW~bOLk|bc9Oa8H3*kpEmdd@L7XD1b<}k$KVSFe*(T_@MX|d zgRg-f|70{q0_ufX3J{4Mx`KGSTtbzi8>tVTzV<&l5&S)(Y;Y ShR?@om3{#+`W5#h^xOXy9?_lv diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/TextConstants.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/constants/TextConstants.class deleted file mode 100644 index 7f79489dad1133de278d3c4f22bbce96cef5ba8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 637 zcma)2O;6iE5Ph4(b`l)e23iPTqOFji2Yl(Rh}JbmL>Ph+o5(_yam=bUN*y&ZQKhQ? zpns<70SQ(80sT>^vl}Slh7UXQ=DnGDp1(KOe*nD3s(}K-%V9hgnKk-yF2+_e$VPdb zS}_9yKq;3>UzwXudp%;GJ%Y+)786btf1$GLT8QDjut aUR`0~zFk+vifS<@0vfeMLWX5EX5}A*oO=BL diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/BadSyntaxException.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/BadSyntaxException.class deleted file mode 100644 index a8f2c916bf379f1259080be96f75aa83966feb48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1054 zcma))&uX%;kT1Sc)Tbhv-h}*L7laQV;`==EsO+um+cS=Xm9%*b&;NXADn$1z+ zV_ldRSW~V}S?l+D9#6+x;uSU7*K5xS!Y_feKh-^HGqhFf_B~s@adhW1vt4|yyMkTt z{`hYRY$1*WXOpWK?r}v1mN+hR=LKiMIbIrKx{?O4KPdP zgCQPH!?qbfDZ$dXd2jA}_x$d;_sy^0-+ut8pkyK;Q1RtZd3Nxzt%kPxEG!DF)Lc)!8l0Ud zzadY$N+4V7IV>PqhH-qD3{Txa;Aw4+%_|$+7s!=r@8wY1UFmh~dgyZo`#Vi-B&Ut6 z37BUp2xKQR@K35hej3m?^?T>qUCbzG2Aee;IS5F|O%=Py6(~9tyxxvtn3`tZQO}j#h7)> z)^+n{d3SGwyR)!dWI(sJF;1HpGh<_vLSqvI^08v=#AzLw7kM}+vL=G%$^DD_Z52;Py(H~Hf)TjUe diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/IllegalAccessStateException.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/IllegalAccessStateException.class deleted file mode 100644 index db7de0eda33ce703469855093db1783db8d474e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1081 zcma))(QXn!6o&ty3#;2=p)HkGX{lNT+DM|@)ig1!CKzI3KrXm)x}DI~?Si`t^|ibr z@xli%`UpOTw~hZSD-tY?H#>7?{_~xG&e?C5U%mpUp=2T<@Whux#nQ1(tU2*DhQgP4AqN2mnIB>-8p&9H^*u?kqTr2ED9_)98bL-oS!Ja zB~M%>u+r$+EFf8iaeQcmXHFncYs|5E&GQZfa;3(5Ih0jbdfjR>^c}BzP;P4*Ic;NA zz&vMLWH&1Rk5nK(4QQSDy$kIvW^8IkULa}9K|n%os@PwxKxG;dySP$1wzjRY1%dtl zP3v^ViT8A3Q6Q^4?Xo%O_kF&O;+JbB7ha7|W5NPmtb%lulDf&v3+WTIUpLKZ8G zG+;Fb98#&Zsmk66YqNw5%Vi_N`dAecsK+{PN5wgtt5_SetTnQ7b69t9H)a)LR-Mn+ z4KOQv`y*`4!tyk*5y6UM*~FL`8)GUoHbEfA6=UDgM3PvG*h0=2VP}?Hz)fsLTT0cs4?)&Kwi diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/IllegalConstructorException.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/IllegalConstructorException.class deleted file mode 100644 index d620a566c46ff1daf297828cd5370232ef7e9d96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1843 zcma)6U31e$6g}%NIjRD|5JI7V0&V;iFc7y;62ga*w5Codb>f-ksT+CY2o%ZaBcZST z8N9SVfxg&GJJW|g_D39>+Cm4zDFdf5!Em}GT;cOjtcoDu9li{c3U};)q1rg11|O;2JVA2D@%BY~sI>B&BQkYd#Ag~VQT0am3|z() z2F(tZce~-w49P-qGYgZdT99ei3|zx*(#`21d;B9%-0|SeANR%-J^jLs=50#^sulx`;7r8_6fuoQirFGDeoV6jo)A(BiHU^bTZ`Gw z(UWd8(xpC@Muk@>;g*6o20^iKDR?CYkO#=>WlH5fz8OWBqsmu@N|!k-T?TbLRfm&< zVyrrekR8)X<=H+OqhNQbarcJQYKLH&(kOLk3U;7zEr$JxNTg{`C)mrAsXm^KA}>%U jA1LJNAo37dKSb7JWa*0M_(2iX(WF_5&RHk?1UCK!IK-5Q diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/IllegalModificationException.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/IllegalModificationException.class deleted file mode 100644 index 75e180f8924109c339c1e5638eea28a4c744db00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090 zcma))&u!@o8{aG|5-g3`WM<#&_kG@X-rMiLzJ3F6fU=1M!@lA};nw_jJu$3_ z_qG@W(sTV zvT@A7o-!;SQLTWxL5Dk`NdElz;q#{-^&CU$v2XwHL*>dv@AM%>R-F~eVDCzbO zcRSigR{O{>nCHUxc|WTEkCY)l4QQV!??Ri48Jn7sXGq#S^ofw2D)v{)P??6rE-sah zt?g)Rfno1|)4JVp;%%K+WLOohcG(IC14Xx^dC{=C)Zq&ygXl}Z?YC{kZ8B}OyinQV ziPSSFUDeNrx<4p^W=j7b!zPkQ(QZks}QpqbbZ|bvr^p~;npl{iwtZ>u;N%YF=ocbC>0u;h%6Rk>?<;nB&js)R>D@M|(dmm2as4g!} zIrOc8apcm{t;oJy4xjajlrojuz=+>3@j2dEz6NFgYy&V zcEpJ-3E9@by5m4|luDL|&Q5 z5%hEEd7>W{|3^wFP6Ik;?%+Z>iy0-wC=!yU2s|d_r;7d65^B?s*u|C7$l8{|mI?d+ zo7U?^iMLc@g|I3e<+2?Nhc3U4hsBfXaeFUZ%MWjSVZQIU!erA%dl0y$d}gTuY|d@w zebpRngQv+q9HE3HQoQRNC2)-+Mq!cHG@m@;op?{y##s6sN;13}ECrUKA%hkEN=G8B zBFm8iOY-Y+_80jd3a~HrTeZSc$Q3*+i1D24l;4ZH(<%@)oYM iS~cw;QclRmglxoQ)#%%}6FM-k!(STLxy!i;-1`kwh0$&R diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevCollectionException.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevCollectionException.class deleted file mode 100644 index 5434beca74e07880710a6cbf6944f7e32321796f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1666 zcmbtVO-~b16g{sWRBH>RK>1J*RG=-C5yiN`m>7^mEe0(#aXGY)GCIuEnQ4)YYyXK` zO(Z0mxHa*Axbrs{&zsiL#zG)0`sUsD?!D*SbMH)l{`vYHz!L675D?HDy)G@yeOs1w zO};D1s%O}is})|X%KD0JnzE!09{;DP^fcPb0rD?= zAeV3FVpu!&F==gEccs?!%^R-A@SX>TWq1z-HqwpErfyZVg69}kWw{gUT$wXPfzXOw zmQe(ejG-3;0z+LeGR4c_O$Cwr3$2^88nZ|*wwzCyp4G)j{xrO6F}k?#4G ze&Lc{b4hQgtux0A1Y~tn1b0oJ9+E z%_+$>zK;UqCw&bT)Er@oV;tl+C5SPE(L*ajD}YP21Tlj? z;`MHblP4oi5b-)QO%ieH1jL)TbqeBi6R}DLVX{eP=jM+vqv{*Xj)uBaIZfqe$bA<5 zNc)&ejmTD&$ySv~D0Ee2(yv#kpMzeRxNgTxvR zO%RR|=9|Im^j5(s2B&@?{tdZTN6SkvC@j2grX2!q&{P+c64>cVLfx2gnrDOV^PUYB?U;6T6 zV7rcQcHSJyam)4Oi+_7MG=cI5YiyZA%Ndw&M^0d$&%O(+`O>qkVOM%S8Sjn`1;i_X zl@@`4vCd14~#zIpFKuxjo!7oazqI}=nEVPytb4`J0vHVvl7!Dz*8Y7$|@YK(o) x5J_SUVk>!Vf~`gJCa%+`E^RMTPRYiUY{X=B(RXk+Okm(1R~q}=r#FEIe*r;ZwG;pV diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevEditorException.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevEditorException.class deleted file mode 100644 index 6652659ac2a6c80c26634eb65d3ef7bbf98058ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1060 zcma))&vMdG7{$+}foKXXP=kQdQngBM+hYP!_Db4R>f-n&3^Ku6-6? zz!fttd;r&ukK_2=Bt=B*xViswzTY|byZQF>%U1xqsOd;BG$bDj*Ye-@#MlxaY%vTR z&-Ja=+aobP?m2-ck8e(OXbfAo7Tib~vc8ZGA9RHD33z&P#K2xNWDbcQa5w1i!AK-O z{=lcx{p@#!)V||7!2!ckZM(yu9eO=sU%Rv;a>zqj2{{-*L@W6-aJ@AH1>`OYd5RiWz0aC^95%KJtlR&Y1nyGSp`waf*e~DB6a?Rv32vx2)TZ3LmM$Dnm}V zDrIXl97?(!y%RlBmpXebogn-YaQm_?xlN&smN$~Nc;%?xmlpjWFH~Q!33@~N!x+j) zB1N-Ky9Dmgjwo2BF-<2gX=XGh>l0)?hmutq4Uz&GXjnm(R_RED9P+eNfHfKw;DD4$ zo2oY^xHnJ8kzGC{6e3kjAUz7WPYlH>E@GADSthXx|6o19!?2_Q&N5~9Wsl9EGmi9|WvS)WCh_Nb{ndzCozy7CZe*F6O9l$>77E**wCC1Wg`XA2axG6t6 zaum2j&u_M0AItHJKd}XaPU(6<(f6)e&a{NyxW` z4i^wyhT~+@2rgWou+_Si{{up?-n#bR4wUQl54O9ya#2?<5Ufk-`=TFJ{6|VC&jLCZ zYIvpXB#eq?lnJIILZ1o6nPS&kLSq(^xVTXoTU*!IDq;7wX}w;Y_(&(#2s!C#m+f#g zQhYmpA%317_w-7+L39!b=Y2;BhfUk5gCn{BHbv2o;z}^K5aH z!X1t{AB#L@cxR7i;@NCWko_7-mU*;U3S?nm2`jwH#3JO7=STwzJZiupE44P=*qPwo zJR!&B@)4mFs}ch1QNn#@Xjb_q*6KW~$gI+TSP$?pVO0~>3143~z-sL5POvr)TV(^4 z2v&<_Q)5R~&&J07phcY`TWn(RYGyZ^CKzI3U|e8gJS!(~v@6(_&iHlw z1R4_(WBdSqA@7XuX)7ZP7jN30bDsBip7(kC^Y^zO0P3h}NH9Edc_19qd*2g*DLz;vhV&EZNdJ&wsrsP9kUSdp#4>I$Y_6eru1j(9OXI~8u5pW1?<&>ULii<3KA$D2uiAU%e9 z^Q!I^r*gocoe9t5{Sbc11w(1pTYKOR&(+OjPc^Wm8YnTOEI#&#P@L)GLd#H_g~Sam zlt$QF3R`B_|KGB1H!8fX3Jr$5aFol|cr0e~nLJDbmYqUyWnN|eDb$VuK=P~UudTX`9$^_ZZp{PJl zoeqF3mFBQYUztdTH56&35cwE!NJ^zm*Y*|=R_VgEkgy)9Vgl*0jtyccR%sDybKcDc zu}c47ZDS{9m196S)5e1YO+x diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevFileNoSuchAttributeException.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevFileNoSuchAttributeException.class deleted file mode 100644 index 0d3597c733806049c9a4c44b2c44cf27573f9f4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1072 zcma))-EI<56ouEO1EW(~DhNf|TIx>)+K9EiFxE6NRFgKOiJ@}AjSln##*8z1W(JL~ z;gfhp;zb`o-^0f+?lUt|f)%|ve_89>>+EyB{rq|kU=I}?3Bn_34uw4|9~)8skRAP!#xuQ=CGKCfq6ovX*uE~ zc-s~7)a=@VkZrm>E?{yQ-p7ZUKd?N)L*pAMw^LB)#!B?TyQi3#V0hESU{$E7coMtN>3+-j6(hp_#> z?oKE2-%|c^9`{uvumOHP{%wR3l1TBa^DcoaykjKh zc}(-kF3-esvNpoPmr#=7(O@aC2n`u5@hTmOa1B}BDL{@#1vp@((xz%#BV3;*WVu`} zBorc5Okh0W~2@@E&%PWoR KY%)KAd%pl48P4+n diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevIllegalFileChangeException.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/exceptions/SQDevIllegalFileChangeException.class deleted file mode 100644 index e69f2d8b5c2390e67c1411598f8d346c10a0e97f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1093 zcma))!EO>!6o&sp2S%r~v>+5|v7oI|+Q`DjnACJbHNg-Q1F~S{?eqqwoenrNP+!7_ z>5AyW2XN(sxbX#y=gy2su&r+Hopa|u-}%qE_v_EkUjXc*q9aCl>WZ;+YTo-3Ij+eM zrX2d#!0~FWH%D^Zux;5B_Djo_^}cX=^2Kj~4vnyVQ|?qsSn;H53A-a*kJ)b(TkK zblc+CmV|V3U~&P$WjKxwHNS6pglEm0Y+m2u0U=vyo{F)k+1z`r<-3;CJJ{(cD_LbF zL(tEq=ZRim;V&s6KMQF0-NA+O7cmNoktf7WG4hy@ohkN5OQ_C5A{SRmLu;D~TO{oL zZ(6q-Cf-+xCBmw7l*`s=ICQx?zB0bAE)V&_wfx|ZFU+&HD@-Gq)lYH`ocj7%>onYxQkfeAuSPCpdLkcVWl?+8# zMVcc8$ndHFhpbfEM0Iz9JM)Azm&*i%T&Ri&tVa%O%uuZSRjj-7tQ@n}u3@cXBVrXJ zR)gDD1JJ9xdlTH7hZWesdH^ehvZ*mWGRCQ_*kIerVkyGDV-s=48jLMwwF%1ej6}8>fbVD_%Atr{(f|a-QhK`{#Ix}G1>eii) z;1jqaap42_Fg}9u+?f#xV&mq1anA35{(t8C&#&JA?4goGOrYk_T|On->*p+0+q`Q4aZeuxxkXATub)b%Jm3+adapko(e29SizUJ z-ihus_LQi19uBMLB68m3y;)KW-&Ah7el?oKE4 zZ)^W%=zqw6rV}1_1rANFn>r=R=M}SRmCj6KLiijh@J;_@PS9l`@^ITJW z+2t;{$EzbOdYx15PeSb(Jq?=l2SfPOG`_VB7A^b5K<{1RSJlz(7Us77sJLIyxygMiwi{@ z_yPPV#CSIi1qr2>vFF)-@6C*V{`&p{z+-f4C^7Vm$fV}Ur;*IKJPG8)s#qsn1Xg9j z#)j{n?P@49Y{w?#GKkb9kvvs=5~ZQie0P{wLvP;gzsUiH>Jz1veaf)V=^inZ_u`TC zuz)2W6;v6T1EuBbbUc*itr$j5o9C${h0c`s&_*U(~Ue-N4Akww8}u#c6M`ZQ3ss6W$~diz)=KXbi(hC{f=AIE153C>(JwC0TBnSt(WG0K zX`9+fAp^R^z`|i^W4+@{PpbzfSb6dAi=QV8pqt$y|=skSl<&CufFpn zKP(GcZSLxubx*p6DIc{TZS5O&gSQeCq!>mHjAKK$D6a3+54b56^fRo+rG+iIyJwi( z)3A-V3c9TaT_`}Epg;=-E>^8yG>h)L#}Un9(SdNaZE6zg;#N8rD<6VnTQqZu2iU{ z!7!;o!8wNEvaorjd06M}3!`pvhOx3^8dlA4g};x2DY-8^hRt%^mj7^^j5t+ORl34% zP)!OhojQu}fr=T-DVSv#|Jzhg!)45qOARg=O7T`B**BrnLH8|EH}n0bJ5vy4GR)`8 zJuTl3j2?ES~{dmnOly%CmKzc?}oXPtvdf4YPIS# zU6cDIFf5++xvltxrRHe*l63XamGFme57idc-7%nb-LgoWS z5}2ZO3@KV?X`Q3D=P`%{WGONkzJ>G1(T?5^)LEc?A<}+HY+pOm(N2EH#S=_-K`awu zg%GQlz*-EEX(KX(SRiS?{KW|IIzr?+h_ARpP50#7Cr*ht4@q}D#>urgIpSQ4ILi^| zRm915IG?f7oAQ__Pl)oAOnerjWZRT1ZqR?L-_0%DjwpJtrz0wUMCLs?7oI^sg@K(w PMhouyA{mA|LDt>h{G?7*3{z4OTxd}@PlT{ z%s%f&EqiY5v{|wbG@-Z8?Rm~Ur_bTn?{Aj?Ug3p|2t&cM2HY)nKkxHF@xXStIqdfM ziDA>-hE*BMrg@%YNrT-OcV zZ(7f*{Sl290?4cq07{>dKq zcC0;zGo+19+j5$gXN%h3R3ITmdU{88mm~}J$S5d^+39<2E&@qo`6rkK0Vltvedt=fzDJO^Ayz?A8CUdLdA&r_ zmFVvhU7r^*0BEHI_$v(`NM*(71%kpb0hRERR1K*XSM@tsD?KHhWBLp;elZ*Mi;Q2~ ziTTBR{0HHr5oXL*bcBrAij6RDo?+oDkwkEp?)T_m&`}Bl=nIL!|{LtP*JPO+1kY~}J8DXLILDDW;6`^xW uTDZXDl`r(>O4=10yOxloL2ChrMi{}bq?vYs<)2{x?~9<|a~84cucbeGK@x-j diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemChangeAdapter.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemChangeAdapter.class deleted file mode 100644 index a4cf9823a1a38e36031993d3d7c839f0d356ffa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2268 zcmbW2Ur!rH6vfYg@q)8S91=*OB!%FnHl*GJ2n{vCHD-wk4y3Ua6!B0k_5`*yYqDM= zA@z$?{QyXPN>eF~sw$6t=!a^1W_S4`7rIJ?_Rm~qe{=4+cgBDI_1k*@GpK6l5}0+Z zed!pjS9Q5>ytEs#a?tYRZrSGDk*=|P94hWu&bBPntvye=8e#(Zh;Iv9Ezh-TUMJ%S zE-;^}Y^+p^rEjW*#j=_5c`08@>fc&YrUC^rst0>gplfqQAUmygfo@#Tp`lmca@ls|T6=d(x>akdK~#UaS+g3?E!S4#Fc|Z8 z?3TcTazvt?35F)+xbhw~2wXc$nZQ7(xIt%)is#zSHuWl@*ObtHCCg9g^aO$Nbh+tn z8?x50_gd1ZHC<`AZO5~BrLhtwtsoyM$e_Sz)O3L>p%PlBk_lCeD8MkYP{k0q6o@&R zBcRp%o~R4Vr9adolWphu>j>P^(SvcWlg@0eB=9Ld({Nj0<^yf_kvh`IP};Wif+m?t zXQH%qG*&KwNqny1jzBg-LdTanvM{)K)2-W%)ez`TXPA({JsndR6}X_B3|hFZ;xjt# zpTu2hdD4%6q2s}Ed`UKB82?g7PR08y=ODlc^hjkTw{ldPooyPFK;UAwVh>KHtMG9HhFl(1rn8J+pS6EiNHvw zHQ^43Lg>R~KJVlfNSIGvB(P`?FN^CcpUv7x^|A z%)%vH=7{r=#1%3WtN$$4)lOELtjxKrfsi$L7VCN^Yl^Jtb6G8%&|8XuzpHh{zH5{&hi9{{Z79(vbiF diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemChangeEvent.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemChangeEvent.class deleted file mode 100644 index e30137d3a434071ac1c45446f4be8fd561be30bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1783 zcmb7E?NZY~6g}G(QbH(LY7y`Q{Gv^vL97TAQ9(eoqbOL0@mER%gb59%p))*&Z=y3& z2A%N%d??4e*;qOy48xD^-o3f^+;h*~?VrCte*?&&AR)w%bM%@~(W+m{Morr`Eo1Gd z>Kgk6lh%siXiE*(!meJ~F%~J>l@MX*+0$#fW|32SU)nRaT!x5ybYL)y7cK!^^_VU9-wCc^Use`ALn=9mD2Q?wWIE2uRCoLUX7C&|34u&NR5x?_tE4Yh$ z43cA1ZL3B-sHq_Q3yMlqhF>eg1o67^D8wjT%to10r$PJQ9ZdxH6|0c^4T4 zqZnamcWn_Lb?r6RF)KSXOaD{7F%{mtgmH$xv*{J?`9sqx8%`7x3`q_o9zxU9%Q7_N z_$)l3`}P%S22K~FcuFJC;nN@5CYYHaPI6ko7_uB7uV5C>h^~HcU{uNsV?jtl?j~@b zUOtNF49uf49mPCDmtT!5J~PCnd8Ob!9>`e2w1j1b?A5M-?!6?mVCcV)2ZOw3A39rx z(0m|Ju`CxE!^9~}e>q`<_`4x1#9xiK)0?4Pq6itCv?_G6=zE0rgnEK5HFJy}b@Ui< zb?g|4?_O4t)+Av8Dn(}K<&7dn0{0?|KHp3ExPg8;af{bwp2aJNJd4*3lXn1ver1hz z9@VD)K>QmSAu0nuHRnMqBEW}cxEYw7Xid%sCesA_m8Yl_uN>o*>6bXg?GRc~=9^Gr z4GMJGK1wtHp4Q}*rsTFp@`;&Zgr@q*S35%E$)EYz{s`kms=T8Vp;@rkCTNO!)00yaHT VNm1A*C1V+{vEnuKh6si5_8%_3g}VR% diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemWatcher$1.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemWatcher$1.class deleted file mode 100644 index 2271d7a3ab97b49ae0047fb5536473b556af4acb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3589 zcmbtXdvIJ;8ULN^<7PLvO-M_pp>GJ7gwRc)ASMwl$rjQko03gi+gj?)=Fr@BbMJEZ zZu;BSuX%%kut38BYr;xoEoXmXaO8l@_y(c^jTP!p!EvmStQ3g)V|Ko|gSPrF)mRs$ zyKTqzZxOh$<n0J0ce~+UHD-2vQCym2np0q|yti&pTNIolN zj?TAiY26XW8mu$0R$z4{zkQA`J+F}S12(!cftMX)Z8tI(pd*ecN0(qC~a?bG)Dt||)S zau2CIcBx3N#dQYS1v;wT`CsbJ#CjwIYOPF0=JUP-u*3AA2_zpD-( z#m5ZXEO3QZyr6j#onWDab8a>((Al!(B1&5q3T3N2LTew#Ck(J(S60>AoVJ8v3x+z?Kp) zXx*h<6a5%qypBBV3oI>ZsDhL(1A_v~7YIUoU56CzFfjz4K=`2Tj0&tPX_=d0&EC9~ zEIi}w*lB=mfAw6wY!_$L@jd}Ie=^Jb>p9P?RVZy{A9HxlYFGm$`kOZFWo+8N1(Nu()d9+JQE>TI9 z=}{A(#pmeIn3YfIisW$Et-}6-i7%?1h$r(>JNhLP_u{?^7TqAw^Wm{bH^qRJW4C-6 zUp4R*PO3`3al^#d@O74W-ag7{O1Jt{w!UHFn>bc+VuQfG|I>*osAF4?+nK~B{kYY2 zv(j?9;&>1b8+eGrq~hR3giL%JkI-wTjv=({Rx{v1eAmSHR8B+tgNzACUf- zOEh^&-8B~F8L+R7af^u8=kVItleO}B$x{of)L|`eUm<=Y5Dg9L62@Cl4ZktONv-4C z&0H%=yzSbvFx$>y@fpo?nWE_(CH*KGxi%@Is7tVvPl3zP5NN4+A7RoV8bjTa`0I-3 zNvvFoW#_Sc5=#c!r?L8HxN2A9)$Ql-k=NQ@hIt-s@hNo7;HEGJLf!4Z#slp$=oXm4 ztsKGON!U%{8Qd=LI#Q|YX0VOaNK<4A!>16P#8&mX`xNS?u(y-z$}vtb_#Z9 zlqxyUUq`OfpbAb)^;)a!HyKT}P0?u-logijUx*@g8sB+*_Hu^U84DD$6er zQ-CK(eTp1EB=sjo@InJ8%94kLZ4zHqs*Kn9&--BNe<9|s<-GY@-_W^B6{Wr3>`7(tX?mEMjqx`1|^ai7Gqtk)A*#HgQT-M+_F zpm~z^mzDKCSJwL@>iseIa#;L6B4WV6n)+E>gNOkk49*jS(+0Cxg=mptAVr#ip8)ms zEMWt8&hjEZU!Vb@k_w8iM2%X3D%Ti;2A;2{2QSiY4YR3wC(IL?;(36Xs-f-_&PLUL HLHhF_M0efC diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemWatcher.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/fileSystemListener/FileSystemWatcher.class deleted file mode 100644 index 529cee9d99913304c111eff7181d4855d470fa60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6179 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/SQFCommandCollector.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/SQFCommandCollector.class deleted file mode 100644 index 9c242fc4d0cea0d19c50dc9c59a4826805abc0bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32155 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ΧIZ{6*Cz|2C7<(B*V=?nMf@=r6!ats)3-f+M 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/ELocality$1.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/ELocality$1.class deleted file mode 100644 index 74481b7521a166c7c7e316c406f5b1a687443276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcma)2O-}+b5PfBVU03`<#ES7~MeMFLT7>q`Det`ya0>7>}RYB4hWa!s~LAGgD$=S%a)By diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/ELocality$2.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/ELocality$2.class deleted file mode 100644 index 1f5536071c73cf69936c1d93440799ca87bc5e8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603 zcma)2O;5r=5Pb^;YDE-8ym;`y0VLRj7%v!uA()Umu zlyO=bW1ykc5kq%#^=7ZnV8>=X0Ykmj{yUeA z8cjY|#^;K`nV4l5h-;a&QTbWsX|fLLbfg1iB3j3dh!d8{0zSztWS52Y-M+ z$~Y~JG0_8??7o@VH*Y>ZzurFpoa3l~978+gE1{g|$rmd}s+k_>AP`nmgk-lxp4^wI&SaK>Namfno`H*bLYI zG2M-8_7c%uS1NJ0e4L8#o=*e8P)UcF@K7dx7Bu69j2Jqbt2eqm1}oO<2^gx)*5A1- zR2Yg&<%=1$;WOA{y$n5ZBa=?bKl?mOHbTt~l^5uUHgYTCg(iM!q?8B;0goaP^-sWP zJ;}+@&0~xF0$CR@)3|louCq5-uPI}jUOQ#hiA7rEmk0q1J17%UMeJo79m3?#sO-NG fpHaY(o>Un9%TWYEVqL0OL_ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/ELocality.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/ELocality.class deleted file mode 100644 index 704c4804d70c27d7a42c7d4f5cfc9e28ac9bbfd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1859 zcmb7E-&fOS7=Av|HYLQ085DtnW8iGsjt-oCj-C^}3N^C0kZ78Ar}y6O z57_0dcI)6A;EW^3YyXY?A9L@QM(vafd(phf*Y|zi=Xrm8umAn~6u>w5QN$2~>KPr= z$+w<8GCO(8dF+;4+culN4S&RLdI-BjxJ$)hQW}O5k*YI#ep&{ z$016XfWjeCGDHqBI}pUxIN}m!dJtd8h$F_q7Gw-VVmPl^j#+K*?U>$A#*S?=C_yV5 zhG+5b;8219g^K0>Y_%9f&uqDNhg@%+p;sNCArcYE$@mJ3RK$*9w@rdyOsj)5m1BG@ zV+qR)ao_D#onb7ke%uR*2Ku^)YYd|w_DRMKjxgf8n)|Eim1wBB_jfXGf{&v4tZmrD zZoFS|ZRZIs!HW8TQrqDI@B)4aP5@%F?Rlo-Gn}jYM)Q{~<7rS@5t4-4*bq_rKdWxb zH}_hc+#vR;axYiF)vW-@2r7t|3 z+WzA46($A6{LNl< zpm>6Wu8aytxNv~+6HMsJWaJ1_2bey=jILaY9^vx?%*9@U>B2t7>w07#({(+%kGc8* z=Kms)AzY^CEF~r)luV=)3EJ=rn8HOYAcZSL^2@-Jd(#CI(paK%PG8JqQ%AV+9xO%< z2!l9hazUEwAvG#8Vfb$Z7NxWNF|zv2$myD}`X^>5BdKLAdx-oYu4d?Wh;M&KH2dQD z5KGPc@#Y`)B7o+clRk diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/Keyword.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/Keyword.class deleted file mode 100644 index b7e9da242207e3bbd61730092dc61ccb374b2f7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4320 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/SQFCommand.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/SQFCommand.class deleted file mode 100644 index a34c2e8df825a422d8db0419a5ee23a8ddcbaa9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16831 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 bpjOD4X2Oh=Do2$~ei*>`&HX%8nV0|nAs-jx diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/SQFElement.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/SQFElement.class deleted file mode 100644 index 526b04cf6da4189b4e2420a05c4d06c9e84b98d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3040 zcmai0Yi|_S8Gep;&8){0F3TlN2+7h0uy=tC2{;9V6EHS)unlI7U1$i5caQBcyEE&V zS=*2_NiVsyO)Djl5)moiBIS!eBvQJriqwAVhyJ5VZPVwS9k0iRDzY?t&YAZ-@B2LO zW&F?o{`GGFPU0g29SV8hUeazcSgh!!qT|kbgI=|&%c0}B#Th%$#nQy^P*vBo8yZL} z9Qh&p%lh83=T{V-oF2J6a=SEn{@Ud2()p>O($K{9q4B{Xh3x2py<``wwmVlWg}&p? z^(#Cv=(#~?yWx~wZRiZT6wI^J&RyrKJ*Nj0_C|0+;}Qzj0h$G{PV=RAL|sLNHS&T1%ozApL= zH*{*ccs>ZUA6n=|UZKkg#=UU7QLS!?{L0J%>#0AI%L&%QyX3I!qCDIb>5p4@4mnmq zDYVOX$LxBn+%7UIu|h@6Vb8DGp~9YZUdaLyJzlc#0!|3rDGLQ0HSjXaaBHnyXgJl1 z_D!5dzkxHKP%)~mMM=QcaA6}6f+MmIBa!J&$*(EOrEnEZ} zV4Gd9YnMH8ED0R9LY%Y&xj5o}6PGYz;AaX}6mpy`3$NjXLMHTD2pNnjC{rAc(AR7% zo8{}WukBC|`(ABJj@Dh@WYZ0;lyy{3fq{}jZ?a}}`(5#ZT`ApjLwludFDbZg;R>!w z3Z^am99J2t6G#GE$rI6UTKENCXS`*P*BzIQu|Fxp;JodZ^kPH1W!>M)>Nt%zEZoK& zX2fwTdPOqw*xncs+ZhXGP}*%(?aqbsQHez_W-ZKt`>vod6GT%-VPDV4$fJ5w=+juR za93na)3heazap$$3qQg02I>lj{*N%FiHmxvElLJHhwS9M&T#_en2TJb_UkzCf@q4w~?APpa=e9VP{h zlbfj5$$8&fmX=~y%C)yF{1Q7k&gvY-Vbp??zFpP^-cfkAU29`@Reb3Rsk8~oC}Dmp ztprmq;l}#oEX-|;pT}P1jO)uh9WIrVBWR|>! zU)IBpOyV6I!}PdNz(Goz;-@c#r_hOQ+!@?;Aj7?x*mv`cGm`IQVD7+9K6i1~$D908 zAd}B#)f)DE8{K}APm?!*BgE^$kGQg0cEo*}JHgl=W4uZXvCZTQ+3aI5P7ve82xDK% zF2>*uJQKwzX!~Nc5uynrBVRbWh67szI>!qG5m>He)&?_TFkZ#8wCW%r=Wh&K>{(?jK!k=+)BdqOF7~@FeDz%+R@HE?@ znUVGq04I2iIly1>-JNgZ*gw#jUQMlXn@WT=od~Nt1}jE3O0vlBLX7nhuStA;`8B*a zO2Cs3P-1I=x(R12{}7jMurR7k)V{{?@rUqk2-EB$ zd6Hrv)RtP*j;&$k?`P6arJHy&wVGaKOauI`jNxs@?L~hr-m_!`IP8iAWKm;fyUcwZ zhp@;WxDW zFw*d3ONDlA+~<3#!T}=ximMJH=J9LZNb#`noUy>2|T=7Z$@hy?l{5>W5zrRU$tEKzK*{yTY$*qBB4tymEqIByelILIm z{z&jYarH5F;}e$2r|h`TDA(sK?+29X3%rCcBf9yP(>C2xamgH_*dI`m4&La(@3=}u WBu%8vUFtvBqoh54PhTDQ!~Xy^>x|6+ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/Variable.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/base/Variable.class deleted file mode 100644 index 3bbcb369723b08e920502cd1f376d6651052079a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1062 zcmaiy(NEJ*6vn?hCLOh~tpW<74g|M#gDNh*U^E6LAufBF!N7~T>#n1wYxTCw@IU$D z%a&-O@BUH7bGvR3Hp5HTdv?z6eBamm=kJeS0BWddNHLTo?+M=yzqCcqcKwgRe&Bh+ ziQK@qTRar@5tlA+c|t>)p?F>QTXFt1kZp$9=dSNYFBoP@ zU=XiV|HOOT_PF1%n~`+=&fa820kU=17mc%SOUQRh4ue?_9PW+eCB<}f>V^zf{W_te zxjlxZDI(NLqnB83@NT?sLaL4#EGa9q%G7NGcaUe$LlGr8sPd|TyQ;iE<<}x~r2AQ= zOChu`pENg&4aJF_sKJ7Pb!-r?Gv+ZYmdcX>Ww6P>KInLal7=Ef?y6J+WmrmD#AOt| zccat)_&#CC)4nF%3KjD~AiF%$u+6Y`!91iZ(&64K#}Q%pM#?~DVAEhDhzjQ-Dul`O zx{fNIsDM-~&EQNr;=olOZ+?{jj-rxJvQ4)V)XG$z^wj9|jH+~Hkg?1R8$ka~?R}bOI&rqe_lWijhwkFNvXgHLEfWu|msMW5n{XEkV!#Oxz-ff+@TbbWA-; zXx18F(W>;ZY*qVMxzJ@IO@D9Fa|?6yJr+=m;f3MY7@kew%EKD1NzsCPxSy=4#bB&iCT^dSNZgHzDF!lFs_*? zTplo73f@ZkF`xU;Xs)bTN7iwh^w!i8jk@ry+-DNc1o(GoM-u*c;Wwe;2V+^``v0Cc g{e2?^sUbfDhEn?&BlPt%ob2`~#^NZP$sFMP7c)L-T>t<8 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IEditorKeyHandler.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IEditorKeyHandler.class deleted file mode 100644 index bb1f649de813d173fe75e8e93c9e8312ebbeb05b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcma)2OHKko6s(5fH_AseF1&!4sJ(IL${H@>UUDNZx#&!mJ1_-zD0Gz;u2k=nF zHv`dy8#n!`Dpl152|0n5Q*#PsJPl|rO_-1yDowGx=>#T;+$}AyRTx-u zC3pgjv6?GsRXCClgE8quz+V_^*B*hxRyT4ZN!pr8Ofp_1lDIyJWuKfGE;}hXKY9|V zJ!iES0e@qn@ZZt?PxO*3t)sq)e~H&>r~O_#3P_;dH6h*4UI*kJ)xfgS>_%GIzH%nz z8&PNh(H5xo5~W}6)MTUky=dk%U70kw|7VlabdDlNk>^PPk0&ai$UvZka&{}}MFl># z*tgBNgB&BkKWLQSQ1Djy6|+35{MNFjW9~TNoMaBpWNy^aV78NaMVZAW!yI=i>>$9Fq_O!kdvjYtij;?uF8pO(8Sx#QR1yoE|#M->XXMk`v`_%_hW< zFs)@TMdP^m_^LUxgjvaU)#^f(d&Bvsv=!kwij!+nt5y`QPMcyPmkfg3PF06!$eqa%bT&oRCL2M$x& diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IKeywordListChangeListener.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IKeywordListChangeListener.class deleted file mode 100644 index 3107e700777da3c8b31c340e246ab22bf3f569f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394 zcmaJ-O;5r=5PgG4D}Esf2T#VEUf7s;^JGd#v57N5sP&jw@ZnC&4WL{A7xy6 zk!bKX@6EiKdGGV<{R6-`4jj}7XIhr5MDdz%DN7FqlX#C#!}w+ei97A@x;5nyuI>!gm&;V78;$Z=>=ie%T-~dGLg*Y z>|%>>y!Kc(u5Kr*>+k&GDDrzQcK%gre#uL=%J%bbE0*k>{Qd1TA~eH%u4C?}8554y nr_fzGYY+$H@ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IKeywordProvider.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IKeywordProvider.class deleted file mode 100644 index b125ced4504dec48f29cdf54a9f58daf29c3c4cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 517 zcmb7>K}!QM5QSf=?rOEQ9=r)2Z9$9&@zP^K5DN;0-qX#rrmP7jYsA0ip+BHMN}4Q- z+TDv@@{%y`8)n}6>vIL*1}7<63>Q{-(%ijD@?7bH>|A8z`27QYyc;W@tno^cO|i?+ zTM93DF7$#w&X$xF4BZ74Rq0r{@WK0o@iudAMkdcgwKAH|gd_gTFboJ+LtOX&MHoyO z+Cs{T%5eE-|1f$xmR^jfZ~NH~D~>dJ4)apHktWMd|BXr7lH)?PmhqHy=2Ji)(=>Px# diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IMacroSupport.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IMacroSupport.class deleted file mode 100644 index 6bd716c5767a502fcad919949b451e5a5f91a1c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmb7AyK=%X5Zr?V10k6JzmNhN)TDDBU1pepp>Rhh6yXu$$c`lY<5J`U@==)_CKG}? zI<0PRcW=MGKRyB6<0e9jaOY&Dt?=)!x)R0)?Y2^BFXl_BT%MFgk-HG#f^fT&l@yt@ zsaS1xS_MMS>rnGNVLVyXgff^+EM*a|r)y>;Cbcq@P7|IRjEBQQt(XL7Y#J~Ar+G78 zu@c9KpMKTSqu+2cZ5R?Bn}26n5c)}8I;CGs#&Jg{70mX>bqItuw+FPikxO(KM|*@W P;~x5d_=;bHdUE{(rPpVb diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IManager.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IManager.class deleted file mode 100644 index 42fadf20e7f186af244a14078fff621daa5f758d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmYL@u?oU46h-f=w$X~<;O^QkW^r>D1jV7^9_ur-lvvYP=&w2W0e+O24&r(^+;iWb z=L^6J6M=xRu&QMvoBM@ZSs2Ims&a1RcCU=mYz2mdS*cnjD`m7ioJ-CfAyjo;b%a5Z zo(Mv-J9ae_=1IEy+nKY4(Q87S-5xgQO;LGg`Ws*NW<>Ba{t^)QR)`3FQ()u?Vcc`X EU&vG|o&W#< diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IMarkerSupport.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IMarkerSupport.class deleted file mode 100644 index 0a1c4fe52f6395a5e87888a4f1ee2e4bf5602658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmX^0Z`VEs1_l!bPId++Mh4ZQ#In>p{o=xu)H40dypq(Sw8Z4pVtr5F#G>rfqTtek zg8ZTqb_Nzk27#=^vPAuy#JqHU|D>$c;F6-uymV_% zPb^}ZVT=r1!TF^{$*FFcIjM{c!l?G?fsA2eWME`q2D+7jfe~muD+3#d#lQ|EnHV?# D*H|~; diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IPluginListener.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IPluginListener.class deleted file mode 100644 index 7b38c3005972b1a9b21e49040629f4a02a3f2462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmZ9Gy$*sf6opUy0cCRV8H_G;adTA@6O0-X_X<~1f(1+I!#Vf>K9rH-Vw`SrZoYHA z*Zc7Vuteaa$1u~vlH&C}CCjBUq^}~On(vN9lSviH+K?jcW56)Ug%!LID&vPsPKjag zYa_Iwlp&l)zg1O-?}ZW>-AEa}iBD^?-`3UQ+@WPvIW&mNMklnD1u;zjmP0q{F);L7 UZJ^hR4B^2E`R=x#k;^gu0L~6P1^@s6 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IProposalInformationCategory.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IProposalInformationCategory.class deleted file mode 100644 index df80fea7c0f72eda0387b37d607bc8d63158bb59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmaKozfJ-{5XQej;zrnA-MzSiWUn-j(bs3mHWKv+yylAPft_p{o=xu)H40dypq(Sw8Z4pVtvn`)Pfu!DI*?)ZlxW{FJ0pT`qE8aBkD`}1MQNo(7H0HTb&dW*?j0jg7ZrN1qOY^ea zh>e8nQsP0A*I~=bZsytIPg%s^eEC3_1hGLlN*?MhVK)CS%3cZS)6U9UbhU31oD;HR zYtrw`Bd>~2A9>g7^@M9WGY2DSQGWz0xvPXQ?X%o<=EelVP+tHHHQEWr=prUKReq*) Qq&-zKQ39PWv<@)+1#1FRt^fc4 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IUpdateListener.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IUpdateListener.class deleted file mode 100644 index aa551360d187fb7c43a0cfce29e052e143be3c54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmX^0Z`VEs1_l!bPId++Mh3N_#In>p{o=xu)H40dypq(Sw8Z4pVtvohf|SIPRG-Y^ zlGMD^B6bEAMh1bb#Ii*FoW#6zegCAa)Z`LI2KG|0vJ^%JW)00SMh33n{L-T2RJY8W lR7M67G(+@2`q>y6fQo@GU|?Vbn#sz*24XR=14$+Z4gkktC_n%J diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IVersionListener.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/IVersionListener.class deleted file mode 100644 index fcc4cb7b87f6460f31175b835354a024590f6c1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmZ9GzY4-I7{u?Zf2t1R;xkwmv$#2mf>3Y}y2tcWQ)-Gy?87DY9DzECh)L|&9M?HX4=T>{k-Xw4EzHBc=0Hl0k}=V*G6BS*jN9`_&FzhOVP?sI3RHEq+%;q)YPGxv9&=efVP zd;9PIeR&JOF8o79MBq_JKWkRf?wO)_Ha%^*MtX3<^&H*s28%_@v+Rmq9(C-h?ds)R zWzu%0b@@_-BG7(HKdYz9dZm;;GI7c@JQXbhyBiU$if1~Lx?#HM+^T>AnxT7U$#!P* zmg@<0=Y8~=XO+`~j-&gpGXkvzt5ngwnqvy&o7wEmuOy(!KC&TaW`NLf%gx%;)tYA( z1;hz~mc3TR@&*K=$=)#mC2JSWI0QO0tU)JVBu~iq>+)8`9H~uDn9fmsqD*0(dE3y- zW4dF>-{DKeo3dPi#~10leV1qAh~jR^ytb7Z?$OW&O{(e9unB7gx{7uvKirjNl1?>( zEeWhCc)D@=uwD)Iw3ke8e*am!R-x0m&zywZreV8;Y&WJ%<8*-P$6Yc%s6oYDaU_va z(M#SYfzr^2Ep(7;ou@k*nMU+!DXTl#doqZgpFai9u_~pEiu9ti3SLX9pK5pnJE@SO zu8O?CmZd6|?K+M_7*cVhiEUY*wQF8_*s+Rve;CII?v@Ll(NMrqwgqwrQ_S9# zwFf4d-Z2#{+-2@-;5ndsdK|~_taQjY^CFqconX03(vupV!}F}D1yX4(({g!I1}k3F z@Dgaz%0SP{+{*k~$tj^u>D`l(v8chsBpJDW$ac(4%@~d zOlh!iDiGYbyoslltPbRtHB8Ub?`IPU=q0kPp*oM;IFp5=!3AqIPA6q;o&&PMY+pGv z(uN7i*vMU<)i5J-s*9@+o~!DW;#0O`ou`dnmh-b3&dd3Zh50el@ho;-SuE5Z0+zXYrVo2uo$z8vy;WfM-G>d}Y;#LjBsLgXQ(~3)YL&dKI?pqr61*iL# z8s5Y{wvls^>em|H#ybLSVIL3Zwlf=-XU}37Mm~$*X!tFD7ewK(RS8zF7WP1^Jl0yO zy5k3J+bTYp_nW|7M&M}nxUE0lzG&|T{l^hVEhAW|MX{|a(h(}&lcxe(fWTD^f5Bgw z3ZaJ@Prv@KB9~kv!p6SjE#qmq2dAsvtbY>n0&unI@;kj@G-bV0Fov{X*BrwfvgC~; zbz9fAhvZSMY@ySl{KOF9AJ1}*TX`ppAkGhO6&%Zho;MACuk&w<5srYCRCEsQpZT_3 z{Fe4$9AfCjdXBWf3f{ zz8*=`Q^&(!W7iElDp0r-5j}mku6_TXzE2m3??DU4`-yabiib!(j2(PF%rjNG^!|V$ z6tWK6um>6PcVIL2Qf!1zKM>zxy@~&kPq*PC1N)*GCqgVI-Zu}W816nG{PyMdP@IPRNY_#77_b-Z;vSaYF{ zcl$Rbl)|N`*wjzQjrRZGxJe|qv14@HaXN0C&N|6A&!LCUEqH-We2KYa&>2M>!6Yq8 zoSEXN#KW)*hez7Wu<<$%u(xoAZPLXx)bI%po*S6OEw1<%Uh#u45IAum`@Y5R@dw|< zU*eB=k3r}_-492U+<(JmyiZ*_@eck(yOL!wO{h#Z&@&z79DXf<*O*YWXk(&+#e2 zI~!8rDq_mV%c|gQ%6PW{t+SyD*f-ia#s3aM*x?XXV@wlQmzMNeKYK4T3*TpB`Je$* YTMXK!D6)$aEa*gk=jbDz>% diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/AdvancedLineReader.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/AdvancedLineReader.class deleted file mode 100644 index 86333d7d82656b8f40458c70ea5ff5b665bd48d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5508 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 L+EY^D9jf5J%-iMT diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/ArrayUtils.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/ArrayUtils.class deleted file mode 100644 index f607dbacc06bb6ea80433bea886d19d5c0ff692e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721 zcmaJ;OKTHR6#mXUGEL0O#`tQc#Rr;<*a0a@sR*Ji1fnkbSk%?cU{b9^bj=obP=1>(5UU04rE>U=S8!F_Mv=?Dyoz z@2e#6@5Zrsxt*#oabOXudtxN~P()AsN8LRcq=ejU6{++N!ECm62-dwpPZnSzUxbYu zq0&*2d^qfPWxOT2p(MT<&CSYsJ?=2jStKt_cd~dC>>Z-x4g;Qqi^Pzn@#A2US=10_!6qPh|{>l zoG-JziYsVw-NSXpZ(%tjwK83dQ>b${Q{av>8PQdoWs*jQo#)6zjprW5&~FiNaPZ1q?R6%BOD9~hJ@!nx@C& z=VPPulgY$PWM(`OpPz_KU6>Z=i2c98e!d+^B!^%0wr(nsjE~F@Peq~^MrUa3!1QD? zGBsMEsf#A3VyOy+Z6zRx|qu*k(qBQygmq|x)$z&RY&JXDl3j(#%MLm6OLSI#2U8pCv z#T{&Re_$>unTcrd%A;x?C031`LEvOKDnlC8Fo?IUvuHNICePevE}bo93_7#>qk+rv z-n$xxp?)ts#zttRX|gRheO@alNExNvw?}Bye;PDHbgCaLLSOjDj1hOkI};D=5giCY0yut!yJOD{quEtm7l1 z)>m0JEX_8V+m~4GcjG1-qN^j+q0HZsk3SLUsVwIm^Di|b-F~Lw8nObO>3pe>HpWcV zoX<_rlM)1ul4Bdkt{csA3Q%g6GeE7J0BU9btCiiaR`xzuk8D=HuA^Lq1N^W;= z4)Uady9coI8%REaNO`-wU0Z0pk7l*&^meLUtJ?X!0kwNY?dH5!)b5Dd-SU2_c1P82 zz&ogR$9|&WDxBc=m~!op3|}%!d+UGL7WP1q08~uk+QWWQ}(uGJlL~|z|ZJ;irPmAr?znVK6t`F_2-B{O8t~1y&Z~T z8wRMYhuEe8y9+`H7v7>u$T?I79p)+@JA%JpXoG^qlT#@Nlt<0FQ1&R~T&6}QZIHLC zxH^NO2N>FA*`u^WER=|{&}7|uhS{m`Nyi*?Wm~6tM*?vLH!))CySE3*cm)*KGbo&n zFM4kO&-1AlKIfP!KcA#`8A$`ZkGKASTCNwkI&Ams5{i`{iHRfcX6ouA!Y=Ahlqt*HgWkoI6@oLy)W?n_MbxL!t&Zg z9)V?6;x)7*%j_;AfYk~VA>|vq;lYQj3!yU4R@-Lp**I@Gi`i)skzPjhn22Pt^|kzp zg^BK`aCC2kQs}<66#=BX%86xZ6xMLTM_D08#+kaI+>tquFpA+D1 zTK|&2_IC*JD?0ovL^yUjW z{_PTXn!=y=3xQ|5Rfd^VzV1~GVL5ig7l!|JU{pQcsM(fp(DQ6Me@Hy?$*MTTaOQRM z?WXNigx8G$45=7o7(OYkhSNAhnR}wbz{~{R#Ca9xUePIn(=dz?26a;sUs_`rN||j) zCD4zHQaD|{I8HiUierqRCgsD+8m{0issL{^gi8#j+IbucvY%pB=9toumKk(bJt15f zbV3H5q`celJL)>E!H}*>nKF`|*EG!FIzv3DACzS<)h0)&SGCM=;pCDrbXSB$%|!JJ z3;cSisHi8^CYzxA-j!OuM-rt>(@d8Vm_<&-9K*R|ZB`UpLD=XT-p2xoX|ril1+l$)G`iTbL?f{4u5Xx*BdXk?j0)el0pGfNa23ZLLM+yV?uQ+% zkHvA1VRB5babM@IZbzQFANuKQbx#k~q3+k|1w|Z9U>+A`3z`}}!pGEXwp$TfQM0w9 zD&H<@cz`9++HaO4Xok}yR-3xX=MObJk~LO{<$3}|lvF%sICWSX(+xybcp5&H6ygo; z`GRcHd0E3}(%9p0KQJS1(*9I(7?Je9(C}qAGaB?;2ZexJUll!W(aeYuIXO8FfubIx zk-+GB=9RJWe-tOj-Vk7sH}*$RqEK&ombhojA=P&{`KBc(MnNoSR)SXgVbDdZN+*MM zMtf&w2k~F&qXP+Ac$)BBa3t{hQWZ$9{QIvzahDcvpcwu9Btte z9miY99DGmFcMDfvkk?U!vqumzG|1l$5pLq02!YKK)lRbgw1=-n9D>4Wi{NNyu8Ro7f+Pc7Cw*O z-c%-rw~?F}*~a+9kg|=bUl3oMY++^M1ySq4_xOP-9t*|Fks!cjvW{a2De8$drfHwS zB<|4HQ%qrnl-|HKY?Ad`Tqpk<_>t0mj$5GwIg*^x#40%LJ@_sZgOUH7oYExP3L((6 oBg_pNS2Vn!Py_{KSae$|YJJzdsA+Qal;b)1P`@muskDA*drm*8^&I;@_(4B=s_XBWnO&BblC$T`&OCFU z-~HWtfA>D~;s4%R1JH@v3VZ?$mbRpuZJA3+eW`81$RyhOHCr3Myr>Tu8CyX>V9y0@ zNo&j6MyjpXvb4+cg~0BNZW&r?QnxZj+MF2d7Z6_(DDO*~8Cx^$NiCJtgMVpkKd|`Q z_dXV=7@r;;m>C-w9eAd9{LC`~)k6+$N;Bu$#%#+l=X$~@CrX<@=!9V!_DKPMYjjc| z(3ei?5%^K9q5_oyl|zQ9k7O5Sb!%LkP3aOXogf>HocQc52JCqwBXDSF#~^!X(Yn=S zppb~3=wt)}bt?Ab04Zt7q(E(J3H>v(7xaYP6Fp0+Hd7~1zY`v@yxmSx`_ictw=;|M zB(Q7Dm@_pyYZ0bvd%F`mp`Ud4`f*t1>YzYSGGZ3?x`a2olrJ`K-1352BU-0x>LnxahwvE)7b&Ft%K36B2e%- zf&E(qS5#93UFcTPgA)Q}3C%pEPh|9DuaxPI9NgrbRPlLyfilY&&ru(24+a}y!&&yA znbemVCl`bvv9p$?o3?Caii)D0FpW!DwvoV-D!wSC94=H!K&3%%D&^Xg;VBF&7!s&i z@BMX|su;l;?lx@Q((JTF3AK8eaMU&Et@o7SX^bh5&AyIPc&lO@6O6>vmzm6(0)jIS zyoQoor&J7JpG2BgaTezUlzA;P;%s90tZF1tY#@@d)9x_Y4C##+1!TkVb2S6l*U_Ry+zuE#+2s*qh_%s#}`z51K;HM$tq*F`O@1xu8-f0RdxGHd@l&ij+&==*D&9sd@-LEfkw7Aby{1id@9`@1;5~-yiMwuFgxuW(Q=qX&uzeS&i3LI;+fa5<9h|yWxxbk zS6N9{{#wN^agDtidz@a*NgLj?1o(E%UjodgfX z;;U$qxPGkD>mZ@d63kE$GlXV*hKNVF!=)})9(KI6pq2lU`UKHr&MIQ@`W&LZ*AWcd z_1`Ueky!-#9S@DJWzj>0$C|rw43Cgyo3l?ycRY+e7pEDzbP=Wte-4jIaGw)`3qDl> z9xj51i{N1oTw=C+nExh1h&ZDS#{(-k6{`*8(D5$1x`TDW_!|h-2JY4c-^au84-i_x zp?F;|hsSR?>-9HKNu%QP)qtoC#BzAzPX4}cJ@9rW4OpNT6IC2c`(RO4HdB~o5|

    3;z7YA9RmwRO5pF$t+0`%}0lia{!$`n>3^a(=Z z6YNpYRaW*NRQeb<&oeLjaYipCQ7N@{`X+X*YtGe%tGQRfA;a3dR-%u}BC$%3m{+q3 zVh?T+-wpZ+&{K2#9{8C)vV!Vk_b@8JTo1>N<}k^}FALnv|5GY6;FPu6*>a6uue0;6 z;V^ENl(@Obpc!9r6k5ZuW$?Zdt;%;&tCC#}e0jD`K!H%0F@=XZqZ0C@^Ahqmrc%ai%mS4bsUREIwR#lfZ6T z4>|+o7Snp0TDZgd-{u$D?^wY%SkvE^1Ucaa8OAV{@O9GMkB7VDn$c#X+@;?Xi94d;t z#H+K&4w16BvMbNV+hi`ghUX2ha@4&{iO4zBEGzvdbPf5RSYf^EV;p>Pc8p#1iTe23 zo&3L;g+j^qIuZPp+&^L-{>~zP#Nz#T ky`*!~qjQA+?x~Z*ucX7$naIyjXGO05#<{!Y9SX1i9|lHbq5uE@ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$1.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$1.class deleted file mode 100644 index f69f15439454d8cf568d2a1195ea1c50013c79c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799 zcmaJo%n4t7B@8|QpUvu^Q$1eac@x(@np_%ZhP=5M(B&PnkOhbSF4cGke z@Q{8S`|{4^2_UOx_bG~kIecHy-2nM@hhX3%YJbs1L1Lg!6>5EqF^ zh0`&iEHTXOsmqfAk0!!FJvUp0xx!GUsDo7ohm_3CFduUD zT6|2!Xpai6w`X+Q?HthxHC=;FH7k$74dO`>inr2iXW{ya&rQ>`zRoTty4>^q!qgdz diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$10.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$10.class deleted file mode 100644 index c31b74f46611f9b98241d3319222a41747c5521e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646 zcmaJ-+e*Vg5Ix(bO^o#xuk}_Re5eY>8@^OTs1=0jgAt*K;My+jO5A9&7W^xH5(NDK zKT4dfMZ{ZRGdpw6oY^z4Z%;1(Hc+sUVwj0}TPQ!dX^6IeC6l^e+2xua-(8FO)fF2S z!{px-hU}J9Qg1Vi6|0xL&Ha$8rXT27s%B|_;e^2|M-Aa3jh-Aba2eKqV^;qjQZgz7 zRjI_`?bU^dkNHI?7`$p!=iv#DrOCTROSfdgQ20lVY?T-$nnHiP@tB#bLQGEOAi9m~Vow?${hte8 zHtJ-xqUvFk&;k#HZbc1-+`dvGE{8lxM6xpnM%y%BicSVu%5A!B!s^tW#ieQX2P9OH58!U7TUpho^6=c~4iwMOBxlOO}O1yE&ZDIdP zp9I1E0DqKtl2j2l7f8-I-}&zM-E(qtd-VsvC#;w#F)Sy1B9xo{8i|Q}D$~I2f8m<% z{XP?KyIm6o!_xB0NzQZnIUF3{e`r0`&AQov+U84wCsG~uV95FxD_(~dCuWerA#h~oG z^aqC1^amB^l|QIDZU3B_C1j$F-0TQVglOUDk#Kt|T*m91-N7=&;&N{&v&kYe!4~cS DS(lj$ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$12.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$12.class deleted file mode 100644 index 53d16662291fc34abcc10d1615e07e1213897dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmaKo-%0{O6vn^NHP_9uEX}N_i!QXFC5a%62+BaPE>eQ%YFq~$S!Zo`lX|PV3W9oo z9x6IxB2n4E&Y5%eJHPYi{o~~gz#dlOh%l`Ad?1t^+_uEP?#aNhE2liVQ+IBtkrD~U}#VZEm#A^u)Q6!Rx!D1-=rL0XZQr47I zO)7D5*J}#D!JDpNNY^}vyI0(o+8+gtupY2 zDHLyh&k{$PVeaRMCKeeIm3v3@b+(Bt!_3&#TV$~6-ktA=GpW0t9j|vsvuLo2a$GN< zb)Ac_z!4V;NkWSLXmPt>X9s~ZBo&-TZ zz>gBElOW=D=&pKIuU>Ukzr8=d0@y~uMv7q}<{hDYecKQnza@3uKRn$2vtK(_a&MeJd$5X$l%x+1U!((72&bMEuzcqsOciZK`r zoAW6Q(Nn3Uf5wo_*YA12Et{*J)$m=ZdZk*S#b8vNt}qeCLIM$(499;l>+_40w90Z_ zDsep;w1wN`ZCfy;>rRK;E$&Kx_mBX2Th|9dRLbd&#do9_l2TpsG5yw$Zwf(BC2!%F!6=7yVIzyK0&=h!R)1qw{%%sz zDt#5H#KFzwnTU?~Ss)mkN?7B;F^{CiourYR%a~#2A2}MU#4y$rN&AU!bl2c+hB|#<25XdlS^Jh=NN21yoqXJPwEMJ zKdoNYx-{gjss&+8*6oYrJghSmJf%cb4tN}kczYI%eAFvLJBK`BlWrR@(!8~}G|8S| zJ*JFqI_;EsM=a7JT%ZV8=s_<<>WKc1MwvA9ThV;MKsDJ4vm_cA&qzKW~sDnADL#pPsxzpsH)bTWF1U>09Z2cogW0e@PT@g&Wyc7dZ_(BCdkgg(f zI+wrxJxdHJhUCu?O{_4Ox)V)iutswBo?|5f zlT2j)`-HaNe=NZg*mzzdP~2BqB?kg)jo!JONiURo<;*jpo4`wTNl4z|I8GNygQllf>q4oyvz}>@d6c&+!4!jMu!>cziROsF9&&d#UEJisy`^W r>;4tjb4YoWtj{Ii`hgW(K44bo%sgIY>J7Z+c=xV4pB$#Ad>rC0B7&86 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$18.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$18.class deleted file mode 100644 index 3f4c00b85d4e0ee5f02c92a1a9d2663e84f9744b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 608 zcmaKp+e!m55QhJ>+jd>6)vEQ3UU=aFToe(dA_Wg1R0UfE@haU8HL_;wZd&ju1fN8& z1VJCbhZ1LN5%F}9OlI=WH#5oW+tUkxHB4rZ5SR{So3tBU*QxDZsmOEpcBPTkn4 R#@T+fGQlT@GvXYS@DB9ki7NmA diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$19.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$19.class deleted file mode 100644 index ac7f73595986025ba4bae2238f11f2fa49a4217d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmaJ-*-FDe6g|_XCdRr|TdOGg;DZYolp;t)1g#*%K3FM;Ph&dNkvP#zTJT2%|3aSx zK|jEc67Qr%#BE^aE_2Sg%iH_&D}V~7ZDbhcV%`E>A^{%82yxKlb_{r_HSX|$- zVKL174PhAAmP#f&45cOil6Scma@F=4Ni0>ndbr$Vu=b*saFNAe9yz!S8^0m_zl&6j z%BU}usCTZ;MSQ}~L%~q+qkxA^9!nGVlU8yeHN*Trax_+zq1+Zpugha`9Sbc~!V?)O zA{UpI&wkEgqrfoseMAS740b)DvZ~GCHlj`(hy!UF9QoYjnxWAQH5G)BCghPwE}|Ag z{!l3q?}c1zp?4R+Xies1=;km$u}$74tTgYetj@A0IFBh}h+a2E-VutlD9)1w91LTG zELFr7xG1-Gw|MKMK{Fh#c4MVUO87>0vgd;p*% BhFAaq diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$2.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$2.class deleted file mode 100644 index d8c3231d46e012a924dbd197abc948ab20ac0bc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcmaJ;OG_g`5dJzD%{XR#M2#A=x(5%5f&)RkWDy^$AVd!vSI|ARlOnc^Jv!Y6{7)X- z)53!O0Dsi7)kzR>HGQaeeP31e^WQ&D0M_w2hm1ful^xQdxoJ@+yiz6#_r6IhkMFK& zxt4<`Q2Mw+VEC)j%5Dl2D~(Ipkzp)#J8ari>302~dLrQMCM^n(#Yi4Q2n1^HRW?2* zsXLVMhSGF&dv#9fu{@7SpwLJn8K1~hIlmwD?1eG{iv!@6YjuISHrd{g-|0FfL)uEK z63x9cmFmy`SIMCuF!6RnAJYQ$(L6||YkFdeov1PpbH=Rq}&SEdy?{wI+nB$%-=DYPJEU@lvQf4dQoa4n7 F{sFZCqQ?LL diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$20.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$20.class deleted file mode 100644 index b3f1a11ca9463b33550098cee8fdb107af90688d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 608 zcmaJ-T}uK%6g{J>yKSar*>}`K4}Cxz5}PAB@;1*m4Nqza>CoD=s7nsY&fSUJmQtRj#$s{ znlKm^M?)Brhf>Mth+%f4e9e2@@wjR^ZWKt>DwH;>3`Ws!3L9~ZrI3KlkpBx=9^Is% zSu$m*#6|a}E`kcLdx9Zb_8Z)*@<8f%m^7lc3>jAcp`)=14D&4!4OCu=P9Q>|A|6R! zQE_f#^Xm63CbA5ZKS#7MLpvDgvM@`&OQLwdV7q=dXoxeZwWhz8x}zCroKw~C{E(J( zE~2*IWJr~i5<$`9VJO1mH89$kJ~6rpBq=t@+lSH5TU*=9>>1WmA2Cj^-ACRNinu6F zkp(PFAWfD!VsglFKpgrnlX%5cEuNirYeqKbK2j(rPv%Ec16(PT~9C+TfW1+9UizkPLhV&cSDBxF>th2onf{w zRLpW)3<41fskm}|NzF5r>Z^Zu$)dPxN3tc4kr@*tHhTt}H9zuD|;tvzoxIt=A;0J{B#g?TIx193FuUc~(j^OzP*q9Z6e zD8p1+ap(00A0%>_ZGRXz;+d-jEu3EdzFw0wZ%W7WL%QUKQ2Tz5!CIG61Pzaep$JzO zh<2L(B}8uq6BK7DdI%%Rc7og&%B3(#uSphoM^%JHo<$bOVG0GZG!fGY#tLER zZ>I4B7x&V|OYP4T#VC3X@cs;fd5S=4CJ4J!t)~^2YA3kz78&EX_7zvZVeXi+>4;Au v;`xCXd?aq4BE(YMl^{|-ZlX+>x1uhlWxq{s3X8ZyHeU5Ec_tNUVpzo=23EZb diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$22.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$22.class deleted file mode 100644 index 5dcaf9526b909b85b6785589c645bc20acf620a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmaJ--AV#M7(Jt_Ynz!_nnh6;U1&iIBHb7vm_c9#DMEBL>Yx+rtnIEsZw+a4bYW&8IXF|zy8Z`;*V9`MG)KYCEn^i@6X%&+Rb8&y^Bh z#o@j${PHdsZAqUH-3X!-o8%qAnB-&o2V3kJvGD}4NUt?PjtNCt6vxQ|F)SfLmMS7S w(d>})6QU=QuIs=hcAN&XX z1|HN0Nl3gT-uW1Rz{I%Ep)^>9mpSX~wfEYWv*+;l!FvG1c<6#nL1#(Z;YPsR%JH4R zhHhp9v8ZNgncYp^7aVfIq2S`_E(&VKbVIks6|{L1>)MVMC}>7LkhV&?kq^av3kn>O zVveh@qn5!5RYCB7o{7_wgoH|CLO1yA_QonNWwg}-SJ09uX0^hCR?@}2Y;;&_x~ZW1 z3^{5mq@X>|t)nVae6z$&ZdjV77Yzz-_4*$F+lvb=3Yw~0bmP1N_gvA`MX-XptY%E| zd6VbDq73gDb%cD&Vk+$nt!S$S&6(j6JPMrQR4Tlrz;jlx2<>9%Mi0FK-`ds+vhovk zCs)^b)}kyz`wBy^(00!y)A39^IV+4;8LkPVdTb0vYf0A2;QPxwL}mqkh8x1%cT84}=+^GslCl*D>J%&(KNJfU- zXBZbmb0teEmI!C!3o+5p1VdP`4Hb4VnMy=yGcDS3sx574*(WpFW_gFybaA_s79pW)V8F-J|u4TF~=1Uf9dC40-c^eeg@sfawl z!3hPmqCg8)R`^NYBHQzR|2{6ffYY((e}j&<=zIy2&}E5qLVXgg5V|hWJfVJx9uXRl zC`{<4M5Ba;BpM(zB2h1)yApK}8k4Az&;yB__C3cQRbrPj7?j@+)b&T2$0u~*Gragh z%kvde_=aVChk+k>ibFgjUd*ZOsFQM+)DtG*p*|zT)xf6y!Y-*t>1IQWR8W3_X+kRb JiFsiHe*nD28e{+f diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$24.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$24.class deleted file mode 100644 index 6eecaa80bf6b456fa336e4f57c0d52d4649200c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1275 zcmaJ=T~8B16g|^!X;~HuRS=Lb1+^bSwIGN^q_l-J7D~DWf8vrAib;H5XUD0;A5jM9A zd^fzQoB41up;=n)(H0+wjJP2&be?>Kp>9GqbZe5K&7a=TcC~OxGm2r=s^~^BnhGp2 zNbz!k%W$GzfeSK2@u>Ovezc+ke+ zh$I*q@|rQt7foJ>iGuv6R1^)|6Zg}p;2hfP!O*3k8$ArJST-A5q5WxMA?;Ie0T<~t z`1X!gvU@nvL1t}(=Pk-2yayCq65gJLjGD@&GV}GMzoNh|g7RT-I3dmk6@*0Cdl+7g zXXa;8vw|B`FeEso#>HmSg1DyOx*!^l5~^T^6&kz0C8{kMRWNo;qNbOHWL&|mW0IUL znNV*WG9oiYqwiI+6fM>3pg7dmwqh-bEJEN{hzE<@a zg$}GlGT{9Y8*j~q#;I!alTM42kAtCobUcAe+6%qF`IqQ@3Y}2DjaCU=w$UP?fQ{}F zx@w~sp|Fj{2t{l(Na%)*`U%~%Q3s)@jl6^=ZRB$9NqdyvX}2Gw3jjV)!ygHKLJvOE z{C&X$zG4C2P{4N>_<@JSiR)=QsJ+@3b%7XZ7^aDGC9X-=Rg8US`RLMhLB9> J#0}9v`~eNx7100y diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$25.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$25.class deleted file mode 100644 index cb4df0bb9a3d7e38233dd3827bbdfc8a8b6a7bf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1275 zcmaJ=T~8B16g|^!X(1HmHOlX#teYDL7hDY6y7&=cr!caG<8@e^c&=ycOwLL9T)QmzzwaU6th^B(e z3{t$5=UzBbFT({d!|?x3Dkmq23KyTE8+>7RYn_*~+Io>Q_?1#lD=uqgUF@qt$=c9O zhTc=`sI4eNdx2Y(Dl>e$%uQ}snx&Tv61N6|_y6t14L?Kk@fJNe%ivusnYs{%q_^qZ>U8u2?1$Tc!PJVj=C5aRC?U zHTcf1R zj6xMFkqr27#Ku>%p>e9(yra`1<>OHJ03A=@lJ>(daQ-EFpF$_pZ=*Frmu<8}C}^X* zgs$2sMkr#VaYDm38YDDoqkcj+ZPY<1Y9k+^DI2+*`_ew;ciQcT=mLO`)bJ-lpV5Oa zG=E<)iEmiMcjWN{27clpapHQ~Dz#VpqAn044Z{p^b#Qopp+wGc+BuLwlGe(_&l2*| KIdMZY5Ptxn{ua>y diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$26.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$26.class deleted file mode 100644 index 682118a63c1aa2f16fa0fd6c265f3a66889167f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1228 zcmaJ=+fEZv6kVsC-iD!E6a+1Tg4&Bv1q8K-3{XwuKuM=Szy~t4$1+%^Ff)+&Df$gO zs1K5u=m+=#{)&kv>ORxbkSe^)S^Kiq-us+A-+q7o3SbiRA@~>uY~zSqY3HEKkJ5Xl zQ%YwS4c92X+2CQ6r#%3j7s%0A z8HTn8e$9qwNOwu7-AQZ1@*duK@8DL@Pk96>h*u7 z`~3DUFS%4jXx~&YEVRQbc|BLm<(DJGzop=|aLT97iA9kcSC9~H<8??Fy=3e+)gjQvVyF0Zq z4V|+rZZA{~$KlT05H;$je+J$+fFRi+vZf$;o^Uc1V7i*tqaGS1bk9S>geE-HPiV?R9fTfvDBwSq zj;X5On>R@l1Ah>vhGj-O$t1*C05dFz6&AuK3!}^;uqY<(qqp91V;brmGl+fGwK6kXE`lrm7LfZRbr?M0}9f>=aKTS()9lAZ!VAIPDdl!N6IdJaSre?-55 z2lYV`6a4_c!v8Qa?wOVbQF!UBz1P02nSJ`>_t)!E{371aU!gkeN+@Du>;dC z#L_9lG4gK@#rV{0Gdv9aSBEe(&6}3#EHLzhw0+~mh?Nbi6w{rmX_exc@Fs&NSt$xX z+-TwO!p|`Ezew%sCUIFMpqZ9fJ3iPI)x5D=77RhHQZUM!M%9#d-RW`mOq*fknsOv7 z&d^&DPHoDZIIId=SdQVC6^oL)L*ZBdYH3E0q2sbdAG#P?*DJOulM^eN4?PTS0^}|j z){@w;MKK{q3SBc(Jp5ALP(Q~_^tOOukYfnL4BkX8m)Iuzx@4I;%5e*~={>~Ju~Akk zE@;T^?u&v$U1aTXjytlpZ#}DL@|o;f3+3PA2uY{^+&P_+u@R1_bO+AeJIUoT&?!TH!vw5 zoaCpiLYW@fDy<45&FKVuXhS=l)Da!^8go=baslr*bZ)zYH}q{!uv`B~u39PC3@mV= zOrTMQ)~R0RCq+|Byo*H7(Dxo*&uR2C2EJhA1583=3hfZOtI!6autF~g-B&0`Uu4p3J_XQ$m>4!oKkq(sb4?ewmP;;^YO=Li_>r CHw~2l diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$28.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$28.class deleted file mode 100644 index 3ea0b0cba2a4f56ad26551c47d3cde3aa061f149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1279 zcmaJ=+fGwK6kXE`EoGok1p&DVYA-^eC>M)Jp@lRSN_q+eeISQ+QVy0==s6Hg{1N>I z9@Ga(O!Nc%3jf2zxMx}#MB(Mk+I#KWn%U>a@2}qhJjSXA4u<}!ek#nUbzBsu(L=*3 zL{mxK*7I+V#As~R0~bT@^&t#R^M+~I3k+Ss%z=KYN6WfdifVS%FiY`tXp6zMTqz14 zoM`57!^aT&Uu5R`CUIHCpD|3aesZ`cs(F2{EEocrNUUfgEj8x_lt$%)mB=0z82mWZLH zpqoo#(-Osm94dIjRPoSDc}Kk*chKDohCYsd3^2G8xm;q0?3JY~;?$L{g;}gBC zbX-!A-8&Eko4Ux_qa62TZSO`_OXt(s^=8U{$PtuI--UB3DPzMN5$X0{xObPc>nrJ1 z$&GQ0OO7`<(k+Pzj!8+hUM4ijOmSMhzf&}oGR-k_B}L0@%al2er&m()DrKJInIt+I zU2>^RBA?z$Nj=Xw7A4!(V7IfmOp+eQrsbyDG+QscUek~2tK-uuC)I*jG30W!HU5He z`Q#)&Wfscx%w}m#*!z_tiB6lQs4kav%M#Y&5Dn_2{|f5sMibc{vZmou9&b3($IjvX zL_P;v=8M2(McWAPG4DLj%rBG@BW649cSQ{w&MzPY9Gl}DM#p%;W6DU=`- zRcMA#OrbGCPZSyhDzY!*l^)A$S=fHbyTsjv$L-o=sqb zO`^zRFxeE|5GSvvt2TRG7pXu31Eg$;xF$G!zfhsd%Var_M2gPZ#jg>rN9<5dKatw3LNH6$Ip_p!OnELBU!CN^dqUlynOO{Xv%Yq%4*#bQhwDFQU)D z5A}y6Ci(zAh3{cvoO49$^cd%!2AV;;B|1}_g`Xqz`o!(L$M3#xniu^z4JW+kfGb;GR0bD<3eSF%>- zJ~+{?zzrY6^#3B&%ZtQ?ieEKMzIwF3!|O$Tr^*=uYOSPKH}tw8?55LY?-~}v=oNA_ zR-B=~!tF+v1%6QH7B_9(Hfkm%_Xb0+{+-2x07Li15xuz1(6Lst43V7BR4@7%oCL^S z(#>VQZt-$Lv=qFer+Db4xS>G>H_+b>h9L#R7-4WH3WdZL*;gft)G-COaGTzPA0Fvd zImNjd@;iIHWK$KPJ)z)^(Dtt7wOlcmUu~!SdkTWW={s}Iq(p33K}5LyXYTD}el?TJ z3T{%tl;D&Wm&mGuc%a~+AUe+znqX!WTD-qgG?_B1VD3VSrf!Oqn1ZJlQi?KVUcoa# z^t7rJ(rTiZ+enLf78NWBwyVW%<_l_y*3qWbrrtDLFTGyT51NbP(`rZc63-Z7wYpm0 zz?67!8b588s`SWaWrf?jwK5HzGfiGkR&~qb*3uX?>ZGp<^4EVgI?+WZRYZ4FBSsp6^Si&HXUiG5rfs^Ytae=fD Fe*k3752*kE diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$3.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$3.class deleted file mode 100644 index 7f3c5a47d7dda0c124170743f1048ab64331b407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1295 zcmaJ>%Tg0T6g`s%2}AQ#5Htev&^#mof}jSK5CWzQ3B?2`bU_VC7Yv38%nX!lUHA|B z4J_1!R9U4T;K%p_R$1QegcL?$(|!7$zUMyr&iwfO^*ewmJomw+AYkdo+>F_WC4L;+ zH|%08y`VdK;pBji#C`B6xOw>v1x>StX*f?6^aQhe`mr7>>*h{Ob1cK$Nn}Fn3OuPw ziK}pfyHfZI=W+2O!DmxhF<+!iVs~1IvOkVjE-8eFvOhH#l-c-Y`lkS>oI5`yTgM_Em0lZDKB zTGaD|;i+KT>g+~-H7jeHV@L|hzmeQr$!Br}8cc^~oD$X?z4&@rKd6n6s#T7xB40Gb zkhRr6hNyUZ>PgxxmMb<*_cC{OD<$eg#x%K=D(kk*?YTk9-c6que{kLL(Aw5xOVQ8lkX6F9?lE zlq57R(F~!uL}P@eB^oC5NTNPMvl6uvdM1(Aed;--Ox&^uQMrbx>In5Cihi1?M@Rx6g@**TFOA73Ig(_p!P#3f`V97mbQ?F(vofg3mUStld@R0&|QcozKA{p zKhz(RnCJue6uyUv@y@n1h{B)Fx%b?!b7!_cet-QA;31aWXkr+sYRAHen1@Ai9NE{+ zLL?E_EG_r;K#WdJxZz~zyF7%Uc}_QU>ls6LAho9*Ymu^Mlp?BC)s0d#8C+*@#wtbO zg##@dE_fLx{}-9Myh&76@uhS_q>uJ@L^Y@Flm&x7RVirYb*-vPyY6&aySm9RbVWIm z6=mot39B|`Rvc7?DGW=q^ol{rU4h`%zgpbzGjv>(=)rXczFIMLnXIU(4G+3WvqTK7 z1TDaz}j}H_+1phJKC#3^KTsY*xvWeO0nd9p<=&+jJx1@JK7$ zI?k!c?CgnxMO|d=QI0#Zwr4e?CUeP5x`p!ZaRj8(d*+;q%h(V{Sh{^@?(JA6y_j5* z+!)8WKd=AHg7^&`1zrDQX( z^tm#=Mj3ie^)f#xnp)yrD13_E_i#B+!k=;T3x+;GCp2QCZ9;c#v_>dsqh&((ZKM#2 z*l32(q>aW1J+jdVp~p7rB^0%hkI*w4xg00X6YB4<<%ehiU@AN;M}G<%bW<-7V0p~3 zO{}sl6xmA{>=oV+C)d+mo4u}!R6xNXDO(_}8BN|_s8Hn?Sxtx|L1%68i-f!sCl^Q$ F;t%!n5k&w1 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$31.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$31.class deleted file mode 100644 index 4e8c3e2824d972e271c30986ce5bd67d7708c1e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1277 zcmaJ>?M@R>5Iwgaw3LNH6$IoZiO>Ml&Y>(HZ{u-cEjm&_6(b0_zF21 zE5*=T=1#rK0xd7T0OFKzHErq>S%rg z6XL;X{H&>0=#kCxDtGp(B^o+sn%qiPG~4F(;s`bBrLPL^uOBUB2gsU%&-Dc3i2-(s z;3x8V&_=%@I>BC16lswy(Fp|6jt)AhB03uybEF}-u>Tvnw!M*S>b5V^t$rj|T}l)K z)6dC-n=-Uc4Vj-5O(pRzo;XF{d-#1PiO;zC1;Za;5E^yS4xzg)+8`8j(Q`ugT_h7q zx@eZrl#9j*J#x_~p~o)jBb0Jcn9zcY{N5Aa3Dx(yh($ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$32.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$32.class deleted file mode 100644 index ed7832d3c8088fd13f7101fe8c7195944bd4e492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1281 zcmaJ>+fGwa5M8?$TFQY!6$Ip_p!OnEK|w4cr7fhfP|{N%=mR;lJLOSu<;9_MX!pzrTJ5a0~M;*cf`t+8#H;=5C(v zg|~Gx7f!@AOUpjl;X`AiE;tyvPY+>en9>d1nr7(mr?#{`EnL)$LRhuRx>1NE11k)U zSSimvu%l6d6CQ@q|3#)wFA@uFK4xlB4_ZWN;$2#qLp=F*PIS(Q#Tp< z&yb_BA`G1cZdJR?@SQR@xnXIRUNR`T-5+@L?<_9(7+Oz`=*D@5=B1LUi{#Z(xtMpO zgTW~wLsL#OX8E$o^HI^3|BSvOfrsLjx)oeNXCoMT6!fBxw4#|zbdBt@l11u(f=jqe zZ^CygT2W4NY>xEC7SCB!MQ9HxxFWROOKCNkO{NzcDgT-Rzi@hvoMUkj8&nVyZtszM zJ(gaaOU?^!Siy+klsXrkPYL3Nf}4V9K2E5D8B=Ka{!US4%D94w6DewHRisQRxO*Zc zD^sQv+!I7wy-FsLie{552{F%o1v7$esk5u;Oe#(*Y0-L9Z>pu`9xrG+wdL`srAj%+ z=X9}NE%onUL_9i;pD=PodT67tz^%qG7|NQ-QRPQZ<3w9rWv(OT1(Bn`oNo!`*5X7`;_*Brif z^&`2eQlc2x{xKPEU53`FCi9b`sU)5TLx<>k52xcG^cfewp#KAOLW2^m6S^wVGNFJ( z4+veCC`u?S(FCDUiG~T?mS~XB9f`UKMI`bPnwH3EKX4pSeY+e#NEZP13~u(E{uW-) zOTC1jy}}fGjV1O5dG;0tdxw4E#PxJkd#}w!Qy_{ynrxQ12G~5mP$K0RSvJIxptE}M NbA&t;CoYf{;t$t36y*Q_ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$33.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$33.class deleted file mode 100644 index a1b56e1648819c75f1ce62584045f98f8c949185..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1287 zcmaJ>-A)rx5dIEr=~5O7RS=Lr1+_myl`4ouq_l-JE|hc&1ic_jdr}t57P?ELiBDkS zjV3DSBXFT!NMfQ7;8XY>CdN72(jY1~J>SeX^UcgTv;F?-%QpbGFz-eKLtj~|a3gH) z=6NN&t(&=UGND;o_UR5EjzrvWGW7gEgrRXtH*{;7q0_HyX%#J8)Qmz{waU6th^7K7 z49<8d&pmLUNrnp^hOvJ|D*rDM6)IjuH~8Y-_69F!wT&WY@F}I7R$S4_y0B|br?sh@ z3}BT0>zb3;koStK6Bq3shGD5=b zJ$A3h(~EPddBKgy7!{mc=VJ4UAa2OGDTtPngesVbOe^?jifX5f%a}NoqAIH*Wm3l7 zQz=?GpzYLF$fK6_ z$~iu#izREVe+{GJ>1q6=kt@=38-)dKZI<#hbjmPzIbPIElbbVx)To2LFWA2>G?MKm zYaCA7BLzdf>?Xs{GezmiD$vk5xV!`avp|0;o@fu96%>DWTSOLS8cRR zC}5)pgs$5tMks8f2|{Bw8X8KB4xNWo-(im*qzeFh35mU; zKZn=!Qg7gAZ!yL8vBVCLXYXLJ_jp2_xSq~x@3pyT3dGP)lg$#>hz8G3lt?*FRs#}9 R(pkOuIYJ(a6BkGe@f*T<7*PNK diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$34.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$34.class deleted file mode 100644 index 5c8aef433d70465046d999a60fc02685740da331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmaKp-%1-n6vn@kY_i*JjJh_~S`#C9;U93JmEJ^(U@aBWQo156y(r^mh$HK4+#Lgb znnL>m?Nve02k1kUo=KvGwsv9noH_ID@0)Yx$Ir`a0NYq`Q6e;RF_bzi&UeFo(4q@?b38A{9v@*{L^K0ExF%)4cbU%ztu5`b1uzo~v_OhPzQO3O* zD)0$U{-x~RZPKxn>8{f9&BfWV%n!wJDhWY1OGJ7ka%I<(qGL`}L0J9|j@#-G7W&eR zPx(#`a#=`igi)F1pBroI@Bi+_ML?MOvqcXN2vbp#tAY9OO6XoHJ9?)w2@iPVt}nLs z4`MJFR;NoCqDNB6;Fuwsuifw=w;ZlIRz2{f>Xgn3O$MXl+QLK_GYLdsGVJ}OtW9rH z(vmv*eywp=*N}m#YCEn^YdIG|*R>fE zXG#gL;&9&=et8p&cBG#Wy%9tykJ0H6#^^r2y|c!i5q}yfX6b8cCA%jTu_#Ya1mc)O zk|K3PYQiWIL;o|4S1eqG(~I>-%0kc--3RR98^N3q!pMwNSu9f=Pm!aONfnxgGClzz C8igSM diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$36.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$36.class deleted file mode 100644 index 667c255da8bfed02c033551c63b43bb74fb32321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmaKo-%0{O6vn^N)wRvcEX|^*i!QXFg%WR!5X>O3E>eW(YScj|)>+$Kh2ANsu7aQ* zpofais6DsD$u2xBge2rPz!zm&DvNlKcs zSd&Uz4ErtNHF(Pr45^yi=1!A)Qv1_KBj`z=Ve20pwN+xsc119$@=^>u;R_Y;K)Q;8 z)4BZh?_Nx#7?M9*jA4alFaa@Gb$95s#i`WwCB6o^ucN4is%kr~PlGuZLC@_l#Ltux zUd7?QFZ}X07)?p95bX$}3!vEQ-)Hl<^7W@P;D* diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$37.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$37.class deleted file mode 100644 index b882dbf23a33bdc04e9033f9a479a54303ec93f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 695 zcmaJ;?`zXg6g{_1n=IC@W^T^8b{+U(bFhF8_n{(#Ibl#mOc?|}$Xoj8o@6gu@><+~ zH3cUK`Um(&iTAa|;*S|f?z`unoOADe-+z4h24Dy4E=q)EE=E#^#d%+j!c$cw;lVRu zMDOBE-hZ^~!Xd0&Pa#yFD6Py>!qP_fofwHQ6?zaxCRcjUIov!VIQv;&`Y2#%6wO8`Eq!AEc2c?P9-7eW{F6TM6PT;1s!vu3c}idQ%t)MpioS!y=S6Zu@(S?j+pW!rYZ>IXVWvx1lWLYkATPpBPgE%W_U6ooAI+92Mz zeMqwu_per;v&eU5|^)i}cb_;79Cmpu= L(Ts_RNCvq6|y?tB$P5hg zOKpTvspg*>%PU9sy|@SnQ+F+TcutszzAF!^Oa`ZrdGO>gTsNpoK1XK4m$k5JpyT4q~`$a9%*E`fNj_LTUmpvtw&*#|hI zzPI{%j?Urz8X+e5_AQbw7{y#%*Ej+mCQ;|eikKR6d}0neYq?jL?v{gRQP&9?QMVGj vh`QCF75(I436`{O#ppL0bcH6zf5fdZaTza1=sC=DEFQPOna>hd1e^E^3BQ;S diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$39.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$39.class deleted file mode 100644 index 5c85dafebcbea7575e5af72e7a6aee2eec4066f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmaKoT}uK%6o%i?)wRvcEX|^*i!QXFg_0nQ5X>O3E>eW(YScj|)>+$Kh5l7t1wj#X z*N=+Ms6P_)sX@zio@5-IIRHuAK0I*YEmbYyZ%M z!LT}A!Vo=@N(RRanOyaT54r7d)v;@VCsn6-mTxc^Ww$LXgfSCG1Qx^IU&`wABt=b` zuSz8@2EC^6>b&U)hE&yUai_sOsr|{L5p<=`u<;L$+A1<+J0ciYc`5py@P!I^AYDbl z>0JK$cP}PV49TA@#;`;)sB@2S3|7q@cr9@%b$yAiLGJ1(YN4W9j_cE4&PC95+YIqD zrG!^@xbF+Uvz>% diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$4.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$4.class deleted file mode 100644 index 5492aab3e6f1cb9fea609e7b940aa80ca4dcc865..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmaKo+e*Vg5QhJ4Qxjvg8f`ryUU*Rz3`h|rBE_m8L@%re;?>$N?Mk|-Nm}r&^hyx) z0emQNHZ3Ba7P7N5`RAL%+xzn?fC?5(WEhqr-WSS^@0z0Tc4XXej}CdlFYdcywPM0x zSomAPFtR6=O!gT{W&f7XmEJWVP1 zQi-!(=SD;q{3Z|#jvqF7aLFU7{bA5Z+A?NX{s*^O@fhY>A{jJ!F1nG3g-UoLLq)m8 z^4j&!QA{`tliw$_FvDOTgkd1KvQVOFwZmZ7!(P-7$5MAX@ww4W4WMC;R3ivuTG6RU z+F_F+f1;F#Y5|X95m#5hXkYqd=*wY*e3M?=Fw(fSzOlrfU_GXaF}m$kxkD;qk)J0E zSQy6yS*nQ1A!C;q`d=aUf~l*lGhM$joMQcfLK$e3E(UmCFohu|i`i5)hk3GtRu<@G JQ-;n#6(7*FhqnL# diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$40.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$40.class deleted file mode 100644 index 5dc3386577c1da563c0ed4995abca1ec8cfb3ba9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 589 zcmaKoT}uK%6o%iUTiRx3mVHswMHgAnMo2eC2v!hS7b!t>HR@nf>#XgpLjS6+f}k#g z`ccstlZd_+cF&yI_dMsk=k@L32|xjJ3B(ACq3B8Nnd_$Pd2MAH-u|A5MD3;{R|=a6 zIE4AXC4}J}rB$>`m|m@1ik|R%p<7-x3YBgZ5A&x4ryMk;i#SG77=laK`b}B+yGhYf z#w$w8<8Hey!aV@h1a(=mDp%MvHcJ(J8A2`hqaTmxeVmc#%6 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$42.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$42.class deleted file mode 100644 index 25b1d68559d2ec643607017d5eb5dc4d31bae0cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 590 zcmaKo-%0{O6vn^N)wRvcEX|^*i!QXF1(9xy5X?ZZE>eW(YScj|)>+$Kh2E;Jf}kFt z+n~pZ&ZtCGHZXJM%zWo}{=9xXy#Od;!$gQ-+v8)QZ2z_^#`Zw^9lLtU1KzwFioIgN zgu$>mU&0VQmP!UE44GX0hL5@JaMiOLfhSe3RLi#*jEdV87Q$GFBLa(|@RzbaKS@bb zmg`c9i_xGhye4luf+1CRJKSk;PilYmXas%fGwl3>qqa&6*`5fdRbGmrCw!p-9!OVF za5|U2{@sg-6hrc7i!rP*M4BGgfmXvEc^z>kb$N-eIUedD>Y%DRj_cE0&PC97yA1J~ zQo^e^-1miF-UXu}=@p_KL6m%xZbvXC@3H-ZE%u1m!$h%2r=^wbja0-UKTZ~iVF?Mc zlo81pqeu+>XBp2}xeBLN8~5aepeZ^J*!wqvH6w(Po~SZdCp)boOE-%mG!12Z0wLUm A`v3p{ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$43.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$43.class deleted file mode 100644 index 86515cc59bcb0453978e99b61c54fbd186aae5d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmaKo-7W(`6vzLkUENwm)wd8XToj2-XxvmpLM2Vgg_cBIO}CR8wzKT6inroQBH;nN zfyA?jGi@W{Ym%8WXXbx?=i}x5@fkn?(>4->xlpvFcB89?Y`ZNLd2VS}#G-b4DHjXt zHY~!--x5M@)_zk~{!UUf zl;Mif^5D8vmtjrReM!hw0#EqIB2>ojJzDXZiU{-n;JB?KVX7(PZk31fGL(_jv4~Zm zIe0w3bo#Rw8#zMudy8p|5$q#x)KC^ z0G~qeJ;ak*M7#x(lau`CJD2CThbI7K%%_oHSkk;NRA8>#q91gn34{6`xBTShO01U4 zX?P3^e@hrrJ5ouz%P_mvxa55vL|k=(rqxn)DhH(&gI9~&!bcLLS&YDE*!oS`_&Z6( zQ6?HviKAZkT<8;i9tnngBMy1g;#xX?_~_XSX&9FO!BJZkhGIw9k1CJFl@>-Q%dLzR z1sB#zXFq#MBhN7Ty~PY>Xa+42+E_FA&A6vSu`gYHxz9mvx+rR)uEHobG?+tSFXA>s z_CP72YY{g_nCc1`P06hU?GdENPt$E1-rzm6zOl&ek+~Zv#_05&lD&|MSmbBP0vU`W zN0u^Ta>ytX!~OZ*Bc@K1`RV2@c?md*%LDfMh2RefNfZXES+WpCTL$RlEZO C2Zn_J diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$45.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$45.class deleted file mode 100644 index c70fac43dc643952f0885a8f920bf765c042a59d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603 zcmaKp+e*Vg5QhJ4QyXKoHEOLV^uh}dU_exmiWI6sp?YCUp?I}Tmv$xH)FdtVR(d4} z`T#zN;7f?JZ4vQwk<8BIpKs>hyu3d?1K7h-5;2CAfcJ%R!keb(I~^Ii&glt{c=fg` z*7x?4Fc=p9mN1MRNhPCWhU`Z9n)kWman*7vQ6N<-U)roO7)8G+EW|OMLIM`U?r+NS z-$U}6k}gXnE_$7Y2&%l{2?o3DyWFesKC{NPq0LGwhZf!5K2blK*#RR=Atz@sH zA{ON-ihzkpOi`qX$cz|=#L(Z;i6>0gFrcVoe~(knsG z2k==0-$0zyBBItnGMVI`Zw@c-kIw)Kn9CqRSd2thYCpbi$gba3aos;W5JpsPJ94G4 zoq^hkCZmd|1(J|2g>?~BMWn3Xe{@Vs#e}7QaNJgrFx!;ov&u8siDWFb5k`fY zgQr&4E`RruL7tHN*`kX{f_pA*JE78s;FZIhs4kC`t#I^fl$$n=n>f_`L%XA0zJUJ?CTA|er%-nnCo;hdky??&B1F(u28#%&sEP7J=$$4A${8N>*{GDx) zii68DIk)=RhDDfsn?fkAE3MKE!o+;zMD&Co3f=L8G*-G(-&;5&SX)tBy2xXwgaTZ` z%4^KV+a`6R^1h+8{CaVEEaL-l97=-Mh*}~%6tOaRaA~Dol@MnBBgbvk3Du5F`@j4q z&tjQKor+XNnjcr@7mohz#fC>1`MX62;{^A6SB3J2nVEx$-*~o(-=6ZEYU<&?vZ2iU^TX=m!*|4{oW1K9or^BqN*Ix;qW@ zU)3i;Xn%k|Nig(I5)`a;VCR0FJ!j7SG5LNAUnRL0H3h^ zFJ${+k(OmyY%484T#mXjJrUhl5`uQp6Y;4?m96JZ#|%|Q*!T|}+iDSN18HWj{3tI{ znMrMgQHkcCD_hO8`(9iGgr&bNdU#4$_@vD6+^)<+bzU}RWsUvYsfSg9XEWO;_)&71 z_T-VWPRhSm{>t*R*+bonlZ;pRUYcRjCzOu0mg#;hvP@=s4G{0so*aJ#6uEXedktsW z_g=hQqi^uOP7#mz_AQcrGK#slE^!1rJVu!#D`IKR@s2s{tnS|6NhcpHM;#}qM4dvg v5_O6}J-X&$4wkfR#po9*G(nByAL9C)IFDyj^cvPV&K~!iGoK}_2=;IX3MQ4d diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$5.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$5.class deleted file mode 100644 index 1be4fc89228f37e1eb74b1da318033928ec7e7fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 580 zcmaJ-T}uK%6g{J>Ynz!_nuJ6TK4?J;p}iPln1NtDqzKW|sDndj z=I1CTQVhxO6UJaNSZ#Oe^~Jf=T_rxZcc{tKctiCa*Qa${h+yOn7~)N(gjaXC?+d@S z2S&TmCqy@bC}ESlV;J*zZ2us~o)CMSGgj%f=FBRwNQ-csED*yQ5@e|&l1q&eY3M)8 qc)`YXIJMb+AQXaD(RF~+FACODA&jj#D~$}GiC7jr+X)Fc!H|1O~(I zat1^AL@Mc@GNkj(J3i%>&DFqa`L0xha-+~;Fse>pm0NN3Rmb=9*SkM?pQ{Grolh&7ZF zZq??VC%no&7%fSk0NoJ6gd^mYV9estgTpL)M)YaMSf$sTF>AykEy6LfKoo0;lckDC xEHsLwq5n+d6&u&V0fE_HlNHHuYyeCwk@7kgl+)CXF>IdBL^M|e|m0dUt zOQRVKnLVkb*=H!Og*Uv%gNUn6&@hQqoyyVr1%p$I+rmd0<5`TsXW0IW8ICSeu`1J{ zRO0mhwkeWx-i!o8K8#yDy5Nblco=ldwbTqN|Hzff6^4b5FoPz~L^lyyD8r4673CJz z)~|k#;v&zG`#GV9IR>{DE0e?#gWrhnla@G?w!f*bJ#N`F8lkRQQLJe(C&FCEZHDZT zQX;8ETx+4Lt6;Pxds1}AkRj}nw+p8q_ck_{*)zPSK4XGjzt21-7HJXAk_9|WVu~zP zL~f|DLmKwacV01bna98~cMWGjVY diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$8.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType$8.class deleted file mode 100644 index 385aa6b8fb4ede350c6a04469d2356909a1fb3c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 590 zcmaJ-T}uK%6g{JxyKQD>*%uN$_@D(XM1)|3UKw#BJ5{iQzlxNFjAgcH^F15JxL6HzbdFeGbA ziLmN(t%a^^fzg)CiP4=wg0M~A0jzP{+1|;qCpeE|#vHxwn0Y}g(juHB3pkiZiY!$` ydaAKc8s^WnUa)u_&nz__2*qGjOdX){MZuja#E~7dRJv3QR3ZADx%hbnfrC-oO|#0A78!!IK-Zb979v{rBH7CX(pELrHljjWW*Cb zxw#UZV-p6$?!yR%;!CMy@`|C>9bfPzcSEk`u9s-3=Ka&&l))HAGhri-jS>p58D9Jg zIeu8ApR#O?r4sM1FVBUZ@bgeGIO8bb;goBc#_Ob!EM&~k`VU>_xX)0Zi)7X0nYhv- z7AoP1j1>K?c6%TG9>s*iQ2BF03p)&@k>vX3Yt}dH1&xJ!YHO)z7@$Lni2J>QbG?y9>*dcw83bx>B-S8ph&Sv z-Vux}Z|xs6*=JaH8Df)OJ3~$hMO+k@$O0A~p-h$(QCV}mA&#`xFu!8k&pVGj-*Bp) xUvQpye$i=ow^Ym_B`s%SKB{<+I{e>=8*Ab`o@VGKo{?QO*CNj*iBtpw`~;#PmTv$6 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/EDataType.class deleted file mode 100644 index d8a50918a2f8531c76b8c27e2b860974567de09b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7624 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/LineBuffer.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/LineBuffer.class deleted file mode 100644 index e140dbbcd773d1bc73b7fa9b1e4efe0d21bdc666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3146 zcmaJ@OK=ob6g_XICzDJXGK749$(In4nV1ZM@{tgMAQ%lO27?5DotY*yPG&++4_a=t z%3ry&C^ulKxQbe6X%(pWTZ*5uN-g(VT59RWVrxb5+}Ay1LZXX#uixwU?mhS1bMN$* z|9toP3n^hE02!O9~|>sCqK1aAy)JXu04{^+K(yJ`+aVUjrs{y=GZ(smD7lR3huA1!38+_>dB zvJN&4@3>P`XdV5ZoH8lP#yl(Y$bM@kxE7tVJt0ez$DG!1?F&Gmu{XJ7Vxv|z>u02~ zcL_emV~k^)iCeHqp_=xBgc~`X#rnlp6wDddKIIfjMc-~iZ*uV|F}u^mE-|}?X78@J zvOrl8$JbnSK9G*wyv@X3x!J^To6W2#f+^scU z^xPQQaleTN@F2x$pDbCq>&^Mqx;?4QJ#1p5gdWWlre`ddxsHt$N^Zv9>xi7R!2FyK zNExG(?!s&n>=7brK7~ZQdZu*sOyTO8veh$1t7l4MRcaZ7ttj{w+uZpBxUG(m$$>{=a^#209#>T8&+aF zOL+%6FobU0%6Gev#%{K^VZPmi0iJB~J#&8pSHz$rQn-=NbqHN0+)xxs0Xvx>;VA%} z=FDA0QWwyAo)01Ize;c3p>3P~fxxz+-n zQns~kOyc+b$MmZQ$ijma@zq|7ua=w)(vT9#1_qzw9WgjSgFRM7=}fw+<$_ z>^g_)lp&OJ=o7z*jRM=}yp7oh9JZqq%;_{5Q9vtZuogx1pj3flAi&Xx)y#u%B|K9{ z@j0vzP^_K+)Y%})VS4L3gB6_0*v;oi*==J>u;i!jkDmC?x3NH#|1Tfut%j{}zp>T{Ok7c7mh2<&TqGkk*%e9M;f z9s2OS1~=q;3c%4PCUlubkd$u#B8g$0d;^f7IC+(JYS3CU@yeHll0Sq1_a&Y-=y{U> z4DXmlyGZju|7FzZo%8*~f0RXJoPRo`TDbSnYgd2pU-6os&H*|Dex#wF7{<@6?O&*; zU)e8zV^95^0sO)G{)s*BPuB1i9Yo4^do74fL9eM|9SPSVT4{jAz{0xj<1pq>!IbV=-jN@;_*}zw+ z5L#6jYgLs->kG2nkwlP`eVh>Z0TDnr9YB!0cZbgT>Svb`=TyQOw1|8C7t|xY^6<6c zyg=%n&`0MXX+@}dRI8P!S55rHY(|?}g)WsquWCWRYQsj=SpjcoVZGG16CXcQ0(>t7 z_@oaCqB2Dq-C3d&NeV%JacKWfzg3A+)^Y9qgHH=$E)#(K2{eQFyv UsKE+!gA38c+lgzEM23+07ss>{O#lD@ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/ListUtils.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/ListUtils.class deleted file mode 100644 index 3a6dce1e5e320968eaea421f09bbe8db5a887bdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1052 zcmZ`&%Tg0T6g@ozh9pCHNMeE!c}gD0_`p>tHdI-qHNqmAg}YAZ3XNd~XF5@T#DzcL zRySI4VY&88{0K|E)5)aB0Gm5~U+13tm|uUt{{XOy$0iJhC7<_%YX@(RMbAEyLCbbz zpk6B32}~py=1zH!+a2z`) zXHDV1;LVO;Sa7@+?=-kCLw#sWs1q456rJlC)ELsrbG*00Ki~lYt(6?jr%U`a(ONlf zU`WJ;%UQP z!_pfTHgT8M7YIVn4kvUGyxa)mN*2nfFqkJiIMhsN;jf5R*eDghJo#xkYCj+IMy=6G zbK}?W{ye&fjabf=Yhc)pg+i_%v2K72TMQrn{jPkb&;-IVIbsq@6M51LbRBtGVNsXO4Ioj) oHpQ4&!9DB{En8>ka^$-|@;xBmL(-Bk{vc(dFi(a@WH7M%9}`0V2><{9 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/Macro.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/Macro.class deleted file mode 100644 index c6e18e936e1810680e5fc6747b0601119e275007..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/Pair.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/Pair.class deleted file mode 100644 index 6f3f36b0c120475afc149335b2a2fd31d775f918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1246 zcma)4-EI(Fz&;M52q`Q%M&Gmx-H#2kUpTY6^}<`j za-xVRBu|aLQD_-7H0lmt#z2vcX;zW-?iCXmLiC&3fBz_?QeX=C;eOW7*BgY#%+0Vv}85?!)#ZjXJ5m*uji?T`*@&`D7Sk~-8`{mV{y5QyV8_Gu~<0>4y`-|I|_!e3gzMNlzmU-$-1QvMeBwS=t z3M)j?ej0AzCOs11mRC-!+q6QsGZuAs6cwWoKPtf}C5s!0N_(PS5|x;l+&Ac7X!ug3 z8?cO&*ZhECc`0>?NGT=rAJN_m(55D7*Z-52%Otss?!BiTSp9*GcNf^o4Uicir|%B% fkoIHR13a0mvw5Y?YCygqB0q#@-uZmEtQUU(G{fj! diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDev.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDev.class deleted file mode 100644 index dda22df94f9ab58ec2ebb7a2c49a77148b6c9e4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6571 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 RE)Q{N1DovT4KVZ2`vQi2YykiO diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDevInfobox$1.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDevInfobox$1.class deleted file mode 100644 index aa0aae479791e84ff486177452b1eba0666274b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1927 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDevPreferenceUtil.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/SQDevPreferenceUtil.class deleted file mode 100644 index 8d6da68442d83b0ae2c43a4a9f7b1a81afb44abe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6886 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/StringProposalInformationCategory.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/StringProposalInformationCategory.class deleted file mode 100644 index b95c1d69a832576b1e087fcd801e70827381b13d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1904 zcma)6ZBr9h6n<_J*sxs@saP#71n?!BO<6_oE!0+`*hoMuG;R2H*<9n=&2GB8LHX9- z(Lc~{opz=sGi9cZU+Rq0-&A|sR)^lI7{Ny}*lF@Vf~Q^?0>j4|6r|?0{ju+^h5ds~Tx}Y$N2>_p7`ap(&X8PZ?v$N%6V}W#$Yg zv-)9O8B{Wm`TL&3u$(P>e%%z7V>bg~22VosiCrU$z$|(VY9Tum1^pd15l%sc4nskX zVd}kb8uIvzVTgj1`L5TZ-k2t){rqB^f&%jha3=yV@A`Hvwo@^SVaaAr!)44_9m;0G^6(;oJ>dB|1Vz~>T}E{T#Y zmA1C@iVXIphFe&o`oB#@S|4c8_!bvpkJ}pV$QD+}Bc`n5u7W0_yEwOCNTYCPz({ff$8cfk$PttDy3Hs3G zrxBcxSD#jSuHpmw*J$@Q?US_TavdBq{(_Q!iBo$RsTwbl9v%G|1EVK9IQ2YdJj0n> z{u#!9i!eT=|LF*C0x3)q))dX6X^hi4iE}uM^Q7VhOpskBjzH%b+EJ{C5sRKArv&)` zOGv#Yn4|)xV4A+bfqfzkjlQpmdXH5yJ|zd4*;$GmXJ*nWV+`be$C+R0ApuExFgi3M zVp?plPmJUx!m;x&L{ZAJVziNcf!UuhZ0upS+QG#(F708VYK+|L;Oc6A4>zjH3H+E! zcCgsS7kLUd-bOJ`p380Alj~X=4-82m8BvIJyGT`-!x*lRDpzp{*Ki#Lx;cv|;bxC+ dD{pmM!6v>Tf*Ba7;M;xODC;pg{4UC{`Y%XR-dF$t diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/StyledProposalInformationCategory.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/StyledProposalInformationCategory.class deleted file mode 100644 index 2500559007ec0f864bd96e830f5b71dc31e86c89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3654 zcma)9YjYdb8Geo=du4f}1Q8nogeVullH~|+N@FXyt?d{qmF)xvgF=eCme%qnvR3S_ z91Oicp+N69+CpgyZE4->4DB>B#509{Av68hpTJC+>BkP=+DzT&>`IDcxd~(Y?AdeP z^Io3!Iq$pv+kY?p1;7#fL4i-;UQ1iiOG*3jyuOlLHtbw-)>$p;`IDAeHf^n#E-jkY zvgR0OX-sqUf@!TP2ng&tr>$toqE;#-XBN)sIY&XKz+kgBqvYt;qL$O`WcnKF1Og>( zSr>?8uIik1ETdFN2`D*}YD$hkcWst2Y`*RCge#6wOv)9CcFh`vlIBz_>N>P#`&hf~ z5gzG0W|RzPMBuKzc7gVl*c_c5GxK@~eneD+aif60FE*#3N8t9W?oU^W#gnEB!0{(? zdRfA!;3k2auF7~Jj#i9fUblkSBe3)Ik{-3odd^rh^n5fLLN9KWR&EpM*~Y=xTo6hS zT~aQpVm}TrBCTB3OL>8T?GChsR5PCn;t(-i)>fk>(}^zV(GnxrFBRXZ;x62*A@fL zl3@!R$uyJbqfwHn+%fBDx${$6+0~}tNDD{nuHUf@DqbvCnIyA3bbYyPDJ4@9>c$XK z3Wf#3Zn_()RUE_pq>ybqNf1b!v=se>icjKGd@txEc28fr8C~ykr6inVDnjTM=*_f% zw_2_Ps8GSQdzC_*jq&1GW>H|GFJoGTq@F7pWm`|$7o6k;BTorCIc6^NmK%dk{G5u1>*gm+OZUu6%~=&^>Y7`3&Z_tf9%JF5 z%NcFetT27sxm!oulOd3w-3G{_t04J+W#m0M1q%ZEwuas$Hm*5Z2paMdZSqO!OQ+AA z@xm#nSc2if;i;3-Tgpg{Tk^y_B3&GcDwa_aP?t5UV3a0xqp-xFL|Sf^RXi>?yS>ea zjl8oY0kTy%s1OE1@7WUA2KFr|NUImXX7U6X-G1Xwjq58ap2So1IcMo?JzigGFjnAb zdur=88d9nDLKU0qqT$c0_yWGjyEr7A9ZfkaR ztDK7GWT}*Vm|+#xtq=zByowj_BGa>?6)XD8qQITa#igEvc1J_J^IuhQ9DP#F*HwH& zDi5$TE(h@~X2op~-;ss?yL7CzZnSh4miLzge8W8O41S>EhjlNDgZ0U;zsTs~yENN0!Q`fSf!X7VKt={ouXx6M)Iemi2Fv~7=uJs{xSjNcg zvGnt=gQHKjPJW&FWaD(7toYnh-T4j#I1ghd$6Z|cz&!(u#Mf~{|9empml5BUs!UF@&Lp8W{1e|)>x6K~@v8S*-I#}odyG2+9! z7$h8P2ufH+B`g6KmcvW|FwVE*bYTK}@Bm?$U_d7bO9rEu!bwcC|IFYKoN9t7+khzB zfG8`QID;9dPL-hna%D#iv=iuT0c~gtXhZlvpbeoFw0)8)EFByrRg!#4TOIK~BmO2Q zJ~y;Zckve)%V$xKETuX7oK%fa+YO)us2xrA%2FR)1wgniC=K$qcuOZ{F37o z%Yrv6!@{p<$4}ickk4f9CESc(bJjuq-CX}IcjYA=K=2BVE10|jMZx^P5x(IH|GoPU Yv`y;suH+=Q diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/StyledRegion.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/StyledRegion.class deleted file mode 100644 index 097186d2803eea2c1efafe7dd6c0687058abdb3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2188 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/TreeUtils.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/TreeUtils.class deleted file mode 100644 index b5516f6624c92e94a312eecd4d944db936dae882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2078 zcmbu9Oq zWfD;&48+hTaJXcv=_UWYk5IgFD4=Ik%2B8 zp$OWVahz?>1UQ zm~fpIjv}pNfDwFaVSCrWAdWHou6)d-q_!>WN>x$EkU*wYpp@<;G8i^+LRr%(TSZvq z^OS+p$THvZVcl{Vf$r?Tg!R6H95Ikbf!9|oe<9>yZQLhZz|08@wv0WqtX0FTcKy@7 zKzpU`dD0COs=)Dq||OW38(=4B%dYVI^NN@D;AI8t8!!L!hr&4PjZ&)*Oe;!LGSQ zm3LLzt4bXk$lhncYJayKJXzar31fTC9x$@k1%?k0CxLJNhxh|As3$bVGFGw$lI2?6 ztH{f?>U|wM{d81iA4AMelnofrIAX)(SLe*+U+^Crd5QSX97K@hS8W4_(ax{YIKclQ z&JyV0dgJnsJgsqUeB>26H<1!pc#feno9Gw#6`A?M29E!RPW8)g;N(-p3NN^u6L_}u zhj_u8(a>8Dfq*o6*;{fr#z&oIWe$hlGa>dk&R~>h=!?i_>Ax2#e1dZ%_>`+DM7D^h z=@`>_L1%NIjf85dJTcA_5nKobzvifo^T}T@aqlH2OCuX7-kXfQ8P}rI&oS5+OP`z1 z7dG)l1b6d=SGc%|%N+g?73ps6r>#Hpidzf0`$J2kh?8i5G$+WS=qBh`v9pL>?NL3@ontQbEMStC^fxk3)OT(2ptPRKlSi+?dZAjUOhKINY6#m%#raD i^<1HzIqJFgj-Fdof+q8S)05HJHFop}lxZh|#lHcw*7wB# diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/UpdateReporter.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/misc/UpdateReporter.class deleted file mode 100644 index a016c92ee0379c751719ad65b49250caf74aae8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1571 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 B^E?0m diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class deleted file mode 100644 index 1d651d521f631a8934458ef27b201e998d7c1c7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13343 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

    2Sa0(@;mtx>c3*g1659?lveuK2q z*J+zhWjbzYh2$_CqeWt$1xE|IK{wLJ zfkOZn|9a^Y!1z?)^-1~^Fs{ZOubb%8pfNI@Y?ZSKKtbBI#vcZg|_9;zt}6{hIXP$Bf>@nL$hGgLT8U#}?|rX!u9qCtALMi1#J zdOoCMzzbFK{>?-5?G$}qUVnU;etwXCk)q#)bTIah()O2{0EYe}MgJb6qqxk#iz)*T zb7AMCgRHl8798Y~w$8$XJf*F(=pavT>(meO32le?7AiVG7YZ<$G35ZQ z3r$JSsI8eCnw;Xd9_DjXyjo_gWw3HVR^$0hw+fJxL&4DGAzrW1W&zOx+>WMXdG&T# zDCkm1Q!@l}EABuAM^Ifjf@*C|$>LDS$jSxs-f@_>qNcVIGq6{x&;dPMJVvCa4-9D3F!bW#d9TnnO4zlw3=?G zCc2Zh-~zx!bT^FhUKrW^xWF|?SHY27kLw6G(Zk^UBXkEnikl0E=^=bSMvvnp^lS7y zJw-3m)AUz*hK|w^E}>_63J%rF=y|TC7kC4`$Za_Jz6fnS^fX_JBkRlQr+h6=k#DA7 z@F1R#;js59`W-(@ukuUuNB%zjiGN0a=HCLUcvit4N=!Dt8((v38kOL zKj5qQY8b~X{uW=u?}eeQp4Of^9R72$Ka+v z$REP}>6dXv{b9TXv2KDt!XKp)(6N#~#y8SrU^`R2l>oo#bR&P9ih*U2Kf#~G@27y6 zxG)#mO(W25LZ1uc(<3lGjqm~&Ci9NcuV}K)TXectr+qr@*XcH$?$YT=osQ`I8Dy6D z4}VJt>|HQ{u{tkHk1nC9$Ap|7ou2WQ3D3|OX}-d#c*1isR1{BuipV2(WGk8A-=g1e^vM!=3C)^_BRjnfzGN$gM3>}!QxOs zWs2`W5aGK=efMclHR1yNj|qho;36FT1?U70(i}FZ42B}=?Z%NRrH=T-g@fz(AXdj) z+NYm@4B;le59&P!N_0OzAaR6K89$GRTA<>>OhgYJY^thC@euwV#@Ayhe!>&erpP!x zg^GAKoy4bkV#>^nc|pxx^D06z$^UXSiY23yJhLwog`0-?wa%(R{tx2vlbuLLzK*!eM-i6?HC9nr(}uN4 zos$N&!kVH`A)+!!mG(q#4!HE`nD{rKAaN8TWgD&JP6ydGVgbNj=-7fAU+R~@Z z)Iy-Fn0mBXaJ(9{W}9}3HXBsVrgrUAINkzUNDbO)+8kKY3aX)EEe!2hN0r)KXtj>J q^I`3DZ5}un0cO40d_dE*1>ljUm1zs{oPoD;>~t$JcM%Z7=~XZA#U!J7AV&?G?V}Za|z`VAS9Csqzt)`5PGAG>C+@DU5Rzk7vdO=(hZez?9^&s{)xSMPdvW>3uzZ<7-hIXTYh9CLyG8Y?u z;MIz691G6fX0tikU)9dk70@?^g8P4(!!W4sryh-@Q0`92Svz&NzaMGrDx;b5MjWWmi=>CAU`Yn6lhcH^MGaWoEk z(ZK_|C!Jdl>51ja4t`;nw-^O|l4i%SY(x(4^s|HC?M6pGXVU2CMF)Q}Oj-1!xrJrw zLoGEJ1|4YWvy1*p?59Wvbh`FX$)(6B?mG1zz3=Et2m0yStty8wK;Qe51{lN;mFQmt zzND*6zC@o6S=XAlS0(OCeoPZ(>K=SWSB9_6h(iX%UhFej3>PBg7%+TeMw~Dp4&b24 z;!Gjpkg_;zMqD%?j^L=t;%Xt{TV?T`88Kl%4C9!|qFjjhURjKo5qAxU*W zp)5wth=&HmNt`lSJSs$-Ru(^+5mf`?49=P?{6a*sGMqCbLIdJFE|@Ipg@}u4EXK@; zmj=Wo{A99tRfxE(EUuUluMLQ+xMs3=Q-B!9b!Bk_H%*AQg@_4C?Z7RyZck#0;?J~_ tmr%xSigzf=@?DDeD9%w_ptwkJiQ+QF6^aij{z~yTihodiMDZ{5{0F$*u-5

    2R%3Zfw`grp{pbHUUkfj9;VJSg^%h~-G>NcN(i z(7$P4+O_)759mjA^=NDfNo2I_X?U>CoUvx_vybL-=AVE6`WwI;UK$u;xGk&>cTDf+ zChwSsmhiYR4+TFIZi9QCE6lB!vut_1ZhN-x3IoFov#!`PEyr&OvomLkw&U9e-1G(K zW@*>+h1Kx40>~QmMC0-dw+12Y4P?kK+K%lP8FG_Tb%x=x+vKCj;bZ{@K42KD+791n zAMA2bvvymY;iIbCuv&FX*n!{c9QOBZk72$#NDwjQ3k>5)++Pku?4mB{Vy(7NB;?Uf zklt&DL!L3B{h`y?N(E8hvCj-RXtB0w_ALJKIGAn<{JJRhSL8|1H*Y4RD3d1 zo_v159ZEFUO2Uy~nTfBz2Odg3!y}yxWya4?kQu8ujaIu!6Xl6k?7iWcS-F2K$TAOQ zojjysWH>36ukcs2pD^fswC?Ck-RoMqQ@~R8vX1N|5W{Jy`k~bjZb|IX4*5(gz6c;w z`-5Y`mhxA1!&-x@#c;K!I;R@XYR}Rk9tar#JaiwIflQ4l3D&F+>xwc|C_&q32;_53-;E>{N zw=Eic%?@h93&9KstJ_#vcOxj27=B%>-F>%aDrQtLs!F$8(hamW>)qNqECve|$Kj&f zvOJG_21*P|gVe0OdN8ri8z@uRJ~#?(jwzfqhI@nKOvEQ6)fjQtK!s{O4b0>LPA6Hi z!$6gxtbv<8A{fr3y9{jVC|6LdcgE;Mwjq~{2EC9;g{iRnKv z`a3mpD9|%6JI8Q}+J){5IE^v#&Lnz1B#&;RIEx{COzk0jB4Ml48X`YGJ@W^~f1_3$ zcUdIibB}$kTsah6}hzZ+98K=!4;+lHrnq;W8yDWcaENh6yFZ*9wLS zT!|R2_Q5ctWVohan8Z}XFx>~ktde0y!SD^PM+`UmV3=1jmpg?So-S$#6@- zFo*9VhVT1eSXVOKRxsSbe8h0K4~7jT!@`jaIV{Sx_Cs$)6mgII2gJ05Wvq~0CA&`c jKG~rEN3sveZjjv~`-to|*&5k8*(YS5k^PD63yk~+sl2;J diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorErrorListener.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorErrorListener.class deleted file mode 100644 index 2392de681cb007dc4ab0ee82bd32c9e1e32e6ad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1535 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 A0ssI2 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorLexer.tokens b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorLexer.tokens deleted file mode 100644 index 63badf73..00000000 --- a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorLexer.tokens +++ /dev/null @@ -1,31 +0,0 @@ -COMMENT=1 -WS=2 -PREP_PREFIX=3 -NL=4 -INCLUDE=5 -DEFINE=6 -UNDEFINE=7 -IF=8 -IFN=9 -ELSE=10 -ENDIF=11 -LPAREN=12 -RPAREN=13 -COMMA=14 -STRING=15 -ID=16 -LETTER=17 -INT=18 -OTHER=19 -'#'=3 -'\n'=4 -'#include'=5 -'#define'=6 -'#undef'=7 -'#ifdef'=8 -'#ifndef'=9 -'#else'=10 -'#endif'=11 -'('=12 -')'=13 -','=14 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorListener.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorListener.class deleted file mode 100644 index 41ac685b5416ccd1c59bf7ebf9972ddd6d8365b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2254 zcmbW2Yf}?36o%j6CH4y9wTSnsAj&G%D=L%%S_h}hfPP=wP|K9vnoT?WHb3|S{85f) z)9g-K8E2Xg?bDMq@0*;QB)|Xs`~{$b4UQ>>iu4B}@S-0rG4Oi6jD+-hQuJil6j2mP zZ`TTTI*}5AkQ}EOW)A&!_l@!HugwF zi`wF|-;`lhwj+j*PA;i{ZB&Sj(jJC__WBaE%z{2RSta9br+n;`bTAC_7H?hsz%_5f z(YA@sTOv9v_$?_z>00o5ux+3V-bfDh8|u4o*4Kmo(KnLWy|6EvV!P9&$|~7ao*e4s z_*$S!uLpEd)Vh8YiHPGq!@9%a9;rf(1%{Q$Rj7i-be0&_Cf6z3nWq)nA;&U9)j@Og zFf$ZK8#taa)Esov^J8|B?(6X;j*43z>$Y0!?rJ zG$Zr>>*jdpmL2;+qU_iq$2!A?!#a{XDxLcDSPQ+p45#RGhTisBdYw7WA%3MZhFRov zoHs0>sN-qF8JySgtlG+!AJg)2bhT%=z((&z>n8F?XeHUfo sCz{ngJisFHA@LFMG0`JFA+8Xg5uX!Z5ML2r6IY3EiSLPP#40j>0d(o%+yDRo diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener$1.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener$1.class deleted file mode 100644 index d7095c8c8815d9155b8af8bf8a08c756ffb9387d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2138 zcmcIlZF3V<6n<_Kx=C2u8hH^^2sOnd1=iLQg|t;#TZsmU1nc0nHtVq{-wFZ#Nr z`d(L>NExqdRM&(}6-A-(>id*B@7MguDy>X@&OuV(a%kF~)HX0)f59_7ZT)TKt;k5N z855f4rv=7s$B**wQpnn|V^#!GeHrAp{6Gmz)E>&d^!(6UC!O}j7k%y9Wr14ZC1Q+v zEp7-TSHqS{L*Nw`Cos;^qzebB3=(+NMH*RwM1hY^)_kq*_O>^bc_24A%WN%d%3wnp zpY`EllA9s0bo?~)b5!ujXjfag6L(smSEwC&8TVB)Y-|5pWh#T(0;${Hz0HTJX)D$0 zzO{xmzHV2JbYuNcukAEdmxT(~oNoASEp5+GwY&eB!(yql{D0(;!JD|?;4Oh0$Hte7 zi^vhiWRua)U|oJ0Bo(Wi)U=DY_j@JY%m|!~u^ZpSpzA9=KWHhF!aD+I;v0=}-*gDr zIi@9DOKv)YJc~Ru7t)8p?kJ) z7!Da+8S@u<1uh+lOa?eHFx=Xr%&B3G-R;dVUmlli(*Y4xKvZeJ*^#CmMm{6D zss|g1?WjF!IwS|#klpN&nT&FT?sIeo>~^2efte%SP(d+Us0)p-XPS!VoWO;Doypg@ zP-?-NZU$73Zr@S16SiF3L!DZ#c6?iII7PZkhIAaKafaSRXuM7*&XGKZ^RdfcD4auj zx%54Gr2h|iWAM846Y^hWFF!_s^oc#p?qM!_ogU{-&|?qp@8Kp#PJkny=d|%VvUq|S zJS8qa!93~L@kgA=?Lm}bCKM0L_%P0{jE`_D&by2iti}bF@i9qB&I@Z;r>3y<32sxA oD#?So*vF^jBZ1FoZ45Qsp?8u9d>5aSl%+MUpMUr902@d@0~|$X9{>OV diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener$2.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener$2.class deleted file mode 100644 index 51d1b2805610e09a428920ed82a0ee6fb308085c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2163 zcmbtV&u<$=6#gc5vW~M!T(_wSDa8p3*lwMrZV0qaLtB#=gOdhQ0xfWutOt9`X4jcr zhlWf44$d4nBT)x|gv6DVp(ZGd4cXxP5- z5}~LLZKcQ%JK&D-vF!+ksp=hmz)jmT*J({>V=K062dfPCGEd;6>dCq(EXQv8!n8ao zOxbb+drz2^Egm$A9j~pxcFgU7Tb~pwm3|=E9foMhtBG+iOzIfLn3AS-Xo$rT!3iDX zNHXkahVeB#dkWZe)po^ZYj0P`n|xQ%n5=phcXqh6)w;VGRoP;=GCYq)fif~-aMyDW z_q>)*nNL3|+`bDJ7*70$>pqPF1FQ7yTx2-iAI@R(IHZe%##SB$XH`W&E#b*vO-fHP zq%z0JcDP%o{7c)d7qdGtJjZadbZ9vuZM*4)EhLv#<8VHX=kcP37Z?&@vG!ckkwKP< zR_wR9LtM{fIsikJ8@qRe6%@0#RlS_kaUOZ9eQv2nH7Lr>C#mr4AQQznOkB`FIhqb( zKCEsX1(3g}Z+}L$63JvM3en3t(wNuq3Q;l`*Y%d|)P#)T5+x(#%};;Ypbkx|kwbi? z7vfk(Q8mHJK-domjbjy8HN3{4_cpnXYq-v!)kUCsk>OOP8%z(e6wNYT*Rh6mqL(+D z!mTmnd+9y))5CaYs|&su!y6Rs!sWEG^`?%ul-pR~b+i~p{ea7W%saxZD| zkPRxK$#6_;@MgES;@e(JT0#vihO_@Wa~G8M8KUU_=jsF2=6@QY!rKU3VlkmFwo#&6{GcNq8sdHjhL{DrF|muPPte}@6)I#3=2 zSVomXP|(ZRAW899#wKo15L+ZiF*0wE{5HuWcn90zUIaJs9!W{sQ+L(xecZ-}82=YB C17FAh diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParseListener.class deleted file mode 100644 index fb219a2085d965f4921d420bb5ae602c4f707df0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9540 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 z z>$q%|Eo^~5OblCP8w$y9uUsK5@RI9xxl&qDM4mUuc4>o2ZkNjrM)qRzx>T-`ojj$T zx=#$Vxz)9@O&`!u#0s91d(MSLmoyp0Wf8hC8YTR3LO${P*2`V7Nxi2*SX*J~B} zTW#WD>W_PXGvw5mW7pCPS@v{DrxPWq3b#(psC=+ zjrn;S8C{~jf^zrzuDbe^^c_L<+LQ!NfzflL;T*uIT5b$%^wgFc<(`xB0cHR6gT36p zSA*0t&M8dX=nQn|P0uj&)}NG+0=mmBS{I1zDhQl&d2p~0s7@agr%CAuE8x*%icu|?&k9zKJTSp z+|RWKqyZ1|tfRE4PtuA$OZz!RdwGHHFVk9-UvJg*(JL7Xq$iHZjTE()-qk~EQ`vkU zeMi|{3)}rFff}p~)Xz{$Xiv%}I+1@GK3c*VCVj0&>E;{NW=KRScYW3@7pCSnWX)%G zyQp9O?Bi&gS+aodKnbJRjxrfNcSU`EN@CM#R~J*XSTC)$h|fiGmFBC~0h{8hL=vP| zCHfLgxhkwmB&qol8Iy5xsw)f|4@@hc3UW4D!Z*@ zTX|LK`<}9QBgU@2e=Gft8>EmREc8ikI)2rT1n#&s!a!40mFE*OTZiIE*qy*}?QPL6 z6NdJjdP@WyB?;x;+qJIgidNm;3zXBUm$#x7O{r~-TwZ6Sfi8Kg0aks%PqEF>|Y89FWbrqeu->YX@nnbp{qR~2qWC`a3& zGZ8c#?&nz#p-aq9cixn$F87_FL0HTGH&CIXo4jt}Dy9jgzCeAJQr3Bd8y0S2mdVs* zU`EMJApFVnu1vYU?IVu*-`hkUqSY}NyMZ#*x&qVDU z9Lj1CYA)&tyN|lK3nO8|RL`O!%n8p=Nu0|2k^)Zec^y@iuNBF$^NX|5@&Q4zp*2qlll`;xVk^PmI1lM)n(WUrh8kpQ8q6obx7-!4*CM ztDD2tBwNJFnhNoDxJHb9EfSDbz9O*lG*7s8rwelC}#z1NS diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$DefineContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$DefineContext.class deleted file mode 100644 index ecc43f244bc59704d6e60e03e4418fd862304352..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3090 zcmb_eT~`}L7=C8KERdyzRH#zasd*w1J*zDpv-#7$ zY?}?sYf8^-c(UQS71?aMp1Ixku^sGRS(QK9jx4y2FOPg3qXJi5uWDM3U-QiNqUp69 z->yrubNqg*);%jQ>R5FtFkgx^D7%N!$qB?(*Vc=hYXa$HD*B}FNokg)SGOIjw(0Im zT8$PsPCy`Tz`&%ySXKG~q`JJ@&gC* zXHAc#oT7i(z}t9-pxw-%pD!dybl}>IT8&K7sMHg-fG7%#tZl6`eeAxpL}sk@ zTF6u2dbHC|kwwSRVU@!Ts}WZ9m^`wB6lfi$Ogl+d?pv}+D+Sc z>A}7d+1fjh6_wu``SP8?^`&8e^Oe+|g^thJCtHQiE_~zbF4T?2gbXbZ(dzDQc%=_#x zvF`L8`tMl%2uz)PG}tBCG59xuZ4Iv=#+kvHjxqj@^DE0;!Er1-6&rbsiAS7kILF_Z zS{L8pJm<=WXE23nj%@Hz_ES;z-$&YCz^g=2_umTdkEatew7>WSGbbth&<7FkQMiP8 z5`BXZ8r}?`7C2KhV`=>{-a3h5^`XT2P~HuR*A_DY6eSnR$Y2 z`VTB>P~1j>-0N_2F)bQ>LK8i13EalV#Jdw%h-pr9&$}Q$ctMjF_-DP~Q!JBrC*ke} z30Du5%u&h8L!6_M6)IWP@F>IaGmhjp+NbDeB*anQg>yYcbJ)ZdWo*-;Q*CPH%l|Yc Zc-eh!YS=-Uqxu&33SX1T499OU{x59j^gI9n diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$ErrorContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$ErrorContext.class deleted file mode 100644 index 393c388b5afd6dfdb0f29ed932823556e0fcd95b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2824 zcmb_eTW=dh7(KHN-dvm}aZ3tmpe>Z*OVbT$fKr>ZC6}_`Tu4mB8`?OdbQ@>ajMrB9 zDg6&Tl$RoSK=8^tP$7f_NFad({{V4jy)g!FT3h91XLfeJGv}P|o0=`t2KMGQI*kLff3iM2dYsCT;CIzF2%-`{e9^bIC*1pdE{O*dy5v`!>b9d?{T>Yt1h?I~z|GQQ`bqMJy(Ey_DsS3rxA?YJ;*u19$7woNBXFx$ z$*l*RH?-yMc}~z!X12&_@*1p++-2#mU3)8BW!y{*6rXjY0E zby?cpt~?~QOqK+Ph$@vH7MMK-JQNsGEVJlz8l)#xA-iqjlE8dFsXq!HK^~V=urMny z98w5(m%viyu}dkt&BCunECpubEk8ySZKGY4{Z*$HmH41MbVJ`X=T}mARdXKFgAwJV zQ>n-rb9197|F+$_8~C)ZRby4h+q2ep?#PNR?$u)XTKD)uKfuL&xm;K%Wcf5v6u8n) zej;)sC}1Il>$t)6G&SK!>%0F$db;(E;0-L9Smbec{0?guV8k(nWpHnehV&M1yVYIp z5P_=?^Gerwcvi-mZ-!95;y&%AW+EQU+T_2F#t&;p$KzZdI8okc_?F*L6}jT-J$btO zBD$>4CT?fj<1SpRI`z7&n^+f^>nGE#BZn}Z*BZ|AOib{e@VO{_FgHFP7ynI1{9rr&WL*4M zT>Q7O@u%=4Sx%CRfzzRkS@tx?WX`;gr~a$rK?h2*&EgcM8KX@oP=&$P%$a9mO!zJg zpKMKu!nGaG;8_9)oP7u#BZkiRv2@PH&@tlZ{O|}myk8<+Hg)Obo4Ne-CwT5-c3a6E z)>@1oku-h^!Opd&b!fYQ7YL$NUZhHG?u*DourqA+x5T*lQ5&*VFF$ukOSGNNA{T{j z5lTCq&VPygU5w_xKtA^=W(;U@iLmlo2KMfl6LCa8E0`$(H;EIu!kZwDD)hf>Uip lQ@DjUDZ^$&Yp>~%xBk(X=3;O2qk$4u+3G(Xfi-Mk=x;iUp4I>W diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$IncludeContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$IncludeContext.class deleted file mode 100644 index 9ae80eab650c271ebf582931bbf05ff2d77dc37b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2284 zcmb_d+j84f6kW%5Eyq@p#)T9@AZ_Wzmo!S8(3Uv3EpF4%j2k+&Yn~PR;HpuM%#rK~ zpVEKep}fGr0|T#o6vIA8itCJBh=;!DT(mE1?X|V_*WbVW4qylS1`-Spr8DHh3cm01 zq1AU}z@^ofyf6I@4+39W&&CeV^!w|!=y-!Julpk8C!v89!%biIEJuW%w1zvD9Ei|8 z=2m3?eBhnhGNit9Jjm4MA=F~S75rdue8^?XIaHAI4Zq`fZAZH59ABowmu|pN zZ~X5v68vmMda3T$Q)j9eh7RRR`hw5XMKKP-uzYsN z{LnugG?f|R#M&`roBlv{_`V*wmnSFrhUz2I#uoH#);%W(cwpcWLuD4VqhZ9baQ44| zt2Bs{^sAvsf(uB~&Y+!v3_a)Qv_)^3x-DgrKO_5wwh1iIGp(-K1{P^=Mkct3B|6a* z9=TUy_e|;H;xvD2%s(^or|C#hRC=5I6+ELjRhqw}%#UT`n z%lIgU^)Xh+n&A_y#$nfKRjd*hejG)N2yKr6N{j$~iqB%tCPkvm$d~`b+H1_0|G--5 zS6od%VN2@LMA+_NiQU!FmLrc5wmfd&CdIp@J=hX$3;&g%IGJFV5>(HdU>&y!#fD~U z>Czs@Ojd}==4&hvlTBh$N#ISH);qM4b!v=J4S9BdEaA$C(F*qP715}XN7M}J=Kfob Wc}n&`Cx3{qX;uG!`Xl2p=KcYFb4ru| diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$MacroArgsContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$MacroArgsContext.class deleted file mode 100644 index 86a602631d671bed45e1fac0da78d681ea2b8dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2735 zcmb_eZ*SW~9DXk8>NIh(G=mPh0t3d#pKji|0%ZwdCF@uq>8du0#7j3lWnNu7oSmqA zlzj(Yj29Fb0&PejF$q2r;&-;|8RBk<)HgZb`R=*r&+pE8_Rr&A0jy$EL4u(n^bxl- z=j%N_(gwP4xX=cI4}{(0j$;dLE7IBW-d}3#Jz=klzSFQRmmj(cW*9EpqOa+eYYJ_& zs)?cH8V6kSS8NYW9?WH!ZEdY@Z)`G@i=|fVB3E#(b+|Y%EZy9+_jr|Ira^5Q409^d z$S|b(-0j%=++tWRHk(sGooyKw-y9z7a?#OuP0mng**)Ft>cWuyU~tC0Z#WDaty6G_ z1SFcbX(N*SKp*Ma&^1i0WjHRqncFe?mhKJ(F{zDBs7>loy(;Z_RmB3%6X>x$B;j0< z>>1m(B1b3opBW6SN$G6|>78lZYq!^Fpk`QxTbC)sqm7k7wOQ(>k;Fw6Z{STrpt9qZ z%P=tjL)NfH_P$~DcU;{i-&B$-tE_45@k54Wu|!NdG>QAy5JNspIQSyr zZMrs-^hpFV^mGQZ^s7*Bg+>{*sd8RT9wGIJo)b{%SIz+Y9$9);{W-|tEcFN<^E9jA z%{}MgT&KRoQOf!J5nlN}%uxhJiNL%@izJO2(MV8BH1Zc>X#D7{U-0Jy>uEM#$08vx zT!<5tjT7`Z!Xy6%dFA+o^jlh~FStFBE%9W)b@YZ+q z=m(URZm=hqWlue@i~h9G9fd-Fhd^j4-X))8K$q}d0J}`Be3wwZ4H5mwe~U;n4_Tos%B` diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$OtherContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$OtherContext.class deleted file mode 100644 index 182281a2f39ef39ceba450beae932b8057d901fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2214 zcmb_dTT|0O6#lkBLQ7Dn3W}nrh`j*eQWPnIT4bg(b@%Nquj^GqxLoK} z!K=b4bJul*zSZ=y<$oXB^!B*OIkv}-JQZCGw)#_n#Ds~ zhR8;NA(coL+B$fGbG^vLp=le|hO^7F3|%=|V_=ACh@qFEr^3CWbHHtei9|l%L8vPQ z)8-qs!yPV)#*W1q;svK{SS3T4@;yB4^7c%Z;YHzs$`E+v)#e&Q_mXLw-m=8oo_C8- z*?h7TgMw=s1`wwRR2Xi14CfBO&}Z6p=fJcp+n(VOSC(hcNIO}NyuHhh2woydhf#{m zg*;}MJ|lr&86RemYE&>?kK0^ilO+{*7&4tGb?V%U5sYfMhx-gMAA;Xj46BI?E1xV; zpI9MEhROD_pFxVGBgx7K>qa%~h#r1q`npNX2@Oe!IVulB$lXS{%&SzN=jYO|WV)v3 zkbH%Gqi*PyVOR9coqb;RsArNm)zir`+d-VLZY21&Qxj#rX3G0H)H;o) zWDn8R&f9b&bC%({+*R?CVYZV>2P25WG|zUroHQipX91|RyM%6fs`NHPr%axvROKUj zPG}o}Mo(!#V+DP**8&q<#ua*F=x^g5Y3H77>rR7^g2?Q7$}UlND;}Ai*iVGy%A23@9^xw86lm0WOXQ7^8R(eGfK3+wp%Tc+{F8 zLkZ^3n;?ZWp_uU5PWsv&hD?Tu$<#3}6O$=oG9AH5n$`@hWZl)oXaRBMX;Z@C2BTpt iB1<%u$RlV5dGhQx$2cWh_LHyRIj!YFxEPI7d z=|AvLUc!P0R(a*4Se%h$p~ectp%2z*#&h=Uv(IJp=U>154qyr2$&eT}EWOK3wf(~( z@2V}`YI93%S-fR6>%84=TIzmavhVyqE0(nHi%rw!r?!kChC5B`NYzcdVX56E)#{kG zal%!1`{Pc7dwUrqZIdCJ&Xht8Y>RWX%B>T_)EnjIAA+8{SBtz_o+tubV zHyP&Anl=E`Xvr{nxpQ*Bt*U;|;0&o!v#vL4x@CyDw>V@!G1?3dOaE6IVt;L`ys2#q zzv&Utw#y9HgYs5v-R39Uw22F;@>K8YYR5JjYRPEZWFM~>N2YFfEF#PMHWaQ(u@_zc zcrQTtwY-ei8TPK|`bD@Re$xtWV1{9o;upvXQu=nn9|^wTKz<&wZU?^5BiHL&Ked{03d8On%W`jc=I zLXy6m$%)m=*Vk65vc(WB7^Y#biJA(x?e|d2)Dnn5RWOHnLTKrhlgO6_U>G*cZu8hM zkDNqgP`nUm<{>|&f=Opczc`_COQa0L!Uf58nVO6hhNVH$re~bQ zGFBDjQD8_q6x_bYu$8`Q9{OFAm{BKdcsv>A!$rTqEfS6ds~_*`Ew5+A_^IJkm0KbHW_-# zc*JmjkPvy~lGwq=3O)hVSF$Sz_nfW0iU{?4m_!--GWO^SySTpmEc93^_!N&RVh+LL z6QglRWx}xXZ)%BTckaJX`DF*HX;HCWCT%<(6t~Hjue%>xy(@2V030uJlwOr)$Ex#f zLlowekiOUc-Cl85bSA24&7@Lv+B$E`_?lsHkXXA|q@NpG|4U*fc;NYa47aGSN9Z#L z7@@aoh|*K0*&?kn8e`e9vB()>&*@!)LQk;+QWnGXuDE;1c9doeV`28mF#BAn{dkyt zEX;l`)IJqv9}lyi54E4bYvkp1$Ja?mhkG;^I>_17)EVA5FM}F@k$o8^@Fp1v8P`ch ziN++E-#EitFEDi;V$p$^bhmjBWPo>Yn?M+51DxJkt(X4!iJLmD10+gaYrCDS> zN_mfxoRx`DUtk{u==3}y_kB9KFo_dk60Zb^#C#%j1$sm@A|g^x&gN!*!QG$f)y=Sk z&_Y^8RLVOLH{ET%HZm4)k3a;iMN&yb=sta@yOIld@n2*t`jZdoCT$_WDB?4E9}hg! z3PFizrE-5@`5A_DFR+~b6(2|t7ZwH*L3_6glxcnI=zmo?(PM*&$Cf3D0vh?$Sv7h5{b#ASFEt960TJ rG>r?qzNAsi8NR|dh+~SzZxR0+5x6|z diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$PreprocessorStatementContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$PreprocessorStatementContext.class deleted file mode 100644 index 024a7b37cb08a6de138c4b4d3803655402815d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3394 zcmcInTW=dh6#m9`v%YLnYC@VC11XeZ$7!~tDU{kIX`KWXoJ(uhT;4YJ#NF0eo87e) zeoFrX59I{}52(EISP2OU2?>xu0tx;B;>_;G@h!z(;APIvc+NN9`Och~@i%{c`4xa= zd?+Enuw!a%ZYb7ARo+&bnrU%UX_~xgHY(h*8m6+_)!B7^ztBBYv^AR_aKp|w44WU? z5<(0Y8)i+>47+YB?PbMm8Mc1F71#TAtIoZ-43chC>a8kg*hr-dKB%a!zXzCQ2<019 zE+N8j<6px?!4Q)nW0GO2#_b;Jxm4kv*4C7|X4I5?U9+sLnl6kMIPpAP&<(!bI@sf8 zN!zQF0`WqlqSecqsf)fh7_#r`7Q-z++B_*u#9*Sz_lX0;x01mIO4VGkJlX!;F#GthMPW^^#PG$qA=8b--?NZsQbsfp7Wz&5#eVwLEtpj$RKxS36tB`6Hb<4APm z9K#}Bm9c~?3<-zA&RuEKmxib1grG@UlC*MvOKW<^QkWm=&T%MW zdPBx_5z{#_ctS`MTBX99l+U%1^e*d`ZZ}Bot}}LL?;fw%bZ|wAdd<-6mPzT`%9XAU z&RH2}kzA%!%C2P7)Jj-mxH3*|J)$wJ;--u|)+x1ZLH-0C`2UdF!T4j?#M=_yVwfL# zA@%0ji$R8pcPP~k{rp|MUZo0Txb`G1MGbA!g*!Y^k^?2qriD@Vo5zDPJkxs>e%w5| z4wuHj@$$+LEjC(ag>UMj-p_U?#(j}2ihG=n3e}(rcW!cSNhmTbjk6P6EYh#x$kDeYX~|RS59GqT8VmBX_S$T&Bw#R&k%it z@I&ebFh#AH1U$xRYGrpCp28XG(K`fBQ`-kI?LtiVLwq|FVg_diA!c2O*?x%chC(Fp z>>xzag-G^8d_NT8dAu+PG3P?e^+WtH6oT#|4?-n5h0M}?Ciyuod`h3Llu@$4k0j|& z4#b>0&6ATHa1pN%i1s_4A~8`G&|H4(I2!)|Lj^Y(TOO5 zcTu1)w#dWX*kWY+IL0_Fw&N_mi(6!uC~?!cjS?c5BYTHzm~5GBlI(kA8QJ&A&XWBA Gk-q_ZYO_)R diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$StartContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$StartContext.class deleted file mode 100644 index c698844d05345e2e5db935cb61171daa234c502a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3521 zcmb_eT~`}b6x}zW41oYPrBrFvRx0L$c95cC6R8!7M8k(A#Bb{m?t+0ZlTIdCbS?cM z{SQ9W7rOMpRbTy4F87^G(rFUf1bImAoyooX?z8tf=jNY(|NINU9Dddi61d|SHEHRU zhdZ*Smkp;P9lh+xvSSxzrD8k!M&Mz?`~CW+YdG$rZMpKu)zBv}WjnjNVYwwoug&RB z)pE^4sn=KEua>00Rv>(DeOVwGPvko8a2+Z2ymSst%P6hcJ2EZMx5#l20+A>NF(fds zE8V<(AT5FEcsAPu)M(DM|VzO;P<}`GI<~5J^-AFH_HCz-} zKSh`?!&P2gisE&=Auvj>0trA>C*$?NONOq(8Va%bmoYJk; zzD&2Zz2G^Lh$4v;v%gW+Op*(VU|W5p)Z4E6Mt{b%Om{&wiO!qaZOkSLg9u|LiW|5o z&|fwjuUfkX5EwSCntfneyI!>kMEyL=T08QH{V$$il0=9q9aR?sGbez1t(`78x)be8;t zpeP%`iU+Gk*>AxE^2qcWhvK{##ggJ2Q7?VU{YJ4U%jEuPSNavqis{;vFVK9}xA$dH z_1)D>{&xHOg;{`lmEu!1k6$YGWC)D&Sq)~z$Jr#-$Qtm7*U z8@!HBuBm1M`W&OUk4@U;(OcXzOFOI(f%%tdrSjan%R7p%c~CZ6=5#kX=W-f87D*@2Vn$mts1ZRa#u=QP>MY3~)BrUIPa^El0r zztXZlsU0KUinkx2)ZbKl3e!HNv@esE)X1pKtWtnZ!z^W6Ln2;JK2VlGDjT$9>dI5- zzjIo5ebCd_ru$_N>}q{kQ*Vt4GwVg5;TDxw(ahlkA6D^H(S^dlH4#;!0S^O_g_@Cl zh>!f8n?zCx5KH}y`NtSeJ;QwR58MtxaSMAHS?A_b(`q2lSd&`}3rr;Tc5jC`&*|M) z9q?KE0Y^OGQMU)&!!mi-E8%m`;X^-?2}ZK=7$b~ig^_#_!jlxoHIC%h7l`N=?*BD# z;6yW`3FNWGFbdpJuR-*q1Xc-S}mF@$gN9mfeuHHq(8wh@eR{E4IB_yCdr0828I AEdT%j diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$UndefineContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorParser$UndefineContext.class deleted file mode 100644 index e5a4f0e734d41d63646f52d0dc808e0528a1757e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2244 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorVisitor.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/preprocessor/PreprocessorVisitor.class deleted file mode 100644 index c5748423f90a899a3a11f3768dfb520dcf796392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3065 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFLexer.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFLexer.class deleted file mode 100644 index 1539b412203b906c2d982450bc7e83eda0ea8446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10750 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$ArrayContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$ArrayContext.class deleted file mode 100644 index 0fe851bfd859e3335633548a6dd24fc9ded70104..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2294 zcmbVO*>V#{6g{mmNE(kffo--VgjEYLKrl-rL~LOvqGYqkqfzgc9GjiFV z!e5XVrNRRRulcA{Znp+8Xo*Z7q@Eu2J@=e*?``|A$n@gJy z8S>d&&6nFY_d-|NyEkmv@`)3}uM639JnpXfFGP`HtU{{^hO`9};|!^75w81h zgvW3xTdjTr)Kty!#9FJlCFDBaas@-C<~O*z!KI`2(aW*$l@l=7wUI*O-Vjx-ufj0B zMf~Od7Y8U2Nq)_Dx!npK*RDB1NaxdaXWQdpOA?c{z5}Jv`Ima~L{1mW#U$n!ZjTf& z1VGt+%))V;V3;DipR`;NVUsauvmGfe_qOed%Y&deK-}FdmFE8vC@KcuS@<45Fid{U zfT7e+U|1V;nmERvY-bLAs#LDZ!`0PA1=mZzbkO!JYog~ZT);)D=jYBOla46)eHAaL zw+C+h!zIUa!m<`T(#gR?SIljgFmTC24wo5>tlCp=Teylm%~HeP*# z&yJ@4)x735NWU8~pqucU2s2F7L*96^%6Fn$BPI46Jt&IdFBTRR!?b!C5j5+5OE$!c zqx_ldUa(hGlQ39SkBrdMB!VPX7)}p2qtn$C6c@xWKV+O4<^~rHKT zL?K^j788Y!Sjhi{TL~ykLzmuE z*^F11F`O7~ri+_F5hcRAt0UM9J(fo$xYwV+r3B4`B}iaNE3V)^ttWKTF5_2f=2Il7et720nKLu@`+vUq7QiY#(2ycj zr8N|;;eE0rhQ^*HJt6t`)G zc+^S79cwODm2Cc*gi~AGJo3|x{XHqTU;Er9bryLl(Ywdo4)xV=iE!utx)ZdAkIl|{ zdxQJGZo9U>rrI{S{m0WX%bgt3sOY$Y5+m$clBbXG+yI0*+a30IZMWO$uUrQIw7#rbfXb_erYZI27P&mSm-^;TTT9QMI&N5!- zsY>%h4t^i`>A@_2H9l4OmUzunPUX`F$b7;36m*y6;`vGPFC_W@ znCM?Xk)xarV!asfxXEY5L#q@Q4{-K4jh{wfw3tQ#=h;c6@gAp<;x*6i=MQk3C$u1cED1g4L2t)MqsxhO&DyMb7HXN<6ysx@X5z~E+@&NC&}{bh<_&b=lP8& zm`p*HORKD0_zLAOc^g(Gr})!vn5EwXh^5dh&PT%vu7*nD8fT_dy$&OSRsSfJQ<=|W z#IVlKMhK;1LN{tCm diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$BinaryExpressionContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$BinaryExpressionContext.class deleted file mode 100644 index c0e78dd8ee5919f2beb5f6d9981d845de48e4280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2702 zcmbVOU3VH)6y0}77$D>eYgsq|mGdgCWW7_=8mNCU}w_~*w-L%`5GI*$1 zebY8hx#9wA{WkaZGR*I4<$UecL8YqJ@{LN3A)C&WLeaLxxzga)DaCDdc;VptNnFPbhBsWy)*&FAjJ*d{yf?8C|1@$0bEHW${j&u-NPA)jX`nJ(lN=DBn zhIrj*nY!J#s3zsH4V#zSHlb5<+c}Z=$4PvG6>7zciBpkpk7phtZ!1l9Tx$I!4Ghen zkH#=vt-Mre0G7iH+yAcA(5j_Z)beVnt}-kYD*M%ZO%1ww4rGYr%Ve-5<|(>qn1;PA z<{^Bp#*3z9nh8X(mP8h-#L(3(ZrTj*Ou#T}n1jxVVYceFZd2Wop1GQN%+E+)Izt)9 ziIrQT*%%&7Aa|zTk=UU57ahS(Zsjsf8DBBnn(X`e)){QzQ4){wgnHZwI9duZd{-}E zrb(wx+tbCc7H;x{G{`72=;&l$?|SD;jGr0K{0ZIPB#{@ouZfrAvJ>@A-#X%ZhA?o> zKbh}~2_nlilbmt}miJ`rF|15>%WVRh*3l^bNquwD;e$_Uh$8gU0nF2C8d18+^z;S2 zWps~a7gCYei2X)u2}!z&9guRErFGKXgE>Nj)(cpqtH5t~_?c`<;IF+wYLsFtKr!P} z-1H@^dlYhZI!wV%051FR5AY%BTp|S$mK`PQv=W)f*%W(?k49DGC(sCEL?Sz+LZUk* z!j_yw*eFHOp}6jD^OO((w{V+C81DEf1ze4V<+K+N6Z3QW%*PKcnF@nH4Zw$%-1Xss z@NyXbSpYu_|9Kcb8iv`^*61$2i!4Nc^(oyUsRR^7 z{BnLt|I=J(ov1`_rB?sJ#xIy%eS?kcpZHpW5EpUA%@tR}qEvU-+%`-3;!?N<@bcXPNZ57qETAZ~J9emeia4!RJVX2~1vx(M diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$CodeContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$CodeContext.class deleted file mode 100644 index b3f839ddf8ece6117e5630f0f030f7719bd46c69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2118 zcmb7ETTc@~6#iyGwk^x8D&Fu4YA?WoAYNKQtzw!KP}}rxX>$4H+fCp zHk=A~=CLT8>_u*PW_x%`(^PmmgNG#$ASR zg_q3@+p-12SgvDK!QSE`C9k@M%gbE24AEFT_r$0fdet>8J!e*2c_D9>gyB{l&Ty~o zLORz~MZS^1my%i})LyAg#Q?+Xe*;9oFr;A^Bea&d8<1XM7?0I8ScWL+8Ox|tQXNzc ztL1g>6pVF?v_*6FhG7*A$CPLPWv~0#B+TjVDg(75c?+>@yn9TWGg8@64aabt zVensN4C!`Zl%!*E+ggGsF_V5-Sva^Fbx>+=Yonxm+mUQLwnRR!;Q}r)gc`^+FtP0ZF&O&NrZC+_8P_>+ zyGz-4F@hc>HN+4ngl)s|24mj<3F?kIgDIzClxQMm}fY*_tZ45_G1nU8m{1KBcbe38n{^Z&J1>Qyhv5B{QL}4 zoz2{XE*U~bY;3I<+x|#}_>Sp~tmL<-VM+4yUe@VF@^;nP;LD~oXR!G(oR%F$c4h^+ z;Egq}sJKHdxVIDa0yFdnNvHH!$BYjHXA1 ztlRxIAWdo7J&Q|zWS)?u-O=PP%)P=u@+amJ-*8!h9}pUCa*N^`t`lC$ qi(n(PO?OLhqdma~O7L-i2^8F88R5U+K=cX# diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$CommonErrorContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$CommonErrorContext.class deleted file mode 100644 index f846fa0c47bfe78d7ea2346e90a4461cde35292e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2676 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 Ln{Ax!9VGq&7KeYY diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$NumberContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$NumberContext.class deleted file mode 100644 index 6c563ff6503f37b81fc4c0ae515c0d1d96a5b001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1318 zcmbVLT~8BH5Ixhav|Sb`Rq+cI5Vc>hL`jT+@F0PNq%=w^@0W7LmF;f5yKU;9&_olB z|3Y6d`e5|cA7z}oT}X|f#g{vG?#`S!b7tqq&o5sAEMg&r1Yur@j`Zx{`L68PEujLb z*m+{t9<4u&yxD5Ixg*u8?}f4(rjR7u8z9FOYOUK+G6)>si<1dM)yJC;*0u=6e4*m2 zJzIF8tL)CAt=eAbG^HIXDebycO~(^%)!&s%gybq)6NHQf6T^h`o(${$zVry?{Km#9 zpvEeWCwm>$#f~cpxr*Nq?zT{l_T$H7_|ypq3zY#n?Nf)j4lO&L6Rr@J^MfQGC(}}4 z+k}C$7P2@;F!I_bOjx*pac;ihw_dC(zsa8(VV7|KzYDRVlEPT&=1xVKFj5Oe zV}Db$;z6fn*9mp|n&WK?dCk$(kB1b^n%`Cpx$bC*MvvBF{+Z|qg0TUkKRJ@B&+S?=FaSX+ciw{)D7NMAj!8g7~(U<-W`4=w&`LvYaAf`f$s@eeCh}o zFEPS*s~3Y&jIl@jGmZ19^H(@J!PYE(Latak!1<5t^&`BB5GHz2F#^ZqA}%oo;WDno zShW}{SNe|0_ZTUC!({O@t|g!`jfj=0ag5g(H{SH&=8kZ4n86Lkn~gF^)4chw0=NDw f@Rkd_8>~PAg{b2qN^En?&p;XT$Z+X0Y-D}`LHR{I diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$OperatorContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$OperatorContext.class deleted file mode 100644 index 7902a86f0dc9aed35eeca15ebdfe77df44b0215d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1645 zcmbVNTTc^F5dKa}*?vRwI35H~oifEg@AIh<=ENAQKw&Ab%AAHak zjXoHB^+y@!Y_}CH4dBb}%<0TG-+VJ?`}5bg?*LY@X&}O|sCZjQtNHFgw5;+!tMMEg=durR0zBu*`3^B}ls%~-VyUJ>>TB;>|=SWzcgjX$Bgs}_}`x!$% zn=74};42}licm+6nk6hpi&{EBxdB*R?Rwl4uSR&u1+Z5{0k zRpI-tU`Us|8h5K)Iob~ohx|8AlVQ1ZSt*EZs?m})zr}sWBYqpy=(!+!e=(IS$CtmgU(fH zpWToL!~EI84xmjGNR-;)bKVFyH!hByVCI^qWnxkDH1%P(FhjEJwNy>)I9jOD-nCxP zt3koGBt?Sd5KRMX4AX;E=?t7W#(mn&D1B*wVX|Vu(;#n|P8q%9`SFS9 zXT(2}9f29fA-04OvdvBmMlnVn!#F1Bsq@#u{8T=jru?fXNdF75atb2VgP@%ZA#8%s z)Qo&#>I-gtBD2FFNpHl~F&x_nAf`KEAp|903U>l#2JYe>MU!Abr<&P3dAhUcc=Q9!^F9%v*Xsi?H!l`Lh1mF;es-8LoBAL75z z7mPj_eDy~e?<`B*Kx=`Q&fMwTbMHC#bo%?xkDmbM@iK}C!<;Z`+}7QrJzmo*hH$x{ z;JsdWxBk|TCTQWdcfeiK%{jKm>s}Nc42x|OH>;K*UezmtyRPZjK{7+<*3R0_8wM?v z&O2gXH*C)mdTm}8RogSmT=xX$dXbB=X&ct2v&XXx9XVR#VCYg2M}i@?&%L5^$ZdwH z)W*g&pnCJB%{Qy%T`r2ouEiOWd8cGp+lDY@92|Cd2d2xgkZ()$vO?6b&oal*w@WO< z@jo3HR)~08(6tL`fqdC0ZZj<1G+inuzTZX-_=Pbi@ zv#oSJ^F}C}7~fhkZPQzo{MyrNZjNkvI}Qc+RE*$0gOZXl!$TEg7^Rt)oXYXKaLV*m z$*VIg-?$JNiCoQvq`)wn`i~QRu0`@>-gG@~b3t83@q}T#^%TypCNPPViZnEGf?qIX z7MkM~lnN!Bdmz0{T3A6h4Aa+Yo}s(o8KuM5MkR21jMq)y39{Q+70+b1z49!7$cZ9$!+yFx0~3WYXpaq2Fq#r$7%pB9AEa zr~$WV*Xe&oDSA$)jMkXeH>{i>_J#HlsKGrb6?D^HJ-dS*^io7~YL-9JEdQu!em|0g zBI_>%^%Gihfb#F0V&Gy6ZU`dLXki4S0mLdb93iN<_6>Kn%n2TRr6^3I>LU!E-3k!s zK8Z3;7z~dw5nvSptYqdFCO@M)bBamrJDx@$F%@5!xWrNF=vR(IxXA`?5*bVp-n5^= u`e{4Uu7G~Iz(*?Z>1qWcG)BpIj{dVix+oYRVHeRwy9F%KN{=*_(e)RqVYQ6_ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$PrimaryExpressionContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$PrimaryExpressionContext.class deleted file mode 100644 index 6204b112f1d73402edc2f80a4dce25a5f51271d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2165 zcmbtVT~pIQ6g}Gjp(XNBp?nAmh}aJxpdexqMFwU%Qy3KN1LI35D@HW1xELN8D2qGWsKKGy@} zi;~5|ScW#kvYhwNOq-|{Ezf0OTMUi+Mo~BnQ^{2RQX#7{HYCh4G%PtgTty4R_?4hB zFkI8niZ+JUUGANcIiJkGHOhu=8TPKeWErlT&8717B}tmv@}|w#O8eVfY#Q4ZXNc#W zqG1&bVajv(vcY>}k^|YxbFO8+ysIR=JShwD)#KvJv#4V~Rdh4VUTS1@G>NfGmLaYz zX6-EMM9htP#8gK!G|ii~=`ApfCF?C+E>(y@!7UB_7$63k1a5l_brVoenReOPGwt0C z&+w@7EJvMLH$JzODnzL>M>RB}i9riHGiUGcLk1<8BDyGP;zBko!(H%eX z;4AK&@U}`WC4nZT8!bwY&z}zBEBso8UkmxAk+Kfb^}9%hH;vOOtDv;2pUw&IJ(ago zaX*E02;Csj5yHeXzmfTfYndZt(myaBft0HFb&Safr5_#2fX|i)5EYqmOyM5!-S-i! ygSOL`T`+U;fCXsHXid=i6w!aKE)C)U diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$PunctuationContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$PunctuationContext.class deleted file mode 100644 index 422a1fc9b10ecdf327a130ad98ac7863c852f898..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1361 zcmbVMT~8B16g|_WT__8bs`ynE5V0S^YQ)3@V`3VKn^Zu$^wkVygr&@@aL?va`JvrgvBR!Z-l4FQnys!c(p-kZ z=62oPe&#wG>#sN57tgmCs^v=K)N&OHVY?zc^d$G!gI%%8Fj6O*2g8_!JjNMD_k?nT zj*txZ%8v6NP*V+0iuLZ{jtE`8;|qpjBWQEK#Y0c~X>dgCdlAE<#yPYh!nr4&^wd+$ z?(`{7h_vcdT6q|_V4;9%LZC$msTj@-z%b#-UeNL6UQ=;JlQDkY#m6nMc4D-Wv`I9=15^h{Hc!`Xph5ajFh^J1pqB|`>6Ar|z9xAOD9Xs1 z)tvDOqaWy)fkj`Pfb2dd=xik^n8Xx$q&cSPtIHiK*RW=_R{D(MM>;0ud9uhJAeZgL z5VJ{I3PA<9h)XH#3@%eP!xdajVVB5iRz|^k--k>X`2&oMKBH^6o|ZNVidv&s`+?Fs zOw_)kRQ-aR8EA4wJX=C8z;yN~Mw>}0`s9k3$8Ew}h%1;L_RhZ=ES_u-Q3G|h1{qZ1 QIjg9V)&C=U;8@1kZz{h*IsgCw diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$StartContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$StartContext.class deleted file mode 100644 index ea937833041ebf821bc18241fe3e878c1dd8360e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1598 zcmb7FT~pIg5Iwg=(v|>H6~9msEA|5jBB(QEd|_m!GZjDD>3b-b5*ltWNjv-%|AP1Vy~H)#&v-di>-TYsVG>!a#~r#7y_f~j&i~mI_~7eLw%)cjSP~w zZQ=%Q5`j}ARVZ+70D*Bwb-lKuS`;Cql%gVF#to~e9eG4O@&#U|i7b8HM?FU;GmOfL zXx1rG)d@nWq+c#H3_KK=JAHuux{e`-M<((p2xOv!QEvoR@)vAlp}}6bF#|5wg$Pp? z=54lL*@y8krR0$l4Y6iunON2g)A}+dn5lUkzbQ8zth?eU4m`9}i%Zr%Tb(ptZ(Z!S`4(n@WB`<`}6@G!vMJU4dOp z@@)3pa2ZpyxI(zXr-pbOLm0&b5w89pzBdqV^usxSad?H{nwe27&3whJ&ph_BXZQy8 zNwpn8%=X-32nJvVcOq5>?&2Q3sZvy^X0<>|7nVqV>?7*Z0e65uJVW{q+wyow diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$StatementContext.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser$StatementContext.class deleted file mode 100644 index 687d3634efc37e2cd8b5ba722778286d14657a64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1898 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParser.class deleted file mode 100644 index deb841cbfc03325492ac724a450534afe3a6cac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23896 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/tests/SQFParserTest.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/tests/SQFParserTest.class deleted file mode 100644 index 7dd72c739995e84291106f4257c417f51ba40349..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10736 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/tests/TestScripts/VariableDeclaration.sqf b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/tests/TestScripts/VariableDeclaration.sqf deleted file mode 100644 index 87237edd..00000000 --- a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/tests/TestScripts/VariableDeclaration.sqf +++ /dev/null @@ -1,39 +0,0 @@ -_myTestVar1 = 5; -_myTestVar2 = getPos player; - -params [ - ["_parameter1", nil, [0]], - ["_parameter2", nil, [[], 4]], - ["", nil, []], - ["_parameter4", nil, ["", objNull]] -]; - -{ - GlobalTestVar = "Hello World"; - - if (isNil "Miau") then { - _innerVariable = ["Hello", "There", "You", "Stranger"]; - - for "_forVar" from 0 to 12 step 3 do { - for[{_innerForVar = 0},{_innerForVar < 5},{_innerForVar = _innerForVar + 1}] do { - - }; - }; - }; -} count []; - -private ["_private1", "_private2"]; - -private _private3 = "Ola"; -// _commentVar = 5; } -/* - * CommentVar = "Mammamia"; - * ( - */ - -hint Implicit1; -[] call Implicit2; - -_ifVar = if(Implicit3) then {"One"} else {"Two"}; - -nil; \ No newline at end of file diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$1.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$1.class deleted file mode 100644 index 99e5283f324180b3e52f94535b4144d4deabaf63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcma)2O;5r=5PeGv)QTT`h!+nYIDiBi65|D9Fn|e3F&Yf_g>K54vemZqcj?K*gFnC@ zWt=uWkm!L;c4uey&3m)&`{(luz$H$L$T7479t&lKua1bV7jNTAHRX!CVl7l;jc1P| z5kI8mMz08+p|x`ZL*ZH~8Qn0{oAxu0x#e-?TC*sS%I!~Da|V6rJHmv9y%O>;8E*eW z+B<9Z6VfAFDsjJAFGTRf7oK3K*#44xa~{Yf&x(4qk|9H9clJiF&yaUTG#N3}nytT| zGEiZtrsH-~PrJgAkspwbIrBHcQryX8pz^k}-NYLjd#sk8ACfmy5v_cOp)^rS1VfL9 zp$G@(U}RLXa(w+zaCtIyr)~cbJqH6StOukMxGo!%(zq1FDN&o-= diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$2.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$2.class deleted file mode 100644 index 407d4fd7fe0871e5420a95c51f3c21fa3e8c8a9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcma)2!A` z=$?U*OYzFk&SHz=9NjLVCwb$%al+nVyd{hsI?aT6Of1r(I8O)|*u@?pbwnZ6XcES6 kTB-O-kU?A?Hvmr8O0~39!$HC-q`~m(b z{h=zX3#tCOqkHHl|vdP!_9xp z!NxONk?7t)Dsi`5OoaEyCyrn!4BRPq#@v%po)q<9E`5gj=IZ5Uiy>``px;uMo%-E*WjG1L(krw4SLcqWdb_r=B q_7jadVRWYz@^1twMD5W4;B2i`OIkG?#H=C?30LDw6q$((+V}-lw3d4S diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$4.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$4.class deleted file mode 100644 index 9c23a4a6d2994be202d244f6124319764366dbc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcma)2O;5r=5PeGv)QSp-c=6zY18ATgh!>2(045~GXfWIt*pxM8tNr?2dNT3g5Aa7B zr?m$XJ+R5{+nIgyX7+u3e|!Sy;<$($!@196p{(F#DPrr{jU1^aTyaONg$k|F^kFFC z`!wC?7NIk=wk}{OTuCLvYleE$e&R8=T&^5z8v0T>y>V;CpbxyIFri_mggi`!oBx>h z);)WP=z%SjxQo_v;Xm@ZD;TP_x8UxK`!b2Mq#mwhz|h`az0vJ4+h!w zR2jjh-YM1(7E$xs?ACH#TQgFpoR zQ!sKVSvlHy6eupz?Gk#LH_pya*gK53l(9>vnKIkNA}xwbgn)rP>=RN)lrxPsVe+O` iE3X7OB;`p1;9{dx%StsIrmPx{2!Gqx>1Jj!=;H@H5Rpd! diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$5.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$5.class deleted file mode 100644 index e38438a0cdd27377ea9babf217fa7653818ef740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 611 zcma)2O;5r=5PeIF)QTvGc=6zY14y73Au$+(0Zd4W(O|eQuqkWGR{Qn4^km|}AK;HN zPAdlzJ+R5{+nIgyX7+u3e|!SCz)21nhKA2$p{(F#A!6&w#jQ+cDQ=qDN^GHthidM60ogJZ;nG_$RvE{HzwIk@GuJZc;Rl4jka++A diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$6.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin$6.class deleted file mode 100644 index a9d81bd7d401210fb70901efc808b03cb5316d23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcma)2%TB^T6g@+E)QS%t;>Lvw79fFc3>%E1fC&j04Tk*ylQO1EwJn(VRk|{9;RpCp z#yhnO5?#=wJ#+7zd(Q3o`u_L?aEikW5)3t;uY|ILr6$Pc_JcgNh9x{jO4a4rLe`sV88W{V-^h_K&fC|0U} zf67Fjp%AUxh%#+F%NOp?$j2IaOMfb^rCunvo@_&BLu>cc)b#?&W+=kBH)F{5l@fl( zt&8u6%sLc}WKfbiG8L?7+0NJZ$0vYOlrl&N)O@)lWd<)3TAFirVLNIdm9%L_Dm1T#4_#W` z$L(@6gQP%p;{k#6xucx$LZDdbKg*>wU8!ty82XN~TfOQ?AldOIWI)4K7AY74m;W*Q z8+*1Q(Y?N-=x#9^lm95kE(zrOo+aIp^qr_)HIw1g2?Xk!tCyQCfs{>QuPacfRR8{z zj=VrAUbhiv+L-(FL_R5t*vlAt3*Vw^Ct51Eo^B(`hgZK+mg@za&w#?IHxbD8lp??5 z${?VieGI{2MNfj?6w+L0_;iM3+}BTPN8%m&Tg=$zuMsnEn8jLLXBhzWtByme0L1BoK{92EgswsJ0r_a1gT!IAr{_FY?J)$)JrNQ(BZ> diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ESQDevPlugin.class deleted file mode 100644 index cc95be04bb42f01e30bd1dcb1fa90c13c68336b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2833 zcmb7GTUQfT6#fpm%rFcXQ>7w!!D1nansTpl6Cu=;aFGFY(AExNh@;5_CzB|)wKso2 zU;Eg;^wlP78QQG6`rKdA{)yUsW=2gZ?J|qSY-Y~c-~P_Ne23rv`sF!*Av_V##1OHx zl5WNe_qX&?d?#DX80LazY8gGJn|3^*T$|NP%g$#3eulQYT1ks%H8T@Wn8h4}keE%b zF0CjGvD6zwjWPHalFAH2vvO_DMW9b>tH~5Y(^`^XuO~OAS7r&eWqBnrmsm+G&LsF- zVsUMuXMH-g#^27}Y$&EUp3WMkVNWvn`XcKTaVEc|3wVpjzcKfoeh~o)VYJJ58^;)e z;~r*vU+Q&s6x%Y)%vdtA-VBE0G6Dz+=xQj^fCxcCC)zp0X&C~CIMWcspa@Yyw+r#E z43R_hH3TsvqFF+(3vo_HGl#g)5X7(uNy2#-VnBw(A%+@)7!lDTVbFzmUq%auxYQ8D zs0dlYMHgaHhKwLj>}46PXk$2(GE9B3nA_B?Rc$k?GlWz5w3c1hEQ7y0A0_zEPK{&V zF$xTUjBY1q8IJTt{#|-%Zd$%lG`Bd`3EGmkGVy#NW5l;DEvG-oTleDb@|Z+CK9rHb zoP-n>1uQUh^X)oy>`p$+7i z@+QN{gPD2j4mE{Gy4r#@To*ud)A64tk+FGkCV$0B~ z*joDDg0|zdnt(P5HcA4D|2*+-!Pcqv5Acv$OtUO)H=W<1BSsI1ove%K(MggfQB>#r zOWVAmKb5hI&lra50cNsVp)gkG?kQS*r}Ha-PB2~X_fq&8Q0B-w&nk_Tq~wcMTAwrc z#2l`_d@k_B@$16Kn3`R*XnmrN8z(Z}K*UL6EhkM=x13|@h1qUm;G=s{yxhU18X!x0 z>sS&^$CC0nmgLK^q(P1)Apt_ixr`8kL?U|#A;LRMZ-2l~PvF}c!fN=4uZp7;bkxwP zhEMpbI9b7|8oJf+JAo>CDmYt1uNsa7tB6(*tKqyFjtf=1S3!RbgKBtKtYV~s(HbtQ z;js|y8?Rs@B>W1d`pW1~RDT(#6g5!BSw#(&5mQv5jDAHG%NSME5Ph0ZDwz6-I5lCK zo|D8D^vmzGRve>CtrN%T%IKk=UPRGP!aYRFJBbn6KaP1!VUeUt#Z{VsR$OtAI2v7t z-l_X3mpq$7G}cwc%b)`^D%pB=<1?l>T-} zyEr$T;4Y5n;?RClAkTlu^Owkf_@m=hakN|py~Dy;vPbPGuZFERp%V=oSP{x z8=mtIL^eQ_N6Go-JUu@74gvOb4_oRb|MN-T#E&@E;qMwq#h&2~E#IZ(*wZIXtn0-0 zFaBgaoX;uI8EPrOA~2h7ts=GAL!73Wjo}d$=OKpi*rC!+0Vy0z0a}R}c`%llDkUU^B zQF(dhC{f@glfo>zheyA`IYxcaUipPU9rL*tyO$#KNpU;o@xdL#gZc0UJ)7_)zH;o> e_=fBy8rCpbTn4qTYr8$$>)G?39rWx)*ZvKnKYeWg diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ResourceManager.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/ResourceManager.class deleted file mode 100644 index e650240fe2d7c152e824043acdff27fbbbb9376b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8986 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/SQDevPluginManager.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/SQDevPluginManager.class deleted file mode 100644 index d6a8a30b76afabee77fcbade4685599e98e04079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4174 zcmb7G>suUG9e&R)VPKhDN&#h|>P0N+eq>+^Qc%RR{h@3b~pvbZ{fx0rJZpSgs2iA_Yyz3ZA_vyf#XQr~tv`qJ~K)59~Dp1j5r(^_S)auxV?HYCo>|A!T zWIKYLsI7*;y*g^3t6`)1;yyyO^u?Si`PkT4`b_YjGW4#DfA= zCNsrwZ3>A3%z43D5&!&d|v*IlIJD0-ML1RXw~ zo3OKHa)>aiIR_d=(2L_59$!)E{yQCCRX{baJz$@ePLGjiPWR#o9sMeLmGVr%$mW%3 zgF1%rBs)XK$Pan?unri=p!$6CwPnE$j5Di}1;=6g@k^KWL)HRa<%v-Y=4NxO3ar2y zuQ7Fay-tz-nvQX_lTqF^95+8^x|s;Rj&ExChQQwPkR@$L#+`!YnmHLiku}^&+sUaw zJ;M&VF0VU>OQqkpbr_gn;^fU|83YQ`r=pnBA+cRxi$_S+SX#$0Ml_fL`^wv@JeQQy zu4!9&zeo2L#~Mzvb9kBRWuY(B(Sn&xNv8@qMtmeAqn-hoiuy$rZH{0Hw(2s|>r~CC zTH)x(gQ2K2rl+Nq5@^4p@9S7kRAGj4HAk5cQOkCtj!dhD?~sRUM_tldyWi|pcF*ZJ zud=SnwS9jg$iR-^0-o3KonjmH{4EKg*k@IXO~ghuye!bXZta!8DBMI)(M=oFGi!g^kuyCu^G!hX@t-*o z>{Bb9x~wYzF~hb^%@2J3Iw5&R0j(eUe4L0hw1^_HcMj^E;4 zHXcXj?d%M-J5nCGQtK!uupu5h?Ay4e<2}4j)Sz?(I$Ac~K+7pn9)241HMNJ88(-gh zbyz7_#Rw~bKhkmCYqXBc*)vix`;(482h42NCCl<2s_!??;D3TOoE3em}ktP=1V%>SgtTPf*`FhnDLcggl%|k4LZfeZ9XZ;G|f! zk~K@8Q0)QKHLg(}bt5VxqNbV5t;EtOpVuO=V5W?Ol^UeIh>uxv!4yM&*8a6yfEHAkMDgZW=XCe zCNAO!++{9$cYmA-#+g8{A(kGvIoDy5E~Y71hJr~7mgUJRhvTq`bcQmzJX6dd#SLo; z&+&HwFY$U2&*K&DNI$}hcndFkA|LjGaJeM%tSo#cRX~ zdm%_*%i0hu@nBNn2SvjX=K2zoJzSbl(Yo+o!U+5rKM8W{uR(70Q|H%}sFbedD)iv- ztua0{E#Mad%(^|rtb2Q~jqCihyNzEi;CCSuqxT^~z}x^{r`m6@5Z`1HT|%52 zMK|wHuz#qc^i!_Cq(*;G0CAS_2ly~ZxjKX!mRP{Pd!2sHHPMIPmpmy}NmoGq51XX^ z$2(H5X9ffBvL4?f#rN?L?+MabrrcGc+!aucuAuByN&Q;Jv$zpx{|uc|Euv9r+`539 zAza0_VDNDWW6MhVt>*@Vcati9;?eM1M`MXbBj-OPbkL3(_;{;i>sVk*1ykY|mr&c~4H#B!nPspXQwR z{l1^~`~7^cx$y3*=KyTRMFmv?t(G>So1xVBkUkMg#?vvw+@YCTOdr!tJ2aqMDI?*o zSPHxX%a3RiS}3lWvCz)LNA##IP#ZT=wr*0E+r7?y+BV{$UM@$t-EYK9%}!goK%``Q zOK;)*hH2~8uol%*p>FqTi6NmQTZyEMIjUI#ZAIsvAIq^qimc?Brtao}S_oXD!iQ>sWxa-}_oc@U>((Ca zaGcf!dJ|DCKA>5Ke0LYU_J~1Z{4w3mGE4PCP0d$jfV}p7Dr({P^J$sDl73r@j_%Ns zxtq12p%TUf);AShQifjX?k%?jQxuym0K$$^Snuuh;RnlNq6FlkCdQ`UpX#Cb1P{=cuOBkOz0)%NcfP7TP1vTR)RD{NA&2ZE1B|R6K+?q znU)tu)g{rfTTdm@R#bQ0p<)%<1#Z2PPfCtOYH){uI+0D0)CPN!;j#%~6%lM9wmuy!wzq9}T?fS$nC)ZVU<3l8LLW`$$x^_cT^MRtExrDsJ(-8%|0;>{MER;ya zjL@*9jp;`d)@ZJ9_|bztnLj&uM^kq6MkPbW5eZ<^ctR0@p4Uz^pUwNgMGY-IDG)pyI=LkdATq+&Nt0 z@od2?=W##w;h-eyP)T~_g2dtNu!<;Xu8*M*OE!y{>T{}{{MWM^)*1}Evny;j1EHKv@cM#F5h+zJwIEKdL9I4CvwxQb8UlQKWe zA$?MYK~c%f`LtWgKB3}M_%yp@Dt$QRR0MVyrb=1QZo_A!_-7?xd5Io;UdG@TWIel- zzAI!{7rvz8%Xo^KOAF%@>}hwEg?Y~fhT+(Qud4VOrf6d{F_zRUeGh}<#-@t7Ms7CY zX%%0`GtBpNa!9lFTsbWtE@iA`!hWNq8kV}dBVp+U&VG)4wj+^_51H%i#_X**7dOgo zw#JWV@okx?-w|jjLrsAedq%9pQ8@@iWaW51H(?lwQ1{OKl?uKmaC0G@r5ff%S)D7F z<{Uq6Uy}oqY}!ue2^1*i#$Q1l%}Ld};e4N#%GXx0U*e=K%fV@_tU^(D5U6v{$w`S7 z#bDMhN!g@4H>?P(t`r8WVA)#E94A0Sff0FH*o4lq<6m9dnx{9)lotg*%el!JZt|DN z>EpbLpW_!SWCo{HjaJA+b<@Q>>F~$pnqQbaUMd@fvn~HcfAYPNqG6Q@+GW(154&124``@%UI3#7rE}i zB4#U>F&G!~R)3B$u=d^nk&C&VB}?0h2EoB>PTPi-zh3 z<++73GkAKvTuv3-anij*9y=QL1$}{sGk9cLI_&sh;KVFGc0TCyWS386@OZd3=n9?k z9?Ia!Ieaec57y4%i{ZMU|8>*^>l|A4G!B$8Zpj;1HgI#@-sm^U(1F4C9CVd=UoDV-#=W z2;M;)7h&R`Na9}@$G`dcAK3UWr#1zX!p}){C8w<*j*CW|5bd0k4)W9B+>^xPB8?}+ z2|Ve<*~8fga^uV^9%C+lpK)6!j`Hpo7?n$fO$}b4J@sN7Kf;e`%Wc?-pHL?sbxq?m zcYV~Z2QTrdmipa+mvM#(e36o`P_B+TG-prnb`=@S@`Oy2i&(b6@1?a0sQM-a+xW+Z z!k0PVf4Fync)sFIERex62VMnt)|Bi>ID&ESU2JsVdlYolE?{+upmQh1suox}F1>M8 zIdQ7Ev7C6ff}buSb^Jm^DrKQLL(pn|w#(!{i*o{D-wYaqzO(qHVC#A_>L8{DyQtHp|Mbw+ofD#&@z*Tr54VHmybxQ<+9NMv(W22I^gK~KS8NQPVn5-?39 zG0srPmY?xGZgsfZvMSPd+*a{CJ9Wi%&s)CNcbl=zdgZoi))z4XDan7wYMo1N zU=t73P;F7GvZYd;#!3Z#Wa2Tti~>jPSLj!oxZQXrY)NxLPSfMQaH-1+=lI?zl`2^SP9 z!s0bd(i?drULW%OMQo$A*IpXnjh~QYFOG1zc4IPyL%g+hgxQ*wIK*5*%V^p!xE4OI z=QG*>xg+Fj`N`DgA*@0&lUyF)-AwXV-1-d#D#iex4RAk`Ji=y8*EP~t9$-8Ff?_40 zG_H^;V4C93AdNX(q+GA!8m?mj%Va7mw7P>u+(Qmk@{6Z57Alw3NbfKgQjQ9C!u;BJ nLdX$fs$iG)62!NGuTX7 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/styles/SQDevStyle.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/styles/SQDevStyle.class deleted file mode 100644 index 5f69fbe9b3a3394652eaa6368bd6492439e85c93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3652 zcma)9-BTP{760`xWMI+(0wmcayPHWuRv13Un8c5O5tbw-y8~ncVFZI~GjoAvXSyfd zJ!EnH{@7i=bys&y)P3>6mpnvWAZw~zt+G<3PrhiCrDc`>ho%0`?Pi$3=!T(s?!A4_ zIlptx@02?N+4$73C~(lPR74cP%9ZfSS>0)Gx^+kwK6H|1mXtTmaP>l zQ?#7L%*6b%$_ECLlT$O<3(t>@Tz%GnF=}AXsO$KFG3#!cz&HFmS~67Bh-ImVK4UyPnE;6(_JuDl_6U zCV`3fp_{(g{*+fC-u>OPJCXFvCh26_L@)Yycfs{a7SsP!9XEP*N=twSOzc66tln>; zHC%nbL|eEzZDKFlcjJTjZ~`AP(6SYI3A%}o;4D*>cb&kp9pAvdTFW6D2YY4{7&6dP zOB(fJUX=rzqzu_S$^cy0JZl1zeqw4#rTnt87i?8X1=ga^kgAkb^psUtm8e#Hbu@`V z3`^Qaw%Lxz)-x^OM@^g;pbb``Kq3W8HlZGQ4;Hg%CIc(~!kAUo>`379L$wxKNPrb~ zY^wq<7mI4qDvm_iukmTjz!~vLmCC_tiXrm@uaXa3FXb*o3|S3|DpjiZLCSH1)VvZG z3-s|B3>!!+s$g6fRcCjdWU^#=VIrz5S&v4=wbxOq;7>eMVJs=BG26dJ3zwb$5j@SV zPndWPSCY7dS;_Y&N$}bvk1ko>q`Fa2PF^w9!pAuiS8;`ig%>OVk^Qs@OU~kK0wp=f znIL}~^_#Z410ig!(c z8{QW{pE2>00BWLA4Mz??Cmwx%TZwKK$_^V^`4m)OhdxxR^lU>D` zrz9aSo0t%It$7wtplUkpY{7X?q;rz`OiGzm@35yGe*}~CozV4UyvlLNu6cr` zvfaTv3(PHLwyq5};WYz&0&wf_y?{xD>Dz22?VANzJ3&wFIDC}3xr?P_6@8(~k4(Iw zyOuk@{O}}=_`*VwfXcXcD_&k*v}LfhZl!-fsE?yegiQQhIEY3*Sx(%=(1fH6NA7p) zy~#7q0=?!W(BGT``kPaL-z}8sKqn>kao5ZH^0WIs_RnnKv0vfvFSw222|mRP@FYKS z0`3msNGNE;2&a)}bLkDFdLN**?*VrAKR_b>bHp3kkKV)aT)J-qJ!9#9KF8C&Yv@n+ zts#@{U&G1tzW5qW{St@M@8C=fx3K3v24~tox`B_q8=gKLLr$PHXeej359blb1>(Ml z1N=VB_#VY&wwq_shb&HFjB{cfL%6~>SNXYy>&R*Nr$exmx=5Xbt)nFF&B?^n?#;=> z)KQ+3iAh@@=lg?b_z%O?n1GSMrSO+>!^RMW_@_z~$RP@fx)zDYeLOSMp54IsyF3YF znbam`sr0%AWQMmRK!((Iq$$I1(bSlJ8~t~y3c_UMYlIuC!tCvJgfrWPm+K0%&DRk= zxn1~1U14^HI>M*!Y=iw$UEyn(j)ZfJjxg*{Z+acMb*0GY^e7_pK@4bi5@^xF+I=-OaOTa>ePwL`)jgCkG8Czb2rSLX=Sz|f8qgAFtu`22gd>h}PQmWFCk8MVN zFAu+q??v{;BkYmAM&quo_V0_uYScn|zo)$iY-xX}aiJr!C*{bjHuLrC3~emxc|X*h ztV_cH;%pz=H8ZV$KR30KghX%)&y*z8n6Mjy4$qhf)vSckqE@8X2hERg=1_n L{QQImG5qwuIx8X8 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/syntax/Syntax.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/syntax/Syntax.class deleted file mode 100644 index b45b7139992daeee5fcf31e8674fe95337fd0e93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5941 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 diff --git a/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/activator/Activator.class b/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/activator/Activator.class deleted file mode 100644 index 896032f5f2aba84cf541b5239e9533df947bf216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1303 zcma)5YflqF6g^W4rDb^)K@oXBEUk2SsThn24>e6HfmHZvmSwswZg=bKY~^S9NQC&o zAK;HN-q|gs5*7Eu%+8&A&pG!oKYo7u4qzQmQb;gNO0yw69=tyh4Q^V>X_(5FeCzTr zg(Sm*FKsR?*Qp1BhYqj1q3w8l>o`!7Vh&6Dk%1w-Up{*e!qt8uaQoVHohE5VD6~lb4tn>8)+u>Dd z*2D*2zT?}Wcj5|?uf&TEU0PaSg0smGoBpP+H=JqsObS^=^uK7^qz|oAlZe7)2+#=#+|1-82U@3H0Ad zHkwsh`{=}JXWE)SNB^hDb&ysa2y)8OYQzp0io%&5ErK7RnnlU2~QBXj~oFr-JQP^u@*;Ob1q#cDiGZg zDdt49{7<4Z`79HiF2@}0`b&Ps*hktEBoXNBYl$eBgPatYqLjdpr_O2d#pP=;NyxGQse^g%2>na48b1>s=?Tbh&RZjGhHwNo&kn zxP{xq5cu%da%r z8w|5&{BjzyOdI{LHTs)`e)^ei(_}&VV!K}56X6q1RVJ_tL796c9!h=h2;*vBQX!Ul zi1}ZpNRGiEOsKs>hQ%K9^Ln35FGe)9+)i_7BJ=@AN^#vF4A*;{_cef4^oTiBksihK zx{HD+Dqj9+i`Uv%82Fyy@@Y=dh$^;QV1pWrIQMSYoQ%^&ZGvg)`xs4S(9ZN+q}8BH zj?NcIdYEk?@hi;2TV!s>9a@#gzv~J0XG$ykoZvTG9YQTBdNPEM*$4rq33I8^^7Zhv zE6u*>=8~|O7MaL9!YGF)$(kLgl5m(_RcAYdAglUh36GoU-#zYJ%(V6b+#q;I37g`H zQ-0xW~a=*BI`H;7qLPE5swKPdC%2JjA?i05E=VJ+L z|FASzWqm%MDPB<@o*O))8AdUCVn4P172y{SJVb2kRkDF=97p2iuQO~W(#J?k?E^>BP-LcyzZuLZgA55hU-e(+bys=-)ma3 zQx?oglTt^ZYIHOs5YG=3ZCB>jukK&FKU1768MZ;!1ZsP)8dFBP?3#u2io8Q0{G@4_ z?rHj!=-tw@p26aTv^tVQ0>Ml%CnMM;AR42nLXD0n_6S@^_*M#rHJ3e5~xiACfNxJGtj&}ONy0uqXWI~|vWH6X8*rKO~?jWiS3A+6lX zmfh0H8YQXtU}RZMBri*8#~67s;q+NueZ7>72n6JHmiOAgFTvb01`PX7&(rfp$xEY# zlL9qf-L0w!4NnLh*+vZr^lcKKjX<}R;>-vOY7N|Of&R}`zh_`?CCWw1HLbFA6x{{( zuF6EGbS2}T6L{>iI?i&g2C{}_NxLICvI9>eqv4Fe@vTF+{;ZBpbg>VPOSf0Cczy2- zC6er|s#KrR5kgo)54qq=p4Fit9L0I`X}GYIQ?HkLt;NyNkLTD+$w#BWy44b+nbAyg zB#HrC(lEGm#HYcu>V&E!WOd}g)CO5U z%q7dRN1YqjaYdce^JkU|t6TM#t2!o7pf#sbv@1Ml|DSm<%Im?Sf~BLV`b4;FDL<44 z*L2t_cY3~SrTo=`tE0T$HP*aF@QPdlCqAQ+)>DcFA1m7CxM>-M)t7WATP$15h@cnM z%B@Ugo~6uW$SmIXB$PmOpjfuEvfES_!NJYj=W*3Q2&YFmnJE~KBgwEM+qmJ_N0}IY zX{ka$QJQZ7MPzT}ZNxFe9c=r2>YQETT7YAHDz-DWv$>`*co(}<%>r}!j~9mjq=jsuj{`iF54k8nmcXuub!TAA2WF>#ycG_KX9j@`ulr-jt6DZ#hZY>82CAo9$2@oH zJSS8X>X60>1iiN}qm>%>@behI(uMIAN)JFR(gZ7CXlVET9~bmq^WqrAsS1SO)3b=u zvL1p~uWbRLpT-8M{}Rm(5yE8;!bM-zLqkxoItV7b3`X<79Q46xYr(8S^JE3hpNU2> zVFQ{-ePjzX2GK~O$x`Qy46}0ALrDgd*L1~stG@J_i#Db9-PO=@erra&mqU*8?)%5=`ntb z3stp;=aKSO&&9*7Rc&*uv1WCgGYgg@EGdO?Phn|U+nL}kzB{vc!n2-SV}1Wd>!IMS)yDrm6BNGj;r38q zZt+p2cow^Yw|oa?f{XFsn~VRhx<&H%rFw@Y2litPC06`3GQvh995i7H3AilIGP83X z8BDW)U*_%gEpq6)yfAL?ZulN|yh_OopFhA)@I%bvM|g+hJjZwOWBi8l5AaibgxBx~ zypF%%XZRa_j(^}6_$PONf;Vs9J~yQSP6n*H!fQ6Z-iwTge3Nf17V1kzt$h z-so=|zC&4Hk4xWTgl#_9VU)s-6K=T$`i3rzi-IRF3v diff --git a/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor$1.class b/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor$1.class deleted file mode 100644 index ce854590d04676304c93267b0dc9f66e2fd175ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2618 zcma)8Yf~Cm7=DhBEaIk88ntQDY7A+)s2kJtioFmt>le@Q6^uq6l2LmelFi0T_w;LnH^rsAy&sWPiZe{eG zj7Bge@_H$&TZTM0F1<2O3}Y>(b@M$mNkQui>83Du%c5#iii7PIFnFjY7#6}E0@ElK znYW_FZF^2o280!lbfHZL2|3Pu=)PDlSv)hHFX<-;gLAhA;smNQbR*UreOAHx{v z!wr0>-~)#1=cptVVMG{|B6sHXGKKDPIMVK;6dY4AhH5Wosm~GhlIo-W{6xXW43Tz|&j_K4Pw^Q;Z;lrYGo#zv41*mEN=CANe1Rzi zvgc0rXVo!E+A=*TA%e1kg*rcc37vnvwE zT{>-=g3@mYQ^gGKQnZuz<`Fd!|+L$n_R~VRU~nrTBxF1Hg9TY zc-)E+P1a7vQayLp(~;Ou@kptd!#w4WqMp@DRZg8b^t$xi)J$8JzMC>^$Bo~jiia{D zzQv_PIso4f(*meld4_T21?eGo5c!+k-M$J@Z!eeBC(kRgDC{PlC+(z3BfuymUcXfF19X{6 zLTQIUB)^@p^gOk+CmhL2op}`nN#QLBlVEoPn+l3lB4_qo9f?#J*rH4=JXlX>rZdZF zhS4tZX}}j@O1Tbp46!ccr;(9Bf=s^MQcvgepBns<>-L;pX+XX|?GDcRi0p4p_X!EB z6sm-oFA1B5+8lQ_ML_`#;BZUiyL=+3sNor9uprX(QNb|LskF{Oueh9BYSJ{hHB-`U zo7)(nndhNT6;B`_hanIM%2DX9GzjTU5B>X~65S=*&C~e;t%K3n9^QzK?;#Mq;@v|q zI(C4|&t3Wq|!#d~ zkG@3U2qA`jM1vFb*vC!p5kB%jzLEb!d`?U71-{-#VjmCchlTp#5KAjDqF?R7&+yHS z?c+)82=w*z0{j=!8bSsuSR<{{=BVrM9^D>5!y%?{L^yRoknxJ>e#0t$#}oXC9R6~B z8mU`*?9&FeQ6j0UV=Iec4+4(CPpj${s$yc B_OAc{ diff --git a/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor.class b/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor.class deleted file mode 100644 index 59742dd9738cdc90c300981fb62422d9eb3b2ab3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14460 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 G-~R#CquA{L diff --git a/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/exceptions/IllegalBlankException.class b/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/exceptions/IllegalBlankException.class deleted file mode 100644 index 1dc8071be44ab9c6626dd51f4017b439efdf83e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1101 zcmb7?(QXn!7=_PJV08-?+HR#NN?WTG8uzAmHKehv2185?$OSQt(`BS3`{oktuq1;7OmV zPtm6-zFJ}s*q-Z~4aX6E?!0ukdwzVqtRcxzyT!QP^3B$}BQZJ-nG*v;&KJ_=PDe&Ch(qO}dD_*$SlX z_V;%>Dw3fhtuSa8!uNSUjPi$+p)d_-pGogh<%}6c#V9bOEI#y!U`#c;(K1x0A#sYi z(kR+vg)K4c{;RFqjf|VhSZ2rzSEXzX2Lnl`qo<>H>(XUkN;?R50&bnRCATQF-tvah z60dCa9L2eR&U1A!*Z{pN{f?wU3Tc`(suH+E6=ASQV}@2tniKNJYp=60hWdQCX zM`I=uAdh9LlzD|lWv&x2L36rV8)Nmxt%s`_YLyKMYmq7@DEb=i6GO2I^H}S%tQ@iO ze_=hq!oJ))*us-AfsSqZN>ZPv#82SaZ>HwlYXATM diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/bundles/rptViewerFindDialog.properties b/plugin/Raven.SQDev.UI/bin/raven/sqdev/bundles/rptViewerFindDialog.properties deleted file mode 100644 index c42ec959..00000000 --- a/plugin/Raven.SQDev.UI/bin/raven/sqdev/bundles/rptViewerFindDialog.properties +++ /dev/null @@ -1,4 +0,0 @@ -find_replace_action_label=&Find/Replace... -find_replace_action_tooltip=Find/Replace -find_replace_action_image= -find_replace_action_description=Find/Replace \ No newline at end of file diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/Activator.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/Activator.class deleted file mode 100644 index 5035719cd7c09999ec2a2419e81d1520235b16b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmaiyT~8B16o%hvw=G?lqF|AaqJp-TnshJp4q}2Jrb$CcfZm$vc34N3-8ws4`B{Ek zka*z_@JAWW*%C-hz`dB6^Rdr)-`V~1_t$R#uhFWYAh2ZQM8$skWuzv4rv073>WQ?8 zslX9vB_{M$5b1HMxH^uqP{;nxFttVo_M~^1Cj_d8{gd~-gActuf%*O?Igx%OQA?ahIJvzv^R ziz4oO@GvVd*VnN+$j*k!9Lr&(SWptkXdsQ|_$ukxk2)17ktkyYn(aP&P0~>Nr$(Ns zuZj8Wzs=%Nq)56|=XQ(7x$n*cHMW}ERIntlaO3s5!fIALJVd<;frbYc_XH}z6eFmHt=#MpnzqR zP^PGoM>C|8l+xLu9Ni_YHHu!*E@&@xE-?2!Z+$?kO8}5b2X)NT$(uG|Ax8+dPaTU? zVceq}wNDv-%k8|pz;fp&R&RK&I1UPhga!jCpDnEoNlch&9y+tg8?%ipsgex& zM|sXn<7C>I_PxKOzoXN$!labWP&6a$?$zCU&$;*P{_)o@zX6y<)53s2C6WiqcjBK~ z>cHu0#|=6i>9=BMHBvHB54~<%`!%YP>Q-AZQ`0!mdvHPfI$08^m(QQ% zf1*zA3S?J z+m(?v>%K8-sv%H4H_XyB`B@!P(kG$7&GLU>pRD@2=|F9AH-``Lk%j95`5)zhbR@g8 zrsC&G5Zbtbj|FlpVBaEewLDor?N`g8h)*qiA~5=|#wFTwp73L10wsYl2Kq-DPj$E) zZ)n3me;iZ?j~ml zmJTRIYU|2zz|HOT7p@8u9r!lBFzp!$Bkd>6M7qy+BIzm%vjR6xGV18qb()XX)PWKA zUhv`q?y*H1k~msLnG{{4f9%LTG5KQ)Y&@RfxJM0lp=Z7dsZR!hfW5VP2V@5DKzAuyn(+0l2U zJW((TEo&H=6L)5P=s27fv?0S(*A~7#?m^0NXFm!Kk4{0Z8FV989Z6#J^i48l`oq$ntW-lK`$5aXwm|tLhO@3C8;?ve3PvU?-S%S@1`(y?E8ZRUrthn0)su0oVhWna zl{el%K5x!5kT00iY%F|-kmLW0oGo%~{6;FbUc;_bU*l5c4f3y2$1D8i(hWRCRNz&v zZEmDHMlr@w;C+115A`RqOa-jG#kIE>@8Po^DlakBsP-`RD`vhg+^xRB+}7<(5A&6u zajA#Jml&JR_UG5KzxQXa(wsK4IE+`q6u%i5G)uIZYdnLyBr!`g_mIaNk=-Ybd0gi> zjvDtYa@PXxaGc|=d5+6?kTR$cCsFnpnAr+e$sy0bYglLQaq`%}*Ua(_J#A#SEjT|| c*t|GM+jq1LppFK|EVl3vk2y01HI?D>Hv;sbJpcdz diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/commands/CreatePluginInfo.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/commands/CreatePluginInfo.class deleted file mode 100644 index 167a730a9b29c6d46af9550067623e98748f4cfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2204 zcma)7ZC4vb6n=&T0%_V}vbzv zCFzlKJjbv875{_BJDbo3G)T_L&dc8W%)NJ>`|O{8|Mok8B~&9AU`Y7Jgpn8qF~o4aXuD#oS+59xmscFY5HETbcS_v1^}4$mRtL6Z zNEI&|XqF)&j)m1!1i6wZ_78b2u(CaOjY^=h$>MW<$W4d4HS+so!w<%gD4}IV7T3DE{~LX zWLIlKNpt5wI8GGr;C2MJ7$*DKt=h8T@E0-M!6YR~zWJu_2eHf~l4qjnh3~p$^$Alk zOk;-O8aY3-lzk|I!x^S700>OTeH`y<8r)@=K6^vGr*({zr3ey)dOj5j-)k!Kk#ARv z!8D3FjA-a|4D(oE7?DDCUNOw{Kc-`nO_qjXGE8)cZ!`kt8#YnjuX9ZR4ZRq{`}lwu zM$o(Bn6B6+ySOgnPOOA2ZDLk1p@k8=kb4$QE>j_Zj}! zrH(L;Y{xOIph*pG{A@RjecKVVtqu(7)rBDybt3nxy(t*HLNzm}aK0g5NG0m?hB^?& z&eK(Kc$zY~1)F};btxO8+waDq@FkVO;B+{#OpmsjlZNBfg0nNxg6f1-5r)g_qH0VB zz^_FlLvc=LqB`}(2tH-FbN*IOiJWUHrAxkyd&77@YSFzG9h~kY{e~d&)H|0IhS|j^ za#+(PUuP&LF0Uwk`{9(KI+~3b3izC1lvk^pUQ>#qO$Bzf6ejuDofFag<{CQY%!r z!L1+lMmdJPU_%$0L`rH=p|Jj^3=CJQLR!8Z$mK=$0sl!{hbqA>GZ=lLJ3P=ryhEh5 z#5$3jk~#l%%4q3kh!tEac;4Ys3W+I_-w>4w^rSQ}M9&DVOd53w2UBef|4NeqswRTh zz!9K_WUwwOYV^WblAyo76sA$m44ozr#8z*uXxKUKcFY3BQ}2d2n10-BZo}$kH{HDn^r!S+ zv|qHgGoAJeANre|PM^CQ6B5B`XJ_u-d(Yc*&VA1L`=8(b0I-O!4GaksLc1+}EBc`( z+g8i9oS@OL{aR#g?*;o?b{NU0p_J>q@?>ZrC6Euox+NXYZAOynpUlVO))EjRE>EQKoO%g^k#ZF#m|x1Lm=Nk`FDx^&>k zrlL}0Aj7)-7k6(=(s&=^1}+L@kD9UETb`}H55mT`8zwGcLcpv`wHt)btI~J&1g_-r zeZXn5(G?fZ;xeWTOup^6r)1&^rUfSGchymDTXxNNUB4FW3(USNMxw+>*YJUX8G)+< z8T2A0swQS}U0}2uZ_BRp0cPG6M5{2whsYVY$)ryVp%qQ!F-Pij1C(m63POSDV?rb{ z@>mrO6qxH#2FchkvL4ux>u72w+G)&V!Gwj6lIQ4lfxyj92-{a)Xtfuuu;nYaAuYuw zvAT*y?c!q-cd#gMfk0!)H!V+A?1m(hGxQUatfgGfD!Y+}_X$%t3Xg9ci**C;xN={H zY23v<-8%OL?&JnN#6&qBnRZdk?`Zp?iDi7oUJRPj7r4|xa$rUKE(!nmk!yQFos1ur zx*G)M`Uu$H@B^L0hG+MaV**osR+_d)o`Q8v^pZP)8-1O9!n+VtO4nJdYla-3YVQ#Q z&V;>^pC2q2!M5Y73S8?8|90IOdAxrv{n&gno30P|T~5yN^w?G*Yg$~P{phx`o#&f& zGahLMDgu`WY2K?4=goG|3LUxT>YQ&2ILp;c6!;(IN$~a@ot)=B#nXk@&1>$pyUMQ^dxfmPD_qsf4S~(VA?_9a z!u(ITUHB98m0K@xYbnL`_R?@Rb%@FA@FB*3$KCI;Jio-JOC#Bl7g*XAKgTgNo`o1m zh6u)x;Wvhhn8r9~$OPLw%QPl&A5&Q46f1KEY251xq7H6i!wNnp;xQEQ1y-5EENvg) yAq$h|{t-&d!lH*Ye9026u?p+h;QE-}bQKcWSCo}`a~k3`$_6$mdBXD$w*Cb)yZJK! diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/perspectives/SQDevPerspective.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/perspectives/SQDevPerspective.class deleted file mode 100644 index 79217b023c5a6805d0ba465343e75de4e75f6ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1537 zcmb7EYg5xe6g^uCi4X)r5k%fETUrwpd=_~K)Ilqvb#NR%rRh?FrKy{=9n?SNCkH?H z104NJj(5{AMG7-Io#rHW@4b8OxqJ7=?{D7$EaHiR2t!I(HC{Ho4+UN`tBzUW!mDuG zcWT@-b1ye|ZKr8b5M}5+uxgfBvdTsCMgD+X6?8C6xuR%tyW~_nF7s@i3d>lw?}{Ua zjwPq;_{$7!@x(4eblolRPPCy*g94SIC+n2?cJ(mN#cL~H;tYD$wXM>wB^>!38l(Qc z<1rZ7|KXly=(h#8e7;2-9IKSIj@+uxFdomgaJP!Qv7Aoqs_18!BNrnq&!{>^&Ea*= zc*Q-pDr~-O)tsV5HAa`SKYw-M3WgL6G7MjwSi@BeGjtcZzgci7bd9(%#Nvr;Q{S8~ zoN_TO6OL#Y#TbKP6$-nwIYT1e>baF^waE%57={9|jG)m*zUupKIpdZJTtrt^0lCGr zh8fH?xo@;!{kL?MZrC<;dYy0=Co#Y=c6SG9x1rD&FdMb#NPxKDcz!m zJCaz8xKtYOU}ur=ahW_lky9$-AF;6WzM3{Dd}*YbhL&k(So(G$(}o_JV{AV=aECn@7|; zbHThw@u-VuuNOm}d`yDw2l}_uEfpc8n}ME}=*uKzgzfWR(fK7<*67(07!`EWyVh{P zW%SS&T~_F$rwsm03EK!iCv`ol$CAewU^vFLb|m$2MV~w|Ots^AN}oGMJc5*dBSbU6 zq<-rd3lWOA8{+*CABMOTBE>IDKZ*~K;t89apF$@ty~MqbI7^l>4A5_sa2kV1Vh9U# zMWiu;b+SIg7;+fLJ50bPkM}gH9%k_gb3xq`joQMxsY9TQKN?U0vpdiJ50V@H8HnpM+g$B-Ho5&{B;s z6_~BO5^?62HM|50z4Saybx@$9$=Hbc>}BAu$4N`7VtKx7BQG%VtUv>+LMewgaM;En zf$3-3=N-5>f;U;jz*o1!x@s7n#`36(V_J29s&b1FH9dnFzR1?zVbqU6Zc|us@qvz?P1!nM`}xqtMSP_DAURo# z{-QqU0T2O;z1NUIwb{a<_C1c*p6dBh6JoVlNBSre9gxNAd+33qLW#IcdhZNjC37N9 zaF#}@O4h#JknR46<*IQfsrl=nUV_Pid4HKs>oRa!FGaOxoN^mBeAS5SHmU;0UtuO) zd4exsd-g#F@vHmlv|D>KUr(aH1$&)TPM4i=KEGKiML}OX86vUOBV|Zzr*d~^aBle_%kMY_p|yw`|uZ>*YZBb zy89qr%4$U)WCV6To3|h1y(MSb$~$?di=tL9cCngy#B4IqES53K-!I7GOJ?~MMsNp* z@ijN)4%guutl%yxki2anLJd2p<3|Me2@S*grm5O)pEWt+W2~7Tw_N3m$Uyt$;Q-KT3)AQ2siL4zZP!d7H%61 Jr;uMh{{fqtT5A9R diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/GraphicsSupport.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/GraphicsSupport.class deleted file mode 100644 index 5c5e2e8abaf4c714947a66f34cf48edd2ad240b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3736 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 diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/JFileChooserConfirmOverwrite.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/JFileChooserConfirmOverwrite.class deleted file mode 100644 index 54f5fc057cc0ef2f15e6998e7fd9f4162bce63db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 980 zcmb7C+fEZv6kUfFT8Dv3RX|WFUa&2fK?Gw`kcT2kNfDDOiM$=!0~{P?>da|N;xG6E zn)ngCpz*;E@SBWrOi?v8ro?X z?K)eV+Ev9P-w#z#^t}Teoa{7J&nVW zvuUWzcEdHgqFhxqM1SeYeOJ|3mEDVqQ)TU`SB;Z>6}*We0_n0}B^gOdw7br@IntrP zQu(U07f43d>w(`?Jq{7W+cqXJ$^M7RbONdtNyzkUt{iFQXy1uE1q*jEmB2j#`=Z}Q z2GbNno$An#8^zd5;sJ;537=`lD0t?8K7L(o;6_ zm=zcakNj45s~g;ue<-k;?XZ+B;}rdqy6-8^6goava>qOS$CUh{r(yzfDU@=hXj}6( z#xTgC!uD?djX!*Ocn&DNu%!atM2R<1F|zu8Th_aKu_}HesH%=~)Biidg=j=fQ~DTh zSy26c4De0R>O+zrwZS0&Ha)9t8?f@}i#lfV=NK=~p5xAEr1R4&lJm|3G0KVy@*2tS4he}<^Q6Y_gX+-0P& zf;8VzJR|Gpm?XO?thM`QI@sO5{fsTZVgFH9FA}2;ZN%ng diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenIterable$1.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenIterable$1.class deleted file mode 100644 index 0daa541ad603a087485b72a49f3917de5fab3354..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmb_cQBM;=5dM}Hu9O1`D2SpW6e(3XK@=4PYk`O<@K7YdCy(ox9H3U`g*ZGl&e&^AJ0 zJI1QddCq+2g(6ch%fj=M8CN*IT+Wtkr{HsUQE=bfaCmY|LzE%0X;w_bG2NoEva!i6 zp`nSPQ>`jUV1dwC$W{na-N&+w!}%7?s;)$ex#8 za*VdCmCRt7ZwtldRUCb|rr|2X>^Uo`<2w2oVy0#BAV}V2u>M0mbDm!`OsOEFGGX|k zE9@<92vU<$+Efb$kkl~9aP9A&I)-qQp|!|`(qYykEL8*2Q)^zB)|(}>d{l5(6=)ze za#sF0o#rhay|}F54nzO3YL~ryXqDz2zQtWJzisidust`9+vt#_@9G%CIMwTj5W`?< z@yvWASD$Zr6|Uhv!|-wIymW)GT=smy3oB*nFPW?^>jXMTcC?@4h-$M<$sIh>k-`W= zJnx0R#TRTT#qLwBJSu}3n)7ziHAU!?)AQ4S)s+*SJAGCeXGoas^RDH1f$bKTxF~rA z9Z!*=0@?DqQ0?D+#Qy|1h3bp0%l)il1_2K=%rOl8lbRWN|9Cs0p9&M9rx6YGr+x(z z3E9zf1vb*t0-da_G|MOtpgnzS7j5Z1B+`*xbbTUI11{3Ljeww_#tGmay6H;>QwVx+ zN!dt3HMkcPC2c+F&uIIKEBm;?K=ZB-XpHVecE}V_uuaNsvJS4N1~;sH*hO-ngRS9i z5N(M&oc@CJd$b(j_WB-14{K@C>y+YE^ffWxhtYtKzw=b-Pg4z^5aHRne8VU6wG;k5 zbk_2X*Y*)Rzyu|Fa7cjFdQ^$e)d9t-K#2_Tovg(V(J1*g65ofCO?@!wQ>_3|JXW(Q dOsnw;W@wDk#Wss)H0z|eK4dXZCnw?P_X|9wuNMFS diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenIterable.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenIterable.class deleted file mode 100644 index b9c0ca20c2c2200a02f2e5b69b0923a5749eadc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204 zcmb_bYikoh6g`uq+3dPDHEJ|It4%bC+V#;7LP{k>iiJf#v;_P(*$nBF?XJ$w2K-kF zilE>R@JESvCM^~pq!4$R*}Zq}J#*&VJKukN`37JEcO4WMo+&;RNszrAi)oO{AlEVu z_LLAIf0yREKjv?As+#>o$I7?|`!XIYk?d%p_$U?*N(?Ipe9D8ECzIgS=s-l;L7AcU z%X=KnP|^g#uo|Xn5^#eWOg93RCt4ngz%1I`dkp1GnMl3Gu-2Xz+!+$^ARP-2MV$5F zVws`X?hIWJIUf!x4AoF3;$?m~5^B#dCxT%b@p#CUH1?6Rr1xdU&<__BhE7nCMkJDt zq2BI5R!_dSX;@BXY Fo}UczK+XUF diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenReverseIterable$1.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenReverseIterable$1.class deleted file mode 100644 index 82594a1665cff0113371a05271ca328cde7f7615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1782 zcmb_cTTc@~6#k|yEVL^WMDPkIMM_Z?5U(JL6=JnOVv&f6#$`Kc7nj|-JKN}A@xfo< zgC;5>iM;!xjAy1rN=(FuwwaxoGjqQ4o!k8U_5BBcX)J1pFg)l zo31*%kRClMC~*y@dsNCk-}0(l!&QcngYJ6b24SV*`GOZ$D%66~ScBDRbTRahKL;AMew>jW z+|-fAC_}v9g}%iXZJCYUznXqrDl@bf?2>DW(5Fie{syc`4mJ1eQDK~;q;xL0mg5Ds zTUz3x>=kv~#XJSbmM@BWA$s@u9|9*;J?FaI&pKuh@Ib?ThT;EeI7--2?-&LtK2aJi zh|r%Z7f2>$x6_;1LL&j4PLI(lr)~g!nXxbE$ZR8-8T*FgJ2=Jg1p}YxN(ATW+d+U( zkOcx-#Rb|)5K_euQtFH=K4aiLT4EofA7~p@P_63dX#+%}4l$zcFxhdG zTlz|h8;B`|k<3?Q-XXDzOY7Sh-y`S_qMBJJ6S3kmV!Hz)f{%af)F?kE|6iaJFB|NQ z9Jbd<_*c+fw>L!|OYUvEm?lHl_Gn#;L5(grnbY!9Bzm diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenReverseIterable.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor$AntlrTreeChildrenReverseIterable.class deleted file mode 100644 index f6f5f70e3e63a95f26f5dde76fe767d294e9d141..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1246 zcmb_bU279T6g`uq+3XsdHfl6});7^3f~(jEA*E0P!P2z_QvyCtk|CY2-PPII1^<wou9wH{Q$6y#}0A~eZ?~o`N{i<$oy3Lsg|LC ztb_>ohd9-H6aG%es<9X8P#JgcM1~V3qBkNFDiQlyC_V~>g95|ajAz^rc{KHpMl&(i z4vGxb3-5U}LqQW3!$uIRsm~3#pKbdpjkG)!zFD*+x(vk~8A-j%u+>@=+#V8eFP;bw zd0Z{S#VSL-)gHPaa%DIuF;oH>iNo}CB-F8CP6UH^%)=p9(%5ItfeF9`p`j2 z(r86uGSph_z^Y=^wyKbyV%&k8MqHe_wVUM2;g-dIVfO;u@2I~e{5v1* zqJb__0x+G=(`4^qVd diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeLayoutAdaptor.class deleted file mode 100644 index 21f4fc69af7daebc79989be997b2800897020e42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2707 zcmbVOOH&+G7(I7pU>@`^5d$W^LLR_82(3s!g%HW;C^~@%kj&Xr` z*Q=V=p{%;5PgqUEG(*Yt+C%~|&vku)*|G*We$6vaS4^+r`1Y~XSdCg27~ilR+uszp znjLmHcR=EzTahV5kv5RTq(C&AJ4k|p4aAWU$dqkI?lg`MrFYLdtVw~XvU_CJ4lK`B z`|x4Re`wbQ7Rn=8qIBBzva}wIr1Sm+F5u-jE(*Lp*Z>2s;8lTiRrw>*%XH)=4NmW7qZB-3NCqPpad^q1FwxR!hEO;3}>OBq^uKeI=V41{O%2 zXeB#ZZ=C2o{rL^9%2qu{P2l!WnL|SvB|BH0*b^yYdTZwZt}s@ZE>s_j%$>S}4{ z*wmcDGH$3YN(oGKSP{qD0=J$sMw@&MH#jh|<+fSDAX(3KKT5HIHw;`ymMz%>(v8U7 zSD0G{E@4(6+XK@Xrm1ROfo>aEg{fBW8(0cfB?Aj8_;fEK9ctUaG-d?Ovmd%rQeb6Bf!Y?s7jx^VSIelpVgz`yNvN15oNY)c^nh diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$1.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$1.class deleted file mode 100644 index 8c5a2b69c88f29457ac89477807aed197daff377..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 921 zcmah{?`zXg6g{`Ci;dBCo$Kb@FSn{qrv^coSP{mYP|2oX>Db5DvsT;aNj_VupWzn44ve?F9%LvIsH@xPCJ&e zqvTM=wTA`@gz||P2qzHXvGb~XBE8hW3}Gch#V~awbEM9Wm#QdqRg%h3#sqU9f|{>H z5FHcdT^;?wNrsA9UOvy@CSm5O3RU`yuvniOVRs0H-N=_k5UyG2mRBojN76cNJ7PpJP~w6tn_^h7Sf(d2pjH2O>rn*O6?cIZvik3IQ9X~{}|ZGWJjXJjw*f+%6b_GQ|O zd;@jD>i@;F(7+bKN_x?-6^?8sY}YT)ylGE$pNU!_57TZSl0+t~09(%M5~y6!v%sUA z<5h&o=oLOa=DSAB#@1(8jWb;Pn8nO$Ec?URw2cbiEzZ&C9Io@uuAn+*Ip7yGOSSO{ z);BC1>3tSI&T!)kmM0kL3FfJpF;+)eV@A%$1~!>9j~cV(a2t1cFW@e0+~bq3TGzne EZ%y6cy8r+H diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$2.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$2.class deleted file mode 100644 index 62425f29d8381a96fbdd378713295af60ddbdf9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 893 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 TbqiZ$E!1$E#2RH27`pxjcP!Ky diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$DefaultTreeTextProvider.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$DefaultTreeTextProvider.class deleted file mode 100644 index 6bd3674e2d3c2662291f84542304e4019e7f3c95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1127 zcmah|+invv5Is&pmu#1&1ZcVT0%@BIbYCKbl&V5%g;Z&kR7w=_>LhM(wQ<1fUEr@k z0#Wh62k=pd+1&tb8kz@tJY&x}_MGw0U*CTKsKd38VR){2B$OMx8;Hmar5hUQyB#e= zSBm#Smkz}V4}B9yI^u&l*5gPHgtm}lSU%+ucYUsgZmV}H`o_Wn!`3XsqiFz!ybgWQ z88~^|S diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$EmptyIcon.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$EmptyIcon.class deleted file mode 100644 index 2562812fcff6237091984f2a7e8a0b8cdd960941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcma)4%Wl&^6g}5TW9p`)FWyidEmB$)yy-58O~k`e1dCQ-J#j|KRE{0&Nz(ok8&*gx z_y8mpY*_Ivh7 zRO_zMGo9|g8jbBm5GJvUDq-VHO_d+1c;LV9o$1iJs1@0BKbslOOE01J!oMY3v#CLutxAsl1Uos*G9Bzln?Y=sPoc69P6|l zsVvi(izkHL|4YUaES?sRct(ZK3V)0hIPydst#ah^O_DwQ0`D_B4(e=cl5~Dxo&EZ} z0oT#sh<^h%*$ViGZvi`%Phu}2e_ld53*^=k$Y1|NZeypIdBT%q4Z2G9cMd$B7mJZX z_Xcj}Bnh{0n@LLU4(_rZ;@xAfx&cyTv^XJ-pPOB2P! z2V=#Mhq*{um7rrn3xduPtvd(J)c`_GrJ0Gilz;Sjd87|AF|-W|wMkg6axDh#?> z%AS%ZQm@%?H$ITBwKzVO+C_n|ekexbG)PWVGz<&_f^GRmq@j6{8qp8szdM9-BDE4> zPwGU)(f-ahfu0i<+HsT^5t*I{Q(0s>_9MdVDCM*E+Et23#)G z!KfMNG&1T)=FBXY*0f^v9-+`?l^$kL_Tl3)VY$|^I)hNK%9s5^IWVny?-B@Ce0Z2A zlsYPsyXjG1>aNvIsC421%M~oz&LQ6{n71k+JetDd;;30-!4B6BV~Re)oQe00W!5fr~W;PIk-3L#z{AZrqip zhR~d9*?%+;yuCQp1NltZS(mJ}`77PBMiKm-D3ZDziX@Rd@Cds5!Z2pi`mFFa5!GU&2jn1Sq`rJ5tYUnZhb@b4ENqM+<|Rj8N&IMmG*6n(zvvP RT865l!GCKmu@@Wg{sJt<`qBUZ diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$VariableExtentProvide.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer$VariableExtentProvide.class deleted file mode 100644 index 102b50da9b65ad4c43ff9b865ccac480fc1a8493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1863 zcmah}U31e$6g?ZuQEWsU3~>o9DHPh+&WBoX(=DB&j)LjtA1=}6yh zJ+8@)-FEGE=z8`}Amy$r4`gt4*9lyw;>kNtLg|NFL9^r5qzOY{Y|rU9w&(bD`+j9l zRznlR0#nVPZaWoOZ`vWFc+MZqc4%)lYyA-df#Hru5V%x6nZpuomtEftR|Kx)2N@T3 z1&meVrIEmC3n`2WB=Uvb6v)|vi4lQJ+4bdSd%q%s9hIFxw%n{b-eI=!Mf?qC1Gmatrt)uD7y9?Hp$_tig)6u!U^2*# zd_t&FzC0+4D4cGKZDRU$hWZS76H@}``iRC*778c|oN8(7Sg!Gy=FvEXbtTY@g;~t8 zls;>$t+$+7jW_~gotmhwQ$00+CjpguJza9g%fO%%E&Fa#JU9?YQJH(vtv5oIj>D(BAv!fd~4!X-!Mh0Sy;twfn@8E=Ti8?vi0fl;8 diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/util/TreeViewer.class deleted file mode 100644 index 6e35905cf741dc5b5136b12bfe287e8d09f49e49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21559 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 diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$1.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$1.class deleted file mode 100644 index df5273ab023ec602664cc4038dfe13e2a01c8f9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3798 zcmb_fYfxNg8Gb(4-2=-3)@_JVYf74JvOwsT7*l1F2qi?ZKuAFpTCIoO5B8+X9&*mv zC3x3FZI!m(wbiQe7PVFrO_tI)ZJcU4^)fp8!`A+2b*9rlo$*hnGaY9dpYQB0EW4I; z9AOUM^}WCE^S%7;m4_bzup19+s1azhjhxKHoTEvZi)GDN&XfyI?B>z&2~MOP>DJ&A z2putUMl5Y)W@Cq@kI00pAt2Ch*|Ra3NSpJHj5!N#Op=xB#D--idqBFpHe@=k%t%`x z;HFF`ayt)#36715!gPR(AYqaMK^YH@{*25b_jjjF57LuN*fWap-(J#I{=r9gPdN*L)0 z!#35rxam{Y3tV#<-6GvIMW0)BpG*pLMynLAa`S-ld%S%jh^w$g!<*=^jh(FHYP1Q| z8Ht2+ys!*h)^F`qdL*)rYt6;_Y2-mGos@Q5!!?v$8LL^_m`|ArCpK!C8Mhu0Y}atD z!1l_E|J^VhI}jBR$M_8@>JA;9-p*nWThXNga-D!bIyk6Ya6NWu=oZ*o$-PQl9dE{N zfqK{KXR_H=THwZNZ?D%rUhRg83rd4MI&Q#Q1vKX9peyGD`u_*UWeO`M@gRDzR|9k8 zs!H3+%R$FJuoCKuvYB_+M%!Ko-H5%qtD|4lfR;3!dCQS1?*?=n z#5>kf?(e|OWE8HUO zAsp5)x{j6yI&Q`oX-!w!hHDXvHm{?lJ>EVUyc_S)z^V?faW0+ecrPXi4H;sRz@`$1 zGDu|d-y(3u8YvBm3@C*gFopN&c)wzxqB3Emvr@wc1g@@hbVbM&;7sdCfItwCN3%wn z(QJtpEH9VcKBa`r=$KVP0u*wST-0C^PCSK7D|XOKOJ(BiI?`Z9YAM4R@vI?~O$E^l zOI6Z5VX8V;%abL}GOGjq7(5`;g!wkU7K)sn<&~j&#R8#_Kd4b8Ry-TSTd2Iu`N4 zwQSktmEOjnwNdE}&Ka|k1=5QT>-Y#hO3u{6+ZEVWZO>}W76=t?r0{VapTH*x>U3Y< zv}2{St{gSoRAs!2mS{LZUu~>&q&w0b#BqFDx%M*xH(ahH_ym+ix6Eg~xKqbx@i{7E zB$H$Ge8M%Y%-RdvRc&PvPpd972paApE|e=Tk0s>1V(G-j4j+)YfzrAT_XzCnH!?fi zwiz>%Y%?6kN|=T#lPdIGGfb?u8Ov^S4V#`TJOv6Rwg$0;FDT1%YW5`^UskBmJkLaM z$6O8l>-%7QFUe07H;!J;IZEznemRO-C6|; zCBT+*R!$aFYFd+4$i;AVeo(3;-tJh}Uc72NDPi;aCS`HH)TrEArcz1qy=8l=Y8E$3 zc31hW($o9n`ziO}|A!SJ-b){9<26_se$Fa?4NshgGbM=j&~rRxTMLE0EjVUn?Sxb) z$*8V2z}G4GWX=v`5^2jJfDKDGWhHgwvCLN}VN2G*sA0RSEyVWfq%9>;zct6_(sU&Y zkl8SpVQbuyCDD5Tm?AQV>3C!6*fehtuh+Q`{Hu4_3qcXXaZ zQ^(G82z4wYe8#)j!oNX}fcb=9VKdi?kk|2gyn&-YE3PcCs#!vSq9A-7XVLT!-dG&Y zW9ww+S#0CizKorD#PWE{@Xm{PiWfq8ylt{4@W>v2?H=DLgjxeFzFi|-dA$9EPqg@2 z{3kE{ONNk~_SubSOUodxxL7T>@(X;&XDxgXzR+8oA%_%^=7S(0~7;=4R? z*v5Si-)HKbrd>baJwJ76#t(6d`SCngKce1#{DfZEOl}3r2UaP6%CiS~wjaSuh(psr z#UmPSgW%+6Ou$Rn0{`l^hLpyJ1Unk{4Qf~#(Qx`@)cdH@FUX|^zr%S SPo~%*t_0M-WQCvOh2cNn$2+C~ diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$2.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$2.class deleted file mode 100644 index ccad4343446c3a1111bced6dd67e00ec75f40772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1099 zcmb7DTTc@~6#j-5O3O;2YQ1o)Sg|e80VKZEn3$?blSmul=19JxQI&JWM|Hq`Oft_^Zm!yZvZy2nZgJ|!HS{OJbc@cLq1S^sN_+|Uv2NS zNszX8^f48P+@V695(;$u}0WON-Ou6;bG}A zaPv?M1rLPo@|LqocWaGun;}^@9hnBhgoja#WstxX4=GGC>pVKOR&Veyj8iW^kOL{Vs?-}THOq{?#_1D}JeGq46j!VWa8rE)ui z+n7yZhM{=2XFV1Ay!G;_9Bx~=FRj$ReC<@=VGi>YrYqg)MavmWrL33A&5IoMPwaW) zHiUdcNr4E{Y6k71j@=|3-G= za&{-Mgi;Fk8CL%*6%S=p7{){C+9DWGHGkr8H{w0hG6U<&=PIIa@?=V@(UdS`pJ_iZ zAx+5(=?+XM1nwUPEhX>wySE8KOWfO3({qQ&Z7wk~Bhp3gdL1CTWXqleBx4&Y_;#!RHa2>3>0ZGvWL^%3>0)yBTwEzGB diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$3.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$3.class deleted file mode 100644 index 22d7dce6d38126ccb31f65c3c12a8e9e532ee2a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1903 zcma)7X;a%)6g>|c6bm)DBq`lOAaN3T0i_{bQpoDCs4*b{;*_RKWcwkD3W-Y3PV!qi z)0uA5ndVbwV$&&|{(%0dPVbXk2mwPpBkMiszI)EOoBsLt&%Xg&!n%SUhLON(a?c3A ztMR7MaEzwIABV=`-Q_YZc#xS;kYq@&Sxw7uEzdRwd6!bCZeqbBC>N*=CH^Rrl zs5V03uNx)D<4fYH%S%ouxW@yAK2dkV%mu&*$N!F?>tP(7%-eZgkWZZ^k^=*oaG`C$&k~#vEGjLG^J5YX3HtO zk6{HT8P0YI-0mY9PGN*Wm4FMYt0AYDGgHNBWE7lX813R^C;S@D;v7Z6=0du@A^vxh z)Xl6Z`RE$55~RPS)}U{K2q=@C3B~wO;2!}2O2)cCk#h~zeKJ)o8bfrDDBwA zk0(`piYWz@rI*?wey8Dz1nzUWXN$Vza!tc^++a|M%Zx8+jOy7v$=sGAO$eZfX$7|! zPQDuaU4|NFFiTPGxV~ixi{YG}eR!~cX-60)ZY%g~pB(JMkj5HHQdNp@=D1_mg^DrU zku9)5T6NPjW!dF$Ps1XXNb7o>3x@OEnY^5|NqPFdhO#V@)GEawsxAee?-PQ~khvL^ zl8OiTLNa+sV7j>nu45dzi|VPxWd5ROEHPrl8I+eDECAu!e6*pH-`o zJ1TcQE@a0yBnpLr`or{SI2TFNlve@@{i}vy$nPUiV)1BcRyxVd07r{tZ<$Uf1 z()ky7uZ__b&Tk>NvWdccVGCm`iG+OFhLL>q2PWFM9B;3-aWiqTjk)?J=3BU1=xt#+ zzl8@Yy@gGzwD9E)qj91S_5%jkj~HS+AHa$bQ2d`yKb$vxxOb o%&fzjIN}j3;yr|GsGu4Jp+?+$z_CjABy2cvX{C~tR7}7B05l8#eE@ghhsl`7jnmMYrmuUDD$_s zcAH{wT3vEbBuppizRy9VTN(S=k?~oAOy8qEI$2=3Ex+GaYO5 zoG@GK1)ggXimOS;B@ixo=*NJI0){*|7$y{I7BJG#F~4lT-Q#pu?L|zeG?G9?O_gf9 z?>dV%MZ!#vJF82QqI<~4TPbH5hlFaa@&692*i)PGNS2om!4PE zpPmwic8m%RH&v@UL3bx3DyW%|Q}+cm%0`K!u?| z38S@!1^POXsv?$|5xk8!=5#euGU*IcBC>+~9#k${rHR!iuY*DHm&AH1d+TxM>u2)$ z3h!f%8L__ngwRhPP?o(XG1fbZimZgoxYA|W>#|JLPjR*U`UGQQ+^S5TU}*jn?l(+* z!CgySfF&NbDbXiX=rhLYEGHk!FPrF+Lu6COeW8DlN71;1EQr|$AB(aUMLiGYr?>e? I_hpsmH@af|*Z=?k diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$1.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$1.class deleted file mode 100644 index 5d43b973dfeddb6475959b09e07f8f4a929318a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1160 zcma)5ZEw<06n<`tbd(BRov+i0vnsH;4n-4#8WWs}3G;<5eDPB$SGY^p#w zKllUuQO0wDY*d%PP3}GS<(%g{=jHzX^Ya&gIv#3J7}g_q!~-Y()Z-&(D4dbtpJS)} zZofkt9@&rVnuZL6dEky*$9IFi^R|1yy+lKn!8*Nd4}-w%`kWz~3`A_#2)i{8yupwg zxxUSbL&ESlW$;n>eD6z~@WYm%HQg1|9AS!%E+7U?hsR%^!oZ&+`1#wnDjg-d1 zPAVOSOf&5992klQG%U&8vVk0Q9V#vu$YX^;Elbs6O9cGQ@UY9H{YhG^R_M8Y$Bl$M zPcJhvR}6NF(^;(T8ilDw!$8L>ZfLm9P@0!r18ca+u;h9kk7IkA;pGD9sm$Th&~Xd5 zHLNq#XBjM-Ndq?SFckVcnG~@nt4bYKuC&JOB*Jl>$nb$!FzEF>?VizDC0VR)9HCI% zJc3#M0qg5n@glAI*nr|wc5#W$(vZ|~8COU$T*b;1>IG@aH>>&$g=1VJVSY#H7C-BB(@J&(t+z0R;bLwYJxxYTvr z!fg%944ab-X3eAl8+RBAU7n1J*pXGG4l7rh!*=q+VV%j(JybN58I~sf{GS~IRji!G zxy7(CEzWw{m8_V)7xp8MkH{2Ge!!aKMD^SeUJ%B<=)UAhFYFjt2eo)!M!n4gp70LC zqqN&uGg6oCjTeGCyb-u@%wv?OwN#qtpqQrYHNdoFr_t9{Xy#$i>v`Hep|eV|SY0_n zp}Kkmv-$(p*P-G?TJ@m;#izW*B|1w(QpaUnA<1wR3uCBfq$%I5>NgaQagBue9i?O3 o{Rd5Xk9p<81e!HQQ?W|+3hrZ#WQJPRK}{mk-6Bajqz4**0rB836951J diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$3.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$3.class deleted file mode 100644 index 1431a5ee5d35571325b2c7e063e2676c7fbaf712..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1160 zcma)5+iuf95It*$xN%J4nsP0aPz)q#saskqp#VZEMM4S}wN+kta-1dE%3TZF3F5Pm zC{#S~0elo^J(0K@gx#D5-e4#U z{LtmZA!XRk7Jw`LR&v z@nufsiowlrI*+xxNnz@7Uz%9NEdw_hD$}xSVF|Yx=KLVwN#d?EyqqCDwJBU0Chp*_ zfn|oRNd~iK(t?Y745cnlM@8(Ys#1qlYt3OhiD+17^78;S1678lNk9K*$3h(|XK`*b zY)p%@k#(giX6{G*IN&2PrPCj*pBKn`nnp;A}o5nNV{ir)=8G@E5|6+SC3)W zf57=VRJ=^9IW(a7v;bG=tPDvVS8V%k+OFz#|q{cW+qM( zZZNhMc$QO|o!nsP%(+F;1BPB5DqE=mo78(=UtQA z8{D(xIeOVC!(bRa#jn&1g%MA2$91Z^ZpEj#`&;djh@?5^31Y9vaJxC&Go)aF(i%|6 zD&8Td{+-y=OzMV)L0pzh3^6=yw$_>n3Zf~@|KN}0{)&z+bTf1b=_Hlc{{xFinisYp zl2oM566j40W4Qd9->_Oqb>b|lQyRvlY7cj+wK`XkWf*e3k|9jnD*M7PT~8QZ#R;rk zVXW|ATf;S6S79(rHzwh%jOn<6o8)at1dA2hmWT`&CMIho<5;dCkwQzeaq8+@DrTsn z!bWSl)$sv7WQYZBtsAHvU!#N#8TE*U4Ep3_R>vKwkd&6m#KIx9x^KCThB8((>{Yl;&C=9z4+=ZNq>_E2VF_QV z_<~`ukyneIuk} z6>BuN2zTD{%QmkvjGaLB4+7)BDw2qAL_)I~9^#P-nlM)y9cUw}<1sd65&2ceTsRaa z!`qFMr#>0wxayVJty53uwSb$?mw7oFIx%jV!VjnC{27{dvZ>Kp`FEZ|}UxJc%tRwDfhgPZBhF)qEp@Ci(18NJGS z17@O*nIPBSB`g{$Z866}%&ToM9~0)YQ!w9ai#Z-*PPV}`33KNZ%yb>|N1{@aIsFQm z&CC(re~BrEW86N%N6XniFq}QY$Nl$?F#iMkf5qo7ai1am3x-tY5R!ev{y+)L5nZyo!8{R#`ceHkb!^9TtMrluy;cqZn$D(z-w*CXMqC^h> diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer.class deleted file mode 100644 index 3e1e5d8b4289d225660d3540314fc1840a4113a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23446 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 diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/actions/WikiAction$1.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/actions/WikiAction$1.class deleted file mode 100644 index 05b198e4874a201311ca15e3c91faef11d70cecd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1075 zcmb7DT~8B16g@*L3w4!J1;G!jP_YGMO5%e_jfp``nk+tmVtgF7<92X6TW6;DxAZ|V zn)n0!QN}ylRf#5|P1?Qp?73%8&)og`?b8h^328-Squ~D#{W?`!LZtFMJLm+ZyZmI81_|ci!6xO2{2FkrxPn! zz~umo3>zoI8m6N}=^ddd+kw=M?-p^7Ars;Xt};}}TY)gN$=UyCbf&OG9)F&s!A(ip2 z9**3Y+Nod;4S#Sq85WAE-zfQU_wvXa{}MQbv6nC8W95&1=GP8ydQ*fv(s7zuGPNUJ zKkEh9U|2dC*q`g~Ep9T*78bR1{Ml~Q@!rC&*3xXJ!dhujr=2X(YsIQnznD}_&^N#o z;nP&zrQRczwe|P(bByp^&YAI8euvRq16Arnn(^o?YIJ3|fQyC7F3LH#_8D_8KH^gC z+6P=e#!9sQmY5UpYBk~jO?q~Vl$xZto~zD}Ckxdob*s2Vx+UWH*%sF5S|;{waH=YF I&-R diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/actions/WikiAction.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/actions/WikiAction.class deleted file mode 100644 index 7699f3157e4b5e96ab0d5860aca8675bba43116b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1771 zcmah~TUQfT7~LmHofrozsZard0Y#HwnObbo#!?YNn>HYt5Q=Y;a0nxlne@yg(!bHi z{sEs|t3|16^|25AQEm4mSwKjO^DuKR-(`Q7{moy0|NaMnd)U?x5tvX`OS-22<9^HFR8KltRQf?@WN_YrYi%J z`>eo)hqh}6ivokG-m7$3Ahzu7$ONLeq(g%)5KX1aaam!rE1N(bOXb7jT1~$ z30y%^!{8ZYRZmG%HQm6jOLNKhr3!R>gsa40`z6(s0>i229T1M?*34p{Y`2z8KfefG z>G%K_;u*dc<2A*2eN+KH+JN%)pP=*qP&;% znxM5&9b>r8boeqTd7e|U8zp%V2n=9Hul` z@T!(mwv-+2yN9u0&-NM7`!EU&6a%Zezh*Vsni}p1=%+h~Ey0o|VB)TZPX$I!18&;p zhGPZ0o~m!=b$o_-YS(12<*EIObgO#;m3Mc&igyslx8&ri zWjk`mumU60B*WTlIi^nnIeZs(@%I9m|6s!@g60mYvJsA?b~ER&rehsXI5tAV?O~DE z@RWUaCYTLN1$j=LV|@X^R-HcE34L;$S23HhFp8em?TeIxiDH{3s|=RBI2liKVf(TV z^R6q^vSV=&`IsUVqa3>ek#Nj#72#S#obQX={frn-fZ5C&Bxe7F7JG$QG&%5=mNT=z zVJMUQ_z)wRcNpKM$mAiWUsF7aTYOK`3~-$$#yRgMagFXqcsj=K1nHl_9Bxx$xZ?sT zq`9NBHWXHY>p?{RfsTjLgFRAz|hK}$kf>*d& zc!%6}@|)Q=$gkZwL}BYSRYRX6*yzDIj{*LDhRM89ED+y)qFlfX9uP;ijnnA3>f#*b nw10*ot<4Z`37d=}M9kk8e_VzIVdpfYLUu_C+|lx<-#{A6(-jF;E&~? z#L$j)z@;CmNh0}F@kuxhRKyR4iP404_4Gv+U~v36GV;_g>_QlSwj)aE*w-DRtGAQ&!^*|)Gx&_lnjkQ?2GV3 zXl4Cbuw>q-grPZDpoJJ~fiyFIhE}J$xXUFlTy{}Lg`u1np-J3+XEDwSsy#mS<;18s zN*rubowp(tJQPvD&ofr~PSeaTn=*(ltACvPxvrYoPBEd7Ms0XSsKV+9xs!aOqpgf>qSX zcJm8Z!76!GT*4YfEVz|rsN`ofK9WC=t!LN*MVVa&>L#%lm@H zH*EL5qIuCogRTRc)b|!awuyKrE4q;bXAMya>}L(rkM%DicEMpeZ~slyCb|xm(IX;n L0a2G4E1>rqJYe5> diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/FailedAtCreatingFileException.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/FailedAtCreatingFileException.class deleted file mode 100644 index b8610099dfd7bfe4649c716b2a4aa45a53d5e922..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1083 zcma))Pj3=Y6vfY@45L%}2Pzd&w5?VtZJZ6dscB-UO=^hIfGk+~I=s+PI^fJe{URnV z{R*x~T)5W{Wjt>fDZ$dXd2jA}_x$d;_sy^0-+ut8pkyK;Q1RtZd3Nxzt%kPxEG!DF)Lc)!8l0Ud zzadY$N+4V7IV>PqhH-qD3{Txa;Aw4+%_|$+7s!=r@8wY1UFmh~dgyZo`#Vi-B&Ut6 z37BUp2xKQR@K35hej3m?^?T>qUCbzG2Aee;IS5F|O%=Py6(~9tyxxvtn3`tZQO}j#h7)> z)^+n{d3SGwyR)!dWI(sJF;1HpGh<_vLSqvI^08v=#AzLw7kM}+vL=G%$^DD_Z52;Py(H~Hf)TjUe diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/IllegalAccessStateException.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/IllegalAccessStateException.class deleted file mode 100644 index db7de0eda33ce703469855093db1783db8d474e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1081 zcma))(QXn!6o&ty3#;2=p)HkGX{lNT+DM|@)ig1!CKzI3KrXm)x}DI~?Si`t^|ibr z@xli%`UpOTw~hZSD-tY?H#>7?{_~xG&e?C5U%mpUp=2T<@Whux#nQ1(tU2*DhQgP4AqN2mnIB>-8p&9H^*u?kqTr2ED9_)98bL-oS!Ja zB~M%>u+r$+EFf8iaeQcmXHFncYs|5E&GQZfa;3(5Ih0jbdfjR>^c}BzP;P4*Ic;NA zz&vMLWH&1Rk5nK(4QQSDy$kIvW^8IkULa}9K|n%os@PwxKxG;dySP$1wzjRY1%dtl zP3v^ViT8A3Q6Q^4?Xo%O_kF&O;+JbB7ha7|W5NPmtb%lulDf&v3+WTIUpLKZ8G zG+;Fb98#&Zsmk66YqNw5%Vi_N`dAecsK+{PN5wgtt5_SetTnQ7b69t9H)a)LR-Mn+ z4KOQv`y*`4!tyk*5y6UM*~FL`8)GUoHbEfA6=UDgM3PvG*h0=2VP}?Hz)fsLTT0cs4?)&Kwi diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/IllegalRGBSyntaxException.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/IllegalRGBSyntaxException.class deleted file mode 100644 index f081cb3c2ec1e310f9c724eb405c8c1ac7972a0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1075 zcma))&vFt$5XQeI3#%Iv5)gtUBt(r8k`haEijs)R>D@M|(dmm2as4g!} zIrOc8apcm{t;oJy4xjajlrojuz=+>3@j2dEz6NFgYy&V zcEpJ-3E9@by5m4|luDL|&Q5 z5%hEEd7>W{|3^wFP6Ik;?%+Z>iy0-wC=!yU2s|d_r;7d65^B?s*u|C7$l8{|mI?d+ zo7U?^iMLc@g|I3e<+2?Nhc3U4hsBfXaeFUZ%MWjSVZQIU!erA%dl0y$d}gTuY|d@w zebpRngQv+q9HE3HQoQRNC2)-+Mq!cHG@m@;op?{y##s6sN;13}ECrUKA%hkEN=G8B zBFm8iOY-Y+_80jd3a~HrTeZSc$Q3*+i1D24l;4ZH(<%@)oYM iS~cw;QclRmglxoQ)#%%}6FM-k!(STLxy!i;-1`kwh0$&R diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevCoreException.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevCoreException.class deleted file mode 100644 index 70292901069aedff4e898eb1e62f310addc37d58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1012 zcma))%Wl&^7=_QIP7H3^l!RPJo067WE)@pa4Jzt_6r`dE2~x7i3O604MyU<96LSkvC@j2grX2!q&{P+c64>cVLfx2gnrDOV^PUYB?U;6T6 zV7rcQcHSJyam)4Oi+_7MG=cI5YiyZA%Ndw&M^0d$&%O(+`O>qkVOM%S8Sjn`1;i_X zl@@`4vCd14~#zIpFKuxjo!7oazqI}=nEVPytb4`J0vHVvl7!Dz*8Y7$|@YK(o) x5J_SUVk>!Vf~`gJCa%+`E^RMTPRYiUY{X=B(RXk+Okm(1R~q}=r#FEIe*r;ZwG;pV diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevException.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevException.class deleted file mode 100644 index 883ed3a8b63bd0f340b68b9e85eb1366351ae79f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcma))!EzEo5QhIIyR2>?2_Q&N5~9Wsl9EGmi9|WvS)WCh_Nb{ndzCozy7CZe*F6O9l$>77E**wCC1Wg`XA2axG6t6 zaum2j&u_M0AItHJKd}XaPU(6<(f6)e&a{NyxW` z4i^wyhT~+@2rgWou+_Si{{up?-n#bR4wUQl54O9ya#2?<5Ufk-`=TFJ{6|VC&jLCZ zYIvpXB#eq?lnJIILZ1o6nPS&kLSq(^xVTXoTU*!IDq;7wX}w;Y_(&(#2s!C#m+f#g zQhYmpA%317_w-7+L39!b=Y2;BhfUk5gCn{BHbv2o;z}^K5aH z!X1t{AB#L@cxR7i;@NCWko_7-mU*;U3S?nm2`jwH#3JO7=STwzJZiupE44P=*qPwo zJR!&B@)4mFs}ch1QNn#@Xjb_q*6KW~$gI+TSP$?pVO0~>3143~z-sL5POvr)TV(^4 z2v&<_Q)5R~&&J07phcY`TWn(RYGyZ^CKzI3U|e8gJS!(~v@6(_&iHlw z1R4_(WBdSqA@7XuX)7ZP7jN30bDsBip7(kC^Y^zO0P3h}NH9Edc_19qd*2g*DLz;vhV&EZNdJ&wsrsP9kUSdp#4>I$Y_6eru1j(9OXI~8u5pW1?<&>ULii<3KA$D2uiAU%e9 z^Q!I^r*gocoe9t5{Sbc11w(1pTYKOR&(+OjPc^Wm8YnTOEI#&#P@L)GLd#H_g~Sam zlt$QF3R`B_|KGB1H!8fX3Jr$5aFol|cr0e~nLJDbmYqUyWnN|eDb$VuK=P~UudTX`9$^_ZZp{PJl zoeqF3mFBQYUztdTH56&35cwE!NJ^zm*Y*|=R_VgEkgy)9Vgl*0jtyccR%sDybKcDc zu}c47ZDS{9m196S)5e1YO+x diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevFileNoSuchAttributeException.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevFileNoSuchAttributeException.class deleted file mode 100644 index 0d3597c733806049c9a4c44b2c44cf27573f9f4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1072 zcma))-EI<56ouEO1EW(~DhNf|TIx>)+K9EiFxE6NRFgKOiJ@}AjSln##*8z1W(JL~ z;gfhp;zb`o-^0f+?lUt|f)%|ve_89>>+EyB{rq|kU=I}?3Bn_34uw4|9~)8skRAP!#xuQ=CGKCfq6ovX*uE~ zc-s~7)a=@VkZrm>E?{yQ-p7ZUKd?N)L*pAMw^LB)#!B?TyQi3#V0hESU{$E7coMtN>3+-j6(hp_#> z?oKE2-%|c^9`{uvumOHP{%wR3l1TBa^DcoaykjKh zc}(-kF3-esvNpoPmr#=7(O@aC2n`u5@hTmOa1B}BDL{@#1vp@((xz%#BV3;*WVu`} zBorc5Okh0W~2@@E&%PWoR KY%)KAd%pl48P4+n diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevIllegalFileChangeException.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/exceptions/SQDevIllegalFileChangeException.class deleted file mode 100644 index e69f2d8b5c2390e67c1411598f8d346c10a0e97f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1093 zcma))!EO>!6o&sp2S%r~v>+5|v7oI|+Q`DjnACJbHNg-Q1F~S{?eqqwoenrNP+!7_ z>5AyW2XN(sxbX#y=gy2su&r+Hopa|u-}%qE_v_EkUjXc*q9aCl>WZ;+YTo-3Ij+eM zrX2d#!0~FWH%D^Zux;5B_Djo_^}cX=^2Kj~4vnyVQ|?qsSn;H53A-a*kJ)b(TkK zblc+CmV|V3U~&P$WjKxwHNS6pglEm0Y+m2u0U=vyo{F)k+1z`r<-3;CJJ{(cD_LbF zL(tEq=ZRim;V&s6KMQF0-NA+O7cmNoktf7WG4hy@ohkN5OQ_C5A{SRmLu;D~TO{oL zZ(6q-Cf-+xCBmw7l*`s=ICQx?zB0bAE)V&_wfx|ZFU+&HD@-Gq)lYH`ocj7%>onYxQkfeAuSPCpdLkcVWl?+8# zMVcc8$ndHFhpbfEM0Iz9JM)Azm&*i%T&Ri&tVa%O%uuZSRjj-7tQ@n}u3@cXBVrXJ zR)gDD1JJ9xdlTH7hZWesdH^ehvZ*mWGRCQ_*kIerVkyGDV-s=48jLMwwF%1emvU;GYW24xKqfmzRLNhk0B zP?fE`JgCS?wv#nZL zdOquK7ghwsHv;|31Pd%DC|k9r>?xXm{_%a`(cc2S4T9PS0*T^dt7YYDma~^H1)lBf zEeH%$<*wDN1?$rHtv$)~+qPo|ivrPfrYsO!cB@iH6z>}7$3PrI0_m-NX;zvZg#@Om z-jU>+mM2Ze4a~OI30;2&0wV@=^l2Cs7(I)Bw`td^($n!C-q$cjZD%tKe1Izg8Y?#C z#;(9rx=Y2z&SO~#7BXE&p)eguj4Q?_8FarAKF^fnxGIp^tVzqK7%9*ffpD~pF>*Nb=`o0KAm^d z2J(u2ukGx*UR~f)(RSp$W_?F`Th>mEy-F0_3MawhJTMLqW5K@d3(OVYHdFsUk7OLh zI4!RqPsHVJ!CU*D`&6MVWXdXYPMJKb;}&jf;5-eTcJL(Cz!yrsz9)~zOm%$8z?Zl~ zAlqN9H-aDA6Za^NWgcxiPaOBDBhXW^nm(0|bQye7mvH^1z^Xi1w;FBnaePgeAF!pa zbIa7gwYbvlLf!T&$NRYJ?zjg!3MeWC>jKGcncVnhTcQ|44|*ACj3S65rnZUqF*PRbD^0)v zGcGZz@?7wm%^qPen@BvzaP}pV53|2w_%~cWLMkzFhz}2O?KyH;aflngFgt>e`JW^b zFv1E0#2CUPPcj(ACpX-$FOya=4w^RLjaE{9nB3Gu|;XV6r*p1mIOingt| zN~1voPI*mX0oSmEDb8#Lt7NG-njQ2Lj%!%qGr^qRHroi+m^F;(KcpPdAT;g?KdBnW zKc==j)bVquV=4CvIth_nA6u3yK11qE`@UlPn4wx&e2K!t+~C9!zFjB(d*7*Eb_Ar_ z^D;xjW-*AHv~~{DlrYatT;%VR{L%^erO@Dcl7D~_?N{V`5be{($a9N91l#`tB?^zC diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/miscellaneous/AdditionalKeywordProposalInformation.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/miscellaneous/AdditionalKeywordProposalInformation.class deleted file mode 100644 index 5ead43c500adb9b43dd3954d0aa3978035a550e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4611 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 diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAnnotation$1.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAnnotation$1.class deleted file mode 100644 index 38d133056761aab9451c24080153dd474dfc1189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 751 zcmb7BO-~y!5Pc?rY?qXel=7t>eBb~Sh)^posZd%%C8QLoO2ysD4vDM92HT1Hv)U69 z2Yx_*RK++OA=KtT_b_if>o;%a`S+i@djRjTS;36Jo>L<-b$^r5sED6+PW98y*A|Up z`q3C0RM6IJ9ac~l*nK`jVD5u9IvfkEZnwXyk*ep)^y{7AwCOj_b}j_UCpM!LCA_F& z7OB9eX*b)?7j49@i*0S_e0bF*_f2(k5~#IpPvsZN>3E(L%VD6sz`=jC-#TmvB*7Lt z2&`=H{JU9#8t<=u>Es?>T)PeN6CL;9ZL@c|TTQ$n!i z@r!X5b9}CFc7*b{lI*^HBW{uW;@S-6Ii`%jBH!X(oK+ct1TV3`$ck8+^w?*N|4Oyx qp9}>(3IMey)Y2pM)fDQ=-_*4!)Dl+50&7@jEGFOJES*e%CLRE$?ya2w diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAnnotation$2.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAnnotation$2.class deleted file mode 100644 index 91a7f6062c521572e9732a66de066b496b02f14e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 774 zcmb7B(N0rA5Isu^y98iP`dB-O;!@V?wTZI`UOb$5HiXX%p( z4}5?hWt^prG1>>*hdHyeb7p4G{P=l!1>iXzHn1SD=T$|v9ln%QP3>E4sD0f3*rh7D zudQ`aMeXd?K?8Mx-J3H6mR@SB<12xU?cTYnRNE*!Z19NWUUz_s2}9Jx}U zd15X3Bcno~a3~>o6X_(oh$X%^*n5HcbtKz;`bd07_Kjl;xXm_a1Rir1*J7{92xPc} zWk&9Zm068vjOne`TK&o}rKbjf{DWHiO<{9 diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAnnotation.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAnnotation.class deleted file mode 100644 index f17458ec05511ba54e355d5699c9d0ec38630401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2847 zcmb7GT~`xV6x}zIFi98`qC^m|*xE|MN2*n<5-AALrUXzT!Dw3@!U&^b5@#k<+CKJA z*tb6U!b7WVaMe{;-?~=+Mc?`>YR|bdny7It0oKf&d(X!{=j?MXfB*OUGXSUXy^4T9 z($=>OE9Klwk^F}GaP~LoU~qZ&2nnmw)O3t>9`~t$(!qz?$&HW zAkj)D?QKd}dDk|r^@&N+YtJk!&mSvH=aw^hfzca#M3^p>P0MsA1(cygK_EC&Su<3` zDAsom_1K9pLQ!;~TSFX&DB84dG(Pku>TIGAfk3Z@5ZYAq?akH6Fw`gxqnmBKr$I#< zua0Wa&>^rtXIjQWZFAMIuj;F1N@grqDe2{cZkzlqH=|I{O|iNgCRIc;odyA@KrJ9A zu1Ar;u!^KWXM-JH88nPwl&#q&apmBUU%lo+g^>~vQ*7jfhLboh5OrMLcAXW|-3a3p zoeuKpxP~+Ml$cYhSgvkb1h20d&&-By=Z$+c!zvjQ9;$O1CXg0TO>51#zj*sC5oFo? zq=wHhMPzeotB&N5Kzt~hZ2_6ZFR=Iw8*D8hkkJsvMS;{%Vo%JAQprBokmbaM-HMk; zb~&dZhk0TU1*w<0Uz)>TT)ktITnd~*Fs*9MJsUb;K4S0y7<=1yeYa0`B$9(qy6HyU-g^-0V2RB=tT5k(m^VK-mxp>4-CHZ@dGr66^l zh^0z(o2GV)!e^Tb?Q?<1OL3^uBa?rsS?vYdy$nSj4z7lKs0o~IHa1h%9cQ8m!At86 z_VIl|+`G`M=Zj_c0)q2PnWr(4uhi_4!M7Cgqt%r)#@+=cn}9Kj^j_TYMWSUb%dlmT zhBJGV+$(g42B&&?Oat_$QOi5bS~`u=I)L`h!#sFt9i{z!*iR>&^z}8#@z2;(bQNO< zlwBNrjGm`BT#WSxcQNo7M?!x<6qQHl$rpoSKO&^;Bx9e{aryzel0msVTgUl_2q%MeOy{0pws-gdULcyIM6fw{p{OS3>$`099WKd&-1sJE$&QPk(Qlir6#d*3v(ir8*OuuuO#yqVH z$jD#^WoXy1fJM?B#V{_@ig-?Gxk9)DSfc#_v~|X3RV1F1VY*Zk^amkS`ZQYW#Rw#u5((OpH zv0<|G8;V>9FYc&3T&8jsq`|l+>>DICpHe!*k)U{|omK*?DAAKCWso&?($8T3!anJ1 z7i;8-cPR6>R~kNJl7Kgfw6_o=D}7{#$>aI%f9bm)rpza2krEQ4|Nrh#nn4_=o6UF4 zC1ZxgA7QXKrzD>h(@frZrSA#uj=Y{VAssQ)2#pcjw~-|9obPB%B%i?f6XLCU6m1+^ pzTR>2%)R8X`-Sv94s<37eTUC6gOrA}|~;ew`x zdFH*B)G#H1X5U0Ay;fEi{xVqgiFN|VtF!N)bOi!$783|; zAGH6UD?n2qRJk|3&l6)kJ7e+}G*Wr$13VU}ja2HmtBrZwMOII|Hd%lj0dR1>kF#|yeI%{ s{R6H1g+3~QZr_ErN};V1=##t9-4bX8Pv^Zo!!GN^(0go!%jR*4-wa#FD*ylh diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute$2.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute$2.class deleted file mode 100644 index 71ccd2452ea13337b93c5a90dfad970334dc693a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 837 zcma)3T~8B16g|@xx~>(qBI3ux#y~=?SVN32H3UL2A*m*&g!k$0r8{Jusk5_H|CK(O z_}~xVM-lI^r8dYzH`zJ&&fIg(ow?^1zyAPugQs;=1lm?kNO$rt2~EoNy~?O_IQZ0~ zi4XUkvuap4+SsY1CeT`#Ah7&SY2|hW*0%a*aw0pK)T7RT1@)+V)H)HU9hihdRB@|; zC4>U|H&yl*_UwAmyM3kUWAS-N_E-)x5@_~KEVC17mCvV}HJ7SfV0&@(jh(JQ;7oY~ zfz_?n|Mv>eioT{~DRO)`w&slGqC7Q4mPA8}N*78ZXV_t23LBFjn!x%E6MW@oz`Y&nI5RnG ze;}8dM4)k`HQ9qq<~iki5d;s!e>MJ>u*`X#qqm&<{oqCWnfQg^C&v}s<~3vlo^usz zanxYsI^4kuBRk^WRAZabpH-Xpe=wAEZvbr0QL8iRgBkVZlv)wjne91dWyV~cG5?u9 dyiR>RN4+ww;?ZSm>v+sq-uVef;j{tl;V(>=xz7Lq diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute$3.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute$3.class deleted file mode 100644 index 538d3fde5b290b3bab498f2683f39666d1e0f857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 828 zcma)(OK%e~5Xb+Mq}}Zj3WQS1XL39}KdD@{4trla zavaos@2%<=UT*G2s1ceA1BB&wN-O_?u)fv(CdQ(b3q5T0IH4Z4kD4ch+JVVrf+|+( zSVBVBzb&%6aLsl|datXr{8F6tr9Bq?ToM{xGZ6WSuqxQ4v*t(25q1{OzPZ~b#NJFh zAgpaQ|L-eCgAjRXtx%ef45jbLQ&HreusSi^z^ZevjE=ERcz-;SskokUn#ofhnjWT} z-DQ@Eex{sbCUqlIbE{b(S25yI5t( z6>-1JvBNUlRT~d}vY6tb0PuDWtrIA1F(m`hZ440 diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute$4.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute$4.class deleted file mode 100644 index fa12e83dc9656d6d4ebe353c3a7873bdd6a86951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 851 zcma)(&u-H|5XQev(#Dw3LMWyDIqac_hEjZqxCEhAZILRa2$ZN?xH$GC-pbuA-gS5_ zI3aQ10eC3HY~zNg^bkw-%&hnKeY-Qi|NQ&~po?cs)C6{mcuG35Us9URzVB2{(edEp z5lwx1;9Q|brK9a`6AgjR(tyC~8>N+dE3moKKaZzzl*f7!4Omc5dMBMTfySXpDMTH2 zT3A6SaB$ns{?eX3FS_1Wn%w;CBV9TsJv;&9z?-UhF;>KM;K9yoS5{ z4LJg*yoIso?Z7dbS)k^lez diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileAttribute.class deleted file mode 100644 index 06e6d37a85f509a6ef74b25e89f98cf33d4cb42e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2691 zcmb7FZBGIC9tW68ApocpuplK;GH70td>?)sRyB#%kgEn71c*HjS_*mKudGWv>!J=d4AD+>Zz za%wV@x_K>=ofPO9e{HlufxW)jSUQ^;oy=tO0_tQcn@y&#@^memxttzP351u7V#O4Q zjqkY5k&-<}h=$bFsfo_%zy)AbN&(-B5Q#lf09oryx#(2iyaaa4yYA&%7qaW;ym zh7KR%O&w7Qak3_e{wV4-bomfHI_eRTeBRQbqme}&w`}ujWnsoFPZ~2tuW+S;QJgl) zmVEavH7ICizTJ7t5s1#2?zCUz{oV1GlP2Nc(V?M%y3V$4^Dg<7Rn!PKX5KL>MVBx0 zhO_;`D&NuwHl*V{oE2!yxklmMgs~VfZLpl}ZWq`UpY}aZ^Vgx7f7akdfJ`?szRjBr!hH z@v)3M>X!Vul&n70@fi#PGccn_;ODZLnYn8gTn08ft~ z|B5rp%zFuunZHyF5cA<)*==nC{Qg8n+T;!dD7nZy$!+9Gt`us7u3{6^!$qc9oL$7TVdvxJcJfsD?p&Wmvg}nJr|@$=p4=mn3n=Vjfr&( z{s~oij8Nzal@u>kKCv&Wh&2YV7pN0PUBd|b3d6YQD1$B$Z{$iMmRiUAE7+S* zyyKO1WO$kLF89kz9_1yKA2X*E<2|t{@8_`cWD_^?=fh72Ldx)Cw6=v0pPA@g$L*eV ze6oUY=*bs~INTh1^z3hChw*^dR$r0ZLzeez7Ip!8v@3OZbi({Sj{9d(7Ym z%<{Z|AH4`Wywa9<&laWj017+_>NZj@!nDe$Pe5&NzIAq*r@C*YGX*Z6b*QkJr2HHYD38;)i4r4VMt#{4 I$Sz<02Ub^3lK=n! diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileType$1.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileType$1.class deleted file mode 100644 index f4d1f931817ca068094b835b7b38e1f98b923b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2643 zcmb7G`*Raj6#i}-*mSwjT1pi~K&X(klvqJT0@%<7TuGadq?NWRZqwUz%Vsz1ZX)0l z6yNXH3^V=_%3uH;A3rHqiP*_P)+{&pF?D-2DFUkG}voh;J0M zFzj*ks<2}2g&9!|z9$V+#FDu)!=fsu`AcQdGoT>E(6bgbzjJjbw#aVD$OZopw2QScPQ_PgRWc>zZpM=2W|QL?KdrMq5E6ibvLl&rfW+C9|! z@OT(hY-*{z;Eq&0$dSMaDn`9r7S;^I!T;x2aI?(DVUDCsulD5GOgft%*0RZ=d^$TJ zwVdL3#t*G$r*lE2NXWAsrzJ#9jOEh-Oy*e?8DtflVdz+1 z4IDY-DY2`%SrO@3ifClANfkYL!0Tu8jUa2(yR6g*G$xLnVP zieb(OM_Tft)On8jVk2GY>3PbJcoWqsrl89vHZ6^7mX2W%`7Np{C1+(&iVXeDBv*jz zR#AFQ!Qf~|M;p$gq`;)&X-sXuc`s|*3CprQzf?IaP*JbfPK~Cs)ExFLsqTAY{qAsq z!vUq@Mp?OT-qwm1l>qr0SnQX4g4n&3GF*?Wt>9$^Rff$z%}b9tE`q8oNd$xZO_2|e{10M_gH`!D025D+Ms6RBa#a!XIinqve*%pU3!2= zgg0kXMsm%vgfnF7t}EQZon&z<{VRa~U5E9wR%mqyA%7>_+qaF~Lil^yYrzKksx$)K zBt>`8jME5&u@ReSB#r2(-_cK_JZtT|?>ia-xKsdaZGg5eLN_l!*;P_6)%@Mt+4Tdu zdvD;u-kaE2Lr)FS`s_CPQ^EAWb#(QG?%>H5r20CK-NDl|Akf+0<>M zgN?CZUk0@%U=!N&&bqp`8T{?!<#EmZ#Sae zA;kOgw+uyUCTP36hL7sX>M+Sst55MH(F^RLVC+H{dT6!>QS7DXD}p2Rb{@w*4AXdu z9=y|tVT{JJbUI6a?yk^lbdADyoyKpeQQsoOuk_6PN#kEQ=JVbia9ihn2mZjP_>AK6 iIcW`p{UaZ*!(_`Bv~Izd_=?6L9loZStS=cu4B|gT|G=jJ diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileType.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/ESQDevFileType.class deleted file mode 100644 index 49a54e4d6c91fe2717906c492aa3eec8f85dfb5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4031 zcmb7H`&U%g75>iL8SZ4bpbmmT(cl{fb)rpdB8WUhGZio?iXCm6Uf_yjhC4V98rml5 z!zMMYeWh)r>C3+85Bb4rL|0vP<)?P7{wMt>O22*XW#$e{7u2sT zS*yL5=QjEJU(GuOCqKv2^+TfSLtz(lJgVSoylT%O_fRXi03DnIl&{oNg?qR`c3pHY!3!W z6EL(=9To;Ks1RWm4>7Q9RVh&|+8v|9Aq!^&u{G@!hu&m%7nt%fB=L%c6h6n$+OxBc zJEd^AmQ!n@?UPB}NgNYOM=XpArcL(Lly=guk0@Rx&qrqSIbnn;SiF`gP>g=0ylP9i zvn6hrO!r(?()~nD4}x6$&zu)e#w}dJ7l=rQhPFC8IyYD{67S0vuHcJ2?%XKZSst&7 z(n?@23lerI`aN07=XJMe7%SS7Z;aTpI-yNT{pciHiJfs*t62&5WpQ}Q!Wb?{N?)}w zEw&Ak$ivbIM(r6IvG}3C$PP47D)P0jqblCD=qO8fuZdlE=XexZ1r-y#u7w;XXpPY? zT*?%$Nl0%tz(*#2S>1Q%3q@zf z!msda4p&-zmHpJT{oM3x!&x63`wjZC4H=`)rqL*D8~ltFR=4esad@C&wqH8n_Ojk^3B?mG{ltWsY;Nk*DHl;?7pS4N^}2 z?RbLbbbOof2+ux1Tlnu#Y2!ZH#vWkTU%4GZJAWIs3vrrjp_wh%t#@RX7YkqEEh-d8 z&nCLs9$`-+zV{*aC!XM7`Vl%GqN}nz%w;m2Si;fAc<~Xs@1u7Krw?@VQ2Q;dymdW_^tCX zE~Za}pY|Fj7x8Rsxb4_*7d@dj=>3R>#Vzl1l~tCZlRZ5X*YM8= zH%yStuL-Roy-Y4sH1O41CPg5OZ{RHtje4GMl1lcW^ohEs$0Nq^@FLE))-{KZjcyEJ z{OuK#-{j)3p!{|j<;}2a4mU^cF5j!*-L5P4Lss1#wyg!`;~k9SL#Dz<8h1kTVV7~+ zxQXv-+%~U4?-F+tGyXj?U}y$r5SElOHSF)1WKk09eP9^}0$+*T`ySw@a;Cgn;c1x_ zRS{TGN=G;}JoXqWFIVds``iCOB>b_lI#cgzOkOS4`>+MCvp5OyEi=S62&ntkx1k|9HP3AZ+v#23_CZ>f4sGgo`uhqH&scxin1MfNvwvh> Rh(mwEpZSzZZswC+^1q}NmE!;a diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/SQDevFile.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/sqdevFile/SQDevFile.class deleted file mode 100644 index d5f6a57800661ad209ad684a5a6dc7725b5426c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9557 zcmd5?d3;>eb^gxGNHZEeVIz5yjqq3oTg%8w3>ad8ZCN&0APMlkg2yvY(%7RJc^2C& zfu;!wG%TT{P%D7|Sxl%&AtjPQ0h1;zltKzAr7e^uA#Fk-5SFqOFzR>Sd-F7sM__*a zr$5_z%f0v9vwY_}=RW!Ij~;v&z^Rh+!y}lTj_fg$&6(XXbC3P=?0CX#UUT6JbC2Hn z;S(4;BYPsv@l>3Afu-b`oWspPu$6#_X|P|=o3X0nlFc6}s~GfS@c$)XZeoWFuMAT_^ChrDA3fUQ`(fqC5zyWMCSm zQ%7@OJd@1`ymj@P{iqg9AFt~2Ts#po(*ev9l&$SGL*4X7D2N%TQb{Kon2nIY-(zMk zh-7;OQ|juEwpZuZ8kmcdxM`%n-%Q2?O~o8@)LKV@mH_542%%WY%!HDuY{*i5jtZ_b zP_H@!vMJlWK~&hRo&IPfx!R1x0%#T-r&hS34h8U8!SSKEEj7(qksS$>f+yKB zPBn0v$_P-#hIBk@25@@8g1vlYEf7rVh$qdiT;C2ey;ffdDmzk9LMB4s@Y#9k%l5|U z@;M!a!L*<_7KAMfUBBhh%A=gZu?ogHx~ntNZ;AC|8ND+;c+}JJanj5-uUp+t;3*Q? z6bY?#g)KNg=*QW4*gLNTC)ahP(ml;)G!gI5n9b2t+H6jnnN%)KtTnf*$`o3TcAV!2 z^C9#}vki2hlUoxot0Q~WL7D=BTH@yDwYg+A-e)$qE4Et7aX#w&xPY+x_?e2#D!Nax zO36j!j}OGq>Slp>0^RH}>PEL! z<@awt-(?d&dWtA*uks^4PHFpn5WUzIL^l$uTi+Pnoc&a{3Id`vOM2Xq%bLuO1$FgX zCPLL78%GQMMB!6)XgoYj!~hNOsZt93{F+X=N5Mq>@$!= zO82f~)+D*m${;RkJ|>sBD`>%0 z_=+E27BqaK&)ik&v@a3_>MQqUChshD%AXkcV|-DC(<$YV(MhEIWAKVQpCosjy2X9L z_+Cdck7rnG<0SJx6%bK^uNzp84M8l$%?574pL32C((}6o^9qa1`8#%+(QHeR0u{gj zT^m#x-!yQmRW#z6m3{r$OZ45h4BW0I#z#c-1#qXp)7-2B-!brAe2=kb50K7gHpI0A z7OnW36(x5W_`Xgrk7wLy2k;l%`Ye@pkAWY6y+a_HN@gSRBx5?OQ2(~xNP3OAJ7*@N zWZlgH+{cwx82`$^{VLd?VAo#(401fAk`Ebp01vA3k}-3iI;NY~3k@KaSFz|wBHA&8Cm8v}m}x-F0PvaLfJIZD$ z+ZoA5do_{g7dp+(;+CTmxW3(5*w>#hv!;?P;}XrK(`GWOx{?@FZKd%U_Tr;SoTf$6 zJ-I$Ep(D6tsynlQH3{U&j$k+HgbXu?&12SD8_c*5%9sCc;Fl;DlDg& zl4v58;YNOih_$rTnnNw8xO=NH4z)6e`XlL#S+McOx=+EY^`By{AOAIRkLq%Ed!{|f z^o)=8wi@$S415jKgLnzAYMFRk-~GYB^9cFz#yCLhNc-H~5-_Apb5&vKXsoZx z4KWmn0Roh?nOKrZz%8|<hr;tB^^AC1!WFiW$~1g4VfqNm4+S9 z(}{UNk6ogGmU`N|jK?8qiR?LR!Y;bA~Jy(y8A`RKbeEENv^Sj|HZV zd0(WC=_&Hnfbg*H37w^V)F&%A8p(P^89h^gsAb0>z_qYIPlsjd*ZZZ7N3TLSjpquN z7=p4=&hg9H{HihGp{O;(j~7`(R*B|SJj1UGT{-2rqDi@4MV@C!hwz+M8qcgv=U8xj zb(`y%t|I5NNs-h1a-m?+$7$$%lu%Nm|C2qV6djN?+`282oSzNRabp>69ebYI&<-;i z$z{wCSu2vzGJJ`B;Lil*0#x~BBfpmvZfz-cjKnsN!7&T*Q`Vi1^k`GTPZRF_LY@*7W-jsst;c{f zcY3i7i07_KcYk*#(|e6|z}MKZfpAOr0zCv_4okC_U(?u_p#-J8`uXHR09Cx_Cnnw- zd{fG61wW%4&-*ty)5Gg!4UI#nY#79p0n8mn#in7**i<=l2q*Ae%^>Dfp3EPEm_LMu z!+h0fO`Bv-TTn3VGx=!?b=oNtO5CrvqL-s_`l6S<*fpUqRuuEaO4k?X6!FC> zzEfOGZfJY}tAvM?F2N8k)L?n6U8t9h-(gVufxwoGTg5`Hzll=;J6gR?Hj=jn+GOvM$rlJYd4D&YAD zll}N3KfWO4oXAfKj)DcoeQCULKP_t9)kTfFrigK0{TSn(pm9H^!cWn-r>XW+H13%R zjJuYAvW>g`V~o2YZyb+4wsD@Bv|l~>c;$^948ToY2XK{gWaA-)~x6^6(;` zf@4~BNzKB}MsDz=?>nGi#mH3O9V0LM4l?pyCh2}M%3A)@Yd5a3uGcX)^x4Kx60>Oe z3w-(&i^+?0^>6qqga5=L{ElvZ8O!hr<-A5IZ(s{cN(^sP(!1!#d&uyb!~2wb1YZ>o z-TxwPCKV4z0JrgEbGz^hiB#yh1&4Y6m{eJzTg{#5Z3mZLJc@s`IK7;Jdxm!&+(dos zy8y1oKjB$E=U5B=nWH`oFk1hDf8{*I{d3j|#qVlVe1vkA0_*R_rWtblhp6Sl`;ZaF z+UFDsKR=UTgiG_4gF44bM{pcUof*P6UjQa~xQfSNhcoQrYO}@z)JQXS!6;^CO@x_z zBwuVCm%B0>Ua3Vu=Caj4iARXJ2+MrSN2e0_$|-i;^PV?^w z#iL#rAFLkt~5TZz{bQxLxKZqvv<8O&5yHx0=FDYkw%4maT-kU`B%L6DM#!H)q@Oy19 zUh6!7imqY2zNu*lZypX;zFm3aAl|jKy2MJQHtP4m02U78Bdb@b(kgZWUvhX(m3a7* zaKt^xG=1ya+T(!CZv~{$b=snl#2Z0-S(qq zY)N&AHC-kzsTshOaJZV%hxkLLY^Q+En*Ag9Rcl)78sB!_kPK9owYagm#M+!bn1m?| zPCgSa#fkLo3ixFuCds*&BIogB*?~Fiz8hpUPLnk_Q`YjAPV2Bi)+5Gi51)6*W@Kaw za&j^D%642PJ8*?WajnGg4e7x>633A2!m#w=364D_X@0)T;3ZyPmKv>E&H)e z2C!Xj#g%d!srL>B`%c^{-zMeW!7t_C!(DPWgZ@oCBR{Z$yUIE*JnIJcSviF%%=4=o z+%WETf;-m@?v*&h3aJ-&VyYELpVcT-qIBkHAW!)K>rbF8o=}|xFC@wza|h*>tqj|1 z`6Om)hpS`}10rX1>YavU~>_NR^ybFvPmYa+hz3rYTzFAsBL) zN%Rx`di^kc_p<_$+UojXs{?QY7dVzHNDX*D#3X{U>;o1*wQ6Y*tKuX=wQ7E$RTBqW z6)b42xHE^yd!wUY)_vNq3#>koGg%LZqh%*zv@Y~f&)Tx3sa8j|gU z65T*hKdPpZkY_Lrtq4^~Hz#plPVcp+FZMM#Ezl~>n7i%tP{yn-vGT{K47s?ZNl9>u z-j=Gs>Jq!tQX-vGU24l>7dG7*WJ9fO7*$X_bTu%!c3QPTma{fU;_!X+?F=3OmoklZ z;vIfh&ZpBwSg zTl{s_+xV`$gCEIzctqaEbMgURkRy1*BY4N-!TTPccs-?~yeavvo)K|irFY7G9>S=> zVapW0Vnx-98_3;#9QE;cS*Jbss?kV1tvZu=Pt3t94fvRP)lg!z01ZhH(f2&3q zey`Q8?B=7MfMaDuN5AZL;Ob&U9-&12T=4vaSjk6r99L>=^PMk4I}t;&1n{zo-m&CEU?0CH?7aRiTb>gsC26n<{I4V1a}ER ll(vFa$7vmWNyylwtsA>_FE_2zHf__(y|1)Q)7DKxzJF#`T4`lL z5xX<<&;P&wo!@)^+t%o@4D_CR1UEb@fx|&0@5chGUA_Djjzyoy|!PndvhDJ+}t5z78ERb=RPy z1~Cn51vi%qJZ!mX-_cUJ0lVKmAH{mX-G}KXwli#I60SXLCeq3;e5XjHhvN_U=wx{4&xxto{;=B=?bi9i(fQX$p zbG+1_XgH?0-KwJ&u_(3+F7?^PgyEP8rNGcGwymDkS<%U#5P?K4az*1I1jrz(8;lMlO@IorJ9>C;E$no`@b% z*B&S+VokAFFQq@@Ca9c*Tg>Ner=WN$-tM#elWasl0H&2vetm5uw@Y`SNK2_2O0h}W(=J; zq@imH!1<1%<1mge;JlD_k6VQy!QvVGso_KnyU?Sfwu7-^Y|M9w+S7r&6Bp zwWCkR37q7R`2ZOuh)kjD<7Kv*Bb)ZFE|Pfqp>^#Vo6FbR{;C>xva2Mf3Imi@qXVmLq9Xa)SY2Gmh z7znwvIb{+to)MKR2=1tK*(o!9cT*Z56uRJwsO28bXN&>`AvY(YV5aD9RXCKei(cR* zCU>0<8fO@aMFu8!cP=o77)i?G7>aJ<0>l2C!3eiV#g5`U#q1q2r%)SW(qud{ii;i( z83t&lQKG6Sc!;RNf7oMZDrRva-vp51?M&)KB4&vw9;8+_G;MC$sNCnh%6;B9%|!wz zQ%Kg1_v`p!e1IO|L8W8%DgdaTEu56;K8O!#cv#@4&mjFzBE{hedmSxUSsg!u57WrX z=O$kC6l{mO-x!2$sSLPZW%=Z!=98&uOIo7%F~M@r_nN%4-IO<25#$C_sz^9%WNYzJ z{Dg)d7pyNYFs@5k$4@F%>8@GmwcE@AqnIs3@l#CF<(utxhIhBw>7oL0x6N``%-9Yq zj_|NMNEs{9B8H#FqZ%F&teZ7px=q(EI%%^kV}DAp;d;S2Z5h>bkwr+)k-Z1a3-rm1 z+f+DDF@A<9nRJ3JTpDbE$#cpa#ph>qd={S*#Azx|os8Df2J{-!7-rbdgkrwfmYq!H z^2LHbl~C~nepbU5NUvOS&rSAPS=0B8FXHD24Wymft;(|!`DwIffMLb(h>j=mCBa-j zj!L|;fS7^HO4~FX)9~eKNM@c-n|Uv>`sGC{{j|L_7R4_LR_-;(eI~*D>}{*UKdWlI z#F;?nF+7E@sL;D4Xq=ss-XX_6rwT(a89s~WH9W^f<(``+2W7S^3F-O(uHyxa`ibkf z!k|0@NU70JiKV!jMk6&bwWSu9@uG%tg6J%pPA<@K1uxNJbdhe`CX%ZBaYHNBbZ&PQ zzog--WbuX<>G);*ilEj55L=xenDy$J(`McGu;Wc-MEoifan{P6@$sS-uj1D2Dr-z=-tPRe%NA&Nioi?ODFrzYi}O_afdK(`j(!k=sS zGr^`xf&t@`If92mkCj%N8Q^?D$6w$teT#MRa3<)wL5s~qxZOXVP9`Cj{`3~h2NokX ztC_)C{0;t2!`}+F-x#Zv6m|SP{((hW&f|9bJ96ulw=Q#>6{JWvIhC(}VjAC(_qDt; zihp4xaI|;t`t7y&HvV11zcH059%rYc<3ALlhKb`!w*S=eU3EsQ8psyiA>~#7t>b_2 zHZhms*k-zE$MWEkwz>`w1okgm!>ITkzOUi`=%ba|D|v&e0X)wsTdCt3Px)TCzNctq zGd+1TeFK=lKEW`LOKM*U=@OO*p@GN0U|i*m*<-mxAS!HN_&tiC3h7sDn2!Gx7$F#| zm8irtsksi~1hjRjRdvW*)*+r~rqjg}O-$yfz?ft; zG9~E*M}kyY{wodfNTF1*P?trr*sp!c)Y(u!JHnQf!GM;fr4wAB4wdDb{Pu}&ye^}_ zl3DE**X1T*14C6>{%9&gKwrY$D$ZJpzgOjEU2c(EeVvp!f#B3k$Tpkbw9Jq)-Wdti z-Ya#vO@U}tI%~T$!zx*=$sK})le|up2fD2BdO&&h3Rng4jNI!m9c$81ny<>5Llg5g zVO!&l^5STE^-(sJ?TyuyK@u?ET3)4Sk_=MD457Y;?!ic5#{MCaCgVEqiW3^wPwuXZNRIBA01F0I8E*rOXuu<_bMn;bj8B z<{6gFgzx2vL$MoB@e@b$4HBt@bVVvtj*S~;AXOnonQN0kH0^`c_4QVYL+UM9b3MIH zt_bDQnrvb3O4?PkU@p)1vQL-&l41qI(^S#q{!OaZDtFTguP8t6x73ivL0vkelN`0T zrFsu__po32|Du0CCqk$K``)~=b;)LVNHqn$E1R0Y{FqWSpQ|~W zO=Es9;8T)U;kBx940X?V(-#Gkz&`0>-s}DZEWuJf36@PPe$(3y=)8=0<0x+BWfZqJ zK9ALp;Z|PiFJf6^_yyEoL1SOtx~egT`P%R(HuBw;;N2GQ-L}bhiit236MH=ln>-e_|``Bsd;I|SYL7HSV5MnKL zbtjrB%)W`c7QUzUHZ14p4pQ^=^EUMr;+qew9mUR3wACFLMaM-%8zV1Z3&*;zpuH~~ z4v*pJDDDYftiFtU`R=|^q??}NV*cCDkJ7Wo&pLjR{Osaq4?pT%J3re-u%dD87_1R2 zQrGMV^bypIpn3%1NwqY4W;{qEc2G@+P|vR4dbaX1IL4OOJ;uL^JGpbpcXZYmTe7bS|}9aG&aI~J%~=-L^#2qTn}8tZOX_O zQBzm!Bztw|I+YbY19zGJ330uNH|_t4<)r5WFk1C+3X*CTj{+V~)~ z@esA}Axi&YPwve$H3gWE+X&=dK-c&u0edeQd~($M)f=Ekd+ zaVk5AzGlJ)=pl?N+3%|)@=QtSuvYDP#e~$d<}yCnxvuWh>*^jG#p9Rp`BD7*2q;=46(kiS-ZNmI=r=N1mB8li>o#@N8*vXSH|(R5U2cx z;38g$N3P(FzA=1#9KRRhIr$rX@yHndusIr!*8TA~{xpQi10>_>kFl7T(l74wO1pjUzTX|oOo?GJ}1KG z%c95UgyVWoJQklbE_Iv~i@c1^zVJd>(laj0I1q`)N}S0G?l{4xBtjTLOmR3Ww?AAZ zi>nq_KXGkk-~bUu_Ey{}^})4~?aU_GDC>f2Q-BYz6Ayro&_OTs=CPwiVefiro%Xjf2uHmYv zh66hfGM{~fMR-M)^P0fdq=^OIyVwfYjwfUf59j-M^i~-4Fj0`GL7c60$)y z((9U0E1S4BOrF0Zn`H~{26CExQTqZ{dLK;n*C~tnw&FJ%>Mwn&?f}$W&MZ#n`2>>m{13s=dY^(4rG# znzS;7t8dEt#?%)Yh4fyjb=MdpGcF5VBR>o*wFz@nlo~h{AWoRFDa3T2mA1ZD5xI2y zvh2P3QtV*kvqBI~M-Gi3a-0uce5fit9O1)!t@PB(r|QzfaXv=4CAG40)IQ82IX zIcd8@mzs|_R>*1ogt;0Gyf$Jpw(+{1?$gF=JG%H=%V|2$NviWS?jurVdG%A5O0uQ= o8RDJ7)=ikVUz7f8Sg3T_uf9&>p!({Vxbq$-$Ee*jSB50>1E9vr*#H0l diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/Activator.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/Activator.class deleted file mode 100644 index f121bea033bab15f883c021cbb80fd88b8c9961b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 774 zcmah`%T60H6g@YYWMBx-1j-{VDgr5hgg4z4kO09dY8S28I};O3hcS4Zz-K|bsKkN~ z=tm*0CsF7E$inu0oOABO|DGNm0erz~hyr2R%AQI^cHLGz(RDfz2eH#V>5L5#5N0l9 zPl`mQ9r3+&p<)-JOjt9vBTUxO;>^lRbz|%=aoA1Ui5jvAVQf;TZXLs$Z{m;on6HHL zu1>YvClni-r-b0hv{i&6CMy_6M3`>sRDJ7Swv_!TTZtmfHBBs&Q)#vL2f@Id>x@uu zzC9Qhi#o~;N)y%_o1+^X2VuT~5MzW==A`AhHX5UOewOI?Hda?on=}itOsKvrb(kSc zw(<=Q+X^ygu9*D8bZx9ov>$nDxZfSGfzRAkkxz+F^LzN?*yq;%R@;7RC?ElZ5$hifM5*F}*bBk>I;!8Pq wk1d}qZT~^-rEru7s|>8=0t+gxuE21kbS|1_$F`weoGw|%0hyVZp diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$1.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$1.class deleted file mode 100644 index ddd3dbde82a171b1248db7585991e7fce3d03d17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1699 zcmah}ZBrXn6n-w7CfjA((iEyz&{QcVp&}<5&Naj?Ya}hJm0nJNKM>_Pjplocq^5zrO--8{fq+CNS+=UFl|n zr%l<-c0$|97Vq1R+YtUU}=gY@c4f75xF`KxYtNAa@v_&joVw-P>OK@k!UH=H zc;`Rd%`WBz%$5v`KZMc^Y|j;#Or}m}uOrUv7lNnz0+*>@VxhL>6g-!9p^hm57!Y{F z#G80aV8RYc?!MG|6gSj?_ol~V5Du|+h;44^{j~-N*trOY8}cLK49V}8@AE0ou>44q^Oxqr;S89 zVPFpPs&h95rbcuwRaY7dCbGE2aj@EL={5y2qf}2}JPerEu|%*E8AcPhZQ>)9>o{{& zqp0#Vu#CGgd`y&2CT$`Ib~Nfpw-p}rF)t}MpP0CW31xWC#2VHG&Ig^npg);vTuY^q zJuk55uj?+FxUVwNLvJwA%G;+VO8ATbbuFhOw>TVg$7|i%dmcC=GAf>n+8FqX(QCGPRJs(%3O4i^`My-BIYO7A-OKiv6zNe~EonYaO!3GFi zsD)PJ`-;^bZl6)}I(|c{rg7Gf-jN06k}F(v8;%$7VW>#f&ml2Ot}Fe5V+DZ>))H)* z#+M2G^BkhQ$9TJgNME9-=cmPU=)X}mhH;(-DL8mBYMSIsQb5NATqI>gObmTwNYy_r ze)(6Dfw>9*EFCk|j!dt-HWgLQeuR2|#wW}1$x6D1t3Trk$+aHenE`#j@)C28;>qVo z-|Qh1U*y3*A8P98;SR|PNwbGl^?QRy51UnGlzD*%G>d;u+5A~QDcd!l*8~70g{De*Xf+GIFgFaa40U$%L zG`zwWs1wX6UgAq~W3=}06*&!$7Se{=biX Bh~WSL diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$2.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$2.class deleted file mode 100644 index 049d0837056c158f04b7b38fdacbeec4c442c9ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1450 zcmaJ>>rN9v6#j-5x-1LA%0&^eTvXahs}&Jl5Tt+>ms=n;@Iy0g2UxP~mhHB|SMX^x zF<>c|C|BtK2XxN355Qv%=fqSz9pZrkmq-hI^L$u5AYWL#xOz{GW2;NrOQ<5dQM1 zFPx&~It;xNkw*3kbYdSDr#{Kdd4l_d+DztNB%`38p(8JfInOHiR8tDRrQs%esfNRk zD});iqL^C{M1buv^bn^snQ3u5xJjSqbi0m zCM_Ok=xbteB-0Lt2O1t?f^aQo-(?tUG-`WmNtDwR^^UnzVyKAXQ3x@Hk%mjUnyg_G z-9(F|Yf$VFZtwRwigX8am%peEE%@RT7iYN)c-GY!)cLh;>dm#LV+ z%Me~LbYFE!gMnFwP?_5$v9V9;>v1=-MdqWy32J;m*>~%?yB}iv7q6##14@> zxvwBaSEnjiW@zaodNX*V;VsgX;)#OIb9C)X^_Zzc?rn>cl5ldus1y9peiKGSN4~Sm z)*z3!-IA9R^089%;?c&X3G`l;ot*6!=@qUC>Jai=OFNG6QZ_FZMR6fay%31sh`AX{+bkL~M46IWY)uNR~Gv%QZT{IISx@$EiX_m2o-t&c~ z>TwAGY}FkNTpXoWQaidy;1XWd`%GeRj)6-8U6sgt8h6o-y-KBUHM>?xlDv(<3X+OD z7$R(jyBEYhQ??Yb`V+&udiWfp(QmkahR7M>dXk1SOqntk`;O-n)#qrhnlfLX64Mv; zr8BIUu}gh=#mEnY`4RKTQWxYa4Ew8yHHJfoW3|FCfOi#dOsvsdHGN$wC&tn#EZ{Gh Co=D69 diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$3.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$3.class deleted file mode 100644 index 8d24ada66378127b814fe8f2a3bb2090dea24ac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2270 zcmai0Yf~Fl7=8``lHCSMQ!Y}mQlvGIaKBVd(^3+OQ7A1zD%NTb$pIENyJ2^e(xPL% zjN@g-jx$=PF$RB; z>jg2h#Bi#Tp_#>1k#S-k1*&MqaCK9a zp`AgT#3^ba&*z1aW$5wBae$Zd_rzq1a1dQ+UC6BkM3#~>i(=B!vS~-;<3vpW zJw&oX($M$t{@x*J>7!OEHnnok;zkURrW9Uq%t^~ES{CNu*Ix3i*<$(h_$q+}5%}8V8~>(v3MsJSg-=f0X?^Wna_`lIJb%kVLLYrpFD%~7Nk{*rw;YB(urs&=jfqT+I*oS-_cSEmj?hwMW}B# z^yp4#)pa_)hO&JdYMi={=7q=)cw`&LLnpTI#1@`>0PFU^q8?bU2iEU_4SHb19@wY{ z_LK+qj0bkc13T-1jqPIN3)@I;VKVg%>hEKB7q0*8-amhY57YDaa3h{y`)IVflCWt? z&{VyJnb7QRsy#aAJg|Afh|(9g@G`xHxQ9!oj735sw7dmvDkA&qbLFu_V*?avcLOch zKm<2&4!4lTCYJFUJ>S3`+{Tx96We$Tzu;~BhIjBM-erEg$3pmkHQ__nPHPl**f2h3 zv-pH9;ZycL?y@g%kA02LUHx>EN=PGR{rK2d$dR%b<+uwIdHP8*3p%RDA zkXt>$5IdJj1{Vz3V(W%axaDv)u-btq)u7rebs6-!+ZQG@tR)bI$#A-CvbEZz8merz zq!QQT+n(?`yypmpbj!85)8(EF>v>ZThSFy^_(!f#sWK!6B52$PLiy5F44Go-Z+Zi1 zN?*1|BZd^sH|e30J9SqPFEFsf00y(|jy+q1J7Y*Lc2^FUL9rXkc3hv9aV3JG+b8Fy zQo^e{-1miFJ0t~-{syLJ6fvsfRGmSec8sIrJbQ!jO1%iy=`;y}N17rnx+Mq!0~<&Z zk|Va}8YhI|H!YodA(+ua1K{ZgRa;QEmrygmsn1KO8nRP^UF;FglJC>aoF_mH-}m2u A`~Uy| diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$5.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$5.class deleted file mode 100644 index 17b8d60734e0ecf20baf71b322ba285d5df7d9d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 630 zcmaJ;T}uK%6g}hmv2A8)W+f6m_@G5DMD}8YAO?cK?Hii&G&gEmFZ11iw#`egUj$OZyj%YvJihMbSFhh3v z1Vi*pD(RmyWD3n|KIXQ=)xd7~u2h3cqu5~x*K}W4Ft8Fw1Qx^bqRHlRlS-hn-jqsQ zjc&TaZS$@p7*b8$<4%XWGN@@*cn4&zPnPe42oS>Jx6=Aj7#AUb)TFYN(r~- zaL*H7b)OUr`Wu*>5k#quQFV&&q+=c&=GZIDC+dZ;N~c8#Jku0u(Jf90m{>!CkQ}iw x(>Njwz8R_HBf*p&7yvInsK%VSxqzDfO?_WLHISJYY-5LTntYdT)+_<4_y!{#fjj^J diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$6.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$6.class deleted file mode 100644 index a840cb4e6b36424808eb8ce6cad630899ad96589..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1611 zcma)6+fEZv6kVsSw2q@fMLPB(*Cl=J zia=lP@8fEIP9RnG7o>qCwwXx76gbuC=G5j=N*ZP7l&j?3`tk!A%-Rn;spa^N?akSN ztJkf~RJ7!V0tfy9H#|<+=Aw)$Px!9T^_4(xF8{as40`##vDiOOoIu(Uc{@FHK0jw* z0DIHeBQV_llsH=3ZdGRPP0Gga44Bx5L4k}zcWqZu^X?9|z)%_o1rGYbq9q;A zt%cHZ{6JbkT}AG)w62Ar3?dVUaF{yXa5kt@XDTIVg#cC=|G0Q*Wl5`PE;E# z+e~)JfI!Yf9tDA(P)5~1iX@-=KOAjX630yJMjy2*ds$2NYm(Uzlr3=5#3`I+9Wqr_ z_0SKN?I=#x2$R)raa`K5xoy`dbO2{fjN=?3VxesiqZ?IrMrh{rf{BaBvH)WlaYs~D ztsZTq#7ic&po_X6GQk3)8)R*2A&pzdYIRoz*Z6KDgR($kyJ4V$n`zt-=>D_kOx!{> zPG-%s9kNcgC$qd{2Q%_6xfaUOYK7V)*Yf&{uh9Pr z`|lSxIkJkQl(UNBx|%F?0w2i#k^G+s@HvJaYKFI<354T(rB>6AF<2Cn&^^(jn~v8& zPqDCq6Dv4VD6ZiAOO)1$cEo^RNc5FN-(r$JhB0W3qz9LAg^&VQ*G#xhftt3rP^hpwLSCDu9Q@ z66O&IJf4*qUEQSVs$7q>QLjeBW0fAt<5&q)qNFF|u1vK%Pk$EdiOvMp|5L8M*AyrX zlx?3`Wip)@ft9VsWqKbK((j%PV}WJncQ~k)aVs&@Ss%9qKm&TIl9oKP3^;0ZecTmT zni!HpIxFs#u!`HPZsaf@<&t&0OHLKh#F0R7kc`rva_=HgzIdNqr=m4&(~FaghQCzy zBB_&-Z!@KIY})lTxgB{>xf2oo z9BY5r%lXZBu0ODdpLwO)Bzp?s=Bwg<4jEt_4~Xrdmg8?=lX2q9L)U>>ZW!$2H>S#> AZvX%Q diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$8$1.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EFileType$8$1.class deleted file mode 100644 index c713c27f3c1737c577f6e92eab2c4bfb14b0bfa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1772 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 diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EProjectType.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/EProjectType.class deleted file mode 100644 index 1898996d5e3f1d43f075c6063aa4652e6358ecea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6146 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 diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/ProjectUtil$1.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/ProjectUtil$1.class deleted file mode 100644 index d2e61257d5f765e0c65bf407e48ca9966f1f227b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1771 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 Ov+*k*cibnm5d9xD#eEL| diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/SQDevInformation.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/SQDevInformation.class deleted file mode 100644 index 3ae635dc9cddb4e2441e5201a8795cf41feec395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3558 zcmb7GNmmqC7`?^NMYn}0I2$8GqtGhEAx47}LaQBtM!G>IPDN8-X;am9R}(a|8H^?| z^TLyzS-3HSCZb8sNp>!>N>*7Uza`0iuZpSyo0B6P&Z~O$zWd$#O^@IH`RNw`+whr+ z3I$CCeZsKXiWf$ViMEns=GxLnx{QgWHEI{eb;qbrxlX{TUXW9|H$FW94I&ft?{6bia&DTwJM$4*SwUAq928MzWYT zxLalEFiNZ+1xV7kDd02QGrsUiY5guVa(ugLdIL1?r<2p;gVx$ScA2UTVH?bK(afbV8a}a z%GkEYunx^C)+<W&DcWjV}>)R=SocWqUM%I%TVNYn+6pTk%#RXo|A#iB>MY1lD*>VP7O8g z*LDrN#MfBIKqi$q)|cwf#CTwjhP~LQptfi@9ij4F-2AA!mO&N!6|4#ee%vf(gPt0; zCu`8fNO#($+=#W_X{3TiGw8O)(SkkR=$thg{XDg{w#Lwb1EN|FDu|bH9HNq#%o=&o zw=6zkmelY94zslFyulV^BPC<#K}tohf`*`ReLD?(sAD_j*~m`X(X;0>1wCu1=$}4s z+HJ{{e_jPgz?QINW12!SXoX}kX-()kbHukJrBOK_n&wEp9{~26!VE7itCBDxd@T1F zFpq?tAhl9WkDm8Nfo2x_+#w}L4@1L|6k|fXU6KAX8cyJ348s^vk!90|g$7Rg3dX2W zFs!UGz!|E+5Y@SmP+i8TUdl})su-IwOWkQnrz|et=_t-=I4=OII1t7akY~mnp^~Ry z=)DVuwuYR`@PdZIEWh44*Mt93XBLA}mYB7~47LR9OBx)U6fJU5LliL)f|oVCf|DGV zGfsOF6PB2=BV^q?Buejfys6?1Mj@!N{kEMmbW6i!yhT}ZWO#c_Z<)FlGe*HXq6J@7 z5H*Xvyd6kb(0WgUCg#3MGGbetd|$)6f}qNHiak*r#h$!4{*i`SG2*NFsfU+KENzzx zSwjq7`j)j8y7XEFX*AKUl9#2*0Pv3CQmWAO2D(&=fQVSUj>1paVE%QLW7ct$qyGr68E4V zsHiM(p_D_#g9|I)QC|7w5WO9Om0t}(&!N0Hr}7=Mm48m< zU(BIgw6svpx#uZwlkY$^6SP8PJKV2dhKN;r0aQ@(jZ>bnNb-a$by7;b6x5BI+^izEwX9D^RSgQOx-JTJcT9wy^eW#+=yoLS#+3Vj=rJDnREvi`-$6rj^} z)8&C`vTh#WwJE$kJAe;p`C|xC^Giou6K()GgFTwz(z#N;bbbwqo~9RSnyY^4BqdwU zRL1j~8_z3@=Up@erQ`PD!w_URj-h7xz!yEcS+2}h{5wnLkC5W1uQ)1hAj#@OUvao( uuFo!+KSRWVlKI%r>K-ov5s}sFvx)r0g#H~O67h*d#N8%|d?JhV)BgaT5U{KO diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/SQDevProjectBuilder.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/SQDevProjectBuilder.class deleted file mode 100644 index d77c7700ffaab51f7d5ff95e5d3e6aab6169e26d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8356 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 T?&q25c2~s1m5*rW!N?kAzmwf9$yM@-zHGNQM z2Tr5#h`-4j3WngL=hlH$XjpE&aDVT)wgZK=cLd2?{;|L) zdNrLv5(6d_&Irzx9anF)U+!uDVJtCR_H3*1*z%ole{^UB`%X(RQa;73B@*~;H-lkZ zRJcH-=hq9`ZaB@BF0`G(cEbvudH%~sB@DPMs0NJ0oHCh?`h7j*hmiV$exE93+hNU&OS0?*&k&$Q2QX=Y+Fm;b3RU_G#i zY0AVjt})Se!)xi4Mk5AMg^_!je>#8}%qkR4@V7^si5r*`40X*Zxy^P!xf2|YMI!)> zn8Cb>udyIVQMgnST%^o#weAMK#;t&x-}PN zTA*~4IYxWp|I@`{vfDm0e3Wk%Qy)R>NVgLB?u7PC^y2zlA#gDApkg(nH?2@)n0LLl zZ|gNDY!zq24l@&`h1Ig^hV{a9qW(>j*&T+>!_)dY$ zQSlj`J^2ggJGdn1U{p|^?%*oRXWHl>pFs86kBjLy3#sIS@e28obk>;Ln!et_bpii3 zL!nzqR9_*ps7BNuSo+P7tdULqe)#q^*=AA18fzy>JAj4IBDssC6fwwoNLG=Rd!#L4 zRyJ`<$}F)>2DyTD*+PZqRe2EkF&~BC$&nvJ*ueK#Aw!l7cR3Q|8pRJ-CD%H!Yq-Z? zt&?>F#v!Jl6hvWCp#fWHn1U6CTY@mYsc)(SL JmW0XR_a6w4q)-3= diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/Util.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/Util.class deleted file mode 100644 index 94cb810c993b0e3c9e2979d775a372ad97564468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9321 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 PL*C?79TU9FEC2mJQ@a)d diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/utilInterfaces/ISQDevInformationProvider.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/utilInterfaces/ISQDevInformationProvider.class deleted file mode 100644 index 20b0d787285daa51dcf608a39072846238079515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmZ{fF$%&!6h!AoP1Hg>ft{d@+oZD7D1NhblDVTxhi z%=`0v0f;e+5D;Q3J!{cCa`vKis!p_HTgZ$Xk)+oH`$QMU-lbDUU##&eXB%NmSXRKuv=Ba6I#z$2%VfB~0>yaUWFzPM<)XkV6>>Z*` G15Cdlb3xbu diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/SQDevBaseNewFileWizard.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/SQDevBaseNewFileWizard.class deleted file mode 100644 index 880f6067b035832e78f02e21eea2f7e8c928a8e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcma)2yH3ME5S(?Kn3zB!S}Hn-5LZA4LI_YQD*}Q-eX&<4~f5`LZaXU_$b8M zL{tr1ZAwc{z*6O-~?>j&@& zXSuys9H-{Vu`11PCF9z%%S#)xlBS8JdS&w^$HmRc|CvJQotVrNr-aV#-kjiH0M_NSUw|<*`oZ+L}hMOuu+Aj<6s7|AJ#eIBR!ot|Dyzedxhb yR~kEz4dtgGOwDG3fvCe)1Ksf()?UT%5DJFEkbsXq*5x&jn1qBkgbAC19){m>0b*kS diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/SQDevBaseNewProjectWizard.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/SQDevBaseNewProjectWizard.class deleted file mode 100644 index 12473a677215e80faec9a533cedcb035eeaab1c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2321 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 diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/export/SQDevExportWizard.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/export/SQDevExportWizard.class deleted file mode 100644 index 1eb5268c3884e9e42ad59963c331fd3e868a865d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4209 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 diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizard.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizard.class deleted file mode 100644 index 70ad2cb9965d4cefca69830048fd6b16329388d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1543 zcmbVMZBNrs7(I6kI%W|ZY#@k$pzZ}%Kty!N7YNDBB$$~Ij9-gYDMoBU#; zkVxVW@JAV++iqc#7=$M6ed+Ud&UxvFUe$6LR&P)U6%m#-FzhA^f5Y8(#K$tXjcTsvS3pTRLTE6Isrr|XO zH;cT+4bO7yT&koX&aiefW+E7880n~}p9oX(6~!3tN@6A%;>p61-qN+2ZdWuaz_Kfp za}cDN3I&lU&F-t1!7PKKo4!9osuyC9?D;@DXUnM=OyAARcB!qhJj4|F-UAq=OSJ zI!$5l9ZTj*T)JnnvO}qmylr!_RnuLUyO^WK?4!4z-jM86y36F6jyrvC(MqF{(b%6p zgZh;wA>5|#fWJA6VVbLf0Y-3#R&*&~l)lpW1Hu#zNTkm(b`VRPVd6Wc(&=xQI>q!w zwA;Q_979MTj&VQgY~b0BN-?O|2Y#jm=CMF^Fg(Pgb|#Y`$V`(#?8k+3WDe4?Cz&&7 zZx&Cn68=JegW6+M6);6$r>U_QF@bDX#>sZZ2;q2+b&5YmXkXwZd54hmqio<6jgq1a Hjr9BhQW%~8 diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizardPage$1.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizardPage$1.class deleted file mode 100644 index 3efaf4f34554e30d1a74074ffc3b8cbcfd1c075a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 943 zcmbVKZEF)j5Pmj^O%ty+R;^m!YpQ7k*MdkfBEngraIH#8+OM0t@v`M|TW`0C`mY3E zzz_Zaf0Q^I^FdTZaM7gxD6B@~}ey57WN zh1;K4vitHWjkbUByih4MH>#)zG!E5B$xP*`eBM8#*i|tnux5%>Qk>}{OVW;=Brf5s z+%buM^)}MhQBH-xoEvD{yvHP>*;sTKDP{_S9MNEeSlFkxO%fTdEHybK0XfPT+Pc z`sXya{AfGty*e&nrHYFJ4`!QXfJ?sHg+!~&q~U;fN{N8rPMiNjfq8e$aS_uq?WeQy zSJ~Y4df{Pi<#A@L&eI)o1Cs<;#Z9gq7o;48CU=F&1aAG=`&cI_v6Mo?g0$KZw=NKD z=Pal&Q`VBjbzWnc&k2Y|!*7%2UgA?joxLadwaK>k)Z2GHB4~fcsrQqZ)804v&RFd<&ez@)YF>-yUVY{Qe$?fhXS=sD{-EAWN z6#s=Y2%0%k|y(wm>d(QYYD}fR+y&IR=4o10y(I}XB!Tdw5=wG_@_R>zFMOs~bEYnDALz88dz zy@G-F@qvIr`~4uie;|FkE^t1RJqCv+g;&?Paa_Qhj*EkSUn?27gv$cw=y%hO-Ijc1 zzVG@@&}QMhEk;L)k>+t#$A(45mAXsE`>A} z)YC5tTpr~AxN^2Sh9#IfZV0TMtcDFN<0FC7&e1dFgT_I?+>UYGi!)Im&X4hlj#a)( zFAD>T2G;N?i;5iV%3orEGo;{Wt7Vy<<=4zg9J+pu-fkkNV?$u7|IWZId`1UuwB2aN z50i%YQL*&7fiJKrFcHc4j_a|d%T~-fNoNNAXRFF0Z(vJ-(SoM*RRVVme5G9IbkRXK zl1vH~!a(}HBcxOL?0zSyX@TRF*-JuS`Ln;q)x@A(2krDASmNlmecjJtK7l_a&W_y<2vVEmrw zOe$G&BWU*%rg%1JqonU(nybLOIMem=FJp{QR{k65AO6JIr#LV06jubEAX{2^gw!Kk ze~gu#rRSJjdW`koFnXQqZ3@5K&}OvfI6I>y^2x5YI&Ld0!%$cj7#Fai!C`!xMRJe1 z)v*Ydjp4C)edH0~J3L6Ru6FQru@V`+MuBM4$l)7&%gp9zS44^a*D#A6?lfA17DNAI iSw~vO&Hr$LU#gUOF@(GLo~y=IuAs_YiVhVe{JjJch3&`y diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.class deleted file mode 100644 index 5dc432298a9ba158f5d60167ed483e2417713984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4923 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 diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqdevProject/SQDevProjectWizardPage$4.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqdevProject/SQDevProjectWizardPage$4.class deleted file mode 100644 index acd842b2098bec0af5686c7dcaf2f4831c042597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 zcmbVK+iuf95IviOIx&WZ0_9TfxR3@3^AHJ8Dufh@gycd|tMI(B2X`ySTfEx@_$wq3 zhzCA^AK(GL1u^U92@pcDwA!8V%$YN1=IhVTUjX#5>Y*lZzmyXyBJ(PxNijnqH;%$auQgIbt3bjES0lo&W3ABpg%8}u*XgL<4UR>dTj-6 zcH(~uy5ZFAuMK^i#d#0s1n$l$XMh#>0!^7DWU9#sZZrI!^2~W#ACw6_R!*9gzpu@0 zw=XQ^Mv>&&s3O}WyQ|Xx*KnPcPfC)O2D-4N&INA#+4xkY8SyF&^mv~EEOFlg!IOd) zYLH7~$lwYOvCiiRM7!-~$@^a8(}K_5qx`zZw)6PiTOSZ~KjQeiD&~aqRexOeH!QIo zaE|ky#3{Z7PGfn7@{n(b((JxR@Cj#r$N0{*e^eODhjB9u&cFp+`k!y;O}gjo|uVP)QLXtsq3LMB?*g_n1!E?$n)40)8t& zQGD^KWp z?#OJ=SF~Sp{&A??W92@* z;dRY04f&yV#asFNY~6H2CB@!K!q`}y3?6f~VE9V&y;02auzCJezTiD17SZA@+p+5L?J;Y)&vP}2QcorrC*yHbtqYgX9( z-p6|9!0KR+ZK6@z@uc0jr90SVdng)n4;Bj+^GaJta7%C6`umAVo@{9y^t6)cwVRlGKj4y*$>t zDJD4fpog6UJZ;4jvF>mr17MMxL@*rn;LYB6OK_7NITR-605SP`k#Lqv6yUf~uO9Ey4a^ zV3m=!qJ|^bJht8m&Zc39|fqkP=#qe94VOGW)B1$y$3vUeh7}Xa15qVq@XU(phd+HHNko9skKaFec7w#2%Ek#)gDSiil+!qnz)QgGTBZa;=MsUG9>sy5nN zNsJRj&_029`H{=saS%_QLUV)S~)>blyW8ZJ5T4V zp#J0F6O?r&>|lyc6-^~#^q$!@W8ibWmYx=mCBrG3Y?wGnF!NykJ$llQ2Fz7%=Lt?c z9L&v%`s4{vM}j+IeW}KC65&vb^XkWZEL7Bs1O+v!ml$DF*z($+|}< zO$l)=v2Z%*lm2L5@A6oruQy8XkY?RF%feFKs_3^9sW4rsJs#|$ullfDaB|0HJL8c7 z4gNsQKsXW!Y_bC>?(~L}NhSz)CzuQj*pbK_6D#Su2h*MtXnw4~Tp!LAl+X5}$HCF0 z8|PX0lzP3XUe8>jYpoXAbgf+1VzEd^IIdeJRtt_g7%3Nc73OLzwOi=G`GQhnP_Nca zTH@gP(*uq#tY_5clgKgHieM_}$2xSXxi&DoYiMSr_-P9l;WMPjteB-3sF`z6A9P6i zu?nsFBWPh0y6D8C_Eu7Pd1cim%}oxU4Aj$dlhelt_gVA&2%$$M*eqC5^Z!m8D)}mG zv9J{kx5>d!s5KS}ckgHkCsTG*OGxc_joU1EtQ%ubQY0Uk!>6yXyP5Kmj=y=iF`%Wz zhj_00=u(pjQaGsVImN_}ZJ1j^^YmFLfnPtV?QNh9ci>VJmk>d&7PUBzN%0mg!{to# z{lQ3|%_usqX3m9U^feA*v7)}x!e8Mka!hYn5l+VGL2h!LN{1MiUX`QITDV4izJOZP z@9QjlP93Z`X-8;tMS6pU8}WJOY9eiphV1RiPV=0PWJmA?3pe8yH=uIrm%@JpwC1qe zK7p&v_v2Rds6bnMxRaSvQ%r9#J|>|gH^=%SAx$%?C_5C0Mb&0svM?FtKHS4BIJ?7b z5t?-4UJI5Q^FDmV#QltsaV9*UcC_#S9&`iJ1E&3|)P55f;9)#!;t|2DTvSYWU6}^V z?zR(lw99reKc>c=tj4vwgMATZE~kM}InOik#3xYL$$mTzrsJpC9ICFCCVH1@PS$pb zN((1P6LeNTl0 z?!1)3I6+KbPGiW#pkRulw6WV3_TuaGN7m6qkTqQ}Z491fZ+&qo{s#L@{4JY{ESk)& zg>T>mX40sWqsIn_m+(w{Q!pvtY>M?;7QT(|uzYL|CfghYET9|wco=_g;pIFldGe~2 zUbXODe2;Kp4Ww1wd5JdDz%`rrhrAS#bqZ~oH^sJ__&ybw&)l-UaD-j75C2HiYRHi5 zDWkSL&X3nntv`Nj;V1YhLp>Oe+tHAqVS;9BeA@6REcW4Ng6iV}T|t)SSRfLM_Sgvx zrtVl@G&EBw{M^F7s4je|m@And`|)pD0A5#{jSmQ?sO`ruEc_C0&^9qLrp0c9=7V2- z0{33v$D8WjZwW5U#wr5oM-o4_5}j%X*x#oLt8+4l{A(54Ype8u^@@osUO}RAkpYIwigF z(cQB4RIqDnYcTFirl!;i0w2{cnNrX4GGSE~Imwbn^%fr+uyBY0q>eJrlKFBnHNbeJ zblG`*Cd*H50e8yPn2DWzlq|Glk!Hhb1YfQrBcn7knDSLAoNCEwnF%CsYq2Fu6gr2v zwsw9wL(VegOu>v?4ji>=r>}iO(vqdJjKfzrxlYA7o8{SU3n#oi*q}I9Sh7;iW>5}n z-qDR9uRM##mkQQ#k#j9+R++56xGIvCN--kkQ_^Zm3tRQv;O>eg?8eOK zo@`v}4e`m(w0|fMYu{Px2}_o#l{l8C|QZ(|mpE>J_XcD-(%WqSa0& zdHtk&1D0&pBCUIRm8us!5j#Z(HhbMuEW2{4g(;Y-Z;#jr1SY__3;I}ctM?@NOftzAEBeyXX@U z8gIlgl~%hlf4g({tL2K_vtwf~OtZhCI7#alqog^?Zftpkv#g!OOm@Bn{9D9Z8$;ud zzcVrP2FH1Fly#oG1aO{gkew%cVdu$P1Lw&e-gz>T`86u zy|!{j8b>|roIaL6%SjzrOZx2`oI4QU*EIJ$c{`3@gv9ZfMQn=o1P^Nm3i%)4tF5bV z7{u%>M!y4n0cGiQu+_TfMzQ%kY=lJ(@hWdV%t5WAhdR`|6pB6|Pn61ddl(I!bp?ZH zY#qk@&Ot0_t8Yl-l!l@`SllqFWDm})T-H=Lj1`^rJau+cQFT$}IcYRk7gZOg(Na5% zRh{*deT9QqGl;drSl2nZ0E4)oskn9!7wVadotNS?HtNeTLY;herxC8~Z8Ecnebv6o zm?HL7n=ayQo%NHfK_vGeRr@?ry4>%)5ZAyEws$sJ`xccJEb{L{b+uLHpWjsCY?q{Q zMH*LMjfFs-_*s&synpJ#Vg`;~mDRFzg)501R0 zOG9`lja|+r5vdqEt5pnr8OGzv!;{LxQ%(L+7Me<{ODn&sDk)Wr9(7M8y9v2lmlfA; z2iFjuO=C|}*)B}4F58P?!3%h?$#V8Ba-@rYC)hdihAs`^r8HhyWK~)BqCyv{c;?z& zI9cCSO~csVIgHmjD}OMEA3CRhRQXS7{3wlop5z-k~4sUrMZMfgoq zSyqJd>hj9BRfO{DGFOCmY1P0W{$mf`BjkI!{Cj;F!hfdm$IAb1s>n6Mhur$G@_$?- zd{|wPkK+LM59qSuI6#rfh8SrnAU7AL#az!%e{FqQ$~1-wz^IfqMk9F5?#E|1pI^*4 z-iV_RWITp28{L?P9-NBJI1^j=3xuuMfC#$K%b!tPihf*)?Yu$Vf!lBi?&ihrW4Ii< zaRr8WS-T%s;b(ll!E4xea4p`)b@(%G5I-K0a^4IciAQA?9+L(=@oA|s1zcuc_d&UF!o$&;IZ#;+hjTi6-<7Iqc{8S9%bty33kV4}v zDRT1AE1DaPw=;Rjcv~h*C3B6RC#UeuKqcX(N)>G|+xV7DV{R(MJY%mM!7N#X4aTi9 zU8+%xD~+u(gS#efG&WLS<;-9EVaZXXP$K2>b2*y3CDdGr9K$!i+|Hi-Sm*6NX_WvW zN~xa`naMSaT6s&3!x?;Af?_$I+ApK@cghLeEu#)@l-YzRr?l(kM6Ojx4ZY*XC>g;^ zC^I1@8l3;S&zQS zi%U!$q0b(QP3N%kD?lUvu>fyPyehMdR^cKhF-96{Ytu3}Eeq0eO19cK^-D_muLR1d zmkP(ymJ8!q+R(Y$#YfDBQ;m9ws%c10-^sk6McJvk=3nqlT}yM!sVb!kb~*1ZI? za2E;-($b&h-&OV!6v^qRlrtPY+-6})Caf?;cF;w|p?L(1Hu}^E6<|2N^`i3>(&BGv zJj!Qyl#6TY_Q)k!%Q}68EG4mJIfRNw2^H(yLL7$vI?}_{$fuB6QSI|`*)vL3(NRU(jb$T5i?n9cj5! zpLeHar#|mX%U9~Mk{-kC4!I0IxdM}@+v%JE0~|1GebN54# zNj`a)wb|{ywOYrQP2YpKx_`-yT@huYH3Kbi|BZ!sS>X2MuFl2CM0@Xh4YtwGJ zD?MFwRX5$(RxI|MRyKN0SN%u2@4{32-AsUlSP#d;VdmaDzvuV+e!rVP|9$W~fP?s4 zLzTcG+nAQQm~$f|r(-kbEyK<@+>IvXOqZFJmkKAb)QSTQK7p;4JrN7vZ)jqR=N!dGbfYz$q{J}8Y5Zevo>L+jqH$Nn`&P?^tt1vBXH!!a%IRtBa=}n zI~q0%9DQNPYM9(BI%*IKA&l2l!dnHRk<~#L9a8$+bZ7`Fn0DyciCqF(F}nY;{o`)EGZ-^Jw1N>DBs*Kj~!&+}O1+WEAb zw`FFDPqo;OLpl!Q2-#4G*mm5`teliNcV*PQBNHSm-5eFzS?VTj*)m3cS$R7x$<~45 zQUhzh>v@uAt(Q1zxKRq|}0rH&oq2uGO3J3LIj6 zdvqkxOOmk{l^=oikxC{+hgA5-H4KoJm2Q@yWhbj5gfNI94HwCX3g#3=E|Nt$F5ykW zVLGY)b8@=)MIch%F)Qm=l#546=s^tYcneoNP`h)A@FYhlRNmxFk9*>uWvGPW&oMmw}mTP7f)djYc87Q|cu(#~%D$KLDQ-u+yMl<_( z^eT{ zX#?0wjYjHj!+P$N9;LAX8~GO4v}EZ*!7{L^`8R|wH~)ey_wnjIG&XbDIEU>k?MBhS zOKKxpO6+c0vfG5+UWDQ=MyTRn@a#kqKcTfpB$a~&?4QMVYV{EN=W$S=!x#1~pnVo! zgnf^2TWvaKQ5W_-L`R4J4jR;|eICas>JR(paf*vTIPe&{+MQFo)^K1RuM5l}amPFE z^Q0Hh|1E-H|Kq2Bhy9PRBkX^O{thjy{fg8q)~Wa9WLsF9$Ju3v-Da7#m* z21CR9z!TJJ=y-w+8qU`R^?$H4NXH*Ce2;(U>0Gfa(A;_tTb4Nz;yDOss^7>THsUes_@x=<|rNO diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqfNewFileWizard/SqfNewFileWizardPage$1.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqfNewFileWizard/SqfNewFileWizardPage$1.class deleted file mode 100644 index 022c51e206065636deef955b879d10c8ceb0d33a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 952 zcmbtS+iuf95IviOIx&WZ0)=wFxR3@3Q;7#qpaO*;A-M&qRe0XmQ+F%JTfEx@_$wq3 zhzCA^k3!6vJQajcu(aBpr z=PIYy6%uV90ba?B!gUV~f%d+f$S9XZ7QGzpQ(`?V2(0Qdizvy}fuYDuZA6^KnrKs} zYWH2NjHQA~fd#v#On8rV#B&SjG0h`YD7zuB(fJRawV^uK_BHJXpr_%s8aFctVlq4@Tp2O;)Uw#@c|Q9;<^Qb7X`0XKbOXk z!8IOZozF3dcH2#p_rAub1)tI5{CdE)L;UWYPYAl7aq>gubIM`W9~b=;OKb-m`zQba diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqfNewFileWizard/SqfNewFileWizardPage.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/sqfNewFileWizard/SqfNewFileWizardPage.class deleted file mode 100644 index 3d925a2da0d318ac0d7a50bc8c8814ed78ccdd7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5752 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 diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/stringtable/StringTableWizard.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/stringtable/StringTableWizard.class deleted file mode 100644 index ee57238aeed347c6a830d354f2b43ffa9c7f4998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1563 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 OL+fBG-8#cyi> diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/activator/Activator.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/activator/Activator.class deleted file mode 100644 index f0bb61e10e667e620469c9395e7be59349fd39f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1166 zcmb7DYflt06g^!Q_Tlgr5J5o%Ty|xvV*G+JK~S>EN+8I7HDxGcb?B^}&dSg7k%;kw zKfoVlyq)18Bto1IecZO^oO|w_U%!9+1n?M31>_iNMs%d+@rOOx;cX-LrIFf~F&Dm7 z9bqHGS58(10p_mcQw+n7238$n8+eZ3}dO9da9=Wml}qijE7;d`5%gjrRS;A%06T0 zsw}h^@~hFFETanp9z66i^f#538_B`0G_S>OD4p2I7hy{n<@U$HynU-;hHesUEW=!- z>3oRdK=FMe4&=wkyywpoy%$PK%gRH$?C8ob4t?3SiZU(W2E*`~52q(i%}o#2F;W7< zq=z!Dm2n%>1xzvUbLpnuz7kpl@<3|Kx3|`0Cv!ZD8V`3cL&Sl!#}S65%EEcqu7+85 z3T8dbVV9?JEL0d; z=P5?5Lt`K9IL(aa?&=ZxKc`m*X><=k*N15IvI`hapEFl!f*++52Q`+$Y*8dfk-=*1 z2;$!ZC* diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/initializer/SQDevPreferenceInitializer.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/initializer/SQDevPreferenceInitializer.class deleted file mode 100644 index d6dc418d1a22fe88d141f4ce11a907e60d5f41dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5209 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 AzW@LL diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/EStatus.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/EStatus.class deleted file mode 100644 index c749b4758030353ca473bd69ab10535aeb9005f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1506 zcma)5ZBr6a6n-uX3*!0`DWYgup~7mSrIv!IIaH3QGm z$?0=Hs_ES87Bt!nANKA&_de%2&w05&e|^0IFok6=Tns~&R@KdT`FKaK#*Zw0SGRPt zpqJxET9MXt*4FGw*$X#A`@UAy;w8;2#?xlyfWft~$}o~?iXp+^NpEg$Y%+M?E^V%_ ztiNJ#?-{1e5XjV-v$kcJMMAfx*SFRpxuwijI?E7!-*gyXvQRQi!%i_s(O8b6EFbRZ zK6w0~Pzvs%i$P90kYMy?@ReAug|I;d9>_j;xzVe@%MBkl`W5&f^W8lKtxy;`GKQ(I zR}Qvy>y5Tu(s@#c1+A3REQ8zP&<_a#A09D)YZ+27j1j6wS+`${LUi9EMr2^`8D#<% z{{Xw9v753v=a_=W7^nR7fis?q4<&st|CmMqPC9WsJr=2F!pFONt1^uPL+p9P)W1Pb% zy{u6*>7`h7HQT_(U6V~}OeGd4sV@?}PS0X5pFM#7GeR*{dxn8e zMB>7ITJMnnPzXOdX$_zULG&Sn2>LNX5(Wj5qv>HeG8QNao<^HG+JAuuYT)5HB6Z4k zaTy`)!$dG5C=_z#VWJ{Sh8R?bEJxJ*F07KabBumO2kk;)=V2%6XT(qFS`uonsV7Lu z6Vf@|Kpl3dCk2)TiIZNR6C*`2Ty!C;qhAoOEA@-hdFn+!aa4k zW(dub51wKmzbdI$`6RFMniRgo)EJj~U09j$pl?u|fH>xma5z-L@LPX?sh3Fp0Qi2Vqt-a_I6Z7RB;P)fR%56zFHJC1ncC4lE7{&O z#tO^EJ7QZEZO7CX6dxOZ$pm=*MJUYDruUY2Ma2q>e>1Dkf-n^ZqLF-tq!y1bc>~C* BIl2G< diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevEditorPreferencePage.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevEditorPreferencePage.class deleted file mode 100644 index 7b1c422eaf7cdcb8737361c8d350fe2a7e207b30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4521 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 P_z0)@7N%p0`270^kUCQo diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevGeneralPreferencePage.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevGeneralPreferencePage.class deleted file mode 100644 index 62449a16a1ae4cf4f27000e908c95761b5a5b83c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5177 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 diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$2.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$2.class deleted file mode 100644 index aa12f548751c4d05a7340308d2e60a0f6603f17d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1250 zcmbVLZBNrs6n-w76lUGV6nsNOH?bQ?5kX_7CW4RwBpLFdtlPrzy`~bjYDcyptVr3_FjnHR%bSsq4E<5V zQ-v9dRXI_xGDD`t{el!qLy{Fpxq5Lna21V@O!qG*j^cu^R8~2)V&`e8G^bgbw#Nx%BkD zdzjSqVz_@Y(uG+{-PqF#JZ~~gSbrq(t4K>)uyS!Tg-aMUaG7DMM6M z+RuavW9f*)BWdCa#u!pm`0feAj8*Jqehfx=0OM4f+WPWS@xC2OS4~InB2DPJi98An zY1Q^3r?C+(aA!BBq=v1^8{Xo!&x5*Mi=-FS%f;;!CSV!3$uRcs-Y`)_iC9xREd{#p zF3D(ZYl#?%lK+p2k$0_Ah-FXfIQo}4nbtHZxuwAILq#;JB5H)Lf!hr8J%v6RuVW_9 z#2w5LUESK0Xs^1lXRmC9a(9PDxIwBim@7db*XQoA8!Uymz zOtca&y!67?@WP+?1}4TcrLkh77waUmGw1(1XU^FVKi<9rFo}YJ7{jb^n%uYLlPYi8 zq2Q0X;J(YH9Xd7oR_-tIX4#YO$}iCh3DOhkynzHma?5EtcHQx7_VUISca?!2hE$jP zpyB(@Mx8VCs7+6%^AxfaF=m0B%z3`2<{9QPk-cQs7!nIXmG^<+hy??^CgSL~(1#>L zJfju*OP~G$uN+-+HQ^YUSy~{9)?v%@sVx*Y&Q^9 zslDbbjAD$zkX)_ur;1@9Q|b;vMG4QZ6|!qucie&vdLff^m)i3|-V>Sied!Gg6Iz-G z9e0~rw4&%NJ7K5i%u3J@F2CdHsT%srgpTXT1a!%F>w%=mWv(`Zs)Yf}GAw5f)X5D5 zx2Xx0x5Mq?iU?|gTBsb*s0HGWnjX|8XsRKphpnRTbFol&q~sDKG+A-lhrp6aJz(_5 ziP7$ZN!-J9n;}|r%-rZ}Sh+Vi`m(KaO!L|jZT%4`qAjw~+~YVwC)E|nj+f`8sb$67 zD_DCN+{4g&%y)?vF1)~amrh-6A=@PrEnGW5Ab84}7A2{){nv!7Y5nU3~iu lP_YAOlJqFi?<9_6iij9)Vw%nb&GZZzf{bEx-(MOpt)CTvgBAb) diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$3.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$3.class deleted file mode 100644 index b2961c7efe6d3d3a0f0ed5a83aaa25823cabbd1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5763 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 diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevViewsPreferencePage.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevViewsPreferencePage.class deleted file mode 100644 index 2bf006a8ce3f963a07ba3c5e797ea4397bf673aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2457 zcmb7GZBtW66n++?gcxhREw;V@t0;!>5?>KTu|PnmpeQtm)0xhaY?7@vchkKaUVc`; z;7pzA59p8T^z6L>5*rx&vUm5KJ-g>T&pBuBKmY#qH-LwD-;FMY2_v>;kPH7P$?aU- z$g(stD9SKb7Zn=U-sa_YLCKwP^-#A;nr5@$0 z40_Tyi*pPYmsKENH)>nbtcxvQGI-0nDExvj%B`EigsrNOVRHEtE_85zif(p(F!X1Z zwW;J}(O30Q<{B!uw4u$%EdrrBHC#yI62st85FsyX!);aak}5}7S-$PyNrBeK z!#AO{c^MXss#~Q4hThEb?_yizd=XS~Yu2cs5}o}6L(jX_b?2Zo?u098T*Wnp^FEU`%=kWUA@$Jtwo3=n;JCqXDZaGL^AGLt zwB9qPYjqteE2laHcdU0uR^1q6SUi@$!*rW3DXUGG%PS*`G~0`E@`#dHpTup3zUZ{^ zD4EAi-NwMW*{ZPBB<@iD4N>gj(hR zgxs0&%nXrUv|+S66g4tG^plHNyrp-!4x$|u8Av0D0;-td6mDX~W%($>uN@fuKZ+eB zt-0EnjNyVyr13OzxJxN1N~JHMVwleyUpI&G9N@mx5pT-hZro>BI6Z;0TKiH29gj=m zA;aBP`l708AyG7}UeKl{EHN>s11kfY#00~Ip;#O-M8r-qJm08Fs?oSm4|AP|Ro(DQ zt_bLqW)X*VU+l?}Gv>wk)D-Svq#M*D=1(8oO2fA*F6}SzPU1O3_N3TikDQ&_m0=Pu zs2C5TatY?76xj^JUX-#;5!YqzQ@eC|M*%g%+mgK4u%s*VQX|UW_;~A5nJirMYKeB7 z&x>M}7e&Cy(&|dZCpgMR*A8|bw5O*ImHbyxzC<)tq&bH211X;WZKLweI37;DQ^{h-M1dChs+|7jZ9C zkir~B+^~|yYrLUOOuc+X1qID}^%yv*n)WcM*fl6#xp1MiXdm?TeP$LXVNXvNV_k#Y>;7On5# zHbyaoyEL1i`4bFd8d=O@1bK{Mk=CzB`-VEiTinMQp;4gq2Ry=Wc#IMzqu{e~fX(13 dRIJi|YE^iTcVyK?7U!{!UkG7FCpe5Z{sXgD;4}aL diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/AbstractSQDevPreferenceEditor.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/AbstractSQDevPreferenceEditor.class deleted file mode 100644 index c8bdcf248e59b68083665549af3485d1520d96b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11044 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 diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/BooleanSQDevPreferenceEditor$1.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/BooleanSQDevPreferenceEditor$1.class deleted file mode 100644 index 9dd0b96aa43a1d56eb157cee0011066e67cfcba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1446 zcmb_cYfsZq7=8{+3bn|b0$veh;>N9jcpah)A)>=eh9vT>w1=%)dS-h%{97hCj3)ZU z81+XP-_uP&Zt(+6+H-ra&-0xA{PpoOfJw|~XkvI6SXJ(u;Twln%}T)6c))#|hdbtT zjw?kFnt35SZu!OM4|w(2U(5PwdR#+-p zT4dP`(_@spa5UL-6m!b;T{+G0ICE4%v&#&LS>fzOgRvt`RK@z|>sXQ-p9W4ZyaZUkoo}n{Scx6>B(<3jl zCl+4cDmIc)#i6E(bghfh zk`bwnkt+N5G_vz*))m5_7ey4ND&Zr@kQK^K=mW{iTrekNav8}dk zDI*m>uuYBZFIsx5K?F4Hn7ywpgIOnIB%F%QG}I>!sl<`3_LzonkDVEgsf1;wvnrMy zbz-Ata#%TxC+9eJszZZrrcB2)thi%1N`p3_Va^7b+oWMvOV43r#E4l&YB&~mGG=PH zqryxzj86M#+RmDe>S*oL5a_g%Dui0h)6syChWR~aO6|=Z9aNcKW6&aaQ;(f6tUe=S z%6ES<;2biu8g}-~o}gQi&6MYrO0`=Z7uXqDYG|;GL1p!-F^A)XopKCDo6)emDy5}# zH9R~!=4Rl|!g*_-khnxhT&yAJP*{$c*6_saAm6)K)rmHSsqOA*vfIyD7FdG1SAuG0 zsneX(uif(jhL}b*#c_4UJP=x}se`hchT>;GPF{)L~8t zYq2hf4{ErtTE)E-<)N()=-H49|!4}gvJqI0|v4y%G5eNH*G%RcxsF10!)2U+{y67X9PO^DPU8IZU z*ew=Tz?CL6j|Pb&dyKT-TpChJC9|?q9Cqv2h211$)U>R(b+&f_E70gCdaKC zu}{Z-9H2hbv7BK|k6_>6VKUp%%1v<%bwjjJL3~m}q?CTQWvOAq+L9U09aSl(Yb>GC zQj8!T(y+K>=k?*OInzq2Og;KFtmqm`)4fWDBN9#|Y-hp|7b6lL%sJs<+X+WP=)*w~ zahHr9(eY_~hT$6Nv`Qse=t_jm5SWkJQ4fPxh3hk+BPkNCcWf`R5PES?6f~^kkgyq| zwET|Dx=Jf$dfbpwqyDACL)Bv&jDm-X+R%{FVS_y_V7b!)N)yC)@w$$S_%VxYB$IpWTvqj%SspKW zsI<;3hZ0FcJ7~cZIuh4B$W_;jw?Z2*08LaT8hRx@+k00 z`Ct>(HHI6+0~>n^jpXqsnXfi$@Ita=E)Bwl;pw;|gEX{5hB3dbu9pXMMD- zeN_SaCD-x}{tR(15Mx7p5c4^TdUj~Uo&3ffXu@6eBBKQyiFG{|Vi9o#VX=?!DDmsK z77~OdfdW1-9b+4$HTC4N_Y7Lwnm*wU!jtIjpG04O)29j;Xv^c_rbqcBkHG@e4bOZW!N3Is zYB%2VZt_<#RKxyVHzn1GtNIh<`XtkSnrWV-s-M9od10HX!8~1E+FE`V{{yWOEPTE<1q&Rc(mCQOmq@Y z^*5a;;A9?8OBSAVqT~R)K7(Xh$1B7>izU1s@8+cy!3C_uYgmof(ZPF0`oqm zYl=IcW8K}_XFh;(R|3a}g{)9*HXFjO^ z!ZZF?jN)%(`R_P^f8aU%lM?(F&fwoH+<#npy!L*sSf+Ds`_Z_6F@BBTu!yI5vb~X% gPDkxK7!6|LzX&bm>TiX5+{EwrDVNK6e)8Y{0rx@4^8f$< diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ColorSQDevPreferenceEditor$1.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ColorSQDevPreferenceEditor$1.class deleted file mode 100644 index a78d690ae73be6eb5a28b5bb0fb63eba18b54da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2045 zcmb_dZFdtz6n>@+EKQeEk*LT^U#UrGS&D#Y5iLmz(WDkagZgc{J0v5Uopomuj(rhj&OY$YT@W7u_FjN)=ovW zv{?0c7>kJEXxxx`{xZ2P55xBgA>NdMjBhcNvcrMQ)fiF*<%uycjN3SZqiKxdxD5*v z45L}2aH1>&vC(R7i|7I0_65VqvU0g!G?Jz>hE%W!unknQFb1P(6$d(T) z`I;&JO0H(%tpUw>BE7nx?j&t3O75$A8t>p;3#S=QcjLCCv+48rk&2pIB^zgOmcb_5 zhbnr!O>Ai}oXh5VLLrmVtH&$jIFD%yQ~kKFm2AvlmLW~JMX5ude@8JNKsB7&4|`8( zC5?G3Sh&D2)gAKyRU7Xi%P>J6R^3>(MYSP(pJC<@FNq5I$RKZ;f01FfzvlZPb(C|p zG?w64xWrH#2E%P!#xlb(?$TT)lk@ekcwYX7x4GlV(Due*YN?vm?vDClKXdVGhE5`gY|O4w4@&KupwRTkWEt74{dw|Gs9ZM3C>J^ zeS3^dc{BLf#w~n8Q>sD{Fia0W&;_sP~Zwp6}xEqvj| z!b@s+zR#*B6Ncl}n7fZFJWQ69g-wRDhb2#QSyipb73?}mXp>~)Hyre!Q>htb9<1%ZePKG#}kOw(o_rS}+{ zoHXm1P9yZSaE#<*bh<%zBT45kKBJ%KuzyK(P8eD8gnEMSF-douY>e~`oTPt-H*snY zx9o$&l!Oe}O7nm^8rCofwgQD>` z3gdB>;sTx$){k_5N*;cqb@wwC@GJ884cG82i6r0gwigNc#a)z=i01GaKBu@BNUw|v n;cgJ(IM_dCTr(EFAkjS%jo?12^q(SbKEOjdr3t_!NT2@zC235Z diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ColorSQDevPreferenceEditor.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ColorSQDevPreferenceEditor.class deleted file mode 100644 index 62192927e88d53373ef80966c57de553ff2d4ced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5877 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 I;+=oL0Kg-Q8vp%N*fxQ0Iesxhj8e!yX>9~ z&NH(xW z0y*C~=lkB<^SqbCyZ?D}7{Cg=ZNR6{lCt{kcsRX3YWIheDSNk_vf~juJ!-un>bQwi zI^3Mt*PH0Pv&HV;n&0QWGZ0YNRJ^2hy=gaPMcjhI6ih4T+NrqZI{kK9VdjqZy;i>! zj#=@(aHpGc;(ey$OwcJTxlX6A>%cWu+Xs&piyddmMtf zvAuYjOiVZ;QZYi-Hv5o5dCcmyW83V5#J)U|h`SceN-11lL}Vzf)3qY^Z?TfvS_6v} zrjI3^fl>n@g@vPIH-;=8kP6A7Kr2X-v1(Tp;Xq@TFlMPR<_3kGMJXT8+M*OG7;YjF zbDgBZv7!_e^zxc9Ts1LKtUlJK)-lCnE1xofBo50Z4mT+rF3P+jyq=sX%$g*PQdlvW z^9J6puzbQ~nJ@+lr;2jBAS#pL-ejEfaJofsVk$pTl);nY>*S1M;fp3Z*%%f44UIj* zsoPB4iq%2Zy>%wmqnQnc4PvAbcCtls`?7|{EBLf`w-vER_0n+bm?Nu10eb zVw*x)+IG9Fm^6mPMPVm+D|DIIj(g~4CKt@&%stbsbZde|-?Pywdihvy^ zc48M>{Q)Ny>);y?qk@My5fH@ogca2wc8SZDiC#n~m0|D(35EJXn#YG+)Y~R@i~WI^ zmRjM7Z?ShbfL z9>#s_dUiiiBoumPGVlobFj2+HxK1prYi{!%4r2BOj*V^^KCCcBgxC^kI~v4cd{ol< z9?|nL6OZEK)E&`Bh{W=S2{W>w0zDFyXay9r&vGMsY>KIjWKx_{-E|{_qQVSDog+gs z5$Buc1m_uzd@J#Yq-=Vbf63qz_R-8Q*v6^cz!O(Vt#%nXf_NOq#O2TFY`C`6*2XS@ z=<_C?!qW;RdT_bg5USPaLUG*0vy#UqUDZ!7Bl^6FF9^yeQNH5E7frk?pR%k0^zqhpwC*}2PCSDh%ek&R^@O2J@6OnCXw!8MnN8Pd@&fpEPWsqfYVuJlI zLiHrkh9MJYagNlY#aj|lXZN9YC+*sLundi7kS#fp4qv%5C+fV3Z%VLA({_xR&d-|h z940Rf8C@xbh;=41sffMNkq?~t6VJjoNP8git#O*w9J4sTr?HR(^Yb$=z#q=*dc|p7 zUs)LRmFEM4h*99 z40ri4m%nFG18^Iquj9HIwP>OK4VcHLYdmR~j|IG=T)vUYAge`O`SeOG6l)jB7X>Yl z)%B>O-1l-_3*RNokl|YysMmiRxM~E}^2?9LH|2~U<^h8T>a_7Sr9)U!wE4Se%zc;* zi!Sw2c|@DP*^`$yzbwOuf4g;lbA=QK95X&9+~<)GWB_6>hs9d=a8XY+Al-c`IzL4-H|>_D~jU`L8AP1~zAL`#Idj`0 zA`Lu=8k}NiU)FA!p0u1>3f*~4D|u2hnIi&wM&y<1cdv|+VdiDrOJaN3y*6iUW$3b{ z=kP%vh7gr(_AK*q@^vQMnNiXz^V0gRDs4|eX@iuOEg;P&^OR?s>SjbFd59&V?!KjTcx8!yC96?QO=)#tdB@VGEbc$s%dS4P-TJ04m8`79x+iq{=@Kn7UR~PNy_ZdpQa;(G#JO8bRFS&TmHH!+wJWdgG_? z>D<93yvjje$ynC?Zq!L%{^V!yn0HcTbQ%H|7~aRboBTug>>!>L3Oyv z1edkPS-sDrt-Fae;?y8E3r6ShQuho$X*!U_R|nXe^oHr?1Uux2C-GG-Nt=@4l>z^n z0nDr^nY(<8yk3&U*N*tr-0HxIOTYJ2oatr?e z2g^9{2O{%Fvfxh))}OH$e_~yShc>twO5-)@GSU2sECk8tX!(nlJA$hX}aaI8+R|M{aJ!9 z;0J$zKT4dv1`&ngha4|d<%t?ZZ~8}^?_o}0O`AbPX)Z^W zB70m!#FrK}>gr4$oW#-=q{s-&6^GJ>kC|3HD_&cS`b;WWJQwITX9v5{6R5RyMs)}* z1n@BLql(1RU&!- diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/DirectorySQDevPreferenceEditor$2.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/DirectorySQDevPreferenceEditor$2.class deleted file mode 100644 index 7d542dbc08db72e45fd9fb7694129942bd2b5c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1984 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 diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/IntegerSQDevPreferenceEditor$1.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/IntegerSQDevPreferenceEditor$1.class deleted file mode 100644 index 0e6f90d374a3071f59ee7c2ac732089269ea34d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1553 zcmb_cYflqF6g@*L3+p1aD)8|bs1U0~G$kZ{Ty}@Dxa`*5*`hzoL<`Zx zAK*8?7^DBicxPKhs3n@P$z*5l+?o40=gg-c?>_>VLS8`|!$aSwa#s&tTD+=Pe7??o z?wUOKW4>V7!t(>Y;0j*me(Bi*UVZx8v%Z^}P!MNGY#LQVcMP|zFRyKKQz&R>81($I z&P~Uz1Y8fch0ZCY2=pb-ve#c1?Lcss`wZ=3!wyo{D5>JnWR;^kXKdFNvkZ^ZM|Ejt zl_8$@EZzx*E)5DgRK(D&p%V#)SXw%C7j2h63Afg`zhbO8oFQ5COv70hJ9-3seuKc}(Wwrcr>d%k z6Y{xvFBB_YeN#m*F3M(HVmOm7?opy7eA_KkFcp0mP|(k?*ec>475{~P8m{0fgJMS6 zSqzh{(f(^Kjid%O3`q>TxGc*Myx>+sA=6E3$RNwmVVID`V2q*fAe;wWHRvD-X>`2A9g?8!xe+M~Dkd?d;QBt9)-lm=12?IE z5tz&C61PI889CXAX$`j}vWc)_QG-hKe3XPCLSiu^mZzFZ*(dfo-H4+lFZ4~mXiH@b z9QLw|Oa73a7F^Tu0^-jS7aN|X;XdXl3)AP6Mc&)0c&>a@7>1e||EoojTVM-La8rv4 zvbA}~2m&6UpTr!aaSSYxkea4PvW-S3RI(nY*)*-CMa_=9gO=UFi8qnYNok9A<^gd6X+rfnzF3WWdDfyFQ7sEA->|&yZTYGVm ybQ<`A1iq5WzF`F4qj){_I~(ypY`KFRMT}vF{M&FBv-FP>e)lj>Gg*_&kiMTS>$}AO diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/IntegerSQDevPreferenceEditor.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/IntegerSQDevPreferenceEditor.class deleted file mode 100644 index 2da59c26ffbf7d3c787b0836a09825aeb6001ffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5447 zcmb_gZFm&b6@Kq#!!FAOLJ*XX$btyjg|L9sRs#qIkVyEDq-mklI@z6sfz9r+GaG_X zwH4cHKeQFGv{prJQx#i4*nn8ts+CHs{r>#X{^+0f>C=DxRVz>5Gc#Y~D^Z zXB@N3%(vdL%Iw)xn(4g_A*gWM$Zf6cu${b-bcQshFfLQ*?jV$zHj~6wnAwuecO}eZ z+RE8x!rtv9c3Y_~)3Fn+IV+Pf^NkAH%2j!BkMq3RT@!Mj^~=v)yVs9Na2{ zMz0JSz5d{+rLuCl!tM1fJB%J9kv1}2iB>0XWx5)N7#Yr$rfhdEYg>-l7;9GuHf2+0 z1XZZj7>Dr+<6EqZxxo#r&FDze#oCr^QvA(Z^4lK_I@>KVi%m9*9z z!43FO2ul=dD#O#b5g%s0d!(8-b}CG&Z;lNXZiN2aq;WH(0qnNY=?(PPb9d4ZyvA7n zqf*(HtdVj(U>X%}(O7|%tP46g(AZkpco_7e`q(8R-O*_z&9d&8Xs%e&C?=aUR$(>6 zy2PYgeOJ+7Ww4E7a2uLKSgX)bPUaQCG;YT_hC~=P0U>FyZJ}9Vy~YM?q*l{z>_M{0 zCNV}U1xMc8rD33hJQZ>&j!WWN9m6TG0S*~Tdk9Qi!*H#! z;8^K|Tdz&q*~87%+}oTmsGc#djwJ8mYZBW<-yPz@4vn2iQ)x+e3C%CAAGU6W1aRAZ zwF|%)>3?$PdL!qy^U=s5AHpt$*_ZWswHLL94Q4U0kqMY{c_;i8jgpxjjR?lbQ?JHo zga!3(jlE*4diCbb8#jmWX@#pRWp``AN~g?x822j7ZQE`}?VOpkIxRC5b)$)HH|(gB zjdqw(!-=L%!*-$(?8A1sd{*Or?5FmOT+Ympw&_C^s1MN?#^<>E&Xk2;kcAI2i$iI3 zkbEy1kdxpr*vWdkbA*9@MdM+SP>8BqYh_$neO2RYc$D2sl<4azc7?27BsA78 zL_Vf5)}!=s4UKRZhZO2A<;Zp|N6p@(^vEcw@J19Suz1|C~_h%~~ z)*%2V~x!7i!Gi0@!B+H9eHGWWxP%p`!nmFB^vOC#!v7jrDLR0>$54Vb5Dz9JEnUE zix1AIDV@zuTsqS=bpw8?@fOZgj^?g{k*;i|8#{LJP~9jyVMxw-w8N>Xtn^+v)V!nd zbHrpT_@&0L@N1SE`EU0Q)su&)S$88D=AXWTU8ijxyc=!~M9nihA%er^= zUH8rw;ojLac(36~p80vL;jcCX`4eA_!B0{iv(NXyv}p=3*@IW|lA_C5%W3 zBZ3)3lh`9JTF^y{4u>|g63rx9=lekOA`-OgFq<4mY}fl}X)-U|YcIAb)%}=LiFY?y z-|ONn_vV(O)1~NiDLP$>PW#c(x{F**%zDIpH{k*#WLT_3O89mZJaii^WUwfu_nOQ)>0Y9eoVjvW!7p-);3+%+8sk$ zdyv*18p2vY4uZaKPmyd9)l!M@9LB__okUw7W_ba(A42e$JWeZO3mxAUpXO5VsrVTr zx73>b=qkdJD5_jO;!Gg$DCK;Bgg(XsI7reTC&}NyEIffZ_!bu6X*A-n>(^utyOgY@ z=%&0CGPF{Ss_~JD{K1o>@9YISE1KMQ9N88>CChj(9KxdMyzhPnvE$g&GVcubZK=Jd zANR>%5ud4jpoq^G@lX+8j?XLN5sB%5zv$p|<%_=VEjl>lB6n#i*qf%ehgsi?Q*Q84FBU)eAbLrX!$>t}3k?C6 z26l+|urh?4TEchV#3G-I`MirZ1J#vse6=j)fs%lpAoX51`ZuYSl<#K}pWHI9svl3E z#It1NS!TGeh!_0Fmx?&bDGgiZO$gKNmruei15V4DB>CjP<0(Fp-f{j2 z$vh*EXK;2)ydOU*;&oZm<`;k`of~=F0$$_wb#|UNSdDLDG0rjfZ}Cg&JO%qRY{lFB zT6hO(ZcBUd7oH;jS|+3YB^m8^tJ;$hd-uE8I)SnC6VYd28{-!S>KMyFJyO|B@VP?> zRrMhl6k0vkyej`&8B|>fs*Y|+gZ2~~n6^T)!tK*Xx|1d(OEVbv+d`KQD0Hx&oW?Jz z5Ij;ffK^L50e@!&{eyz~C+hI8vUJYyaRrTr>uCEorBZ&_k7}V9_e*(qAFlPV%1hZz z6-)Y5Ja`g?f%2Wht_}Q$;O|m}|7H2U$MU^^sY+p%3Lvhkkx-+`h*(%6Vqsm93%D&<>sM=qT3Uf(x2SJb6GPB60n-HKeY%WvblF{Z2m0*K@E7>3 zv9+4m=&OIo7o*-;iD|?(eZWoF`Ph5!xgY27^~c9U0Jm|=K#bvGzz4#$!WSJeu>3$g z6@hSV5gyssJ5qT;Xf^wek}VZTx4ZSn@b||;)j)z_$qTxcupQ}#!U}hlB`CHcPp=<} z`yK8p5im@u9T^tZ3A-^C@C}Bk0e1?v=PE8;4YAbtJCj}6=?Y4v=Jk9pluD4-uanLY2B>^z_u8_zWw>k-Cl!wyuY~QEI0#hbso=8FI&W z-&KLp%>J;GizoCk>b}-XOL6;ollw#Zq+4D;u*CzZ36?)W z=xfjTfD4}C+w6w>tl4DIgHS=(jGt9vlZl|4+C-y{1bGCW7`bmYKjeT!K- zo8(C5IFAdoGF-%^VW^kGQ2FvZOgCR6S=q5X zQ-TMS+6PS0I*U)p;V{C=N2%q9SfHY=qey5Im`4d^!doT(6k^|zG%%MS^9o(Wa06?! QCWy%vZqiOytJ9|E7cjl5M*si- diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$1ContainerUpdater.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$1ContainerUpdater.class deleted file mode 100644 index c8ae7537d95647d4b156d9fb9cc686754588557e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 zcmb_b+iuf95IviOni|uFmP^aEmjF&L7$n|;c!>(Cl+sFpB6xG{A=%>Yn%zw+@gsZ( z4+Mz^K7e0A2)+O@Zn&ut^d(wpX4X4<&Up6Br|%y=0=SD+4<&)8Cf+9%*;gs;N4cRF zWJo1s|BBaA>9n!YMlW-+?Tl2Nt>1}*!`hvuRxXx`%#%Eg9T^W5f$DC&A4gfNI??9N zE+tN2%yp%$-4=M*8VPfQA@4~g-F<;K;fOF>+H@jHGMQV7?1768WZEHTqo&@=wUv$< zLn%qmI=vUQ6Qi??(m$E?ZGlQtr!)?MQvpt3%tslg19+GaD2MfJA5~0wI3qBBEOUTq zoMps3PF}JLpAW8|4{!l9OptJiJx6W%ngnX$`g(n+)Q*Ysu1svSrKNHW9~W`i!zF?6 zDEq&DD!>(774R*&4XFlPi{WuZMJFa(ERsjPy&W=-@^{UyhCm$Ix;v^7{)JbTS7wwAbW)uZExITl};=U!B+g#wF+mxq&V z$9cDj3NK)GY55)erS}L{Dt%0@u9QlBoa6-0 z4dDyVO?kHr z^g~zPxPj|1ly}>}00wm=aL2$9rWg`Awa`$BYO+(S9`I<_KJYk0x)eCJw{J&6y`O$e zD)KRGb>}v-YgAvYs_4BJGR)`N4u4SrMWu%Ig?%0K$Z5F8FnJYC4J@eRX|9NgOI*jI zLM;)yJE2-d(y+|%wky)gt`^SNz8AVS$yY}nE9&A`89x1YPW~&a7?r(91zB za`>iDjLBTl;+Egrb(?5b^c|0s?N_$BJPce7PZ)|_xoiW^Ky(@oLhiTPY?&IABZcZt zv+dM66K?sCdmhn>I?a|(eW~EtamF@zN1ZjiS_?}S3eTx=k1E;TS><{KC_$CC|=nd7|;OqeH_{M5|8l|8|0^{UU` za-X{<56=1PmK}P2pl{Zk(B2Mx+bzHT8`zpu=heJ~I78a=%Q`n5yBcskI1F`8*+as5 zwScc#Mm6LT+p}c5cDTauD-+pywblRUcskCWoI=O>vt_r1blhNek0D<4EZzsY76skt5#BWg z5_*MqT|pmY;f*Qiha$Wi3I;GJBZiv_hA_zx%ZNlnCAyWZT4kU6JI21l8ImQ>G@L!d zx5f9#k8#03hF4LYr<$ibmMVhfyH$p%OxyO)3t?S|qLAH_F@=nTdkhnou~k7m{%~51%_V3r2Z4A za||D&<9jxmn=Z)6;h|vMBZf~AEw9i^q}wkiOPk)1jv3mN$8L;8_aNP^rCbxYP`bju8Z$bd|Ws7NkhCG5X)>P9%iDfkaZs zyJ<<>O-s^lS`s!zcF`C@f^b*J+oEqmA*D?>kkn=x7}jzPjA&!=21d29?gqxSV@!N* zB5%=KZf2lP!4|1HC^w^b3b%2GES(QjdW+l^;>}o9`-0&k+$A$|1noO=VT>|#v)aU;R)61LIF!;<0PMDtdKWOGdZ$P NY0S|Ok60-^e*miAOb-A6 diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$3.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$3.class deleted file mode 100644 index ec2076cd8b5f3ae6075e523808f81cd36779005e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3077 zcmcgu-%}e^6#gy*0&!a+Vq35xLQ0cu=r)E{E44~PTG4>j1SVM;S&MuJ*JK@3EF*DhF_wG68p8K62-~Hq7Uw;FzjBnBy5_sh4 z`_j?;?@YO`wLSS%deSkZ-#4$CR^WQRw$ZTzs~&ik(|r7|VDvFpP9r6-;Cf9>8n)H; zrRE<5nk3r+X}TR>u9|u~kec3HtVGCZ4B@B$Q`y`ta(E@m){R~1ZPR$w^Kh9+th z>CH}SS9%S7*OnXr*U;^4-Lv@pWHH6LCa|6ig1IuqG~MEC-lC8%=3|HNPxvY)|4Lyy zgGJ=ixGqplB;OSjpbCuX2GyybD+&DYKW0cFcII9dHRSifN(M#TOk+vl>Yx&2IRzT1 z1B|!aeYv_z4}n}9&7S27RW{WSVVTAo0<(iGM@gDN3Co-;w*{`BXSCM|)}t7`so*W# zJq4C_vXTNej#|^x+k2MbYwIn&DG9d{RutUBJLG^bgK(7^S=|3KitKv{?<#l?s{$8E zm0ME7YBS7KUHN#)Mk*AgHL8q6QZiT0l`^Q{A;bPi;ID*mqk=m>-3ET`^{YXta@uKQ zCeCSK4E4H#5AdNtmY5?XwwmP!GNheCJX-w?p(hyT@rJ;YWUw!Bd4$Bb)i!ma*bHj; zh$Hb>;HQKlF*pwY4M_n(H6Q2ce!QXvN*&jc2T?Z9#)8#r5n=NoS|HK2K6*Z_X6iOS zCWHlLWg!_tAv(#_-HvC-hZb|#+&Oown|!~Z6ILC=rW=gY+>pVZYby8xUlO0XZRte! zjyj#+2rRzQ%*PY52UvYi+T2m;lCthl_Ev1&_a$*<_G~&~j(B*O?u;YZER!~non*=m zM>??swzVu-acr{3sdQZ05dr7m@GNu5r0aYdaT>0(Ab!qs0$ zW(cp*GeaYo{Y8;>2iX?%oWtvw57!rvqZPLOC;5@0@u~WZOh3cab6ndf(&W-1ZXBbu z!)w{GBa}CnSmZhG9O7-BUOB{l9!c=Q(lIJKYLQ>3=s$CW>LK1gMvY!VtI^`-sfUYn zRe`t#MU*fl%9t0+M0&T0bM8Ca~P ISBZvy07c-k1poj5 diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$4.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$4.class deleted file mode 100644 index ef5208ee62f42d0b08b20546e459d9a31e868daa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2248 zcmb_d-%}e^6#fngYzSK#BcVl$1rlhICQSuIOKKHjXrlpZLqXaqZZ_9s+hsTIZc=%( zGd}tc=z}vp_1PIo9i8dutK;7!o}19Z5F;;SW^?Y|dw$>VeEZiwzdZ*q4^2TI;ijWC zg_Uu?s)%N$?uajiBP?CGN7ng@;n|LxS#6k}QSuzas@{I7*g1^NEASJdwo}ar-8Aa1 z$heQaj9}j$TiOj*ELF6+Cmh0nS2Nt$RgPUemEc*znWkpObldVY!;&GQ#p9VgHY!!Y zspRaPy6qaCV5>oC<<^905-#?%C`kp@9=L8;hIfPTUHp{t?iunh$(|~mtP&dpf6lIm zK@iTW=*NIuy`n-vK(1a@F^FIgK15UuVU*yDOQW+zZq!<1r!1Uxt!xTHxM=H|xuH3R zd_UOq%c~+3PN(45JhxHVkzlx6C(OjVsym98yu?m6v7z7%!nuc9Q_Gl|Rn2q|xZE(z zig1D$MXWL8OsUaD@;$ex~9o-ed=co8PH>yX_mhC+nP3d1~Kc zAZqoxuquRfyxVbitb>B7VAgs2kyIQ|^G7FxGXUFK&-8 ztT!A+tCwS%V>~k0PlPNJW69I>N2^-BJOW6$Q4#G;p6uM{FJe5=3{P1EX57|#GSj_l2 zQ*&M6VuC5p$6q&JC?vTM2!$mRwk7i*pY-uF1eNv9@M@Xg{VYe4m-jH7Ozk0*Oz$C_ ze1?&q+uG;&KiIb7>`BLYewWs4gE73ulJGh%bo|i@M^$+5$?q87dWMUu$zKp^VPb1> z;Q2zoZ^8c*b7KP$|Lj`&Pt1IeX!;M#v=DD0^#evzFW+W2Q{jacW;eg}Q^X(X|7rhk z_B5Po;hi6Gp2c;aTuYtzDlNSK6pGyZ6(6u#xP=d8@;=Dq7ctB^RuP~YCdojY9x{nM z!V;Od#d~+iL77~bENzxemb=uzH`Htwn`}4e$w9GP8a~EtE;oQ(e1bdNnn_$j3F{p1 zF2~EEf1f*|C?Ew)-s2!%dfgc5Pj2xxCy37Qz)OMr3obo2y>vP0s>V5RZ1(QK<=(RO%}Pf*>%zz2lz!u z6eJG(0Dcr=Hi=MarNSYW)-${N=KJl>U*CTKc#NilIl?RLk2v|u_hF< zfim?+61y{#;9G>^$dBq~z)?h4?VQfyNQHftG`bcb=)w~ftLzy;HD;8-KSDNpg#30A zauI|}E-s*8wXzEb^Cjf4=%R=!A=j|ba!19yH$2>D{l?#qm{9E`fgkmJt?Yh!n74f- z?98Ty`lfWoIkb~{n-Vq}XKFe*%(fluRa4cu~Yldy7b*IlgG`kYXiG%->U$*TQF z2tuiw40XUSm2Je@IV61e&L8>Gy>=W#i4m6WayCdp2X#VwCQNg&fqR6dB;|PW5V{<3 zkf|glte@@J-^8<{b$8;J^>*YN!v1_9q7S$%dshqvjw@IeNw|t@Q&-PLTIchvFIf1B>!*Cs oM>zCp>|=R?oB9w7+{UU{=Ok^L;2o@s%%g_8XozN$wNd5!4YjU1S^xk5 diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$6.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor$6.class deleted file mode 100644 index c0f37c3a750399aaf17a5a09d4f97b7e3d6e81c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3173 zcmb_eS#uOs6#j0eGo3UY7$ZSs6Exr?AcKN&88#ULBxFDdqT)tp<|fn7(>+Z0Bm@`S za9bN~K&m+XS?XmzVVrxXgr(Iwf6hq8^5lnoLZB zX&{CxOf+D+KrE>iP3f{-xv5g@k>#yck0S*dyS$v`Y_rO?dao)qRVjgvOOtPNTL^r} z29=?}waIZwj^a$aB2cb2Z|0+Q0%NbzD1& z$I+aL7PPX|j&%EiLWov}a=ysKby&=I>5^R{)GaY_z0%eCfmIF+EX9pFmI=%n8{$an znP|gJ0y?=EK`=GhGI4~rn79=LtlqEm_~Bs`n3nA5n83UaD;Sia@>*qLHEt8A%Xw~K z*)FR$GdaRRreKx3CQrg6wQ0xw*uTJPF4d9}74 z4m=Yj#Z#jY)^CHYs#^woHmfji>;~t^dcMh+sGy&PC|Nm%rX{zl{vp^gn*Yn$C9R5H z-tM(!KH|IKkYW*&$RAe@oRbaPUn?D{>dO6DKw%S!?tpHyR;k*M>Kv=sleg66p(Q(7 zXjPNrF*UlqN;xOj*{YMxy~zEwSk-~;uiec#?CWk{Rt5zxuj3hk_DgaZnRpJ*v$N#L z;y|jL?+R}ofz0@3HxBG{%Q#Ta*{H494ialTFW_mhN>S*(ftT=#j+faRhe>9;{oXE_ z>I%`Kq1DS%>Xipg9KfprlZwMCf!{|qi0aB{^9`1pccjlsd%G&7^oTyfQ%dwkYDO*G zI#`nbZ!&Uu@wFpcVAXBLa-42;Pfv;C#RMKVc=^3y;xRl<#p_g%h#f9JKQfNx`_k8O zm>(?T0GlXn9q+JPUEGw-B*KWzk>{FEEng6k(V*MRE$ppCevyPr8TI5 z#&K%v!jnj}E;@dnzuP z;``&(&GY*g4dM1vxC{6Jch~Um0fFz)^ZJpqzcy)AquB+ni{!%3aGJD}aQQk_8^Ue{ zOe_Ru3qgSR0GEpo`F-;dW{MN+cAsF4_!OPuGi1f*cu;(S62}4Y6&?}a;3e@j4p2VI z@k@^1i6Q(VzQ-Tp6#f)Hh5&C-rNikez)Bjx9zr~weh1OaaxBIdRjCsPv6t^LWbq0f zqNLGU;$b{OBJ9NqJW5?0`?%vO7&HGyqmBh@j=7u^{PDY8 z)Sksg#Llb9B15q{sx@w77>WnxjD+znbd6xgKI3}?O93}3`DS!V0ZH{SJ diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/MultiStringPreferenceEditor.class deleted file mode 100644 index 99eb8552c3bc850a4a8dc638fd82d9effd40321e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10878 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 diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ValueSQDevPreferenceEditor$1.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/preferenceEditors/ValueSQDevPreferenceEditor$1.class deleted file mode 100644 index ab334bed6deeb8b6988d35d8faeeb5e63947923b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1266 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 Pf1C>of?*LE@qO_d&2%+T diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/ISQDevPreferenceEditorListener.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/ISQDevPreferenceEditorListener.class deleted file mode 100644 index 265cc3524415a4ace4608c6db70a199654b62f47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmaKnF$%&!6h!AoP1H)ff{ivVh+RsJAOutb_G|LhgplZFvxl?r03J%*C|IWX3^N1s z{_FjC0$5_;!6Eoc8ZJb2PuPf?;xj8QVy;B3(_Cz$!20J3mBxQ&8muY>*v!+K1u diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/SQDevChangeEvent.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/SQDevChangeEvent.class deleted file mode 100644 index c65ee36fdc67e0c69a36b4e39a1100b6cb333702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 821 zcmb7COK;Oa7@T!dCvn_YNXnx;TIeB31-@_tRdSOQ4pt)+$JfY7mef^hgT0RUSs;Nb zao`8=qY&dbY9o5$vb*znzM1)U{rk_)UjSa?s02;mW$Z6xXeFPga$$XnD5@qu0Nj3Z0=~{&pkg5GQ27l)kTm9 zSk8Z4JTJ_ct(n!Et-F~kjCN>Z2RhkOJDRwREb|%S450`>gHd zY&^yjBK9p+1=XJ7*-F#mF8FPu{T&BidC-u_Wnn>jCS&G=m5i1>4J%oolT{$Sef$Fl Zw_%K>ah*dq)`I9aLG+s- u}#a|$iqvZeq diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/SQDevInvalidPreferenceException.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/SQDevInvalidPreferenceException.class deleted file mode 100644 index 53b7d97d71f69b2f8db82d13b89cfe2e5a4475a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 zcma)6OHd3n82cE9ZIL* z|5THQg{CL>q$i!K^b4)Pt{1lMuE@iZb7QPlT1KV{pBm}b24)XMo-+6c0 z^<=kPV91xAZPhE%^ZEKtX+=PMC(ys_I(}d|LB*=KWKY@r>(3uc5B?G8RgCN-fmHdS zb!Zjpma|{j3Ow7{Ul16m$vvx857wpcTlC^C8E# zm0ed280gdaZ_YqL(eJgLJ=bdp43=$2-f1;N(jc=UhVk|0q`@nM_E6jy#MOEHZR)3-678W%yRl{%Q*ex~ir7}U^ zm#1MI=ksoZmS-6I_(l$C;Yfsv@pFf1h{vV;u-o4Cs( z;W7wqo+U2SbOa{<!(Pe#%d-+`c1lKQw%%1}} zN#H?>N%Oc(A&2QUbcVB*a9zTx;-p+;DKj?(@7(9{XO zUnl=NKd4!D1WdH^q71u%A>70;<}rswUYGbQM#vYtz>% diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/SQDevPreferenceComposite.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/util/SQDevPreferenceComposite.class deleted file mode 100644 index c5b4f756005bb60dccc1343d7bb0789d539d70d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 968 zcmbVKT}vB56g`uV-MVho`dL3q=!3~hJ1DiZ46&p1t>+Gjs3%o4@}6tmBP~oWO@9>`_PRpH1q?IH6NYsM8=V zyGFI;(bs+I9S+dF=sb?JGUTElP>Pb4q()oCnxwuk@5E%0@jtK!* zld-l1Hp|a7GG0?1`qDi=q2xF`X*1VkEoy}AdYCAi_rZcWQ<`;#$~-tb`>t`wQ#Jx` zpYW^#MQwgrGos4Z!jUA*A$2xs3pFYxIHYfIPgf_K+=`G@lyUh#J;-POx@`#XEyuite-ALCP?jRSnEJsSzu@oGPx|0#{)1FaQ7m From 4e3ae9b27196c94ad233e6aecc219c27dec8b3e6 Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Sun, 1 Apr 2018 18:07:08 +0200 Subject: [PATCH 10/23] almost completed new SQFProcessor; extended test cases; adjustments to DataTypeLists --- .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 94903 -> 94924 bytes .../sqdev/constants/ProblemMessages.java | 61 ++-- .../src/raven/sqdev/misc/DataTypeList.java | 120 +++---- .../sqdev/parser/sqf/SQFSyntaxProcessor.java | 14 +- .../sqdev/parser/sqf/SQFValidatorOLD.java | 6 +- .../sqdev/parser/sqf/tests/SQFParserTest.java | 13 +- .../sqdev/sqf/processing/SQFProcessor.java | 295 ++++++++++++++++-- .../processing/tests/SQFProcessingTest.java | 148 ++++++++- 8 files changed, 526 insertions(+), 131 deletions(-) diff --git a/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar b/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar index 0810813a4facd95649328704cf14bb8cabc1facc..9b95ddf8286b2bfe3307df3a781970d50b79ce15 100644 GIT binary patch delta 4742 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 g<^M7g3Pnlf|7)>Oco expected, Iterable got) { StringBuilder builder = new StringBuilder("Expected type "); + boolean multipleTypes = false; - for (int i = 0; i < expected.length; i++) { - EDataType currentType = expected[i]; - - if (i == 0) { + for (EDataType currentType : expected) { + if (!multipleTypes) { builder.append("\"" + currentType + "\""); + multipleTypes = true; } else { - if (i == expected.length - 1) { - builder.append(" or \"" + currentType + "\""); - } else { - builder.append(", \"" + currentType + "\""); - } + builder.append(", \"" + currentType + "\""); } } - builder.append(" but got "); + // replace last comma by "or" + int commaIndex = builder.lastIndexOf(","); + if (commaIndex >= 0) { + builder.replace(commaIndex, commaIndex + 1, " or"); + } - for (int i = 0; i < got.length; i++) { - EDataType currentType = got[i]; + builder.append(" but got "); - if (i == 0) { + multipleTypes = false; + for (EDataType currentType : got) { + if (!multipleTypes) { builder.append("\"" + currentType + "\""); + multipleTypes = true; } else { - if (i == got.length - 1) { - builder.append(" or \"" + currentType + "\""); - } else { - builder.append(", \"" + currentType + "\""); - } + builder.append(", \"" + currentType + "\""); } } + // replace last comma by "or" + commaIndex = builder.lastIndexOf(","); + if (commaIndex >= 0) { + builder.replace(commaIndex, commaIndex + 1, " or"); + } + builder.append("!"); return builder.toString(); @@ -333,6 +349,13 @@ public static final String privateVariablesMustBeLocal() { return "Private variables have to be local (starting with \"_\")"; } + /** + * Error message stating that the given keyword is reserved + */ + public static final String reservedKeyword(String keyword) { + return "\"" + keyword + "\" is a reserved keyword!"; + } + /** * The error message for internal errors */ diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/misc/DataTypeList.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/misc/DataTypeList.java index d77f2ada..14afde0f 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/misc/DataTypeList.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/misc/DataTypeList.java @@ -13,22 +13,22 @@ * */ public class DataTypeList extends ArrayList { - + private static final long serialVersionUID = -3449702221130512936L; - + /** * The seperator used to seperate different data types */ public static final String TYPE_SEPERATOR = "/"; - - + + /** * Creates a new DataTypeList */ public DataTypeList() { super(); } - + /** * Creates a new DataTypeList with the given entry * @@ -37,78 +37,80 @@ public DataTypeList() { */ public DataTypeList(EDataType type) { super(); - + add(type); } - + /** * Creates a new DataTypeList with the given set of entries * * @param types - * The entries to directly add + * The entries to add directly */ public DataTypeList(Collection types) { super(types); } - + + /** + * Creates a new DataTypeList with the given set of entries + * + * @param types + * The entries to add directly + */ + public DataTypeList(EDataType[] types) { + for (EDataType current : types) { + add(current); + } + } + /** - * Checks whether this list contains an exchangable data type for the given - * one. + * Checks whether this list contains an exchangeable data type for the given one. * * @param type * The type that should be checked * @param reverseChecking - * Indicates whether reverse checking should be enabled as well. - * That means that the respective list entry is checked whether - * it can be replaced by the given type instead of only the other - * way round + * Indicates whether reverse checking should be enabled as well. That + * means that the respective list entry is checked whether it can be + * replaced by the given type instead of only the other way round */ - public boolean containsExchangableType(EDataType type, - boolean reverseChecking) { + public boolean containsExchangableType(EDataType type, boolean reverseChecking) { return findExchangableDataType(type, reverseChecking) != -1; } - + /** - * Finds the index of a data type that is exchangable with the given data - * type. + * Finds the index of a data type that is exchangable with the given data type. * * @param type * The data type to search for * @param reverseChecking - * Indicates whether reverse checking should be enabled as well. - * That means that the respective list entry is checked whether - * it can be replaced by the given type instead of only the other - * way round + * Indicates whether reverse checking should be enabled as well. That + * means that the respective list entry is checked whether it can be + * replaced by the given type instead of only the other way round * @return The index of the found entry or -1 if none could be * found */ - public int findExchangableDataType(EDataType type, - boolean reverseChecking) { + public int findExchangableDataType(EDataType type, boolean reverseChecking) { return findExchangableDataType(type, reverseChecking, 0); } - + /** - * Finds the index of a data type that is exchangable with the given data - * type. + * Finds the index of a data type that is exchangable with the given data type. * * @param type * The data type to search for * @param reverseChecking - * Indicates whether reverse checking should be enabled as well. - * That means that the respective list entry is checked whether - * it can be replaced by the given type instead of only the other - * way round + * Indicates whether reverse checking should be enabled as well. That + * means that the respective list entry is checked whether it can be + * replaced by the given type instead of only the other way round * @param startIndex - * Defines the index of the element the search should be started - * at + * Defines the index of the element the search should be started at * @return The index of the found entry or -1 if none could be * found */ - public int findExchangableDataType(EDataType type, boolean reverseChecking, - int startIndex) { + public int findExchangableDataType(EDataType type, boolean reverseChecking, int startIndex) { for (int i = startIndex; i < size(); i++) { EDataType currentType = get(i); - + if (currentType == type) { // a data type is exchangable with itself return i; @@ -116,7 +118,7 @@ public int findExchangableDataType(EDataType type, boolean reverseChecking, if (currentType == null || type == null) { continue; } - + if (type.canBeUsedAs(currentType)) { return i; } @@ -124,10 +126,10 @@ public int findExchangableDataType(EDataType type, boolean reverseChecking, return i; } } - + return -1; } - + /** * Adds the given data type if it is not yert contained in the list * @@ -139,7 +141,7 @@ public void addUnique(EDataType type) { add(type); } } - + /** * Adds the entries of the given collection if they are not yet contained in * this list @@ -152,66 +154,64 @@ public void addAllUnique(Collection collection) { addUnique(currentType); } } - + @Override public String toString() { StringBuilder builder = new StringBuilder(); - + for (EDataType currentType : this) { builder.append(currentType + TYPE_SEPERATOR); } - + if (size() > 0) { // remove last seperator builder.setLength(builder.length() - TYPE_SEPERATOR.length()); } - + return builder.toString(); } - + /** - * Creates a new {@link DataTypeList} and tries to fill it with the given - * types + * Creates a new {@link DataTypeList} and tries to fill it with the given types * * @param types - * The different data types to store in the list. Each datatype - * has to be seperated by {@link #TYPE_SEPERATOR} + * The different data types to store in the list. Each datatype has + * to be seperated by {@link #TYPE_SEPERATOR} * @return The created and populated list */ public static DataTypeList fillWith(String types) { DataTypeList list = new DataTypeList(); - + // extract all types out of this and add them to the list for (String currentStringType : types.split(TYPE_SEPERATOR)) { EDataType currentType = EDataType.resolve(currentStringType); - + if (currentType == null) { try { - throw new SQDevException( - "Couldn't resolve type \"" + currentStringType + "\""); + throw new SQDevException("Couldn't resolve type \"" + currentStringType + "\""); } catch (SQDevException e) { e.printStackTrace(); - + // TODO: log } } else { list.add(currentType); } } - + return list; } - + /** * Converts this list into a respective array */ public EDataType[] toArray() { EDataType[] types = new EDataType[size()]; - + for (int i = 0; i < types.length; i++) { types[i] = get(i); } - + return types; } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java index 71223e4b..4842ec8e 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java @@ -21,11 +21,11 @@ public class SQFSyntaxProcessor { /** * The potential datatypes of the left argument */ - private EDataType[] leftArgumentTypes; + private Iterable leftArgumentTypes; /** * The potential datatypes of the right argument */ - private EDataType[] rightArgumentTypes; + private Iterable rightArgumentTypes; /** * Indicates whether the command has been validated with the provided argument * types @@ -59,7 +59,7 @@ public SQFSyntaxProcessor(SQFCommand command) { * @param types * The potential EDataTypes */ - public void setLeftArgumentTypes(EDataType[] types) { + public void setLeftArgumentTypes(Iterable types) { leftArgumentTypes = types; validated = false; } @@ -70,7 +70,7 @@ public void setLeftArgumentTypes(EDataType[] types) { * @param types * The potential EDataTypes */ - public void setRightArgumentTypes(EDataType[] types) { + public void setRightArgumentTypes(Iterable types) { rightArgumentTypes = types; validated = false; } @@ -199,8 +199,7 @@ protected void validate() { if (leftArgumentTypes != null && validProvidedLeftTypes.isEmpty()) { // left argument is invalid - errorMessage = ProblemMessages.expectedTypeButGot( - validGeneralLeftTypes.toArray(new EDataType[validGeneralLeftTypes.size()]), leftArgumentTypes); + errorMessage = ProblemMessages.expectedTypeButGot(validGeneralLeftTypes, leftArgumentTypes); activeSyntax = null; @@ -247,8 +246,7 @@ protected void validate() { // TODO: note the left arg ctx in the error msg if possible // The right argument is invalid as the program reached this part of the // code - errorMessage = ProblemMessages.expectedTypeButGot( - validGeneralRightTypes.toArray(new EDataType[validGeneralRightTypes.size()]), rightArgumentTypes); + errorMessage = ProblemMessages.expectedTypeButGot(validGeneralRightTypes, rightArgumentTypes); activeSyntax = null; diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java index c0bea315..3d97e2b1 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java @@ -344,8 +344,8 @@ public void exitBinaryExpression(BinaryExpressionContext ctx) { DataTypeList rightTypes = getReturnValues(ctx.getChild(2)); SQFSyntaxProcessor processor = new SQFSyntaxProcessor(operator); - processor.setLeftArgumentTypes(leftTypes.toArray()); - processor.setRightArgumentTypes(rightTypes.toArray()); + processor.setLeftArgumentTypes(leftTypes); + processor.setRightArgumentTypes(rightTypes); if (!processor.isValid()) { String errorMsg = processor.getErrorMessage(); @@ -405,7 +405,7 @@ public void exitUnaryExpression(UnaryExpressionContext ctx) { SQFSyntaxProcessor processor = new SQFSyntaxProcessor(operator); - processor.setRightArgumentTypes(argumentTypes.toArray()); + processor.setRightArgumentTypes(argumentTypes); if (!processor.isValid()) { String errorMsg = processor.getErrorMessage(); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java index 0029c9e5..44c6c7eb 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java @@ -17,6 +17,7 @@ import raven.sqdev.exceptions.SQDevException; import raven.sqdev.infoCollection.base.Keyword; import raven.sqdev.interfaces.ISQFInformation; +import raven.sqdev.misc.DataTypeList; import raven.sqdev.misc.EDataType; import raven.sqdev.misc.FileUtil; import raven.sqdev.misc.Macro; @@ -104,8 +105,10 @@ public void error_typeMismatch() { input = "hint 3"; result = process(input); - expectedMarker = createErrorMarker(5, 1, ProblemMessages.expectedTypeButGot( - new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }, new EDataType[] { EDataType.NUMBER })); + expectedMarker = createErrorMarker(5, 1, + ProblemMessages.expectedTypeButGot( + new DataTypeList(new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }), + new DataTypeList(new EDataType[] { EDataType.NUMBER }))); // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); @@ -133,8 +136,8 @@ public void error_typeMismatch() { result = process(input); expectedMarker = createErrorMarker(1, 7, ProblemMessages.expectedTypeButGot( - new EDataType[] { EDataType.NUMBER, EDataType.ARRAY, EDataType.STRING }, - new EDataType[] { EDataType.OBJECT })); + new DataTypeList(new EDataType[] { EDataType.NUMBER, EDataType.ARRAY, EDataType.STRING }), + new DataTypeList(new EDataType[] { EDataType.OBJECT }))); // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); @@ -163,7 +166,7 @@ public void error_missingSemicolon() { SQFParseResultOld result; Marker expectedMarker; Map macros = new HashMap(); - macros.put("CHECK_TRUE",new Macro("CHECK_TRUE")); + macros.put("CHECK_TRUE", new Macro("CHECK_TRUE")); input = "diag_log 3 hint 'hello'"; diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java index bcc18b61..187212bf 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java @@ -10,11 +10,11 @@ import org.eclipse.core.resources.IMarker; import dataStructures.ESQFOperatorType; +import dataStructures.ESQFTokentype; import dataStructures.ISQFTreeListener; import dataStructures.ITokenSource; import dataStructures.IndexTreeElement; import dataStructures.SQFToken; -import dataStructures.TokenBuffer; import raven.sqdev.constants.ProblemMessages; import raven.sqdev.exceptions.ValidationException; import raven.sqdev.infoCollection.base.SQFCommand; @@ -24,6 +24,7 @@ import raven.sqdev.misc.DataTypeList; import raven.sqdev.misc.EDataType; import raven.sqdev.parser.misc.TreeProcessingResult; +import raven.sqdev.parser.sqf.ERelativePosition; import raven.sqdev.parser.sqf.SQFSyntaxProcessor; public class SQFProcessor implements ISQFTreeListener { @@ -102,27 +103,111 @@ public SQFProcessor(ISQFInformation info, TreeProcessingResult result, ITokenSou } @Override - public void nularExpression(SQFToken expression) { - final String operator = expression.getText(); + public void nularExpression(SQFToken expression, IndexTreeElement node) { + assert (expression.operatorType() != ESQFOperatorType.MACRO); + final String operatorName = expression.getText(); + final String operatorNameLower = operatorName.toLowerCase(); + + switch (expression.type()) { + case OPERATOR: + // only operators are going to be processed in this method + // variable validation will be handled in doGetReturnValues + break; + default: + // it is most likely a primitive type like Number -> even if not: This won't be + // handled here + return; + } + + SQFCommand operator = sqfInformation.getNularOperators().get(operatorNameLower); + + if (operator == null) { + // assume any type for erroneous input + error(expression, ProblemMessages.operatorIsNotNular(operatorName)); + + resolvedReturnValues.put(node, ANYTHING); + } else { + resolvedReturnValues.put(node, operator.getAllReturnTypes()); + } } @Override public void unaryExpression(SQFToken expression, IndexTreeElement node) { - final String operator = expression.getText(); + assert (expression.operatorType() != ESQFOperatorType.MACRO); + assert (node.getChildrenCount() == 1); + + final String operatorName = expression.getText(); + final String operatorNameLower = operatorName.toLowerCase(); + SQFCommand operator = sqfInformation.getUnaryOperators().get(operatorNameLower); + if (operator == null) { + // might be a binary operator used in unary syntax + operator = sqfInformation.getBinaryOperators().get(operatorNameLower); + } + + if (operatorNameLower.equals("private")) { + // handle private separately + handlePrivate(node.getChildren().get(0)); + return; + } + + if (operator == null) { + // if it's still null then this is not a unary operator + error(expression, ProblemMessages.operatorIsNotUnary(operatorName)); + + // assume any type for erroneous input + resolvedReturnValues.put(node, ANYTHING); + + return; + } + + if (!operator.isUnaryOperator()) { + // This operator can't be used in a unary way + error(expression, ProblemMessages.operatorIsNotUnary(operator.getKeyword())); + return; + } + // check whether the given argument is of a valid type + syntaxProcessor.setOperator(operator); + syntaxProcessor.setRightArgumentTypes(getReturnValues(node.getChildren().get(0))); + + // buffer return value for this node + resolvedReturnValues.put(node, syntaxProcessor.getReturnValues()); + + if (!syntaxProcessor.isValid()) { + if (syntaxProcessor.getErrorMarkerPosition() == ERelativePosition.RIGHT) { + error(node.get(0), syntaxProcessor.getErrorMessage()); + } else { + error(expression, syntaxProcessor.getErrorMessage()); + } + } else { + // check for special cases in which a variable-name extraction has to be + // performed + switch (operatorNameLower) { + case "params": + handleParams(node.getChildren().get(0)); + break; + + case "for": + handleFor(node.getChildren().get(0)); + break; + } + } } @Override public void binaryExpression(SQFToken expression, IndexTreeElement node) { final String operatorName = expression.getText(); - switch (operatorName) { + switch (operatorName.toLowerCase()) { case "=": // assignment assignment(node); break; + case "params": + handleParams(node.getChildren().get(1)); + default: // "normal" binary operator SQFCommand operator = sqfInformation.getBinaryOperators().get(operatorName.toLowerCase()); @@ -132,8 +217,8 @@ public void binaryExpression(SQFToken expression, IndexTreeElement node) { DataTypeList rightTypes = getReturnValues(node.getChildren().get(1)); syntaxProcessor.setOperator(operator); - syntaxProcessor.setLeftArgumentTypes(leftTypes.toArray()); - syntaxProcessor.setRightArgumentTypes(rightTypes.toArray()); + syntaxProcessor.setLeftArgumentTypes(leftTypes); + syntaxProcessor.setRightArgumentTypes(rightTypes); if (!syntaxProcessor.isValid()) { int[] positionData; @@ -178,8 +263,7 @@ public void binaryExpression(SQFToken expression, IndexTreeElement node) { @Override public void start() { - // TODO Auto-generated method stub - + // nothing to set up at start } @Override @@ -206,8 +290,8 @@ public void finished() { * considered to be assignment arguments (there have to be two!) */ protected void assignment(IndexTreeElement node) { - assert(node.getChildrenCount() == 2); - + assert (node.getChildrenCount() == 2); + IndexTreeElement variableNode = node.getChildren().get(0); boolean isPrivate = variableNode.hasChildren(); @@ -233,6 +317,9 @@ protected void assignment(IndexTreeElement node) { if (!varOperatorToken.getText().toLowerCase().equals("private")) { // only private is allowed as a modifier error(tokenBuffer.get(node.getIndex()), ProblemMessages.privateIsOnlyValidModifierForAssignments()); + + // assume for the moment that the modifier came here by accident + isPrivate = false; } variableNode = variableNode.getChildren().get(0); @@ -246,11 +333,16 @@ protected void assignment(IndexTreeElement node) { } String varName = tokenBuffer.get(variableNode.getIndex()).getText(); - if (!varName.startsWith("_") && isPrivate) { - // trying to declare global variable as private - error(variableNode, ProblemMessages.privateVariablesMustBeLocal()); + if (isPrivate && !varName.startsWith("_")) { + // don't add global, private variables + // The error is produced as soon as the unary private keyword is being processed + return; + } + if (!isOperatorName(varName)) { + declaredVariables.add(varName.toLowerCase()); + } else { + error(tokenBuffer.get(variableNode.getIndex()), ProblemMessages.reservedKeyword(varName)); } - declaredVariables.add(varName.toLowerCase()); } /** @@ -456,18 +548,34 @@ protected int[] getNodeDimension(IndexTreeElement node) throws ValidationExcepti } /** - * Gets the possible return values of the given + * Gets the possible return values of the given node. Calling this method will + * trigger the return-value-buffering which means that it will populate + * {@link #resolvedReturnValues} if there is no entry for the given node yet. If + * there is the previously determined return values will be returned * * @param node - * @return + * The node whose return values are to be determined + * @return The list of return values */ protected DataTypeList getReturnValues(IndexTreeElement node) { // Check whether the return value for that node has already been determined -> // Especially used for context sensitive return values of operators - if (resolvedReturnValues.containsKey(node)) { - return resolvedReturnValues.get(node); + if (!resolvedReturnValues.containsKey(node)) { + resolvedReturnValues.put(node, doGetReturnValues(node)); } + return resolvedReturnValues.get(node); + } + + /** + * Gets all the possible return values of the given node. Calling this method + * directly will bypass the return-value-buffering system + * + * @param node + * The node whose return values are to be determined + * @return The list of return values + */ + protected DataTypeList doGetReturnValues(IndexTreeElement node) { if (node.getIndex() >= 0) { SQFToken token = tokenBuffer.get(node.getIndex()); @@ -486,7 +594,7 @@ protected DataTypeList getReturnValues(IndexTreeElement node) { case SUBSTRING: return STRING; default: - // do nothing -> wil be handled below + // do nothing -> will be handled below } switch (token.operatorType()) { @@ -504,6 +612,20 @@ protected DataTypeList getReturnValues(IndexTreeElement node) { operator = sqfInformation.getNularOperators().get(token.getText().toLowerCase()); if (operator == null) { // If it is not recognized it will be handled elsewhere + if (token.type() == ESQFTokentype.ID) { + // This might be a variable + String id = token.getText(); + if (!declaredVariables.contains(id.toLowerCase())) { + if (id.startsWith("_")) { + // it is an unknown local variable -> error + error(token, ProblemMessages.undefinedLocalVariable(id)); + } else { + // this is an implicitly declared global variable + // TODO: potential error + declaredVariables.add(id.toLowerCase()); + } + } + } return ANYTHING; } else { return operator.getAllReturnTypes(); @@ -569,6 +691,139 @@ protected void getAllTokenIndices(IndexTreeElement node, Collection ind } } + /** + * Handles the argument of the "private" operator/keyword + * + * @param node + * The {@linkplain IndexTreeElement} corresponding to the argument of + * "private" (or the ID of the variable private was used as a keyword + * for) + */ + protected void handlePrivate(IndexTreeElement node) { + assert (node.getIndex() != IndexTreeElement.INVALID); + + if (node.getIndex() < 0) { + // the argument has to be an array of variable names + if (!node.hasChildren()) { + error(node, ProblemMessages.invalidExpression("private-array")); + return; + } + + // iterate through all children and extract declared variables + for (IndexTreeElement currentElement : node.getChildren()) { + if (currentElement.getIndex() < 0) { + error(currentElement, ProblemMessages.invalidExpression("private-array")); + } else { + SQFToken varToken = tokenBuffer.get(currentElement.getIndex()); + + if (varToken.type() != ESQFTokentype.STRING) { + if (varToken.type() != ESQFTokentype.COMMA + && varToken.type() != ESQFTokentype.SQUARE_BRACKET_OPEN + && varToken.type() != ESQFTokentype.SQUARE_BRACKET_CLOSE) { + // comma and square brackets are obviously allowed in an array + error(varToken, ProblemMessages.invalidExpression("private-array-element")); + } + } else { + extractVariableFromString(varToken, varToken.getText(), true); + } + } + } + } else { + // the argument is either a String containing a variable name or an ID + SQFToken argToken = tokenBuffer.get(node.getIndex()); + + if (argToken.type() == ESQFTokentype.STRING) { + extractVariableFromString(argToken, argToken.getText(), true); + } else { + if (argToken.type() == ESQFTokentype.ID) { + String varName = argToken.getText(); + + if (!varName.startsWith("_")) { + error(argToken, ProblemMessages.privateVariablesMustBeLocal()); + return; + } + + if (!isOperatorName(varName)) { + declaredVariables.add(varName.toLowerCase()); + } else { + error(argToken, ProblemMessages.reservedKeyword(varName)); + } + } else { + error(argToken, ProblemMessages.invalidExpression("private")); + } + } + } + } + + /** + * Handles the argument of the "for"-keyword + * + * @param arg + * The respective {@linkplain IndexTreeElement} corresponding to the + * argument of a "for" operator + */ + protected void handleFor(IndexTreeElement arg) { + // TODO + } + + /** + * Handles the argument of the "params"-keyword + * + * @param arg + * The respective {@linkplain IndexTreeElement} corresponding to the + * argument of a "params" operator + */ + protected void handleParams(IndexTreeElement arg) { + // TODO + } + + /** + * Extracts a variable from a String as it occurs with private, params and for + * + * @param token + * The token corresponding to said String + * @param varString + * The string containing the variable name. Its first and last + * character will be removed in order to "destringify" it + * @param mustBePrivate + * Whether the extracted variable is expected to be a private + * variable + */ + protected void extractVariableFromString(SQFToken token, String varString, boolean mustBePrivate) { + // remove quotes + varString = varString.substring(1, varString.length() - 1); + + if (varString.contains(" ")) { + error(token, ProblemMessages.noWhitespaceAllowed()); + return; + } + + if (mustBePrivate && !varString.startsWith("_")) { + error(token, ProblemMessages.canOnlyDeclareLocalVariable()); + return; + } + + if (!isOperatorName(varString)) { + declaredVariables.add(varString.toLowerCase()); + } else { + error(token, ProblemMessages.reservedKeyword(varString)); + } + } + + /** + * Checks whether the given name corresponds to an operator-keyword + * + * @param name + * The name to check. It will be transformed to lowercase + * automatically + */ + protected boolean isOperatorName(String name) { + name = name.toLowerCase(); + return sqfInformation.getBinaryOperators().containsKey(name) + || sqfInformation.getUnaryOperators().containsKey(name) + || sqfInformation.getNularOperators().containsKey(name); + } + /** * Gets the result of this validation */ diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java index 55a10cef..c3a39ae1 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java @@ -16,6 +16,8 @@ import raven.sqdev.exceptions.SQDevException; import raven.sqdev.interfaces.ISQFParseSupplier; import raven.sqdev.interfaces.ITreeProcessingResult; +import raven.sqdev.misc.DataTypeList; +import raven.sqdev.misc.EDataType; import raven.sqdev.misc.FileUtil; import raven.sqdev.misc.Macro; import raven.sqdev.parser.misc.ParseUtil; @@ -117,21 +119,21 @@ public void assignments() throws IOException { assertTrue(result.getDeclaredLocalVariables().size() == 1); assertTrue(result.getMarkers().size() == 0); assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); - + macros.put("GVAR", new Macro("GVAR")); - + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("GVAR(myVar) = {}".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 1); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 0); assertTrue(result.getDeclaredGlobalVariables().keySet().contains("GVAR(myVar)")); - + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("GVAR(myVar) = {}".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 1); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 0); assertTrue(result.getDeclaredGlobalVariables().keySet().contains("GVAR(myVar)")); - + macros.clear(); } @@ -142,25 +144,139 @@ public void assignmentErros() throws IOException { assertTrue(result.getDeclaredGlobalVariables().size() == 1); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); - assertEquals("Missing ';'", - result.getMarkers().iterator().next().getMessage()); + assertEquals("Missing ';'", result.getMarkers().iterator().next().getMessage()); assertTrue(result.getDeclaredGlobalVariables().keySet().contains("myvar")); - - result = ParseUtil - .parseAndProcessSQF(new ByteArrayInputStream("= 3".getBytes()), supplier, info); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player = 3".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.reservedKeyword("player"), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("= 3".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.operatorIsNotUnary("="), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("=".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.operatorIsNotNular("="), result.getMarkers().iterator().next().getMessage()); + } + + @Test + public void privateTest() throws IOException { + ITreeProcessingResult result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("private _myVar = 3".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().iterator().next().equals("_myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("private \"_myVar\"".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("private ['_myVar', \"_yourVar\"]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 2); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_yourvar")); + } + + @Test + public void privateErrorTest() throws IOException { + ITreeProcessingResult result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("private myVar = 3".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.privateVariablesMustBeLocal(), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("private \"myVar\"".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); - assertEquals("Missing ';'", - result.getMarkers().iterator().next().getMessage()); - - result = ParseUtil - .parseAndProcessSQF(new ByteArrayInputStream("=".getBytes()), supplier, info); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("private ['myVar', \"_yourVar\"]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_yourvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("private ['_myVar', \"yourVar\"]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_myvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("private ['myVar', \"yourVar\"]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 2); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + } + + @Test + public void unaryExpressions() throws IOException { + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint 'Test'".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint \"Test\"".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint format []".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + } + + @Test + public void unaryExpressionErrors() throws IOException { + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint 3".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot( + new DataTypeList(new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }), + new DataTypeList(EDataType.NUMBER)), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint []".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot( + new DataTypeList(new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }), + new DataTypeList(EDataType.ARRAY)), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint {}".getBytes()) { + }, supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); - assertEquals("Missing ';'", - result.getMarkers().iterator().next().getMessage()); + assertEquals(ProblemMessages.expectedTypeButGot( + new DataTypeList(new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }), + new DataTypeList(EDataType.CODE)), result.getMarkers().iterator().next().getMessage()); } From e4fd6d3b5b15a8778cb34fe9a52a6a232dcbce7b Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Mon, 2 Apr 2018 16:14:13 +0200 Subject: [PATCH 11/23] improved SQF processing; expanded test cases --- .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 94924 -> 95942 bytes .../sqdev/constants/ProblemMessages.java | 51 +++- .../raven/sqdev/parser/misc/ParseUtil.java | 2 + .../sqdev/sqf/processing/SQFProcessor.java | 144 +++++++++- .../processing/tests/SQFProcessingTest.java | 247 ++++++++++++++++++ 5 files changed, 432 insertions(+), 12 deletions(-) diff --git a/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar b/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar index 9b95ddf8286b2bfe3307df3a781970d50b79ce15..140f9ac197f0562ebfd822c06f7897162cfc940b 100644 GIT binary patch delta 19760 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 delta 18785 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 diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java index 8b71ceba..3546f616 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java @@ -288,10 +288,31 @@ public static final String missingSemicolon(String at) { } /** - * The error message stating thath there is an unclosed opening character pair + * The error message stating that there is a missing comma + * + * @param at + * The ID after which the semicolon was expected + */ + public static final String missingComma(String at) { + return "Missing ',' at \"" + at + "\""; + } + + /** + * The error message stating that the given token is misplaced and that it + * should either be deleted or moved elsewhere. + * + * @param token + * The misplaced token + */ + public static final String misplacedToken(String token) { + return "Misplaced token \"" + token + "\". Delete or move it!"; + } + + /** + * The error message stating that there is an unclosed opening character pair * * @param opener - * The opening character that doesnt get closed + * The opening character that doesn't get closed */ public static final String unclosedOpener(char opener) { char openMark, closeMark; @@ -356,6 +377,32 @@ public static final String reservedKeyword(String keyword) { return "\"" + keyword + "\" is a reserved keyword!"; } + /** + * The error message stating that the expected array size has not been matched + * + * @param expected + * The expected array length + * @param got + * The actual array length + * @return The constructed error message + */ + public static final String expectedArrayLength(int expected, int got) { + return "Expected array with exactly " + expected + " elements but got " + got; + } + + /** + * The error message stating that the minimal array size has not been reached + * + * @param minimum + * The expected minimal array length + * @param got + * The actual array length + * @return The constructed error message + */ + public static final String expectedMinimumArrayLength(int minimum, int got) { + return "Expected array with at least " + minimum + " elements but got only " + got; + } + /** * The error message for internal errors */ diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java index e4e82cf5..60e08623 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java @@ -92,6 +92,8 @@ public static final SQFParseResult parseSQF(InputStream input, ISQFParseSupplier if (sqfParser == null) { sqfParser = new SQFParser(errorListener); sqfParser.setErrorListener(errorListener); + // missing terminators are handled in the SQFProcessor + sqfParser.suppressMissingTerminatorErrorMessages(true); } sqfParser.parse(sqfLexer); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java index 187212bf..9c0d09a0 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java @@ -2,15 +2,17 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.eclipse.core.resources.IMarker; - import dataStructures.ESQFOperatorType; import dataStructures.ESQFTokentype; +import dataStructures.IBuildableIndexTree; import dataStructures.ISQFTreeListener; import dataStructures.ITokenSource; import dataStructures.IndexTreeElement; @@ -168,6 +170,7 @@ public void unaryExpression(SQFToken expression, IndexTreeElement node) { } // check whether the given argument is of a valid type + syntaxProcessor.reset(); syntaxProcessor.setOperator(operator); syntaxProcessor.setRightArgumentTypes(getReturnValues(node.getChildren().get(0))); @@ -205,9 +208,6 @@ public void binaryExpression(SQFToken expression, IndexTreeElement node) { assignment(node); break; - case "params": - handleParams(node.getChildren().get(1)); - default: // "normal" binary operator SQFCommand operator = sqfInformation.getBinaryOperators().get(operatorName.toLowerCase()); @@ -216,6 +216,7 @@ public void binaryExpression(SQFToken expression, IndexTreeElement node) { DataTypeList leftTypes = getReturnValues(node.getChildren().get(0)); DataTypeList rightTypes = getReturnValues(node.getChildren().get(1)); + syntaxProcessor.reset(); syntaxProcessor.setOperator(operator); syntaxProcessor.setLeftArgumentTypes(leftTypes); syntaxProcessor.setRightArgumentTypes(rightTypes); @@ -252,6 +253,10 @@ public void binaryExpression(SQFToken expression, IndexTreeElement node) { // map the resolved processor to the respective node resolvedReturnValues.put(node, syntaxProcessor.getReturnValues()); + + if (operatorName.toLowerCase().equals("params")) { + handleParams(node.getChildren().get(1)); + } } else { // apparently it is not a binary operator -> shouldn't even be reachable error(expression, ProblemMessages.operatorIsNotBinary(operatorName)); @@ -262,12 +267,58 @@ public void binaryExpression(SQFToken expression, IndexTreeElement node) { } @Override - public void start() { - // nothing to set up at start + public void array(IndexTreeElement node) { + // check whether all array elements are separated by a comma + + boolean wasComma = true; + int lastTokenIndex = node.getChildren().get(node.getChildrenCount() - 1).getIndex(); + // If the last token is the closing bracket, don't iterate over it (if not an + // error should occur somewhere else) + int length = (lastTokenIndex >= 0 + && tokenBuffer.get(lastTokenIndex).type() == ESQFTokentype.SQUARE_BRACKET_CLOSE) + ? node.getChildrenCount() - 1 + : node.getChildrenCount(); + + for (int i = 1; i < length; i++) { + IndexTreeElement element = node.getChildren().get(i); + + if (wasComma) { + if (element.getIndex() >= 0 && (tokenBuffer.get(element.getIndex()).type() == ESQFTokentype.COMMA + || tokenBuffer.get(element.getIndex()).type() == ESQFTokentype.SEMICOLON)) { + // two commas next to each other or a semicolon -> invalid + error(element, ProblemMessages.misplacedToken(",")); + } + wasComma = false; + } else { + // this element has to be a comma or the closing square bracket + if (element.getIndex() < 0 || tokenBuffer.get(element.getIndex()).type() != ESQFTokentype.COMMA) { + // missing comma + SQFToken lastToken = getLastToken(node.getChildren().get(i - 1)); + error(lastToken, ProblemMessages.missingComma(lastToken.getText())); + } else { + wasComma = true; + } + } + } + + if (wasComma && node.getChildrenCount() > 2) { + // The last token in the array before the closing bracket was a comma -> error + error(node.getChildren().get(node.getChildrenCount() - 2), ProblemMessages.misplacedToken(",")); + } } @Override - public void finished() { + public void code(IndexTreeElement node) { + // TODO: check semicolons + } + + @Override + public void start(IBuildableIndexTree tree) { + // TODO: check for semicolons + } + + @Override + public void finished(IBuildableIndexTree tree) { // add all found variables to the result Iterator varIterator = declaredVariables.iterator(); @@ -756,14 +807,53 @@ protected void handlePrivate(IndexTreeElement node) { } /** - * Handles the argument of the "for"-keyword + * Handles the argument of the "for"-keyword. This method assumes that it has + * already been assured that the respective argument is either of type array or + * of type String * * @param arg * The respective {@linkplain IndexTreeElement} corresponding to the * argument of a "for" operator */ protected void handleFor(IndexTreeElement arg) { - // TODO + if (arg.getIndex() < 0) { + // it's the array syntax (has been validated before to assure that it is the + // correct type) + + if (!arg.hasChildren()) { + error(arg, ProblemMessages.internalError()); + } + + boolean wasComma = true; + int elements = 0; + + for (int i = 1; i < arg.getChildrenCount() - 1; i++) { + IndexTreeElement currentElement = arg.getChildren().get(i); + + if (wasComma) { + // validate that all elements are of type code + DataTypeList types = getReturnValues(currentElement); + if (types != CODE) { + error(currentElement, ProblemMessages.expectedTypeButGot(CODE, types)); + } + + elements++; + wasComma = false; + } else { + wasComma = true; + } + + } + + if(elements != 3) { + error(arg, ProblemMessages.expectedArrayLength(3, elements)); + } + } else { + // it's the string-syntax (has been validated before to assure that it is the + // correct type) + SQFToken token = tokenBuffer.get(arg.getIndex()); + extractVariableFromString(token, token.getText(), true); + } } /** @@ -794,7 +884,7 @@ protected void extractVariableFromString(SQFToken token, String varString, boole varString = varString.substring(1, varString.length() - 1); if (varString.contains(" ")) { - error(token, ProblemMessages.noWhitespaceAllowed()); + error(token, ProblemMessages.variableMayNotContainBlank()); return; } @@ -824,6 +914,40 @@ protected boolean isOperatorName(String name) { || sqfInformation.getNularOperators().containsKey(name); } + /** + * Gets the token with the lowest index in the given node + * + * @param node + * The node to search for the respective token + * @return The leftmost token + */ + protected SQFToken getFirstToken(IndexTreeElement node) { + List indices = new ArrayList<>(); + + getAllTokenIndices(node, indices); + + Collections.sort(indices); + + return tokenBuffer.get(indices.get(0)); + } + + /** + * Gets the token with the highest index in the given node + * + * @param node + * The node to search for the respective token + * @return The rightmost token + */ + protected SQFToken getLastToken(IndexTreeElement node) { + List indices = new ArrayList<>(); + + getAllTokenIndices(node, indices); + + Collections.sort(indices); + + return tokenBuffer.get(indices.get(indices.size() - 1)); + } + /** * Gets the result of this validation */ diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java index c3a39ae1..a7a824ff 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java @@ -54,6 +54,37 @@ public Map getMacros() { } }; } + + @Test + public void missingSemicolonTest() throws IOException { + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player hint ''".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.missingSemicolon("player"), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("i=1 hint ''".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 1); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.missingSemicolon("1"), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player setPos getPos player disableSerialization".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.missingSemicolon("player"), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("call {3 disableSerialization}".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.missingSemicolon("3"), result.getMarkers().iterator().next().getMessage()); + } @Test public void assignments() throws IOException { @@ -166,6 +197,109 @@ public void assignmentErros() throws IOException { assertEquals(ProblemMessages.operatorIsNotNular("="), result.getMarkers().iterator().next().getMessage()); } + @Test + public void arrays() throws IOException { + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[]".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[[]]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[2]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[2, 3]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[2, \"\"]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[2, []]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[2, [5, 7]]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[2, {}]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[2, {test = [2, 'three']}]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 1); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredGlobalVariables().keySet().contains("test")); + } + + @Test + public void arrayErrors() throws IOException { + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[3,]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.misplacedToken(","), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[,]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.misplacedToken(","), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[[,]]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.misplacedToken(","), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[[3,]]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.misplacedToken(","), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[[3],]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.misplacedToken(","), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[3 3]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.missingComma("3"), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[3 []]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.missingComma("3"), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[[] 3]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.missingComma("]"), result.getMarkers().iterator().next().getMessage()); + } + @Test public void privateTest() throws IOException { ITreeProcessingResult result = ParseUtil @@ -231,6 +365,119 @@ public void privateErrorTest() throws IOException { assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); } + @Test + public void forTest() throws IOException { + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for \"_i\"".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for \"_i\" from 1 to 4".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for \"_i\" from 1 to 4 do {}".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for \"_i\" from 1 to 4 do {};".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for '_i'".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for '_i' from 1 to 4".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for '_i' from 1 to 4 do {}".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for '_i' from 1 to 4 do {};".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("for [{_i = 0}, {_i < 5}, {_i = _i + 1}]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + } + + @Test + public void forErrors() throws IOException { + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for \"i\"".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for 'i'".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for '_ i'".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.variableMayNotContainBlank(), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for [{_i = 0}, {_i < 5}]".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedArrayLength(3, 2), result.getMarkers().iterator().next().getMessage()); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for [{_i = 0}, {_i < 5}, '']".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.CODE), + new DataTypeList(EDataType.STRING)), result.getMarkers().iterator().next().getMessage()); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for [{_i = 0}, {_i < 5}, \"\"]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.CODE), + new DataTypeList(EDataType.STRING)), result.getMarkers().iterator().next().getMessage()); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + } + @Test public void unaryExpressions() throws IOException { ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint 'Test'".getBytes()), From 0faf544f956f34cbcefe8d6bdfdc9d59aa77182b Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Tue, 3 Apr 2018 13:18:23 +0200 Subject: [PATCH 12/23] finished work on SQFProcessor; extended test cases --- .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 95942 -> 95976 bytes .../sqdev/constants/ProblemMessages.java | 13 + .../sqdev/sqf/processing/SQFProcessor.java | 144 +++++++++- .../processing/tests/SQFProcessingTest.java | 249 ++++++++++++++++-- 4 files changed, 384 insertions(+), 22 deletions(-) diff --git a/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar b/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar index 140f9ac197f0562ebfd822c06f7897162cfc940b..91f117d3f9b0cf394970ad979baf74127eb141df 100644 GIT binary patch delta 3953 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 diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java index 3546f616..c0d0589e 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java @@ -402,6 +402,19 @@ public static final String expectedArrayLength(int expected, int got) { public static final String expectedMinimumArrayLength(int minimum, int got) { return "Expected array with at least " + minimum + " elements but got only " + got; } + + /** + * The error message stating that the maximal array size has been exceeded + * + * @param maximum + * The expected maximal array length + * @param got + * The actual array length + * @return The constructed error message + */ + public static final String expectedMaximalArrayLength(int maximum, int got) { + return "Expected array with at most " + maximum + " elements but got " + got; + } /** * The error message for internal errors diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java index 9c0d09a0..22c6bf5c 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java @@ -309,12 +309,12 @@ public void array(IndexTreeElement node) { @Override public void code(IndexTreeElement node) { - // TODO: check semicolons + checkSemicolons(node.getChildren()); } @Override public void start(IBuildableIndexTree tree) { - // TODO: check for semicolons + checkSemicolons(tree.branches()); } @Override @@ -333,6 +333,41 @@ public void finished(IBuildableIndexTree tree) { } } + /** + * Checks whether semicolons are provided where needed and issues errors if this + * is not the case + * + * @param nodes + * The collection of nodes representing the code-elements + */ + protected void checkSemicolons(Collection nodes) { + boolean wasStatement = false; + IndexTreeElement prevNode = null; + + for (IndexTreeElement currentNode : nodes) { + if (currentNode.getIndex() < 0) { + // it's definitely a statement + wasStatement = true; + } else { + SQFToken currentToken = tokenBuffer.get(currentNode.getIndex()); + + boolean isStatement = currentToken.operatorType() != ESQFOperatorType.OTHER + && currentToken.type() != ESQFTokentype.SEMICOLON; + + if (wasStatement && isStatement) { + // there should have been a semicolon in between + assert (prevNode != null); + SQFToken lastToken = getLastToken(prevNode); + error(lastToken, ProblemMessages.missingSemicolon(lastToken.getText())); + } + + wasStatement = isStatement && currentToken.operatorType() != ESQFOperatorType.MACRO; + + prevNode = currentNode; + } + } + } + /** * This method processes any occurring assignments done by the "=" operator * @@ -844,8 +879,8 @@ protected void handleFor(IndexTreeElement arg) { } } - - if(elements != 3) { + + if (elements != 3) { error(arg, ProblemMessages.expectedArrayLength(3, elements)); } } else { @@ -857,14 +892,106 @@ protected void handleFor(IndexTreeElement arg) { } /** - * Handles the argument of the "params"-keyword + * Handles the argument of the "params"-operator. This method assumes that it + * has already been assured that the respective argument is of type array. * * @param arg * The respective {@linkplain IndexTreeElement} corresponding to the * argument of a "params" operator */ protected void handleParams(IndexTreeElement arg) { - // TODO + assert (arg.hasChildren()); + + for (IndexTreeElement currentChild : arg.getChildren()) { + if (currentChild.getIndex() >= 0 + && tokenBuffer.get(currentChild.getIndex()).operatorType() == ESQFOperatorType.OTHER) { + // skip brackets and commas + continue; + } + + if (currentChild.getIndex() < 0) { + // array syntax + if (!currentChild.hasChildren()) { + error(currentChild, ProblemMessages.internalError()); + continue; + } + handleParamsArray(currentChild); + } else { + // String syntax + SQFToken stringToken = tokenBuffer.get(currentChild.getIndex()); + + if (stringToken.type() != ESQFTokentype.STRING) { + error(stringToken, ProblemMessages.expectedTypeButGot(STRING, getReturnValues(currentChild))); + } else { + if (stringToken.getText().length() > 2) { + // empty strings are allowed in this context but there is no variable to extract + // from them + extractVariableFromString(stringToken, stringToken.getText(), true); + } + } + } + } + } + + /** + * Processes the sub-array-construct that may appear inside the argument-array + * of the "params"-operator + * + * @param array + * The sub-array to process + */ + protected void handleParamsArray(IndexTreeElement array) { + if (array.getChildrenCount() < 5) { + error(array, ProblemMessages.expectedMinimumArrayLength(2, (array.getChildrenCount() - 1) / 2)); + return; + } + + if (array.getChildrenCount() > 9) { + error(array, ProblemMessages.expectedMaximalArrayLength(4, (array.getChildrenCount() - 1) / 2)); + return; + } + + for (int i = 1; i < array.getChildrenCount() - 1; i++) { + IndexTreeElement currentElement = array.getChildren().get(i); + + if (currentElement.getIndex() > 0) { + if (tokenBuffer.get(currentElement.getIndex()).operatorType() == ESQFOperatorType.OTHER) { + // skip commas + continue; + } + } + + DataTypeList types = getReturnValues(currentElement); + + switch (i) { + case 1: + // first element has to be a String + if (types.findExchangableDataType(EDataType.STRING, true) < 0) { + error(currentElement, ProblemMessages.expectedTypeButGot(STRING, types)); + } else { + SQFToken varToken = tokenBuffer.get(currentElement.getIndex()); + extractVariableFromString(varToken, varToken.getText(), true); + } + break; + case 3: + // second element can be anything + break; + case 5: + // third element (if present) has to be an array + if (types.findExchangableDataType(EDataType.ARRAY, true) < 0) { + error(currentElement, ProblemMessages.expectedTypeButGot(ARRAY, types)); + } + break; + case 7: + // forth element (if present) can either be an array or a number + if (types.findExchangableDataType(EDataType.ARRAY, true) < 0 + && types.findExchangableDataType(EDataType.NUMBER, true) < 0) { + error(currentElement, ProblemMessages.expectedTypeButGot( + new DataTypeList(new EDataType[] { EDataType.NUMBER, EDataType.ARRAY }), types)); + } + break; + } + } } /** @@ -888,6 +1015,11 @@ protected void extractVariableFromString(SQFToken token, String varString, boole return; } + if (varString.isEmpty()) { + error(token, ProblemMessages.stringMayNotBeEmpty()); + return; + } + if (mustBePrivate && !varString.startsWith("_")) { error(token, ProblemMessages.canOnlyDeclareLocalVariable()); return; diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java index a7a824ff..7134ccb3 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java @@ -54,30 +54,81 @@ public Map getMacros() { } }; } - + @Test - public void missingSemicolonTest() throws IOException { - ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player hint ''".getBytes()), + public void semicolons() throws IOException { + ITreeProcessingResult result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("player; hint ''".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("player setPos getPos leader group player".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("player setPos getPos leader group player; private _i = 4".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + + macros.put("CHECK", new Macro("CHECK")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("CHECK hint \"Test\"".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("CHECK(some stuff in here) hint \"Test\"".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("CHECK(some, ;stuff in hint str player) hint \"Test\"".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("CHECK(some stuff in here); hint \"Test\"".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + macros.clear(); + } + + @Test + public void semicolonErrors() throws IOException { + ITreeProcessingResult result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("player hint ''".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); assertEquals(ProblemMessages.missingSemicolon("player"), result.getMarkers().iterator().next().getMessage()); - - result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("i=1 hint ''".getBytes()), - supplier, info); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("i=1 hint ''".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 1); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); assertEquals(ProblemMessages.missingSemicolon("1"), result.getMarkers().iterator().next().getMessage()); - - result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player setPos getPos player disableSerialization".getBytes()), - supplier, info); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("player setPos getPos player disableSerialization".getBytes()), supplier, + info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); assertEquals(ProblemMessages.missingSemicolon("player"), result.getMarkers().iterator().next().getMessage()); - + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("call {3 disableSerialization}".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); @@ -175,7 +226,8 @@ public void assignmentErros() throws IOException { assertTrue(result.getDeclaredGlobalVariables().size() == 1); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); - assertEquals("Missing ';'", result.getMarkers().iterator().next().getMessage()); + assertEquals(ProblemMessages.missingSemicolon("someOperator"), + result.getMarkers().iterator().next().getMessage()); assertTrue(result.getDeclaredGlobalVariables().keySet().contains("myvar")); result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player = 3".getBytes()), supplier, info); @@ -280,19 +332,19 @@ public void arrayErrors() throws IOException { assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); assertEquals(ProblemMessages.misplacedToken(","), result.getMarkers().iterator().next().getMessage()); - + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[3 3]".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); assertEquals(ProblemMessages.missingComma("3"), result.getMarkers().iterator().next().getMessage()); - + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[3 []]".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); assertEquals(ProblemMessages.missingComma("3"), result.getMarkers().iterator().next().getMessage()); - + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[[] 3]".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); assertTrue(result.getDeclaredLocalVariables().size() == 0); @@ -326,7 +378,7 @@ public void privateTest() throws IOException { } @Test - public void privateErrorTest() throws IOException { + public void privateErrors() throws IOException { ITreeProcessingResult result = ParseUtil .parseAndProcessSQF(new ByteArrayInputStream("private myVar = 3".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); @@ -467,7 +519,7 @@ public void forErrors() throws IOException { assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.CODE), new DataTypeList(EDataType.STRING)), result.getMarkers().iterator().next().getMessage()); assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); - + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("for [{_i = 0}, {_i < 5}, \"\"]".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); @@ -478,6 +530,171 @@ public void forErrors() throws IOException { assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); } + @Test + public void params() throws IOException { + ITreeProcessingResult result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("params [\"_i\", \"_j\"]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 2); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_j")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [\"_i\", \"\", \"_j\"]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 2); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_j")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params ['_i', '_j']".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 2); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_j")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params ['_i', '', '_j']".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 2); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_i")); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_j")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params []".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[\"_testVar\", nil]]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("params [[\"_testVar\", nil], ['_secondVar', player]]".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 2); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_secondvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[\"_testVar\", nil, []]]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("params [[\"_testVar\", nil, [player, \"\"]]]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("params [[\"_testVar\", nil, [player, \"\"], 3]]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("params [[\"_testVar\", nil, [player, \"\"], [3,4]]]".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 0); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); + } + + @Test + public void paramsErrors() throws IOException { + ITreeProcessingResult result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("params [\"i\"]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [\"i\", \"\", \"_j\"]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_j")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[]]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedMinimumArrayLength(2, 0), + result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [['_test']]".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedMinimumArrayLength(2, 1), + result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[nil, nil, nil, nil, nil]]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedMaximalArrayLength(4, 5), + result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[\"testVar\", nil]]".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("params [[\"_testVar\", nil], ['secondVar', player]]".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.canOnlyDeclareLocalVariable(), result.getMarkers().iterator().next().getMessage()); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[3, nil]]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.STRING), + new DataTypeList(EDataType.NUMBER)), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[\"_testVar\", nil, 3]]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.ARRAY), + new DataTypeList(EDataType.NUMBER)), result.getMarkers().iterator().next().getMessage()); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[\"_testVar\", nil, [], \"\"]]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 1); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(new EDataType[] {EDataType.NUMBER, EDataType.ARRAY}), + new DataTypeList(EDataType.STRING)), result.getMarkers().iterator().next().getMessage()); + assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); + } + @Test public void unaryExpressions() throws IOException { ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint 'Test'".getBytes()), From 44f67152f0e865a33407f89745f7d9bd4084c69d Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Tue, 3 Apr 2018 18:41:59 +0200 Subject: [PATCH 13/23] expanded test cases; minor bugfix in SQFProcessor --- .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 95976 -> 96374 bytes .../sqdev/sqf/processing/SQFProcessor.java | 54 +++--- .../processing/tests/SQFProcessingTest.java | 176 +++++++++++++++++- 3 files changed, 201 insertions(+), 29 deletions(-) diff --git a/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar b/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar index 91f117d3f9b0cf394970ad979baf74127eb141df..64b433310f9de0453988c1131adf23d2f4e45781 100644 GIT binary patch delta 4389 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 delta 3979 zcmY*c2{=@38$R#Y*NBlVj6Hivg{*}bYkan%5VDSC3<;yCM3xMWU3P6$Q-+YO$dd9^ zvV@RiD-mTW|2h2s_1Bqe=6;{|xu4}-&oe6v44>y2*e&sN^t=!=Gc%-Wcb)wdM%?bc z-+3kks54B?94MM#&odxMnPI|FRK$3x8-jhPo?=D9QL3f5sf-dDbadi&F_dNoF^ZAQ z4r-9}9e^5&$!gG{L>+x`YLt8=+NST;K)RsrGmU7SxRuNu2WaA1-Q*4IMpd(O`d>o|0I=MNu^7p^VsbQix8&D6hdD zMeCA;~$1P4E|b+Y8KYPpV%}zv;2@Tq`R+v{LxG=ljjC zk^ZBauYZs-2fzC2M@u@E<)z}zujB{6T>Y}zqkd55*YbQQXrR>DD5tundvnzqmTOiE(!&YZ&U4_&1Gb}*q` z$Cc86;qJ^HXvw0f)ZtW%0A4`#@}vp@JS=*V?8iFvyV<^#bhyhSQ$^UW^aID`HB9%q zIY%A&UQY8(laCgSiu~a-tGBt2)`{XSeJaoN`m8HM*L%MuKBebs z3l_|8cV-C09jGNrfaf+Xow|PR~R1(4_bSuJ=>Sd zt5m?s~*-+|!lLJ)9g8=Y4IwNVF>5E2*fqd@NPPvT&$cTlsnA z*)XT^z90EQbD|Dd+xjH0V~^9MhOGuz$Lrqw}{H z$DZzhHx2`7{_USUSmfNwIy%NuE0x*f)Y7cU*sI6zRdcZHyZ!zCX?IG8mb$Et8tGGu zZVRc}$+J+Nlw5o(J6R%p*}_O{AwN=F<8kLB2>+TiPU;@7KAj~kt4cc3ikWue_&OHZ z))~iiNz3OkDd;@G`={=Tt@Gq$Ue4k7YHV}@Xn2YNr{k2Fi{+94(C zPS%lIb$)hm2d3ha>WdK30=4-%2 zjFwlsalOZ2F!lveF_nI~sAIUHWJo{H;uElw{K?@M7gFK|PBb=Et}x7TedAsUThMA@ zi+kV7M!VYCHAxq0IWY2#>k2&P7ieK?5k?kzWyoL0BKcI;iCw``DEJGTr9>D*)xNOg zoE;X&dU{ykmpV#KU#Yu zn)35H)9)6%Z(vt_f4KsSYT=pn_+e}($Ji5k_>ipcJIBmD|bn}^Hvp~P>f!siK zi~fuyYuPcr9_}BpX@c)DFLy14uV$?lp3o5e#bJqOVwUQuu}WlsAUAdh`u}?hxy40| z(N__Ai*u5PZOsTgT3p(MsAmBe%nWFgTE~yex^TZ`qfZrk%A#IJO~kf44~%3muZ;=} z1(GOHDJHo!hvK#Jv!=2<+fGnjo0YgsJO-Z5l-)}-4E}fa?F-Wd3~TeX3msE5>%^bw zR~fvUMETskZcvx0@9;^SoZ&3OO~fRz8k~^EJ=PNPgL=o>;$r9HK2aSCEvti*>u321 zmS-QZHq%0Q7j zdDY81o+qMB{sDIpS^o;D$E>y z!58ppvk*S?x5S_h}xBTT%l#Vrhj6-Sp z?d)r(Ribk%lQrrFu29Fqc=ctBj1~+#WDcBR#oL|@vG2a>o47AV)h%1UVHu0w>v#L9oKL!C;mBN;?Y~EWXyl` z19n%-KUeErdo33uJqxcp;u$kTc{dn@X{$JycONaB_vyXDazD8<-#Of{yja}KfqAge zT0VX7CwZAo2R3vHqC_J*bx8Z% z9jWP?JWRTuXpUHdS7dTntMbH;QGbqIncOGEdC9lfb04}S+#UHg%yVwAH@kMcI+K=q zHAL{1;b2AVMXR3nm+xkV`~vA1)C8AB)lQ66jyWb58b!<=eyCp;Gkc~^`@HG>-tSJ@ zq_vTC!_Y74xuv2Jf$aQ4HdwP2h8EM;U2%OiZA-;3->03S3FhC6Xtis4B@o?VDsdu= zBfPADY)~fD@!i`q^S9IDm$EOoqwjZ&7KcF_o8lV+n=%Vb{OjD7uFnKrBv671mbjGw6f{HT5+_*SG!!&r6^hh^h* z<8}Y~S)rVGy#FVAQg=l4yM|HpbQ+&sW+c$K3eWk`O{ansz@$40!0cJjH6a% zdTy1XNSku6fE_*^2pFg)`CME6PTq)rH2JvCcs(EDhs^xSxJQ4!J8qA`FK zhcsX@X&^zXk^lshMnj~h0L=&fUI!b6DDDO*DAL@vW!E#H7?qjaK>>;t z?%*zpb{^n1iu9hq3q^t_ut$q!xYHBZq8;LAw+S!Lf*e%#^#U-84Bp!gZ+QcAx+3>* zc-F_XYZ5Xy5jNZm%Z}`tvdJfpy&g7QJubhybuP z6S96l7{frIsK^Q->kOau1Iif9fNhZtZuHw`y+Bz$K@=Af4rccUykf`%n+~)}oN8u+ zpxRv!B=u(;h(<)1GO(vVki&FEBW-c`kw4(tvdSC#_v=wc2;%01Ad$bUDzCzO2|y@= zfTWk7r6YYjuvh?4#~jZ1 zUz-&U3jkcGqxb-X^gV-;pD7OeAp?W^0)PnSP&U%B8+Ld7Z+=D`zfAW42ol2}-@o#U z%7w27g5BtLRmLpmp#r)S;if>uZ%aNr5(soLzSXc;5WsB>RmRJ`&jxYhLk~d`f4MU4 zgk6Hb-YwScS4@Xo5Y}CUCI1)eTQ|z$rBw9@z@tIiBb^UIg57?JDtKU#V6Yp_Kr0yO zbbU=>f6EW^yCNea2O}d(nS%?0fdmd+D{$W;W{nSm7BwLV`&W=p5P+{^03Xa2f*3Lo z5km=nSc(Y5QP0LiAWXN218|-M5a6`L0}L;;{XY{?CZo#Bk^tT-4FnYaR>qjNo3eC% z=YpVP(h!71{^K!~hL?yypDy+wfR)ve(B?>JG}_4!WE^w4aCivN!%P^!4I#*k9y|tb zh5&60(HPbtAyywv0Gw even if not: This won't be - // handled here return; } - SQFCommand operator = sqfInformation.getNularOperators().get(operatorNameLower); + final String operatorName = expression.getText(); + final String operatorNameLower = operatorName.toLowerCase(); + final SQFCommand operator = sqfInformation.getNularOperators().get(operatorNameLower); + + if (!declaredVariables.contains(operatorName.toLowerCase())) { + if (operatorName.startsWith("_")) { + // it is an unknown local variable -> error + error(expression, ProblemMessages.undefinedLocalVariable(operatorName)); + + // assume any type for variables + resolvedReturnValues.put(node, ANYTHING); + return; + } else { + if (operator == null && expression.type() == ESQFTokentype.ID) { + // this is an implicitly declared global variable + // TODO: potential error + declaredVariables.add(operatorName.toLowerCase()); + + // assume any type for variables + resolvedReturnValues.put(node, ANYTHING); + return; + } + } + } else { + // assume any type for variables + resolvedReturnValues.put(node, ANYTHING); + return; + } if (operator == null) { // assume any type for erroneous input @@ -179,7 +201,7 @@ public void unaryExpression(SQFToken expression, IndexTreeElement node) { if (!syntaxProcessor.isValid()) { if (syntaxProcessor.getErrorMarkerPosition() == ERelativePosition.RIGHT) { - error(node.get(0), syntaxProcessor.getErrorMessage()); + error(node.getChildren().get(0), syntaxProcessor.getErrorMessage()); } else { error(expression, syntaxProcessor.getErrorMessage()); } @@ -698,20 +720,6 @@ protected DataTypeList doGetReturnValues(IndexTreeElement node) { operator = sqfInformation.getNularOperators().get(token.getText().toLowerCase()); if (operator == null) { // If it is not recognized it will be handled elsewhere - if (token.type() == ESQFTokentype.ID) { - // This might be a variable - String id = token.getText(); - if (!declaredVariables.contains(id.toLowerCase())) { - if (id.startsWith("_")) { - // it is an unknown local variable -> error - error(token, ProblemMessages.undefinedLocalVariable(id)); - } else { - // this is an implicitly declared global variable - // TODO: potential error - declaredVariables.add(id.toLowerCase()); - } - } - } return ANYTHING; } else { return operator.getAllReturnTypes(); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java index 7134ccb3..c050b295 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java @@ -6,6 +6,7 @@ import java.io.File; import java.io.IOException; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import org.junit.Before; @@ -20,6 +21,7 @@ import raven.sqdev.misc.EDataType; import raven.sqdev.misc.FileUtil; import raven.sqdev.misc.Macro; +import raven.sqdev.misc.Marker; import raven.sqdev.parser.misc.ParseUtil; import raven.sqdev.parser.misc.SQFTokenFactory; import raven.sqdev.parser.sqf.SQFInformation; @@ -223,7 +225,7 @@ public void assignments() throws IOException { public void assignmentErros() throws IOException { ITreeProcessingResult result = ParseUtil .parseAndProcessSQF(new ByteArrayInputStream("someOperator myVar = 3".getBytes()), supplier, info); - assertTrue(result.getDeclaredGlobalVariables().size() == 1); + assertTrue(result.getDeclaredGlobalVariables().size() == 2); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); assertEquals(ProblemMessages.missingSemicolon("someOperator"), @@ -678,7 +680,8 @@ public void paramsErrors() throws IOException { assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.STRING), new DataTypeList(EDataType.NUMBER)), result.getMarkers().iterator().next().getMessage()); - result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[\"_testVar\", nil, 3]]".getBytes()), supplier, info); + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[\"_testVar\", nil, 3]]".getBytes()), + supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); assertTrue(result.getDeclaredLocalVariables().size() == 1); assertTrue(result.getMarkers().size() == 1); @@ -686,15 +689,80 @@ public void paramsErrors() throws IOException { new DataTypeList(EDataType.NUMBER)), result.getMarkers().iterator().next().getMessage()); assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); - result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("params [[\"_testVar\", nil, [], \"\"]]".getBytes()), supplier, info); + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("params [[\"_testVar\", nil, [], \"\"]]".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); assertTrue(result.getDeclaredLocalVariables().size() == 1); assertTrue(result.getMarkers().size() == 1); - assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(new EDataType[] {EDataType.NUMBER, EDataType.ARRAY}), + assertEquals(ProblemMessages.expectedTypeButGot( + new DataTypeList(new EDataType[] { EDataType.NUMBER, EDataType.ARRAY }), new DataTypeList(EDataType.STRING)), result.getMarkers().iterator().next().getMessage()); assertTrue(result.getDeclaredLocalVariables().keySet().contains("_testvar")); } + @Test + public void nularExpressions() throws IOException { + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("3".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("{}".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("{player}".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("\"Test\"".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("'Test'".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player; disableSerialization".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + } + + @Test + public void nularExpressionErrors() throws IOException { + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("_testVar".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.undefinedLocalVariable("_testVar"), + result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[_testVar]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.undefinedLocalVariable("_testVar"), + result.getMarkers().iterator().next().getMessage()); + } + @Test public void unaryExpressions() throws IOException { ITreeProcessingResult result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint 'Test'".getBytes()), @@ -733,14 +801,110 @@ public void unaryExpressionErrors() throws IOException { new DataTypeList(new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }), new DataTypeList(EDataType.ARRAY)), result.getMarkers().iterator().next().getMessage()); - result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint {}".getBytes()) { - }, supplier, info); + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint {}".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot( + new DataTypeList(new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }), + new DataTypeList(EDataType.CODE)), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[hint {}]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot( + new DataTypeList(new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }), + new DataTypeList(EDataType.CODE)), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("{hint {}}".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 1); assertEquals(ProblemMessages.expectedTypeButGot( new DataTypeList(new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }), new DataTypeList(EDataType.CODE)), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint player".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot( + new DataTypeList(new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }), + new DataTypeList(EDataType.OBJECT)), result.getMarkers().iterator().next().getMessage()); + } + + @Test + public void binaryExpressions() throws IOException { + ITreeProcessingResult result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("player setPos [0,0,0]".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player setPos getPos player".getBytes()), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF( + new ByteArrayInputStream("player setPos getPos leader group player".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[] select params []".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + } + + @Test + public void binaryExpressionErrors() throws IOException { + ITreeProcessingResult result = ParseUtil + .parseAndProcessSQF(new ByteArrayInputStream("player setPos 3".getBytes()), supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.ARRAY), + new DataTypeList(EDataType.NUMBER)), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("player setPos time".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.ARRAY), + new DataTypeList(EDataType.NUMBER)), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("time setPos [0,0,0]".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.OBJECT), + new DataTypeList(EDataType.NUMBER)), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[time setPos [0,0,0]]".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 1); + assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.OBJECT), + new DataTypeList(EDataType.NUMBER)), result.getMarkers().iterator().next().getMessage()); + + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("hint setPos [0,0,0]".getBytes()), supplier, + info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 2); + Iterator it = result.getMarkers().iterator(); + assertEquals(ProblemMessages.operatorIsNotUnary("setPos"), it.next().getMessage()); + assertEquals(ProblemMessages.expectedTypeButGot( + new DataTypeList(new EDataType[] { EDataType.STRING, EDataType.STRUCTURED_TEXT }), + new DataTypeList(EDataType.NOTHING)), it.next().getMessage()); } From bfc76116e217e238db9f4c8a1e1f2df81a981952 Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Wed, 4 Apr 2018 18:27:21 +0200 Subject: [PATCH 14/23] integrated new parser into infrastructure --- .../raven/sqdev/editors/BasicCodeEditor.java | 109 ++++++++++-------- .../editors/sqdevEditor/SQDevFileEditor.java | 4 +- .../StringTableXMLEditor.java | 25 +++- plugin/Raven.SQDev.Misc/.classpath | 2 +- plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF | 102 ++++++++++++---- .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 96374 -> 97127 bytes plugin/Raven.SQDev.Misc/build.properties | 1 - .../raven/sqdev/interfaces/IParseResult.java | 16 +++ .../sqdev/parser/misc/ParseResultOld.java | 33 +++++- .../raven/sqdev/parser/misc/ParseUtil.java | 5 +- .../sqdev/parser/misc/SQFParseResult.java | 45 ++++++++ .../sqdev/sqf/processing/SQFProcessor.java | 3 +- .../tests/EncounteredFalsePositives.sqf | 7 ++ .../processing/tests/SQFProcessingTest.java | 20 +++- .../sqdev/editors/sqfeditor/SQF_Editor.java | 70 +++++++---- .../ui/commands/ShowParseTreeHandler.java | 8 +- .../raven/sqdev/util/SQDevProjectBuilder.java | 88 ++++++++------ 17 files changed, 394 insertions(+), 144 deletions(-) create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicCodeEditor.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicCodeEditor.java index 126b3199..787bee0c 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicCodeEditor.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/BasicCodeEditor.java @@ -1,8 +1,12 @@ package raven.sqdev.editors; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.AbstractMap; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import org.antlr.v4.runtime.tree.ParseTree; import org.eclipse.core.resources.IMarker; @@ -37,6 +41,7 @@ import raven.sqdev.interfaces.IMacroSupport; import raven.sqdev.interfaces.IManager; import raven.sqdev.interfaces.IMarkerSupport; +import raven.sqdev.interfaces.IParseResult; import raven.sqdev.misc.CharacterPair; import raven.sqdev.misc.MultiPreferenceStore; import raven.sqdev.misc.SQDevInfobox; @@ -80,9 +85,9 @@ public class BasicCodeEditor extends TextEditor implements IMarkerSupport { protected BasicSourceViewerConfiguration configuration; /** - * The parse tree representing the input of this editor + * The parse result representing the input of this editor */ - protected ParseTree parseTree; + protected IParseResult parseResult; /** * The name of the rules used for parsing this editor's input */ @@ -142,8 +147,8 @@ public void setColorManager(ColorManager colorManager) { @Override public ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles) { - ISourceViewer viewer = new ProjectionViewer(parent, ruler, getOverviewRuler(), - isOverviewRulerVisible(), styles); + ISourceViewer viewer = new ProjectionViewer(parent, ruler, getOverviewRuler(), isOverviewRulerVisible(), + styles); getSourceViewerDecorationSupport(viewer); @@ -158,8 +163,7 @@ public ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, } // add parse listener - getBasicProvider().getDocument(getEditorInput()) - .addDocumentListener(new BasicParseTimeListener(this)); + getBasicProvider().getDocument(getEditorInput()).addDocumentListener(new BasicParseTimeListener(this)); return viewer; } @@ -175,13 +179,11 @@ protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupp // character pair matching support.setCharacterPairMatcher(matcher); - support.setMatchingCharacterPainterPreferenceKeys( - SQDevPreferenceConstants.SQDEV_EDITOR_MATCHING_BRACKETS_KEY, + support.setMatchingCharacterPainterPreferenceKeys(SQDevPreferenceConstants.SQDEV_EDITOR_MATCHING_BRACKETS_KEY, SQDevPreferenceConstants.SQDEV_EDITOR_MATCHING_BRACKETS_COLOR_KEY); // newLine highlighting - support.setCursorLinePainterPreferenceKeys( - SQDevPreferenceConstants.SQDEV_EDITOR_HIGHLIGHT_CURRENTLINE_KEY, + support.setCursorLinePainterPreferenceKeys(SQDevPreferenceConstants.SQDEV_EDITOR_HIGHLIGHT_CURRENTLINE_KEY, SQDevPreferenceConstants.SQDEV_EDITOR_HIGHLIGHT_CURRENTLINE_COLOR_KEY); } @@ -253,8 +255,7 @@ public void createPartControl(Composite parent) { // infrastructure for code folding ProjectionViewer viewer = (ProjectionViewer) getSourceViewer(); - ProjectionSupport projectionSupport = new ProjectionSupport(viewer, getAnnotationAccess(), - getSharedColors()); + ProjectionSupport projectionSupport = new ProjectionSupport(viewer, getAnnotationAccess(), getSharedColors()); projectionSupport.install(); @@ -266,8 +267,7 @@ public void createPartControl(Composite parent) { // combine the SQDev PreferenceStore with the editor's one // use the SQDev preferenceStore as the baseStore - MultiPreferenceStore multiStore = new MultiPreferenceStore( - SQDevPreferenceUtil.getPreferenceStore()); + MultiPreferenceStore multiStore = new MultiPreferenceStore(SQDevPreferenceUtil.getPreferenceStore()); // add the editor's preferenceStore if available IPreferenceStore editorStore = this.getPreferenceStore(); @@ -341,13 +341,13 @@ public BasicDocumentProvider getBasicProvider() { } /** - * Gets the ParseTree representing the input of this editor + * Gets the {@linkplain IParseResult} representing the input of this editor * - * @return The ParseTree or null if none has been set + * @return The result or null if none has been set * so far */ - public ParseTree getParseTree() { - return parseTree; + public IParseResult getParseResult() { + return parseResult; } /** @@ -360,8 +360,8 @@ public List getParseRuleNames() { } /** - * This is a helper method that will do the parsing for the given input wihtout - * any checks (whetehr there is an active parsing job) and in the same thread as + * This is a helper method that will do the parsing for the given input without + * any checks (whether there is an active parsing job) and in the same thread as * it is called * * @param input @@ -370,7 +370,7 @@ public List getParseRuleNames() { */ private IStatus startParsingInput(String input) { // preprocess - doPreprocessorParsing(input); + doPreprocessorParsing(new ByteArrayInputStream(input.getBytes())); // check if this parsing should be cancelled synchronized (parsingIsCancelled) { @@ -381,7 +381,7 @@ private IStatus startParsingInput(String input) { } // parse - ParseTree output = doParse(input); + IParseResult output = doParse(new ByteArrayInputStream(input.getBytes())); // check if this parsing should be cancelled synchronized (parsingIsCancelled) { @@ -391,14 +391,17 @@ private IStatus startParsingInput(String input) { } } - if (output == null || output.getChildCount() == 0) { + if (output == null + || output.getMarkers().stream().filter((element) -> element.getSeverity() == IMarker.SEVERITY_ERROR) + .collect(Collectors.toList()).size() > 0) { + // don't process the parse tree if errors came up during lexing/parsing applyParseChanges(); return Status.CANCEL_STATUS; } else { - parseTree = output; + parseResult = output; - if (!processParseTree(parseTree)) { + if (!processParseTree(parseResult)) { applyParseChanges(); } @@ -433,30 +436,29 @@ public boolean parseInput(boolean suspend) { return false; } - String input = document.get(); + String content = document.get(); - if (input == null) { + if (content == null) { return false; } synchronized (parsingIsCancelled) { if (parsingIsCancelled && (parseJob == null || parseJob.getResult() != null)) { // There is no other parsing in progress that should be - // cancelled and cancelling is only possible after having + // cancelled and canceling is only possible after having // initialized it parsingIsCancelled = false; } } if (parseJob != null && parseJob.getState() != Job.NONE) { - // Ther previous Job is still running -> reschedule + // The previous Job is still running -> reschedule parseJob.addJobChangeListener(new JobChangeAdapter() { @Override public void done(IJobChangeEvent event) { // As there has been a request to parse the input again - // do - // it now as the old parsing process is finished + // do it now as the old parsing process is finished parseInput(); } }); @@ -465,13 +467,13 @@ public void done(IJobChangeEvent event) { } if (suspend) { - startParsingInput(input); + startParsingInput(content); } else { parseJob = new Job("Parsing \"" + getEditorInput().getName() + "\"...") { @Override protected IStatus run(IProgressMonitor monitor) { - return startParsingInput(input); + return startParsingInput(content); } }; @@ -514,10 +516,17 @@ public void cancelParsing() { * and sets the found macros if this editor is an instance of * IMacroSupport. */ - protected void doPreprocessorParsing(String input) { + protected void doPreprocessorParsing(InputStream input) { if (this instanceof IMacroSupport && getEditorInput() instanceof IFileEditorInput) { - PreprocessorParseResult result = ParseUtil.parseAndValidatePreprocess(input, - ((IFileEditorInput) getEditorInput()).getFile().getLocation()); + PreprocessorParseResult result; + try { + result = ParseUtil.parseAndValidatePreprocess(input, + ((IFileEditorInput) getEditorInput()).getFile().getLocation()); + } catch (IOException e) { + e.printStackTrace(); + createMarker(IMarker.PROBLEM, 0, 0, "Unable to preprocess the file", IMarker.SEVERITY_ERROR); + return; + } ((IMacroSupport) this).setMacros(result.getMacros(), true); @@ -533,18 +542,18 @@ protected void doPreprocessorParsing(String input) { * Note: You might want to call {@link #applyParseChanges()} after the * processing * - * @param tree - * The generated tree + * @param parseResult + * The generated parse result * @return Whether this function has called {@link #applyParseChanges()}. If not * the default implementation of {@link #parseInput()} will call this * function afterwards. */ - protected boolean processParseTree(ParseTree parseTree) { + protected boolean processParseTree(IParseResult parseResult) { return false; } /** - * Parses the input of this editor in order to set the {@link #parseTree} for + * Parses the input of this editor in order to set the {@link #parseResult} for * this editor.
    * Note: You might want to call {@link #applyParseChanges()} after parsing (or * rather after {@link #processParseTree(ParseTree)}.
    @@ -559,7 +568,7 @@ protected boolean processParseTree(ParseTree parseTree) { * parsing failed (if not overridden by subclasses this method always * returns null */ - protected ParseTree doParse(String input) { + protected IParseResult doParse(InputStream input) { // parsing diabled return null; } @@ -573,8 +582,7 @@ protected ParseTree doParse(String input) { */ protected void createManagers(List managerList) { // add folding manager - managerList.add(new BasicFoldingManager( - ((ProjectionViewer) getSourceViewer()).getProjectionAnnotationModel())); + managerList.add(new BasicFoldingManager(((ProjectionViewer) getSourceViewer()).getProjectionAnnotationModel())); // add marker manager managerList.add(new BasicMarkerManager(this)); } @@ -598,8 +606,8 @@ public void createMarker(String type, int offset, int length, String message, in } } - ((BasicMarkerManager) getManager(BasicMarkerManager.TYPE)).addMarker(type, line, offset, length, - severity, message); + ((BasicMarkerManager) getManager(BasicMarkerManager.TYPE)).addMarker(type, line, offset, length, severity, + message); } @Override @@ -651,8 +659,8 @@ public void addFoldingArea(Position position) { // don't fold if the code is only one line long try { - if (doc == null || doc.getLineOfOffset(position.offset) == doc - .getLineOfOffset(position.offset + position.length)) { + if (doc == null + || doc.getLineOfOffset(position.offset) == doc.getLineOfOffset(position.offset + position.length)) { return; } } catch (BadLocationException e) { @@ -666,15 +674,14 @@ public void addFoldingArea(Position position) { ProjectionAnnotation annotation = new ProjectionAnnotation(); - BasicFoldingManager foldingManager = (BasicFoldingManager) getManager( - BasicFoldingManager.getManagerType()); + BasicFoldingManager foldingManager = (BasicFoldingManager) getManager(BasicFoldingManager.getManagerType()); if (foldingManager == null) { return; } - foldingManager.addFoldingArea( - new AbstractMap.SimpleEntry(annotation, position)); + foldingManager + .addFoldingArea(new AbstractMap.SimpleEntry(annotation, position)); } /** diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/sqdevEditor/SQDevFileEditor.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/sqdevEditor/SQDevFileEditor.java index c67c0ef5..57a514dd 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/sqdevEditor/SQDevFileEditor.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/sqdevEditor/SQDevFileEditor.java @@ -1,5 +1,7 @@ package raven.sqdev.editors.sqdevEditor; +import java.io.InputStream; + import raven.sqdev.constants.SQDevPreferenceConstants; import raven.sqdev.editors.BasicCodeEditor; import raven.sqdev.editors.BasicPartitionScanner; @@ -73,7 +75,7 @@ protected void setKeywords() { } @Override - protected void doPreprocessorParsing(String input) { + protected void doPreprocessorParsing(InputStream input) { // Do nothing } diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.java index 7a28d6d8..85946950 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.java @@ -1,5 +1,7 @@ package raven.sqdev.editors.stringTableEditor; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; @@ -16,7 +18,9 @@ import raven.sqdev.editors.stringtableParsing.StringTableLexer; import raven.sqdev.editors.stringtableParsing.StringTableParser; import raven.sqdev.editors.stringtableParsing.StringTableWalkListener; +import raven.sqdev.interfaces.IParseResult; import raven.sqdev.misc.CharacterPair; +import raven.sqdev.misc.SQDevInfobox; import raven.sqdev.parser.misc.BasicErrorListener; /** @@ -43,8 +47,19 @@ public StringTableXMLEditor() { } @Override - protected ParseTree doParse(String input) { - ANTLRInputStream in = new ANTLRInputStream(input); + protected IParseResult doParse(InputStream input) { + ANTLRInputStream in; + try { + in = new ANTLRInputStream(input); + } catch (IOException e) { + e.printStackTrace(); + + SQDevInfobox info = new SQDevInfobox("Error while parsing stringtable", e); + + info.open(false); + + return null; + } BasicErrorListener listener = new BasicErrorListener(); @@ -62,16 +77,16 @@ protected ParseTree doParse(String input) { listener.getParseResult().applyMarkersTo(this); - return tree; + return listener.getParseResult(); } @Override - protected boolean processParseTree(ParseTree tree) { + protected boolean processParseTree(IParseResult result) { ParseTreeWalker walker = new ParseTreeWalker(); StringTableWalkListener listener = new StringTableWalkListener(stream); - walker.walk(listener, tree); + walker.walk(listener, result.getANTRLParseTree()); packageList = listener.getPackageList(); diff --git a/plugin/Raven.SQDev.Misc/.classpath b/plugin/Raven.SQDev.Misc/.classpath index 55c3b006..839278da 100644 --- a/plugin/Raven.SQDev.Misc/.classpath +++ b/plugin/Raven.SQDev.Misc/.classpath @@ -4,6 +4,6 @@ - + diff --git a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF index 209595f4..4118b999 100644 --- a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF @@ -13,26 +13,88 @@ Require-Bundle: org.eclipse.core.runtime, org.junit Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy -Export-Package: org.antlr.v4.runtime, - org.antlr.v4.runtime.atn, - org.antlr.v4.runtime.dfa, - org.antlr.v4.runtime.misc, - org.antlr.v4.runtime.tree, - org.antlr.v4.runtime.tree.pattern, - org.antlr.v4.runtime.tree.xpath, - raven.sqdev.constants, - raven.sqdev.exceptions, - raven.sqdev.fileSystemListener, - raven.sqdev.infoCollection, - raven.sqdev.infoCollection.base, - raven.sqdev.interfaces, - raven.sqdev.misc, - raven.sqdev.parser.misc, - raven.sqdev.parser.preprocessor, - raven.sqdev.parser.sqf, - raven.sqdev.pluginManagement, - raven.sqdev.styles, - raven.sqdev.syntax +Export-Package: dataStructures, + lexer;uses:="dataStructures", + org.antlr.v4.runtime; + uses:="new org.antlr.v4.runtime, + org.antlr.v4.runtime.dfa, + org.antlr.v4.runtime.atn, + org.antlr.v4.runtime.tree, + org.antlr.v4.runtime.misc, + org.antlr.v4.runtime.tree.pattern", + org.antlr.v4.runtime.atn;uses:="org.antlr.v4.runtime,org.antlr.v4.runtime.dfa,org.antlr.v4.runtime.misc", + org.antlr.v4.runtime.dfa;uses:="org.antlr.v4.runtime,org.antlr.v4.runtime.atn", + org.antlr.v4.runtime.misc;uses:="org.antlr.v4.runtime", + org.antlr.v4.runtime.tree;uses:="org.antlr.v4.runtime,org.antlr.v4.runtime.misc", + org.antlr.v4.runtime.tree.pattern;uses:="org.antlr.v4.runtime,org.antlr.v4.runtime.tree,org.antlr.v4.runtime.misc", + org.antlr.v4.runtime.tree.xpath;uses:="org.antlr.v4.runtime,org.antlr.v4.runtime.tree,org.antlr.v4.runtime.atn", + parser;uses:="dataStructures", + raven.sqdev.constants;uses:="org.eclipse.swt.graphics,raven.sqdev.misc", + raven.sqdev.exceptions;uses:="raven.sqdev.infoCollection.base", + raven.sqdev.fileSystemListener;uses:="org.eclipse.core.runtime,raven.sqdev.interfaces", + raven.sqdev.infoCollection;uses:="org.eclipse.core.runtime,raven.sqdev.infoCollection.base", + raven.sqdev.infoCollection.base;uses:="raven.sqdev.syntax,raven.sqdev.misc,raven.sqdev.interfaces", + raven.sqdev.interfaces; + uses:="org.eclipse.swt.events, + raven.sqdev.pluginManagement, + dataStructures, + raven.sqdev.fileSystemListener, + raven.sqdev.infoCollection.base, + raven.sqdev.misc, + org.eclipse.swt.widgets", + raven.sqdev.misc; + uses:="raven.sqdev.pluginManagement, + org.eclipse.swt.graphics, + org.eclipse.swt.widgets, + org.eclipse.core.runtime.preferences, + org.osgi.framework, + org.eclipse.core.runtime, + org.eclipse.jface.util, + raven.sqdev.infoCollection.base, + org.eclipse.jface.preference, + org.eclipse.swt.custom, + org.eclipse.core.resources, + raven.sqdev.styles, + raven.sqdev.interfaces", + raven.sqdev.parser.misc; + uses:="org.antlr.v4.runtime, + dataStructures, + org.eclipse.jface.text, + raven.sqdev.parser.preprocessor, + lexer, + org.eclipse.core.runtime, + parser, + org.antlr.v4.runtime.tree, + raven.sqdev.parser.sqf, + raven.sqdev.interfaces", + raven.sqdev.parser.preprocessor; + uses:="org.antlr.v4.runtime, + org.eclipse.core.runtime, + raven.sqdev.misc, + org.antlr.v4.runtime.tree, + raven.sqdev.parser.misc, + org.antlr.v4.runtime.atn", + raven.sqdev.parser.sqf; + uses:="org.antlr.v4.runtime, + raven.sqdev.infoCollection.base, + raven.sqdev.misc, + org.eclipse.jface.text, + org.antlr.v4.runtime.tree, + raven.sqdev.parser.misc, + org.antlr.v4.runtime.atn, + raven.sqdev.interfaces", + raven.sqdev.pluginManagement; + uses:="org.eclipse.core.runtime.jobs, + org.osgi.framework, + org.eclipse.ui.plugin, + raven.sqdev.interfaces", + raven.sqdev.styles;uses:="org.eclipse.swt.custom,org.eclipse.swt.widgets", + raven.sqdev.syntax;uses:="raven.sqdev.misc", + ui; + uses:="org.abego.treelayout.util, + abego.swt, + dataStructures, + org.eclipse.swt.widgets" Import-Package: raven.sqdev.misc Bundle-Vendor: Raven Bundle-ClassPath: ANTLR/antlr-runtime-4.7.jar, diff --git a/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar b/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar index 64b433310f9de0453988c1131adf23d2f4e45781..59cbd378ceb32e4ddcd715316aea52915cb7f715 100644 GIT binary patch delta 44396 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

  • ProjectUtil.SUCCESS
  • *
  • ProjectUtil.CANCELED
  • *
  • ProjectUtil.FAILED
  • */ - public static String export(IProject project, IPath destination, - ArrayList filesToIgnore, + public static String export(IProject project, IPath destination, ArrayList filesToIgnore, ArrayList filesToPreserve) { if (!new File(destination.toOSString()).exists()) { // check how many folders have to be created IPath copy = new Path(destination.toOSString()); - + // search for the first existing container for (int i = 0; i < copy.segmentCount(); i++) { copy = copy.removeLastSegments(1); - + if (new File(copy.toOSString()).exists()) { break; } } - + // calculate how many files have to be created int diff = destination.segmentCount() - copy.segmentCount(); - + if (diff >= 2) { // normally there should be only the mission folder to be // created SQDevInfobox info = new SQDevInfobox( - "The export process would require an unusual high amount (" - + diff + "The export process would require an unusual high amount (" + diff + ") of new folders being created.\n\nDo you want to proceed?", SWT.ICON_QUESTION | SWT.YES | SWT.NO); - + if (info.open() != SWT.YES) { // abort the export process return CANCELED; } } } - + File missionFolder = new File(destination.toOSString()); - + if (!missionFolder.exists()) { // create the mission folder missionFolder.mkdirs(); @@ -120,78 +118,68 @@ public static String export(IProject project, IPath destination, if (!SQDevPreferenceUtil.autoClean()) { SQDevInfobox info = new SQDevInfobox( "The directory \"" + destination.toOSString() - + "\" has to be cleaned in order to export the project \"" - + project.getName() + + "\" has to be cleaned in order to export the project \"" + project.getName() + "\".\nAny files that are not part of the project in the eclipse " + "workspace will be deleted.\n\nDo you want to proceed?", SWT.ICON_QUESTION | SWT.YES | SWT.NO); - + if (info.open() != SWT.YES) { return CANCELED; } } - + // clean the directory for (File currentFile : missionFolder.listFiles()) { // delete the respective files - if (!FileSystemUtil.deleteFilesWithException(currentFile, - filesToPreserve)) { + if (!FileSystemUtil.deleteFilesWithException(currentFile, filesToPreserve)) { // report that the cleaning couldn't be performed - SQDevInfobox info = new SQDevInfobox( - "Failed to delete file \"" - + currentFile.getAbsolutePath() - + "\"\nMake sure the files are not opened somewhere and try again" - + "\n\nCanceled the export process.", - SWT.ICON_INFORMATION); - + SQDevInfobox info = new SQDevInfobox("Failed to delete file \"" + currentFile.getAbsolutePath() + + "\"\nMake sure the files are not opened somewhere and try again" + + "\n\nCanceled the export process.", SWT.ICON_INFORMATION); + info.open(); - + // abort export when cleaning can't be performed return CANCELED; } } } - + try { for (IResource currentResource : project.members()) { - File currentFile = new File( - currentResource.getRawLocationURI()); - - if (filesToIgnore.contains(currentFile.getName()) - || currentFile.getName().startsWith(".")) { + File currentFile = new File(currentResource.getRawLocationURI()); + + if (filesToIgnore.contains(currentFile.getName()) || currentFile.getName().startsWith(".")) { // skip if this resource is specified to be ignored or if it // is hidden continue; } - + if (!currentFile.exists()) { // skip non-existant files continue; } - - FileSystemUtil.copyFilesWithExceptions(currentFile, destination, - filesToIgnore, true); + + FileSystemUtil.copyFilesWithExceptions(currentFile, destination, filesToIgnore, true); } } catch (CoreException e) { e.printStackTrace(); - + // inform the user about the failure - String message = "Failed at exporting \"" + project.getName() - + "\"\nReason: " - + ((e.getMessage() == null || e.getMessage().isEmpty()) - ? "Unknown" : e.getMessage()); - + String message = "Failed at exporting \"" + project.getName() + "\"\nReason: " + + ((e.getMessage() == null || e.getMessage().isEmpty()) ? "Unknown" : e.getMessage()); + SQDevInfobox info = new SQDevInfobox(message, SWT.ICON_ERROR); - + info.open(); - + return FAILED; } - + // indicate that the export was successfull return SUCCESS; } - + /** * Finds out whether the given project is a valid SQDev project.
    * A project is considered a SQDev project if it contains a link.sqdev @@ -201,61 +189,55 @@ public static String export(IProject project, IPath destination, * @return */ public static boolean isSQDevProject(IProject project) { - IFile testFile = project.getFile(ESQDevFileType.LINK.toString() - + EFileType.SQDEV.getExtension()); - + IFile testFile = project.getFile(ESQDevFileType.LINK.toString() + EFileType.SQDEV.getExtension()); + return testFile.exists(); } - + /** * Gets the profile specified for the given project/mission * * @param project - * The SQDevProject whose corresponding profile should be - * obtained Has to be an SQDevProject! + * The SQDevProject whose corresponding profile should be obtained + * Has to be an SQDevProject! * @return The corresponding profile */ public static String getMissionProfile(IProject project) { SQDevFile linkFile = getLinkFile(project); - + try { - String profile = linkFile - .parseAttribute(ESQDevFileAttribute.PROFILE).getValue() - .toString(); - + String profile = linkFile.parseAttribute(ESQDevFileAttribute.PROFILE).getValue().toString(); + return profile; } catch (SQDevFileIsInvalidException e) { // inform the user SQDevInfobox info = new SQDevInfobox( - "The linkFile in the project \"" + project.getName() - + "\" is invalid!", - SWT.ICON_ERROR); - + "The linkFile in the project \"" + project.getName() + "\" is invalid!", SWT.ICON_ERROR); + info.open(); - + // rethrow throw new SQDevCoreException(e); } } - + /** * Gets the linkFile of this SQDevProject * * @param project - * The SQDevProject whose linkFile should be obtained. Has to - * be an SQDevProject! + * The SQDevProject whose linkFile should be obtained. Has to be + * an SQDevProject! * @return The corresponding linkFile */ public static SQDevFile getLinkFile(IProject project) { Assert.isTrue(isSQDevProject(project)); - - IResource linkMember = project.findMember( - ESQDevFileType.LINK + EFileType.SQDEV.getExtension()); - + + IResource linkMember = project.findMember(ESQDevFileType.LINK + EFileType.SQDEV.getExtension()); + if (linkMember.getType() == IResource.FILE) { try { SQDevFile linkFile = new SQDevFile((IFile) linkMember); - + return linkFile; } catch (FileNotFoundException | IllegalAccessStateException e) { // rethrow @@ -265,27 +247,26 @@ public static SQDevFile getLinkFile(IProject project) { throw new SQDevCoreException("Selected linkFile is not a file!"); } } - + /** * Gets the SQDevInformation corresponding to the given * SQDevProject * * @param project * The SQDevProject - * @return The respective SQDevInformation or null - * if the given project is no SQDevProject + * @return The respective SQDevInformation or null if + * the given project is no SQDevProject */ public static SQDevInformation getInformation(IProject project) { if (!isSQDevProject(project)) { return null; } - + return new SQDevInformation(getLinkFile(project)); } - + /** - * Checks whether a project with the given name already exists in the - * workspace + * Checks whether a project with the given name already exists in the workspace * * @param name * The name of the project @@ -297,102 +278,100 @@ public static boolean exists(String name) { return true; } } - + return false; } - + /** * Imports the given mission folder into the workspace as an SQDevProject * * @param path * The path to the folder to import + * @param copyContent + * Indicates whether all content should get copied into the + * workspace. If this is set to false then the + * respective resources will not be copied and only get linked + * instead. * @return */ - public static String importAsProject(Path path) { + public static String importAsProject(IPath path, boolean copyContent) { Assert.isTrue(path.isAbsolute() && path.toFile().exists()); - + boolean isMission = Util.isMissionFolder(new File(path.toOSString())); - + String possibleName = path.lastSegment(); - + if (isMission) { possibleName = possibleName.substring(0, possibleName.indexOf(".")); } - + final String projectName = possibleName; - + try { // create the project - IProject project = createSQDevProject( - ResourcesPlugin.getWorkspace().getRoot(), projectName); - + IProject project = createSQDevProject(ResourcesPlugin.getWorkspace().getRoot(), projectName, + copyContent ? null : path); + project.open(new NullProgressMonitor()); - + // gather information SQDevInformation information = new SQDevInformation(); information.setProfile(SQDevPreferenceUtil.getDefaultProfile()); - information.setTerrain(path.lastSegment() - .substring(path.lastSegment().indexOf(".") + 1)); - information.autoExport = SQDevPreferenceUtil - .getAutoExportDefaultEnabled(); + information.setTerrain(path.lastSegment().substring(path.lastSegment().indexOf(".") + 1)); + information.autoExport = SQDevPreferenceUtil.getAutoExportDefaultEnabled(); information.name = projectName; - + // create linkFile EFileType type = EFileType.SQDEV; type.setInformation(information); type.setPath(project.getLocation().toOSString()); type.create(ESQDevFileType.LINK.toString(), false); - - // copy files and folders - for (File currentFile : path.toFile().listFiles()) { - if (currentFile.isDirectory()) { - FileUtil.copyFolder(currentFile, - (Path) project.getLocation()); - } else { - FileUtil.copyFile(currentFile, - (Path) project.getLocation()); + + if (copyContent) { + // copy files and folders + for (File currentFile : path.toFile().listFiles()) { + if (currentFile.isDirectory()) { + FileUtil.copyFolder(currentFile, (Path) project.getLocation()); + } else { + FileUtil.copyFile(currentFile, (Path) project.getLocation()); + } } } - + // refresh project - project.refreshLocal(IResource.DEPTH_INFINITE, - new NullProgressMonitor()); - + project.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor()); + // initial build Job buildJob = new Job("Building " + projectName) { - + @Override protected IStatus run(IProgressMonitor monitor) { try { - project.build(IncrementalProjectBuilder.FULL_BUILD, - monitor); + project.build(IncrementalProjectBuilder.FULL_BUILD, monitor); } catch (CoreException e) { e.printStackTrace(); - - SQDevInfobox info = new SQDevInfobox( - "Failed at building project " + projectName, e); + + SQDevInfobox info = new SQDevInfobox("Failed at building project " + projectName, e); info.open(false); } - + return Status.OK_STATUS; } }; buildJob.schedule(); - - } catch (CoreException | FailedAtCreatingFileException - | BackingStoreException e) { - String message = "Failed at importing \"" + path.toOSString() - + "\""; - + + } catch (CoreException | FailedAtCreatingFileException | BackingStoreException e) { + String message = "Failed at importing \"" + path.toOSString() + "\""; + SQDevInfobox info = new SQDevInfobox(message, e); info.open(); - + e.printStackTrace(); } - + return SUCCESS; } - + /** * Creates a new project with the given name in the given workspace root. * @@ -400,62 +379,61 @@ protected IStatus run(IProgressMonitor monitor) { * The workspace root to create the project in * @param projectName * The name of the new project + * @param externalLocation + * null if the project should be created from scratch. + * Otherwise this can point to the source files to include in the + * project but that are stored elsewhere * @return The newly created project * @throws FailedAtCreatingFileException - * If there is a problem with creating the problem such as - * another problem with the same name does already exist + * If there is a problem with creating the problem such as another + * problem with the same name does already exist * @throws CoreException * @throws BackingStoreException */ - public static IProject createSQDevProject(IWorkspaceRoot root, - String projectName) throws FailedAtCreatingFileException, - CoreException, BackingStoreException { + public static IProject createSQDevProject(IWorkspaceRoot root, String projectName, IPath externalLocation) + throws FailedAtCreatingFileException, CoreException, BackingStoreException { IProject project = root.getProject(projectName); - + + // configure the SQDevProjectBuilder + IProjectDescription description = ResourcesPlugin.getWorkspace().newProjectDescription(projectName); + ICommand[] commands = description.getBuildSpec(); + + // add builder to project + ICommand command = description.newCommand(); + command.setBuilderName("raven.sqdev.builder.sqdevprojectbuilder"); + ICommand[] nc = new ICommand[commands.length + 1]; + // Add it before other builders. + System.arraycopy(commands, 0, nc, 1, commands.length); + nc[0] = command; + description.setBuildSpec(nc); + + // set project nature + description.setNatureIds(new String[] { SQDevProjectNature.SQDEV_NATURE_ID }); + + description.setLocation(externalLocation); + // create the project; If anything goes wrong return if (!project.exists()) { try { - project.create(null); + project.create(description, new NullProgressMonitor()); } catch (CoreException e) { throw new FailedAtCreatingFileException(e); } } else { - throw new FailedAtCreatingFileException("A project with the name \"" - + projectName + "\" does already exist!"); + throw new FailedAtCreatingFileException( + "A project with the name \"" + projectName + "\" does already exist!"); } - + project.open(new NullProgressMonitor()); - + // Make sure the project is being encoded in UTF-8 IScopeContext projectScope = new ProjectScope(project); - IEclipsePreferences projectNode = projectScope - .getNode("org.eclipse.core.resources"); + IEclipsePreferences projectNode = projectScope.getNode("org.eclipse.core.resources"); projectNode.node("encoding").put("", "UTF-8"); projectNode.flush(); - - // configure the SQDevProjectBuilder - IProjectDescription description = project.getDescription(); - ICommand[] commands = description.getBuildSpec(); - - // add builder to project - ICommand command = description.newCommand(); - command.setBuilderName("raven.sqdev.builder.sqdevprojectbuilder"); - ICommand[] nc = new ICommand[commands.length + 1]; - // Add it before other builders. - System.arraycopy(commands, 0, nc, 1, commands.length); - nc[0] = command; - description.setBuildSpec(nc); - - - // set project nature - description.setNatureIds( - new String[] { SQDevProjectNature.SQDEV_NATURE_ID }); - - - project.setDescription(description, new NullProgressMonitor()); - + project.close(new NullProgressMonitor()); - + return project; } } diff --git a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizard.java b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizard.java index 6988e407..b7f58e57 100644 --- a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizard.java +++ b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizard.java @@ -1,8 +1,8 @@ package raven.sqdev.wizards.importWizard; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.IStructuredSelection; @@ -24,7 +24,8 @@ public void init(IWorkbench workbench, IStructuredSelection selection) { @Override public boolean performFinish() { - Path selectedPath = page.getDirectory(); + IPath importDir = page.getDirectory(); + boolean copyResources = page.copyResources(); Job importJob = new Job("Importing folder...") { @@ -32,7 +33,7 @@ public boolean performFinish() { protected IStatus run(IProgressMonitor monitor) { monitor.beginTask("Importing folder...", 1); - ProjectUtil.importAsProject(selectedPath); + ProjectUtil.importAsProject(importDir, copyResources); monitor.worked(1); monitor.done(); diff --git a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java index 7c617c15..e7e6ea5e 100644 --- a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java +++ b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java @@ -21,57 +21,61 @@ import raven.sqdev.util.Util; public class SQDevImportWizardPage extends WizardPage { - + /** * The directory label */ Label pathLabel; - + /** * The combo for the chosen directory */ Combo directoryCombo; - + /** * The browse button */ Button browseButton; - + /** + * The copy label + */ + Label copyLabel; + /** + * The copy checkbox + */ + Button copyCheckBox; + public SQDevImportWizardPage(String pageName) { super(pageName); setTitle("Import"); } - + @Override public void createControl(Composite parent) { - Composite container = new Composite(parent, SWT.NULL); + Composite container = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 3; layout.verticalSpacing = 9; container.setLayout(layout); - + // directory selection String pathTooltip = "The path to the folder that should be imported"; - - pathLabel = new Label(container, SWT.NULL); + + pathLabel = new Label(container, SWT.NONE); pathLabel.setText("&Path:"); pathLabel.setToolTipText(pathTooltip); - - + + directoryCombo = new Combo(container, SWT.DROP_DOWN); directoryCombo.setToolTipText(pathTooltip); - + for (String currentProfile : Util.getProfiles()) { // add the profiles directories - for (File currentFile : new File( - Util.getMissionsDirectory(currentProfile).toOSString()) - .listFiles()) { - + for (File currentFile : new File(Util.getMissionsDirectory(currentProfile).toOSString()).listFiles()) { + String fileName = currentFile.getName(); - fileName = (fileName.contains(".")) - ? fileName.substring(0, fileName.indexOf(".")) - : fileName; - + fileName = (fileName.contains(".")) ? fileName.substring(0, fileName.indexOf(".")) : fileName; + if (!ProjectUtil.exists(fileName)) { // add all paths to the respective missions if their names // don't conflict with an existing project @@ -79,99 +83,107 @@ public void createControl(Composite parent) { } } } - + directoryCombo.addModifyListener(new ModifyListener() { - + @Override public void modifyText(ModifyEvent e) { dialogChanged(); } }); - - + + browseButton = new Button(container, SWT.PUSH); browseButton.setToolTipText("Browse for the folder to import"); browseButton.setText("Browse..."); - + browseButton.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent event) { - DirectoryDialog dialog = new DirectoryDialog(PlatformUI - .getWorkbench().getActiveWorkbenchWindow().getShell()); - + DirectoryDialog dialog = new DirectoryDialog( + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell()); + String initialPath = directoryCombo.getText(); - + if (initialPath != null && !initialPath.isEmpty()) { dialog.setFilterPath(initialPath); } - + String newPath = dialog.open(); - + if (newPath != null && !newPath.isEmpty()) { directoryCombo.setText(newPath); } } }); - - + + String copyTooltip = "Whether to copy all resources into the workspace instead of simply linking to them"; + copyLabel = new Label(container, SWT.NONE); + copyLabel.setText("&Copy to workspace:"); + copyLabel.setToolTipText(copyTooltip); + + copyCheckBox = new Button(container, SWT.CHECK); + copyCheckBox.setToolTipText(copyTooltip); + // make this the default option + copyCheckBox.setSelection(true); + + setControl(container); dialogChanged(); } - + /** * Gets called whenever the dialog changes */ protected void dialogChanged() { validate(); } - + /** * Validates the current input */ protected void validate() { Path filePath = new Path(directoryCombo.getText().trim()); - + if (filePath.isEmpty()) { updateStatus("You have to enter a path!"); return; } - + filePath = (Path) filePath.makeAbsolute(); - + File file = filePath.toFile(); - + if (!file.exists()) { - updateStatus("The file\"" + file.getAbsolutePath() - + "\" does not exist!"); + updateStatus("The file\"" + file.getAbsolutePath() + "\" does not exist!"); return; } - + if (!file.isDirectory()) { updateStatus("The given file has to be a folder!"); return; } - + String projectName; if (Util.isMissionFolder(file)) { - projectName = file.getName().substring(0, - file.getName().lastIndexOf(".")); + projectName = file.getName().substring(0, file.getName().lastIndexOf(".")); } else { projectName = file.getName(); } - + if (ProjectUtil.exists(projectName)) { updateStatus("A project with the given name does already exist!"); return; } - + updateStatus(null); } - + /** - * Sets the error message for this wizard page. It will automatically - * prevent the page from being finished as long as there is a error message. - * If you want to make remove the error message pass null as an - * argument which will make the page finishable again. + * Sets the error message for this wizard page. It will automatically prevent + * the page from being finished as long as there is a error message. If you want + * to make remove the error message pass null as an argument which + * will make the page finishable again. * * @param message * The message to be displayed @@ -180,12 +192,20 @@ protected void updateStatus(String message) { setErrorMessage(message); setPageComplete(message == null); } - + /** - * Gets the selected flder that should be imported + * Gets the selected folder that should be imported */ public Path getDirectory() { return (Path) new Path(directoryCombo.getText()).makeAbsolute(); } - + + /** + * Whether or not the resources should get copied into the workspace while + * importing them + */ + public boolean copyResources() { + return copyCheckBox.getSelection(); + } + } From 701603eeb92bf9179b1ef11025d98b6945f07e1a Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Sat, 7 Apr 2018 14:21:07 +0200 Subject: [PATCH 20/23] added warning to import wizard --- .../Raven.SQDev.Editors/META-INF/MANIFEST.MF | 2 +- plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF | 2 +- .../resources/sqf/SQFKeywords.txt | 235 +++++++++++------- .../tests/EncounteredFalsePositives.sqf | 12 +- plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF | 2 +- .../Raven.SQDev.Wizards/META-INF/MANIFEST.MF | 2 +- .../importWizard/SQDevImportWizardPage.java | 31 +++ plugin/Raven.SQDev/feature.xml | 10 +- plugin/SQDev/site.xml | 2 +- 9 files changed, 191 insertions(+), 107 deletions(-) diff --git a/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF index b7a43d1d..d9ab4976 100644 --- a/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Editors Bundle-SymbolicName: raven.sqdev.editors;singleton:=true -Bundle-Version: 0.7.2.dev +Bundle-Version: 0.7.2.dev2 Bundle-Activator: raven.sqdev.editors.activator.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, diff --git a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF index 69305c2b..1b244d3a 100644 --- a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Misc Bundle-SymbolicName: raven.sqdev.misc;singleton:=true -Bundle-Version: 0.7.0.dev +Bundle-Version: 0.7.0.dev2 Bundle-Activator: raven.sqdev.activator.Activator Require-Bundle: org.eclipse.core.runtime, org.eclipse.swt, diff --git a/plugin/Raven.SQDev.Misc/resources/sqf/SQFKeywords.txt b/plugin/Raven.SQDev.Misc/resources/sqf/SQFKeywords.txt index bec59fb9..2fbaf9d4 100644 --- a/plugin/Raven.SQDev.Misc/resources/sqf/SQFKeywords.txt +++ b/plugin/Raven.SQDev.Misc/resources/sqf/SQFKeywords.txt @@ -1664,7 +1664,8 @@ Returns the object around where the unit finds cover. The minDist, visibilityPosition and ignoreObject parameters are optional. Command is not functional since Arma 2. - This command is not implemented + This function is no longer available in ArmA 2. + This function is no longer available in Arma 3. https://community.bistudio.com/wiki/findCover @@ -1681,20 +1682,8 @@ undefined / undefined - (17 Oct, 2009) - Arma 2: v1.04: Usage creates report log message: " MicroAI: Command findCover not implemented ( unit id ) " - - (07 Jan, 2011) - OA: v1.57: Still non functional. - - (12 July, 2011) - CO: v1.59: Still non functional. - - (13 February, 2014) - Arma 3: Still non functional. - (July 4, 2015) - An alternative function in ArmA 3 might be BIS_fnc_findSafePos + An alternative function in Arma 3 might be BIS_fnc_findSafePos Object @@ -4011,10 +4000,10 @@ https://community.bistudio.com/wiki/ctFindRowHeader - Number ctFindRowHeader Number + Control ctFindRowHeader Number - Control ctFindRowHeader Number + ctrl ctFindRowHeader row $Code$_index = _control ctFindRowHeader 0;$/Code$ @@ -4497,6 +4486,8 @@ Register knowledge base database to given person. See Conversations for more details. + This function is no longer available in ArmA 2. + This function is no longer available in Arma 3. https://community.bistudio.com/wiki/kbAddDatabase @@ -4774,7 +4765,7 @@ }; }; };$/Code$ - To eliminate possibility of error you can also use setVariable or getVariable with desired Namespace, which is also scheduled environment save. + To eliminate possibility of error you can also use setVariable or getVariable with desired Namespace, which is also scheduled environment safe. https://community.bistudio.com/wiki/with @@ -6440,10 +6431,10 @@ https://community.bistudio.com/wiki/lnbSize - lnbSize Control + lnbSize Control/Number - lnbSize control + lnbSize ctrl $Code$lnbSize _ctrl;//[8,2]$/Code$ @@ -8825,24 +8816,20 @@ Object kbTell Array - person kbTell [receiver, topicName, sentenceClass, [argumentName, argumentValue, argumentText, argumentSpeech], , forceRadio] + person kbTell [receiver, topicName, sentenceClass] - $Code$// In Config file - class CfgIdentities - { - class SSMHQ - { - name = $STR_DN_WARFARE_HQ_BASE_UNFOLDED; - face = "Face97"; - glasses = "None"; - speaker = "MaleA0EN"; - pitch = 1.0; - }; - }; - // IN BIKB - class Sentences - { + $Code$player kbTell [BIS_HQ, "myTopic", "playerSentence1"];$/Code$ + + $Code$player kbTell [ + BIS_HQ, // to + "Airstrike", // topic + "AirstrikeRequest", // sentence + ["Team", {}, "Anvil", ["Anvil"]], // argument 1 + ["Location", {}, "Strelka", ["Strelka"]], // argument 2 + true]; // use radio + // bikb reference: + /* class AirstrikeRequest { text = "%team requesting close air support at grid %location "; @@ -8852,19 +8839,7 @@ class Team { type = "simple"; }; class Location { type = "simple"; }; }; - }; - }; - class Arguments {}; - class Special {}; - startWithVocal[] = {}; - startWithConsonant[] = {}; - // In Script file - BIS_SSM_HQWEST = (createGroup west) createUnit ["Logic", [10,10,1000], [], 0, "NONE"];//Game Logic as HQ - BIS_SSM_HQWEST setGroupId ["Headquarters", "SIX"]; - BIS_SSM_HQWEST setIdentity "SSMHQ_EN"; - player kbAddtopic ["Airstrike", BIKB]; - BIS_SSM_HQWEST kbAddtopic ["Airstrike", BIKB]; - player kbTell [BIS_SSM_HQWEST, "Airstrike", "AirstrikeRequest", ["Team", {}, "Anvil", ["Anvil"]], ["Location", {}, "Strelka", ["Strelka"]], true];$/Code$ + };*/$/Code$ undefined / undefined @@ -10147,6 +10122,35 @@ Array + + + + getTotalDLCUsageTime + + + Returns total DLC usage time in this game session + + + https://community.bistudio.com/wiki/getTotalDLCUsageTime + + + getTotalDLCUsageTime + + + getTotalDLCUsageTime + + + $Code$_dlcTime = getTotalDLCUsageTime ;$/Code$ + + + undefined / undefined + + + + + Number + + @@ -15310,13 +15314,10 @@ vehicle engineOn state - $Code$if (! isEngineOn _jeep) then {_jeep engineOn true };$/Code$ + $Code$if (! isEngineOn _jeep) then { _jeep engineOn true ; };$/Code$ - $Code$if ( local vehicle player ) then { - vehicle player engineOn true ; - } else { - hint "Get in the driver seat, soldier!"; - };$/Code$ + $Code$waitUntil { player == driver _jeep; }; + vehicle player engineOn true ;$/Code$ local / global @@ -18141,7 +18142,7 @@ Control ctSetData Array - Control ctSetData [[[Number]], String ] + ctrl ctSetData [index, data] $Code$_control ctSetData [0, "Test"];$/Code$ @@ -18836,9 +18837,13 @@ Anything remoteExec Array + + remoteExec Array params remoteExec [functionName, targets, JIP] + + remoteExec [functionName, targets, JIP] $Code$// runs hint "hello" on each connected client @@ -18928,7 +18933,7 @@ $Code$[["Test Message", "PLAIN", 1]] remoteExec ["titleText"];$/Code$ - Anything + Anything - Anything @@ -20321,10 +20326,10 @@ https://community.bistudio.com/wiki/ctData - ctData Control + Control ctData Number - ctData Control + ctrl ctData row $Code$ctData _control;$/Code$ @@ -30125,7 +30130,7 @@ ctCurSel Control - ctCurSel Control + ctCurSel ctrl $Code$_curSel = ctCurSel _control;$/Code$ @@ -31837,7 +31842,7 @@ Control ctRemoveHeaders Array - Control ctRemoveHeaders Array + ctrl ctRemoveHeaders indices $Code$_control ctRemoveHeaders [0, 1, 2];$/Code$ @@ -38862,6 +38867,9 @@ (February 23, 2018) If you want to round to a specific place past the decimal point, use toFixed and parseNumber together. For example: $Code$ parseNumber (3.16666 toFixed 1); // 3.2$/Code$ + + (April 3, 2018) + Before toFixed ( round (( getDir player ) * 100)) / 100 Number @@ -43173,6 +43181,8 @@ Register target list knowledge base database to given person. See Conversations for more details. + This function is no longer available in ArmA 2. + This function is no longer available in Arma 3. https://community.bistudio.com/wiki/kbAddDatabaseTargets @@ -43515,7 +43525,7 @@ ctClear Control - ctClear Control + ctClear ctrl $Code$ctClear _control;$/Code$ @@ -44363,7 +44373,7 @@ Control ctHeaderControls Number - Control ctHeaderControls Number + ctrl ctHeaderControls index $Code$_array = _control ctHeaderControls 0;$/Code$ @@ -45430,7 +45440,7 @@ diag_mergeConfigFile Array - diag_mergeConfigFile [PathToConfigOnDrive] + diag_mergeConfigFile path $Code$diag_mergeConfigFile ["O:\Arma3\A3\Stuff_F\config.cpp"]$/Code$ @@ -45669,10 +45679,10 @@ https://community.bistudio.com/wiki/ctRemoveRows - Control ctRemoveRows Array + Control ctRemoveRows Number - Control ctRemoveRows Array + ctrl ctRemoveRows indices $Code$_control ctRemoveRows [0, 1, 2];$/Code$ @@ -45849,7 +45859,7 @@ loadFile - Return content of given filename. + Return content of given filename as string. If you plan to compile said string, be aware that the file shouldn't contain comments or compile will throw an error. If there are comments, use preprocessFile / preprocessFileLineNumbers instead. https://community.bistudio.com/wiki/loadFile @@ -45858,28 +45868,19 @@ loadFile String - loadFile filename + loadFile fileName - $Code$_contents = loadFile "myFunction.sqf";$/Code$ + $Code$_contents = loadFile "wantedString.txt";$/Code$ + + $Code$_contents = compile loadFile "myFunction.sqf"; // will compile string into code$/Code$ - undefined / local + undefined / undefined - (28 November 2006) - In Armed Assault, the 'loadfile' command must be preceded by the 'compile' command to work. - Ex OFP 1.96: _falarmEvent = loadfile ("syswarn\falarmEvent.sqf") - Ex ArmA 1.0: _falarmEvent = compile loadfile ("syswarn\falarmEvent.sqf") - - (11 July 2007) - The note by Pennywise is not entirely accurate. loadFile only needs to be preceded with compile when loading code (for example, a function contained in an.sqf file ). Using loadFile without compile will return a string, which, in some cases, is exactly what you want. - - (02 December 2012) - Please note that any comment you have within the file you load will be included, to get around that use preprocessFile instead. - (25 January 2016) - Notice that you will have to activate file patching via -filePatching [ [1] ]. Otherwise, execVM and loadFile will *not* load any files outside your mission folder (like the global scripts). For more info see CMA:DevelopmentSetup (since Arma 3 1.49+). + Notice that you will have to activate file patching via -filePatching. Otherwise, execVM and loadFile will *not* load any files outside your mission folder (like the global scripts). String @@ -47088,7 +47089,7 @@ Control ctFindHeaderRows Number - Control ctFindHeaderRows Number + ctrl ctFindHeaderRows index $Code$_array = _control ctFindHeaderRows 0;$/Code$ @@ -47301,6 +47302,35 @@ Nothing + + + + getWingsPositionRTD + + + Returns position of stabilizers. + + + https://community.bistudio.com/wiki/getWingsPositionRTD + + + getWingsPositionRTD Object + + + getWingsPositionRTD RTD_helicopter + + + $Code$_position = getWingsPositionRTD myHelicopter;$/Code$ + + + undefined / undefined + + + + + Number + + @@ -52680,7 +52710,7 @@ https://community.bistudio.com/wiki/not - not Number + not Boolean not a @@ -53329,9 +53359,13 @@ Anything remoteExecCall Array + + remoteExecCall Array params remoteExecCall [functionName, targets, JIP] + + remoteExecCall [functionName, targets, JIP] $Code$// runs hint "hello" on each connected client @@ -53388,7 +53422,7 @@ $Code$[["Test Message", "PLAIN", 1]] remoteExecCall ["titleText"];$/Code$ - Anything + Anything - Anything @@ -55582,6 +55616,35 @@ Boolean + + + + getWingsOrientationRTD + + + Returns orientation of horizontal stabilizers. + + + https://community.bistudio.com/wiki/getWingsOrientationRTD + + + getWingsOrientationRTD Object + + + getWingsOrientationRTD RTD_helicopter + + + $Code$_orientation = getWingsOrientationRTD myHelicopter;$/Code$ + + + undefined / undefined + + + + + Number + + @@ -56791,7 +56854,7 @@ isEngineOn vehicle - $Code$_OnOff = isEngineOn _carOne$/Code$ + $Code$_carEngineIsOn = isEngineOn _carOne;$/Code$ global / undefined @@ -71541,7 +71604,7 @@ ctHeaderCount Control - ctHeaderCount Control + ctHeaderCount ctrl $Code$ctHeaderCount _control;$/Code$ diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf index 6a929648..67b9aed4 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf @@ -11,17 +11,7 @@ ASL_Is_Supported_Cargo = { private ["_canSling"]; _canSling = false; if(not isNull _vehicle && not isNull _cargo) then { - { - if(_vehicle isKindOf (_x select 0)) then { - if(_cargo isKindOf (_x select 2)) then { - if( (toUpper (_x select 1)) == "CAN_SLING" ) then { - _canSling = true; - } else { - _canSling = false; - }; - }; - }; - } forEach (missionNamespace getVariable ["ASL_SLING_RULES_OVERRIDE",ASL_SLING_RULES]); + }; _canSling; }; \ No newline at end of file diff --git a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF index ae751485..3ee40468 100644 --- a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: UI Bundle-SymbolicName: raven.sqdev.ui;singleton:=true -Bundle-Version: 0.3.2.dev +Bundle-Version: 0.3.2.dev2 Bundle-Activator: raven.sqdev.ui.Activator Bundle-Vendor: Raven Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF index 125fdc56..43871b90 100644 --- a/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Wizards Bundle-SymbolicName: raven.sqdev.wizards;singleton:=true -Bundle-Version: 0.3.4 +Bundle-Version: 0.3.5.dev Bundle-Activator: raven.sqdev.wizards.activator.Activator Bundle-Vendor: Raven Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java index e7e6ea5e..fed34848 100644 --- a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java +++ b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java @@ -9,6 +9,8 @@ import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; @@ -17,6 +19,7 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.ui.PlatformUI; +import raven.sqdev.misc.SQDevPreferenceUtil; import raven.sqdev.util.ProjectUtil; import raven.sqdev.util.Util; @@ -127,6 +130,14 @@ public void mouseUp(MouseEvent event) { // make this the default option copyCheckBox.setSelection(true); + copyCheckBox.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + dialogChanged(); + } + }); + setControl(container); dialogChanged(); @@ -176,7 +187,17 @@ protected void validate() { return; } + if (!copyCheckBox.getSelection() + && filePath.matchingFirstSegments(new Path(SQDevPreferenceUtil.getArmaDocumentsDirectory())) > 0) { + // if it is disabled and the project to import is in the arma mission directory + // -> warning + setWarning( + "It is intended to copy missions from the Arma directory into the workspace. Proceed at own risk!"); + return; + } + updateStatus(null); + setWarning(null); } /** @@ -193,6 +214,16 @@ protected void updateStatus(String message) { setPageComplete(message == null); } + /** + * Displays a warning message + * + * @param message + * The warning message or null to clear the message + */ + protected void setWarning(String message) { + setMessage(message, WARNING); + } + /** * Gets the selected folder that should be imported */ diff --git a/plugin/Raven.SQDev/feature.xml b/plugin/Raven.SQDev/feature.xml index 2a6362b6..4adb1089 100644 --- a/plugin/Raven.SQDev/feature.xml +++ b/plugin/Raven.SQDev/feature.xml @@ -2,7 +2,7 @@ @@ -102,7 +102,7 @@ POSSIBILITY OF SUCH DAMAGE. id="raven.sqdev.wizards" download-size="0" install-size="0" - version="0.3.4" + version="0.3.5.dev" unpack="false"/> diff --git a/plugin/SQDev/site.xml b/plugin/SQDev/site.xml index b98b0873..b7f2d1f5 100644 --- a/plugin/SQDev/site.xml +++ b/plugin/SQDev/site.xml @@ -1,6 +1,6 @@ - + From bb6e584117bdacccfe38fff567da6505071cf263 Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Sun, 8 Apr 2018 12:52:42 +0200 Subject: [PATCH 21/23] fixed bugs in Project import; Fixed NullpointerException in syntax tree display --- plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF | 2 +- .../ui/commands/ShowSyntaxTreeHandler.java | 14 +++ plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF | 2 +- .../raven/sqdev/sqdevFile/ESQDevFileType.java | 97 ++++++++++--------- .../src/raven/sqdev/util/ProjectUtil.java | 21 +++- .../raven/sqdev/util/SQDevInformation.java | 2 +- .../Raven.SQDev.Wizards/META-INF/MANIFEST.MF | 2 +- .../importWizard/SQDevImportWizardPage.java | 2 +- plugin/Raven.SQDev/feature.xml | 8 +- plugin/SQDev/site.xml | 2 +- 10 files changed, 91 insertions(+), 61 deletions(-) diff --git a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF index 3ee40468..79843264 100644 --- a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: UI Bundle-SymbolicName: raven.sqdev.ui;singleton:=true -Bundle-Version: 0.3.2.dev2 +Bundle-Version: 0.3.2.dev3 Bundle-Activator: raven.sqdev.ui.Activator Bundle-Vendor: Raven Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowSyntaxTreeHandler.java b/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowSyntaxTreeHandler.java index 5483fd3d..b8ae2f86 100644 --- a/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowSyntaxTreeHandler.java +++ b/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowSyntaxTreeHandler.java @@ -10,6 +10,7 @@ import org.eclipse.ui.PlatformUI; import raven.sqdev.editors.BasicCodeEditor; import raven.sqdev.interfaces.IParseResult; +import raven.sqdev.misc.SQDevInfobox; import ui.TreeUI; public class ShowSyntaxTreeHandler extends AbstractHandler { @@ -27,6 +28,19 @@ public Object execute(ExecutionEvent event) throws ExecutionException { shell.setLayout(new FillLayout()); shell.setText("Syntax Tree"); + if (parseResult == null) { + // there is nothing to display + + SQDevInfobox info = new SQDevInfobox("There is no syntax tree to display here.\n" + + "Note that the syntax tree can only be shown when having an SQF editor opened. " + + "If you do happen do have one opened, try to let its content be parsed and try again.", + SWT.ICON_INFORMATION); + + info.open(false); + + return null; + } + new TreeUI(shell, SWT.NONE, parseResult.getTree(), parseResult.getTokenBuffer()); shell.open(); diff --git a/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF index 3aaecf5b..949cd007 100644 --- a/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Util Bundle-SymbolicName: raven.sqdev.util;singleton:=true -Bundle-Version: 0.7.3.dev +Bundle-Version: 0.7.3.dev2 Bundle-Activator: raven.sqdev.activator.Activator Bundle-Vendor: Raven Require-Bundle: org.eclipse.core.runtime, diff --git a/plugin/Raven.SQDev.Util/src/raven/sqdev/sqdevFile/ESQDevFileType.java b/plugin/Raven.SQDev.Util/src/raven/sqdev/sqdevFile/ESQDevFileType.java index 7330939e..bac38f4e 100644 --- a/plugin/Raven.SQDev.Util/src/raven/sqdev/sqdevFile/ESQDevFileType.java +++ b/plugin/Raven.SQDev.Util/src/raven/sqdev/sqdevFile/ESQDevFileType.java @@ -16,89 +16,85 @@ */ public enum ESQDevFileType { /** - * The name of the sqdev-file that contains information about the linking to - * the ArmA folder + * The name of the sqdev-file that contains information about the linking to the + * ArmA folder */ LINK { @Override public String toString() { return "link"; } - + @Override public String getInitialInput() { // clear the initial content before recreating it initialContent = ""; - + // add attributes addAttribute(ESQDevFileAttribute.PROFILE, info.getProfile()); - + IPath exportPath = Util.getMissionsDirectory(info.getProfile()); - + if (info.isMp()) { exportPath = exportPath.removeLastSegments(1); exportPath = exportPath.append("mpMissions"); } - - addAttribute(ESQDevFileAttribute.EXPORTDIRECTORY, - exportPath.toOSString()); - - addAttribute(ESQDevFileAttribute.AUTOEXPORT, - String.valueOf(info.getAutoExport())); - + + addAttribute(ESQDevFileAttribute.EXPORTDIRECTORY, exportPath.toOSString()); + + addAttribute(ESQDevFileAttribute.AUTOEXPORT, String.valueOf(info.getAutoExport())); + addAttribute(ESQDevFileAttribute.TERRAIN, info.getTerrain()); - + // add annotations initialContent += "\n\n"; - addAnnotation(ESQDevFileAnnotation.IGNORE, - filesToIgnore.toArray(new String[filesToIgnore.size()])); - + addAnnotation(ESQDevFileAnnotation.IGNORE, filesToIgnore.toArray(new String[filesToIgnore.size()])); + initialContent += "\n"; - - addAnnotation(ESQDevFileAnnotation.PRESERVE, filesToPreserve - .toArray(new String[filesToPreserve.size()])); - + + addAnnotation(ESQDevFileAnnotation.PRESERVE, filesToPreserve.toArray(new String[filesToPreserve.size()])); + return initialContent.trim() + "\n"; } }; - + private ESQDevFileType() { initialContent = ""; filesToIgnore = new ArrayList(); filesToPreserve = new ArrayList(); - + addFileToIgnore(this.toString() + EFileType.SQDEV.getExtension()); addFileToIgnore(".project"); } - + protected SQDevInformation info; - + /** * A String containing the initial content od this fileType */ protected String initialContent; - + /** * A list of files/folders that should be ignored during project export */ protected ArrayList filesToIgnore; - + /** * A list of files/foldersy that should not get deleted during cleanup for * exporting a project */ protected ArrayList filesToPreserve; - + public abstract String getInitialInput(); - + /** * Will find the respective instance of this enum * * @param type - * The type of the enum that should be found. Has to be the - * return value of one of the toString()-methods of this enum - * @return The respective instance of this enum or null if the - * type couldn't be resolved + * The type of the enum that should be found. Has to be the return + * value of one of the toString()-methods of this enum + * @return The respective instance of this enum or null if the type + * couldn't be resolved */ public static ESQDevFileType resolve(String type) { for (ESQDevFileType current : ESQDevFileType.values()) { @@ -106,10 +102,10 @@ public static ESQDevFileType resolve(String type) { return current; } } - + return null; } - + /** * Checks if the given type is contained in this enum * @@ -120,11 +116,11 @@ public static ESQDevFileType resolve(String type) { public static boolean contains(String type) { return (resolve(type) == null) ? false : true; } - + public void addFileToIgnore(String fileName) { filesToIgnore.add(fileName); } - + /** * Adds an attribute to the initial content * @@ -134,10 +130,14 @@ public void addFileToIgnore(String fileName) { * The value of this attribute */ protected void addAttribute(ESQDevFileAttribute attr, String value) { - initialContent += ((initialContent.endsWith("\n")) ? "" : "\n") + attr - + " = " + value + ";\n"; + if (value == null || value.equals(SQDevInformation.NOT_SET)) { + // the respective attribute is not set + return; + } + + initialContent += ((initialContent.endsWith("\n")) ? "" : "\n") + attr + " = " + value + ";\n"; } - + /** * Adds an annotation to the initial content * @@ -146,28 +146,31 @@ protected void addAttribute(ESQDevFileAttribute attr, String value) { * @param value * The values of this annotation */ - protected void addAnnotation(ESQDevFileAnnotation annotation, - String[] values) { + protected void addAnnotation(ESQDevFileAnnotation annotation, String[] values) { + if (values == null) { + // the respective annotation is not set + return; + } for (String currentValue : values) { - initialContent += ((initialContent.endsWith("\n")) ? "" : "\n") - + "@" + annotation + " \"" + currentValue + "\"\n"; + initialContent += ((initialContent.endsWith("\n")) ? "" : "\n") + "@" + annotation + " \"" + currentValue + + "\"\n"; } } - + /** * Checks if the information has been et */ public boolean isInformationSet() { return info != null; } - + /** * Gets the set information */ public SQDevInformation getInformation() { return (isInformationSet()) ? info : new SQDevInformation(); } - + /** * Sets the information * diff --git a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/ProjectUtil.java b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/ProjectUtil.java index 61dbcd4d..b7eede9b 100644 --- a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/ProjectUtil.java +++ b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/ProjectUtil.java @@ -309,16 +309,29 @@ public static String importAsProject(IPath path, boolean copyContent) { try { // create the project - IProject project = createSQDevProject(ResourcesPlugin.getWorkspace().getRoot(), projectName, - copyContent ? null : path); + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + IProject project = createSQDevProject(root, projectName, copyContent ? null : path); project.open(new NullProgressMonitor()); // gather information SQDevInformation information = new SQDevInformation(); information.setProfile(SQDevPreferenceUtil.getDefaultProfile()); - information.setTerrain(path.lastSegment().substring(path.lastSegment().indexOf(".") + 1)); - information.autoExport = SQDevPreferenceUtil.getAutoExportDefaultEnabled(); + if (path.lastSegment() != null && path.lastSegment().contains(".")) { + information.setTerrain(path.lastSegment().substring(path.lastSegment().indexOf(".") + 1)); + if (copyContent) { + information.autoExport = SQDevPreferenceUtil.getAutoExportDefaultEnabled(); + } else { + // turn off autoexport for all projects that originate from the Arma-dir and are + // not copied + IPath armaDirPath = new Path(SQDevPreferenceUtil.getArmaDocumentsDirectory()); + information.autoExport = !armaDirPath.isPrefixOf(project.getLocation()) + && SQDevPreferenceUtil.getAutoExportDefaultEnabled(); + } + } else { + information.terrain = SQDevInformation.NOT_SET; + information.autoExport = false; + } information.name = projectName; // create linkFile diff --git a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/SQDevInformation.java b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/SQDevInformation.java index 942b5922..ab195393 100644 --- a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/SQDevInformation.java +++ b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/SQDevInformation.java @@ -19,7 +19,7 @@ public class SQDevInformation { /** - * The default String indocating that the requested value has not been set + * The default String indicating that the requested value has not been set * and does not have a default value */ public static String NOT_SET = "NotSet"; diff --git a/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF index 43871b90..99bf312f 100644 --- a/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Wizards Bundle-SymbolicName: raven.sqdev.wizards;singleton:=true -Bundle-Version: 0.3.5.dev +Bundle-Version: 0.3.5.dev2 Bundle-Activator: raven.sqdev.wizards.activator.Activator Bundle-Vendor: Raven Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java index fed34848..12cf3766 100644 --- a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java +++ b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/importWizard/SQDevImportWizardPage.java @@ -188,7 +188,7 @@ protected void validate() { } if (!copyCheckBox.getSelection() - && filePath.matchingFirstSegments(new Path(SQDevPreferenceUtil.getArmaDocumentsDirectory())) > 0) { + && new Path(SQDevPreferenceUtil.getArmaDocumentsDirectory()).isPrefixOf(filePath)) { // if it is disabled and the project to import is in the arma mission directory // -> warning setWarning( diff --git a/plugin/Raven.SQDev/feature.xml b/plugin/Raven.SQDev/feature.xml index 4adb1089..784752d2 100644 --- a/plugin/Raven.SQDev/feature.xml +++ b/plugin/Raven.SQDev/feature.xml @@ -2,7 +2,7 @@ @@ -95,14 +95,14 @@ POSSIBILITY OF SUCH DAMAGE. id="raven.sqdev.util" download-size="0" install-size="0" - version="0.7.3.dev" + version="0.7.3.dev2" unpack="false"/> - + From e1743e7191a2d2f201e5d551f30bb6751c124f89 Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Sun, 8 Apr 2018 13:33:21 +0200 Subject: [PATCH 22/23] fixed dependency-version-problem --- plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF | 6 +++--- plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF | 10 +++++----- plugin/Raven.SQDev/feature.xml | 6 +++--- plugin/SQDev/site.xml | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF index 79843264..052b620b 100644 --- a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: UI Bundle-SymbolicName: raven.sqdev.ui;singleton:=true -Bundle-Version: 0.3.2.dev3 +Bundle-Version: 0.3.2.dev4 Bundle-Activator: raven.sqdev.ui.Activator Bundle-Vendor: Raven Bundle-RequiredExecutionEnvironment: JavaSE-1.8 @@ -11,10 +11,10 @@ Bundle-ClassPath: . Import-Package: org.antlr.v4.runtime, org.antlr.v4.runtime.misc, org.antlr.v4.runtime.tree, - org.eclipse.core.runtime;version="3.5.0", + org.eclipse.core.runtime, org.eclipse.jface.text, org.eclipse.ui.texteditor, - org.osgi.framework;version="1.8.0", + org.osgi.framework, raven.sqdev.constants, raven.sqdev.editors, raven.sqdev.exceptions, diff --git a/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF index 99bf312f..f3d62b55 100644 --- a/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Wizards/META-INF/MANIFEST.MF @@ -2,13 +2,13 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Wizards Bundle-SymbolicName: raven.sqdev.wizards;singleton:=true -Bundle-Version: 0.3.5.dev2 +Bundle-Version: 0.3.5.dev3 Bundle-Activator: raven.sqdev.wizards.activator.Activator Bundle-Vendor: Raven Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Import-Package: org.eclipse.core.resources, - org.eclipse.core.runtime;version="3.5.0", + org.eclipse.core.runtime, org.eclipse.core.runtime.jobs, org.eclipse.jface.dialogs, org.eclipse.jface.resource, @@ -16,13 +16,13 @@ Import-Package: org.eclipse.core.resources, org.eclipse.jface.wizard, org.eclipse.ui, org.eclipse.ui.wizards.newresource, - org.osgi.framework;version="1.8.0", - org.osgi.service.prefs;version="1.1.1", + org.osgi.framework, + org.osgi.service.prefs, raven.sqdev.exceptions, raven.sqdev.misc, raven.sqdev.pluginManagement, raven.sqdev.sqdevFile, raven.sqdev.util, raven.sqdev.utilInterfaces -Require-Bundle: org.eclipse.swt;bundle-version="3.106.2", +Require-Bundle: org.eclipse.swt, org.eclipse.ui.workbench diff --git a/plugin/Raven.SQDev/feature.xml b/plugin/Raven.SQDev/feature.xml index 784752d2..c79d4d30 100644 --- a/plugin/Raven.SQDev/feature.xml +++ b/plugin/Raven.SQDev/feature.xml @@ -2,7 +2,7 @@ @@ -102,7 +102,7 @@ POSSIBILITY OF SUCH DAMAGE. id="raven.sqdev.wizards" download-size="0" install-size="0" - version="0.3.5.dev2" + version="0.3.5.dev3" unpack="false"/> - + From 743a42375a571dc86301e3c4d3d0990accfd8ef5 Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Sun, 8 Apr 2018 16:23:38 +0200 Subject: [PATCH 23/23] prepared and built new stable version --- plugin/Raven.SQDev.Editors/.classpath | 2 +- .../Raven.SQDev.Editors/META-INF/MANIFEST.MF | 2 +- plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF | 2 +- .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 104123 -> 104186 bytes .../META-INF/MANIFEST.MF | 2 +- plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF | 2 +- plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF | 2 +- .../Raven.SQDev.Wizards/META-INF/MANIFEST.MF | 2 +- plugin/Raven.SQDev/feature.xml | 26 +++++++++--------- .../META-INF/MANIFEST.MF | 2 +- plugin/SQDev/SQDev_0.7.5.zip | Bin 0 -> 1587684 bytes plugin/SQDev/site.xml | 2 +- 12 files changed, 22 insertions(+), 22 deletions(-) create mode 100644 plugin/SQDev/SQDev_0.7.5.zip diff --git a/plugin/Raven.SQDev.Editors/.classpath b/plugin/Raven.SQDev.Editors/.classpath index c4a519dc..eca7bdba 100644 --- a/plugin/Raven.SQDev.Editors/.classpath +++ b/plugin/Raven.SQDev.Editors/.classpath @@ -1,7 +1,7 @@ - + diff --git a/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF index d9ab4976..9a818d7c 100644 --- a/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Editors Bundle-SymbolicName: raven.sqdev.editors;singleton:=true -Bundle-Version: 0.7.2.dev2 +Bundle-Version: 0.7.2.stable Bundle-Activator: raven.sqdev.editors.activator.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, diff --git a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF index 1b244d3a..e23dc3fc 100644 --- a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Misc Bundle-SymbolicName: raven.sqdev.misc;singleton:=true -Bundle-Version: 0.7.0.dev2 +Bundle-Version: 0.7.0.stable Bundle-Activator: raven.sqdev.activator.Activator Require-Bundle: org.eclipse.core.runtime, org.eclipse.swt, diff --git a/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar b/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar index 3e7e7f66fab61005c3dcd4fc7aaa8378048b0786..264ecdfb9f919473c55fb3c20f4eae1601c7c9a0 100644 GIT binary patch delta 13020 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

    WQ)lxlMYcg5Nn4sb-x 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¥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�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

    TtO4EfkpPB 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 ZcoaPfgV{#dzeIMs(SOGwz(1 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

    cJMJ+*lF`T?z=NS9c@HEUny7 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 a0_XJs8K(fa0L`HE6aYR{nIGV<`u_kWynu87 delta 12935 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 SQDev provides a set of features to facilitate the development -of scripts for the ArmA series. +of scripts for the Arma series. @@ -78,59 +78,59 @@ POSSIBILITY OF SUCH DAMAGE. - - - - + + + + diff --git a/plugin/RavenSQDev.Preferences/META-INF/MANIFEST.MF b/plugin/RavenSQDev.Preferences/META-INF/MANIFEST.MF index ae1f7322..a64ba0d3 100644 --- a/plugin/RavenSQDev.Preferences/META-INF/MANIFEST.MF +++ b/plugin/RavenSQDev.Preferences/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Preferences Bundle-SymbolicName: raven.sqdev.preferences;singleton:=true -Bundle-Version: 0.5.5 +Bundle-Version: 0.5.6.stable Bundle-Activator: raven.sqdev.preferences.activator.Activator Bundle-Vendor: Raven Require-Bundle: org.eclipse.ui, diff --git a/plugin/SQDev/SQDev_0.7.5.zip b/plugin/SQDev/SQDev_0.7.5.zip new file mode 100644 index 0000000000000000000000000000000000000000..a6f7cec88d35c0846ab282585ef619aa311283c8 GIT binary patch literal 1587684 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 ?BX1E?qK?+s3x*d? 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

    6sL+oBR5oTw4DsD|t@8OsPJj?veSBq7)kepR? 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 I?h|nT2bc7dqW}N^ delta 43636 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 z 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 Pyw(uj1ehb@+JOHD8=-9$ diff --git a/plugin/Raven.SQDev.Misc/build.properties b/plugin/Raven.SQDev.Misc/build.properties index e51ebec1..3476c74f 100644 --- a/plugin/Raven.SQDev.Misc/build.properties +++ b/plugin/Raven.SQDev.Misc/build.properties @@ -5,7 +5,6 @@ bin.includes = META-INF/,\ plugin.xml,\ resources/,\ ANTLR/,\ - ANTLR/antlr-runtime-4.5.3.jar,\ SQFParser/SQFParser.jar src.includes = resources/,\ diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IParseResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IParseResult.java index cd362bd7..e5fb8077 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IParseResult.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IParseResult.java @@ -2,6 +2,8 @@ import java.util.Collection; +import org.antlr.v4.runtime.tree.ParseTree; + import dataStructures.IBuildableIndexTree; import dataStructures.IToken; import dataStructures.ITokenSource; @@ -34,4 +36,18 @@ public interface IParseResult { */ public Collection getMarkers(); + /** + * Gets the ANTLR parse tree (if present) + */ + public ParseTree getANTRLParseTree(); + + /** + * Gets the line in the input at the given offset + * + * @param offset + * The offset whose line should be determined + * @return The respective line + */ + public int getLine(int offset); + } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseResultOld.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseResultOld.java index d4a356ea..fa910098 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseResultOld.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseResultOld.java @@ -5,11 +5,15 @@ import org.antlr.v4.runtime.tree.ParseTree; +import dataStructures.IBuildableIndexTree; +import dataStructures.IToken; +import dataStructures.ITokenSource; import raven.sqdev.interfaces.IMarkerSupport; +import raven.sqdev.interfaces.IParseResult; import raven.sqdev.misc.Marker; @Deprecated -public class ParseResultOld implements IMarkerSupport { +public class ParseResultOld implements IMarkerSupport, IParseResult { /** * The list of reported markers @@ -144,4 +148,31 @@ public List getMarkerTypes() { return names; } + + @Override + @Deprecated + public IBuildableIndexTree getTree() { + // TODO Auto-generated method stub + return null; + } + + @Override + @Deprecated + public ITokenSource getTokenBuffer() { + // TODO Auto-generated method stub + return null; + } + + @Override + public ParseTree getANTRLParseTree() { + // TODO Auto-generated method stub + return tree; + } + + @Override + @Deprecated + public int getLine(int offset) { + // TODO Auto-generated method stub + return 0; + } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java index 60e08623..bf5d374f 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java @@ -85,6 +85,7 @@ public static final SQFParseResult parseSQF(InputStream input, ISQFParseSupplier sqfLexer.setMacros(supplier.getMacros().keySet()); sqfLexer.setTokenFactory(supplier.getTokenFactory()); errorListener.setMarkerStorage(result); + result.setLineIndices(sqfLexer.getNewlineIndices()); CharacterInputStream inStream = new CharacterInputStream(input); sqfLexer.lex(inStream); @@ -322,8 +323,10 @@ public static final Map getDefaultMagicVars() { * The origin-path of the given content. This is used in order to * resolve relative paths * @return The result of the preprocessing + * @throws IOException */ - public static final PreprocessorParseResult parseAndValidatePreprocess(String input, IPath origin) { + public static final PreprocessorParseResult parseAndValidatePreprocess(InputStream input, IPath origin) + throws IOException { ANTLRInputStream prepIn = new ANTLRInputStream(input); PreprocessorLexer prepLexer = new PreprocessorLexer(prepIn); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java index c195f365..0bf8d859 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java @@ -2,6 +2,9 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.List; + +import org.antlr.v4.runtime.tree.ParseTree; import dataStructures.IBuildableIndexTree; import dataStructures.ITokenSource; @@ -24,6 +27,14 @@ public class SQFParseResult implements IParseResult, IMarkerSupport { * A collection of markers that have been created during parse-tree-creation */ protected Collection markers; + /** + * The ANTLR parse tree + */ + protected ParseTree antlrTree; + /** + * A list of indices of newlines + */ + protected List linieIndices; public SQFParseResult() { markers = new ArrayList<>(); @@ -98,4 +109,38 @@ public void reset() { tokenBuffer = null; } + @Override + public ParseTree getANTRLParseTree() { + return antlrTree; + } + + public void setANTLRParseTree(ParseTree tree) { + antlrTree = tree; + } + + @Override + public int getLine(int offset) { + if (offset < 0) { + throw new IllegalArgumentException("Offset may not be negative!"); + } + + for (int i = 0; i < linieIndices.size(); i++) { + if (linieIndices.get(i) > offset) { + return linieIndices.get(i - 1); + } + } + + return -1; + } + + /** + * Sets the newline indices + * + * @param lineIndices + * The respective indices + */ + public void setLineIndices(List lineIndices) { + this.linieIndices = lineIndices; + } + } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java index 7e9b279c..0e70b82f 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/SQFProcessor.java @@ -121,7 +121,8 @@ public void nularExpression(SQFToken expression, IndexTreeElement node) { final String operatorNameLower = operatorName.toLowerCase(); final SQFCommand operator = sqfInformation.getNularOperators().get(operatorNameLower); - if (!declaredVariables.contains(operatorName.toLowerCase())) { + if (!declaredVariables.contains(operatorName.toLowerCase()) + && !sqfInformation.getMagicVariables().keySet().contains(operatorNameLower)) { if (operatorName.startsWith("_")) { // it is an unknown local variable -> error error(expression, ProblemMessages.undefinedLocalVariable(operatorName)); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf new file mode 100644 index 00000000..39963047 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf @@ -0,0 +1,7 @@ +// { +// [str getPos (_x select 0), getPos (_x select 0), "mil_dot", "ColorYellow", ""] call ENGIMA_CIVILIANS_SetDebugMarkerAllClients; +// } foreach _playerBuildingsTemp; + +CHECK_FALSE(isNil "_type", Invalid eventType!, {}) + +DEBUG_EXEC(EVENT_LOG(fired - %1, str _type)) \ No newline at end of file diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java index c050b295..c4cf93dd 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java @@ -4,6 +4,7 @@ import java.io.ByteArrayInputStream; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; @@ -886,7 +887,7 @@ public void binaryExpressionErrors() throws IOException { assertTrue(result.getMarkers().size() == 1); assertEquals(ProblemMessages.expectedTypeButGot(new DataTypeList(EDataType.OBJECT), new DataTypeList(EDataType.NUMBER)), result.getMarkers().iterator().next().getMessage()); - + result = ParseUtil.parseAndProcessSQF(new ByteArrayInputStream("[time setPos [0,0,0]]".getBytes()), supplier, info); assertTrue(result.getDeclaredGlobalVariables().size() == 0); @@ -907,6 +908,23 @@ public void binaryExpressionErrors() throws IOException { new DataTypeList(EDataType.NOTHING)), it.next().getMessage()); } + @Test + public void snippets() throws IOException { + macros.put("CHECK_FALSE", new Macro("CHECK_FALSE")); + macros.put("DEBUG_EXEC", new Macro("DEBUG_EXEC")); + macros.put("EVENT_LOG", new Macro("EVENT_LOG")); + + ITreeProcessingResult result = ParseUtil.parseAndProcessSQF( + new FileInputStream(new File( + makeOSCompatible(System.getProperty("user.dir") + "/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf"))), + supplier, info); + assertTrue(result.getDeclaredGlobalVariables().size() == 0); + assertTrue(result.getDeclaredLocalVariables().size() == 0); + assertTrue(result.getMarkers().size() == 0); + + macros.clear(); + } + /** * Makes the given path (that uses "/" as a FileSeparator) compatible with the diff --git a/plugin/Raven.SQDev.SQFEditor/src/raven/sqdev/editors/sqfeditor/SQF_Editor.java b/plugin/Raven.SQDev.SQFEditor/src/raven/sqdev/editors/sqfeditor/SQF_Editor.java index 843ff39b..fe8d3182 100644 --- a/plugin/Raven.SQDev.SQFEditor/src/raven/sqdev/editors/sqfeditor/SQF_Editor.java +++ b/plugin/Raven.SQDev.SQFEditor/src/raven/sqdev/editors/sqfeditor/SQF_Editor.java @@ -1,6 +1,8 @@ package raven.sqdev.editors.sqfeditor; import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -8,8 +10,6 @@ import java.util.Map; import java.util.Map.Entry; -import org.antlr.v4.runtime.BufferedTokenStream; -import org.antlr.v4.runtime.tree.ParseTree; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; @@ -20,6 +20,7 @@ import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IFileEditorInput; +import dataStructures.AbstractSQFTokenFactory; import raven.sqdev.constants.SQDevPreferenceConstants; import raven.sqdev.editors.BasicCodeEditor; import raven.sqdev.editors.BasicPartitionScanner; @@ -34,11 +35,16 @@ import raven.sqdev.infoCollection.base.Variable; import raven.sqdev.interfaces.IKeywordListChangeListener; import raven.sqdev.interfaces.IMacroSupport; +import raven.sqdev.interfaces.IParseResult; import raven.sqdev.interfaces.ISQFInformation; +import raven.sqdev.interfaces.ISQFParseSupplier; +import raven.sqdev.interfaces.ITreeProcessingResult; import raven.sqdev.misc.Macro; +import raven.sqdev.misc.Marker; import raven.sqdev.misc.SQDevInfobox; import raven.sqdev.parser.misc.ParseUtil; -import raven.sqdev.parser.sqf.SQFParseResultOld; +import raven.sqdev.parser.misc.SQFParseResult; +import raven.sqdev.parser.misc.SQFTokenFactory; import raven.sqdev.sqdevFile.ESQDevFileAnnotation; import raven.sqdev.sqdevFile.ESQDevFileAttribute; import raven.sqdev.sqdevFile.ESQDevFileType; @@ -54,7 +60,7 @@ * */ public class SQF_Editor extends BasicCodeEditor - implements IKeywordListChangeListener, IMacroSupport, ISQFInformation { + implements IKeywordListChangeListener, IMacroSupport, ISQFInformation, ISQFParseSupplier { /** * The KeywordProvider for the SQF keywords @@ -94,10 +100,9 @@ public class SQF_Editor extends BasicCodeEditor */ protected List macroNames; /** - * The CommonTokenStream that is associated with the current parse - * tree + * The token factory to use for parsing */ - private BufferedTokenStream currentStream; + protected AbstractSQFTokenFactory tokenFactory; public SQF_Editor() { super(); @@ -216,33 +221,42 @@ protected IStatus run(IProgressMonitor monitor) { } @Override - protected ParseTree doParse(String input) { - SQFParseResultOld result = ParseUtil.parseSQFOld(input, this); - - if (!result.providesParseTree() || !result.providesParserRuleNames() || !result.providesTokenStream()) { - throw new SQDevCoreException("Expected SQFParseResult to contain tree, names and tokenStream!"); + protected IParseResult doParse(InputStream input) { + SQFParseResult result; + try { + result = ParseUtil.parseSQF(input, this); + } catch (IOException e) { + e.printStackTrace(); + + SQDevInfobox info = new SQDevInfobox("Error during SQF-parsing!", e); + info.open(false); + return null; } - if (parseRuleNames == null) { - parseRuleNames = result.getParserRulenames(); + for (Marker currentMarker : result.getMarkers()) { + this.createMarker(currentMarker.getType(), currentMarker.getOffset(), currentMarker.getLength(), + currentMarker.getMessage(), currentMarker.getSeverity()); } - currentStream = result.getTokenStream(); - - result.applyMarkersTo(this); - - return result.getParseTree(); + return result; } @Override - public boolean processParseTree(ParseTree parseTree) { + public boolean processParseTree(IParseResult parseResult) { + if (!(parseResult instanceof SQFParseResult)) { + throw new IllegalArgumentException("The given parse-result has to be of type SQFParseResult!"); + } // process parse result - SQFParseResultOld result = ParseUtil.validateSQFOld(parseTree, currentStream, this); + ITreeProcessingResult result = ParseUtil.processSQF((SQFParseResult) parseResult, this); setVariables(result.getDeclaredLocalVariables(), result.getDeclaredGlobalVariables()); - result.applyMarkersTo(this); - for (Position currentFoldingPos : result.getFoldingAreas()) { + for (Marker currentMarker : result.getMarkers()) { + this.createMarker(currentMarker.getType(), currentMarker.getOffset(), currentMarker.getLength(), + currentMarker.getMessage(), currentMarker.getSeverity()); + } + + for (Position currentFoldingPos : result.getFoldableAreas()) { addFoldingArea(currentFoldingPos); } @@ -498,7 +512,7 @@ public boolean setMacros(Map macros, boolean update) { } @Override - public Map getMacros() { + public Map getMacros() { return macros; } @@ -519,4 +533,12 @@ public List getMagicVariableNames() { return names; } + + @Override + public AbstractSQFTokenFactory getTokenFactory() { + if (tokenFactory == null) { + tokenFactory = new SQFTokenFactory(getBinaryKeywords(), getUnaryKeywords()); + } + return tokenFactory; + } } diff --git a/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowParseTreeHandler.java b/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowParseTreeHandler.java index c7a35310..bd518992 100644 --- a/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowParseTreeHandler.java +++ b/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowParseTreeHandler.java @@ -9,6 +9,7 @@ import org.eclipse.ui.IEditorPart; import org.eclipse.ui.PlatformUI; import raven.sqdev.editors.BasicCodeEditor; +import raven.sqdev.interfaces.IParseResult; import raven.sqdev.ui.util.TreeViewer; public class ShowParseTreeHandler extends AbstractHandler { @@ -21,12 +22,13 @@ public Object execute(ExecutionEvent event) throws ExecutionException { if (active != null && active instanceof BasicCodeEditor) { BasicCodeEditor activeEditor = (BasicCodeEditor) active; - ParseTree tree = activeEditor.getParseTree(); + IParseResult tree = activeEditor.getParseResult(); List ruleNames = activeEditor.getParseRuleNames(); if (tree != null && ruleNames != null) { - TreeViewer viewer = new TreeViewer(ruleNames, tree); - viewer.open(); + // TODO: use new TreeDisplayer + // TreeViewer viewer = new TreeViewer(ruleNames, tree); + // viewer.open(); } } return null; diff --git a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/SQDevProjectBuilder.java b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/SQDevProjectBuilder.java index 8b37fc6c..8c6cbb08 100644 --- a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/SQDevProjectBuilder.java +++ b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/SQDevProjectBuilder.java @@ -17,19 +17,23 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; -import raven.sqdev.misc.FileUtil; +import dataStructures.AbstractSQFTokenFactory; +import raven.sqdev.interfaces.IParseResult; +import raven.sqdev.interfaces.ISQFParseSupplier; +import raven.sqdev.interfaces.ITreeProcessingResult; +import raven.sqdev.misc.Macro; import raven.sqdev.misc.Marker; import raven.sqdev.misc.SQDevInfobox; import raven.sqdev.parser.misc.ParseUtil; +import raven.sqdev.parser.misc.SQFParseResult; +import raven.sqdev.parser.misc.SQFTokenFactory; import raven.sqdev.parser.preprocessor.PreprocessorParseResult; import raven.sqdev.parser.sqf.SQFInformation; -import raven.sqdev.parser.sqf.SQFParseResultOld; public class SQDevProjectBuilder extends IncrementalProjectBuilder { @Override - protected IProject[] build(int kind, Map args, IProgressMonitor monitor) - throws CoreException { + protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { try { switch (kind) { @@ -67,8 +71,7 @@ protected IProject[] build(int kind, Map args, IProgressMonitor * @throws FileNotFoundException * @throws CoreException */ - protected void incrementalBuild(IProgressMonitor monitor) - throws FileNotFoundException, IOException, CoreException { + protected void incrementalBuild(IProgressMonitor monitor) throws FileNotFoundException, IOException, CoreException { monitor.beginTask("Building " + getProject().getName(), IProgressMonitor.UNKNOWN); IResourceDelta delta = getDelta(getProject()); @@ -88,10 +91,8 @@ protected void incrementalBuild(IProgressMonitor monitor) * @throws FileNotFoundException * @throws CoreException */ - private void parseChangedFiles(IResourceDelta delta) - throws FileNotFoundException, IOException, CoreException { - for (IResourceDelta currentResourceDelta : delta.getAffectedChildren(IResourceDelta.CHANGED, - IResource.FILE)) { + private void parseChangedFiles(IResourceDelta delta) throws FileNotFoundException, IOException, CoreException { + for (IResourceDelta currentResourceDelta : delta.getAffectedChildren(IResourceDelta.CHANGED, IResource.FILE)) { if (currentResourceDelta.getResource() instanceof IFile) { parseSQFFile((IFile) currentResourceDelta.getResource()); } else { @@ -109,8 +110,7 @@ private void parseChangedFiles(IResourceDelta delta) * @throws IOException * @throws FileNotFoundException */ - protected void fullBuild(IProgressMonitor monitor) - throws CoreException, FileNotFoundException, IOException { + protected void fullBuild(IProgressMonitor monitor) throws CoreException, FileNotFoundException, IOException { List files = getProjectChildren(IResource.FILE); monitor.beginTask("Building project " + getProject().getName(), files.size()); @@ -145,44 +145,64 @@ protected void parseSQFFile(IFile file) throws FileNotFoundException, IOExceptio System.out.println("Parsing " + file.getName()); - final String fileContent = FileUtil.readAll(new FileInputStream(file.getLocation().toFile())); + FileInputStream fileStream = new FileInputStream(file.getLocation().toFile()); - PreprocessorParseResult prepResult = ParseUtil.parseAndValidatePreprocess(fileContent, - file.getLocation()); + PreprocessorParseResult prepResult = ParseUtil.parseAndValidatePreprocess(fileStream, file.getLocation()); + + // "reset" InputStream + fileStream = new FileInputStream(file.getLocation().toFile()); // create parse information with default values SQFInformation info = new SQFInformation(prepResult.getMacros()); - SQFParseResultOld sqfResult = ParseUtil.parseSQFOld(fileContent, info); - - sqfResult - .mergeWith(ParseUtil.validateSQFOld(sqfResult.getParseTree(), sqfResult.getTokenStream(), info)); + IParseResult parseResult = ParseUtil.parseSQF(fileStream, new ISQFParseSupplier() { - sqfResult.mergeWith(prepResult); + @Override + public AbstractSQFTokenFactory getTokenFactory() { + return new SQFTokenFactory(info.getBinaryKeywords(), info.getUnaryKeywords()); + } + @Override + public Map getMacros() { + return prepResult.getMacros(); + } + }); // clear old markers file.deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE); - // apply markers - for (Marker currentMarker : sqfResult.getMarkers()) { - // find line - int line = 1; - for (int i = 0; i < currentMarker.getOffset(); i++) { - if (fileContent.charAt(i) == '\n') { - line++; - } + boolean foundError = false; + + // apply parse- and lex-markers + for (Marker currentMarker : parseResult.getMarkers()) { + addMarker(file, currentMarker, parseResult.getLine(currentMarker.getOffset())); + if (currentMarker.getSeverity() == IMarker.SEVERITY_ERROR) { + foundError = true; } + } - IMarker fileMarker = file.createMarker(currentMarker.getType()); - fileMarker.setAttribute(IMarker.LINE_NUMBER, line); - fileMarker.setAttribute(IMarker.MESSAGE, currentMarker.getMessage()); - fileMarker.setAttribute(IMarker.SEVERITY, currentMarker.getSeverity()); - fileMarker.setAttribute(IMarker.CHAR_START, currentMarker.getOffset()); - fileMarker.setAttribute(IMarker.CHAR_END, currentMarker.getOffset() + currentMarker.getLength()); + if (foundError) { + // don't continue if there have been any errors so far + return; + } + + ITreeProcessingResult processingResult = ParseUtil.processSQF((SQFParseResult) parseResult, info); + + // apply processing-markers + for (Marker currentMarker : processingResult.getMarkers()) { + addMarker(file, currentMarker, parseResult.getLine(currentMarker.getOffset())); } } + private void addMarker(IFile file, Marker marker, int line) throws CoreException { + IMarker fileMarker = file.createMarker(marker.getType()); + fileMarker.setAttribute(IMarker.LINE_NUMBER, line); + fileMarker.setAttribute(IMarker.MESSAGE, marker.getMessage()); + fileMarker.setAttribute(IMarker.SEVERITY, marker.getSeverity()); + fileMarker.setAttribute(IMarker.CHAR_START, marker.getOffset()); + fileMarker.setAttribute(IMarker.CHAR_END, marker.getOffset() + marker.getLength()); + } + /** * Gets the children of this project of the given type. * From f31dcf0e0511f91d6d3da64ae94e4097a150180a Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Thu, 5 Apr 2018 10:44:21 +0200 Subject: [PATCH 15/23] little bug fix for NullPointerException in StringTableXMLEditor; finished #154; --- plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF | 2 +- .../stringTableEditor/StringTableXMLEditor.java | 2 ++ plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF | 2 +- plugin/Raven.SQDev.SQFEditor/META-INF/MANIFEST.MF | 2 +- plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF | 2 +- plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF | 2 +- plugin/Raven.SQDev/feature.xml | 12 ++++++------ plugin/SQDev/site.xml | 2 +- 8 files changed, 14 insertions(+), 12 deletions(-) diff --git a/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF index c9e11b7f..b7a43d1d 100644 --- a/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Editors/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Editors Bundle-SymbolicName: raven.sqdev.editors;singleton:=true -Bundle-Version: 0.7.1.stable +Bundle-Version: 0.7.2.dev Bundle-Activator: raven.sqdev.editors.activator.Activator Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, diff --git a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.java b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.java index 85946950..9ebf8b2c 100644 --- a/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.java +++ b/plugin/Raven.SQDev.Editors/src/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.java @@ -76,6 +76,8 @@ protected IParseResult doParse(InputStream input) { ParseTree tree = parser.content(); listener.getParseResult().applyMarkersTo(this); + + listener.getParseResult().setParseTree(tree); return listener.getParseResult(); } diff --git a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF index 4118b999..9cb10324 100644 --- a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Misc Bundle-SymbolicName: raven.sqdev.misc;singleton:=true -Bundle-Version: 0.6.1.stable +Bundle-Version: 0.7.0.dev Bundle-Activator: raven.sqdev.activator.Activator Require-Bundle: org.eclipse.core.runtime, org.eclipse.swt, diff --git a/plugin/Raven.SQDev.SQFEditor/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.SQFEditor/META-INF/MANIFEST.MF index 6c441413..64fc2a82 100644 --- a/plugin/Raven.SQDev.SQFEditor/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.SQFEditor/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: SQFEditor Bundle-SymbolicName: raven.sqdev.editors.sqfeditor;singleton:=true -Bundle-Version: 0.7.4.stable +Bundle-Version: 0.7.5.dev Bundle-Activator: raven.sqdev.activator.Activator Bundle-Vendor: Raven Require-Bundle: org.eclipse.ui, diff --git a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF index f69b39fb..26f6d95c 100644 --- a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: UI Bundle-SymbolicName: raven.sqdev.ui;singleton:=true -Bundle-Version: 0.3.1.stable +Bundle-Version: 0.3.2.dev Bundle-Activator: raven.sqdev.ui.Activator Bundle-Vendor: Raven Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF index 668571fe..3aaecf5b 100644 --- a/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Util/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Util Bundle-SymbolicName: raven.sqdev.util;singleton:=true -Bundle-Version: 0.7.2.stable +Bundle-Version: 0.7.3.dev Bundle-Activator: raven.sqdev.activator.Activator Bundle-Vendor: Raven Require-Bundle: org.eclipse.core.runtime, diff --git a/plugin/Raven.SQDev/feature.xml b/plugin/Raven.SQDev/feature.xml index b994ecfd..2a6362b6 100644 --- a/plugin/Raven.SQDev/feature.xml +++ b/plugin/Raven.SQDev/feature.xml @@ -2,7 +2,7 @@ @@ -88,14 +88,14 @@ POSSIBILITY OF SUCH DAMAGE. id="raven.sqdev.editors.sqfeditor" download-size="0" install-size="0" - version="0.7.4.stable" + version="0.7.5.dev" unpack="false"/> diff --git a/plugin/SQDev/site.xml b/plugin/SQDev/site.xml index 603f6fd5..b98b0873 100644 --- a/plugin/SQDev/site.xml +++ b/plugin/SQDev/site.xml @@ -1,6 +1,6 @@ - + From 72faf5247b7a91468a223ca211ccddf99a90bcd2 Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Thu, 5 Apr 2018 14:07:43 +0200 Subject: [PATCH 16/23] re-added the possibility to display the syntax tree; internal jar-restructuring --- plugin/Raven.SQDev.Misc/.classpath | 2 + .../Abego/org.abego.treelayout.core-1.0.3.jar | Bin plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF | 4 ++ .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 97127 -> 103990 bytes plugin/Raven.SQDev.Misc/build.properties | 7 +++- .../{parseTreeIcon.png => syntaxTreeIcon.png} | Bin plugin/Raven.SQDev.UI/.classpath | 1 - plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF | 3 +- plugin/Raven.SQDev.UI/plugin.xml | 12 +++--- ...andler.java => ShowSyntaxTreeHandler.java} | 38 +++++++++--------- 10 files changed, 37 insertions(+), 30 deletions(-) rename plugin/{Raven.SQDev.UI => Raven.SQDev.Misc}/Abego/org.abego.treelayout.core-1.0.3.jar (100%) rename plugin/Raven.SQDev.Misc/resources/icons/{parseTreeIcon.png => syntaxTreeIcon.png} (100%) rename plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/{ShowParseTreeHandler.java => ShowSyntaxTreeHandler.java} (54%) diff --git a/plugin/Raven.SQDev.Misc/.classpath b/plugin/Raven.SQDev.Misc/.classpath index 839278da..f26a260c 100644 --- a/plugin/Raven.SQDev.Misc/.classpath +++ b/plugin/Raven.SQDev.Misc/.classpath @@ -5,5 +5,7 @@ + + diff --git a/plugin/Raven.SQDev.UI/Abego/org.abego.treelayout.core-1.0.3.jar b/plugin/Raven.SQDev.Misc/Abego/org.abego.treelayout.core-1.0.3.jar similarity index 100% rename from plugin/Raven.SQDev.UI/Abego/org.abego.treelayout.core-1.0.3.jar rename to plugin/Raven.SQDev.Misc/Abego/org.abego.treelayout.core-1.0.3.jar diff --git a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF index 9cb10324..69305c2b 100644 --- a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF @@ -15,6 +15,8 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: dataStructures, lexer;uses:="dataStructures", + org.abego.treelayout, + org.abego.treelayout.util, org.antlr.v4.runtime; uses:="new org.antlr.v4.runtime, org.antlr.v4.runtime.dfa, @@ -99,4 +101,6 @@ Import-Package: raven.sqdev.misc Bundle-Vendor: Raven Bundle-ClassPath: ANTLR/antlr-runtime-4.7.jar, SQFParser/SQFParser.jar, + Abego/AbegoSWT.jar, + Abego/org.abego.treelayout.core-1.0.3.jar, . diff --git a/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar b/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar index 59cbd378ceb32e4ddcd715316aea52915cb7f715..2c85ca1b61d56494e1316e060fe37bdd8592e85f 100644 GIT binary patch delta 34372 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 TJ3sKx5Ae0dT>juG3-SK|?Rc|V delta 27375 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 diff --git a/plugin/Raven.SQDev.Misc/build.properties b/plugin/Raven.SQDev.Misc/build.properties index 3476c74f..cde26ab6 100644 --- a/plugin/Raven.SQDev.Misc/build.properties +++ b/plugin/Raven.SQDev.Misc/build.properties @@ -5,9 +5,12 @@ bin.includes = META-INF/,\ plugin.xml,\ resources/,\ ANTLR/,\ - SQFParser/SQFParser.jar + SQFParser/SQFParser.jar,\ + Abego/AbegoSWT.jar,\ + Abego/org.abego.treelayout.core-1.0.3.jar src.includes = resources/,\ ANTLR/,\ - SQFParser/ + SQFParser/,\ + Abego/ diff --git a/plugin/Raven.SQDev.Misc/resources/icons/parseTreeIcon.png b/plugin/Raven.SQDev.Misc/resources/icons/syntaxTreeIcon.png similarity index 100% rename from plugin/Raven.SQDev.Misc/resources/icons/parseTreeIcon.png rename to plugin/Raven.SQDev.Misc/resources/icons/syntaxTreeIcon.png diff --git a/plugin/Raven.SQDev.UI/.classpath b/plugin/Raven.SQDev.UI/.classpath index 55dd2e79..eca7bdba 100644 --- a/plugin/Raven.SQDev.UI/.classpath +++ b/plugin/Raven.SQDev.UI/.classpath @@ -3,6 +3,5 @@ - diff --git a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF index 26f6d95c..ae751485 100644 --- a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF @@ -7,8 +7,7 @@ Bundle-Activator: raven.sqdev.ui.Activator Bundle-Vendor: Raven Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy -Bundle-ClassPath: ., - Abego/org.abego.treelayout.core-1.0.3.jar +Bundle-ClassPath: . Import-Package: org.antlr.v4.runtime, org.antlr.v4.runtime.misc, org.antlr.v4.runtime.tree, diff --git a/plugin/Raven.SQDev.UI/plugin.xml b/plugin/Raven.SQDev.UI/plugin.xml index c6464980..192256d1 100644 --- a/plugin/Raven.SQDev.UI/plugin.xml +++ b/plugin/Raven.SQDev.UI/plugin.xml @@ -9,8 +9,8 @@ @@ -28,10 +28,10 @@ point="org.eclipse.ui.commands"> + defaultHandler="raven.sqdev.ui.commands.ShowSyntaxTreeHandler" + description="Displays the syntax tree graphically" + id="raven.sqdev.command.showSyntaxTree" + name="Show syntax tree"> ruleNames = activeEditor.getParseRuleNames(); - - if (tree != null && ruleNames != null) { - // TODO: use new TreeDisplayer - // TreeViewer viewer = new TreeViewer(ruleNames, tree); - // viewer.open(); - } + + IParseResult parseResult = activeEditor.getParseResult(); + + Shell shell = new Shell(PlatformUI.getWorkbench().getDisplay()); + shell.setLayout(new FillLayout()); + shell.setText("Syntax Tree"); + + new TreeUI(shell, SWT.NONE, parseResult.getTree(), parseResult.getTokenBuffer()); + + shell.open(); } return null; } - + } From 1670d7b695be027c713458432dc113e232544b40 Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Thu, 5 Apr 2018 14:11:01 +0200 Subject: [PATCH 17/23] added missing jar --- plugin/Raven.SQDev.Misc/Abego/AbegoSWT.jar | Bin 0 -> 13762 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 plugin/Raven.SQDev.Misc/Abego/AbegoSWT.jar diff --git a/plugin/Raven.SQDev.Misc/Abego/AbegoSWT.jar b/plugin/Raven.SQDev.Misc/Abego/AbegoSWT.jar new file mode 100644 index 0000000000000000000000000000000000000000..750a6d1dfe38670fe8ebbb9f9c689d1e5b87db81 GIT binary patch literal 13762 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 literal 0 HcmV?d00001 From c4d4aad3666c8639bc35a9c7589c8b3326df5fbe Mon Sep 17 00:00:00 2001 From: Krzmbrzl Date: Thu, 5 Apr 2018 17:22:55 +0200 Subject: [PATCH 18/23] updated core-libraries --- plugin/Raven.SQDev.Misc/Abego/AbegoSWT.jar | Bin 13762 -> 15443 bytes .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 103990 -> 104123 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/plugin/Raven.SQDev.Misc/Abego/AbegoSWT.jar b/plugin/Raven.SQDev.Misc/Abego/AbegoSWT.jar index 750a6d1dfe38670fe8ebbb9f9c689d1e5b87db81..075b0f61c348e50ebb3c50d5b588af0f20f883e2 100644 GIT binary patch delta 6434 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 Hyj%SbYW~vo delta 4725 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 j03d8GZq9a=<{rV Date: Thu, 5 Apr 2018 19:07:44 +0200 Subject: [PATCH 19/23] implemented #156 --- .../tests/EncounteredFalsePositives.sqf | 22 +- .../processing/tests/SQFProcessingTest.java | 2 - .../src/raven/sqdev/util/EFileType.java | 45 +-- .../src/raven/sqdev/util/EProjectType.java | 2 +- .../src/raven/sqdev/util/ProjectUtil.java | 310 ++++++++---------- .../importWizard/SQDevImportWizard.java | 7 +- .../importWizard/SQDevImportWizardPage.java | 130 ++++---- 7 files changed, 271 insertions(+), 247 deletions(-) diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf index 39963047..6a929648 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf @@ -4,4 +4,24 @@ CHECK_FALSE(isNil "_type", Invalid eventType!, {}) -DEBUG_EXEC(EVENT_LOG(fired - %1, str _type)) \ No newline at end of file +DEBUG_EXEC(EVENT_LOG(fired - %1, str _type)) + +ASL_Is_Supported_Cargo = { + params ["_vehicle","_cargo"]; + private ["_canSling"]; + _canSling = false; + if(not isNull _vehicle && not isNull _cargo) then { + { + if(_vehicle isKindOf (_x select 0)) then { + if(_cargo isKindOf (_x select 2)) then { + if( (toUpper (_x select 1)) == "CAN_SLING" ) then { + _canSling = true; + } else { + _canSling = false; + }; + }; + }; + } forEach (missionNamespace getVariable ["ASL_SLING_RULES_OVERRIDE",ASL_SLING_RULES]); + }; + _canSling; +}; \ No newline at end of file diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java index c4cf93dd..49e951cf 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java @@ -918,8 +918,6 @@ public void snippets() throws IOException { new FileInputStream(new File( makeOSCompatible(System.getProperty("user.dir") + "/src/raven/sqdev/sqf/processing/tests/EncounteredFalsePositives.sqf"))), supplier, info); - assertTrue(result.getDeclaredGlobalVariables().size() == 0); - assertTrue(result.getDeclaredLocalVariables().size() == 0); assertTrue(result.getMarkers().size() == 0); macros.clear(); diff --git a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/EFileType.java b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/EFileType.java index 4d21b262..12854017 100644 --- a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/EFileType.java +++ b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/EFileType.java @@ -1,6 +1,8 @@ package raven.sqdev.util; import java.io.ByteArrayInputStream; +import java.io.File; +import java.nio.file.Files; import java.util.Random; import java.util.concurrent.atomic.AtomicReference; @@ -167,7 +169,6 @@ public String getExtension() { @Override public String getInitialContent() { - // TODO Auto-generated method stub return ""; } }, @@ -183,7 +184,6 @@ public String getExtension() { @Override public String getInitialContent() { - // TODO Auto-generated method stub return ""; } }, @@ -287,7 +287,7 @@ public void create(String name) { * For {@linkplain #SQDEV} it has to be of type * {@link ESQDevFileType} * @param open - * Indicates whether the file should be dirctly opened in the + * Indicates whether the file should be directly opened in the * respective editor * @see ESQDevFileType */ @@ -306,7 +306,8 @@ public IStatus run(IProgressMonitor monitor) { // get the container where the file should be created IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - IResource resource = root.findMember(getPath()); + IPath path = getPath(); + IResource resource = root.findMember(path); if (resource instanceof IContainer) { IContainer container = (IContainer) resource; @@ -337,8 +338,7 @@ public IStatus run(IProgressMonitor monitor) { } } } else { - // report that the file does already exist (in UI - // thread) + // report that the file does already exist (in UI thread) SQDevInfobox info = new SQDevInfobox("Can't create file \"" + getFileName() + "\" because it already exists!", SWT.ICON_ERROR); @@ -349,6 +349,25 @@ public IStatus run(IProgressMonitor monitor) { // store the file setFile(file); } else { + if(resource == null && path.isAbsolute()) { + // The file is going to be created outside of eclipse's workspace + IPath filePath = path.append(getFileName()); + File file = filePath.toFile(); + if (!file.exists()) { + // create the file with the respective initial content + Files.copy(getInitialContentStream(), file.toPath()); + + // create an IFile that links to the actual file + setFile(root.getFileForLocation(filePath)); + } else { + // report that the file does already exist (in UI thread) + SQDevInfobox info = new SQDevInfobox("Can't create file \"" + + getFileName() + "\" because it already exists!", + SWT.ICON_ERROR); + + info.open(); + } + } else { try { throw new FailedAtCreatingFileException( "Specified resource is not a container!"); @@ -360,6 +379,7 @@ public IStatus run(IProgressMonitor monitor) { info.open(); } + } } if (open) { @@ -533,19 +553,6 @@ public void run() { .makeRelativeTo(root.getRawLocation().makeAbsolute()); } - // check that the container referenced by this path exists - if (root.findMember(detectedPath) == null) { - try { - throw new FailedAtCreatingFileException( - "Couldn't find specified container in the workspace!"); - } catch (FailedAtCreatingFileException e) { - e.printStackTrace(); - - // can't procede -> kill process - throw new RuntimeException(e); - } - } - // pass value to the respective AtomicReference result.set(detectedPath); } diff --git a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/EProjectType.java b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/EProjectType.java index 4474f6a2..152074b7 100644 --- a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/EProjectType.java +++ b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/EProjectType.java @@ -63,7 +63,7 @@ public IProject create(IWorkspaceRoot root) BackingStoreException { String projectName = info.getName(); - IProject project = ProjectUtil.createSQDevProject(root, projectName); + IProject project = ProjectUtil.createSQDevProject(root, projectName, null); switch (this) { case MOD: diff --git a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/ProjectUtil.java b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/ProjectUtil.java index 946f930d..61dbcd4d 100644 --- a/plugin/Raven.SQDev.Util/src/raven/sqdev/util/ProjectUtil.java +++ b/plugin/Raven.SQDev.Util/src/raven/sqdev/util/ProjectUtil.java @@ -41,26 +41,26 @@ import raven.sqdev.sqdevFile.SQDevFile; public class ProjectUtil { - + /** * Indicating that the export was successfull */ public static final String SUCCESS = "success"; - + /** * Indicating that the export was canceled */ public static final String CANCELED = "canceled"; - + /** * Indicating that the export has failed */ public static final String FAILED = "failed"; - + /** * Exports the given project to the given location. Hidden files and folders - * (prefixed by a dot) will be ignored automatically during export (not - * during cleaning) + * (prefixed by a dot) will be ignored automatically during export (not during + * cleaning) * * @param project * The project that should get exported @@ -69,50 +69,48 @@ public class ProjectUtil { * @param filesToIgnore * A list of files that should not get exported * @param filesToPreserve - * A list of files that should not get deleted when performing - * the clean of the destination + * A list of files that should not get deleted when performing the + * clean of the destination * @return The status of this export operation. Possible values are: *

    tCDeAy%zMF-Z&KV3R5#3qFbdQI$P!XrVe zGX8QiqMMK^a4{~?@FvDNh@`COFkEet*5# )+Xb^^o2xhOKz7>6C%jqSAL}DiIU9 z#G>dHMY=Jd!@{M^5ylYB>Qy+dwqt3VHydT%lI@{bj=|*`)yivoo3MYqel*M}#D3Vi)HC&h1 zI28IgD4bF3#0PZTfE!sZt>lWl63+b9C7;}^;}!{KG)Mzc+=dToxIL%u@FK0_L-KJ& zD$$zQVmi(26(kyW>bMIZ=G__^rmbg$Dd3wLB9t!)lhqfAJ|EHXQBk?lN?s7I)Z*)1 zIzBFI+JKQH_vDIzBDjnn5#HntjG_Jk^#d zqvI$4M%zu2J2xFs#4PYF z$tK^f+YAF*SyGMK6&CR^5OY3v032E^^d(`XV za`Gi>{9^n;it@4E>YDJohFVD9mq~%{6NIw0uZCtJ?=y?Kr+BZJrALaM<4#Xw&zYH2 zp>R?TrgRqtoY~YUZTR2C8UIkI@l%J(>Y&)V@1JQ@*L7oXf{0w-1)`bxuJg;pl#H?d zJlgKIsjJxzvm4l{}M= zo$P!T=X}&;=as1Bn2e*`)9^UVrl#v@M})sxUD3QT9KV~xBAO@Wi1-wg;#9nrqiXLn zybdRD#tr^)CvvP4+LO%UNREkRk2y(>i5#G-G(c^t8^g(U^B+K6-2~=u9K*r~P*2&Z z$KHzaJy`UZS~7vfl%KH|XZm04MPpXBG%H({l`YT8nzN%-b!nWvX2D~aIf3&wR<(^` zZ9{QQaT*&scTb>W2&#Y0^J*{ddJWgT1un8YI7QcX$*PN zF(d`8D2)+UFglL6D2(GOg@%${Fl$Q2akaue?2ym)VP`{WO=%j}--4PwI8%le9)p)qAi!Un(bjOySl;H$8|??8Uuw;e8UjVmEfzxiMO&Jbxv={dacQ_LAMySEFcmQc~a2xqDh6icGesa(oJ;#^GI3A+xd1^X=&vGTp zKNmx2|2du%N7*4BS)@TJjoktc%8T!|7tnf$-YE6Ol<<`8z#$S{3xpbWP^_`##q2}8 zmIc0_5yGZEe6G_Dxlqm2Aj02@2k~(0ys9sy@#XtCjf5`MR&E##U8)M-A;nZ?KfXqw zi1fK0pxVh<5fPpyb;j{^;n@=kt-BE0gT{G2(ViT~cZ6^|Nv&~wKY~uKxCG(0rTN>I zy`pW)^S3p>qHXsE+uB?uSIy5;@<19t_LSs`r)0q0)l7@vYjG;sH=U2ch5S98ufA2d znvC5JlfO3KZ`-f~SKwN5a|d4~*ON&%kT*B7f4e~%E7!d-&vCwcr{Zz^1V5!)_o5Cz z<0#^?M>3nY_Veu8FDMfp9fh)km`*YrSHnLCQ6odH@qdZD@Zb*4B;E~m_oFT_o$;AN zNqxS{o=M|ZxdA#5*j~*n31*^7+)38mMN;00GjVr_Dh<9Zm6+$-lHtE6`8Bl?y~`0f zh$<>On}XlaS(&W=TbHB@DV3C6Oil&tEOlkO+~d5IUhE&I@ViMEr_s5BQ6Y(#Bpbu; z^P%nuL1jp;@W)9|A$6ALW9$xL1nN8+!uV6ZN%!VsqzhvFIfU_?i&5{pr9@(x4>Az~ zDarcfFW8jz?O$DxkYDE0FO6gPTRzmj5LDooe;y8MSpld=3qn1AIH=|VQ2Pr){c94` vVn6V@R9oSA0j$SESbEl3|NgJAo+^M9!3(5bglYXh{FS!nNoM&MOUqvZZPm4+ literal 5663 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 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFValidator.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFValidator.class deleted file mode 100644 index 550ccd10bc838169a841924e0f7e06c4cd5d1311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20687 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 delta 117 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 aZ3Lm8(}2k_3>WZM_$7Rc2J&99j_5C-Ixipq delta 4952 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 DrS5vQ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/SQDevPluginManager.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/pluginManagement/SQDevPluginManager.class index 993317ec497d5f88dd5807d3a3dbc06b567b71d0..d6a8a30b76afabee77fcbade4685599e98e04079 100644 GIT binary patch literal 4174 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 YpU1~6>bn)tY8hG$p#>HR9>MMZ15VoxX#fBK diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/activator/Activator.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/activator/Activator.java index 829538b9..e597faaa 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/activator/Activator.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/activator/Activator.java @@ -3,7 +3,7 @@ import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; -import raven.sqdev.pluginManager.SQDevPluginManager; +import raven.sqdev.pluginManagement.SQDevPluginManager; public class Activator extends AbstractUIPlugin { diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java index bcc70ea8..732812e6 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/constants/ProblemMessages.java @@ -290,7 +290,7 @@ public static final String unclosedOpener(char opener) { } /** - * The error message stating thath there is an invalid closing character + * The error message stating that there is an invalid closing character * * @param opener * The invalid closing character @@ -306,4 +306,37 @@ public static final String invalidClosingCharacter(char closer) { return "Invalid closing character " + openMark + closer + closeMark; } + + /** + * The error message stating that an invalid expression in the given context has + * been found + * + * @param context + * The context in which the invalid expression occurred + */ + public static final String invalidExpression(String context) { + return "Invalid expression in context of \"" + context + "\""; + } + + /** + * The error message stating that "private" is the only permitted modifier for + * an assignment + */ + public static final String privateIsOnlyValidModifierForAssignments() { + return "\"private\" is the only permitted modifier for assignments"; + } + + /** + * Error message stating that private variables have to be local + */ + public static final String privateVariablesMustBeLocal() { + return "Private variables have to be local (starting with \"_\")"; + } + + /** + * The error message for interal erros + */ + public static final String internalError() { + return "!!! Internal error !!!"; + } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/exceptions/ValidationException.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/exceptions/ValidationException.java new file mode 100644 index 00000000..a62bcb10 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/exceptions/ValidationException.java @@ -0,0 +1,26 @@ +package raven.sqdev.exceptions; + +public class ValidationException extends SQDevException { + + private static final long serialVersionUID = 3118718175023220832L; + + public ValidationException() { + } + + public ValidationException(String message) { + super(message); + } + + public ValidationException(Throwable cause) { + super(cause); + } + + public ValidationException(String message, Throwable cause) { + super(message, cause); + } + + public ValidationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + +} diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/base/KeywordList.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/base/KeywordList.java index deafd40d..4069aa0e 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/base/KeywordList.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/base/KeywordList.java @@ -2,10 +2,11 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; - -import org.eclipse.core.runtime.Assert; +import java.util.Map; +import java.util.Map.Entry; import raven.sqdev.exceptions.BadSyntaxException; import raven.sqdev.interfaces.ISaveable; @@ -17,10 +18,10 @@ * */ public class KeywordList implements ISaveable { - + /** - * The sequence indicating the start of the keywordList in the saveable - * String format of this class + * The sequence indicating the start of the keywordList in the saveable String + * format of this class */ public static final String LIST_START_SAVESEQUENCE = ""; /** @@ -29,54 +30,47 @@ public class KeywordList implements ISaveable { */ public static final String LIST_END_SAVESEQUENCE = ""; /** - * The sequence seperating the single keywords in the saveable String format - * of this class + * The sequence seperating the single keywords in the saveable String format of + * this class */ public static final String LIST_SEPERATOR_SAVESEQUENCE = ""; - + /** - * The list of keywords where every starting letter has it's own list. - * Therefore get('b'-('a'+1)) will get the list for the - * starting letter b + * The list of keywords where every starting letter has it's own list. Therefore + * get('b'-('a'+1)) will get the list for the starting letter b */ - private List> keywords; + private Map keywords; /** * A list of keywords this list has failed to recreate */ private List failures; - - + + /** * Creates an instance of this KeywordList */ public KeywordList() { - keywords = new ArrayList>(27); - - // initialize a list for every letter - for (int i = ('a' - 1); i <= 'z'; i++) { - keywords.add(new ArrayList()); - } - + keywords = new HashMap(); + failures = new ArrayList(); } - + /** * Recreates an instance of this KeywordList from the given - * saveFormat. If saveFormat is not considered a valid saveFormat the list - * will be initialized as if no parameter was given + * saveFormat. If saveFormat is not considered a valid saveFormat the list will + * be initialized as if no parameter was given * * @param saveFormat - * The saveFormat which should be used to initialize this list - * from + * The saveFormat which should be used to initialize this list from */ public KeywordList(String saveFormat) { this(); - + if (isSaveFormat(saveFormat)) { recreateFrom(saveFormat); } } - + /** * Creates a KeywordList out of the given list of keywords * @@ -86,50 +80,33 @@ public KeywordList(String saveFormat) { */ public KeywordList(List keywords) { this(); - + addKeywords(keywords); } /** - * Adds a keyword to this list + * Creates a KeywordList out of the given list of keywords * - * @param keyword - * The keyword to add + * @param keywords + * The list of variables that should be transformed into a + * KeywordList */ - public void addKeyword(Keyword keyword) { - addKeyword(keyword, true); + public KeywordList(Map keywords) { + this(); + + this.keywords = keywords; } - + /** * Adds a keyword to this list * * @param keyword * The keyword to add - * @param sort - * Whether to sort the respective list after addition */ - private void addKeyword(Keyword keyword, boolean sort) { - Assert.isNotNull(keyword); - - int listIndex; - - if (Character.isLetter(keyword.getKeyword().charAt(0))) { - listIndex = Character.toLowerCase(keyword.getKeyword().charAt(0)) - - ('a' - 1); - } else { - listIndex = 0; - } - - if (!keywords.get(listIndex).contains(keyword)) { - keywords.get(listIndex).add(keyword); - } - - if (sort) { - // sort the list the keywords has been added to - Collections.sort(keywords.get(listIndex)); - } + public void addKeyword(Keyword keyword) { + keywords.put(keyword.getKeyword().toLowerCase(), keyword); } - + /** * Adds all given keywords to this list * @@ -139,15 +116,10 @@ private void addKeyword(Keyword keyword, boolean sort) { public void addKeywords(Collection keywords) { // add all keywords for (Keyword currentKeyword : keywords) { - addKeyword(currentKeyword, false); - } - - // sort list - for (List current : this.keywords) { - Collections.sort(current); + this.keywords.put(currentKeyword.getKeyword().toLowerCase(), currentKeyword); } } - + /** * removes a keyword from this list * @@ -155,17 +127,9 @@ public void addKeywords(Collection keywords) { * The keyword to remove */ public void removeKeyword(Keyword keyword) { - Assert.isNotNull(keyword); - - if (this.contains(keyword)) { - // only add a keyword once - return; - } - - keywords.get(Character.toLowerCase(keyword.getKeyword().charAt(0)) - - ('a' - 1)).remove(keyword); + keywords.remove(keyword.getKeyword().toLowerCase()); } - + /** * Checks if the given Keyword is contained in this list * @@ -173,84 +137,31 @@ public void removeKeyword(Keyword keyword) { * The keyword to search for */ public boolean contains(Keyword keyword) { - return keywords - .get(Character.toLowerCase(keyword.getKeyword().charAt(0)) - - ('a' - 1)) - .contains(keyword); + return keywords.get(keyword.getKeyword().toLowerCase()) != null; } - + /** * Gets all of the keywords stored in this list as one single list * * @return The list of keywords contained in this List in alphabetical order */ - public ArrayList getKeywords() { - ArrayList allKeywords = new ArrayList(); - - for (List currentList : keywords) { - allKeywords.addAll(currentList); - } - - return allKeywords; - } - - /** - * Gets the keywordList where each starting letter is stored in it's own - * subList.
    - * 'a' is index 1 - */ - public List> getKeywordsSorted() { + public Map getKeywords() { return keywords; } - - /** - * Gets the keyword with the respective String representation - * - * @param keyword - * The String representation of the desired keyword - * @param caseSensitive - * Whether the keyword should be searched case-sensitive - * @return The desired Keyword or null if none - * could be found - */ - public Keyword getKeyword(String keyword, boolean caseSensitive) { - List list = keywords - .get(Character.toLowerCase(keyword.charAt(0)) - ('a' - 1)); - - if (caseSensitive) { - // search case sensitive - for (Keyword currentKeyword : list) { - if (currentKeyword.getKeyword().equals(keyword)) { - return currentKeyword; - } - } - } else { - // search case-insensitive - keyword = keyword.toLowerCase(); - - for (Keyword currentKeyword : list) { - if (currentKeyword.getKeyword().toLowerCase().equals(keyword)) { - return currentKeyword; - } - } - } - - return null; - } - + /** - * Gets the keyword with the respective String representation. The search - * will be done case sensitive. + * Gets the keyword with the respective String representation. The search will + * be done case insensitive. * * @param keyword * The String representation of the desired keyword - * @return The desired Keyword or null if none - * could be found + * @return The desired Keyword or null if none could + * be found */ public Keyword getKeyword(String keyword) { - return getKeyword(keyword, true); + return keywords.get(keyword.toLowerCase()); } - + /** * Checks whether this list contains a keyword with the given String * representation @@ -261,51 +172,51 @@ public Keyword getKeyword(String keyword) { public boolean contains(String keyword) { return getKeyword(keyword) != null; } - + @Override public String getSaveableFormat() { String saveableFormat = LIST_START_SAVESEQUENCE + "\n\n"; - - for (Keyword currentKeyword : getKeywords()) { - saveableFormat += "\n\t" - + currentKeyword.getSaveableFormat().replace("\n", "\n\t"); - + + Iterator> it = keywords.entrySet().iterator(); + + while (it.hasNext()) { + Keyword currentKeyword = it.next().getValue(); + + saveableFormat += "\n\t" + currentKeyword.getSaveableFormat().replace("\n", "\n\t"); + saveableFormat += "\n\n" + LIST_SEPERATOR_SAVESEQUENCE + "\n"; } - + if (getKeywords().size() > 0) { // remove last seperator - saveableFormat = saveableFormat.substring(0, saveableFormat.length() - - (LIST_SEPERATOR_SAVESEQUENCE.length() + 1)); + saveableFormat = saveableFormat.substring(0, + saveableFormat.length() - (LIST_SEPERATOR_SAVESEQUENCE.length() + 1)); } - + saveableFormat += "\n\n" + LIST_END_SAVESEQUENCE; - + return saveableFormat.replace("\n", "\r\n"); } - + @Override public boolean recreateFrom(String savedFormat) { savedFormat = savedFormat.replace("\r\n", "\n"); - - String listContent = savedFormat.substring( - savedFormat.indexOf(LIST_START_SAVESEQUENCE) - + LIST_START_SAVESEQUENCE.length(), - savedFormat.indexOf(LIST_END_SAVESEQUENCE)).trim(); - - for (String currentKeywordContent : listContent - .split(LIST_SEPERATOR_SAVESEQUENCE)) { + + String listContent = savedFormat + .substring(savedFormat.indexOf(LIST_START_SAVESEQUENCE) + LIST_START_SAVESEQUENCE.length(), + savedFormat.indexOf(LIST_END_SAVESEQUENCE)) + .trim(); + + for (String currentKeywordContent : listContent.split(LIST_SEPERATOR_SAVESEQUENCE)) { currentKeywordContent = currentKeywordContent.trim(); - + Keyword currentKeyword; - - if (currentKeywordContent - .contains(SQFCommand.SYNTAX_START_SAVESEQUENCE)) { + + if (currentKeywordContent.contains(SQFCommand.SYNTAX_START_SAVESEQUENCE)) { // if the info corresponds to a SQF command currentKeyword = new SQFCommand(); } else { - if (currentKeywordContent - .contains(SQFElement.WIKI_START_SAVESEQUENCE)) { + if (currentKeywordContent.contains(SQFElement.WIKI_START_SAVESEQUENCE)) { // if the info corresponds to a SQFElement currentKeyword = new SQFElement(); } else { @@ -313,7 +224,7 @@ public boolean recreateFrom(String savedFormat) { currentKeyword = new Keyword(); } } - + try { if (!currentKeyword.recreateFrom(currentKeywordContent)) { return false; @@ -324,68 +235,35 @@ public boolean recreateFrom(String savedFormat) { failures.add(e); } } - + return true; } - + @Override public boolean isSaveFormat(String format) { - if (!format.contains(LIST_START_SAVESEQUENCE) - || !format.contains(LIST_END_SAVESEQUENCE)) { + if (!format.contains(LIST_START_SAVESEQUENCE) || !format.contains(LIST_END_SAVESEQUENCE)) { return false; } - + int startPos = format.indexOf(LIST_START_SAVESEQUENCE); int endPos = format.indexOf(LIST_END_SAVESEQUENCE); - + if (endPos < startPos) { return false; } - + return true; } - - /** - * Gets the KeywordList for the given starting character - * - * @param c - * The starting character the returned list should correspond to - * @return The respective list - */ - public List getListFor(char c) { - c = Character.toLowerCase(c); - - if (Character.isLetter(c)) { - return keywords.get(c - ('a' - 1)); - } else { - return keywords.get(0); - } - } - + /** * Gets the list of exceptions thrown during recreation */ public List getFailures() { return failures; } - - /** - * Sorts the content of this keyword list alphabetically - */ - public void sort() { - for (List currentList : keywords) { - Collections.sort(currentList); - } - } - + @Override public String toString() { - StringBuilder builder = new StringBuilder(); - - for (List list : keywords) { - builder.append(list.toString() + "\n"); - } - - return builder.toString(); + return keywords.keySet().toString(); } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/base/SQFCommand.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/base/SQFCommand.java index 77d69580..0f22be39 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/base/SQFCommand.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/infoCollection/base/SQFCommand.java @@ -755,7 +755,7 @@ public String getSaveableFormat() { format = format.substring(0, format.length() - RETURN_VALUE_SYNTAX_SEPERATOR.length()); } - format += RETURNVALUE_END_SAVESEQUENCE; + format += "\n" + RETURNVALUE_END_SAVESEQUENCE; return format; } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IMacroSupport.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IMacroSupport.java index 7a58f0fc..39507e3c 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IMacroSupport.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IMacroSupport.java @@ -1,6 +1,6 @@ package raven.sqdev.interfaces; -import java.util.List; +import java.util.Map; import raven.sqdev.misc.Macro; @@ -21,10 +21,10 @@ public interface IMacroSupport { * Whether to allow update of the editor * @return Whether the macros have been updated */ - public boolean setMacros(List macros, boolean update); + public boolean setMacros(Map macros, boolean update); /** - * Gets the collection of macros defined in this editor + * Gets the set of macros defined in this editor */ - public List getMacros(); + public Map getMacros(); } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseInformation.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseInformation.java index bc2950f6..9ede6d7a 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseInformation.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseInformation.java @@ -1,6 +1,7 @@ package raven.sqdev.interfaces; import java.util.List; +import java.util.Map; import raven.sqdev.infoCollection.base.SQFCommand; import raven.sqdev.infoCollection.base.Variable; @@ -18,7 +19,7 @@ public interface ISQFParseInformation { /** * Gets the binary SQF operators */ - public List getBinaryOperators(); + public Map getBinaryOperators(); /** * Gets the binary SQF operators keywords as string @@ -28,7 +29,7 @@ public interface ISQFParseInformation { /** * Gets the unary SQF operators */ - public List getUnaryOperators(); + public Map getUnaryOperators(); /** * Gets the unary SQF operators keywords as string @@ -38,7 +39,7 @@ public interface ISQFParseInformation { /** * Gets the nular SQF operators */ - public List getNularOperators(); + public Map getNularOperators(); /** * Gets the nular SQF operators keywords as string @@ -48,7 +49,7 @@ public interface ISQFParseInformation { /** * Gets the configured magic variables */ - public List getMagicVariables(); + public Map getMagicVariables(); /** * Gets the configured magic variable-keywords as string @@ -58,7 +59,7 @@ public interface ISQFParseInformation { /** * Gets the configured macros */ - public List getMacros(); + public Map getMacros(); /** * Gets the configured macro-keywords as string diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/misc/SQDevPreferenceUtil.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/misc/SQDevPreferenceUtil.java index 89f540fa..8eae8878 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/misc/SQDevPreferenceUtil.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/misc/SQDevPreferenceUtil.java @@ -16,7 +16,7 @@ import raven.sqdev.constants.SQDevPreferenceConstants; import raven.sqdev.exceptions.SQDevCoreException; -import raven.sqdev.pluginManager.SQDevPluginManager; +import raven.sqdev.pluginManagement.SQDevPluginManager; /** * This class provides functions for dealing with SQDev preferences diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java index a8a5a05d..c6eacc5d 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/ParseUtil.java @@ -2,7 +2,9 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.BufferedTokenStream; @@ -29,7 +31,7 @@ import raven.sqdev.parser.sqf.SQFParseInformation; import raven.sqdev.parser.sqf.SQFParseResult; import raven.sqdev.parser.sqf.SQFParser; -import raven.sqdev.parser.sqf.SQFValidator; +import raven.sqdev.parser.sqf.SQFValidatorOLD; /** * A class containing utility methods for parsing processes @@ -71,7 +73,7 @@ public static final SQFParseResult parseSQF(String input, ISQFParseInformation p // parse with SLL(*) parser.getInterpreter().setPredictionMode(PredictionMode.SLL); - + // TODO: debug option parser.setProfile(true); @@ -128,7 +130,7 @@ public static final SQFParseResult parseSQF(String input, ISQFParseInformation p result.setParseTree(tree); result.setTokenStream(tokenStream); result.mergeWith(listener.getParseResult()); - + // TODO: debug info ParseInfo info = parser.getParseInfo(); DecisionInfo[] infos = info.getDecisionInfo(); @@ -156,7 +158,7 @@ public static final SQFParseResult validateSQF(ParseTree tree, BufferedTokenStre ParseTreeWalker walker = new ParseTreeWalker(); - SQFValidator validator = new SQFValidator(info, tokenStream); + SQFValidatorOLD validator = new SQFValidatorOLD(info, tokenStream); walker.walk(validator, tree); @@ -182,21 +184,23 @@ public static final SQFParseResult parseAndValidateSQF(String input, ISQFParseIn /** * Gets the default magic variables that are present in SQF code */ - public static final List getDefaultMagicVars() { - List magicVars = new ArrayList(); - magicVars.add(new Variable("_this", + public static final Map getDefaultMagicVars() { + Map magicVars = new HashMap(); + magicVars.put("_this", new Variable("_this", "This variable is available inside of functions and contains the parameters given to it.")); - magicVars.add(new Variable("_fnc_scriptName", - "A String containing the function's name. Only awaylable when the function has " - + "been compiled via CfgFunctions.")); - magicVars.add(new Variable("_fnc_scriptNameParent", - "A String containing the function's parent's name. Only awaylable when the function has " - + "been compiled via CfgFunctions.")); - magicVars.add(new Variable("_x", + magicVars.put("_fnc_scriptname", + new Variable("_fnc_scriptName", + "A String containing the function's name. Only awaylable when the function has " + + "been compiled via CfgFunctions.")); + magicVars.put("_fnc_scriptnameparent", + new Variable("_fnc_scriptNameParent", + "A String containing the function's parent's name. Only awaylable when the function has " + + "been compiled via CfgFunctions.")); + magicVars.put("_x", new Variable("_x", "References the current object oin the iteration. Available inside count or forEach loops")); - magicVars.add(new Variable("_forEachIndex", + magicVars.put("_foreachindex", new Variable("_forEachIndex", "References the index of the current object in the iteration. Only available in a " + "forEach loop.")); - magicVars.add(new Variable("_thisEventHandler", + magicVars.put("_thiseventhandler", new Variable("_thisEventHandler", "References the current event handler. Only available inside an EventHandler")); return magicVars; diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseListener.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseListener.java index 10133eff..62a53c66 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseListener.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseListener.java @@ -3,7 +3,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.util.List; +import java.util.Map; import java.util.Stack; import org.antlr.v4.runtime.ANTLRErrorListener; @@ -329,7 +329,7 @@ protected void reportError(int offset, int length, String msg) { /** * Gets the list of macros that have been defined during preprocessing */ - public List getDefinedMacros() { + public Map getDefinedMacros() { return result.getMacros(); } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseResult.java index 675d2ef7..b7643a2c 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseResult.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/preprocessor/PreprocessorParseResult.java @@ -1,7 +1,7 @@ package raven.sqdev.parser.preprocessor; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import raven.sqdev.misc.Macro; import raven.sqdev.parser.misc.ParseResult; @@ -11,13 +11,13 @@ public class PreprocessorParseResult extends ParseResult { /** * The list of defined macros */ - private List macros; + private Map macros; /** * Creates a new instance of this class */ public PreprocessorParseResult() { - macros = new ArrayList(); + macros = new HashMap(); } @@ -30,7 +30,7 @@ public PreprocessorParseResult() { public void mergeWith(PreprocessorParseResult other) { super.mergeWith(other); - macros.addAll(other.getMacros()); + macros.putAll(other.getMacros()); } /** @@ -40,13 +40,13 @@ public void mergeWith(PreprocessorParseResult other) { * The Macro to add */ public void addMacro(Macro macro) { - macros.add(macro); + macros.put(macro.getKeyword(), macro); } /** * Gets all defined macros */ - public List getMacros() { + public Map getMacros() { return macros; } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseInformation.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseInformation.java index a5943182..d0dd9049 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseInformation.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseInformation.java @@ -1,7 +1,11 @@ package raven.sqdev.parser.sqf; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import raven.sqdev.infoCollection.base.Keyword; import raven.sqdev.infoCollection.base.KeywordList; @@ -25,22 +29,22 @@ public class SQFParseInformation implements ISQFParseInformation { */ private static KeywordList keywords; - private static List binaryOperator; + private static Map binaryOperator; private static List binaryKeywords; - private static List unaryOperator; + private static Map unaryOperator; private static List unaryKeywords; - private static List nularOperator; + private static Map nularOperator; private static List nularKeywords; - private static List magicVars; + private static Map magicVars; private static List magicVarNames; - private List macros; + private Map macros; private List macroNames; /** * Creates a new instance of this class */ - public SQFParseInformation(List macros) { + public SQFParseInformation(Map macros) { this(false, macros); } @@ -53,29 +57,28 @@ public SQFParseInformation(List macros) { * used. If the keywords are refreshed every existing instance will * use the refreshed list * @param macros - * A list of defined macros the SQF parser should be aware of + * A map of defined macros the SQF parser should be aware of */ - public SQFParseInformation(boolean refresh, List macros) { + public SQFParseInformation(boolean refresh, Map macros) { this.macros = macros; macroNames = new ArrayList(); loadMacronames(); if (refresh || keywords == null) { - binaryOperator = new ArrayList(); + binaryOperator = new HashMap(); binaryKeywords = new ArrayList(); - unaryOperator = new ArrayList(); + unaryOperator = new HashMap(); unaryKeywords = new ArrayList(); - nularOperator = new ArrayList(); + nularOperator = new HashMap(); nularKeywords = new ArrayList(); magicVarNames = new ArrayList(); String savedKeywords = getKeywordContent(); if (savedKeywords == null) { - SQDevInfobox info = new SQDevInfobox( - "Failed at instantiating SQF parseInformation properly!\n\nReason:" - + "\nProblems with reading respective resource"); + SQDevInfobox info = new SQDevInfobox("Failed at instantiating SQF parseInformation properly!\n\nReason:" + + "\nProblems with reading respective resource"); info.open(); return; @@ -84,23 +87,22 @@ public SQFParseInformation(boolean refresh, List macros) { keywords = new KeywordList(savedKeywords); if (keywords.getFailures().size() > 0) { - SQDevInfobox info = new SQDevInfobox( - "Failed to load " + keywords.getFailures().size() + " commands", + SQDevInfobox info = new SQDevInfobox("Failed to load " + keywords.getFailures().size() + " commands", keywords.getFailures()); info.open(false); } - for (Keyword currentKeyword : keywords.getKeywords()) { + for (Keyword currentKeyword : keywords.getKeywords().values()) { SQFCommand command = (SQFCommand) currentKeyword; if (command.isBinaryOperator()) { - binaryOperator.add(command); + binaryOperator.put(command.getKeyword().toLowerCase(), command); } else { if (command.isUnaryOperator()) { - unaryOperator.add(command); + unaryOperator.put(command.getKeyword().toLowerCase(), command); } else { - nularOperator.add(command); + nularOperator.put(command.getKeyword().toLowerCase(), command); } } } @@ -124,17 +126,28 @@ protected String getKeywordContent() { * {@link #loadMacronames()}) */ private void loadNames() { - for (Keyword current : binaryOperator) { - binaryKeywords.add(current.getKeyword()); + Iterator> it = binaryOperator.entrySet().iterator(); + + while (it.hasNext()) { + binaryKeywords.add(it.next().getValue().getKeyword()); } - for (Keyword current : unaryOperator) { - unaryKeywords.add(current.getKeyword()); + + it = unaryOperator.entrySet().iterator(); + + while (it.hasNext()) { + unaryKeywords.add(it.next().getValue().getKeyword()); } - for (Keyword current : nularOperator) { - nularKeywords.add(current.getKeyword()); + + it = nularOperator.entrySet().iterator(); + + while (it.hasNext()) { + nularKeywords.add(it.next().getValue().getKeyword()); } - for (Keyword current : magicVars) { - magicVarNames.add(current.getKeyword()); + + Iterator> varIt = magicVars.entrySet().iterator(); + + while (varIt.hasNext()) { + magicVarNames.add(varIt.next().getValue().getKeyword()); } } @@ -142,34 +155,36 @@ private void loadNames() { * Initializes the macro-namelist */ private void loadMacronames() { - for (Macro currentMacro : macros) { - macroNames.add(currentMacro.getKeyword()); + Iterator> it = macros.entrySet().iterator(); + + while (it.hasNext()) { + macroNames.add(it.next().getValue().getKeyword()); } } @Override - public List getBinaryOperators() { - return new ArrayList(binaryOperator); + public Map getBinaryOperators() { + return binaryOperator; } @Override - public List getUnaryOperators() { - return new ArrayList(unaryOperator); + public Map getUnaryOperators() { + return new HashMap(unaryOperator); } @Override - public List getNularOperators() { - return new ArrayList(nularOperator); + public Map getNularOperators() { + return nularOperator; } @Override - public List getMagicVariables() { - return new ArrayList(magicVars); + public Map getMagicVariables() { + return magicVars; } @Override - public List getMacros() { - return new ArrayList(macros); + public Map getMacros() { + return macros; } @Override diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseResult.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseResult.java index e9279003..705e66f6 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseResult.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFParseResult.java @@ -1,7 +1,9 @@ package raven.sqdev.parser.sqf; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.antlr.v4.runtime.BufferedTokenStream; import org.eclipse.jface.text.Position; @@ -20,12 +22,12 @@ public class SQFParseResult extends ParseResult { /** * A list of local variables declared during the parsing */ - private List declaredLocalVariables; + private Map declaredLocalVariables; /** * A list of global variables declared during the parsing */ - private List declaredGlobalVariables; + private Map declaredGlobalVariables; /** * A list of folding areas */ @@ -42,8 +44,8 @@ public class SQFParseResult extends ParseResult { public SQFParseResult() { foldingAreas = new ArrayList(); - declaredLocalVariables = new ArrayList(); - declaredGlobalVariables = new ArrayList(); + declaredLocalVariables = new HashMap(); + declaredGlobalVariables = new HashMap(); } /** @@ -54,7 +56,7 @@ public SQFParseResult() { * @param globalVariables * The list of found global variables */ - public void setVariables(List localVariables, List globalVariables) { + public void setVariables(Map localVariables, Map globalVariables) { declaredLocalVariables = localVariables; declaredGlobalVariables = globalVariables; @@ -73,14 +75,14 @@ public void addFoldingArea(Position position) { /** * Gets a list of found local variable declarations */ - public List getDeclaredLocalVariables() { + public Map getDeclaredLocalVariables() { return declaredLocalVariables; } /** * Gets a list of found global variable declarations */ - public List getDeclaredGlobalVariables() { + public Map getDeclaredGlobalVariables() { return declaredGlobalVariables; } @@ -154,8 +156,8 @@ public void mergeWith(SQFParseResult other) { super.mergeWith(other); foldingAreas.addAll(other.getFoldingAreas()); - declaredLocalVariables.addAll(other.getDeclaredLocalVariables()); - declaredGlobalVariables.addAll(other.getDeclaredGlobalVariables()); + declaredLocalVariables.putAll(other.getDeclaredLocalVariables()); + declaredGlobalVariables.putAll(other.getDeclaredGlobalVariables()); if (parserRuleNames == null) { parserRuleNames = other.getParserRulenames(); diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidator.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java similarity index 90% rename from plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidator.java rename to plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java index 73dfcdc6..b0a2e6e9 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidator.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java @@ -52,7 +52,7 @@ * @author Raven * */ -public class SQFValidator extends SQFBaseListener { +public class SQFValidatorOLD extends SQFBaseListener { /** * The invoking state indicating that this context object has been created by @@ -72,11 +72,11 @@ public class SQFValidator extends SQFBaseListener { /** * A list of found localVariables */ - private List localVariables; + private Map localVariables; /** * A list of found global variables */ - private List globalVariables; + private Map globalVariables; /** * The respective CommonTokenStream associated with the parse tree * this listener corresponds to @@ -100,7 +100,7 @@ public class SQFValidator extends SQFBaseListener { * The CommonTokenStream associated with the respective * parse tree */ - public SQFValidator(ISQFParseInformation info, BufferedTokenStream currentStream) { + public SQFValidatorOLD(ISQFParseInformation info, BufferedTokenStream currentStream) { this(info, null, currentStream); } @@ -116,7 +116,7 @@ public SQFValidator(ISQFParseInformation info, BufferedTokenStream currentStream * The CommonTokenStream associated with the respective * parse tree */ - public SQFValidator(ISQFParseInformation info, SQFParseResult parseResult, BufferedTokenStream currentStream) { + public SQFValidatorOLD(ISQFParseInformation info, SQFParseResult parseResult, BufferedTokenStream currentStream) { Assert.isNotNull(info); Assert.isNotNull(currentStream); @@ -129,8 +129,8 @@ public SQFValidator(ISQFParseInformation info, SQFParseResult parseResult, Buffe this.parseResult = new SQFParseResult(); } - localVariables = new ArrayList(); - globalVariables = new ArrayList(); + localVariables = new HashMap(); + globalVariables = new HashMap(); resolvedReturnValues = new HashMap(); } @@ -160,13 +160,9 @@ public void exitAssignment(AssignmentContext ctx) { Variable variable = new Variable(variableName); if (variable.isLocal()) { - if (!localVariables.contains(variable)) { - localVariables.add(variable); - } + localVariables.put(variableName.toLowerCase(), variable); } else { - if (!globalVariables.contains(variable)) { - globalVariables.add(variable); - } + globalVariables.put(variableName.toLowerCase(), variable); } } @@ -340,7 +336,7 @@ public void exitBinaryExpression(BinaryExpressionContext ctx) { String operatorName = ctx.getChild(1).getText(); - SQFCommand operator = resolveOperator(info.getBinaryOperators(), operatorName); + SQFCommand operator = info.getBinaryOperators().get(operatorName.toLowerCase()); if (operator != null) { DataTypeList leftTypes = getReturnValues(ctx.getChild(0)); @@ -435,7 +431,7 @@ public void exitUnaryExpression(UnaryExpressionContext ctx) { } } else { // check if operator is a macro - Macro macro = resolveMacro(info.getMacros(), operatorName); + Macro macro = info.getMacros().get(operatorName); if (macro != null) { resolvedReturnValues.put(ctx, new DataTypeList(EDataType.ANYTHING)); @@ -451,7 +447,7 @@ public void exitNularOperator(NularOperatorContext ctx) { String operatorName = ctx.getText(); - SQFCommand operator = resolveOperator(info.getNularOperators(), operatorName); + SQFCommand operator = info.getNularOperators().get(operatorName.toLowerCase()); if (operator == null) { if (!isDefinedMacro(operatorName) && !isDefinedLocalVariable(operatorName)) { @@ -461,7 +457,7 @@ public void exitNularOperator(NularOperatorContext ctx) { msg = ProblemMessages.undefinedLocalVariable(operatorName); } else { // must be a globl variable - globalVariables.add(new Variable(operatorName)); + globalVariables.put(operatorName.toLowerCase(), new Variable(operatorName)); } } else { msg = ProblemMessages.operatorIsNotNular(operatorName); @@ -482,29 +478,6 @@ public void exitNularOperator(NularOperatorContext ctx) { } } - /** - * Retrieves the SQFCommand out of the list that has the given - * name. The search is case-insensitive! - * - * @param commandList - * The list of commands to search through - * @param commandName - * The command name to search for - * @return The respective SQFCommand or null if none - * could be found - */ - protected SQFCommand resolveOperator(List commandList, String commandName) { - commandName = commandName.toLowerCase(); - - for (SQFCommand currentCommand : commandList) { - if (currentCommand.getKeyword().toLowerCase().equals(commandName)) { - return currentCommand; - } - } - - return null; - } - /** * Retrieves the SQFCommand out of the list that has the given * name. The search is case-insensitive! @@ -515,29 +488,20 @@ protected SQFCommand resolveOperator(List commandList, String comman * could be found */ protected SQFCommand resolveOperator(String operatorName) { - List allOperators = info.getNularOperators(); - allOperators.addAll(info.getUnaryOperators()); - allOperators.addAll(info.getBinaryOperators()); + operatorName = operatorName.toLowerCase(); - return resolveOperator(allOperators, operatorName); - } + SQFCommand command = info.getBinaryOperators().get(operatorName); + if (command != null) { + return command; + } + command = info.getUnaryOperators().get(operatorName); + if (command != null) { + return command; + } - /** - * Finds the Macro in the given list that has the given name. The - * search is case-sensitive! - * - * @param macroList - * The list of macros to search through - * @param macroName - * The name of the Macro to find - * @return The found Macro or null if none could be - * found - */ - protected Macro resolveMacro(List macroList, String macroName) { - for (Macro currentMacro : macroList) { - if (currentMacro.getKeyword().equals(macroName)) { - return currentMacro; - } + command = info.getNularOperators().get(operatorName); + if (command != null) { + return command; } return null; @@ -550,7 +514,7 @@ protected Macro resolveMacro(List macroList, String macroName) { * The macro name to search for */ protected boolean isDefinedMacro(String macroName) { - return resolveMacro(info.getMacros(), macroName) != null; + return info.getMacros().get(macroName) != null; } /** @@ -560,9 +524,7 @@ protected boolean isDefinedMacro(String macroName) { * The name to search for */ protected boolean isOperator(String operatorName) { - return resolveOperator(info.getNularOperators(), operatorName) != null - || resolveOperator(info.getUnaryOperators(), operatorName) != null - || resolveOperator(info.getBinaryOperators(), operatorName) != null; + return resolveOperator(operatorName) != null; } /** @@ -575,12 +537,10 @@ protected boolean isOperator(String operatorName) { protected boolean isDefinedLocalVariable(String varName) { varName = varName.toLowerCase(); - for (Variable currentVariable : info.getMagicVariables()) { - if (currentVariable.getKeyword().toLowerCase().equals(varName)) { - return true; - } + if (info.getMagicVariables().get(varName) != null) { + return true; } - for (Variable currentVariable : localVariables) { + for (Variable currentVariable : localVariables.values()) { if (currentVariable.getKeyword().toLowerCase().equals(varName)) { return true; } @@ -675,7 +635,7 @@ private DataTypeList doGetReturnValues(ParseTree element) { // is global variable boolean found = false; - for (Variable currentVariable : globalVariables) { + for (Variable currentVariable : globalVariables.values()) { if (currentVariable.getKeyword().toLowerCase().equals(varName)) { found = true; break; @@ -685,7 +645,7 @@ private DataTypeList doGetReturnValues(ParseTree element) { if (!found) { // assume it's declared somewhere else // TODO: potential error - globalVariables.add(new Variable(varName)); + globalVariables.put(varName.toLowerCase(), new Variable(varName)); } } } @@ -923,13 +883,15 @@ protected void extractVariableDeclaration(String operatorName, ParseTree argumen parseResult.addMarker(IMarker.PROBLEM, offsets[0], offsets[1], ProblemMessages.canOnlyDeclareLocalVariable(), IMarker.SEVERITY_ERROR); } else { - localVariables.add(new Variable(varName)); + localVariables.put(varName.toLowerCase(), new Variable(varName)); } } } } - - localVariables.addAll(declaredVariables); + + for(Variable currentVar : declaredVariables) { + localVariables.put(currentVar.getKeyword().toLowerCase(), currentVar); + } } /** diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java index 8c9e3b76..a4d1c247 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java @@ -6,7 +6,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.eclipse.core.resources.IMarker; import org.junit.Test; @@ -47,7 +49,7 @@ public void variableDeclarations() { "_ifVar" }; List definedLocalVariables = Arrays.asList(localVariables); - List foundLocalVariables = getKeywords(result.getDeclaredLocalVariables()); + List foundLocalVariables = getKeywords(result.getDeclaredLocalVariables().values()); if (!collectionContentEqual(definedLocalVariables, foundLocalVariables)) { StringBuilder msg = new StringBuilder("The found declarations don't match with the expected ones"); @@ -71,7 +73,7 @@ public void variableDeclarations() { // Check global variable declarations final String[] globalVariables = new String[] { "GlobalTestVar", "Implicit1", "Implicit2", "Implicit3" }; List definedGlobalVariables = Arrays.asList(globalVariables); - List foundGlobalVariables = getKeywords(result.getDeclaredGlobalVariables()); + List foundGlobalVariables = getKeywords(result.getDeclaredGlobalVariables().values()); if (!collectionContentEqual(definedGlobalVariables, foundGlobalVariables)) { StringBuilder msg = new StringBuilder("The found declarations don't match with the expected ones"); @@ -136,8 +138,8 @@ public void error_typeMismatch() { // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); - - + + input = "'hello' + objNull"; result = process(input); expectedMarker = createErrorMarker(10, 7, @@ -145,7 +147,7 @@ public void error_typeMismatch() { // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); - + input = "velocity ''"; result = process(input); expectedMarker = createErrorMarker(9, 2, @@ -154,43 +156,40 @@ public void error_typeMismatch() { assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); } - + @Test public void error_missingSemicolon() { String input; SQFParseResult result; Marker expectedMarker; - List macros = new ArrayList(); - macros.add(new Macro("CHECK_TRUE")); - - + Map macros = new HashMap(); + macros.put("CHECK_TRUE",new Macro("CHECK_TRUE")); + + input = "diag_log 3 hint 'hello'"; result = process(input); - expectedMarker = createErrorMarker(9, 1, - ProblemMessages.missingSemicolon("3")); + expectedMarker = createErrorMarker(9, 1, ProblemMessages.missingSemicolon("3")); // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); - - + + input = "CHECK_TRUE(nsdvjJSDNV, SAKFN) diag_log 3 hint 'hello'"; result = process(input, macros); - expectedMarker = createErrorMarker(39, 1, - ProblemMessages.missingSemicolon("3")); + expectedMarker = createErrorMarker(39, 1, ProblemMessages.missingSemicolon("3")); // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); - - + + input = "CHECK_TRUE(nsdvjJSDNV, SAKFN) player setPos [1,2,3] hint 'hello'"; result = process(input, macros); - expectedMarker = createErrorMarker(50, 1, - ProblemMessages.missingSemicolon("]")); + expectedMarker = createErrorMarker(50, 1, ProblemMessages.missingSemicolon("]")); // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); } - + @Test public void error_unbalancedCharacterPair() { String input; @@ -204,47 +203,47 @@ public void error_unbalancedCharacterPair() { // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); - - + + input = "hint '3;"; result = process(input); expectedMarker = createErrorMarker(5, 1, ProblemMessages.unclosedOpener('\'')); // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); - - + + input = "hint \"3;"; result = process(input); expectedMarker = createErrorMarker(5, 1, ProblemMessages.unclosedOpener('"')); // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); - + input = "hint [3;"; result = process(input); expectedMarker = createErrorMarker(5, 1, ProblemMessages.unclosedOpener('[')); // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); - - + + input = "hint {3;"; result = process(input); expectedMarker = createErrorMarker(5, 1, ProblemMessages.unclosedOpener('{')); // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); - - + + input = "hint '');"; result = process(input); expectedMarker = createErrorMarker(7, 1, ProblemMessages.invalidClosingCharacter(')')); // Do the checking assertMarkerAmountEquals(result, 1); assertMarkersEqual(expectedMarker, result.getMarkers().get(0)); - - + + input = "hint ''];"; result = process(input); expectedMarker = createErrorMarker(7, 1, ProblemMessages.invalidClosingCharacter(']')); @@ -336,7 +335,7 @@ protected static Marker createWarningMarker(int offset, int length, String msg) * The list of macros that should be existent in the given input * @return The resulting {@link SQFParseResult} */ - protected static SQFParseResult process(String input, List macros) { + protected static SQFParseResult process(String input, Map macros) { return ParseUtil.parseAndValidateSQF(input, getSQFParseInformation(macros)); } @@ -349,7 +348,7 @@ protected static SQFParseResult process(String input, List macros) { * @return The resulting {@link SQFParseResult} */ protected static SQFParseResult process(String input) { - return process(input, new ArrayList()); + return process(input, new HashMap()); } /** @@ -386,7 +385,7 @@ protected static String getContent(File file) { * @param macros * The macro-list that should be used */ - protected static ISQFParseInformation getSQFParseInformation(List macros) { + protected static ISQFParseInformation getSQFParseInformation(Map macros) { return new SQFParseInformation(macros) { @Override protected String getKeywordContent() { diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/pluginManagement/SQDevPluginManager.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/pluginManagement/SQDevPluginManager.java index 2bf4c43c..0b764689 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/pluginManagement/SQDevPluginManager.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/pluginManagement/SQDevPluginManager.java @@ -1,6 +1,7 @@ package raven.sqdev.pluginManagement; import java.util.ArrayList; +import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.Platform; @@ -10,6 +11,7 @@ import raven.sqdev.exceptions.SQDevCoreException; import raven.sqdev.exceptions.SQDevException; +import raven.sqdev.interfaces.IPluginListener; /** * An manager for all running SQDev plugins @@ -24,6 +26,11 @@ public class SQDevPluginManager { */ protected static SQDevPluginManager manager; + /** + * All plugin listeners + */ + private List pluginListeners; + /** * The list of all registered plugins */ @@ -35,6 +42,7 @@ public class SQDevPluginManager { */ private SQDevPluginManager() { pluginList = new ArrayList(); + pluginListeners = new ArrayList(0); } /** @@ -109,11 +117,11 @@ public AbstractUIPlugin get(String pluginName) { if (pluginList.size() > prevCount) { // if the count of registered plugins changed try to - // fins it again + // find it again return get(pluginName); } else { throw new SQDevException("The started plugin \"" + pluginName - + "\" has not registered to the SQDevPluginManage!"); + + "\" has not registered to the SQDevPluginManager!"); } } catch (BundleException | SQDevException e) { e.printStackTrace(); @@ -137,6 +145,11 @@ public void register(AbstractUIPlugin plugin) { if (!pluginList.contains(plugin)) { pluginList.add(plugin); } + + // notify listeners + for (IPluginListener current : pluginListeners) { + current.started(ESQDevPlugin.resolve(plugin.getBundle().getSymbolicName())); + } } /** @@ -147,5 +160,32 @@ public void register(AbstractUIPlugin plugin) { */ public void unregister(AbstractUIPlugin plugin) { pluginList.remove(plugin); + + // notify listeners + for (IPluginListener current : pluginListeners) { + current.stopped(ESQDevPlugin.resolve(plugin.getBundle().getSymbolicName())); + } + } + + /** + * Adds a plugin listener if it has not been added before + * + * @param listener + * The listener to add + */ + public void addPluginListener(IPluginListener listener) { + if (!pluginListeners.contains(listener)) { + pluginListeners.add(listener); + } + } + + /** + * Removes the given plugin listener + * + * @param listener + * The listener to remove + */ + public void removePluginListener(IPluginListener listener) { + pluginListeners.remove(listener); } } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/pluginManager/SQDevPluginManager.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/pluginManager/SQDevPluginManager.java deleted file mode 100644 index d877f5b2..00000000 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/pluginManager/SQDevPluginManager.java +++ /dev/null @@ -1,192 +0,0 @@ -package raven.sqdev.pluginManager; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.Platform; -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleException; - -import raven.sqdev.exceptions.SQDevCoreException; -import raven.sqdev.exceptions.SQDevException; -import raven.sqdev.interfaces.IPluginListener; -import raven.sqdev.pluginManagement.ESQDevPlugin; - -/** - * An manager for all running SQDev plugins - * - * @author Raven - * - */ -public class SQDevPluginManager { - - /** - * The manager instance - */ - protected static SQDevPluginManager manager; - - /** - * All plugin listeners - */ - private List pluginListeners; - - /** - * The list of all registered plugins - */ - protected ArrayList pluginList; - - /** - * Creates an SQDevPluginManager instance. It's not meant to be - * done manually - */ - private SQDevPluginManager() { - pluginList = new ArrayList(); - pluginListeners = new ArrayList(0); - } - - /** - * Gets the PluginManager holding all the references to running SQDevPlugins - * - * @return The SQDevPLuginManager - */ - public static SQDevPluginManager getManager() { - if (manager == null) { - manager = new SQDevPluginManager(); - } - - return manager; - } - - /** - * Checks if the given plugin is currently registered in this manager - * - * @param plugin - * The plugin to lok for - * @return - */ - public boolean contains(AbstractUIPlugin plugin) { - return pluginList.contains(plugin); - } - - /** - * Checks if the given plugin is currently registered in this manager - * - * @param pluginName - * The name (ID) of the plugin to searchs - * @return - */ - public boolean contains(String pluginName) { - for (AbstractUIPlugin currentPlugin : pluginList) { - if (currentPlugin.getBundle().getSymbolicName().toLowerCase() - .equals(pluginName.toLowerCase())) { - return true; - } - } - - return false; - } - - /** - * Gets the plugin with the given name (ID). If no plugin is registered and - * the name starts with "raven.sqdev" it will try to find and strat this - * plugin - * - * @param pluginName - * The name (ID) of the plugin to searchs - * @return The desired plugin or null if none is found - */ - public AbstractUIPlugin get(String pluginName) { - // search by name - for (AbstractUIPlugin currentPlugin : pluginList) { - if (currentPlugin.getBundle().getSymbolicName().toLowerCase() - .equals(pluginName.toLowerCase())) { - return currentPlugin; - } - } - - if (pluginName.toLowerCase().startsWith("raven.sqdev")) { - Bundle bundle = Platform.getBundle(pluginName); - - if (bundle != null) { - try { - int prevCount = pluginList.size(); - - // try to start the bundle - bundle.start(); - - if (pluginList.size() > prevCount) { - // if the count of registered plugins changed try to - // find it again - return get(pluginName); - } else { - throw new SQDevException("The started plugin \"" + pluginName - + "\" has not registered to the SQDevPluginManager!"); - } - } catch (BundleException | SQDevException e) { - e.printStackTrace(); - - throw new SQDevCoreException(e); - } - } - } - - return null; - } - - /** - * Registers the given plugin if it's not already registered - * - * @param plugin - */ - public void register(AbstractUIPlugin plugin) { - Assert.isNotNull(plugin); - - if (!pluginList.contains(plugin)) { - pluginList.add(plugin); - } - - // notify listeners - for (IPluginListener current : pluginListeners) { - current.started(ESQDevPlugin.resolve(plugin.getBundle().getSymbolicName())); - } - } - - /** - * Unregisters the given plugin from this manager - * - * @param plugin - * The plugin to unregister - */ - public void unregister(AbstractUIPlugin plugin) { - pluginList.remove(plugin); - - // notify listeners - for (IPluginListener current : pluginListeners) { - current.stopped(ESQDevPlugin.resolve(plugin.getBundle().getSymbolicName())); - } - } - - /** - * Adds a plugin listener if it has not been added before - * - * @param listener - * The listener to add - */ - public void addPluginListener(IPluginListener listener) { - if (!pluginListeners.contains(listener)) { - pluginListeners.add(listener); - } - } - - /** - * Removes the given plugin listener - * - * @param listener - * The listener to remove - */ - public void removePluginListener(IPluginListener listener) { - pluginListeners.remove(listener); - } -} diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java new file mode 100644 index 00000000..9d884595 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java @@ -0,0 +1,527 @@ +package raven.sqdev.sqf.validation; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; + +import org.eclipse.core.resources.IMarker; + +import dataStructures.ICharacterBuffer; +import dataStructures.ISQFTreeListener; +import dataStructures.IndexTreeElement; +import dataStructures.SQFToken; +import dataStructures.TokenBuffer; +import raven.sqdev.constants.ProblemMessages; +import raven.sqdev.exceptions.ValidationException; +import raven.sqdev.infoCollection.base.SQFCommand; +import raven.sqdev.infoCollection.base.Variable; +import raven.sqdev.interfaces.ISQFParseInformation; +import raven.sqdev.misc.DataTypeList; +import raven.sqdev.misc.EDataType; +import raven.sqdev.parser.sqf.SQFParseResult; +import raven.sqdev.parser.sqf.SQFSyntaxProcessor; + +public class SQFValidator implements ISQFTreeListener { + + /** + * A {@linkplain DataTypeList} containing the datatype ANYTHING + */ + public static final DataTypeList ANYTHING = new DataTypeList(EDataType.ANYTHING); + /** + * A {@linkplain DataTypeList} containing the datatype CODE + */ + public static final DataTypeList CODE = new DataTypeList(EDataType.CODE); + /** + * A {@linkplain DataTypeList} containing the datatype ARRAY + */ + public static final DataTypeList ARRAY = new DataTypeList(EDataType.ARRAY); + /** + * A {@linkplain DataTypeList} containing the datatype STRING + */ + public static final DataTypeList STRING = new DataTypeList(EDataType.STRING); + /** + * A {@linkplain DataTypeList} containing the datatype NUMBER + */ + public static final DataTypeList NUMBER = new DataTypeList(EDataType.NUMBER); + + /** + * The character buffer for the input to be processed + */ + protected ICharacterBuffer charBuffer; + /** + * The buffer holding all tokens + */ + protected TokenBuffer tokenBuffer; + /** + * The object containing all results of parsing and validating + */ + protected SQFParseResult result; + /** + * The set of so far declared variables. All names are in lowercase + */ + protected HashSet declaredVariables; + /** + * The object holding all necessary meta-information + */ + protected ISQFParseInformation parseInformation; + /** + * A map of all resolved return values + */ + protected Map resolvedReturnValues; + + + public SQFValidator(ICharacterBuffer charBuffer, ISQFParseInformation info) { + this.charBuffer = charBuffer; + declaredVariables = new HashSet<>(); + result = new SQFParseResult(); + resolvedReturnValues = new HashMap<>(); + } + + @Override + public void nularExpression(SQFToken expression) { + final String operator = getText(expression); + + } + + @Override + public void unaryExpression(SQFToken expression, IndexTreeElement node) { + final String operator = getText(expression); + + } + + @Override + public void binaryExpression(SQFToken expression, IndexTreeElement node) { + final String operatorName = getText(expression); + + switch (operatorName) { + case "=": + // assignment + assignment(node); + break; + + default: + // "normal" binary operator + SQFCommand operator = parseInformation.getBinaryOperators().get(operatorName.toLowerCase()); + + if (operator != null) { + DataTypeList leftTypes = getReturnValues(node.getChildren().get(0)); + DataTypeList rightTypes = getReturnValues(node.getChildren().get(1)); + + // TODO: consider using static processor for all statements + SQFSyntaxProcessor processor = new SQFSyntaxProcessor(operator); + processor.setLeftArgumentTypes(leftTypes.toArray()); + processor.setRightArgumentTypes(rightTypes.toArray()); + + if (!processor.isValid()) { + int[] positionData; + + try { + switch (processor.getErrorMarkerPosition()) { + case CENTER: + positionData = new int[] { expression.start(), expression.length() }; + break; + case LEFT: + positionData = getNodeDimension(node.getChildren().get(0)); + break; + case RIGHT: + positionData = getNodeDimension(node.getChildren().get(1)); + break; + case NONE: + default: + positionData = new int[] { 0, 0 }; + error(node, ProblemMessages.internalError()); + System.err.println("Unexpected marker position for binary expression"); + // TODO: log + } + } catch (ValidationException e) { + e.printStackTrace(); + positionData = new int[] { 0, 0 }; + error(node, ProblemMessages.internalError()); + } + + error(positionData[0], positionData[1], processor.getErrorMessage()); + } + + // map the resolved processor to the respective node + resolvedReturnValues.put(node, processor.getReturnValues()); + } else { + // apparently it is not a binary operator -> shouldn't even be reachable + error(expression, ProblemMessages.operatorIsNotBinary(operatorName)); + } + + break; + } + } + + @Override + public void start() { + // TODO Auto-generated method stub + + } + + @Override + public void finished() { + // add all found variables to the result + Iterator varIterator = declaredVariables.iterator(); + + while (varIterator.hasNext()) { + Variable var = new Variable(varIterator.next()); + + if (var.isLocal()) { + result.getDeclaredLocalVariables().put(var.getKeyword().toLowerCase(), var); + } else { + result.getDeclaredGlobalVariables().put(var.getKeyword().toLowerCase(), var); + } + } + } + + /** + * This method processes any occurring assignments done by the "=" operator + * + * @param node + * The parse tree node of the assignment. The two children are + * considered to be assignment arguments (there have to be two!) + */ + protected void assignment(IndexTreeElement node) { + assert (node.getChildrenCount() == 2); + + IndexTreeElement variableNode = node.getChildren().get(0); + + boolean isPrivate = variableNode.hasChildren(); + + if (isPrivate) { + int index = variableNode.getIndex(); + + if (index < 0) { + // The assignment is corrupted + error(variableNode, ProblemMessages.invalidExpression("assignment")); + } + + String varOperator = getText(tokenBuffer.get(index)); + if (!varOperator.toLowerCase().equals("private")) { + // only private is allowed as a modifier + error(tokenBuffer.get(node.getIndex()), ProblemMessages.privateIsOnlyValidModifierForAssignments()); + } + + variableNode = variableNode.getChildren().get(0); + + if (variableNode.getIndex() < 0) { + // something's really f*cked up + error(node.getChildren().get(0), ProblemMessages.internalError()); + + return; + } + } + + String varName = getText(tokenBuffer.get(variableNode.getIndex())); + if (!varName.startsWith("_") && isPrivate) { + // trying to declare global variable as private + error(variableNode, ProblemMessages.privateVariablesMustBeLocal()); + } + declaredVariables.add(varName.toLowerCase()); + } + + /** + * Gets the text of the given token + * + * @param token + * The token whose corresponding text should be retrieved + * @return The text corresponding to the given token + */ + protected String getText(SQFToken token) { + return charBuffer.getText(token.start(), token.length()); + } + + /** + * Adds a new error marker to {@link #result} + * + * @param start + * The starting offset of the error area + * @param length + * The length of the error area + * @param message + * The problem message + */ + protected void error(int start, int length, String message) { + addProblemMarker(IMarker.SEVERITY_ERROR, start, length, message); + } + + /** + * Adds a new error marker to {@link #result} + * + * @param token + * The token corresponding to the error + * @param message + * The problem message + */ + protected void error(SQFToken token, String message) { + addProblemMarker(IMarker.SEVERITY_ERROR, token, message); + } + + /** + * Adds a new error marker to {@link #result} + * + * @param node + * The tree node corresponding to the error + * @param message + * The problem message + */ + protected void error(IndexTreeElement node, String message) { + addProblemMarker(IMarker.SEVERITY_ERROR, node, message); + } + + /** + * Adds a new warning marker to {@link #result} + * + * @param start + * The starting offset of the warning area + * @param length + * The length of the warning area + * @param message + * The problem message + */ + protected void warning(int start, int length, String message) { + addProblemMarker(IMarker.SEVERITY_WARNING, start, length, message); + } + + /** + * Adds a new warning marker to {@link #result} + * + * @param token + * The token corresponding to the warning + * @param message + * The problem message + */ + protected void warning(SQFToken token, String message) { + addProblemMarker(IMarker.SEVERITY_WARNING, token, message); + } + + /** + * Adds a new warning marker to {@link #result} + * + * @param node + * The tree node corresponding to the warning + * @param message + * The problem message + */ + protected void warning(IndexTreeElement node, String message) { + addProblemMarker(IMarker.SEVERITY_WARNING, node, message); + } + + /** + * Adds a new info marker to {@link #result} + * + * @param start + * The starting offset of the info area + * @param length + * The length of the info area + * @param message + * The problem message + */ + protected void info(int start, int length, String message) { + addProblemMarker(IMarker.SEVERITY_INFO, start, length, message); + } + + /** + * Adds a new info marker to {@link #result} + * + * @param token + * The token corresponding to the info + * @param message + * The problem message + */ + protected void info(SQFToken token, String message) { + addProblemMarker(IMarker.SEVERITY_INFO, token, message); + } + + /** + * Adds a new info marker to {@link #result} + * + * @param node + * The tree node corresponding to the info + * @param message + * The problem message + */ + protected void info(IndexTreeElement node, String message) { + addProblemMarker(IMarker.SEVERITY_INFO, node, message); + } + + /** + * Adds a new problem marker to {@link #result} + * + * @param severity + * The severity of the marker to be created. See {@linkplain IMarker} + * for the respective constants + * @param start + * The starting offset of the problem area + * @param length + * The length of the problem area + * @param message + * The problem message + */ + protected void addProblemMarker(int severity, int start, int length, String message) { + result.addMarker(IMarker.PROBLEM, start, length, message, severity); + } + + /** + * Adds a new problem marker to {@link #result} + * + * @param severity + * The severity of the marker to be created. See {@linkplain IMarker} + * for the respective constants + * @param token + * The token corresponding to the problem + * @param message + * The problem message + */ + protected void addProblemMarker(int severity, SQFToken token, String message) { + addProblemMarker(severity, token.start(), token.length(), message); + } + + /** + * Adds a new problem marker to {@link #result}. This method will consider the + * whole dimension of the given node as the problem area + * + * @param severity + * The severity of the marker to be created. See {@linkplain IMarker} + * for the respective constants + * @param node + * The tree node corresponding to the problem + * @param message + * The problem message + */ + protected void addProblemMarker(int severity, IndexTreeElement node, String message) { + // verify that the given indexTreeElement has a corresponding token + int[] dimension; + try { + dimension = getNodeDimension(node); + } catch (ValidationException e) { + e.printStackTrace(); + dimension = new int[] { 0, 0 }; + message = "Error on invalid tree node: " + message; + } + + addProblemMarker(severity, dimension[0], dimension[1], message); + } + + /** + * Gets a node's dimension which is the text area from the start of the token + * associated leftmost child-node and the end of the token associated with the + * rightmost child-node. If this node doesn't have children the token associated + * with this node is used in order to determine the node's dimension. + * + * @param node + * The node whose dimension should be obtained + * @return The dimension of the node in form of a 2D array: [start, length] + * @throws ValidationException + * If asked to determine the dimension of an invalid node + */ + protected int[] getNodeDimension(IndexTreeElement node) throws ValidationException { + if (!node.hasChildren()) { + int index = node.getIndex(); + + if (index < 0) { + throw new ValidationException("Failed at getting node dimension!"); + } + + SQFToken token = tokenBuffer.get(node.getIndex()); + + return new int[] { token.start(), token.length() }; + } + + // use the left- and rightmost child in order to determine the dimension + return new int[] { getNodeDimension(node.getChildren().get(0))[0], + getNodeDimension(node.getChildren().get(node.getChildrenCount() - 1))[1] }; + } + + /** + * Gets the possible return values of the given + * + * @param node + * @return + */ + protected DataTypeList getReturnValues(IndexTreeElement node) { + // Check whether the return value for that node has already been determined -> + // Especially used for context sensitive return values of operators + if (resolvedReturnValues.containsKey(node)) { + return resolvedReturnValues.get(node); + } + + if (node.getIndex() > 0) { + SQFToken token = tokenBuffer.get(node.getIndex()); + + switch (token.operatorType()) { + case MACRO: + return ANYTHING; + case BINARY: + SQFCommand operator = parseInformation.getBinaryOperators() + .get(charBuffer.getText(token.start(), token.length()).toLowerCase()); + if (operator == null) { + // If it is not recognized it will be handled elsewhere + return ANYTHING; + } else { + return operator.getAllReturnTypes(); + } + case NULAR: + operator = parseInformation.getNularOperators() + .get(charBuffer.getText(token.start(), token.length()).toLowerCase()); + if (operator == null) { + // If it is not recognized it will be handled elsewhere + return ANYTHING; + } else { + return operator.getAllReturnTypes(); + } + case UNARY: + operator = parseInformation.getUnaryOperators() + .get(charBuffer.getText(token.start(), token.length()).toLowerCase()); + if (operator == null) { + // If it is not recognized it will be handled elsewhere + return ANYTHING; + } else { + return operator.getAllReturnTypes(); + } + case OTHER: + // check token type + switch (token.type()) { + case CURLY_BRACKET_OPEN: + return CODE; + case ERROR_TOKEN: + return ANYTHING; + case NUMBER: + return NUMBER; + case SQUARE_BRACKET_OPEN: + return ARRAY; + case STRING: + return STRING; + case SUBSTRING: + return STRING; + default: + // Shouldn't be reached + error(token, ProblemMessages.internalError()); + return ANYTHING; + + } + default: + // Shouldn't get reached + error(node, ProblemMessages.internalError()); + return ANYTHING; + } + } else { + if (node.hasChildren()) { + return getReturnValues(node.getChildren().get(0)); + } else { + // Shouldn't get reached + error(node, ProblemMessages.internalError()); + return ANYTHING; + } + } + } + + /** + * Gets the result of this validation + */ + public SQFParseResult getResult() { + return result; + } +} diff --git a/plugin/Raven.SQDev.SQFEditor/.gitignore b/plugin/Raven.SQDev.SQFEditor/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/plugin/Raven.SQDev.SQFEditor/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/plugin/Raven.SQDev.SQFEditor/bin/.gitignore b/plugin/Raven.SQDev.SQFEditor/bin/.gitignore deleted file mode 100644 index 85996f46..00000000 --- a/plugin/Raven.SQDev.SQFEditor/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/raven/ diff --git a/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/activator/Activator.class b/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/activator/Activator.class index b21d21cf3a685fd76f2a8efd21cd563556e40b55..896032f5f2aba84cf541b5239e9533df947bf216 100644 GIT binary patch delta 38 rcmbQpHJxii4@~ diff --git a/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor$1.class b/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor$1.class index d3e483dfc303b43eb194feea2c0692dc6d286866..ce854590d04676304c93267b0dc9f66e2fd175ca 100644 GIT binary patch delta 67 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 LrDZswr~dsP&nnm< literal 13881 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 binaryCommands; + private Map binaryCommands; /** * A list of all commands that can be used as a unary operator */ - private List unaryCommands; + private Map unaryCommands; /** * A list of all commands that can be used as a nular operator */ - private List nularCommands; + private Map nularCommands; /** * A list of local variables in this editor */ - private List localVariables; + private Map localVariables; /** * A list of global variables in this editor */ - private List globalVariables; + private Map globalVariables; /** * A list of magic variables available in this editor */ - private List magicVariables; + private Map magicVariables; /** * A list of defined macros for this editor */ - protected List macros; + protected Map macros; /** * A list of the macro-names defined for this editor */ @@ -101,16 +105,14 @@ public SQF_Editor() { BasicSourceViewerConfiguration configuration = getBasicConfiguration(); // create respective keywordScanners - configuration.createKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_KEYWORDHIGHLIGHTING_COLOR_KEY, false); - configuration.createKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_LOCALVARIABLEHIGHLIGHTING_COLOR_KEY, false); - configuration.createKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_GLOBALVARIABLEHIGHLIGHTING_COLOR_KEY, false); - configuration.createKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_MAGICVARIABLEHIGHLIGHTING_COLOR_KEY, false); - configuration.createKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_MACROHIGHLIGHTING_COLOR_KEY, - true); + configuration.createKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_KEYWORDHIGHLIGHTING_COLOR_KEY, false); + configuration.createKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_LOCALVARIABLEHIGHLIGHTING_COLOR_KEY, + false); + configuration.createKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_GLOBALVARIABLEHIGHLIGHTING_COLOR_KEY, + false); + configuration.createKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_MAGICVARIABLEHIGHLIGHTING_COLOR_KEY, + false); + configuration.createKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_MACROHIGHLIGHTING_COLOR_KEY, true); // get keywordScanner KeywordScanner keywordScanner = configuration @@ -132,17 +134,17 @@ public SQF_Editor() { partitionScanner.removeRule(BasicPartitionScanner.DOUBLE_QUOTE_STRING_RULE); partitionScanner.addRule(new SQFStringPartitionRule(new Token(BasicPartitionScanner.BASIC_STRING))); - binaryCommands = new ArrayList(); - unaryCommands = new ArrayList(); - nularCommands = new ArrayList(); - localVariables = new ArrayList(); - globalVariables = new ArrayList(); - magicVariables = new ArrayList(); + binaryCommands = new HashMap(); + unaryCommands = new HashMap(); + nularCommands = new HashMap(); + localVariables = new HashMap(); + globalVariables = new HashMap(); + magicVariables = new HashMap(); // populate the magic vars with the stadard ones setMagicVariables(ParseUtil.getDefaultMagicVars(), false); - macros = new ArrayList(); + macros = new HashMap(); macroNames = new ArrayList(); categorizeCommands(); @@ -176,14 +178,11 @@ public void doSave(IProgressMonitor progressMonitor) { @Override protected IStatus run(IProgressMonitor monitor) { - monitor.beginTask("Export project \"" + containingProject.getName() + "\"", - 1); + monitor.beginTask("Export project \"" + containingProject.getName() + "\"", 1); try { - ProjectUtil.export(containingProject, - Util.getExportPathFor(containingProject), + ProjectUtil.export(containingProject, Util.getExportPathFor(containingProject), linkFile.parseAnnotation(ESQDevFileAnnotation.IGNORE).getValues(), - linkFile.parseAnnotation(ESQDevFileAnnotation.PRESERVE) - .getValues()); + linkFile.parseAnnotation(ESQDevFileAnnotation.PRESERVE).getValues()); monitor.worked(1); } catch (SQDevFileIsInvalidException e) { @@ -220,8 +219,7 @@ protected IStatus run(IProgressMonitor monitor) { protected ParseTree doParse(String input) { SQFParseResult result = ParseUtil.parseSQF(input, this); - if (!result.providesParseTree() || !result.providesParserRuleNames() - || !result.providesTokenStream()) { + if (!result.providesParseTree() || !result.providesParserRuleNames() || !result.providesTokenStream()) { throw new SQDevCoreException("Expected SQFParseResult to contain tree, names and tokenStream!"); } @@ -258,81 +256,67 @@ public boolean processParseTree(ParseTree parseTree) { * binary/unary/nular operator */ private void categorizeCommands() { - for (Keyword currentKeyword : provider.getKeywordList().getKeywords()) { + Iterator> it = provider.getKeywordList().getKeywords().entrySet().iterator(); + + while (it.hasNext()) { + Keyword currentKeyword = it.next().getValue(); + if (currentKeyword instanceof SQFCommand) { SQFCommand currentCommand = (SQFCommand) currentKeyword; if (currentCommand.isBinaryOperator()) { - binaryCommands.add(currentCommand); + binaryCommands.put(currentCommand.getKeyword().toLowerCase(), currentCommand); } if (currentCommand.isUnaryOperator()) { - unaryCommands.add(currentCommand); + unaryCommands.put(currentCommand.getKeyword().toLowerCase(), currentCommand); } if (currentCommand.isNularOperator()) { - nularCommands.add(currentCommand); + nularCommands.put(currentCommand.getKeyword().toLowerCase(), currentCommand); } } } } - /** - * Gets all SQF commands that can be used as a binary operator - */ - public List getBinaryOperators() { - return new ArrayList(binaryCommands); + @Override + public Map getBinaryOperators() { + return binaryCommands; } - /** - * Gets all SQF commands that can be used as a unary operator - */ - public List getUnaryOperators() { - return new ArrayList(unaryCommands); + @Override + public Map getUnaryOperators() { + return unaryCommands; } - /** - * Gets all SQF commands that can be used as a nular operator - */ - public List getNularOperators() { - return new ArrayList(nularCommands); + @Override + public Map getNularOperators() { + return nularCommands; } - /** - * Gets a list of all keywords that can be used as a binary operator - */ + @Override public List getBinaryKeywords() { - ArrayList list = new ArrayList(); + List list = new ArrayList(); - for (SQFCommand currentCommand : getBinaryOperators()) { - list.add(currentCommand.getKeyword()); - } + list.addAll(binaryCommands.keySet()); return list; } - /** - * Gets a list of all keywords that can be used as a unnary operator - */ + @Override public List getUnaryKeywords() { - ArrayList list = new ArrayList(); + List list = new ArrayList(); - for (SQFCommand currentCommand : getUnaryOperators()) { - list.add(currentCommand.getKeyword()); - } + list.addAll(unaryCommands.keySet()); return list; } - /** - * Gets a list of all keywords that can be used as a nular operator - */ + @Override public List getNularKeywords() { - ArrayList list = new ArrayList(); + List list = new ArrayList(); - for (SQFCommand currentCommand : getNularOperators()) { - list.add(currentCommand.getKeyword()); - } + list.addAll(nularCommands.keySet()); return list; } @@ -360,15 +344,14 @@ public void keywordListChanged(String ctx) { * * @return True when variables were updated */ - public boolean setLocalVariables(List variables, boolean update) { + public boolean setLocalVariables(Map variables, boolean update) { if (!localVariables.equals(variables)) { - localVariables = new ArrayList(variables); + localVariables = new HashMap(variables); // update respective scanner/provider getBasicConfiguration() - .getKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_LOCALVARIABLEHIGHLIGHTING_COLOR_KEY) - .getKeywordProvider().setKeywordList(new KeywordList(variables)); + .getKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_LOCALVARIABLEHIGHLIGHTING_COLOR_KEY) + .getKeywordProvider().setKeywordList(new KeywordList(new ArrayList<>(variables.values()))); if (update) { update(false); @@ -383,7 +366,7 @@ public boolean setLocalVariables(List variables, boolean update) { /** * Gets the list of local variables that are defined in this editor */ - public List getLocalVariables() { + public Map getLocalVariables() { return localVariables; } @@ -392,8 +375,8 @@ public List getLocalVariables() { * one list */ public List getLocalAndMagicVariables() { - List variables = (localVariables); - variables.addAll(magicVariables); + List variables = new ArrayList(localVariables.values()); + variables.addAll(magicVariables.values()); return variables; } @@ -409,15 +392,14 @@ public List getLocalAndMagicVariables() { * * @return True when variables were updated */ - public boolean setMagicVariables(List variables, boolean update) { + public boolean setMagicVariables(Map variables, boolean update) { if (!magicVariables.equals(variables)) { - magicVariables = new ArrayList(variables); + magicVariables = new HashMap(variables); // update respective scanner/provider getBasicConfiguration() - .getKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_MAGICVARIABLEHIGHLIGHTING_COLOR_KEY) - .getKeywordProvider().setKeywordList(new KeywordList(variables)); + .getKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_MAGICVARIABLEHIGHLIGHTING_COLOR_KEY) + .getKeywordProvider().setKeywordList(new KeywordList(new ArrayList<>(variables.values()))); if (update) { update(false); @@ -430,9 +412,9 @@ public boolean setMagicVariables(List variables, boolean update) { } /** - * Gets the list of available magic variables for this editor + * Gets the set of available magic variables for this editor */ - public List getMagicVariables() { + public Map getMagicVariables() { return magicVariables; } @@ -447,15 +429,14 @@ public List getMagicVariables() { * * @return True when variables were updated */ - public boolean setGlobalVariables(List variables, boolean update) { + public boolean setGlobalVariables(Map variables, boolean update) { if (!globalVariables.equals(variables)) { - globalVariables = new ArrayList(variables); + globalVariables = variables; // update respective scanner/provider getBasicConfiguration() - .getKeywordScanner( - SQDevPreferenceConstants.SQDEV_EDITOR_GLOBALVARIABLEHIGHLIGHTING_COLOR_KEY) - .getKeywordProvider().setKeywordList(new KeywordList(variables)); + .getKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_GLOBALVARIABLEHIGHLIGHTING_COLOR_KEY) + .getKeywordProvider().setKeywordList(new KeywordList(new ArrayList<>(variables.values()))); if (update) { update(false); @@ -468,9 +449,9 @@ public boolean setGlobalVariables(List variables, boolean update) { } /** - * Gets the list of global variables that are defined in this editor + * Gets the set of global variables that are defined in this editor */ - public List getGlobalVariables() { + public Map getGlobalVariables() { return globalVariables; } @@ -483,7 +464,7 @@ public List getGlobalVariables() { * @param globalVariables * The new set of global variables */ - public void setVariables(List localVariables, List globalVariables) { + public void setVariables(Map localVariables, Map globalVariables) { boolean localUpdate = setLocalVariables(localVariables, false); boolean globalUpdate = setGlobalVariables(globalVariables, false); @@ -493,19 +474,18 @@ public void setVariables(List localVariables, List globalVar } @Override - public boolean setMacros(List macros, boolean update) { + public boolean setMacros(Map macros, boolean update) { macroNames.clear(); - for (Macro currentMacro : macros) { + for (Macro currentMacro : macros.values()) { macroNames.add(currentMacro.getKeyword()); } if (!this.macros.equals(macros)) { - this.macros = new ArrayList(macros); + this.macros = new HashMap(macros); // update respective scanner/provider - getBasicConfiguration() - .getKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_MACROHIGHLIGHTING_COLOR_KEY) - .getKeywordProvider().setKeywordList(new KeywordList(macros)); + getBasicConfiguration().getKeywordScanner(SQDevPreferenceConstants.SQDEV_EDITOR_MACROHIGHLIGHTING_COLOR_KEY) + .getKeywordProvider().setKeywordList(new KeywordList(new ArrayList<>(macros.values()))); if (update) { update(false); @@ -518,7 +498,7 @@ public boolean setMacros(List macros, boolean update) { } @Override - public List getMacros() { + public Map getMacros() { return macros; } @@ -533,7 +513,7 @@ public List getMacroNames() { public List getMagicVariableNames() { List names = new ArrayList(); - for (Variable current : magicVariables) { + for (Variable current : magicVariables.values()) { names.add(current.getKeyword()); } diff --git a/plugin/Raven.SQDev.UI/.gitignore b/plugin/Raven.SQDev.UI/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/plugin/Raven.SQDev.UI/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF index e5e8eb47..f69b39fb 100644 --- a/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.UI/META-INF/MANIFEST.MF @@ -5,18 +5,6 @@ Bundle-SymbolicName: raven.sqdev.ui;singleton:=true Bundle-Version: 0.3.1.stable Bundle-Activator: raven.sqdev.ui.Activator Bundle-Vendor: Raven -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime, - org.eclipse.jface.text, - org.eclipse.jface.text.source, - raven.sqdev.util, - raven.sqdev.misc, - raven.sqdev.editors, - org.eclipse.ui.navigator, - org.eclipse.ui.ide, - org.eclipse.ui.editors, - org.eclipse.core.resources, - org.eclipse.ui.navigator.resources Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: ., @@ -24,11 +12,21 @@ Bundle-ClassPath: ., Import-Package: org.antlr.v4.runtime, org.antlr.v4.runtime.misc, org.antlr.v4.runtime.tree, - org.eclipse.jdt.core.search, - org.eclipse.jdt.internal.ui.dialogs, - org.eclipse.search.ui, + org.eclipse.core.runtime;version="3.5.0", + org.eclipse.jface.text, + org.eclipse.ui.texteditor, + org.osgi.framework;version="1.8.0", raven.sqdev.constants, + raven.sqdev.editors, raven.sqdev.exceptions, raven.sqdev.fileSystemListener, - raven.sqdev.interfaces + raven.sqdev.interfaces, + raven.sqdev.misc, + raven.sqdev.pluginManagement, + raven.sqdev.util Export-Package: raven.sqdev.ui +Require-Bundle: org.eclipse.ui.workbench, + org.eclipse.jface, + org.eclipse.swt, + raven.sqdev.misc, + raven.sqdev.util diff --git a/plugin/Raven.SQDev.UI/bin/.gitignore b/plugin/Raven.SQDev.UI/bin/.gitignore deleted file mode 100644 index 85996f46..00000000 --- a/plugin/Raven.SQDev.UI/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/raven/ diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/commands/ShowParseTreeHandler.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/commands/ShowParseTreeHandler.class index 7e432acac0fd163ee10abdacb3f7d03dda0afce5..a5206b9c62cbaffe2d1b04afe5b7ad385546317c 100644 GIT binary patch delta 59 zcmdnWx0P=L3mYTfWLCC*O(6ze24MyvAQWa0WsqYKV^C(0V9;ccWYA}jX0T+CVQ^!R NW$zYM+%{}{p;{xc*2=~PArhBTm979$fwJ|oLyTlNwFY;qe> diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$1.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$1.class index 6af58ae96dcbf0720cb3814c08fec94dcba91bb3..df5273ab023ec602664cc4038dfe13e2a01c8f9d 100644 GIT binary patch delta 169 zcmWN}KMMf?7=ZETjXInw8Ehs7U&CNB$Yz%E0ek?9-6t@}B+He-VmSHNMGBx-0>yMSqv@`;if($%2Q&zQWEDaCV~1Di=QMUB*~s< F$san|GwT2V delta 169 zcmWN}zY0MC7(ns!rHJcNlI>0mUc+EA$Yz%E03N_%_XGx+WVvOq87@Mih?~FZiY!Jf zO1|mWS&nPDmi;zl(EAuUsW}7~lEfj!m^2eIOv$Qw<`h^^WJyUav!cS9DjVu-X=pdu z)8asfBVERk*T66TqZ2rn`Ds9%ZllbHA<-gZs- E15?j5IRF3v diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$2.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$2.class index bbe83ef344ecf940d16707e59ec397f140bc0673..ccad4343446c3a1111bced6dd67e00ec75f40772 100644 GIT binary patch delta 35 rcmX@jahhYpN@hl}$*Y*71f?068D$t)8D$wb8KoKc80995vX}t?n6(C1 delta 35 rcmX@jahhYpN@hlh$*Y*71Z5eR8RZyQ8RZ!`8D$yx7!@XqvX}t?nQaDR diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$3.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$3.class index a236fc2e57e670b0db3cc7f92b11c2e3abae8b06..22d7dce6d38126ccb31f65c3c12a8e9e532ee2a6 100644 GIT binary patch delta 59 zcmaFQ_nvP<9vkEA$@y%(n)4X=85c5$GcIC~V_eLj%eaKWl5r`64Up{s6mw==&fvkg NiXoJ7^<-6cF8}~N51;@5 delta 59 zcmaFQ_nvP<9vkD_$@y%(nhO~C85c8%GcI9}V_eFh%eaiel5shM4Up{s6mw==$>71b Nh9Q)3?POJUF8~6`54ZpT diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$4.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$4.class index f7e6dbb7e551e59a767aea521dd09192b8aab5d0..f84cd3626eabf63150a63945844654a5e3f4c7d7 100644 GIT binary patch delta 27 jcmeC?=;qjv!pyjSaw>BO=OzXr#?1^ej9VukV)g_8bDan= delta 27 jcmeC?=;qjv!pyjFaw>BO=N1Mb#;pu8jN2z4V)g_8bNL84 diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$1.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$1.class index 8d37ee583f1aac4ebcf0d42ce8a2d7fb63c1adf9..5d43b973dfeddb6475959b09e07f8f4a929318a9 100644 GIT binary patch delta 23 ecmeC+?BLw+o0-vf@*ieT)<6b9rl84QEOr20A_mj| delta 23 ecmeC+?BLw+o0-vn@*ieT)?fxfrjW^AEOr20Tn5?z diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$2.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$2.class index a2946dcba1f02674b954c3604a855f28a1aa7c67..8b389489d06bde1fdf478f94b53e6b7d0a198eec 100644 GIT binary patch delta 23 ecmeC+?BLw+o0&0U@*ieT)))psrr60|EOr21VFvX8 delta 23 ecmeC+?BLw+o0&0c@*ieT);I=1rufNTEOr21n+E#; diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$3.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5$3.class index f660aa2aa74ff9e0d2904e96829f3904ead2714e..1431a5ee5d35571325b2c7e063e2676c7fbaf712 100644 GIT binary patch delta 23 ecmeC+?BLw+o0&0r@*ieT)^r9zri{s6EOr22pa&KJ delta 23 ecmeC+?BLw+o0&0n@*ieT)=UOLrmV?cEOr22+6No} diff --git a/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5.class b/plugin/Raven.SQDev.UI/bin/raven/sqdev/ui/views/RPTViewer$5.class index 407dd129ee9909108084fdd3d546f876675e9ed0..33360f428a1316574e0d859b3cf0c3dd9401cd33 100644 GIT binary patch delta 91 zcmZ1@v_@#dFE&P}$-mkBS$!FJnL;M}v-`6~09o-smi**H>;|mKKwcJ@C&m#bo5vu) nl+Pf{l*b^#RLCH~RK%ddRL-EoRKZ}(R5iJiBMxZV3l0|mD#aDA delta 91 zcmZ1@v_@#dFE&P($-mkBS^XJ!nZhRfv-`6~0a=Mami**H>;|lz zAkEj)qiW%>4*sY^2-c%JHXy+qjE%^|CXB)xE&dsO#J3H8*osd0J%X_vUCnSbA_7h5 zVMbyH`eP@O@D@_cH0;7y>_I;Eq7==TgZ)@+c?I4<6%L>V@1h4(_>er$^YU*IXPF>`_6Ks+Rayoh1%#U~>`QV}LY&_~h`EtwcD!!TY( zph&VXS4Lu?^`4h8Ef0o?Bus#xsNS8unn-gW4jTK|2Ovf`a!y7o_ zt5Ic8nFlA&Ay5_|Toxfp$`Nl4GLvL6l4S`}r2<1`sok^;BkXLhR3cw|D3%vnO0rUA z+!_SSt2SPP?q;OaVt}l((K`Id%#eCpV7=|V0VVP~JS+Bv`9u*R&B!&oOD zc%O`{4*$@WIf+ndwU?i=g<9>lk6S86ofqF(d)+yE*#*SOMWo1Qw$CMul)oX*ER=T4 zlFRsse2)2Y70cuXd~y@3aK)oKp7CnaTdK^vqA$FO2^dr2dt@x9k z!U;W%Hf_UspPs=*J&UV)4!89@?&t+{SbpF7|J62edQm#*XA+?8(pfJ{s9upUy(*D< zO=9%A4AL7iL~lukeku88k^W1H^^VNeyHcj#$x{8dRGBa9_foALQlk%~PJfUMc5b77 zBfd?RY$v6OPL7zz*hx+?Ku$AI+88XKva?)ah+H%OVcujHxy?|y!$+ipVG4$;nn7lm z`4}J3Xg;R>7@K+8E$ zmstHv>sK;CS1?gu;$W@jofoohr^^4QI2SKjmgV&8?in?VQUd{)~tDERWm73C`okT*xzA z#EUHFB`#(=f5FQ>F5y*6uCsz)*wD9j?LEH02lTlBu5iIz=^o~bt_Q1JBxkueu67Bm zc7wUbrLx8i=(-}=;R_1Jz*8-N5i5UDN^=`IN)Tr#p<3QFA&Jmb<(<}$F@ zWunRr$8TH~UU8#Q<8n~v#-Y)T#}1c^y>1frxjY@EU4s)RmDsVq`Y@N~9U7 zq>o}ajJUjj8YxL-rZY;pFhwWx+SS49M3dT5Ys|7bt1stw_I~z0&pywWr((ZU?3el* zN#W~ZPyruoL;xz$6`K%ajYAcNU^7xt-QbfPCY~Me!ghG02L7l;CubpcONmnjv$&V$eqVIl)5@Mkl~m1|d)q5hls#F2gWPhGVRZfJ;&_ zTSj8O%`KKu4G)Kk#7uyfWFkPa(Lr($V(lR=B*|o?S;tGhZF8eQ3NTBiIemuTN-c!S zb1*UwZDl@!qzK`%5Yg7Y)>wHS1Ed%UvIv7^u|4S}47art#Dgp;L7u$Qke`wuW7fc5 z-mvX!(bXC%>(N^(Z0kl0v?j}&c7RGd_a@}aKk$s$FC-u0Z*mYzTe1j2k2@|c8qy^LD z3Z9m0D3t4XQCi`V@3B&DVvTj3+{R}40o$xKau;>-6AsDG_(XoeDS3$VD)^5QH`ELN zQ(xRue>~6tQSBh@HBdT7X&33H!4jz<60O~&pFS>08YaUuTt;eyWM~f=t34ZTr$tJ~ zI0R^aglGbybP#%Lq7#|nc`OA!Is$Dq6&*DlT{HuaS;N$0E0#G&G8P1{uuon^sIEk~ zzJ^F^ZyU$xs)li+g1tN&;ir`d)GBn=YCNu6&|SBpr*1={ZbzCmLu)ZncOh4IW2$wA z?!{m99Te(5%+vjNQQyZ>J%Ca@gq3<2tMv#fv=LkMD0XNQYV{cEtb6nX4r((#){|(` zPjOn$;G9R#;&VNRt9l+c^#bnbMclXhUu^z2JtIcH6mR`ne6>Z|=@sdyS0zxdOQ_zE z2>n+2YO4&=o06=zB+Kg3JCdjOWV-$&bM*hRNbgIj^;P{@%JhMh>+iCGB5&HdO?p>6 zRd%z3UQ$bMIc)uiZR7;~>!ufUancMTfbu`xyeW54uj-AJ1f{l)#_&r zv_8rp?ar>+lOY;w?ayvHn4y}?PMX3nO=pCTWt5I*Pt9SJM_r88eD>A?_R&K2)dh^v zg*JY{=9e&5moZM4bAXmHURQIVzQIAdfkU-Q_v&V?*KO8aOwm0|)%Q43k6Dj1T`w?0 zFL9J!=4idfC-lD@qu+6y-sS}Tk(qj*6A5~<7{F|HVh#hD%W!K1T^z#6Oyd-0Fprtm zY#UFp`KOrAIdpR_r}8E1GEQSDXRw@4vw|~O%~{;a+1$ZrSZgc)$!B?#g>2$;Jjn(8 zj79vM3;7kF=Ow zcbawFZ7TVeiKt?ospi|JhI`E}zH93Ep4rDt)5s4@6AzeX9%?9g^0WzVgyF~V;Zd|> z6N2~&y74$7*zC;7`KZUI$l+(0%rkKFEDCrYGkF2U`~r*l6_)TDl(5Cg$}Nyqr#?4L zZaMdIljKLI-=q}*5736cq5~fyn7=xWlg5ZTey$|(aWY(q;_obVxqTl&TN4O>)4Ab_ zD_T6E@HS!aGvNp@kq9(V2sgbDVfvt#>5CW>g9HzEd{k zgm0mpVXhr(p7T_mONyL#^Crqd$18t;lsJiYUG6+<*R{^({CHXIoUv=HK|vp#n}J= diff --git a/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowParseTreeHandler.java b/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowParseTreeHandler.java index 5b4a3697..c7a35310 100644 --- a/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowParseTreeHandler.java +++ b/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/commands/ShowParseTreeHandler.java @@ -8,7 +8,6 @@ import org.eclipse.core.commands.ExecutionException; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.PlatformUI; - import raven.sqdev.editors.BasicCodeEditor; import raven.sqdev.ui.util.TreeViewer; diff --git a/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/views/RPTViewer.java b/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/views/RPTViewer.java index de22c064..1b9f9c14 100644 --- a/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/views/RPTViewer.java +++ b/plugin/Raven.SQDev.UI/src/raven/sqdev/ui/views/RPTViewer.java @@ -22,7 +22,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; - import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jface.action.Action; @@ -62,7 +61,6 @@ import org.eclipse.ui.actions.ActionFactory; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.texteditor.FindReplaceAction; - import raven.sqdev.constants.SQDevPreferenceConstants; import raven.sqdev.exceptions.SQDevException; import raven.sqdev.fileSystemListener.FileSystemChangeAdapter; diff --git a/plugin/Raven.SQDev.Util/.gitignore b/plugin/Raven.SQDev.Util/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/plugin/Raven.SQDev.Util/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/plugin/Raven.SQDev.Util/bin/.gitignore b/plugin/Raven.SQDev.Util/bin/.gitignore deleted file mode 100644 index 85996f46..00000000 --- a/plugin/Raven.SQDev.Util/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/raven/ diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/activator/Activator.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/activator/Activator.class index 3641e34883b6cbd0ce1285d1650d10469a284080..b8a95575762040f8498f40b69f32722da7e438bd 100644 GIT binary patch delta 79 zcmey){+E5j5=L45qQtV)JpJOrl+-f)f}GOy%sk)3yu|d>+|<01$@>`96^u1BeefyT J%*6DS5dg;R9t;2g delta 36 pcmey%{+)fp5=KUy$!{1X7>gz!WK?G~nEaAa8q5~nEY0+Y5dij(3}XNQ diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/SQDevProjectBuilder.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/SQDevProjectBuilder.class index e5091fdd07ffe86fc5b1c16346c43ede7d1175e7..6ee3fba24c88d180abd84acf90673fdac5e2aa51 100644 GIT binary patch delta 1150 zcmZ8fU2Icj7=E6%>p7=Ao!!=!mHthpZrwU22vs`-I~+>4c1UqJLD|`QfZ@QUJ0p@9 zhsjLPgkbU|8WMlz)hG3Bfz{Moql%LXCQ*cxB?X_{^zq>0QPWlCGcfvXG?c>YsO}XZp+5>_7lN;8zn(_>E}ozPGvRY5vL6 z%qAjm#&*h9{bjo@z6r&=8a44(I9)PK1{fs#Q)jJu(II@@hqDI*^fP3#8H3oRL=j@AiecHLCFuF}w1ge@9;R9aoy)h;)hfqEn$Vht&KDlPCG&suugcX~AFc`|`RsZ!9B{iyCXx z!+|CE7j-Tgj2dzO8qJUI{@$yC`&_nqP%z>~8)H%3WxE$DPN`9&)myAyr|(j?Bk>GVFq9EF+MKe+b39H zfdla4243Sn?1hdMr1^x54E%@+_w#@#r3UF2S5pVlPeKFusl+wpgMR087RPV$V7X@v zNtaKFJE=tZ86xp|VhO=qpUaXI(Dwz)*D=)7cbny#9Ch&~QP7u>jq5JnB5vbaK}%dm zIIg+eoHlbRD~Y4&v%9KNjC>ck!ejVAQg_0_hxkZZn!t8GCnF8}r5tnfFY#wOwQUTz zizqZr-lB%f8m`HcV z?DMWa?s%`dUddpXhbpi0IHT?Q#pwm#HQA=n=G;=rIqzzQcEJwKP<63U)(|@c6YM0q zlX5M!^-(*_x z>U3S1aJy}a1Zw)hys4bKK7#qv-p8e zazMSi&#}a(IEXN=;|&gBFHEc=#eFKW@Ea!hH22H1Z6gfHa@&E_0T=+kRJfLU+3$YM z;nO!cGTys}WQC*hc3Yz3Fp+pOQAQ-)SK$#Qpzk~8-osdL-?z-&$~-<$44rWBAwE*dr_jpdDl)KNv5Ku*@=mI)Z~|CI42Gfpl7VFd z@2HciYOJFf*8ODzZ|i~N106NE*)t#L$))!AfPxGlpr3(KRHt;*C>`}^R8fGZ^j_4y zg4Ofr)?Rj2_=3FE-WClo=cu eR2ZBXG#FeM^cY+j^ntW7gBybdgU9649Bu#=UksuE diff --git a/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/activator/Activator.class b/plugin/Raven.SQDev.Wizards/bin/raven/sqdev/wizards/activator/Activator.class index 6f1e97d84fb1e679d481c97a061eef089f2a204b..2180ddfd994920227ab26ad63a88353431759167 100644 GIT binary patch delta 134 zcmbQov4ms87Die9qQtV)JpJOrl+-f)f}GOy%sk)3yu|d>+|<01$>$i=6^u1Beefz0 zVtUQUKKUP$H6zbtD`pQ~aRycf2?kCEDFy)s>B;@fF}$h_EDY)l+zgsP5iOvIJi879 J0|OI-E&$%pB;5c2 delta 87 zcmZ3&F^^-z7Dh&$$$uCn7>g!fWK?G~nEaDb8q5}+tj%VBluZ0*Yz_Mb!WeH55ny diff --git a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/SQDevBaseNewProjectWizard.java b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/SQDevBaseNewProjectWizard.java index bb2564dd..d1157866 100644 --- a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/SQDevBaseNewProjectWizard.java +++ b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/SQDevBaseNewProjectWizard.java @@ -9,7 +9,6 @@ import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard; - import raven.sqdev.misc.SQDevInfobox; import raven.sqdev.util.EProjectType; import raven.sqdev.utilInterfaces.ISQDevInformationProvider; diff --git a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/activator/Activator.java b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/activator/Activator.java index 6f094ca6..f8101b2e 100644 --- a/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/activator/Activator.java +++ b/plugin/Raven.SQDev.Wizards/src/raven/sqdev/wizards/activator/Activator.java @@ -2,8 +2,7 @@ import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; - -import raven.sqdev.pluginManager.SQDevPluginManager; +import raven.sqdev.pluginManagement.SQDevPluginManager; public class Activator extends AbstractUIPlugin { diff --git a/plugin/RavenSQDev.Preferences/.gitignore b/plugin/RavenSQDev.Preferences/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/plugin/RavenSQDev.Preferences/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/plugin/RavenSQDev.Preferences/bin/.gitignore b/plugin/RavenSQDev.Preferences/bin/.gitignore deleted file mode 100644 index 85996f46..00000000 --- a/plugin/RavenSQDev.Preferences/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/raven/ diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/activator/Activator.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/activator/Activator.class index 396ce7a64d2fe6ca247a26605e0c59b079b022c7..f0bb61e10e667e620469c9395e7be59349fd39f6 100644 GIT binary patch delta 41 pcmeC+?Bm?9fss*v@wA7(~}$$yy>1zi}p8C)5}8Qd6@7(5s>89XQFvp4_%w_pf) delta 35 rcmZ3_xt?>wA7)0U$$yy>1>G398QdAf89W%27`zxX8N4Uwvp4_%xEKh9 diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$2.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$2.class index bf6ae80fe62feaf67829e5a88cc42844c7157a4b..aa12f548751c4d05a7340308d2e60a0f6603f17d 100644 GIT binary patch delta 39 vcmaFH`G|9aKMP~Xj@{H3apJR!Vmt$aOU|{5C;AP}tkY(g$P-o<0&|&0fuwoQo M@L&|0Y|rWm07dc%AOHXW diff --git a/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$3.class b/plugin/RavenSQDev.Preferences/bin/raven/sqdev/preferences/pages/SQDevMiscPreferencePage$3.class index f2c553a5459d1b3778b140bac839b49fb91e2d9f..b2961c7efe6d3d3a0f0ed5a83aaa25823cabbd1a 100644 GIT binary patch delta 2211 zcmb7_Yjjjs6~}*PUUwch%>xsY1#JVuBJV5|+C`wNgp_CsB&Czk25sw@8Pk;MOgg!w zP#*(=RjRh)iBM=wU(_I|Je?$@0PU!>=%q#yQ9Q#b1&?~bx2noR;s3(~}LlUuk|;YoJJ5{_|0fE9eo;FF50^{}rf6t*JP zsxFh;xLxn{eN4|c3iUsHrn`-(4jHoopXE-2c14jcHj2C^9o(hcj5)qI34^v^EIoF!gX9ej*ZVzDT$^Ke@oNkkQS*@e~(rfQC`5d1YbkSrY z=Ac{d=ZlI-VJn&HNVFHPjIFshnTmE*RaFI9%a;t+DJpbPphAGGXM^?y7S6q2ksV%E zzj(sdT5Z{h`>M%C$`rZnF)JMDjzvBbkJTqrcSl6Kmamz7U9St|s|WR#z>1o0@-2f+ ziu{yVCaSyciN?Ce->pR+&qUiWb5pS{E0VHmKPc(Xh29E~)jDG?Xq6at%W!&+ub?lXuwshN2~ECYs$D6=_6De!?}LB2R{voCS~Z z(S5Ym7z5lfh{T^^GzTg_Jigm6^`2aNq>Np z*7zn8{=d@iJN$oI?n~3UM+((0w0Akq1`av&JnuMkTz=xB`~>6j6SloNB>{`QL(i+7 z4s|mLl#g1`Z4s+S$dT5aB=p15U{iTqrumax$9C%Iqn_<)7E5=wuuA}pawlhGf?Z&p z@Eh2}1MHPiv0p~P0iL2?EC<*rbTS~@>vw1<)39aXtY7ki?>EmiSC)91cq*ilMt>r;#!F8@_b$h(Ql-znUyxgWfTGjxOyWa+ID+ zN`v3N??6;pf5&iTk5T$>I3sovF9EsC-`O#yVO;d@*qj{)J7Gg{j-TK0d&zxB^fQDi mZ50&G>2co4Zf3WXklogQ;BBEE8Sr)=K%U5?nw(GPIQbWxnk-!a delta 2251 zcmb7EX>?On5dJ3HeMw$v8)!;pZIuHpg@}q`TRD^h8YyKdg@OntrwtgWNljka1cRU` z2x7c0Xay{?Bgkf2tcq0>0hcQ73koVbdOWys1nRt3Kn{PzoZL6}elz#Z%y(z*oNf)> z9DB~a@;ZPUaALC~!zXVtid5K<;eZ!IR1C#1f+bYx4;sc^ zJBDL~KnbBkY*3oBSo3LB5fvj*Do@z1?>rh~1nwZDg~Ag&{<4ZdWyJ5P3V4Q8__Xn% z@ZBX|6?bB+93Xng4x+VOBvf-5%H>kg(>@+|2~6OF;K?%GsMKjT3a zbLB#N>$WrTu!?!Ome8WAvfQWnhxsF+s&JWK!6UN4KH9briv%8(>5i++k72Ux?QqlM zvcz$N62lWJp2Sl!=IF|c#VVe`vvQ}S#PS>=Rqk-6niVXSH#s}?twyqf8iL{tYW{H0 zSK+`5SShfApc;1`^lP4yVTCGIA&bqlP_Y&c1SdF9jWsIPVx3&-%uRTaKzyUsSgGJ8 zdC1w>>BVN9#4SvsY*M?(KB`;sVw;MW5tn0Cx2;aacDy2|tEHA#32kMLvyC%dFN)Xo zeLLhC)njYGTLN#&9to|BcIvz)R#W|u5qqbulArAkua9>!}W8$c+T2#al;$tFQ++tI=IHoi& zy1J&DwxgXHb(o6cSvr&VB>2 zIOIEs>9eA&ZBXmblN~-CM=qzS`>aRxDA$r&EMr*ig5rukzZwpG5y$d4R=d{oCyou> zTpMe#Ne?+$&v>iB#f{b!>w11$fF3+dJo@lx!($eYOx>Y=QXOhnqrJW&W7^V4wm!QS zuNAR=@W|{q-q?b-4N9X|$Z3x40^|S1zir1ATJo)KLe$O$TY{5#7g4-s$ip~h$Yy-c zd3+C=@jbddHFCmiZ^*;6%8+KX1SpI#tXlyyR>H#4&V81Ebx6W`)~`h>HXt1@!Gmq+ zg?N--jau|ZJ@T370UW{*>|h5Ll#vaSNO0@8F@v!vc47{<%RCNs0d`{{%g3=7PvbrA z-S@GK<#IG~uYZI!*vGCKu@Rqg>3zn5TDWy=*vIGX=ktDK>@dFKM5ABhXMBU-@hwhc zKhCgh!gp+bfSfo;iTHtBEK~3krQr}|;4o$42zAF%x(>&vC$D?qINid!J~%-IYXhH_WdH;sZf#&Qk*q~#Qf*pn-V1>kI!S^M2o_jEOPiTWQ$rAuQQRTK3j0Bd0v93p#G%zK zu;My3Gz2y^Gz5*UZ6Phim7sSyJedsA{8cT4x_k=v1Qf(pP#GG*A5lc(LIEWl4O zm70F4sHTA$ny96PI=ZMQplzCF=F~)KWt}#*XlI)aj50 Date: Tue, 27 Mar 2018 16:32:24 +0200 Subject: [PATCH 03/23] continued work on parser integration --- .../raven/sqdev/parser/misc/ParseUtil.class | Bin 10193 -> 10646 bytes .../sqdev/parser/sqf/ERelativPosition.class | Bin 1205 -> 0 bytes .../sqdev/parser/sqf/SQFSyntaxProcessor.class | Bin 6961 -> 6964 bytes .../parser/sqf/tests/SQFParserTest.class | Bin 10727 -> 10730 bytes .../raven/sqdev/parser/misc/ParseUtil.java | 53 ++++++++++++++---- .../parser/misc/SQFLexAndParseListener.java | 46 +++++++++++++++ .../sqdev/parser/misc/SQFTokenFactory.java | 38 +++++++++++++ ...ivPosition.java => ERelativePosition.java} | 2 +- .../sqdev/parser/sqf/SQFSyntaxProcessor.java | 16 +++--- .../sqdev/parser/sqf/SQFValidatorOLD.java | 2 +- .../sqdev/parser/sqf/tests/SQFParserTest.java | 2 +- .../sqdev/sqf/validation/SQFValidator.java | 37 +++--------- .../validation/tests/BinaryExpressions.sqf | 1 + .../validation/tests/SQFValidationTest.java | 19 +++++++ .../sqdev/editors/sqfeditor/SQF_Editor.class | Bin 14457 -> 14463 bytes .../sqdev/editors/sqfeditor/SQF_Editor.java | 4 +- .../sqdev/util/SQDevProjectBuilder.class | Bin 8352 -> 8358 bytes .../raven/sqdev/util/SQDevProjectBuilder.java | 4 +- 18 files changed, 170 insertions(+), 54 deletions(-) delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/ERelativPosition.class create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFLexAndParseListener.java create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java rename plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/{ERelativPosition.java => ERelativePosition.java} (93%) create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/BinaryExpressions.sqf create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/SQFValidationTest.java diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class index 8f918c42335df52d7e8403867f9b4e33d6af244e..3700cced1f658e38a20f66b2ffcadc5921c3da28 100644 GIT binary patch literal 10646 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 E0f|$qqyPW_ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/ERelativPosition.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/ERelativPosition.class deleted file mode 100644 index 479c54b49b9038ca00a8d618c678b8fd19b88f23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1205 zcmb7DT~8B16g|VX-F8{NDikRoexS4ksa4>mm0-xCjing2G--Sq%7ROlE$(ic@IU+^ zS{@)8iO>EhAxV!_J)9d(XXR?%AKezFq-X!J3Kzh6RszEI03eJg_?XQ||ee zN8m7T>{<>F?9RKEZwGeERS{trKIR>sces0$H{A9KLu}Ki){I?-Y^6`0B15ENY}FW| zyXDt!XpK~Nss_WLQQg~~ufMA7874#S{eKX~OHIdi?O>fj$ztfbC$J`g<9l!&6 zKOxhB>T6VYi0V#a3~BQAJSMP!6bgh^DCVKe5Lx8=UWWzJClso=#hD8{x+RTK0D4Kf z+^a-LQt9k5mAn?XM%NUcY9RQ{EGBF$IvSctN^Wt53jhH2RS*dP delta 54 ycmdmDw$W^ZD{Zk%+WdL1IyHs$*VCSYl3QN@7WBaG;xiP6{JKhQ?%T0r}0DB6Xqwdms-{ delta 33 ocmaDA{5*Jrk%)+JL1IyHs$*VCSYl3QN@7WBaG={}PmzV90OK should be retrieved from + // parseInformation + + SQFParseResult result = new SQFParseResult(); + + sqfLexer.reset(true); + sqfLexer.setMacros(parseInfo.getMacros().keySet()); + errorListener.setResult(result); + + CharacterInputStream inStream = new CharacterInputStream(input); + sqfLexer.lex(inStream); + + // TODO: adjust ParseResult to carry tokenBuffer and parseTree + } /** * Parses the given input assuming that the input is SQF code @@ -51,21 +82,21 @@ public class ParseUtil { * @return The parseResult containing all necessary information about the * parsing (including the parseTree) */ - public static final SQFParseResult parseSQF(String input, ISQFParseInformation parseInfo) { + public static final SQFParseResult parseSQFOld(String input, ISQFParseInformation parseInfo) { SQFParseResult result = new SQFParseResult(); BasicErrorListener listener = new BasicErrorListener(); ANTLRInputStream in = new ANTLRInputStream(input); - SQFLexer lexer = new SQFLexer(in, parseInfo.getBinaryKeywords(), parseInfo.getUnaryKeywords(), - parseInfo.getMacroNames()); + raven.sqdev.parser.sqf.SQFLexer lexer = new raven.sqdev.parser.sqf.SQFLexer(in, parseInfo.getBinaryKeywords(), + parseInfo.getUnaryKeywords(), parseInfo.getMacroNames()); lexer.removeErrorListeners(); lexer.addErrorListener(listener); CommonTokenStream tokenStream = new CommonTokenStream(lexer); - SQFParser parser = new SQFParser(tokenStream); + raven.sqdev.parser.sqf.SQFParser parser = new raven.sqdev.parser.sqf.SQFParser(tokenStream); parser.removeErrorListeners(); parser.addErrorListener(listener); @@ -95,7 +126,7 @@ public static final SQFParseResult parseSQF(String input, ISQFParseInformation p for (org.antlr.v4.runtime.Token currentToken : tokenStream.getTokens()) { if (currentToken.getChannel() == org.antlr.v4.runtime.Token.HIDDEN_CHANNEL - || currentToken.getType() == SQFParser.STRING) { + || currentToken.getType() == raven.sqdev.parser.sqf.SQFParser.STRING) { // Ignore hidden Tokens continue; } else { @@ -150,7 +181,7 @@ public static final SQFParseResult parseSQF(String input, ISQFParseInformation p * The necessary ParseInformation * @return The result of the validation */ - public static final SQFParseResult validateSQF(ParseTree tree, BufferedTokenStream tokenStream, + public static final SQFParseResult validateSQFOld(ParseTree tree, BufferedTokenStream tokenStream, ISQFParseInformation info) { Assert.isNotNull(tokenStream); Assert.isNotNull(tree); @@ -174,9 +205,9 @@ public static final SQFParseResult validateSQF(ParseTree tree, BufferedTokenStre * The {@link SQFParseInformation}} for this parsing process * @return The {@link SQFParseResult} of this parsing and validating */ - public static final SQFParseResult parseAndValidateSQF(String input, ISQFParseInformation parseInfo) { - SQFParseResult result = parseSQF(input, parseInfo); - result.mergeWith(validateSQF(result.getParseTree(), result.getTokenStream(), parseInfo)); + public static final SQFParseResult parseAndValidateSQFOld(String input, ISQFParseInformation parseInfo) { + SQFParseResult result = parseSQFOld(input, parseInfo); + result.mergeWith(validateSQFOld(result.getParseTree(), result.getTokenStream(), parseInfo)); return result; } diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFLexAndParseListener.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFLexAndParseListener.java new file mode 100644 index 00000000..3f685180 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFLexAndParseListener.java @@ -0,0 +1,46 @@ +package raven.sqdev.parser.misc; + +import org.eclipse.core.resources.IMarker; + +import dataStructures.IErrorListener; +import dataStructures.SQFToken; +import raven.sqdev.parser.sqf.SQFParseResult; + +public class SQFLexAndParseListener implements IErrorListener { + + /** + * The parse result to add the errors to + */ + protected SQFParseResult result; + + public SQFLexAndParseListener() { + this(new SQFParseResult()); + } + + public SQFLexAndParseListener(SQFParseResult result) { + this.result = result; + } + + @Override + public void error(String msg, SQFToken token) { + result.addMarker(IMarker.PROBLEM, token.start(), token.length(), msg, IMarker.SEVERITY_ERROR); + } + + /** + * Gets the parse result + */ + public SQFParseResult getResult() { + return result; + } + + /** + * Sets the parse result + * + * @param result + * The {@linkplain SQFParseResult} object to report to + */ + public void setResult(SQFParseResult result) { + this.result = result; + } + +} diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java new file mode 100644 index 00000000..b543a93d --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFTokenFactory.java @@ -0,0 +1,38 @@ +package raven.sqdev.parser.misc; + +import java.util.Collection; + +import dataStructures.AbstractSQFTokenFactory; + + +public class SQFTokenFactory extends AbstractSQFTokenFactory { + + private Collection binaryKeywords; + private Collection unaryKeywords; + + public SQFTokenFactory(Collection binaryKeywords, Collection unaryKeywords) { + assert (binaryKeywords != null); + assert (unaryKeywords != null); + + this.binaryKeywords = binaryKeywords; + this.unaryKeywords = unaryKeywords; + } + + @Override + public void initialize() { + for (String currentOperator : unaryKeywords) { + lookupTable.put(currentOperator.toLowerCase(), UNARY); + } + + for (String currentOperator : binaryKeywords) { + currentOperator = currentOperator.toLowerCase(); + + if (hasSpecialPrecedence(currentOperator)) { + lookupTable.put(currentOperator, specialOperators.get(currentOperator)); + } else { + lookupTable.put(currentOperator, UNARY); + } + } + } + +} diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/ERelativPosition.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/ERelativePosition.java similarity index 93% rename from plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/ERelativPosition.java rename to plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/ERelativePosition.java index 8137bd87..e43f6af8 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/ERelativPosition.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/ERelativePosition.java @@ -6,7 +6,7 @@ * @author Raven * */ -public enum ERelativPosition { +public enum ERelativePosition { /** * This enum describes a centered postion */ diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java index f7d566b6..e0e8a17c 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFSyntaxProcessor.java @@ -44,7 +44,7 @@ public class SQFSyntaxProcessor { /** * The relative position describing where the error marker should be placed */ - private ERelativPosition markerPosition; + private ERelativePosition markerPosition; public SQFSyntaxProcessor(SQFCommand command) { Assert.isNotNull(command); @@ -120,14 +120,14 @@ protected void validate() { activeSyntax = null; - markerPosition = ERelativPosition.CENTER; + markerPosition = ERelativePosition.CENTER; } else { // operator is nular but has one argument provided errorMessage = ProblemMessages.operatorIsNular(command.getKeyword()); activeSyntax = null; - markerPosition = ERelativPosition.CENTER; + markerPosition = ERelativePosition.CENTER; } return; @@ -138,7 +138,7 @@ protected void validate() { activeSyntax = null; - markerPosition = ERelativPosition.RIGHT; + markerPosition = ERelativePosition.RIGHT; return; } @@ -204,7 +204,7 @@ protected void validate() { activeSyntax = null; - markerPosition = ERelativPosition.LEFT; + markerPosition = ERelativePosition.LEFT; return; } @@ -253,7 +253,7 @@ protected void validate() { activeSyntax = null; - markerPosition = ERelativPosition.RIGHT; + markerPosition = ERelativePosition.RIGHT; } /** @@ -282,9 +282,9 @@ public String getErrorMessage() { * Gets the relative position the error marker should be drawn at. The command * itself is used as the center point */ - public ERelativPosition getErrorMarkerPosition() { + public ERelativePosition getErrorMarkerPosition() { if (isValid()) { - return ERelativPosition.NONE; + return ERelativePosition.NONE; } return markerPosition; diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java index b0a2e6e9..8307194e 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/SQFValidatorOLD.java @@ -410,7 +410,7 @@ public void exitUnaryExpression(UnaryExpressionContext ctx) { String errorMsg = processor.getErrorMessage(); int[] offsets; - if (processor.getErrorMarkerPosition() == ERelativPosition.RIGHT) { + if (processor.getErrorMarkerPosition() == ERelativePosition.RIGHT) { // error has to be on the right argument offsets = getStartOffsetAndLength(ctx.getChild(1)); } else { diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java index a4d1c247..b7be2f25 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/tests/SQFParserTest.java @@ -336,7 +336,7 @@ protected static Marker createWarningMarker(int offset, int length, String msg) * @return The resulting {@link SQFParseResult} */ protected static SQFParseResult process(String input, Map macros) { - return ParseUtil.parseAndValidateSQF(input, getSQFParseInformation(macros)); + return ParseUtil.parseAndValidateSQFOld(input, getSQFParseInformation(macros)); } /** diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java index 9d884595..d6d2f97f 100644 --- a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/SQFValidator.java @@ -45,10 +45,6 @@ public class SQFValidator implements ISQFTreeListener { */ public static final DataTypeList NUMBER = new DataTypeList(EDataType.NUMBER); - /** - * The character buffer for the input to be processed - */ - protected ICharacterBuffer charBuffer; /** * The buffer holding all tokens */ @@ -71,8 +67,7 @@ public class SQFValidator implements ISQFTreeListener { protected Map resolvedReturnValues; - public SQFValidator(ICharacterBuffer charBuffer, ISQFParseInformation info) { - this.charBuffer = charBuffer; + public SQFValidator(ISQFParseInformation info) { declaredVariables = new HashSet<>(); result = new SQFParseResult(); resolvedReturnValues = new HashMap<>(); @@ -80,19 +75,19 @@ public SQFValidator(ICharacterBuffer charBuffer, ISQFParseInformation info) { @Override public void nularExpression(SQFToken expression) { - final String operator = getText(expression); + final String operator = expression.getText(); } @Override public void unaryExpression(SQFToken expression, IndexTreeElement node) { - final String operator = getText(expression); + final String operator = expression.getText(); } @Override public void binaryExpression(SQFToken expression, IndexTreeElement node) { - final String operatorName = getText(expression); + final String operatorName = expression.getText(); switch (operatorName) { case "=": @@ -198,7 +193,7 @@ protected void assignment(IndexTreeElement node) { error(variableNode, ProblemMessages.invalidExpression("assignment")); } - String varOperator = getText(tokenBuffer.get(index)); + String varOperator = tokenBuffer.get(index).getText(); if (!varOperator.toLowerCase().equals("private")) { // only private is allowed as a modifier error(tokenBuffer.get(node.getIndex()), ProblemMessages.privateIsOnlyValidModifierForAssignments()); @@ -214,7 +209,7 @@ protected void assignment(IndexTreeElement node) { } } - String varName = getText(tokenBuffer.get(variableNode.getIndex())); + String varName = tokenBuffer.get(variableNode.getIndex()).getText(); if (!varName.startsWith("_") && isPrivate) { // trying to declare global variable as private error(variableNode, ProblemMessages.privateVariablesMustBeLocal()); @@ -222,17 +217,6 @@ protected void assignment(IndexTreeElement node) { declaredVariables.add(varName.toLowerCase()); } - /** - * Gets the text of the given token - * - * @param token - * The token whose corresponding text should be retrieved - * @return The text corresponding to the given token - */ - protected String getText(SQFToken token) { - return charBuffer.getText(token.start(), token.length()); - } - /** * Adds a new error marker to {@link #result} * @@ -455,8 +439,7 @@ protected DataTypeList getReturnValues(IndexTreeElement node) { case MACRO: return ANYTHING; case BINARY: - SQFCommand operator = parseInformation.getBinaryOperators() - .get(charBuffer.getText(token.start(), token.length()).toLowerCase()); + SQFCommand operator = parseInformation.getBinaryOperators().get(token.getText().toLowerCase()); if (operator == null) { // If it is not recognized it will be handled elsewhere return ANYTHING; @@ -464,8 +447,7 @@ protected DataTypeList getReturnValues(IndexTreeElement node) { return operator.getAllReturnTypes(); } case NULAR: - operator = parseInformation.getNularOperators() - .get(charBuffer.getText(token.start(), token.length()).toLowerCase()); + operator = parseInformation.getNularOperators().get(token.getText().toLowerCase()); if (operator == null) { // If it is not recognized it will be handled elsewhere return ANYTHING; @@ -473,8 +455,7 @@ protected DataTypeList getReturnValues(IndexTreeElement node) { return operator.getAllReturnTypes(); } case UNARY: - operator = parseInformation.getUnaryOperators() - .get(charBuffer.getText(token.start(), token.length()).toLowerCase()); + operator = parseInformation.getUnaryOperators().get(token.getText().toLowerCase()); if (operator == null) { // If it is not recognized it will be handled elsewhere return ANYTHING; diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/BinaryExpressions.sqf b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/BinaryExpressions.sqf new file mode 100644 index 00000000..ea93b8e4 --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/BinaryExpressions.sqf @@ -0,0 +1 @@ +player setPos [0,0,0]; \ No newline at end of file diff --git a/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/SQFValidationTest.java b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/SQFValidationTest.java new file mode 100644 index 00000000..342af4bf --- /dev/null +++ b/plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/SQFValidationTest.java @@ -0,0 +1,19 @@ +package raven.sqdev.sqf.validation.tests; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class SQFValidationTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + fail("Not yet implemented"); + } + +} diff --git a/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor.class b/plugin/Raven.SQDev.SQFEditor/bin/raven/sqdev/editors/sqfeditor/SQF_Editor.class index 2a0b3f9e4570bc7c0b4ce417611f2fc07f19be15..d3fb5fe3e5b1ef7a3e5fa578712697d7485eb39e 100644 GIT binary patch delta 46 vcmexa@V{U~x+o8KL1IyHYH*;Ne@@Eg0?`m=e!jBAoXnKO5}4oxiIwsIu8|R< delta 62 zcmexg@Uvh;x+pJ4L1IyHYH*+%BSVJ9WM37gN9v4e|ia$rYFY diff --git a/plugin/Raven.SQDev.SQFEditor/src/raven/sqdev/editors/sqfeditor/SQF_Editor.java b/plugin/Raven.SQDev.SQFEditor/src/raven/sqdev/editors/sqfeditor/SQF_Editor.java index 09e86eac..ab0fec55 100644 --- a/plugin/Raven.SQDev.SQFEditor/src/raven/sqdev/editors/sqfeditor/SQF_Editor.java +++ b/plugin/Raven.SQDev.SQFEditor/src/raven/sqdev/editors/sqfeditor/SQF_Editor.java @@ -217,7 +217,7 @@ protected IStatus run(IProgressMonitor monitor) { @Override protected ParseTree doParse(String input) { - SQFParseResult result = ParseUtil.parseSQF(input, this); + SQFParseResult result = ParseUtil.parseSQFOld(input, this); if (!result.providesParseTree() || !result.providesParserRuleNames() || !result.providesTokenStream()) { throw new SQDevCoreException("Expected SQFParseResult to contain tree, names and tokenStream!"); @@ -237,7 +237,7 @@ protected ParseTree doParse(String input) { @Override public boolean processParseTree(ParseTree parseTree) { // process parse result - SQFParseResult result = ParseUtil.validateSQF(parseTree, currentStream, this); + SQFParseResult result = ParseUtil.validateSQFOld(parseTree, currentStream, this); setVariables(result.getDeclaredLocalVariables(), result.getDeclaredGlobalVariables()); result.applyMarkersTo(this); diff --git a/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/SQDevProjectBuilder.class b/plugin/Raven.SQDev.Util/bin/raven/sqdev/util/SQDevProjectBuilder.class index 6ee3fba24c88d180abd84acf90673fdac5e2aa51..866d2969e41f0ab0a73ce1dc34b13a7297c47137 100644 GIT binary patch delta 61 zcmZ4BxXf__KOaALL1IyHYH*;Ne@+S`L&oF>JR+O*`6L*H`N|S=GE)*u;BrefCJXY5 KZO-L476brQ+!9v+ delta 55 zcmZ4HxWI7(KOYZAL1IyHYH*+%BSXgI2RtI1jrb%O1-Q!+b23vBOCS Date: Thu, 29 Mar 2018 15:20:57 +0200 Subject: [PATCH 04/23] continued work on parser-integration; fixed broken command update --- .../StringTableXMLEditor.class | Bin 5089 -> 5095 bytes plugin/Raven.SQDev.Misc/.classpath | 2 +- plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF | 3 +- .../Raven.SQDev.Misc/SQFParser/SQFParser.jar | Bin 0 -> 95339 bytes .../SQFCommandCollector$1.class | Bin 972 -> 972 bytes .../infoCollection/SQFCommandCollector.class | Bin 32959 -> 32155 bytes .../SQFCommandPageProvider.class | Bin 4195 -> 4231 bytes .../interfaces/ISQFParseInformation.class | Bin 819 -> 0 bytes .../parser/misc/BasicErrorListener.class | Bin 2081 -> 2090 bytes .../raven/sqdev/parser/misc/ParseResult.class | Bin 3017 -> 0 bytes .../raven/sqdev/parser/misc/ParseUtil.class | Bin 10646 -> 13175 bytes .../PreprocessorParseResult.class | Bin 1325 -> 1331 bytes .../parser/sqf/SQFParseInformation.class | Bin 6606 -> 0 bytes .../sqdev/parser/sqf/SQFParseResult.class | Bin 3315 -> 0 bytes .../parser/sqf/tests/SQFParserTest$1.class | Bin 1224 -> 1214 bytes .../parser/sqf/tests/SQFParserTest.class | Bin 10730 -> 10736 bytes plugin/Raven.SQDev.Misc/build.properties | 5 +- .../resources/sqf/SQFKeywords.txt | 68438 ++++++++-------- .../infoCollection/SQFCommandCollector.java | 1176 +- .../SQFCommandPageProvider.java | 12 +- .../raven/sqdev/interfaces/IParseResult.java | 37 + ...eInformation.java => ISQFInformation.java} | 2 +- .../sqdev/interfaces/ISQFParseSupplier.java | 26 + .../interfaces/ITreeProcessingResult.java | 39 + .../sqdev/parser/misc/BasicErrorListener.java | 6 +- .../{ParseResult.java => ParseResultOld.java} | 7 +- .../raven/sqdev/parser/misc/ParseUtil.java | 107 +- .../parser/misc/SQFLexAndParseListener.java | 32 +- .../sqdev/parser/misc/SQFParseResult.java | 102 + .../sqdev/parser/misc/SQFTokenFactory.java | 2 +- .../parser/misc/TreeProcessingResult.java | 108 + .../preprocessor/PreprocessorParseResult.java | 4 +- ...seInformation.java => SQFInformation.java} | 8 +- ...arseResult.java => SQFParseResultOld.java} | 11 +- .../sqdev/parser/sqf/SQFValidatorOLD.java | 25 +- .../sqdev/parser/sqf/tests/SQFParserTest.java | 30 +- .../SQFProcessor.java} | 25 +- .../tests/BinaryExpressions.sqf | 0 .../processing/tests/SQFProcessingTest.java | 91 + .../validation/tests/SQFValidationTest.java | 19 - .../sqdev/editors/sqfeditor/SQF_Editor.class | Bin 14463 -> 14460 bytes .../sqdev/editors/sqfeditor/SQF_Editor.java | 10 +- .../sqdev/util/SQDevProjectBuilder.class | Bin 8358 -> 8356 bytes .../raven/sqdev/util/SQDevProjectBuilder.java | 8 +- 44 files changed, 36874 insertions(+), 33461 deletions(-) create mode 100644 plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/ISQFParseInformation.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseResult.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParseInformation.class delete mode 100644 plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/sqf/SQFParseResult.class create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/IParseResult.java rename plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/{ISQFParseInformation.java => ISQFInformation.java} (97%) create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ISQFParseSupplier.java create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/interfaces/ITreeProcessingResult.java rename plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/{ParseResult.java => ParseResultOld.java} (95%) create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/SQFParseResult.java create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/misc/TreeProcessingResult.java rename plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/{SQFParseInformation.java => SQFInformation.java} (95%) rename plugin/Raven.SQDev.Misc/src/raven/sqdev/parser/sqf/{SQFParseResult.java => SQFParseResultOld.java} (94%) rename plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/{validation/SQFValidator.java => processing/SQFProcessor.java} (95%) rename plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/{validation => processing}/tests/BinaryExpressions.sqf (100%) create mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/processing/tests/SQFProcessingTest.java delete mode 100644 plugin/Raven.SQDev.Misc/src/raven/sqdev/sqf/validation/tests/SQFValidationTest.java diff --git a/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.class b/plugin/Raven.SQDev.Editors/bin/raven/sqdev/editors/stringTableEditor/StringTableXMLEditor.class index 36867fbb0df8dd7c8343c6a9181e11f8081e91ae..a36d6a094f1264c472e3a4673b366e3565aa76c6 100644 GIT binary patch delta 52 zcmaE;{#<>-B6emi4b9079Fmjwv2*kL=cHJ3F=R93vNPl`GN?^% - + diff --git a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF index 4d3cb342..209595f4 100644 --- a/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF +++ b/plugin/Raven.SQDev.Misc/META-INF/MANIFEST.MF @@ -36,4 +36,5 @@ Export-Package: org.antlr.v4.runtime, Import-Package: raven.sqdev.misc Bundle-Vendor: Raven Bundle-ClassPath: ANTLR/antlr-runtime-4.7.jar, - . + SQFParser/SQFParser.jar, + . diff --git a/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar b/plugin/Raven.SQDev.Misc/SQFParser/SQFParser.jar new file mode 100644 index 0000000000000000000000000000000000000000..a97392d004e1ea6e15c428c0bd40d0da391c679d GIT binary patch literal 95339 zcma&ObC6}ZQHhOTV3w5%`V%vZM(W`+qP|d{X6H~`;OlI?v7Z0?TEc&u9-7O zW{$Czf;2D)3IGHI1b|1nmkhu^d{6*D0Axi~1ZgGZ#OP%O0PbZc z#$}{w>1JW2X{n|rrW=$P7MOPq_YQ#o6r{l+>V1K(u>brN=ATR9zyE;I+w-6PfaK4& z#s*FX%1#c>Mo!KSCXV#NW(E!hMouOULe8e9CJuB)RtAoa-m2Tm$Ujkd@o6-}A^-zL zWD$x)g$at)3RO{NDbm^eQ3moqcjGG!2yNyjhi3Vn>2K=bFJFxD-}HadB(9x4w0(>I zT>C<&<=wtQ+7shSyD+`p^1Nz0-g-ZL_VxWj?cu;dwFVN8XfL4WaOv7vur5d*tv+kk zvx9k;`s@YnSIdKNsyU5$kkM?BN^47EE$A7E?a?P-LWe+wKzE^G^*_)}Y&S|~c5gV6 zfpVftC6!K@1?u-(M!)NjbWAo%gz;oVYv`zhaJsq z6u&DrnOMTF#(2u_Rx#AOw4No(D#4F|G*HbW{F zSoSYKU$Q+@Rfk742TTGndF3W)nB%S3i!7-cV5-W$UGY3v_cK=L3VKZ&9BVg_tsjuf z90on75YdCzaGI<4h{QI5nZ{CqU+!li#_?4wF!;QQKTgGjTW?UcS9@e|AG<6MH`sePuHcik@gM2O!2u`x zxZ%>76vpF6?D-K@BA-)4~y0yT@#5GVvFy}6S1$wdY6uzVk0uqGc8zEo8 zh`60Gq|WveMldX#NU!=aV-07F}8X}+iFl|Ye=%Kzmt3fzg^fZ7oskW zAQk6g6q6{FIQC5OpY5<$hYzOONTY9=1#Ad2_1nx1otf@Xtf82)8NNr9uW=CzzRf$& z9Y2?j)01_$d8)(M?Y%ubLoRY?jlt8NI7Z=a9WxVyGe(NBjpt$OPr+6bNIZu~xgWsl z_xEC{FEn#5Sclwri96ho+pe*Bq1zypJRdCjt{2TakACA01U* zy^z&P{ZRX0549^DIuE`0%8%Cs?$$H;y-XNRow7> zLPd-txj}!NZw)wXdG5S&z2nq9pz$Ghx1)t`dD8j$rA)uv2Iwab(8YS63msn@eDyl#v9jA{e#~=css$^)4(;&w? z`&)JG;!CtdcN?F{`SRF*uRh_QvfE`HLTu-A-EaKX&a4?MMol#UxIAEz z_`1}|+1-H>kd6}tH6qKju?ro`TOVOq`C(5!oaIX+NhD*+bTGOU zA?VRk`n5qI*3^8Y9}4!s%j=%L`yA!YgJy=D8jY(>hBOK}{ud5a2Zj`^mt4Uh>->v1zGb_3B0)Zp$>MXi_z0$nfgOKmCr#=9`Ju zL72&hEnM=6qfDnPX4Y|StioH2)?4S5B(U8bZm*e=Rs_zd=C2*ioSo*0lJ+xx;sd&Y zrPQ`)2k1osf|GRzcXMjGwx~ZZGE?clbN95Y)1?P-I^(Nm6?W9AqaG5Rtwr`wf}AP} zQ;hIdZegXYt5YGr0x}%I5~*TL`XJIZf47>IO-x$eVtjoVws%Igf4?&Hw+^?=N-N}3xxK2|=2=|BI!LF21b>;lZ5(uWIF)|K zy!;I*%%}_JtAGFiVqpJ>lz%P06#tGCNg-!*D`NvgD-%f@V-q(O2NRRO7vLy0O)G3w z6y9m+Ar~@pwh~#%^_lt=$@SVqg>;tKR!EGwLKeb2+8Mdb5audowtai_WTCtZZU{k* zL5n;n3T-nAl~8yRgi->+Tfe}a5L*N!BnZSQZ0YntVGXnD@qnOkSZ4}F4&Wl{Zeetu-A!@ z;sV!et>*gUPg9e)U3KFiA~Lx&$<6iA2Alz6RODSeKQ#zcR+iUW@}wsU2pGc(pa< zMCnz8&+(I8lEiRxGtonv;!_k7HvmO^Asf+TNg?_$TQdeWE7LTwPErQ|AYNjPbG(C0 z5oCT_3MY;xSTf2kg^zeme1s*kjD)f0J5-DnGPfn}j@WSXiV4q4LFq8ln|YWTYcN=4 zd4J%TCQ8%r5=jd#InfM5!A1c=%ex$DNpS~KsGVs9p)ROrn5W5kLQHa~_j7(z2KvWE z-`jNylqEz*VY!4@W4|YI6|5UBJT0g|&}vld3i+L3N;l0*C|GmRDcvnkT!1l~bB!^e zZI%O>&DY^w!t{(77mDsKJDRAy4Tfqb4U%$k%}7QhHpWktM!4wETFuM`+00!QmdsX% zO+1N`r|dewE?6E;Xl*zcD}j1|dYlj$t!M&`OZ3Naj)YQ&dO9cO={&NXn)RHPw`dM4 z(I|HT;-Z$S*u$P-2ysF)QDfnynOLp_6;VnHO0c zi+67~GI5HxrK8&C%^`IZ_DdnlcnkI=Cz@VQc#|~W8B*I2*(XySJ+!m>fsc;Z(VgJ9oR!!vXB&ZO8KWjyHjZ0J{UOyiiNM9)r zf5pRnE>F*monQpg3-nDNoIkcN3woR9vqsv=#4>&W{Kv3 zu*2aoz}ahk2&{{C@Nw0YP}trE9b}g-d8u~TUL3TC?Q5)brbTZ*kJxzSqH)t%I+saR?Z?8_5&ikP(WX@*#Lw^D3wIvbx}s{SIa zeJuM1v)b%N`+*0G_o#EB{PRfhP`JpMX78wq=7j&PZX1*^EvJvjEu0k%OXK*@? zM(2(N$l#l!nFdqbx*$Cox3?%^<;1UrH>TNcl!Gc&Ij09fd9*bKi$P_>AQmq`Dmb-KCNr1I4DfMka|B&!w#^ecH7)e)@fMH^BIrkm-%#)iY3s zM=BeS99SOVm^`dc*{q*~$qh`CCt}kL@BIdd^_%EvpA@HOoFi1-o?Wlsdt`q7{J|j< zZ!32&L&rOUI>a8tcAq%=4RmWT#SMP=malsdq8C5qd3c$nyy zyeKCh@}ip(&EWA$UnnzZb{*y47&y#So$r0W&i+3-ZD$ z!cqXxTmwH^1ztY2diKl8E2}EY9=;`O1oa@*1ak&@`zd}+$gUSRHP$ecx-HkuK_JPrx~F>W)8UL zbd8GiD_xG9KASf~Zh+a|Ch1`ek`l_9Tulva6m21B+k%`&ikrS_c~ES_{CCi^l+{BO zl>o#IM8KEV4=HNLywkkLZB~ld(wpEqhyoK>d&ToXC!~$vtX!gD%t)z%EHI2ent6UF zv+uZ0;}b@x96X3N5ZaCf$ZVF&l*$}J-z}FZ04d*JgRxbQEL)ZKfub_WTFR2E@BX<%t#TYl=(YMI0NDc`amF>NL$)CV}%LZ zr|lU<{Pc&5u95{EWew7T;ix`6bDW3{jAYh`L2qG2#n39#-^eH-g>PKxouQ}QuJrez z6Z^<5H*jq7Bb!ZCd65_;?ee~r$Yypd$=tp!5kcohexn`afVrr*8+#MCPX9j;-!}WC}Qy zrmID)T^3qI(eAbTOuwE$V=ELQuZ%jRiLLrBgSSZ77Nf4^j&bdefig=O;mZjYLF3oY zCID3%p@Fsr00(J9Xsg7vi5xb1Y~|zZU-3p|$nUw3o==&Y8G(YKM;t1lR?T0=+N-WW z^|mJx&0FL(SS*>HxrO_R4qMFv55#yY{P|fHgpv?-Og+4;R_(YwAEol^ESKtL=UheX z^4$l+Hh(k5Kn>o3jfs1hjX>psn#atD`WTO6Lho|^mVHRo+V;HrwNZG$B)(06{VcC(SY>v_}a$CGwn7v>x^#w@); zbJ>jCPQf`x((bRQI8au`+UJm@C;oekhmrl-NY~BD#K!1y{*^B!Nrg7j(msk^Rvjpw zk4k4kKvU|fR=4-7w`cw-AKosmZ^_KiuEni8#nXx(TROQ`x1y^R5!+g=;sop6in;4; zciIU+#|ZOS-;t9bx{0U5z8N?rm;j)kKM;)lGKy5YbS~NG{R#8kMOb6XDDTw52$-q)u_TfCG0C&y!>r zo%QR+)ZJ9_Uqk0NVyM)#E}MpC)BFpXofSdgrIq7ty`OfJg1Ir409u8FmC&9UNEWNu zP~kfaP<=OBBiK5mr6&gU&3j=S{9|Q=-48yg1e!n1*p(WYUA_Xtu``MlFTo+wp$(2_ zHe-^6^rm+E_|j$&XDqVAj=JS->?m?Vg(==g$1q|kgsN-yV6pgWOpX@nD_pvhKyeUw zb;n*%(d48n?(5*8wpV{Zfm{4U^^q_2;@+1pz8T5ZqP`BmI10Fi zI3WGN$*G+qQXU+#-CevtmO(HW3JVp;Wt!jXsP5D0JUWJdE8sw4{&?2G=^P*+hf9YC z%4iZGY7XRn+p@Zbz$f$m(!kcEc5kp6IOZOJA3Drf9kA#p@z5?iq&V26Fl5HWtjk*S z4PJbz(S~N#D_^P~`*1sn{QTwnpfwR|kk*6MHFFiUWwxEiXU7kD*tj!TM%-st3&4RI zh{#4|H}=!}y0dt;jY!i-wXGaODd52?kc^m&vjlykhwI z-++HP@%aIX2FpM7YY6Qh>({^fE8KstU&@MNDz=s;Hh(u&K`QGGNP;LAyL79mAjrf+ z5VNJ@76a0qL2krkV4?+JisN?%zzHCOL2ES0Uvcn!W=Z;Gsy@H)P28ty37V>p{Ia%o zopQ37VflT%-vRaU6okTwldR|2sG}Q~v1vQ@hN);CrS7UGWzCVP>opoIrda)CKfjZq zgZiq;TrN{6=L3_mR58U7kg-Kkx{Pj=&d(wbiVaq#$aV}}Uzv`qR$oGpbg_9J7upv-PS~)E zyPQr5amy7*?pH`#j<2F|oXJ0I%*M7GjdvZS&gb5xH<2>PJ@9j$UmfLh2(Lca9BVgu zsID<)7EC;J(iZNI7-o}u`1O^2($lcIGt51WK(BOE@5hmY z7HKK`!zfuCqI-Pe;y)h*0sy@sVidv+bqSiJIapC{HS~Y$-PkAXYgXheN<|g0Y+!$w zR}a8ELeG&$LI`CVzBxkL2QP9RRHt_+c`Qn;79|Dn1cUHC&#rrdgu>&nck6F(tPU00 zmqrybZVn|fB3c-&Nd&J;V2(;)Gv|~t{VI6i$@j1*Y)?TEKjD<}Fp`LO2%lk$G)ksY z>o|Mx!BGg^gbG@*6(DrMQ3>S@K`~r52wHIsSRd^!F_E%_+#aG)Asg@tmd_H;h2_)3;wr`86tPs`5U-f1St-2-s3_ zU;uzX@P9m!YF_``Zov5;PUK%QGAL12zMlamc>1!Y)?-b4^(rG40b)iDdCewNSfZ<0 zD@DXST)^xbw}jBdeAT7QaM(qU|EU;by8(yLDA+pErq!HfX`DlC(o@x82era-rIW|{ z5DzpFTy+;PsLbGyXWPE8k!1wd^yUP3GDWC1=kU~-5@sRTocShy1dOjJ&M4SFMDzmN zGAJFhtmO&Q-4G!ll&D(~}t6dVC1w>g}OVydQ0jf3pld;|ZlW#iYm{ zMRfTfl6HIq#e~;#yZaF!s|Hm-4t~a668aT~@Aws26dh35)weu?$m2mrMjkT=c1Bd( zpFKxr4}$C_vJs)!u2bNuM-9-3aqZnb#9hMmU~Nevg4}Dk`DybFxQUMWBEEw$kP~mD zh@`9!2mHcIEQpAGkO17qe;Mr3GqskUGF4jkHz}#8T6m_JPN9Q~s}N$Beb#kuR;QUb zz8Zwu-nZ8qv0eBk;e`AL1bS@Gf~=R+a9opIa*UVJo=Mke#b-MxnWX`(bi$PFC@U&w zI<3!>>6Z3z8vL7XOe6MAE3I#&@88S=ZW|d^-k)&m1mqvLTI^q1SN|d0`ip!`9G(6~ zz+!(|Otud0|0mp1)pkS?MfvhDO}M0q2&_O*kRTvL*9Yx$P7pvs($MgaMG!#Ax_GJw zZeZ@$LG#~%?cDu@I;-fG9*d`{nq$YK`TmviGl$l@g@;$fETqhTv;6eld(-{Q zWINg0?0H1)o8pWc47K80j{dRK5X5wk5!7tKd$MBPxIwB$rE1}zx?W;(46XgPA@T!e zvtEm|Bdp-3sXpLgX#=jAv>~nF*XN=PQS^36es&m)X4kFRex{50HeuzTB9tTB(@vZ6 z_LW96I59@RO(}HtJc4|%9TRn7q0w;BdKTL6oXzpA-Z<-Jm^&+yR`_+^3vde3;tJ;_ zE-eEK{33HNM0U78Z1(WVmLU40-R9ss=uu9#PB5S{3Ix!y6eIQls`lpM%3pE7F|oXs zIpl%i7+KP~Inc4xcIa-s$`Jm zm8!Wpv-2JU522%fhMnv(lxj{Z5|vqyRgo7O=UnYc+ZIdq|q)Z&iqkUGqd z-9nKXzPV74wn^cQu#I{}8HCYyw%Go-TIC?w@iy3i zkjR^EKz7ArupS=jrr%gu#fm3X`}Q^mv0Gtw(@SI?y>JRpQx*w-In|%Q7TBiG0I<9P zM{V-9^w`E15ejcl;3kU|Glo=>HgH6=#ifYx_`4qnzgc8IHgWa|2tU(K#B_`ih(;Gy zTx1D0RG-McO$$YuH0uZ|8q%3_OX@#MGT5uj&jG8(j>E zxHt~54Xx0IT{Mfhh!bVV8^0s3>V{qHzyx3WE24hX{LF!Rs>m(%XGG;G^CzZCRp>2* zimuq9MCGCFk2&{{ioZ?FmL@8RA8|m^j58LFtR##3881N{)|eon9$$uWI!Vw9JyoHv z1v*`^QxB!5(mPJon(wc!deaWIrP8ZSQ(43Z`#|1{Z8FH=gO!17Nij( ziqU6?LvCzDS#5~PR}%ign!L}Zw&Pm<;j6fNtTBkDY+@^nJ#N5yUf`fBz?~riPOV7k zGCN9F5TRRe=84ODAzhx!Ugoh?JobvsR?lB2Y1w011=^(rr`^cAQl8brHaX;S3FTtO z9=qHvl*1O_b14pE#&4AJ1npw!tFQ2mE&R|7d+t~#ZrdB$jaJ}6|8y3xQWBGwn=|0k z6%OnXy4Qs+Q8V2wfK@HNjr~I7QG#Joq8z>I`!^ALWphe>_lHA+p#CQw{SP6`f8x=< zwUm;r<<}VyhJUc<^bx@J4q;I|#QA|?OGwO@M_mnW$+UAU5B1gY@}so(y5=aC!#0u> zQ_z=}cYl96xOVHw0d@sr#-q^aXkL~&V@)ceP^Q?4K_2SEw7oen3L25$VGV*RP(S+b zREfr6IizD$d}`*oTYcj;Ov{i{OfY_JQhsTQR4#2%Cl^;d=j-vf zc+8E_x*m31NH2O>cBIpkQgWwEHR)NU*LfXeOpD}?7AI*?OH;&|POZDdY)F${Q#q>p zK8TR(Y}r14^nB0K`_6?I=HS7AInCw1a7yT>djNa+b@yn<99K~L#h!AvRt8Cevp%+Z zIk`WnOLP9tw~bK_@Jk^XbkJqP_;ksS-`6OVsAhCOBa;=2s{7!8 z7QPi+U8C{@3RNq=+AFK7Qu4hvKRzjECL|Ptw@Nz`w%QfDEhC-gbYv!rT<37kT6;_N zbf~wnAdz=MRBz#*FD=Giz^dYh_>B&=umUF)KuD(d6n1zBZmVG2Lyb^20)Y&{e7Sbi zz?|G7oU*|i_9d(Z3caIDLRpfq{7eB=vBEtb7Ot+b+Ir_cKHOEIarrue9BMJ+sCCVW zyUIL9dfREgn;Dg+L>y^ats@`X!xuDDP}s#h7BMJOl5B^XG=1!mvxdz0sh$%6%3zWi z6=ec#S(W?GJOFj&Cb;_Q{VYL*zzkPP*_nwq9LSa}H3SS5-o2e3v;8<3^j3gY%u6}i z3<*Q$N*fE!CKfC?ktuYtbKw?LrCW5i&y?B?TsTY4g+P!)=?5t}@LGwBR&g$nNvAms$gTWsepyF=#Uu~{-yVyg{AhwM&l0BQ`?(qvsZvwiI0mIrff`h ze^@ZKRo?qd-jwHwiRm9drU5ES~2h@fZIcY}g7x2;2BrHu)Dvoy?S zo1wd9bv$jNBU}H(yX684(_;JbjXx_GX?7`t2wS>mHQ*wM@I;^WMqY3lgE5C52mUW8 z&nPXfoKg`=mlc1g$zOE(3;uLH2n+_j2neVQCWKTyC=5oufn;iqXm19LFeshD+E(}% z?O$-)RUL(SGnIE9LGRi6r!08{Vp0JydJzM-w;t<7gE~C+j{{_AwWa%v{X0RDTva{1 zwXuE3!4%KlTV-tU+%TgN_sK5Ln-;NCKla8VvgV6o=fHy(rJE`3Va=h`XlM+YO8UgI zTC`5brM^5fPB>&cR-Y=aipiU8N?Qi=LrWm7YnFC|K>Ho!qb8D=mgml;oeZILy{)}f zaJU52;HwbV%*ti&%3H(VO&$gIV$4cGXFF3>F&L%<(cN1+%svG(&G z!c(q1D6GOh3O`R)D1kHfG)31sRIw8V8}B<{&#VdisYt3w}l=}fa)r0yn0A-uK6 zUMP>y`JPpbd`U&hZs%*o;(7LJFpWl)X}$s8ef992QMQlW2rtLC{{rxCSbBlY9{^|k zlbZe4DEvRnN&Opu|Ds@O37IK58F^I+Ng7EQI!Y>8I!an8+UBD@Dhk=LQ5iLfN$N>e zJ6JfUdwL04DVkAws4^M})zYKA2k1w8m^np=M@N|O1x35Nz?m;XylMf(AL7RZzLwQm zbbpiH0U{Ug+JDZ{k3ZM{d#LL_Odv>#Iyl%m$e24inb`c-Oc(c~?J^%27#K2`oC_G4 z7}#p!K>WZ?eE!@){9OKmp||{Ue*Onh&ct5)LgxaJ3mBRhm|x{Uy~tJU4!y{C2KzhW~=|bbVR)JCX=HQCT5@_ z?L08%;Lu3VNY4ZSP^3VICgzF&4VVkT=s*wP-`BV+O`Gs%eO>>w#(&)qqCemM%i!9- ztnshyu#Vw|>-*y;kB?CB@`TO++iQOX4gg((%2=$GvV`G)gAHt&3k%}j=#RePzg;Lk zuOP8dXh4e7#!)6py}Gqw!VW>*qO$fH3}3vM`Nxt5mndn*9a9D1Oda4#12pb5Mo%mN z$X*o|H$9GU^dPJ`(G_2v7zO(YVQ41%*z>OXhLHe3@o*Jz$Nm^a*M~x-%Ghq@W+tv0 zqK~pBkB3z$@y-fY+H6;$e+2sriupeICFOtCh4{x@{omcC@%d*DP4ypE{@*iuk~VhE zPJf2^Obo35ZmpcscimTY7t+kf6Ap75R z35lGJ--OAbb>$K+oTr8mi3rI9yS@lWo$ykEE!9;_3TDV2*xvG`=B$Ph41Zijiv>O< z>Lwq z_(hUXRJ6YPy1u~A9O>;x3#mYDH!9PJ*Ur>lobGtBnc$xJ0)NjiHpulu2*yo`yi@xE z*;wyD$t?q4#fj*)-f9)}lpC%EgyD(b9|*|_Eg1Jzkb)@OLZE6Zj_ZBlG<`ZZD!6`0 zEr|=+Hd;^EFR9A-Ju|D<#=?t~TXL=bTgSDOQ)Yn+&LmBTw#}u+aKy53akK?BHBlM~ zTjXu?I@@7vh?UJPktIL3rC&H%@{q!JNQ2z5!--Af?~&?7O;MLv+i1KNWIBbjCGi_l zisff8;bbenpT*$Wx2+$ng{Q_2J-8Hi2B_=Vu`6qb2)1hh=voUMoTwZiqwKPq7MAP$@f>uV9BR6-^*EcsR~){IBF-oH8PiBOn(9VP#9XZL@sO$^WB)b z*qHLPHT~)P{dx=CgQjPRK}fTRbDC(pQa$EEq1E=;V+)$i0ntxD(@sn2g=i6qT#ds` zE;r@);c->#KvS;Nk71BU-(^P^$I!h0R=q(wFsGJ=unlh^Bo4C=#zF#tEV_(tyA~A= z5tA8C4pC;P;M`e{+-|WAJ#;AEBC0|66{3~FK&A34Ru+9)#WDSS`O+tJuH!@TM)IXu zRn8D;9;(Q{_>Fy3%z47SW`7ZBSe|OZ3_NA#O4neH`zP7 z;pCO*>TIEJq)#?C+z5Y0oxQ~qydD#o+CziBMZJ2F%xQp(A8~JCtIw9(_Ma%G7G(j4 zkG8d3BSmZ-U&(j)b=$oOaM{_6r&hiGY#Q-~%pIY;Y=@Ty{7SW9DIB2(#|0Paf46#! zc*5r5e?*4bKcVwqYubN^%>E-f|KcRoC_$(`0T|Kc1m(bLt#aO9n-KW~5JZnaM%ZIB zr!u33pmAH9=FWK;u^-=G)4AtzErC&Jx{xtVkurH87(*eftV?Pkzre5kTbzuaych*X z5DQMhrFl6a-M(D)04#j7LRVQp&a_$G=Lu-_vG_5U4e{4t)mr8^T@MtJ(*|pm7Ma-| zMFS%U;|+DOG$$B)X^RC}#_6tJ$(1Yn&f+b7qTJ{ll8s4AG4+Gl|0-_b@7TLle^~eC z&-H(co72CfhP?mI%YufEPJa!g|5xkg|0IVbGPbss&UPw)&B}?|IQ@5&sI)Hir{3|d zt63VcXkEKTpsx`{`RC?C5TQX0Qqh9qx18qBrYBB{o$$Zr=0fnj0Qw|yNJjjLVh9=< zm>rKMG7moYA7Ojgl*KqNyeN6@OOGf=X;t~A)iISaPHJ9>DdK#BqRO#AaOv z%6zqvnRJ4gM3?uXs8U?)u0f2>#-1>q+D|=`LYgt!QO+(hFj$aB4HOz5gyWK&ios(8a74=(lFU-^edK(_-(=sBWehheYW`y!0O47yraC2FrkV~K9_ANoa3NNEvy3Q1Ne zOpsO)W&N!UF|;vCMjWt%A!ULmqhf=D z^aM}{eWB)Yu@a^TmQ%d_?Y|d0VOQX=&o2Gtgo80BzJTz&Pk^q!fTH#38t*l7m7#Yd zSn9qY|H6eZrv6LSAL17K(>(Zpm6hKTz_?EU^wvu_sE5HokZH?T-kWh-+wn@&- zaci!Xjd9uIY?~9~W3SivWRhR}Enhy9ZO6V>yvM%Ryw4l&yq`~g{Q#zrWw`?SS|P~` zK%;K96sy?F$jp{&$fK=jQeepophgvsX1Gm8w~tUXK+!hVRcy@pqUw_mO|Iv8g}>@& zbk*ngV4)@+yP4&cJL^`?wz6}V@Mbq>jlH~!el?X1YVVV;&Z+F%BG)c@D8X79MU7t* zpF%Hnlm!sa7KHR^4J;Q7v)&~mVC=GLJd*XtrA2AMyHi62s*AFc5!zj@E>T_YpoCg* zw3pxM&Q}*J4DOn7NP6{QKfnRjMaGWk^ZO|Z_bpq7RipGKwVixtq*iscG$_YF%Z$0~ z+dG?Ih{Y^p>6SJ)O64vhJ1y2gEG>9!Do^1t3}(Tl>TC-uQ)yfwDpUv|W_vUV7-+sK z0Y*?SIRN8NcM{Ojo0%q_&o%JhXn-skGh*CZ`RC3E6K#AhMPAMsFH1$ znPfx5(frT?@neFdw%TxT_|ro3iU|xKjhx&`_S2FDBzX~q!P`*xg;k6-~kg%mG6iv3cWjH5ubJt|szu=|$VL{#k?N+_dArLhniXprn ze*ra*Ig05UEt{v4>XxVAf@0|BFA7A;sc9vSi)QyRh(yd7uB`_dW-w7L*%x9DgiiWk zEG#G8aB-3A?y|E_>z;9kd&Q?J1Kd0cY$XPo+QIWu`2+XphGn~ zMsgVd-hpAQQLV3OV`wTK*NTQuvRCn7tnfp8(OxEPSUKCX{!#-_ws)+7%3_RcHX1=S z&Uga5LolYJ5oFTWNmGy9Ik#XYOw|dDk|^np$=1cMnr1r4E!`k2VpjH5QLTH!NE}2F z)DlE$x@7{1@nPn|@HW~`B?5zdyWp3_#Ne@pHlMF#m>wQmBn8{>W9(L*xG|DyyBnh<(_aGpFBwNDq3T}R7%}`4WLrt5j|V>DWb;M32T?^ zDKc@WUXU>=59%Q)t6mscMrvG?WaSox>lN)0q*WI*EEbVYXtAVbs}zno$m_f^>2(d0 zM(;p!<>zUzlm!)pfq8qYeLnyxjw%?L#@m}u-%=288)nNC?ZWcW-Kvxa`$kNkka}_C zB)`CQOS`UU(au#Umt~3!KYh5Xi1cU2z3{QkM(TDC4PlA-5ZvMrLlIvU6BzL)z91SE z=+OGuu7_*+Mpg9U>g?XV0ogQvi|mzH;k!3)E??Lf-cOVGOdT1vY+v8kK)hioy+k0< zGwSVVj+{w$gRA4#yHfUX6@hxc!hSH3AP-~|Q1 z(pn?hS4f?NxAaC~^<0JfS;=nmsY(PV&n&ctC;UjZB}7dNrV556AO-zQCs3})H8B*4 zeSK)2mR;m0a4gHM8{xU=eXYHj=HZ|o!n)1|ymPzJ!$$U?DGJ{LmF#$P=Y3vA$=Ul_ zIlXcet>jom)TH^ONSPwh7wD-bNG7_3-qtR``km&G(}q`G%39vn^3 z4E|rId_~PcIe?g6ET<1NfH*F4*2MAQbr|BjbflN2_4hya1rwW5pA7o=bh@$U-x<8w z$7Cz}daCthFZ*SLJ!{N8bMhwHnkrzeuL{IYq~5Xw5_V(z!*gh0_*tXVb;1PADCKvT$@RKcKH`!q-*Ubl_$J0Nh zWt);mA(ITp$+z79dC1@?&xfAJ+l&Kna5Y9OTG4C(Ll|2ST8J?{)S1~`TL>DB!EiJY zomtHhic{D$4+E`NU6iWWjEUW@rw!bXRxAcF=1QQa9dfgx z)UA|i$x-%d65v_GXzDZopUfvz-D>|ue+Xi{Xa(GeQEhSdHFx0K5p1Cr}DZIW;45=k45n( zBKR`VHwQ~uu`kCXu0|uCjzz)m^1(5hU_`;^%M&ahY7^$p0cHAxQv*UM{qP9A&`GWE zaqBjXR|5)GBG5~1I_2PLK!FW`;6gPyNYM5f>ySbQwRq^*_Cr_Xu8RP1P^Wh!Z<(@@ zO6)6p{PqJxD{}{AG@;>k>naONGObEiV){Yd7|s=VJ)`42QRIa*Xg*?@#?&l}AJi0o z7$n~N;5ceM5yk3G{UCxPFU!oqQZkg?hD+j4pD=2qP#qX7^5&Rz!AaJw0)Bbg6@CKy ziQg@5GOu{C4k%4+J{@l=OFi9SE~53$XxTr%23;8?WBFTOR?_mfv9*d8_h5SZlAdW5 zMb&3?lY#jq>XNaRXA-NnmS+~Lr`9{RC8_ykP9^8u+Hc8m7|)1Am>TB7!mv;vB^t^i zYj(Md{PjLTX?{J8)2l2v@=>UXA)I(ebHQ^7x_mAyl2xIcflCr$4dEXVYG17d$FWJ} zd$bRAhJ#hD(Ap9i@lJ{L52qYFayDu_JuJ{1(caf4D$0n_s4E zCQr?@BwLB)PL=CkAcg~^8a_QLyqCuP@>HMe`n>`t{GOK<241)+9^<0kLA`7AGe8}L zwzj7kLP$IiaJS1e!Nwa6;sL#TFiSz9#WC#l4eGt?E)vW7ZFi#xuFsJU=mO%PHPvw; zrh5&azSv5*6Z&PsAN*m(imiQkcoK|DY@W4JKAFP_lqmbxY6q+HQmDg05FK2hLd)t6 zFj*+^2#~!WC=IKj74n-hk84=j!d3?Q=c-w_T%7oo)claEwJ}gkojec>NijU%sm`>R z_jzeb{AmY@W1}&khu5)^Z9sRpf-8M-9)q7q;Y!7p`H4ZSb5i}*Qv`ad?sJv=k9z4M zI~8GLIcXU#Gm663B1|nB4T>-|no%ON=m9L~pb%hx98X?ujrrD^@I};vg{a^)abBMq}anxY7!%oZ#zm}>C@;h~cLh9cCUAn|qTzospcPk>~eJON8( zgz`)RR3z3*jiPXlAZ2)?YtPBbAv~cmf3pZEkoC;_Z^gq1bJp}A1&sm3Sd1bo9uyOI zr7P`L)>YDw2;AGXksLBH;tU`iOA*A+BbLx=C}&4n$Xd&t{t(W#xisem<%^z8Qq1XH zmPnHoE8$|BNXwJ64xo!uEj4`2wgT}g>mpq{3K99K`}6@K?t8!3C#6T?K6dbanQtq`@1Vps{@1^ zTbbFxVq^&xVI$D&GpAjW-69P`atODLG3+BAg1(kiAq6vqd_ibiEDyFvBVvlyFmbYn zXF8EUrif7LkY_(u^S$ZK+=3A^TCdE&k)Jqsnrf`9b7sc%9f6a3 zL(Bb<{xm~pXi{<~fjpk6vF~TTZbXgSG+D8$&x7?7@M z!scKQRk%mm+MWQL6G92#e6+`u5bOlZv85Jw^rc?6&nNn76)-r))MIietM)G}_!g0t z-mq4(7GX<(EaY536qKzGK*8X+RX_)UVh^Fb!?UA7|8L2=4|T^ZIe1CiLe+6bRb1j` z81PXY&vDnhe#*nCEEkF&4KqPzvAeyPiRx|ei!{K$gvPC-Q!>?m@aAU&j)?$ettq=6 zxNC1Rl^bdzvt&;^$vctOVbYbJ-@Q?%ZxvYq^rDZ%!tMm~*g1~_d$uuEjBnVhShN{t ztKx}9PRyShkx@+sJ0WRMP8#KykU!HN#J*%b^o-CD05$tqWiDqe; zp)DAEzri@MZXHjD37dct0NlWR zV>1mG>FQzTAJUq+Kr}web%CEV9GzX?jDe(khoaQ6(&9}0S(~D|g@Xpyo(v4U z_udbLx7^#c30>`}(OLr!-D1*2>BcWWQ~Uf>8|%BIHd3-%FFT+wn+eN8ZAp~Fr21X& zkH_HsQ;C+L+Dj{PD^94|7)1FOA$ieOrGy>1=OgXYCweE-ae7^P# zM@SW+uww%54l=F$M=@ld;&ejW;E4~JCc$z?G7s|aR&N4$v3x~_H-@$b$IpS^boD9r1)oXD zv+b$5fVy$tgS(}Uc8Bg*Y|S<{RCdtN|NOk(2HW9 zy+K-AdX|ivnfu=RnETkP;q&qRT^<11?JyvMFjJA1)f!bQU6tx&@MS1WOMz9Io@CN% zG#^;E>qgMf^wx2aC;A#M>n!~+AjP1Ql6RFVr#EBVG@^a5Cmu#>v~Y8xx`EVk znNl=Z;f#&%yvRz8o&-ZDcyuNO$thB&GY<~eBL#N8R*wNjL`zKM8M81-M=WJmOhAy_ z17joZq#GZkTtF}c-W4-& z;5TIN_xxF#)inp!a}{sHf_ddDNZNciV@s~qFC_mJ>~wQfmRUfmcexr z58ul~Ud$A$ID^nuR2uzUt7%h7Q0d(!c1HnKSPcE%y%dM7r?&$6)4?Ag->-u-w?`3a zSFn@TD9d4VSRJRCh=C!Y#qDksWSL`ub7 zTU2;7_n(rd-a$kZOd5k$wKAtRg65$;zc|XWiVW{l^M6NhT5KRa7R%A@Dr69iK?}Vb z`SpmIN$R>-X&^lTUiw4PbLyefLl>&1FN4$@hH#C*$V-;PHVDLh$e@)&P%2mFxeboG z0Q>6*Ygid9{eO(TQ+(#@vMt<6$F^;wW81cEI~}KEbZpzUZQHhO=gXXXpSAX!Yo2|+ zi}&um`PZ*7s%q4Dn9DVN<&h;u895;ry4gc$uL3bL3cSvkz&Z-{vwcVT>3SX7ngBX? zWR<{N`|r_liq9%iEn+>==qUGY&pje)0CFkk~*lCp|&*P zn#rA?EZL~D?4s$MF-0gPRI0QtfX8ywKKtf%KG7ti99f(uB4fCr))8$v5T-$E8VsgQ zZ=g$SoN*V$N%6a5TQ{`0#ny*mw?ztxipo{fOWO+&thyahkvJn5zwbJE71Mk?$ibrR zDp?20&9O-k_KSgzR<^tJXOA-7C+IpMG4lYvj%FUXW|u*DR>??KKCQ2yX_An^yV{n! z{>Q|MmM7j(gid})R0F80VAbY446|eh6c|X7Fxk}gah{0Df`N5hEWR&fq>4yZgvGQH z@^o<=$O0o`f;Qy1VKH-86Ka{#KyXesPRINRL41NAc_V<`w`6Vfdnjc-lZbBN0eNPy zY?&@{i(0$qurg@`4anHo5ee8RA~^+#sHRke31h|k1Yylie4}A-itA@kYaCK6QGlHW>EooCV z+>f_%TL%uLROG2oRQ5KaIEJ>vqCLf<5}$mH2G8frSDy zU<6r;sHHSIRyZeAB)vdPorK6t#C+~L2J;jod5E58=oFr`+oRF{d2rdADw4k#B-uYD z8Q0&n zJLDgm0A6GyF~qMxBLn-Nf%f+mF8+V^bYg!p$`x#!><#{#M)q%N3-_PYmgB!sTPCC4 z&gR;--ez+46#s9;mV-M*Jo5bQ;$uIhMkd1VCbq_I+61Ce(LT^cbVNX8L-J{Azqxg4RSw^G%ZUjX(qeJ98gZ)EFBWe#0351}MpEQv0I{;Q0&> z=R0WBoNN|K_q zicL3Y_F676tK&8QHkw33-SICR{_blcn{6Y>T62wAUPyNY5H`di*6(pITY?LZ8EO33 zTqU*It^VjX3{KAM&-OqGn%|9+PCLzk)2aZM<6|P}GVgeRE2NF-c->*=9 zv+I8nSGg%YLTPqBOJJ#;W!A|qta|)ui60gFuWeu7$@UjZ{M`?5|I-qGsAZ_=Sz7!b zf>XY-hRT;_#)mWwRN}Tg1kwzO_qw|p(`YTrlO}Td$fq)f^25(!wpDMm zjbGNn;tLn-kmf7&8d@XFJC-U;c?v}d+dB#kzWJSraU7~!(8g43f3dd9+QpM~DeC6@ z_52xufGaXH#jy3ls@|2cdZkSydrn~j5lU7eE8@e)_G;7`TH|YTrO*Tfd!cu>7zoZJKYXs0ObM-LYrGMxZu&Jh5?i5do+T_70KJocYDG*tBf1 zzG|dD_+6$&Bzu{ho5RGCa(>(t&e0Q8CS+Zlc~TM7r!L(+%r{IsP&;f`;w}=vwBf1> zLE>iz_JeBPkCtPco8%M1`lt`pAX+1?PJ+-}+8^%}YHn=GM#3xFGuL2|YKAMyRf@{` zQli_K&@#)bOb7CVjZYB}bNeSy1Nco((f3H2HXbXR8Z7v z8{?kc3_GQkhr=rfOh4@n#14FjSp+PceAc4k1$j8eMtOKTahe;R1P-GmB+@n2JS>zQ zAx}gbbHW`%901Nay@~dBm*GF4QF{s9k02t?vpG0hg1RdA-0cE3Y23b%<5tYL(U#wD z6I5J-R3PWeSmS1qg$R&|6I_vr>)*(Khfp{!53ot2biARge(P&ZJQQ4Nj6B_DIik=P z%?g(DX@Un$rj-I9Z|yt9O%;VtjzMvyU!zO)5#JQ~!Ds4{w+t!{sXF z6B7Aa65)HjktA%yqgdJpjy@bX5Pc9D$_509HaJNH6xBSW9kMcclHDBFY?TL|6hcSO zBx?ebrD-t(j>p{~?ufkydPYqbz`!C!HEJ|6P-)^(8mrGE{e5N?7`gPI!kw+V(khW` zH|Cah)ri%OUtxKM4(Rg;XY+`=Kf(`^PRV)N6F&A5g|WIHni$`_m#cXB#LnM9|EL#y zB+v=VUv!e9zg!ROIs8?^0q1|sl7Cc-d}S#aOnNx3KXj-t{rM;Jk%0J-<$*zE**H$c zb_S{mS5twq-ySE%ybM`Vzsa)!=})#LyIw9E=idaR;G4$JIY0Y70W^;4i2V#c64pib@;kr$lEF4~Jt7 zX;7b{>S2q~NQ)qbo2Uh3q0cWe<-gQ1tqtqAfg#kcn>J;3zvGn#y7eqLWTpLT60C;Jp3?+#b^wv1*h7Hy zHwUi7IUJE)7TDb&0>iW0(qfy@S|M)*r+K^jSP6F*h> zH->GsaqrnGYjFd*4(472*JT0ZY$mN_uqLce)fZ8fCP%HN7bNj_ZFZYOepe%4mpY*ouZZ@Q)Fxw zAK5^Q-R@|Dhq~`ZKFD%Xk=Fumf5Z^k#F874fj1 zj7X?VJA7e&js6!=CNpm=*q+OiMqdfmNo1b+x=g)lOub6}z0+hGm2qJ*b&x>%m*Nkq zGRwxHOa^Cb%WK!7g2xS9wEDjGJq%FZXOQOM{Sx%&pVv8(HP#_WUucx^Ys>I&Joa}K z@(+g%Vt){ozL3aY$<|Jh?SJra{SN^n1fJ|L*ojuAwn(sZ!iXiJ3HE|N^l5Fo%ckG6 zuFR2Ke{mv>qzm~-kDze$U$CSse}0^O8;i(_RAi2Xq zibmilLw|CACNs!-c~4M8O7o7hb@C@-+q_2YUjE87Dt|$2DSyjFME{wK{=-&(u3;3q zBUb3(xMC}lHonzwe|K&?2~ei2FI67RAM8#hLW#g$js;e{-{f!x6pG5R?k{E&B=NdE zXipaTZSIH6=My%0#?hZ%Xq#wc)yS;w(;(R)D0KDocD_4;=(*rC9211A#;i7WxD0e~ z6~g+9-=OH1l@!Vl#bUp@6(w&~Iv;GEMF6L%iGrM)r|GnTgO}4ynK_^{=C?*wbE{BJc9}xNL%pl?r70CHfrRe(;z)~O zLXOPdSOfOEMCWR&Um%ZF3BppNuZleFD)!gh8wbeOxzwgC>D|5G^9m zzkz-3I@gxug=ZG0D*D;v;m?+j9wVdq@XKlP{xVzndyxGD*Z+^>i$A+Q$A6s;1;ky- zV;Uh1WD0)5xz94C?)U+fl zpWm6UYZrF#WG7ol1mAY4{Ja(7k)fjNqlB6hGxbs`wJ0k<(Rv1d8s7abI0w+4y zP)5mbjUGL>DU*?3r4SQps4BzJjY58w_f{@qs_V)5kYT7#PcfvJodo)JQ1!P3*n9C2 z-kb`JizYq^cg@`_hh@w{e#yE7*8$ciF&~LhrX(}5ki}cy>{xBj`Sy!c- zNmeS~BN~taNuO(KRxSW6vPe3xx{?gw79z3*nCj)T;&14QKqMiZ=$QmxLTlCy0Il zDTuBZ2n-OPoymuIWD-nY2G)nR162xW7YGpO+x4v%uQ#O&Prx^uC`uPi--V2>k8bR$ zxr?r?&5g(wfDj_5S-4dD=-hgNgV>^0tuXs=g{f4nnjP909jYgw)UjioG~APY#zeVR zrLez#dXG&2LLV~HGpppJx|e6^a^WX%!?pjKnG^d0UwQja-a=0g!IuN+_5~@UNiZYV zCGO>b57q8D^jN8k#Y9LcACM#BbhZwz*}8{E1(SJ>XY1H^U*p!r;`v03nq|UAfAW_eV7i?%&3`fSjB3s5Y)4u7V+>+e) zhyko{4)(31tXy!BAS`TSC6Oimx$M-J=3t4rOO9VREcEYjmtKML;abk^eetMGG}~N_ z{;3GUTnI4;*6ze%5>30YbohERw0hz_b#8GigvW&UWY-yaGIP0Oad|THzw+3`Zp~%o z)#Zhu#nj{K@*u=UV`|J*XTFQEF%gi{imBwrgvLNA#T$xKl)lGM#BeJZ#FUu7q3S1w zpBm3w?G~urFNvloRfgNup48IoDZeupjFpIIqa%c_6K3m%66qR55SbE6A=Ffh5?E5j z`de}0g)9xl3R)qFDPod{b%sNTjS0_t_}t@~;dws!R)CBrkfM;tgij&aL>CsAd70hF z`*_?1bJhubJO}>hAl~$l$$0j8yGd)a7v+9V=ez-(e~N9pMnwos<$TF6oA7?w!)g8& zi)8ZnGGMLa781?^?LrPPL4v=??a}X?143oVzIrL|-o~Y8(B5)_!BIAG!*`&Cs*}z9 z@utYM?*s|pR`@dw!vJZ!wL9s@1B8rsz|H6D%T&xF^FyB3JMAA}8d)CJnDq-xzyC$O z;_t&3{QoRqf6YUGR4=0lDHvZmxPZk6B&;sXCJLuH;g#-Wgxyd)=7B9(IaRdXb!tJB zor`vs&9T%LveKQST!Cq%wYAk6v&#>9#2o9#Lk09_3-^#;ERa7--|Af#xZOgAo%6A6 zDUc=m1+(dOwPepkSB*$(o^%d%54#J2$g=^B^K_jOm&f|1*d%@OPC=oBDJ7@8C=DAa z$r;OkF&zTb=ZX>!y^Ej|w{nscFKmHav0%w=7;bkZVdsB`5)^Ijb%I4N2J6@OuK^6J zy2gFy*S8A%rJVo&$jV~>iF=G9+P`?}U${sALkUje8bIFwgTtKiYDV2{LSWz z!jy9u=blKtH-uZE1_GQd6$X8NHzYhN;qn#gl?I-rTIpT=d4)9t^x0DJ_4S8ezkdTi z-@k#GfAEFBe*GW5&>z(;{imGCxWW^wTNZ2;xSc@kFGx=STBpS#{9=Tk1}QE-v1~-a zs>QJ2*i@svKQqg{`8jqHvIGWDrEB-uVQs};kjDIkjT2HlS+y$ z6!@TF`_QS}WU$XbA$a@udQjk0CE@f%*o*hQdi*Q9?DDe0X)Cdhh<=5O!6fS+K?D<4 zi9#e$1G_-Vxcq|l6e%kU{;BuiHGhPvsWTSRWn`y)P)fDMZz<^{t&6JlQ~ix0yd zOZ?7M*gxVb*yx?+{mYJ*U$+ncw&mYFiSX+mf4k)qG}3o6`MU&e+#hO9aDkuT_*j~v zP;3HYTL1u3S8$Ob(^$yF(|57phT0a8#m}BGISRio4Zktp;+o4)7J~ zGol^XAEMOu!O`_^rH|)7#7S$}%ZwX--^zU$YgI>O~tU{!w~N z7j`&TuV=Ke6nG3La8yr>OM*_)3W(jZreT3GUsLs-WGq@4n=2q(;h=w;<9i#JyE@`# z%8G0~1mOyY7%aX{-$U%su9hedd~7Gyi^b|BUAY*bW*i(H#%sX~*kjd@&b8oIyID z0vo%`VRwO}R(=ruSYVadGh|9}*~-sa?H@og4E7ieM1)NiOy@C6KlTJgq$4kU=R#OT zq4sQoowe`pr^y8z$5O6##rp{GaodYij#=tVzx&oG6(ba&Q| z=HQKUsK*-MY_`?e-Td#wCaNg9L@swkkO1P{bFeQD5?WJ}REVh^$u70T-;!eN$a5Pt zn%sR`Hh)9FlR!y_NXuTsP;Br`Gc*@LWE&dppxr0Q(ub&%C^ptC!7Fz-y70ww@Xs
    N>kp^r!H}JlNQ^%=*p*j?W44!>%`n_XqFBFcE#4YvEqiHIx~Vzb*z9&X zS(P58|9Mys!?SgH@)b5`UxMTR4xPW3qXC_F{BnR1n(?U6h3*njOe1|K+zMgblh+>2Aj&+H%S zzKlKYE&~*En59=ugo0g!xk@-*6q&9W>z((adB_LLR2S*Wy4P2tJtM~X)P6X`EWM9v z4ewWBR>y#e*w9=CD*cGrx>go&xiBSUK$E`u_gT%!R9U}Pmo2$mo~Q8R59J&V>!21w zxh^yx^{a$N$sH^8dF0;!(G~!k_;eQmq^-9$48%Zku35G6SPj}mKM`I05yijcR=H9* zM7KO;&7&86oFKZFhiMyjX?`HUeEI}{J3)QGNDWBpwZ0^vE`w*UxDkCEx-iStF=odN zk5#J#I*fGw*}@)5W+32x)jRdCmjB=8{(GkS2Xp^-xBox)4)sb_3WzF5Ue*X}M3%qw ze?_PeFiWL*o(o=2uG8L{r-duwaT9ryW1RzAZH#i=^F14eo3ON%K6C zI-QiyJY-To z-^OiVd=EN9w~-Y~Q+8@xB3ttV6l);}k{0|)en3kh76LHx!(nW?`$Yj=A!BebGH8(D zi$zc21~-iwG~ZAweL4=$SO06zt^SGhY9F)Iu zgc1+SfRf`j6z06+$p&lg$v6-oxyESOq&cSa=mDr|Lsc`!(iTUu4VC0bo$C1ds?CYZ(O`aR` z5$;MURlmqe3#7^xwN@l_f(%o;DFWVLK_(nBL9Tg-|Az?LR^TI~Fc1 z+WhMd3#Gb<3$ck|jexZ)JT;rQL>M-KFWjGC1VM6lfagTdRO-0*12Ju`mUmdAZ`ry` zAXl10>XZD5M2oUXz7&wP#u3*khaAh5r#nmAsA=jgCxjuj9iq; z23-Si8(y8l;8s+Pr7xC1iE!qrB(FFxK3;K#BMiyxKlU{kykn2>9M}H-#C%IdaB##u zXkKz4%Gf?Yks_R&##rqaq2cVlu|UpkZQ3s|K4VQWD?YBEukJhZvEI2Pynm0XW$xNW z-#5kDy(M8w9uV4ymS_qe9omLqrt`J2g@zsOZZtfgZ+-?qe2PxC!uQcxa*ye^3)(-Y z_`Rw+fL&O$3X@4A%o;9J#ZSfdLni@8g?QK**F#EtQs+n>?iKMQ1Fi@{@PnMYlyM+s zwy}(sa+*S6qyNwsywpeyvB+qn+r!6oWiuxcxQ>2MI`46wM^y-C54csK)H^lNexbPN z<4-V!TxQX%@YSS1{$=9-_WuT^e@#(;j@Xo>9A>{pY^$C6GW{2IV%wsr{N#E=P*K^# zP$oj!q$y-EBIUvXh?4J&#cAr0 z{AgARUS`;Gf(+I5u`buvi#lMiff85Y z$9vBuY=oi+Ix3o^2bKboV)jLp>@s5pzvOY??jj8ZmoEU^QjHvESVVi_~!1V0&-cOwa@I zP76{)({<^7;Ri)>G`3f&EVAsXvL8Qg=Q352IYUt5r*p+alB{MQcgH{8L+mnfTE2z$yV7gKm_Qtc2cEMZFd^ZHvUO!Sw@j8>>r)jPY(2 zZmN$v<}_9xTZRYLreVxKgA z+h)*ZP2*0^77q8~up3CKnu%EVOzuC+crsxv^!yiU`g%+2e<|btG`0VigvS4T_DV}e zN~T8^E=|Z39!M^iWw*Y436jN{5#JR&gq~QFlWSD|Srk7~Wyj`r3wBEc{jr{j)pfiJKD~Kh~HJ+lrrf8QZY3YF2R=+M6SZ9u_jfbr3WLpUp@DUY3VJMo2!n4 zIXEi1#3NvS4~x)M0Q>$X842Te8l>$a7bcrE=@_H**jR>s)=@GSM6d3#)!T}0b*S1Pw=PBjO{dt}h?EWN{8X0A#07PIAcY?E_+# zp5;G}$+sV^()d~ZGiTTS(zqf2>^|U=U_nS~MeS2g=*-uDZk{br2+<*>l(D95{ zPXwi+jdvRK-@0$10Z?vy)0^z@Wqbm3&i=RC)XrPDk;%m$@j!7B$q|MZ+p4o{xi0V=A8f2ff`UAbpl z?_V8BikZo61c?jN{LTCx86}23eR#{~LPWQ;>_@!U>o#&^S5}6DdTIn&Hsod{kQbA8 zHgV0LQN`{EU4Pg$KsuU=czyaydXz%S)6*`WDxIGh-Jcf&`Xi$ z&)wMfCY7*_FJH<1%ed_CV43tk+xmZX^g@px zaJc3$+5WTRZb06CX&;*IgQ(F|@$vByso30I7f07bLcDqnSf;YxsMQ^xbB8{OWS?NQ*8Lu(6wlpFc@CA8)tLoq% z@d&0v(;_|)GX_0gq%0mw*ofkOrWB=kb5@GBN*XMdih62f`n|%?Ea3eSfeY=t!->oK z1iK9M;KbS6LLFd(1Tc55Ur)UOg1NgsuLf!Isy%ghjP9&HyR{lXQm<8R;plOIS{h(- z_^0q39!SX07!8fE7Z~n1jz=_dWA;w+Tds9$S)Y@Q=<9I9I!cW@eTcB9$YKLC5Z3|q zoO+|Te@ecPHEtMO$h<2)>%{??Kkyganu=Eii4VKLg%U-BJFD77FCrshiNM0yVz_y{ zss3&=uX=vK(3q5^%V=3`?Q&{#0vLP`9&mR?p4#i|=RmXE#$;Ze@qrqoUSsyU7zsV` zkH*kAZ^qry)VE0A<2ZfN6J_@Pu0pi3vd>{JopjM1TJah*aqh`?is0^jJR$2nwk>?b%Su1$}QLC5$c|Z(fHnG%s4>L6pQQr3SuyKrZ>oRm}t<>+(A%QAi z0(o~i4=pySw%b1H6bhkzMvKO2Zs8gWFPtBhBu zb{SGyR?^iIwoe?ryCkn61E$74Im1w3HKPx>EOFOlJqOt|N~sRa32hjH3&?;Z*)N$w z27CLK7mTx*GSi-}UL$lK7X6eXN>DPOKA$&XU@>D*wx|G@Kd96X%K}KHuMPvATB`fQ zQ>y%t~wv-QC?mkIs$l=ARqSW7U4W0mUITENVhx{p&6stM_xNA9Fz|T@aVKC ze+$B>>bUEm%823)A%yfGKdor@a4wE|f@F!tl9X4O;IDKvJqs0Z$$I@G(ZZF``mj3n zZj1s=Ye%kfvl#+zSA31RG1B1#JCpXNU@%5@?1=t49Hs`UQNb4ZUUgaNY^}__ z5cV-Rm-soZb|GD2$&iNy~JTH;S>8v;3))Wen4Kt|Z^gK>8NrO+KT5 z{YsDw*jU^MsM|a>kPQ&K7zDZTQEHt$Ew>o)IqNc=jSsHMu6n_s6KT>+dD%fB(%LV~ z;-8MBG2!NM1jx21%@>ZGBQ(Va#{B-$BkW1#5B32!+YEqLyT%?9zb7M(6^t#B)_f-s zA4o2EOIv}Z)5)F(g64u~WnoA4_N>C}UYqu6S-hg%)on7X`-9Tg0CtHaF7-d)-aGtT z+nN-zrr@udvhPjBgx96!U8qXx$&P=rAU=+w_i+`BQ?D3jWHDNcQSFv~6H(DMawUpBD`utz1(BLw z5L}__ZPq+ho~8HuSs_aF3?E%uA00O859KiU30QB4rT8v*+VxK(AN(w z4~k$Fb1XxVnJyl)XYN>_9^ z+16-@c4!(YRIZYKmlRJZ7Y2EQNFKP5Qqy}lm>u{*yshrjB*(x%_j3l*nlr!d3{T=Sw-3(xMW7@J;1{WI_ zf`@_C$A--*u|(6OIN9#siknHM6C;W>TgD7;wv8xcEs-8I)~OKl(~c@_b3S7*wR(e? z@^rSDXuY`Xhodww7D~mK%#-H#oXq_V;LnVP{aBDVf8$=QULv*mC&Ai4Gyx)WzeS7l z0WY@jP`W^R<4eR~5WB=tscC2UEJ{vH@5q%usNNzn4_R_K=@IZr!dtXIVMZ%mOe4;Z zW2_4pyu=^mPj9A)lIE^Jq=PCj^fG3`%GE*-?yA?|7Zk{=L*yGqrhe2!g`;2fh+MMW zdG6*k(0y-?sOI109Aw4C>42YYl8yLnDw$~O_IQPymN9D*9 z)^qoMBTL`(*>u#HghZC@jmKw?X{^W0g|1%!Y)5~-*RJ3zkc8-nEoe672}cV0``8M} z1_S*&`>6R|6vA_oKqxTL1LJL5z_?9pz8KX$k~)JFo09mdEtFZdADMxfbx>V1j2S87 zL7Ran1GciB#xR4BycZn)=*aCJS`r55uNu-VCs^L?#oi*MB@4)jgj8RcM5%fp>a0$x zCVQ11Fze;iYi^J%iQPCN2_}^sh*mz|sTX~Op|)+Z7|4Q2l>N_~W*K-~fO6WCcGP|Z zGd!-)(``>g+X6Tgo(FiOQF~6yw$vT;`;>`DMN}w#v zqb%_At5++yIT^jeO%N8?Rq+SebwFCl!xZbR?yIo`li;{6ga=L;?g)>hY40fd0+Gmp z_h$F;YlH+OASl}=``%5Pm=hua>dROffjjjBUtS8cQ8xI^Z2c;Z-peUGrK7Rkh7Z=i zIqlf$*okS4{s}~VE>tei^t8PbvpxiI!C;j#cq=kBt?hUWM^pIyG_(a|S_&Rt!*Sz7 zZ>b@gNf6^f1*HN%P+KBUJMy_Hx+C9)z4{T_3~H6VI!S?=91%}wp7DYf;iSG~|H|8O3>FAPC6`b#B;e>f>=XR`mz z)nPbrN4WFt2ga=4-jJbtG`+vnF4rtAS1rYmrZuDz%+3h&K|dL)aSTouo}FH>Ar~+5 zAy~;Z9{Np{KrMzwEyizHEZ_+f{gZc5=&T4@=Uk_=N#Rgn~RanEuG*+^OooX#*>K)(a^+4vm z%9vdcmkiJ<MnJjLYmkJwKQzY|w&dOoeo;?U|HYsnk ziT+CStwgp8Z#o5`i#^6+_fHMJ5^6+P4mpZG)y(nleuV1O8*pU{7r*2UF<_X)>ajWq z@kEELSieHH!sS(-h8YaRU#l*OVVzo6Hrv@x#%p!iec(GYE2U})N?gDHuG$5Y&J?4| zlp!vhw2j`ULTz+OAMN_-WKBPMu#vG%N~xA}{*GK@&>@uDI9z%e<+mY>zL6j25y|=f zlW{v!F(e`f7Z)x(usYnMQKG3zq^VlQa9hpITj(jz;M9mnrxxpUpcJiZ(a?M%-($z} zxKObJbu+7x!;EDT9wL36vXx7u4*kQs_ppClf2EVIbNqLN9>1+CzG*}z_T3mx0jAGt zS}wZRh*bo+L*XkKNeG4d^MPoXU58K1(B=7 z0MFAUQeaLoILVy;Z1J5zuUNv2cVnjJ;zxkZXoqWR4d`(O5#_i0^M)1jl+e+8Kb$zM zsoPG?D1!=m(|IIOd#R4wUfc895fb!Jm*K|(fp~V^mM2h zAmNNht2o6LtWyWQRVK@~=1~fvMpu`iA?pBEIYO1C-V5jazC)nTZs1y!l@>X3#KN3t z!qJ3Pg3)K=>Rp7_g=wYSi9u1c1x{h>HhuZ~gD#jSoJ0eW2{ril7Gil41&wfs=^$ry z!pkEutCnVHZNHH!0gZ^?Q6B`nQ09?v=TWy3|Dba!r) zzr*@=rT=SDPrE?HhBOq9#sM(LyZjzbzaa&NM8909mi7c4xzR!_jGhvrNceFSE%wc4 zr!)=;Lyho((ajhZiK9Cu;=9)KD^9%PMT4(3?@j0DpW`cFFBr_0FD2~=jQ=^l`uo!F zp9V31Z-)LD#MG-<*sL~Se4M>O2pL6JS90{=E8#Swh3V2(G%9H)S74G8cb}p}ts_URz-}TDT@qUDYb{g`H7(MR<&x?hDCaf&uNkd+-f{r&2|7WlTXT=3P-2+xoTY8X} zp}4usRDBU2?UjN6604<<5t?kB{_tG#x@X|t0y?sv8|82lG7qtl782r3MjL?*26*wF zckMNi{IO+!&1B44IogquQypI28Z#Du`~g2wSVGfiF|zp_S)C11C{gA?v)w? zVw@>hq&O7=F@L!pN??GW???z{o+17UF!_FT)HR>6r6l*VcmIh{~MOz2OOv)+&EiQ73mD zHWeHGTxVQRj1`c$f#$z)p@JZ0#)y z-h*%8mG39>q{!f4mk*^hWD=N^F)lLQvF&oIfvOj@>8UgymsA%zwUl`K(xsUk&+KHF z=r8{jF}Lx28~|9o^!cptarIvi$*O*_O?@|^>!v{6Mfv+N$-nBN@kIhXPq^H~v@xYt z1n(094{C2eu~jJFd976kP_aBV7mgN{Dh$CqhxirAoAQd4nhS)sRV*|z=sB+9;LW7? z9=_G_F#snY7Oq_5rA-H5#8=@^H~~*HRQNPCYR`1^O4eLiV(^Nk$~J8znxcJR-KhiS z2;nMvG|OAy$B%x>fl}$7VUQW%L-yU@6Ip3Mk*pu#KqZvL=Xwt2!zPE1h+GE8!{^Hr zVrF7yu%~|a+XShob}m*TzHqclLp9a1Q>V7rV}FgQhQ?7D7?xtOkZsRmVHjLH9fsR~ z?^{qhd%;oavQGoII6y3D(!`4TIyziJMYc6hJg<7{oSXcl$8GUmD@4V#Y zM@r;$Kge9IbX5Z;aBiu!E$TI*THh zL8fzz=$O{_HM%QN+saoAJ1C|$()}(!HiJzIF<8|nTwNyEuD32~;nj}*l-7Bs+f+lj}4w)5je5Df<0;69uUBh4TCro1ZTk693(Kgt8FO<9x)^hXsS&E zo{{;DdTmbZ>Qnj~toal9Ropk>r#_H9F}VC$?+Ro_z{>WF>6Nf4nI((FEStvxZ# z$ef@a*>z$ZIxclA--7cE-Q&y@r_3PHP3<$AA?ZwAt@@Kv!y*zkcF8v1N@0;KrD+_- zsE+Qt9A*sCA|DyO7A3=coQEXOdt+U^I#-zTp`NZMP>2Vgel}ziyu-C?T`Va@it|PbFFRld~*{Q2d%$2zNV5DR$pvA;45! zb8lUAm)oanSS(|z9_N|_lK5Fp;YTnAD`B3gzXG^PE{1@ueT7EvT5$=veOhiL^E8?W z6Nf<{8ny=;4+L;##nz;IvbSC*hEdq|wf>j1F_Wt;4Zx<-;>CznoA|XoR)6UpGq!+P zFExZ2la|;OaTp@NBdtVu`ig-BJjU9%d7y|=rj}&=Gtcp>qcb4XWC&LV)Gx~6(142um#+0}Nr1U(hV?M%63%Z#6*%rTA$i%_rLpf85Onj68=!I1tWa4oICwbrC-JyMy!Xnm< zq4_g9x24)C9|59O>k(PfY@yX1NwZ1G+A2f}Kff2}impm}h;G3JhQi)0=nu9PZ$4r4 z&YZV~16&4$x)3ru@xi|{J$>Je)C)SR%;z2v#fHLrJrw93o!rxe)ncbr-A(&c6+R0R zFFSuaUUoLkm%Qi&GCQ264d>^gGZn%6#!x5Lq!S?9?Sw-Rr6Tp#HZZ-jXR5c!pU|C} zjV63LQ9%pj7;;X^btOs~xlqAZFuiqYr&DtObo;6!Lp$kZpEZBj!Vx)I8d>}8K^T3$ zTVf#g^3^v}`|DK?aWg@>;~c?CDjXg$!5Y{BP!tU4F&0n6E0VLaiBkF$d(vs^3^kj+ zo?#zQagNehKWtsJv^)RS-U&X`evfc0kkRuudcgz0P@#U`;;-P0T0TTdC-~x+I5*THPNvZqpnx4!IL~KHl$H zzO6qA3Gild8?g=)863t+Z!kM(T}zH=V%1712*~QbhE?l2=7*0tF76kjGaQ?eAus8) z8ROaHD-0;E+^ImuNi7SLxUP=D6KCt*M8sc+tFn=j$a0%YnLssbZn;dKX7mZC15)P+NSy#!3o5QcCzRSg}F;S6!6xj$pG zI>04H7G{1%7Q~wl18oGT1WsuXv3FP?=`J~fQY38{E9|ybMg4pR4U)c!vVXY|mCQ(B zu%Q(V7uL5rz;uRex*;fm=3XTeV;xiXa9Z?B+eaB|##T1##*@bhOV~dpTv0rWIfiV) ztjtOt&u|zHkYM88VW5mHA)OX%ft)V_tWKD@zL}aP8Ef7S3RhNPqQ!=yciy(~>$uo= zl5G~A6)U8&*Z3UnSZL?Ep~=u*{0G}`bX~JwXF^oak7D6mpShwUz8r zy$~(=1HDRSk^gAAMj-c+A9V7d$y#T&Cln{0JC8AtajY6_!JSsX#A$4_U14AfymAD4UQwg5CsR9>hVUYWZ8n2>UwSp>#!l_} zXa0@QGR4m6MSli#-o2wGIi%5-Y)twEc(h zpuqfIjRHdrW~G3Jgz@14wCk3CjM;3}ehsb@r*J;63u9_y?18Jqd>Zaaus zK9Gy;&9^O2wo5>;+r;$5P9>~e_?}G)Zs?-_kFswJvaHM6th8<0wr$(CZQHi3O53(= z+nJTlO4sE3_RM_UJ^fA0+=v@-BJTZh_Bm_qwPURZuYJ$Ys~`-B;s zf%aV=7JuenZXM$`by*2<^@DJJ;K#Me)^N8V8nILEr@`l#$JLBf>WHFUG8~8U>MEjl z#Nq->JC}usodCq*3@KnMB0sn9@rD@ThByj~i;)G!$7~Zh%@ZM|8f0Ro-Oe-dNtWN2 zcmH6yDhhSbESTVmxG5arUTVyyiTN4-GiLLT23SjFUo9kF%fRnSGowhe$oh^}>4cmW zA)oP6{Myr<{5%z=bbA^;GWvVu>YT|o@>^7|P_7EG)Z1}kF=q&)3sWz5h(n}odzroQ zPCl;G+hM1JWO80Fjg~%&RNLtDa|6j4c?&w(+gIxM2g+F|+*!t%j({xVW$9qZl>BeW zouEFh6)X9mxi)#D%~MGLAT;*DZB!*miPrncr%{#LuCcra5EH!T$uIiETr@k5&g50z zlp2y^(ZWf6H}#RKzVkVyC6-`SXbzk!Yw!up6rqX0UM`bBC8;s)2OoQ=M???UMrJYi z<0s%6a@_3;oxHp8c6Rd|}M)s2>(R<;KtM7cdixBbhuK@rwxfiheU(d)NWCt=yw@*V|G`S6})VB_MJIr{S&_X$+0XK`GAs5$}%cs)=VE=U81eo1hHhhkoS z-~3T*`sV}huX>cTzi=b`&5=WZ{pWi0?|lKB|I5Ig_OFJ(UtI6azr^u-4JSZ?`V?wm z<^)rK6e%eYnk#~pZLTC5>h3x&T_8oi`QDz_E>~->@Y>PcOm;g{T^TYHg=DN^;TfjC zHIEZ!P)vn(PbZZrVdAWZ2eh3Kbg71QN4OUUryFY(!K0beBu4kEMTeV|al}w(JukfMAy@IiAyE~FxHEu|081lD z<^h@FndYE!14zk?xNmuoeh(1DSSM4RGFAnUK?RemMa~RE6@T{%P0)d)48u{WGl~dQ zJX6nX_8|94=?lHP84b+Pv*lTHPs#NJ1O56{J`O0^31sb#UXN`CfKNn(h)O{xwi5iuzPJPaE#JrMX zc=@TX$y=?9X%>*uFHH&FGK=f&$Yg8ePGUW_fSkn6&gpl$E99sQt%%j8k;Aztdw3Xj z)W%MKTydebzSPtGRK;q06IlrzC<>Ny+s?%+e5S*-akZ6;;(z?mP?F6NqhFHN-D!Cc zjN(^OVPlI?=#{||sil#*w`n$<9u3p2L*)@+8QcF{*hSWUUAbYpx)VKPw$pw3rc`0~ z5;f~Tn`xYBW1aE_dX1{utG`K-pDjA6+`II4p_EX6(J9Qz$?^8=b6-g=mv<6riJBjx zK?3(+;P)(Cs;{Rz4z@LHB4HjDYIggZqMzi8;|NZPo6`!OLC%JI#-{T>4t573ik zQx6GoA&z{sT2UXvK@{Aaq;&;9{D{#6l46mw5(&vLr&_9lSdo*X`6j(SJW;+HPtM@g zp=h%7q#YjQAnVWH`Gd_5h4b_c3w!++=;XfxR=#!h{+);N4{4!)9Ogv+CzZ*Jh0ju% z`Vl8_gxU33kiTvYjh#;F0|KpGd&sQu_FEaxAqb##jl%TBbSLi=stjkTbA@VdyhiYBE}apz%3Gm$XcWTwoFC{qC*8Ag9?PQ!smbER!?zOhmp z5&`uZ&I`c|w`_}FYI2TDJ!$l_iV=(5Oi5j#-d)2q2yj3VkDlub_}niDE*xjhE9YSG z#Nhf5TvENiHVy<#=F__GW$k}||LY+8?;FQ=xADJO_+Pt5%skIudO{$3?HnOuX9ED9 zKfd*Z;1^c$nk5NGQ~1L>51W9X5UTDTekT)avTXt^Y1FIjFON@%$1pf_(ih||~g2L+qV~$Mpff_Q@ z0ZEX8!v5VA=A&E?bpO7`sPFH8{}TU$AkyEAwExLW`0Gv5M03Fg{bh&tg8XOAbpJ7e3$tJ>msw z2y6GZD(*W^qO9AUi?mW?e>TKA|DpS$l}vnCj{6x|rq_>H)A`m}--f1zI)N7dq;3bk z0yF^Us*WUOvjsgc+aX=0(Vyw;=%ubEyvq3zp!D*(z1X{Vw~Mnh?**;rjid898+#J} zyABGl^U9T(u&enF-+x#A;js4Uk?DXVs%@r28X=9sABMrULp$#4Z+P7E25{N)cjapP z7lnj>-@yMv?*DTR{gwME%HOIQ{LtU38n+1Y!!2gy7cF6s<*n0j=@CG`LNm+{`W7tz zbmwLOE3%4rVmrFGM) zZ?1`s6|wUnN}_0N+fuRWQ(9w=Z8NRk*k~l`9rM!(wwUW9?X!@Jh=4UL2+7qvg{r<{ zewik1a1jtG^XtRr2WR7ZEU;kA$(a?H5_;K|>haE|t{=H@$5sE(LLIpPTQOIk(XlWN ztJOaTMuStmJhyQj{iM$`LrNc%Q~YcoGk<{#pdv8$x48mc?B?nRxNb*+JA;UB477G( zZ0Tc!VunMj7tqhYAiXb!GwHk+f!rc@r;aSv9~HY$e8M7N`4Cm2j>xlP@#HT40EhN% zU(pRuKJtqZ8wJrR3vcFFJH$~(s>*UihrNKu*9R57ut znbWoEX7nw6Skq_pps8--2x-fy6DlqfcNHlJ>)de}%C8f4wdT_&%;}O!6zvYP%MJGR z)*~wuIt^Q`hwUEdc?1Tx?YL#%A5ox;iue*Q^BF;>r1Efe-El2J`x-lok|bC^`-0{D z@0~aZ5WMU4y9ToU3z_i$WheeFg963|_RjxHQ!hkbM(SI~#%Hrsrnjlt66#=B>q(#1 zvjUtDJVYK2rrR!2pmjxxl8Q1k>`pWC!>EZneW)D&b4J9B+ z9g~BJGfujO;sH>`8EukHXd{GZPHQaXF_qEd9(NE#WJE+~&sm72o>9*v6mbFY2`h!% ziAo+PXBH&;ow*dX!rX1IkYMgfMR4(hg&1edUINgEFXqURwz=Vs^E}-w#evE1J=!RM zlmxnTE3g&A#*s|mO>lfIR)Gl>61vqM81u14TBDpr$_Zyas3GX_%cZLc%weW)@~-lZ zqWZLXjg{km4eGf$O0J0)U3tzxi!M>+s{T3|_^N0!ck)o5rib<=dlR`M#9rRFCIt1# zLH&_yL#MF2Xvm=-@8j>}6@&SdrucsB_}>Zq|5dpE;?e)F$NpFH`b7UF=?D*O^^T%8 zfMuQ^9h{Gk*S1DwJX~M>z#%C3$`vaNHI3TIq_sBv0qmjb`;)m$MqX|um34S8ysTnC zc3h+;MHGNGH%gG4n#53GL2__MPe`Shx2u}v^c^x`&tUqu#dN|TvZJso( zEUfM{`zs?>#i|sk5CX+ZR$5nDT0FHXtCy`R&8wdjv}z;U%})OOo;6L9$Nc=Am-Cl{ z8^^B46!omn>#f2MCyO$uK>AXl-HK6DmRe0!IxN~Xh+L__G!QcvV4~|rKrFg>EhJiY zh$O*&;W`e4OG_E&;l~&1KNn}FJPX*@kDP{40M{uOGIh)8_DyO)yEz}&Nb5Ns4pVSGlV}{Z~5Bpu1#tCsSV{_22Aq&<)KDq>iBjdDXpBca>u*$@E!Im$ zl_j^qU2o=Abw)PysHwZtGuEkvE>1#qiyyux^fYDrlp-FJL3c8WC5m8QettXQk#stj zp)kX?JLBh=Gkw@27TR*m;$96k_mT@!8XYSkOzWCK-7NL$_F391G4153lpIn*q+8Zy zL#1_&AqBD&cMAsl)9u6BmRI0hCRDI02Q4$jgk^b0pgKPZj$pAaM+}WtrAj2s7%{(6 z1WQ&%)1nPy8xX*Y&awc;-t_mN_3B)egbLe};MM1l{Jq8Kn~Md$oY9dj(m=JML3f!PXF zgus2D=V7i?mwK5`u~A5(yLIOTa-9js40(rA+>~FWUvj@=x_L!z=BOh1pX}jS;L{isviE zfgml&2Tw9<^R{gurdl@U#*Y}O=mcDcN&wo}K!Rf5eISD9&F=|>La8C%FV?pgQ*9wE z7-6(Ul2|Ti6bs59CO0# z4n19+_s_`k38Uu+;p*Dkd(24WjPxVx?{*Q6~yu~ zGYd$jYh*;fjfj%w*TP|SzpO^o`k({fH=;jOd?cZ_I>BZlX|qr#Azs=m0>3k}GNqT) zIC=)UwLDP0W%xB3P_3<+7BMm8HA|7p&WgRXI3}!iu7v%@@+AtHtkGjS@nl)%E9G>| zz%ND8GtcT7@y}1q#74fk+k)&Io9P|-R>$&U@2dTq!~^CIjd*v(8tp|6p=lk)-#_*D zqrWX`I7+_0S6m}8atshNEkX^5MZD8I zTm=qsOqL=2aVfQG79X>CmMM;fmT@QJ`O`e9$Hi2bfilwVqI$o@-b#Mt1lkea^0MlO z4nw!OX#yW%k|%=MJbl{qwFm))O&2)=jb)7O`PCefX99sTLY~8bX#DAPyi^f%JI21= z1u2^a?F6QyE2AJ77pjR=96CX;(-hIf{FqR?wSW@9S4nV15{-*!2%F`p?PQ2qK0g;6B!gE!V<{hFW$`cY} z$`g)0l?Fj1^K&hJMaahH$xa2irg!|sMp%A}QEj~7VnX*S#seg4^Zl}Ti781#oktV$ zs@>D6KgZt$;aDg^8G{^cx{_p9&!Eq9XJC02a@UAEPb{5DRWMW3yDwM*$2BpSqM@b9 z(OEd84wWsM_%X?d=G0e}8#(8a1(vN-L+c_bL`12nGIggY`MiR^a283DFk@2D0}5;U z^{{@zRV8;zu~aCzrV%uVK4%xrJFXvER9PIPw|CX7?{)>CsSc`{JJ%4OlpHRpm7o>WcJU$NLLxglPPg`$z{7`5(-uw{2V(v(9 z!*wGmym%2Kr{M4l#^w;ri$b?M6g`+(Z_!bO>PbXG7RZMEsZ#`RlgQ!p!q0@)c7|Bv zAZAcFkrB@wgp!s$v>jX(fm;wRs-WS`uF3VNFKt?4h>?)4k$NGKo8GuQZ*{xi|5K`H zvJdsi-fw$uGBvx+;>cuNDsA7xut^Ke>6Gbnr(2* zlPNtLoGyJzVrC=`i1y`Z8SF3u7Tbdq1v{ZG84=K+(OknLxDQoR19R3Y|jf#fT*1{jl%bJd{HJ3%D* znl(VC7YBaxC=QZIAzn93Dpm5Yw0mW&-fojH`buk2KGQUue(e)&5BLXAj??qEQ(FF^0@L=++XsHj=a&w2jHm zv4-1IoykQ^CCSI6o60G4$K@^*)=V@l8Imx`g`v_VpzU*xFCLGOAs_?ojuaJPO647` zQ!8ST@66$Ps|Om`5A7_CuH|luLkxF=c6Dk7rMj~>ZLIz$1Os0CQQ_PoJV5H zzC%Z1X>nzBjlcJ-i|WJIuh;`~Xgu_If@>XiS%Pn#4zWCTFGgG69fGt=;QnZsNBV17kp~;1JYzH(177mmALQ5V2&AQ3xkh(8~eN7rz#pgKszL{o5&cx0EcDTvNo~`RuBm{0h%u8Wp7nk^o?y=2_{(H_ai~a=v z26s3Lc&R7`_pyU+L)nUzbVg|C* z1{c7t*HnkS{WOSK$KBLr(57PGtg^}Lx`8cE&t&@+eW*YP+ff`&(=);3iJkkGt+6Lg zq1m3#*Ollbxa2oNAKRTUhDz0h2i?rurrh~f5oq>zW*1&s-Wc{aE+5`7F2V}0J=3K< zoYf6#=v{SH#%9}ZSLtCK=$%gVF1JRs-wkNHlY84?pu9*d2LPexpH;8CD_23*^+9cs za$CE72q*X8v)sXX_kMDR4jsW^OfS1++9qko2>CSsL5o@?7o zPE&4FT3pCCW&K^TlfrxYkQ4pgERrC#Ut_DrxjS=m$fp-t$UJgKQ2hoU{~%Y&;xske z!HqaQtSWx;Z5g?2QsT5omUS^Lx5;zQdizJm+s%sWrshnf~gx z)+(t)GikW=JJN;R+L?;9js9)Q>A7bbnqbTBF}0ilq-K_w%{!B&vB$dsG_6Yk(S=p( z1h>(J;Wd|SJUCd2X3RiV+l|FBLcZfcmz^kKDu6nhw;3g>OE;-n;C=_W6s446?Uhg~ zdMdg7oX*k7NF;LDHEmsMM8|lvk)hjp_Ii(0+O7|U}?-D^`#(QRkgr+G-v@QZVD zkTVQTky@oj$6hLEG4T$(R_NbJ)w@mzq=5{Q^T8*IsM?0V+4b)dys&aH6r^23!0p{^%$H2=xl@jL)MxNsdzeOO`mbb z-VjmxqMcXNe>{e%@8$-305uR|rrl=mpHb$z8EuPZyO8d94sJ4FpetHhWi%*RD))Op z?QFe|pmmN(CZO67-rDD-YeH95cP!;R&C3BP?o1$rntL>n9!ff>fQPwihB>kh(kk%N znDjBBae}sTW8j8II755Q@mk6#It~+?8b>eHfr%M!&EmX`*?5ch-+=j z=n_HBVQMHx<8d{D$-u_-+(xrWKX^i#JXHD}dT7Z`pX|E|AGrB)FNX2cc@8aN0+rl9oJwnEKVPZgiy@YZkiX7^*Wp zCJEbg(^%(*+_)xuGazu|fbvI;_VH_E|AL6ROm0s6&ydI?#l}l9l0j>4ZqE?TM^D&n z-fu{-w_qf=C~0oWEq7^ichTs6C_*qgC^%iDc6XiVL5BTdFhg!$RHR!t1%J9>Vn=Yi z_Tlm)6cOc#8%Tx})2K!B*mQm=VT|P{M@=%*xsbv@TGYmJnW+Mq1L+M)N{ce~s2Ze) zbFRWjTlkTH?(boVy|{E}`?hM$whR+;sfiUS7#mjF5(Cp}&yTou&XGLPOCx86kcnQV zrD>sGFIVMyeNxz$mV81zM1R=*3SJFE51HcG;sW#pO9o;6;GE)szh}b%0*~+BxqH{_ z+ou+tK*!x?eCc5W*TP74%i{t;jX7lH4TFY zOwq(Bz=VuP=Y|%=9xAUwMAZp;1E6-Frl5jot1QXmP&}6e@2u zmw?RZaO)rmi&{IdT1kZlW4hb=36b3nEs1{6a7S>ja=F9oug}Mzj7*7;u{74jp{m_Q z3~fer@m8cv8+UxAjo;cPH^}sixVK>%4Y8n8)eKJ`aBdOSjM`XNZVtQIm$d|F~g9sa%b{F1?Bpb4EkENPK8@hH^*b3MU@4N+bVB10dy{B^rgm{4K7=fqQ@`B(o zF>glz6TVnKiCl*zhBljzf=$+79uaZgd~z;j}YYN|#)RSJ0(t zvP=GrzM3=f#XAKrV_E7YV-}7IzVekLFOQrLEpu;cW>)9JJ0wr6x(J5`%P>OM+b#Y` zj>rWj@nTW@5=V=1v~pyY{Cd`6M2#$V`{1StEV>KX;ta2SQ!WbDy0V~!kJ zy4qy(#R}%gbg(zt^ zG`VbtBMq;(>l5xW0_94!Mb*k6ryZSo%>gmeAF|pb`tY#B@v{-7O6u^U)slK{sDXWf z#Iemo{AtV)-;{I1icC>W(z(f#dO9YK>BOzcd*PD7AdO6tg~`%CAIIE1%JX!$ZrNKs zwjQ7M1a~$m(M2k`{r-uQD{hD6F+wboiR=PX%E8X&zHY`Vv$kp#*Cq8jpFX^Ktw30Q zaH)qmw^&Gyi|le;s*h8s8zUBT`aP`^W(Io@bjcQ!`WFn55&jtknt&LJ`?RkkeZFMA zyO&+wU*5Guxls=xh&`E;+*82=I^ptmLPzEIBJ^kq)Cbl9{z~0+h-!q#KrW&@2vy4ZxZB8;1yCeHz&* z3+Wh%jVMp}X}r&lB>;~?Qv?)4{aIs>$oqIgP?Uz$Ad#nhh*9WOMSJ9LYo{8B(~mPM z3NCIp_Hk-;L|O+rs6~G*eKXkJHeT-Fx#%<1)4$?*r*i$&>adNpA3K(zUvXwJdm!{rQ0sOLsQ+GSG(r_Z!igrNA8OF62@O@esfn$DA z9*hBGRw%C0?}4vhOz}UU5nn>A8S{v)cOumuUpx_lCC?N7ca^dx?^V6LGwIAIGl&n1Bm^bZy^IQ-M7f!%Lor-`~F zn~W>Bf5gFGBwL@y`#$03QPA~-10FDInZF#i{xZ4~e3YMi!^8xSfGa%=afc3i2d>>? zmfxBUz$m#jW#{C|%J$*O`!I5@;F<6pRK;j#Nhl?Tj_FiSWBCA%faZj)fJog14=Exz z8~DI~GCoKmQHLE?kVaZiuR2h{m2|Z__?;)vNjID{P+Bvd@skResH0azXEmtEYMRK; zt=c68#yjQYfOT6YkcvM(rIqr{P2q^fuyFVGio7ugjNcY-og_@)BL4s*;aJ1N_{3$- zm0ug3;Q{h`2NGQML7pT2Rum6%2fF0u_r<``n4%AyCvfsaT#>D*IzQ*8QkmZ9Y0-ID(BM34h~*-Z z8V)yW5CuMrDV;J9rf#4S45;{dkG?K|?pY`QD0nKYnNqPt&;oaxDEhbg?oxnWI+#Re zvjs35U~eZ~CrH@23NxYtv_VtBqb;N$dw>e4Zc|mcn1{mMRfat-cP|xcC&7v(2J{Gu zV4X3akc3y=zI+ zLX9fO7YZaHL??%0N@}&mVaU}Bmqr63ug_pt9)9rD@@K1^Z}}M8VyyxPIRG=}WPo6j z!FB?u^nmL{O$_rKpeqwg6j$bl;?+-$mlZCorJU;1{i7peXHQ?T#db$PDM}LiPeV5+ zG;4Y{ZWq!Z`Wm^fCVAyee%V06L2Zt~4k*chsAYe0hP@*+Xl?p3wOr+Wg)79+I~Fnl z*{vn6(Jc@dP;x{yRbz_?N^&W%1i?ZiK<;5t3^Fl_BaI*agBQFv$u^PONF-7Z+y{)H zh(Am*F}>r^$cI0%wEKI~hZ%~E5(=I_y@e`yj2EAWnnyI!Xc!nxN@)YbFGL(tMnDwY zm?!Hpcc3;BQu`wJtCBl}IckZPLxF~YLA|3(#S*33VHZG7@h91*nVaa_l=o>g$p@cG zX_&A2Z-oWS8x+r8$j!X2p+U~wcOJD5p{-(0@zS--6}Q#M6-NsNN$DWrLxbqk6^3t8 zJf2^n#CbJ@v>=YkdZTRTw$ZjZzD7s?kbhCE)aH~Ijn&E(vk`GIkdrz}M=s5eaK}O8 zG#&3)wX}y+GT1(DvPlWPAW5v$zN3x;eVFp_3wQ{1C$?TLu|I&ZBcbt@p$!@Hw@oNR zW$JFGa;Z--TNymmW)nEZhRiR1Ib*!=$~!>-3S}4q(tdLo@Z~>Fx_{nOwu3C-yQ#8r zh16ErCaLm?A<00p@sGk#rW$VSk1NCUSqE|j1%FHwiVhPq;eZt2^P}Pg;mE-nkY4FI z4Z}E9;rp#Dy(ks{uUXz8()jRu!st7Jv)c*;1$i9Vwh7Mn76#WJaa8R_Fs3rsVS%!v zvm0+x#dW(Ij662EAVgN#h?KODM|LaNgh3C=i=eF!;8#^gro7UOb&d$?1C!IG=#VPx zRFj$E3!^&=5VPK@jDWl`)>Ngj&K&Z?TvwK_@CA(bZ&{{W^-`DIkcf7IBZ%Hel5&Pp z(_0d|X$Uk!G!cd=9z01=@(YK|sgg=PI9F~ZOE>$jSZ`*r)C%Nd7fUS&zNi_8Ac)CG z)JF)z&OuN4qok>D(9qf0loZTRsiA0Xt8?AEbRvrVY{M00;Cvf2WK}KWlL^T-qhvrZ z2v}H2j0K2gir7$(Bz8242@VV^6h9FE#rg{ww4r#VL`UVMvC?C~B{6|!IF}TxImzoy zNipMnDU>%mhBsRVR&4S7=&EL!0H-OS!OK9pS_OO@5OV30J z&d7W18ZzT&VF5TG?1Riw-;E-*2M#}{RH8&RDr9(jRG=;DW(>nA4XHnHIP!iL9-M~O z0!{#)s-~n({JOUC{NR}}o>R%F$Gz67_~SEie?+Q+>xV@wjr@@d4X&-=NcHN{p?FO4 z;X>@;i=w|>GW)O!iZ}%<jHJS=bCs0l+qdcodOnQnu_Exo>ognAxzv7S!|dT+*YT`}SwHcUq}m z%%XMf1}p$`$7CR%Ea>zmUTSNe%{Es~*;wGK%@ciQw!vEtn)2L{Ey>y#cFGT8eI=uY zZGAu!ezRb2BgqTz7-$@t2>@4Z|^< zBVy=|z}~!ZaqJi;8HWx+K9-EvAU!U{F=N@-*ts$jI;AkGn;ZjcqL`~oxc9p9tLc|Q z0ygk+8%JPL{`ef@iU$lx;l=aV@A=p-{$$rs5_1!BHtOI`!?zEW{kuI~YpqZO9*T7S zGKHxH=8lJ;q|+|7B2S<`qd@tt6BCG-VjFb#mabH~+k2aGf5vu@1H`Ddn73p@tWH|;JxO+b0wBs0%YilL*CRHcb3`s5ezQRcH*SaflEHmeEpYc3Qy zxh@o2EH^cqNj2AHv9yA2kIY4pi;3pFg)ykiEiP53MK`#N-`e(BJb|g{QMoH}4ThYY zbkpBSwOlz}y2g1sQH=InBSEE~)t^nVI;~gs52ZvFs|Ox=*Yi%|3-qP5svFjnobvks z0vnyc!6WmKF~~16xGM@xlx*G)7HKoeHXaPh2froivC#@SEGzYl`xM7IxPL~>))xa)HQN%hRu12vi2r(HQCSfl#T||l;H>Ss{&-3H^Bx$+bU^EHF ztM3}O;U{mDQuTOBTc0aC3?}b*pY3vr8n{iylrY`eRMs{QvCB@P>w|bXdOXTys4#>| zKEj1T;-H=l%C-*O^ zi;|J^_R&QeG8ZJ;pr}|Ihi7+G8f>p&np|~jJL>Kl$J70WeR|Kc*(5z}$kJnX~ zi3t`%5^SVrspb?Ad0rn+F+NwHgu<<+QpY%Z^B+Qb`ms!ERHtzQ09`$+w0dKf2H>-S z2)H&X$C#mRjES2J(KK1b11TX_$5cgqlyUeKIEnbvgH6C>2vX#Ys-pvM4GnObwusfI zcKkTT<_^9JF*M}h?^L#6{QW0=U}@yg;HQVhF9Qze+(QhI??OVM1sxCS24y|z-D{Oo z+1;+o3214w!paBG@&`w}d?}=g&F-!*KH(<~uj%0y%=I70P#iM;b&Z1Uxq^{Y9mDVm z1})y)XPx+L`A!|RiD?Q>PJxob0`|T?8ABVNyo|*QMjf-|ykdFU8PoM8d7kyZ0=`}# zt81o^Q_|nVt!Uo#&u$*@hg`R%|K!CrrHrKidJ8GgHXvMJa_}toXsZvl8Z4|GA!QRa zyS_v|-aHItP2>gouE;6Cmx#uy{^a}VvVM$o9ylOtNzp_7ZQk zpQ6XM3ndKzZzSU`Z58g>Zg!09tRIfd=wj{Ok5<2C9fY(m zo)s?cTn=`^)#nph3UrnVY6jy5Cy&vYQ{DT&vt4?yetvzc-HG zbg6t#N!hYuT+UBsgQD+T{oov zQaLxcH#*@O^uE7{s+Z)GtLc*h>2aiEC3v(S*X3`$eYq$FSSIN85324P6Tj7{ee=fs znLb)Rq3HB5wxT7LJ&FP}PGpXS)WdYJdjztWz1fkHB^n83wPEYXpcZc4HVi}PrT%_I z1gL-E-qujU)D=hUQmZLp}?>ExJ}*o zM8D#5Vy;6gXQ0#aQ5H{Zgugmcs*Jr-A-}Bjl0LZ za#yta;GV__OYv2)J1katn?;a8{-$x=%28k1Yz9LoU@<62qoLcNKem{q}?` z{g&eVy__FlAzF6I{1QMCYja{+M3W#MgQ2>}x}7T&RnFjO8rb1eQG;fa#ia;)Q?XV+ zgiWTfKu(iY*iY%a&$Axh2Jl0}#r$&s^mKSh1a#lxEZHv(o{Tzo%dJk+T(o`Y3gm>? z{VV~Wy5Fc47-1JqaN>uP=rj}m+D{L#aC9{F7fF%QI$^&U>N;5_-9aP_6g-{%{ZtA> z%HoQMm|-dET|}Q`e*%fLo=B8}oMgV?i})U~PY6$U|B#J>#I_of;8G%!eaKnX-e?sg zHbg+?yP-PKKte+msQMukR^PzStTKHmPl>K%))2J@3DFx?*TyKnztQ1j7A7mo-!ONp zZ-a{eg1Y~EkW&4}ApJ+M3OJg%{G|!5Rk5`gz@S$*C(1g6$J7P%`C z*NWE!L0k--(`P_~QiiLD$xH26A-Yb{t|k7UqQS$*jL7>`7+Eg?u(n+2JTlGQ&M?c% z$a()fedq8usk#8CpTcphrRj?PbZxBa622Qi?eZ+6(B6G+r*j6z5QTd|m}PF$nnm80 zO%m|?h6`6;uR=eRe4lQi=kGgnBA+BpM56E}hGU>Y6AqqtR0|c!uTgA5k46h1h+Z`Z z9dP_&1f)tSq5ET2$Pfg^ehjunWQ8*XKXk{tH#n<=Tzkc8&1#fOCL7vifD>Q`(DvgX zbpRtklu8T3r|v{YkVA*oCmu##%R1?~cY5~{pc|H`#;{RtIT5Qyfig!Y;r@wQB!v*` znnyS)PAWI3WQy-Y!f{d_V_6=x(PNgGB9fpv${mffsvb0w@UCvj`2B_Ss$671WGf;M=|Ge zNqfhMW7T^mISo^87cEOqy@Zq-N3_A2Tw3@t#taZRztre(kMYgedn?X{_pjP%M6ehw zJ5nA4A0VQq_yQ#mQ0EQ7(_dcu=^9y&Bu#G5^^;#appyWEbdV3iLPvUSSs%@z6Z67w zfw%vWjSylF*9WGdk9zyl$Fo45Ki2(bj2a?E@#%43io&!OaS+*GH?iCs2d>yv@e4lA z^Sn|yPdd(xLC2@4WVX_y+(Iggckpny*2nrvQ81YlfBR5;F>;H=klH6SL{I^F+E z3p$q~YuHJJxac>C>WbMH;9nHk$~iE0gYU?#{=Y^p;eU$Ue+2G71#GqQKb)UvJ=RI7 z1C_}YbcH>1=G2E(p}t+ow^{vJk(EuCCQoELm~GQLvB3Odci&XXD3~}8;m+bN9<#I1 z6%UrA%k-YP-F~k-%{*j#-Q@XozyHvO%|hh_28AnuO_@2ttKp+JuR^^~h)xb^1yxQq6@C34`rjC8UjrBcX^MANk;@y8avyl~;+ z!-#t!@;>$$k}>gBT#cI+*>pQ4Qjc=%Gtn_9kaL3+wVtcnQJ^~Y{14Fr-#tWkB^mI+ zZ(QYpvjAEzN@x`WAhd)E3-_S&^-S9QJB zr|&^mSKUuv_r>vti3%wzbGLzsj>%y&C~k5IYcK>&+;L-&JfOfY#nu>(U&s6ERttv> zhJls({!gE^}<0jUgdFe=~>)Dr(t(x97ZO@G0lh0%>-HqhUQ|C9!>=G)L-ORd+ zl|^h{i?p3W{>I9U?ZJ~#F4xd` zYm8m4J4v-J2s0y3A?UZlmL9%uGlMXHB~{2>gN>n-K{tJnO*IjQe{KD|f62FM^_j%cwdh=$9 zO}5`~M#k^BfUz;IJt$E$@!i8i=Fz?MW0hxF6)*xLEJ4Fe#Xilr{sA}xq_z#iNLl6T z7Iy2%9#RvfYzMQ-_Cq|!qOh6vAKI0BU(O02Qm3)2NGwuN(3ki85&tOiTwp!M2zVH?%Ke9uOjh>%c%(=uG2 ztalK1CJj#8xpb {YxI5Z|#E!Fp-KSkWDB6elC?KI-S>MS-Hixe2_8sC7=;trnA) zR^EEM+&723Lr)rZ7)(J1_{CJW1nol#9UG$W|3 zpSz_*3)(|)G*}2^MKez*TC4oN+rL;(CXvTb)Ykx$hx<$y1mgY zrO(Fjqf%LaV`3!=><|-9KD)g9IprPWeNx&dFhJLx?kNQZVi|G`Y%`OjB<4V}o*N4# znxO{q7YHChQCqi|9t}?6lMf-$bwvL2@x4M4d55KBA(tn7DBZh%&H1N9ZK1J zjh&r?Q~VSr5r%>u)kAtbz$JR@7bArt?~#@M;;^XAagjfcJOg`Z;LFH@@k?QAJ-3M% zj%0F-5>`#m1V>`RKXT8;BWHJkLpkAagl(YR&WD~jl3s3r0Vglkm}zI!5leJpj^q52 zdTdKll*f_I)&?Q9#a06!4nS+!JiVCODYVomRIW6}P@jihzVr#4scU!C9w3rZl5jpRJ3z~2{0wQduuazDeqH#Pj5eUtn`a&Uu>+2)2Uqk(> z{yEi7-&dCS)@q-MS)znI3gE_%V%~{z8kiToaN(IuE|gaFRuXGlc;Z+=iKIc{<25p- zjy_Cgysvn=bY{)~1fER3X$|m$^JjPlC%-rl^8@chWbLi4tJW39C2VY&MzqUol`8YE zh(p-i)HElA{QEX096f_@gpz2l1VO@3V94?$MlFqlN4m1FLX8qmKnOPu0OHqFG*NTf zD=(`B(wz~{SY>lYTWELmXR}rIJ;~Yi);EW9IR-!d;a;fx) zv0#Fc(olNU`kvtkCmXF~BIu)Zt?Ajc|0-ArVRvPyKxo@=NzLf)GOFwy)u`%qk zC3@!lBZq(#G?jIfr6f2`>!+21tlJ)l#Fs+qtYIZ+MCe_G#q0i%D=iZ=CPd9#oGUU2 zh#)+Ngz_wm+1RWZoZG^Ea{Oy4qqZrF(e=o7Y+*j!md7O$b38kCKWJi^kLc06R`T(h z-dqo(98WUqBp%2=hlaj5qZ9j(!c{o1G-I=!sRGTehFzU=f5hUs2}BP|*l*&<9eP@B z=`2lkU}|0Xr}tcB8My_=736rXfe)Sv565IwYC8;n&&mvh51=@T|82eouFZ}tIii65 zR7JgQpy#ho)lS?WzOx;_wz`dT;+dP&d%_OB_G`5GNUXaM`M^9dI}l7Hg8L0SE_E8d zAbjFeODl>r^XavMOj=bWkrK;IQjbZfl^qx1muFe`M@fu+MJ_@mEOnvLL7i!O3j)s+X6LLeqk?g-f;{Q1%WVt#OS^f@ zC(_~Y`u)1!^=q$K+nOBXGnf+PCI<0ZFu|{fq9v;}TFIyzECIdb--(ZlkBzEQW*T#O zDS2z_)7l^}k-0`&>)Y@$ETY}5#g&yC1E*f3ASog0>FWp=v5``6fd#4!6>Jb;e1NxZ z7pWoIuLR&$lS!dU-Tao6u?7J@^3{v`86Zf*yToK`4$<=V!)J6XskR2ZfNu=73!2wh?+#VP= z%^h|%f0+6n99d>l9|n0S_!adPu4*`>w1nr5i_(&tCdMa3^He?gh_UQX2G&XngLSW?!;!D2A2lx;fE zfN!jbnMp7WC~eKxbIYb@J@x>JsOgBlT+>!t{7bOIyOfF=60LBk7v}iwl0o{^&C+I0 zvG5m6Tb^ZnJ{JBW^1w%1I+#4(y{J&VSDZ9oP-&Hcy?Y7Q4bO@Zxf`;UW=4!d+^C7= zo41v2HM3lwXu-3jslJm2Flq5DgEMrg`dIknnUKm?isxA{8rpJsP%@aRl6(t?s)ct! z)jgSNHDkRT27{x=hWAz4dXjS9jNJ>_KT3sxiT;&#bKvtpFbA;{U! zm8m%Z8(q|^vf5~*B^kLVMSL7<++rOG#%5f5Y1t|DR7q}9h~Kk?-u2XE?-52nLd{2- zdBrEDa??P4b?mo_}oMVNQs0sh_ z=Zm11WEtBIS%x(}HY_V5ln;qxpyh9XD1KRj)MvR}2B9B?bV^ml$3m9!iPk1kj!&gd zU5@65UPr@JQ^C=p@`;%lsmx9^X`E%RRP6Ry8FPhGRE8Q?+0HyxR;e;u=u{5Bi4EV4 zOv)CR1g1og%(@~5hdkf>FYqJH0Eb+uA!7>UQ%BI8C@d3b4P3Y^N(2?QkIvo$Q#VM@ z6T3_2?Cy1yc+C_BcSD|yrQ=#NVDdNX2G&5+NSme-U4r67Y)oV|d-jWE((!}3_%It! z4b~sDGjf1%-1=iVHN<3UDuz0ZNf$jYTyeH%WWaUfi6f|HWmos&L?eBym!=FrduKBw zW}wt7sGFoqy$YCQi&%lG@l#G~kv2A>L@JEWbZRLRo-8eyQB%1(-rUwxo>(u0$yIqh z&c<_qOj5ULEOGIXCU3USVoHW5@1Uxhu1*J_+pDoOiSSWD&q%xd$T)v6*NosL=PlTF z!k!~Zt=(zTySPoSqoX3Wt*0$ot7bLV~&4nM4-)Y z9P2&G;iR~xhH*O}6(ZK9q|;7F-om%gMi>=wk*J|ET53cozY&zVqoH&@=zi4f@%HTT z7R|+h>Ivxp-r-H|txig~W&pEQVxlNCPy}2$TIvOpR9I1tqK^B*#LDA}sPXK%8kvh%iO&m>IP@->@3II z2=}$>rd*!0^?Wu0W3uaAAP5o3EpwHZa2X`17)uERgxquv*AGd^D; zrK6=W#mZ-n^qZe<%z190<2rjaLZa;utE}y4IN2>4E42}^YowrRzR3KJQTB3}73L?w z;A#M|{f|pi-JWl^M%GKxKhbvvUR+u4kVbLj5y~ZBeO?je#JPDn>YO1~t^}}Nzf*Vk z(gO;}J9VH(hVnP|$Rmx`0}jWbtIZ%T7oq(E%5LdwPmuNl!|kZO1K}>I^4*cdJ5t>~ zX{{GR-_Y3CXL9qmSogb*%`4=Q%*2p7o%pw*s$l}@WI0X!S$W{AUI~O&>6`OzZg2n# zj5+Elap@a!n!f)EE&3_^%}B~vcEMy(s9sTfE-b z6*#l?(b_Eug3%`nyr#fWAt^bYSYIGPoB=m9f@xm zS#;4Jj4v#dVA@{Km;BM2by>>y7sHzCO=EL>T6cw2VcN~GwhJ@wgFLUY+hJSRgLg{n ztlQyGW_sO5kYI&E!6q7Yw=TqRvSs1YXE2P(?57QGBmO)lyLiIpgP|cx+l~DgZ`k&W z+95;S#tQO|>mITD?-l2@(eqk(wno4BV#xe<4D-KP9Di+5bj~^8IFF-jL`!GQqsDX< zm#LehiY%;es4T|70Dt}_s%6n*dl%;=#6QoaR?A~AQ;RNR9r|9#^C;{SU5*4nNOwso zYi1W8khG>rLfGX`?vjGu$D14?PYg~a#&DV-?WW>&%K&`!Lk~%R)5jwx(sV4wVf&Ou zCk|9Ug-vLrb{=VD#hRyZ3u8?FqD}#!P9v#EnLsfC?u=M@B6q6Rp@Ru8P8LEO*l> z>b-(PH_gtYV3XpWX$%B6AP<#9ADv>6O*rAwvto|Y(kCgy?tIMtG-fskkTpT+cR_n1 z%L}!^hQXFcG~m0y7JK$XXBYW{H)Uhb#4H0-Zl@h>X9=_=fnY4f`?&3BGlMxdxh&6Z zmM7a*PbMHmqEN3`bS%qZc3hpeP2Kb+-5_#^7HbL@lpWxU((j-dlR)RMVA9d0fulH+ z=@wJXx{QvZTZmayJCL&JKo+5Zfpb|p>=inj02zOk!hL^Enk91v->oKUI-$qCAw0E5 zT_TT^b<2ZyBHH^2?`~rpVT~)TQaFJT! zH(R>4ioe69&%MEO`BI6cc%$IRAdpzp#7z~K^HOvjZO^O@$Ztpn{44g3 zpq7YfCj{N8pq_+Kkhr~p+>^dMKehgm)c>S3X*?v5nW0IX!;%shlN~%APlN7t)0;M* zNs<#6{4~tWHohmAl5}C1nj#YoP&bw?MVntz8>{Rqv3ud<3H|F{^ymCJU9AJfDYA&J z2k;%^@&OTato^TS1)DKhyldU#`C_$)q>wn%Hlawa&zx*$v~WBVnRxVf=0FAUaT%N%yTPj}1h)Iv4J(YW*L6&bds;#pttL^c{ zFhlI~_*1Gp!u!B2DVXKa=Juj$n~!0^^2{y<+?v2OVr0=l^@}FWH&p*Ew_Q_q$sO7n z38tD@!vbD3gdGpCDw%B=BaW+*{Z!-FKA!1+RUOg3K+|8edJOgtfs2-jn?Tnv9{(K; zY|vb_saNTCFwQ(Q(Uj7F^i_X#V9o<&w*@kXP_i^m1XxZr-1P^k0<{cR)A-#@(Gr^ED-QhV$ zmF|K_`X_cH_oRVa$fT|V(@AG*hERYr6{UD4%33@Ry$3C(( zy_g=`~35^4>tX#jwcQhRNjdev2&{*(tLZlqp%&1TUw!IQ#3KF)rcRT$;yLh!`x z$)z5}k8^=;gG!m<4`ILR!#5;qc^}ErV^Y#5B343*{SWLP{fgOW@bHxF0xPcCG@31F zWOEDSgpmg#LuK15NGyY$z=72oEKA!FjjL9$8UoDUO2#y+S2D+TXztz-&9?z-oo#LE z+#Rg1C>@LN9HQ<OGZ2?9Vw)`ZrPcHgy}ch97Ntd&($iowL2Mc&Z0J4sH(WwHj4Id zreMK;QP?xo6$)jzhRIyA;#Wm?H?`U21XBl~ii*@^bW0s@L;`Tvc~(f_vz z#(yv^Tjwo~#k>>!fO9hjWzwpSGvn-IdBRlqKLrZ+LPpYv|B#g6(jfvPI&~f;4-w!(@Y8Xl>m`|TI+njc}d*juc ztQL=UX~k0(36oN-$$6(CHiUnut|^+2>Gsead5eQ&E`X0z?fm^)9WzDtuiV-slQf1c zRZ~H7^%Kd4>m(#{Y!lR3YLAtZ0jdM}WL3jm6CW0Tmc}MN+%XB~M$h)<{E+O2f3o?E zo=;qSczgu~1o4NW)8aB5Ilj-{;UIp%@2`D6XE-JBA7aw$N;D>~EYj3ONX*45HE1hc zRU^8{xfM@tXH`SCH zezhyPF%}xNh$^MQH$p`*PdOKh&p<`#$MNJ4N+f+8e|-kDXX|}AKjwbp{oI|rqvZuU z5FjKKBT4kCJ)%1GYLPx>Hj{U2a%{|aWk_jm{rgim~I9OHcpX39$ldP-8^ z>z+{~=b5Z|HW;SZk^08IEPiB}yXwT#JDB z3!X&UL)t4OBb5rAUG=I@!A^k6j*awApe+L+0JG2Em&bDj1bi6#Gq!np!K%_ISx5_o z^gqj(V0K3g>$)&bX4_I2X{`N|cDc7VLQt+EXDD>1`a3j(xX2hin~kej#ilUfsl`Ns z039_;7PDvrtmlm%uJ#tmx{&>>yy76|56N+B4k3fc=xI#o(paL%2m2|7fN?~eXsywJ zf583{%)!>EdK2iu6PG-ymBL{FVHr%bVXA^7w5<6t!L}%Z_FfLG!A0uT4b=Vpn$o6U zbthxSkC+@Q7at}=oy`X~h6gh1QD*zYXWYRJ* zC@2go!rB)X*NoT(eqmiItUk?wFO*cfnp_tWoKAyI|B=QBWi|gr$fL4`CDFv~<$@&8 zzqo4-{#-<3Kkz8Lb%?jj7c<|D`NjmqWU}>=hHx*Uil(Bi1H{98bA*#>|F0$XdkYvs zI%(Kn6S`NQev9}B&`4C@+IPSU2ZeO!zaV#EC}IVSfop#iUa=d!cFKA2H9 zjwyHBuHoAZ6r ze42$}$pD3g!zARxH$_vBW<{(YLpU4>OL_iaCAVFwYW^Gpx*SD;x|O^ok|~{q77c8r zRj6IJ_1#s!Pimu(4|*`J=`!ZPhP1%?gn8sL~g9 zpx4tB=g)E&iv2R!lJ^=9*1;=6EykOWyR)&I`&vG}Q${rWdJasg2^*7o(WIo zK;^$Y5ih?Ze5fcPPdLnjl(&TApKKeKt)%Y_Dx*0hveyUwzSShxnar;hk&xEEt)GYN zn{+dKzf-@_q;mF9?wHks>vQ?*ggmJwIzrG>!IXZS8Dm)P6l9WVsDIIIAOKwIKZG0U zaW58J6YS3qL~0Z1nmm9QMhh|WC2&vP@N5q9;uUsMP+sA{4Z($U1F3MB1z&kIO5-3O zlL9=TJ0aj+N8nvB0TpRaoM6d?rYrG^rXlmQQgc9OD&tql)md+=8F?p&e)_&xMB!e% zaBd|)fuqJztpSqX%6a34^f~PsaLdbzT~(b2I!Yl_w@FJ z6>o%VX?1awAD}QF0(2=+G@1fxXz3z4Ic>OrD7Q-zk{WR_m9P8?s~|sD{DeTIRO1sj zOC-qAZGVzibIzIalW$`tlpTg1=p!Sz{I%+5zmnf44~D1*|;C zf1!hu)rNDiatnrxlN4p4vR+i?HWg7H7@nz{7f~aEjxcT13SJMLyLb%@S$w`ifiav4 zMx!6&y@h<1DOT&BD~+3u zZ*M>VW`j|j3E?&QQq0RXiCa(GNaGf)k(jR}3}0?D!HVklWynG}#~@K=d`cEr_9D|j z3|SvvSwB(|KxocaZDu1;Vqx_yTvE;-p-%mkQRmP27sXwYV^O?G3X&WD+f^v+i-_r8@Vsg<1 z0i5kSm?vq*bSy62)aty^(cxPBYb+`W#B#u1*096K*PaYd-%C}`FQM1#7_3kDCn-p8 zh}$~S9?tur(|K3keg0E}_u5g29|lXhcbUIt_1zj|?}d-Ujf9bdC}*T=>4)qj3iARM zxZwHi`|OqaDh7q1@kA)xa1$gRDlQ2$h8Es0M^gljliLHG-XOk7?e4%_y!KnbgW*v( z1ea)<>>WxPaGmFhE6MycMo3YHX^wdYS?`HD2vJhM=Zt;-i7e>JaQ_SbO52}nF#wVa z@?N5kgxiwjC*&5AaHuKc8{dIC^s&ml=>x5MxyoPq(w%VZ><;v9Z0Ta;`RMELZqhH4 zs}QEhtnOfjb%ObCW;dr_uKsTi&RS!%^D`H=w!qYoi-Y5W-72>cSal)B{RN0P%|<+w zN-SmCfQnEllI-9EH2VDK$;`{)8cj|c6UYT8Pb=~o-&`i9cX96k4t_bY9?UL)WcS~Y17~` zR`Nqs1ZLOpxn^6I3#N9d4xDm6!j@~If7n&&RFsBpkrBbH#UMtp#o1F8_>Xjul2%WK zHG9m{Z8P=wN0I!(&pEv$3WAxf{lkCxz6O=}QPsK_?5(k$?5o%;=u68X{jbXxo?{9S z`xgWM#l?=`^)=&*RZE9si@8t*c%*8=+s|@f-mUv?#F3_v)DKF zaO-a_gFd3OYSe4|r60l5kX8-NXP-S2SYw1qT>{D+jQes-2&9@0ifYI@MiWt}vL9VAV%FnOCjSvQ3OfUnJmt@bZdnB^HRm7d24@w1C`mxFn#oG6GECi1N3y z#{8tiy8l!m%)|DWfBKJe(bW^CT`@D`#Yl5$O5rK3DwL>`G_ioTT^HYw8=Fh@=V_kIcZV^Lx|fAdWoITHv^Y7h!Q z$;hRMRgsE&Lx1C17hS0~qsGjUZio&`Bxd-QZs6==f=^YHzZ>`x!u*V=e3a?;3R0Qn zsl>_+!9Hq5+8i}WIL~SA6Fz6D5;=26Nn$`HPAI9M>sERm-qVBTq1YG3*k}yX<#oF= zB=WCFJ(AsCWJbVuKY_yMu>|l)wjj5Fnw0;F?Su2X(`o;ivn^Q7LR|i_` zXm2^h5axO)G>>Razk<^nj5)eevc=VCEa@AR-kUgEC))!9=<9B+DFg#r%AnK6`SZm6 zp-+?CfEXQs7OOqVwYNCZ3PQ<1=Kj1<70fWV8&=;)Q{)#>8YXr60Z%i!(`D<>U)g$| z?JZ-`seH=UJYb>St=zM0VJ8Dho{7>*pw~>D)9Cc3HAz zmvB423FT-K7j=k|e1!&svT6h*)rc3aBHjQq=(fknu#9$a>1q-_meJcZeTEwXb(@@m zcF_-Dz*oDFH2_nNr~D4=gFjbiAJLN+GASS^1KeWnPlUFR40vu_F^CnN%?E>nS8&!s7I&%qi zee|lnr$}U~#qmoOh$ejePVUTl6u!CY6Rw2_Q9V<_KD690$uMDuJ#550tQ$?22Ij2H zGf~Llj!DCwndZk@%#wD6p|DwXxc`nDPD$)b%M%W~Bj!cbi4(RP{!E}*`JdCVLbENC zohJ)=LhCt5XeND6Fz<@bMJ^Gl(mPH(zB@l<&@p{*w-}cZ+5kDMonF^obh@(78-`5) z1-S{#dMOu@nsq6`jA|IuT}DLsWQx_;un&FH?B6`(Ky_?^RGB{7ee6P8dJO5V_b$j6 za5demYnzjMdRkBCh9l^fosw0+~(Fo7MZdjcbb(Nu{y_+{;^2fsnG;{bczc~`o7 z8Y_jmSWz6D^X+*!8Fg!YnV|}4mcX;C)}ML!;>rYn{y_JrTl;UHYKY|<`%j(#QQMAyE36q;Ma{vh zW*23`%WoTKSJEBy@~zc|8ye*|9HFNaV9UP)y#q+!9I3ZGkaVRWF6ps^sRIff)!Ee3 zHk?~Vai%z2l71RZ`dO0`xkYIXqOlA^?=Z;O^7Yz?!)$}$>PrNBT3ir0{tXeWTM8}8 zf*WEMGbh%hA}iUO7$R4&s0Q0(n0C?kgL`O<#VNBhzyGpl6r(sMf2d=tD;@5{Tl>`Q zbFy!HL)ZXJvTgSG1YyQ?K8~0QV!m=oGgMTekk5Y8R%W0KR_>BJB8F@nAv?5!c^Q;f z2W-RpjQ0C5(+bH2Vcbo6U2dy|!6|_B=W2qXK>V&~6ZW%0{dRc%`7cu7xe<%n?jMMS zDgS>5cCh~c(}3__ft`z~vx_t1f9nra|84*C;~S0rCfIuQh*s@e_o4^Pb5)ffrjZxtDpw|9PA7*_-w=>t*v3=zfv{;)1tt10sHYsuJj9Y?IY3 z@v?5W1V$CvRz8CiOmfPPo_sOrHyw1d&O$ z_UDhAws3<(3{gX+qR*D9wKO(NCH~p?rLP=N00S4Kf^0+q?#54)$3sTCgvkcFTm~{JJvP5c37=GVq^&e7lz!O-c%yy%1LDMQ{4kT%d8)&1VufF1CVDV zG_Rf0&avO z`!%7+MvIpdHkqW@Rmo@*rEH$qKrdG@X9j~SD-8yQ%I2vGT(7Qa#y`Fw8{Xv1FAysQ zMs!Y`Rq#dK!b&83_WsTjiR#+o=~QCQJ+b zbdWC=#D*X^+Rj`ZNA9k_=?Pr}$Q2I_1Jb7d51jGabz?BcKkj^eyw@I-a#`B|d2qj| z2+ab>O*?7MwYPGlOc{Iq33BGaYdh-3Zl>iXSG-F<$x;DR))88s;bcjc@g~Ak4l3Oc zl(Si*Kgb}?ZUlsIN!b|~JQY+zaik&!jo#js*YddJtb;og<7 z8fn4$U+O6N7bM)rG20d<8xiv!#3vj5QaX0ds-kNEz&OnpKZAF|jLl%;b#+E^@0RxM zzkVl$T&P=B)t4@*wh$<+&d?b?ITO^DwjrsGeZbZFwJwsFaCl#h z7+@cwJt2d?thl*!TnWHb6aKfkDovbk;B_5{llC6AU2Ir_z)=6X>nYQ@gw~-YsgbA5D*?cCxC~ga3M6ATBl2#3NWLV>O=xrVP_lrhTvo=1UDrtD=&jva&W??btz8 zZEAi%NnpmVf74`rz)KvFlI8mNk_f~vcP5u}HFq?Qe^y(;nf)=lH$H{ZhQk{tuc}HZ zloC1gsabovtU^v;B^SfL#FBCkOUTKVZDxs%2JSa&m*&~Fj;+)u%1Tw_3}02hvk_~m zWy;Bk7&<%4wV^iiq?NhYcQ{fO@1_}{?HYvm+2p%wN#} z_mR`;Sj~`uzdd8rDhzsp6OM zg=Pq+LF7dRUft*SNTi~-bpFFs;#q0^6np5PMu~rl@61L6r_Lg0JTo%va@q{Y% zGlk>l5K(lzP#@fQt|cdO5@n~gMhQWK0=3A%3K9B_#>(=}{L)4(I0SWv;9CW;laeKx zDH_^$2c0h(bblDCdklDCfG5jfw1de4+nt?(^1~=xdi0wAJs^4N9fu9=8u{lS|4-} z!MW8&o#0dawG_GvMBD$yhX)LEwb)BOtK3rc}l7w6q%GOY6*9!-`2= zQ!R8JB}Xhf)j7n2;YE|Isb#{-5ywLjH_M*cs~%$GsaKQ%ZDD zN5zyn1McZ0npQflA6WT(yP};tuAx#pXw&L9mI3tLM35p~V>`>E_FBIK&ZxNvG4ESn zwCYB;DkCFp?3$$qBVipAz;k>Ul;lfTB*~OG4f!8qr#IzC#O|;>l-Lc60;3!w5)!pu zk}-O`B0Y4(8TP|4EVWf}uQP?O2TY%hq#f!aUIKAVP24Z`z^e^SY!+sY5i_K&H>&a# zw&X{u8w0JdwPPB$YvknZF*RA7dI$&uljRW+p2%5=2Voa;c1N&ToNjV`(5z!*kZE+v z_r)?{QrOAGwD2^G_Q^?NhXLrS&WViFPRTr%T=S~q9@y&8z@rfEz8!(;P%hob{592! zN@QPGG~jikuH8I@wc*yK&mDn05vDuc8PF`1pXbH5yCf*Gf#F(WdaJ))n*Xq6PP8k< zeOT!sNE}{qb4AYHH;l+*+b@Iuj>R~qKeQ?byk%TGNf+&jc15KmOxekEu*D5oM$au> z)~LrcRKTv`;|K-wFa(I`>mNh0t$Sia13^_EULo5}9DYK4Uyt3X)j#+U-lkYm0evzk zTA}{A^>4>#sz(haTjwQWHzezG75Y;Y{}SG+hR{dpAF-zp@XZ94`0=FLYkOwZbhuYP zKiNU_Na644LKzJ$NKgb%VI4=s12j6w_1!#Z`NcGF0lbX;MUBBjn}3+E%hcP7I_rZ* z(KU(k(TJ9Fuug<`h@oJD50lj}e!XmPN*1O4VSRX+H;r$R(l z65O#k(XDs{Y3>f&re5~7!iGZ}VLFsqaZdcHeq(dpBJF|P7d9LEO-O(bHfdij9fXki zk(SCoFCWSH{XK;G`VTVXwCx$sep(MA0Hgru{ERtPF5uFbUpgitepBI-Z490Z_yV+0 zdT*u3MJCvVoQPlVGdeLH%R zVe?+}jLvO!;E4zS`@NdQNS7gaFI?3pG-y!I0zQ9su;M`|!;1r{x%I7jFnvA%D#FKIwX4g36-q-@I^k3>i zFn#)CWSs#yPZSgjGqQ!+>A%{TBRKvo)`(jJl${B(&Mf>#0*Zwm*}~8CUvI1tzB6Qh z;FBzPlgV09oEQ< zbz~z%EeHNg!iAiNkS*L|%D5dFct*+<;nlQCzwHun*~6O*Idd!eJVn~s7G)>?)35Gy8HKyuP=>RP&U z7C-S%B21*ixG|v34IvWBQcL!T_XcT!)UN4*kVH$*AR5aGHD z`*WBIz2{Hyo~&&a;{b|XBG|$IeB9R}^VghTWv)?kuKCnf-2LOr#B>vsf43}##^-Mz zWs$|;ars~`H}_!S-E~(I={1$>3nHbI)-$7#@3mYN{-vCugqM;AiBX+&lGl<1%EERQ znB*^+yW3f>#gPzYJpFl{FM&9fZ6A3@*X%=#K^vW6=zL(lauHmPLDTa<`gXY60W%Mz zoqM|0{;BhjwuLeFlDw<26pIm#=pk4KrrJ?v4`j+t_Uw5EVMx8mrw1pU0QJKV5B9#g zp)KwMe*ZNiNW0;(2cGRH&O=BKR^Q0BeNGSBmjO98sJ3~B?i{Ckgj$BXLaXjDs|UTx zv6|)3wLqiu z%F~=G)gNigYhOSwuqo_B^`U%N7+Z7J4!ZkmC#bDOW=$p;|7p>Sm(S7m8|swg&F z)aZgurie3K+Cl}ebV5rVMM|Do)igJk`db=|gY+qP}n znr+**ZO*oB+p}%knr-{^Z>@9h+IvUb8|VC2QBf5YkvYbw{Bk_`zA*6#ViGbChKvFv z#6w7de+(dctb+gSK^F)j@!1Xyg@_Jg8t>5}=GE146tdWXNW{A0cf(H*3oJ8~#Q`Sc z0iGj+4Pyx)zOR@9<@p*Q{EhlaQP4hY-YAj4t${)yptCXv1tHA29e@Xsz~^9I0NCuL zs|<7ySg4>R*lc)sN@9TzVtuN@!H8~{A^w~Oxm21E!WUQE!KAmT87|7a5JwtXzjsBL zn9`nu7K~pJDUQ0%4I6EUAHt4XIc5(bI}RZ{676Wu;jrN0pvv6=gjRq@6Vkl}Dw;!r zq7eFxt`{p^9<&3bZt#RTY)z3g$FWW%_9@e*MB0HVok+`kijKF=aL6c^cjoee-nxJ7 z0_zKz%@F(!Q%7MZnMP)+Y;TpLc>uAgiGaxQ1aiw7IwzH-Mty}uOp@^R$h@;Mum z?_1#9Z`?*t!u?(iP!>Y*&xr3sSp^<@0Iyrf)knDuLGlEwI3-P&rElER1ETK+x;Rsn zYp(6L^~BxIXXohtf~9>Rdn#0C2-qGVd}uj_Dm@Fsw+}I9*>k2bypImFV=W~p*@V`J zW?qek<4|>iSN=okyy(hSZ68UJN6dgdiFPX;jN}RjotpQe3ax*}_*IAbvH^>?8p3SF zU0+4Rj5xtv=NN11?JQEXba!RZtdqXzOs=tdOeX0rPBabKDNeKu_5pm-Y^0ltVh^E$ zJU7f(hMN{LvRfizjbL_r)u+|wY) z8#+yayaDJZ_VOJ14K)|Q#;LS>Oi!TvsTGIFjv<<5~hcklqskn|b|LyP{ z!Y?##$B3}i<;XxfrK&&E>8wpAK=46-^$iJPsz6ATMqtRMz?hvQr2MG}X^?$ccc)!& z?~s68giNGcba>&R>*u0d1IWL;9Uyb-p{Ttmfn6_kw;b0c(0W2kPj}ZCTO#U${emvFzW*3iSl?hN ztyObeB<3?_`VUD}uWrk1o8s%&9$VIs(X*A35|R)yG~|&6DxqRmcFO10&a9Nm<3qaq zvh+>GV<6HX_vFk<@$yk6mLNw;$dXvXYx@N&N_Nvok6h)T^y@g*1=mVM4K-UEpY2uk zjmV*4JevpEyUJqTN%Rc6NREZ(ar{f_#1S1_&%0bvmGq<{ziFtH>`EC|%u>}7d3;2Y zJ$&+aAK7UMF%DpiC;VcZ-^c#z9&J%Obh zQZ=aQaS8R}o1^xT_6Tdnho@Xm_%j-nDIcjCI5OjLS`b*(D@P?o4O`t7EeGS0ZTUBq z?gz+C{t@XXz)hB}NkbN6uoMA$@U5>yjLEbIXif-tn0_xsjhMp4VaCk@VI%Y5z%_VbduuA_%4T; z(89DFFBaqQM46fhEFt%tAm5J8e=O?ZG8J?M$|jb*ujrCd5o-$l@9JF<8-Z5sNJ_1$pB}Z*{ENYRehWIx42-9;=${v*37KX3L>7 zLHBCxhAy(!%Qb3OZ1?kU=o#*XsQ(P-XoqBoXJ#UT4%rQ#`xue~can}thi+(t-U4Y! zQc$-*OYEj)Vgk*?Vme}%8E{8v19kcTg3=1mJ9H&F1Efpd3HkP#kWIM6R1Us^Wk&WW zP$;O{t%;qB985!PtaS~9Bp$*(7?Dk$pROF-RBje$hIERyj}l$D&x2dG$J(0?v@LC} zq^@6o=?~K0l?5YZ_Fjuv+88qbD*u#mzNi%rZiuCUt3pR7UsDnwh0xiLu{m%?P&U&s zl}$LU5z?1UTx}hN7EDe^AMS8t8jU|yz*r~FrZgsA1Q}Vhu zGcd>uUzY$J1%}9k(;k0Fcu5d9tVIwtBrlTw=KXUFV)%8%={LOOozJfgND{x{Ekr_` zcpv!%i29yBst)CnF+37xc?1)+Zk7x>7z5Krg3fe;vrxW^{<8_ww8qDMcMni|zLemVSpg$=KctQOX+47(Ofd z__+{`+;@RD#!$qEY{+d-GcW6!dAsI5-s>M+PD7S2B^kQ7Hhz-p#ZS*D50Vev{LN`u z^OmB`C7EcPV7Ygf;YnZr4Aa~7U~GP8TJKJtem-jQ;@U}DxcVKh#V43*hQ8(iw7s?^ z4V#NF*tjtnu(wl^Dj$24A@>@ycn59%n$Rhb(#W|D*l_?#*$v79ZK*oFpNHD%CMEGa z#p0|(mt@4p`Z}MXLt$f6YAPSR_KcCm%jyXf{q^?jRu-gQG)=GL-Kpp8WdCqI7&AD? z9tIvJ9_IJ{da~n7-J7Kh(Vq5!(NJwkK~JqO-`AuW`U_l-cXxgy^wD!M0+9S6D~&b- z^HY&*3hqzy1}iCU;gs9M0m;B}&2ZL%Sljco2+>vg>o=3j-VQIrxzn29XrsWWxFGxE zg&fcW88;DcY&j&ud%((7X-909$IPj&eIfkh~4k09$UTjx+QjMQ3iB z*-H^Yb{{=+lr1`F=gxmV-Vc_yVH99X57qGrar&g0w-MKrDXul0AwunoDhw3eaC~bG zlqyk)hi_uAn=wT5uQ&I3J;)5AehtS16mlr!NFMI1Ga4&&V}cSS?GD!(O86_bzW#2B3%swYSDB`oM zyxC&6>to)a_J959}kz=DZmY3Dwq+bWM+th>XH!=LI#BBj%ofg=zJ^5G-zWZ+&%v#%a zwXvvZvrEaeHdIVHv5cbck=v(vxrMz~0M!v#52^>h0I z@X^{5C;vfE#t6GuI0xd~ENTvXJT)t$zP?6a+nD`WVJ0kd`e?AK?idcXpm{$jEN8JQ zLv5$`Zlm~EY!;_2uj8u*j}M|2Q?yM~3iT9Pt}4zY=FgIWEp|ovvh_(^I?su1MO`RJ z<@$KgpS`Hj{_YKdx?izg=kP<44HDVGi&j zUDx${L#`92vT~<{Iv1|xPfX>0izBhTfAwDX`h62$;HX*S*UH#PfrFrx3ATj0>Ihtk zWY%D5A!}3O!y*eSE6|xy-q60I|HDFL`mB+}Kmq`WdH>gPF5`cQ(*8_0{qJ(_-%^SH zzz`&i|HdIgl&yZmJyCdtwOeW`%|Q`SaiI+-3aR&#u#gGk;}_NYu=wRR>S5@(v(_{p z?Os8n$-V&ml5gcUf{R4AjE}do+nui3on}7XK0nF*-!+~YMid&Dnk`9R*!sUsgMK)o7HNzQicw(5PUqVp3R*$W-F*CuswM5UAv+Qw|y%CF^A86X+_1 zY85*OB}$aHY1_ddZu&HKm-3Id>DhR;4KeU~8xkukif0m)U@W)xkf@aZy$NQTCu_}Y zeKbIlq<%Fsd3G`Np!XWrK6Gt9;!3^f`db)mp?-)OTCVJ_nnky7>2K90w?dLAGJ+eL zvLGa$3Wjqbx|!EWd5?P4*9P3l8a#Ks#Lsw)k$w$e3$D?J8(OgRiP3R8emd3>N0rJ$ z!(?yMu_q`-Tf(WRmZ?BO<(;GCRWTaEhWVkJozb$XCdZ9TZduOBqqP>fk>L92O;{d+3lA^3GdK@*vr5?%FZIr50O4w= z^k7O-)`Ef~k|-9SH;n;{#Qd2}Xct36tgXQl`rX`$JNx%}!1B++G3Q;NFT%7@AWiY; zFrYulF3wszK1DaZEZ)K0Jff*oBMUA5o@u$vG~#h@{+%tx7v6aCPX9gM5WuzvYjAh6 zQ(Kg3%R$k{vRz#rhhL<6U7NR zY(^Ab(@>b;fLWFQ`a1ki~-^D<08| zs96N_F~pdOp)cpL-L^@|yjw+!BR)uwtxup$2&>YUfhc@=GG#~`?oRpNY zQw5K`<)B6FncY9=*{H=PBZ%!klQMPFmwZ#$M#$Pg&>q>#2vLun7IfK%-m1q`!fcp0 zDiwcx;DNIjh6X+583*sE&w|eP17&7rDDcc>OMXdMjTxpwHmX$*q3ltNw`yMKcJD~Vx(n|^=*0K7km{Ev?C|4iaPvX1|LO#IKe^6wNDYe9Rf z9HsD+lVliR=m9D!Jlr8%fecJ;dXOVZ2>DA$_y_BU=OvAiVx~{RFeBp;EsOgsiq}`$ zsK0MFS5`j}u7b$6HtW7CXm8kRw^nbg*j}!Wwz$66ZB;jX-*1ftkucXK@6bPQx9@Q7 zxJ|!)&%92%J-)K%e&Ha#z6Qrgr5_(oTGL%@qfHr4$#Cb`s6@8D7lsvFiLk6)*j{ei zjX26Iu(4d~SD52rTTGbjk8NX>VAiYnab+@YFqe!qb+wacMj6@@q+j@Muu?Nti{ng5+cIZjCSN)7+nH0h- zw%8IZ#}Dq$)elv8KYJ>HIwgnh`86j%>uC~h=es!=%>V8e~cU|N$RKRX;So^xK8 zd16q_PP2RESYEY2UB(X@%$^$BL<=&0q9U&*WG5Ierr|AleM7O8B`2#*8ZY~8;p)U= z(E{_}7UVmCD9DQ%MaET-(e|N6kINDRgcPRf&%J^^6S*jI3{~D>YHOBhu@@U)Ot)?4 zI@IV;wnCazuET;ZPnzFW#F=vDa*Z#*;2=BdWKWzK+j%kNQy#6ECb76$mU@;LL4&tf z6J$w2fLG;|81t8{!YI>)EeyA58)r0zj?KuilKPQDY%8@q>i)3^l=4Me+q6 z(IEHntwk;_pb<0yVL;15tBh3Hx`KRqs;|t95@Sz-FhJ&YyTa~tOXGmILe56IqzF7* za)Z(fMfzw}-?4dH@?nU>R^lm9j4FyHUEN2xb>a6RAB0w!>k2m)jT#s=HhJUc!jHR6g8Q3V;fK#ZA$`VX4M+vo)*j6 zt2vkz7%mZUYiD<+;S!22IW8%7fNy6i-uUq2$(Rh4Z;1*$ZjUues%Mp>eV)ak8SHH5 z-?oV`YS_b2pIt1M&dduk9+Q^5w?6NalStrOQg+RAHV{jTf6FHVS0X*-I1w>(OV%INhWE{uBfjjr2 zIY&%>u14K4+4g2{M?_W>3B7T&*GcgCXPc`ujMpuArPEc%o+?XP>A|yn!8yG@zfr|d z^~(i>KW=&j&U@I`fDGZI14azM&*`(UOzd#GbqnmpAO7@z3Q z5)^>4MBLs(aFqloq_isWd}4(&Y!jm9*5S<)(WMa$L;*BZPH5m(JX~Wgy^*oS+a49O zb`Rsxf*{<58u8U0KSE}Iggc6U3lO2plTWf)=a!uRF!DB(KfaN7oe*x#;+0R9OS{Lt zOeu>5+P!ggm94Ixn#EEA#(v=f$Iz*2mkSkwANa&S7; zgrCe+4u9LSec@D5N!{P5COMA>Cw>_=8}&iN^^UahEbqRuhYxAyC#Ls;fl&hbsRA&4 zPc`W)agfp=d;;GYiKraEBfADtnjm^{e_}#15b0Wke|$6ODnd|+=>7pRdMm7#89(pc z5r`}sXO52|-^?mp>tSO)$?H}6@sF~fXjx|cYd&m8=Wxd&*2+h_zQCMMi(^6QW@NYT zNWOv5u`nlRo#ImDGcH}p%Fvt4=K3>yi^pxm-CC~doR)1irgku=DtC*6f?`FIdFEo_ zb89T8y^j9N@&qb)4GEcEkx+?;30JWOu?MB8dLr$Q%;m^J%j_RiH@)L7l0)5(^dmNGcG(+eMOMXb4)(Yp{d8 z3=?mQ;V=cT2HRi@!jdnJ0l)n4`J6BJ3i_O{{9JM?jtOD$({~CV%!^2?k2n%g0&Ku@ zwh$ba_f-8J9QZ{zB<_^377yy2uon%gb5Q}KtYiA=4?^7EuE@2ajt<1x;uq3l68~o{ zk&56&AQd23GB4pw_5#c@Yp@$uA;Zj>(pR8N_>nNyUn2K~SW;(YPwy!X4BYysfN^Ly z)bfF4Z@yJXEKLMzf)>yg{dH&qRz*Img<%6)8Usjh=G%4Xi3Y|I>hR)C5(05AO%f16 zh>I2R7#EKO9z0-Q`i0&lq%CE&F zUZ4Bc0B!+O`2D1LktP69AP6A>3VMVb+j)fOkHHm~LcfK=BiTtJ2^C=`W*D3Y1VMc` zj8CWlX6M(po9fH+Yr4yuk2;Q*WnD)+%AJ+Px8S(F6fLmW*x9VxYkWqh#kk+6!6wZB z(e!JoQ@8NFR7BJX_6++`6c|EGu!Z{t>99Q7fFeQjG7PmrtQY!N@f}eS-ozDPVgMp| zSExA*lb+6eX;Avq0QsA?r-wKL{;(V}W zmV9?TBO|iPxC*e~c4)*|88Dh0>o!j%n~sTnO638+Str1pexcAt4Otse5x1JMp6}9b z5~a4Htx|BC-niN})_WghS|=xMc#z+*Sm2Gxev~BS_K$QToC@K?Vj)*}IogA}ae1)2 zjRmxqmh!5S+iGmCTZ=w?pJ>Q7lG5MWSqc^=yP3o#J>R*kcDxs?p_x3gY&CC;C@v-g z;?yz<;*l{Q>|St^^$ViUX=5yh{*-$u!$l3d`})*x}q(L6kI*?X&0tD5VH#DITSGPg3kN*ZoOLOt4cJb`*z+PX;c9 z8n5`BOkY5p0ct6iqIkoTBxT@yMbg0VN+0YjlMh`bQNX!2B#DKLEN)@j0ibL}-cG|j zHRM6&s&B+tNk$@k&H!}q-flbDVi<(Mq;bWo6JiICL zD5$BR04YsS%O{dYUZ5lxMu)l%Yz`??Ub=o6sUuJ=UOr~Lx44kGQ&J9D#3V)d5MP;I zou0LLzX^mwf^f4`8DpFjWlUQ2fDUN91RN zoj*3Pyuv9#`&efa*^pO!Uu}S{gPEfeF=VBw4cxN2;bXAmR0c=O73)-i$*93(HEJ~x zlPosj+Nn+bJ0Rr6MO}kkbc&E6yvQyAE~msj0!HbQxU6O@ztBg=vwK8 zQwL_gvcJN$E_hKMbzT;BPAQCiif35_Zcgmu&o*bYC^9p@^x(2CL{EtAD@OYO*6he> zbFkKwjjoIhUY@-&C-(r3yD7M0AIbF!ae1s=79~Hs%}90s=|RQpQ^t|i#+nOJ8~yw~ z2>SW;z7OctmbcH3rtaO8w?7(1&8Meun>0+YF5%>G2`0iQum~J36I_Ch@Hm!c-?auG zj^tm4k3b5j2!((PB7!N93@XAY;OwsR=x)Mtn9C;)WOfhvvFXmALvcDc=Z)P^%Y3<6;SmRSoIZP^%ZFK6>zm2!Tq)PaW8Pj zx18}8@ShJi;`^PTNk4j~Z$aZP;XfbGg!emflivjVQuzDir-L6XKEb_G@NtzOGcogb z+UQDVe{bYoh>bqkwBh5L4s;Yvh1y zr2uQCfNPQf&QS5Zkbn4qBM1dtvEq3_|Kxxf4=Sq#`t`Aqp5lE6ddmT?M3~~vw91&dJ9^25G8P{S$80BA0th+6#j(Zr3LN9k{4xx`Vf(Mh8zu0fdFc|tulRTwoCxSd7j z^OMYa$Ghml&GgaA5S+H!u^rxnKT5``MgtYv`3;`)^I!J>&iu3kkFa<1S*OV}v#PuA zo}29Uke9nk9WfK9dPP%^Ee7~BqhIVnc*hwJ95V&v2~xR7oDVeWv(P+odMB?BWWR>k z^!nfg*pZ*xyTWUChr0sl)$^>-WISf^OO4P@AGka?{t!}OhU{P=zu@8=Lx>$BXbiAI z-F$Kkt{LazAFodn>UFxLuecBqxX`A^--6*_NQZeagVof~VIR|GLr;XdTe-Xvv-laD zDR;%3VP0uy^we3$*CwE^F!4GcFB$aoSZW;5U z>b$Ys?Psp#&0nPutSaSXu)tjN;G8-_ZHjl%8po?J1h#!GgL|eeW9Q!6eY7tQvno$p zQA)g^h&sV`{~7rmqdlFS=3*d!A=LB+QC|TYI6yURig~j%nR^ zvBkC{%yc?}8T!yeeSLqqJfHj(2)W3gEcbZ*Z?!9Q3Ha?4L;!$O^8dfa&VPpI{!3%$ zUusv{+D;oSNWQ6l!>RJ|^iA&Mm%n9jM{Rk@n>YU0;QcNVmaZEPCBg)HFk$+-HbW;c z8B4f4ix9aGOa`H;d%uK*hM?N-PkTuWIuwfBYHl{xIV=VtG|GS>pr@bmtDs4Ep+Opx zW~M`Ol84Y6Cz%Ou_vJs#eW7AY+Vpm!e$~?)X%*L09P6R+;Mw+(a857swmnb|ij{-2 z1?wW1ZuCi!QMzBzh`ZR%0U4Ud;-#%(PzcI ztcwF9sq6Spk-%|>>yyrc?m+4Meto`BR4AmKH`@%aFuG0<69OPBUNF$wET@=Vijn0K zu1BKz8%QeAIPK=?l=lPtt+lMTJ|gzcD+3*)qII$?{D=bIsSp}l-@11S9JO4`8sGeR z{VhK2mk1(!TmABxbGRwdUJC{I29>ZiHib&5Deq_bnFxQHZK?A#@1`0PNJ zB@EibPiHMxR`X?t6!)UxT=^PzO)_D*UzQ9|pyZBf+BP(F?D-B1@ehkHT-i|^k{J&6 z%JwiV`AWz!@$E{^YZ{`?g*E#stJ_-S~1$I!uml83d zG)~~~-5zdZVFYegOow8mjhT+kLC%HU9aWB3fJ&GekTk4NbEPQn6NAswTSXWKx9wpa zwa!t??ktM4&ST17Rqt_jn4`MN<~8mHneeTa8Ytn{K#WEWdFwi{oU7F8gKAZOM{0It z7OU6>501M5HP=|NwanQd)5wx;3T;1#T3PG5pehAr6#(3YlDP5&Ow+u9xhQ}r)r z+V4lGj+*GOM(AL0H=ZNu$-r?)2q&${gbAwZ{1_fGVr%R>d!xTr>hBoX3{`KR1hfM! zC=2~)Pf>tM5A8;J6(-&>olX^Xk&$M5&HzV*ws_T0K&@|ULQ0BFO;?!yD=)2f&uO`) zC4u`jsKEZ4t?zs>BIG5CxP^VauWFy7usTeR(Xh+kjR=E)OO5H(MT zBEJrT1{zw~i`2Qn;iS9Jq!S65Rzu%BM}6H5Z)C79%O?}QLMcv8$x;7>wonj_R zrR_8b`D_&Wi&ZUv1=0hx!VGkM z>rQJ}R+I!)t`fLcx0C&)K2i@8wrb<@B5zwl|5Ik;w3s&Fz+K^3zSj5Ar%+w%YQ;0W z%nqC-yY|rrc*|^LkdWDTW5dsn$q20f$S%^~qT}i+PD|om!?pT#KekN2p*R=nc~y$0 z7RyFQ&($E=7>N(7@UUdLNp7_R-B`hqcEB=-Dcw^EH zm3n7Tz3(F&6b;%NtqmbqcL}uxbLD%0=qZubka5Gv**trW5mpTgVQvgIdj>!YtlAJ% zUsPXPw~i6-uYasFE;tT6PLn)@97qjl4YO4$?uzQ0_=G##z31*6rFrO+f1hY*4=f+k zLmzw}JYk>d=3xjgS};N)axk7oen>JQoevr`aX1eeCjw|=bO8b>34|Iv`e;rJeR5Y= zp%(==XDXLnLC8Weu=$5!=cyOQ9vhsCwTa(^U~*5K-fCgF4p&>Vj#5C_^20I z@prFMaq>~WUhdc7m)QNZ-luK9osRE|{x838KA-QC{`;u6E{?uS*Pn;if+33nrSwP??^BIim8#$eY=mXIHvd(ZNq4GYeJ*89+JP#t^aUIpeTLZ0pDS~+ zOiv62iEFU*_4KG{p1AgOb{i-H_ybU2D#M;f0{9Ad!=75<3TQsnXcUcfdz(oY7A^>e zgL;Aii68{>+5BSxjE31k1uq7Z#lqDn>%6`}NTN4I@;gE(a=hQIp#GOpjV1>jHLF5G)vW0lV=aQ#lJjot(SsNpZH-{!WZ=v*-ovE+M zI}*#ASG4U_<1jEm_NUTqk#k0VLhi*FJ!+0@74Fdwti*!NyDP*pXnj};#}sIzQn6a` zlHw&=l(pH%UJvpBCZgp$wK+9~md$XtCDUUjF2-fnb&x-Q`(CZ=m@R6$ zttG4tIWc5c5%5Vw=t!p{Y6Vs2AL|~_8gLvfdrzWyBAM{@XIX_s$2|a5$&#F7iy+v0 zB9oGVWMj;W6bGHt&7YM7eOjOXb&;x|hU;(sbGQG*{9j8ot^ZG*0~I?f6Wf2T_W$?A zzS@>DwkpcE?y7OpRBDOBc$ft6Cj;dyg-t)w5E%rLF46`7Yrzt!&cJ+KmMt5qx0Cb8 zG{=D#{$ugXFr#x7*Lk7*m*}#S9Z)ggy1^>%Nlx55cdye^AOH8~8@PYvs?ywm{rmxH zEz&RhD@U&Y5mYE)_rWf^5$O`$Xft&-_kN?BAHOuWF=GkBoK8+F2*Uo|+$QUZEJO2{ zkyMOi3$qj}b5V(~NB~^}4YnB-cJ;PS{hDMB;m$pj$@#=HEg?G`s_hO{0}c}w!UAk> z)GOLlOix=?o0;`PX|>^k^dcMXoHNZ>SqI?I1GEEd)j*+{h9g9YM(bf^?6)im|s+CDc+1>xzD>yT>|3)4ngdm&ZbDK zUq_GB#zb3T41`DSp@W5Z({`2}Fzv$x5Iu`fRftB6q$*?4?b9;C6)sMmI#RV1?eWw^ zCRxF3DH`?move@rD}(M&3f^W;o=Vv0F^=9MU}ws$xE9B=Hzqo8M=q44)XBLJ0OFwsNz23a zWdX0$ll@VmT2=>{=q2(Z?CD68nZavK zisCiL!y!f~aD)oi4{~J82w6^X9GP>5W;2_8f+;By7L{~eoU`;C?WKw|@yEyEcp{KX z#N4Z8{uj#I`7jizq>OW@)mY?*#S1v|K}k<=#FAaK z-}@{ zsuB_4-Wu=sX0Ox7Td#J-=xYD&cI#}DoAf5DQi2!ZJV}#QEjJ73LNBw*nrAFC9wCZ_ za;0Exe4}p3MN4;{-;}b;UBMb^_UB)p)|C0EQa&6bQt(cZ5i;?R{&_%MQc;xOU_kJd^9@-k zO*X}&&U!*fUzQWC2o?w`un>}AI%{SvsyF-PUvuuavnIJ-Mf=x-Ue5V>>-qJnQzYs^ zP$qy-qe&8Dyj=|}Lo|TNWL)OeCqcSMSsG+8B(=+o79*Le^+R9Tksc2;E%F&1g4bxs zF#Q6kcGf?gd?Rmfc$X9OQi2WUed&!s5zJFFwJR1|5gfawUO;eNG%^HmqIWtNky7wk z*Akk$?akFQzaK)yv}yJRDOO+3sR)mNpVZL=tyU2CZ*iCWQ`8v9BvxWSvx``Y*;NRa zG_wKiy+Y|kssV-y-%?pacwK+m->(if0^a*J4*C`H z$9l2uU2J>A1owGvGpx{cQfnt>yfkLXec>*5d`D&b1T4bRc~QT7(3hU7Amuw$Z4dvS zHD#K!h=ufnvSfh%*ELmO;`!ga+mZfXoaJAVL6WxiF3t>$tO^shg9HdXjlUQJftBb! z1d1!hi+RbrABFxFlQsA6Cs6q9G%r9w4lzs`We>)ug(wdWg+xfS1DEGsXxN>FBr}FC z0?M(8zwzz^`_9$baWo?>w1#|DISN_T1pV?z9z8gW!mqMfb}UDm4p<1sVHh3y4mB2o z+wk$&oow!hpacsi4VRG_+!Pn5-bp3o-;^(daT{D;#<<9++LKQGcv;U~;U!E=)jh6bjDn2^1i~4}E~Q0n!`sIecBd za%Gm$cO@cK9kP-LUc-vMc#M4woC<+%>vmk^2l!9$4j_+LKYv2w_QM1HhXwkd!TS#j zq^u~WY-?d}Z}Jm7IwuFyn0Q620S1(iop)*>5Jj*j@MK<;(Y|`ge7=~#p$9ek63Nso zDBHii*O{F5a0Ygqhn*)layhLCgb(I|`sA}pDr)yx!ASB^QtpMZ2n`KYD>S_+ZRpFQ zrj`)ksRxX`X+ex;9TG2r6-DEzTd%=LJZ?U<*4lU|Sj~(Chvspf^iebu^c@(bsv>3~ z7a(W;d`e8!Dx1}to1psQW9mAd1AFGdAD{H4L|1*0alK|*tk^-fKKKYN7c~jPkz z9~Bi&V%h9b=tXU!gzNqAj7?HhrqxQs0&~F5y{m{mxyU4Y+kKhjCecd5{6CnT@Qh-R#lW2Uui@wHPg3R-KUNIabShk$~6c zUHs^hFtDe(FZ?W{EuU(BXOj(jefAbI&u5DFev-+MedJJ|OEyrWPrmTXn`Yi6{<{ZS zHY{_7`xD@c|N8~a{7-;w5@h9p7!g8e9@JqjOw#h)!B{mB5&8QF90`q?U7NbZLrk!p+m)io`Ht<6wj^6M&&9lI~XhnqUH8;{5*C`PmBwx)*T zwjJsD*QryI=FemBlOX>8whI`2{`;WXKV-9u1-*)+iHV4XlfAWphl%6=LpJ||kq!v_ zkj)7~)&3AYxscF(=7a_Yfet~L@dR`Pf5FrH;@2}jV4r2mq+h}nd2%a>8mpq65sR>O^yJW zhtU#5Ey|ontR9nAc@z7;&)fgTe`Ay;Y!`m=h8&jOR^lM+k?hv*kBuOP>Wr+v5QZ|AELupj zD*Lybd1+DXsV%t|s2nr`6u(cL@G3oAyn!Nh#O-+7DQ+hF;F`b37x)GS-i8IEBLyZb z1VOvOyYvNI@#TUo6J{Hbe?Na;6RQUkKU`zOoYDD3qsT*}XJt>HT^>YOTHg4KpR~X{ zwR~olZ+|?FT!|E>QgMKFXF(M8q5{E$;}4R9HCIat2TBH+_eIELk?(LF;^ad1S}&WS zxou(fcKeAD*^U)WG<52=sT&>+uPzTgFf;nv zNR7XLw7&T#%+;oi4y@_Hsq3tR? z0$u9OuNADG@p26tUf)u7ZKFH$FZD@3xSoS`AV%9~xRxaBwgpzY_=2vKs9*=Pu(rAh z$&lah9lVY1@Kkp^J<-FtjT=o26JeX+2paTSKAt9Slhd=~VFi1?xT z-#I|y%%0ahUcK+#*IVx|8@=BTW&or0RfUrJ>T_`9Iun_7(63b16!l!v2Q8G`Nz6wu`PPP9i4rimiBHE>DGo?bGq-I+ zHDCisgh`H(dTpm`Yd68HW@wE$EIbEocZlkZ&WN8F6Jq;4-6RxjXGOH2B`!nLYul6o zG7LSWF@ryI=&hLAp9?^1-{K^>)|hhGW;K8;2XMgL_1bxM+PCke8w9f^d7#yImvX>d zt{^Y2X#t&c)ClpDYo^P-sn}~c$@R8T8=O`RZ46fJkdUf*%vVK|f1A$M@4QSD?vF16 ze^;h7ZpL?=X>rQ$ZrkLcm{Yo^6-y%$uRhk(ov81-tbpE~%^{LRuD1t?1Dy&>G_VrX zk!!>?_-T#C_sxCl1p~qm(eUD{<D4K1*Uh{s0$(z$d;FC@br;y} zTh?N@A;3dg<-EvjU-X`A)LC$HckK-P^hE)+GVyN1MT|Zr2*`eH1d|IS7n;zN-VEEK z##`QByshi&(bAySmouvdy~;5E~1A!@@_b{9e`f`M6t|id@r9QOri;lsm%gICcX1WY<8#Rg=gH3TM+^ zdmv{!J&i)ivoY4p=Z$kt?tforT*Nu{J`^0C-PeUv51JYn^EfX+410OLw%%ut%OTo_ z+(sd23_5LF8*Nvg7FniaGQ%Ff58|>-gF+4c5(qOBR1I!apMi;=XqHDoEhVlR=LjiZ zcfpZ-eCaYOn>Us!-l=Gj_rDrD^LVKCH;xaLC|e=fiY!@^s9#FSzKtbZ%2HXzl4Zsi zB}0)cDTPpxNF`f!6IYSc)s2WyuBhy;%96G0e$P?ed(OLs#?HK~-ly+MoGO(q_+MN+ z(!fdyOi;*vYSK0_XP|m;@c|(|!}6+Vo7y_uzCRngtd7~YX@{=L=V;7p41D>haL_A6 zM833h#8WVPrZHheH(EM)_XC% zNYI1poyLbU#*|rF5@!xZ*!Np1$gE9Gv?zA8)ZU{}axPZ3X}#r&W1{yqFY%~PPf4j_ zHyTvmLgG`;^78axKkCxfGrr`pQU*EOMpr&~e|zJ$TSF}QLnT#@h=aDxzB2vC@62wC zue|VNdd;U^|Fez3;VdjWV^;f34vjP@sLQP+OkH5MFsU=%>+0$E!e;$htxbv{b+OtK zc}&3;Z;JK_+_9@6m)~`{a)6J-McuF5Yo@GnM4>BLN-<2>tCPyp%hUDO^~sXZk+<94 zK0SQQncur-gd@PM{jQu!t*xf3+k2MJCj#gXMVn;u?FcFKxzw=530rQ`k939Tl~k*0jHN z4>?Sn3C(ddFqUh#sJbBEdD1!a{%LLV<^-h_`A+u_K^Z4rB>3#SFLZZWPRw32A~589 zS|jNYho80VtAchuyFb_Qv__~Uy1mm@WKuiTqyKLC`zIsQo>s5=t)2H}nf1Im7W?^O z!}+aKgfl{Jll+|T$D__vh&-uUe&9EpqHMrnnRZ;=rhSIt;fDT_=^UJ+ZdKzfAE;wc zHPShj?5`zSAHZ?=bN;OuVfQO$EL0o)JYh@uxuAr^lFELShGBNG6g@7yaG5-tk`GIw z;at4AcYgLI>4dwP@jQ}B;pTe0pE5_^+#j~DIXGG$zLu0rhz?KxjpJE@i14`&Yqdrc zqO2Olc$bE5)1Aj);fjtBVYVgsJz zBxf8JD1C6Ul`U|O@!W=lq%yN3QXTcldVY2t<8g-XT1yXX9usZcc_aN$XVEs5FIh7@ zd~z2r;SKc84Vh9ZUd}Boh(4C<*`s&wvFrNQ$>~!7_W_eQxwz zOS`W`NHb@($Ir-Y}MX z>5>|G^KI`F0h#4P*&gSwjgN0vZz;_x-sBl*VX%|+Hl(>}_}#*(*)uOL`u zR#rZ_Y&YC}n_~IL|I)W*K9_n?wL67-x+!zoVC#^0z$ejdS%Hcv#)*R6R;o?)AAO~+ zn~rLK@XKd0?2WFuo#Ip@u{X#!k8*5vkmY?9*An5E;~n^v`_1~vxobUs>vFWM@Vi(= zImG4^K;@8~^85IqgTyiP=E%nOC8v{#$e&>IjIj!>u$x{!L70N>K=S?!r z6R0HrB==A@%cAEKCpI=|oG=L(p|lqyc~X_`?Gq0!Zw{=H-0yF@Usght^xBEoOtxeT z?T*w);LN2eII9_IO|wi3#EIzqajW)7XWYALZf)NCp?PYz20hB$wtCpdWLnQiYaU8j z88)eBQfE3ERNpbs1^gSKvp*nIoqBzUFik*wu+B$xf#m9)%q#csUFOq+I9;GE{n`S3sUQ|@4Rw+qM zsqXMT8PK?lW!9g+th{)ye((XQ9%uKPsXYJiGvBlGs&7bL<2iyC&c|^ z(&xYIwLSBt{<)&X0Y)nAOAa}-Y1rj1TjTcpkinlL0TTWXyI*lW5Q`q$6hEuhyxr@- zwk@r>9Hrx3Y|kG(Q2xlP#5wBMzukW-dg^rQy0^#LnVBP0nVAk2?+w@$>e6?4f4(mF z;}2>5VMJ=}W~uyyv_eX;VXG~dF;i`l_ujsB>@CV7qp!!JI3w8)sM%VcY)LrLZ^5sV zwkeo()%ojRa#miq3h*m3=L;*7>U+KMxC@uXuG`8H#Tkx;g}*;l6j$(?IM*AvXHX@f z#kEkOmH8F?;xxrvLj3Fj-Lv*(8EYS!&Mrcdi2CIU9%eY5XJ-FV5?KaGR zesh)O)(s)?bp`8R^D?pP=KLMK!sXPn-s(;@A=937Vbjmtg(4LMrKQhGYR`uqVlTXRi88g3d)Rs1i;ppx3Z|j1>BRH~CYPKEmF>%p`sun*j>bGI$kETM zIvM)FPu7a#eK${W+@0*CkP2#wa-Ni8xoU#&{kU zDaht=u3o@^3C{XQ;qkcyhTs5yIXh4sEGT3@FeRDbtElDXKz4AV5XhQ-E-nP}*SJON zDsv0KEAzeTZ34ZzEI6DvhL{ic`3Vu3KG8r#V$qkbErtL)z8r^>#sFJjj-~+`X!^N( zIy*Re5)8bZ3I51&7rjg*W?nwgzv}_ir?6#)3Qtr!%K1xFMpBbmIWqNNgMI>piJ*`; z+)h|6&`5>T|M@3!^!lsgX(|*O-Tf@1BkRdLR!Gjq1t^@wt(6X7dF68!X0SrNQY!3GPK=D;T+JAfr$<9 zEmCwu106D%NXEPSQV8CRMhp^)=||IVWCLskxEs2OYJy-{8i_POT7mLMsd)aO4?FsS zLIj>HiUxTC{7=jKcTmqi#e>mKaPXpcIl|Qmcs`j1OjhuY42HWG{`@5_tz5+EN^7*- z^}y*?bXYSvI;zS^@{gZ-NbUVU+K{ z*kEV_9aY28mx3hB?<4)&fRexyi5`9=OC(F_cvBdSFyvN7E1b@}g|wUnsY4!fD>kKH zy%oJ95%PK^sVm8l`-EWr028B{`u1NY(^_X0M9AUo_I#pX84-YEBScw~4*Y9@*F>e_ zck%HW@BmhtmDZKnI=_ac6^q23-F0&LZRk5ExKj*e100UWfR1V~pAjvHeq^Tw63wPt z-BS+$qY5}t3~q(tk8zB|X-IJ-Ho<_%grvO|LlZKhqam}LwS%VzqXg6C8-T~>d7tD3 z`>8-Qt--)F%zgx8B&>Ca|8WyAtf8CO6n({lj%9#EK8Ra5|0RJuCBe)0djNM0q6V9y zt1W+yWF(T$oXce^SZ@aAVQfZav8E#;Nq^qElm#b|tv0q}rO;_DP$`Bn;2D@(Xfhv` z$4FlN;<=(*fa!q?EANsW9nRp#20RW1j3mr#m;u%&$f8(zN%lYCF_Oor-uCGup!$~3 zPH_M1qr+(v9Q|B>vexRsUtYNuOlJczi0!YK~~T8E=L1&7*^Ia_EUEI36GIHTbJ1to!|~b=rVSQSbNan4E{}n3oWXXVNt#4 zp7rS#z+Hua#txBa&z~b1i6nK%hJFEJ9{2=S8K_p`O;7y3me%nkcoDq+eI*v{Qhmu$ zPN5=L5T1dBCAQ~mK0k%h&sE6cD051na|`4xRd6)6=c|tX9LcEXDed*2v?0~3fOS4L z8(xlBn8;Y2@UG<|V-PtL5Q!ov8^Rv+%nw+MWUUZX>G>TH?Qp@ojB4Jo^r!`P4v59L zPQ7R;gpZejcfk*+<{GyUh>;+5*?LWX`1C2bL{StR&IOjgG)ZqhOD#0U5LJog`7a}c`nf1X07;6jUJFGP63v|-Z zG)B_&IA-uN022jySZUr#^e~tkHJlwtu%%`kUxpI{*}-73CvahEewB`vV@i z`rYZHuyc>vgu@|E>HljQb@V)X^COzjzvqZNefX~}`pAGm>j313AJK2M#v<}z1@ZM2 zWi&qni8eX%`fK!?6tQ76#LGm7pcR3<84dm7J1_~VJzDdf@YSH`_b;M#%u`TrUc*u> z#28S%)y&XR&|mY#`en5^J%!#ch!XVoPq0QEQenWLH3{-X6?82(7IA6kcf@?^`R{8h z=$;@&-{{g^tY6N-y7jAT|3lDF#`sS`BFtR1KAy-tFy4tm1M+3_uTJ$B^@mV zUA2Rym>V;oFo;n^3;KB^wm-q9^c4CSMSO#P9Dxn6J}U+cM&W@zfQR)Cswvqrp`K!( ojey)5eToe$Y*agL2cP?PSZ`*u1ZHy_4iEp@pqGC3FpJ{;4=icU82|tP literal 0 HcmV?d00001 diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/SQFCommandCollector$1.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/SQFCommandCollector$1.class index d0b8ee47c38a1ef823eec376f54e9495713f3a19..9575e952413e879a013fd39dba9c03cdd39139ae 100644 GIT binary patch delta 34 qcmX@ZeujNR1+y5-Mg~rntqj5}+Zbe7wlk=+>|iit**Uq7*$x1wnF%)l delta 34 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 QuC$ZZ|8C%)fcW441IQUZNdN!< diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/SQFCommandPageProvider.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/infoCollection/SQFCommandPageProvider.class index 20952a6fa63e88d99baeb8e6d0b922c632fb03ed..3efa039fc691b4b33e7cc70b441b6b536aca9020 100644 GIT binary patch delta 1292 zcmXw3Ur~pk}+o#|K0u?HFk)SnoH0_PW zBe9;a1`qml^y8rQm$M`=Kv?1K47G$K&F(;1@n)Zlmk6#jVoy90^;gG3P3;;6k*C3n zW^o$UF@jO6LCU8iR=?Dd7{pN>$8emG-MP1uaF4er!zmhywfLWTt}WaYFIRAa`Sb~Z zlR7NyB*>BOs*cWhuRuPn;}z^CNYQYtCEhBo&ghuL6hZ9{$Ajrxg2Ve%QH_Gv2zl;3 zJ<(`SSJeGLprO0i&E(xa(cK$5-b5jX#=9aNGktOcNrOn~xMcmR)HuE*_^koSpRM34 zt4%GUZ)Q%Z=SiK0j2wWjTa`JFsE%0#1I{Emtl^wMwb5flY_tdDIaJim!CO}{3ttKk z8T)OlH)R$!HlfD@QjILpBcA znv#v0sij*2H-*OnN)qkjY`n}B0&4aKEs3?JDy~GSv3YowtB+?2ivq$kF$pP&6+;@W z)^Z=7Ui!&YP1VLJN3)GrO+|1Qwje5K+Nl3OZ^>F_H3QQ)%T!H;;{;tb3I9cy>0Cu* zH{@!KLN^N3A)_Td7#puMXu278aWg+#f9hq4O6))t>JY?EY{xE^yID43A3_-B^C+6| z9>VyP<1V8W^JvF)MDYXb9}&Y%bmA9u;TF2_JL}tQ|Bd}b=p_fQwSohrv38-4R->QR zBSD)mKox9n!QlkeV1#yHlv-IwIVp~#bP(foh*xop*Yy}C=mbvEBrKX`eUk9l?3L3kND0JIQfQZa7hoXSqL# z`&@(fS;zoSN87eL?4V?*O zGA}Zkn{OV6zQjY8WRMJxj0zcE8Bg*V)%XXIyI3QmR>t6ccaX=vyU1lp#aWAx7Ey3V zf$jiQg_0x^_8KPJ3-@v#XG1tv#+S z_g}`9<(Nl#R9OtCa!d*Dh;_qN>Yw8Y@`sJ9_=250X`UVbcGC5$c%q_y&K$_NX3VGX UwN;o~=33z8;3vViEVJ<4e~p|vFaQ7m delta 1155 zcmYLIU2s!X5dJna_vYT-HZf3!tBj=SP%BMZacXfQsBwx9ScaLZt(7Q=X`n4>?6e7( z(vl*SB9^vrz)JBCEd~{}C3;gRBI29O@Xnhv&gdJAZ%hT_p3oUz_B*@h+ud)^&uHZz z9{sm}FJA@FfM4hIwi2hernx(^CsLn?CF@^pX%>^VmATQ9R(hn`fp-Xcv?uy@BH5Kl z#dK6*z`#BXih{j1u%A%o?Tze;b#-_Hb?ct-On|AkJ3+d^?l;5=TW}ACx9xwVWv;>p|WZLsM5KyyN zZK{4#u@G|UVTs|A4h!#EI4FX~icGic;~wQM0c}~Mp2d1olOfsey=$miQgG}+bJ<1i zOq_<2McE;pDsX6AHS4CK2*e>;QC6?SK1Fh4ATViEdT_%Xv(1dopgzb0*Z{T(8KnP*u^U$q$2G?5NZ0R_Tnzm_y+?hU>^|%NWmZ( z7$P4s)WGj<1N%XYWN0f!X&a8vn~ZNEP2CuyBqk`0NjiXWI*8+R7$;}~f@T=cvpP(bj}2tLBcu%Us5@CiP}GCV_jc#yLwL6Ca!IrHp1aCZxv zFW4DIHD(x9p6U+H6=OH>C(o^M>@F@L%ViuqM+oP6rICiG@fE&?&JyeJ4QFV$z%mRL z@F4SB&h&Dm2}S`;;zIca3=mIO^Q;@DKQLi4){wurWtt tPOW^hx1Ih{i%*AGa31rb+V!Y%$-R)rPhyL!&iOOnEuSiWVQa(n{{XWpC13ym diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/ISQFParseInformation.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/interfaces/ISQFParseInformation.class deleted file mode 100644 index 00e2cbe5ce536d3eebf1f7a434be7dc18305ca01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819 zcmb7?+fKqj5Qb;*fS@R#cz6M$F|jw^p2P{!#h zNGpl)t~3Ai|Nc(r{p0lw0IuLT4><-G8mC-3(esc`9U%?ZBlLLWwA_C40d>S%a-?*K zMktwwbq3`zPSFWa`c7{!=AL0t^|`qd67{S%;Tnz75rfLvdE1W0Mg&d=Cv^q|SNIZ5 ztT}^zR=@rlx6ZE7Li+V~I^0M#R1gr7vN!{bxI-ZuDhyE$>$l`zSp>P~vlpd@l%tyB zv_)iS@bp)61%2-LnEA3YQEcxAl7PE$fO=^G$(Ze>$2#Z>?+LZQLBJ_rFBOIMv?9r$ zdzky#Ez}5{qI5A#NCn&Xw4&#m|58H{dGr_QZObUly}rGRu8OtCn I9NJ_@pY|r&OaK4? diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/BasicErrorListener.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/BasicErrorListener.class index 9cb0965a04a2594564d21ac66549587d3c68d74f..b00cb3809a9076d8db324cde9ab01d12824cbe26 100644 GIT binary patch delta 54 zcmZ1|uu5P;A*04*1xCq<-Q3LnIVlsTsWGZeR%Dcb@;5$+XJOQu?7*r9lHHufx|<0A D!4nWr delta 37 qcmZ1_uuxz^A(N`l!~@C`XR0wO1L=*=;#pYKH8eqDoAX(BGXVeq=?zu@ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseResult.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseResult.class deleted file mode 100644 index e06e4a92a733d07e4ea7f59b17f16c8e0c7c6bd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3017 zcma)7+j10D6kR=;OOj~@5(qI!1Og$+3@~1zC=(+DMI)00NepuF(wUr08ah2gcTXg! zFFsl7gU|c`FFa_KKt-x7p0vsju>2Zv?bAJzP9PSQ>dEPI_Su)U*V_HpzrXzsU=-hE zkT7uAvsRT`^lvVz)neW9eB~8aY`;>xAnS|DZ#Y2)NdvpCTdP*lvD|8LX5qT3a5rsW zFn-;31LZAQ73CKvr!4P=@@5aGB|7?w^5>0XJQaX2??Vc=!wS-`&=5iB0#Uzb(tG1h_WK8 zwWTFrvB}0HUmWFDgJtQs@_nnyOYOc|Rh}KJ8R)F4AS{u%bPtbgX*NMP{?z9GGazTx z>&{x_bFQY5i(|1ZCrcyq0?DX}*YO6Ew8>p7sCn%2rW7Wl{ZbZh;#3B2G4Txmo2Mp9 z7$Z!sx zR@QjS?xcwi#kmGK1YfqxCZ@zVOGmR&C$dOk#>55eH(*vgWd$mPP>Q^0Vit2ua@q2y zbv=wr4rKhMnuj(qdV7cs?5H$6Pq|Uk4fJig8J9C{X9KHpW6G*W^66MnUR7PPg-yf5 zn=WoAqLKMd%JfqcpCP9y=vAp4+55u82^6K{3nnTc)zc*W8OLEx5$E+tI$Lub4mZ2z zlJ}zdB@erzwtOvAnk*(kZAO=7mj@7U8bWt>zWK*PkU%!T$!%?&KuN*wr0Q&~;Z@W*TW07koq71lIUy3mAwt#0Cxrz6IC{D6 z;KwV0PCjf4*CzKky!pG6Zxh-c*p+|C=MlOuKg6E<==nw8>g8{a7CkTsfReQjzbAt+Hfo>0eLzsXs6@h#mFgL zUE2|OOiFF@s^E#nE9OG$H?;Yn}ik2iSt-^v|*5wtsD;`pk&d*#VSP2+NHeZR= zl8V9_+<7f7XxI{f;%iyx^L#Awm*Qgwc%IE!)vjI zn=RL7tKnv=;byDhW~<>QnhkeRiz1IlWvBCnsI;)tA;}aAT#A*GZpBP%RR~GyElrHl zm+&KH@?P6LnubgW$>+yhWFr^SVPYy% zl!G(!6{oP;O5xivFHH(3Wtc~o3-l;S8XH{*!+#sQ$cY~5*oz6s*BW?CEJOnn(P${= zHJw5&3~tfFI)Vi5Ag6^9%Dt(Ce+rU%GA4!ZI4Qoz0sO$e{)m%YpT@b!N~T58Y$ diff --git a/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class b/plugin/Raven.SQDev.Misc/bin/raven/sqdev/parser/misc/ParseUtil.class index 3700cced1f658e38a20f66b2ffcadc5921c3da28..c2e20762549913c6ad0388e67a922f2e38f1ddd9 100644 GIT binary patch literal 13175 zcmb_j31C#^wLWLE+{xs!29d#qK@>;`M3kZ?s12J$vS1c)-002ZCR~}!#5)rtTC3Go zTdQ@cOL4;m#a3$-?SvRyuvUF8uZy*<+q2c$x>T#J+WM@e-}&!Ma_?j&!1Jk@d+)!T z|Lo`d=l^~B-w!@aL<@W~H1aV`w~Y;EtSWIvhq)o72JLQ*_pL{}TOCEuzsKm{}b zI3(9u38oo&$x&1YV}%067!b&0&8}BGw&GQFv7X*!OVT!t?ivpmE0#3vP9tI_s_HVl zZ0YUkiCU&zQ|=k60H;Nn8QN?ndZS4!8(6k6V)i7hcr2mOflOsXD>n`G2>l_Qil|tl zgP6v8B^;pXbg(e&5T=7>*LN660|@s&?CvLBcx|O*MjQwN5p(NVI-j-@X{r+`jte7zZ4ZbXuCyN{^?NM$jywmp%w(GLl_$Er0K>$HTH0ua`8cQVZx zA&`7<%2$i#FW2cfS^+aw*xTz(y9F2-UC{H2*&eNOv$?@gBcXnATZq%>c&L3A0ZY~y zg1>3IbUHwFR4=;Iz%(Vd)(c+KsY$0*bOMYUy2n&Lf~vY)(1D4lZi`MD`88?-S!r9y zn1LOjRytUIPShzZ8Z3l+R8~4q*69>F73!y^GlfR3uh`xa@3kW)mc>v@ESG7YoTe-; zGi|J3Y+k-*&>S*sXdf&9mJ6Nt%o^3k{Z`CzAxwv4t5r_ELGxRZMr1v#A?@S>J$4+v zCIO6?&fDX)Jvh2G25{(Ge!TQ)L}1I-Au^hmWQjmqgZ5N62foQ(nY{ZSserJiXa`eg8h4d=!kxjCM$L%w zqm#B6;WU6N0v*v~9k`b3vhs=1h6iX9P0;8@IB~bdr>Cgod9jhOB3TjT2AOm-ym8#_ zsxo59s9m*TL6zMbOIqD#Rc&KyeX}P>Zl+tsL~cVk$-xEjIk&^oa$u0AQDx$#w3U9K z(Vbb@SC+h8Y}4t7bQjVbnDk;RX4riz&Av0^b_d+wM32K1<3iT7m42ktJu+oHrnI?d zNawve-6x%6(5aHIMx)zI1ZWH0FT_2-)H=I9CqpDgIRUK3m8z*#clRykzJ*dc^^3Vr zvd!-J2Gb)Ag~5PM57HnIH##~zy$CaTkWy0ej8&fYA+R?$5%KQsc+BxtNy+B}w1XZI z${&RyTgv&A#A}PVeJ>S_nBJdASQvwx> zdS0hr(+kitL|lg^7anEq$g8F}1pHQ~-_eUs1gewGQIBonSCYl@+-hYcV^y`SjV)Gp zZ&X|{Z2x6s%sHheV;xl7GfL=HdQGGMLBP*H%QibKl}$8YN2=5B=?_R_Tk7k@^Y7s- zgxHtp4W0f-Z^9mhD;}Wvl~kea8JiaOpLKdmHdK<-AVPFnQB!39j!y5=Uy!{fl7Qa{+{Kn zda}zBLo+0=yQ`Ewp?_-h53KFgE1f>2|3zp|SZA54L{O*EzYs><*eEoH^5Ip6WtY%r z^lzPZF{0Ag=BBpBrE3>A*DhJPthEJ(=pkj~!=qtHOI_n}BZmZd zERWY1^^d6|Xl#X`r0S5+c>+&FYS?MTI@)6G1}r;bc6e9-XTK~*%sF{?#E&p+h=wQW zybn)CifJX5b@wE((M7T5BsfBzA{%^N%JaS_w2e<%y(-b*AINWt{SYn>eiVNqjPF8!%jvnQ3kwD9*0N>~IZEgF02` z(|9e2?KbT$bB&c;r;0Cb@#gnkj#Fks=XQ=ba#4O$k}+o+mQ&+~f|87@39!js8h4@! zxBJmLuVc%pJS{aNRsx${XEC_wlkNG(fPnDKI?%W>+6dfu; zSLT|RC!@!H%Vz<}S-ClvozP==k*cAh=ALU6ch-)vrAes`W-2&&G;>LIdWng}4z*B- zQC3lkW@B`rm!M9JY=9-(;$OE>}zTam`|owB*enYHKhp%r_s7YLEL2Yc~x z9IoXAl1rq5)^?q*;;RMbgOW=Osw^Z&{*asRa^_G59G04$2F?c> zj4msJGfDWjk`}8gX2@wAQ&T3V&75huJyPzXT4#K?yj|69z{WC1op4hcKbpx&6~q-r zVjT_*0{jR~@bgdMWY@|WsK!6bDymtq`h0Nx{3O$wR?G`+NS~^P@QzbwD=L-ekQGZ< z9cC!r8S3nfsjW47V;v!+m`MYjq2xL<1o@-B1Xq&?by+yq4khCuD>*N~k25M96ZvU` z>l_;!mxoUCL(b|J@UuEU$0&0Ys8gLI-80jvv1?`~SsvNs=U*V}TH6_mtW890t0x%) zl79Y`w^2$ie*QI6cWubQB10Rho{G8*;jou#N_#(}hr6-BJj}Er%n{9uW!eyijenN=4$R!G_{? z2r+4y5m^_C#^XH+KmQ)vsI_P_(T2UUi3MLzH_0%yf%5YonNG{XK@Ap76zq+Rw{bR?0UEcfhF6H&(C>ul6qw-YK14Yzhda(YTNT{{`~m-6+|5VGOY@{v zuJSf&y!;8%VSBTV!V(+qkLhvwNokC&{ZV@Z!BfQ!@TdGQ!T57*31-(xD)2E4Xg-vh z_6n#%E0cBvc$d!ypgt7CW;kpZO-iz+uL!kB9|~kka;G18`R?!|t15~0{YYngsH)Zc zU*M&+0L-EH11Rd9s`K>;onwKYP5)2f__-2nvQ;-;_4~JV!3-$`0GYbH{M{v7C!=q>!be!xCNtmK;X#c%; zkQG81Z3E<^_MV)yh`|@<8pm=3N#u13avQ3p^Q80!H0w~%vzJ5-Y%UU-ZyM9Fd#wew zM>_%2T|(DHmjS08|3*N56Yi>Ykcss=(XW%Q>~lIzqnR2mKn3Nv8>2-q zo4~jtJP#iv3tU*=P+5_pXo`9UDH)zq*-sl92dOWN#*!K3%BDaRfLO zgb*bl@g$9>4UoV_s>H2_`9N5Ny1-e2z75pmpTp^5`VJ8ALoeFt5}-R3NL@^l)|YAngnXi~H%P)ml(X(Gx)p1D>pu_ouegvnl$Oy#D4< zdTATIlA_mx8W{U0X?wfckD>3S=)(c}nCT{-Q{jJzJ_{FYqt9Eyh1-~0!bRJ-uq9l) zjkT7rwv7WV+j&fNNw8#q%b2dCPlLrN-gl6L;eOt)Iv`*B4=~(EwZ4_k59$LvgK-pG zUR@e29pE_#zME;iyv{>Wt?Xth-b$wkFqtuSD=iO>P0yHLJtjCN#fLx23sZcg%z*#9 zg$~JTJce-)4j}sm1Hmx^TfaNQ{|gzBszROeTh z&JC6htz0PYD<9>?6t5bB_d;dRpW@a^A@{^e1(HtzNBJwlniO|b2e$F)^46mixKP>S zV{|B#=td~yW+?D2P{-SF$7l;3hUXDin6|^39t7tH(Ypg*58?Mg+DVVlGxQh^ryr*m=?VIXo}^v$6kO8NJeHp2ne-gj z;6Qs74zF8q3VkZty66c$gI?jY={3HHUgyp92KVE+liuPd>1}?F-r*PMJ${AW=QmI^ zd6zy^N`EV`hZ56iyaDv!jn8xpjo+kp-Uy{1&#!VHp9SNX%FpxJ{8bp*5vV7e!(W4u zHt@}SE}sWuIFYaBuk-mZ#*1-6Z~=bu=DAA)u{`WzTn48gbpAq4)5ucg2) zoF9+TxKX368g0_(28}jrv_+#G8tv5hN{v3jf28rj1oj@X2V*rZPmeC8al3__9-W?X ztuZD#l6hWZuseQ>J9h3u^9|S1}S6$Gn2P z15U%o4*@41Kdf?(N|=-2c-0_30$%J~Sy9H14f5k*Jj(cqetv3zpDCa8Ncdoe$8qALm9u}Zhq5g{&N|>J=`q(cT$peaE|yO@O}oB z!H9x*PUAyp28^VIu73rJQogQ9{4hsI=BkgT@S^j z)G9ig=hKCJ7+r$rmApXlP_i{YTHfWqU_EgL!!7UOE6DHjUmcAC76ouIB*};qg&PL> zgK%X({|#|@M;OV-!-&iLG2(JR|3gJ#{^uZn8ZPMP&#H@qMG^)6omRnWZIE|`=k)uy z+8@+{euQivRPZ*$3!f&z0fT*kl&>^cGOU#gl>`^Vfi1-jbvfDw)FVM`o@8>66*4ehvW4@Yfke`@J$4j`%|m0 z434*uW>KAQl5Zba(n6}H65nKK&vL5p?F+5ea3?+Fo8k+CgAriX?wbl|KHq-ekGy9smFU literal 10646 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