From 19f31541042fa8b3dcdcaeba5468e241cfdfcf3a Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Thu, 12 Feb 2015 21:53:15 -0600
Subject: [PATCH 01/27] CSE Soundwaves

---
 addons/nametags/UI/soundwave0.paa             | Bin 0 -> 25425 bytes
 addons/nametags/UI/soundwave1.paa             | Bin 0 -> 26293 bytes
 addons/nametags/UI/soundwave2.paa             | Bin 0 -> 26529 bytes
 addons/nametags/UI/soundwave3.paa             | Bin 0 -> 26253 bytes
 addons/nametags/UI/soundwave4.paa             | Bin 0 -> 26802 bytes
 addons/nametags/UI/soundwave5.paa             | Bin 0 -> 26662 bytes
 addons/nametags/UI/soundwave6.paa             | Bin 0 -> 26473 bytes
 addons/nametags/UI/soundwave7.paa             | Bin 0 -> 26996 bytes
 addons/nametags/UI/soundwave8.paa             | Bin 0 -> 27615 bytes
 addons/nametags/UI/soundwave9.paa             | Bin 0 -> 27049 bytes
 addons/nametags/XEH_postInit.sqf              |   2 +
 addons/nametags/config.cpp                    |   7 +-
 .../functions/fnc_drawNameTagIcon.sqf         |  20 ++++-
 .../nametags/functions/fnc_initIsSpeaking.sqf |  77 ++++++++++++++++++
 addons/nametags/stringtable.xml               |   9 +-
 15 files changed, 108 insertions(+), 7 deletions(-)
 create mode 100644 addons/nametags/UI/soundwave0.paa
 create mode 100644 addons/nametags/UI/soundwave1.paa
 create mode 100644 addons/nametags/UI/soundwave2.paa
 create mode 100644 addons/nametags/UI/soundwave3.paa
 create mode 100644 addons/nametags/UI/soundwave4.paa
 create mode 100644 addons/nametags/UI/soundwave5.paa
 create mode 100644 addons/nametags/UI/soundwave6.paa
 create mode 100644 addons/nametags/UI/soundwave7.paa
 create mode 100644 addons/nametags/UI/soundwave8.paa
 create mode 100644 addons/nametags/UI/soundwave9.paa
 create mode 100644 addons/nametags/functions/fnc_initIsSpeaking.sqf

diff --git a/addons/nametags/UI/soundwave0.paa b/addons/nametags/UI/soundwave0.paa
new file mode 100644
index 0000000000000000000000000000000000000000..27f34b38abc77d69ae2b9f0ed0793e00ec7f78fb
GIT binary patch
literal 25425
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

literal 0
HcmV?d00001

diff --git a/addons/nametags/UI/soundwave1.paa b/addons/nametags/UI/soundwave1.paa
new file mode 100644
index 0000000000000000000000000000000000000000..ce4f85eb6941214cc6a169b42fc9afa0f15b76ef
GIT binary patch
literal 26293
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
Y%&6?v>ShSGEY3n{M(2=B;(pTq0bZ%YJOBUy

literal 0
HcmV?d00001

diff --git a/addons/nametags/UI/soundwave2.paa b/addons/nametags/UI/soundwave2.paa
new file mode 100644
index 0000000000000000000000000000000000000000..0bc59cde24940b831d94bd6d4f9fb9f0af3fea27
GIT binary patch
literal 26529
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

literal 0
HcmV?d00001

diff --git a/addons/nametags/UI/soundwave3.paa b/addons/nametags/UI/soundwave3.paa
new file mode 100644
index 0000000000000000000000000000000000000000..39f3e8e95bd9e86515becd853e69cfe57ee29b2f
GIT binary patch
literal 26253
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
aumlpb=d8N;uGNA2NV>rZ8fK~t{{I29r?jR3

literal 0
HcmV?d00001

diff --git a/addons/nametags/UI/soundwave4.paa b/addons/nametags/UI/soundwave4.paa
new file mode 100644
index 0000000000000000000000000000000000000000..7ab8b6d9442a2456f681099149d59fd112790773
GIT binary patch
literal 26802
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

literal 0
HcmV?d00001

diff --git a/addons/nametags/UI/soundwave5.paa b/addons/nametags/UI/soundwave5.paa
new file mode 100644
index 0000000000000000000000000000000000000000..f3e98d47aae32588a8e588d0a3d9be43374f5318
GIT binary patch
literal 26662
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

literal 0
HcmV?d00001

diff --git a/addons/nametags/UI/soundwave6.paa b/addons/nametags/UI/soundwave6.paa
new file mode 100644
index 0000000000000000000000000000000000000000..3f29976c9f699164faa77b00011657e2a55fcbf8
GIT binary patch
literal 26473
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

literal 0
HcmV?d00001

diff --git a/addons/nametags/UI/soundwave7.paa b/addons/nametags/UI/soundwave7.paa
new file mode 100644
index 0000000000000000000000000000000000000000..e705c70b422e2d41e0475a62810c5c2281c1cc92
GIT binary patch
literal 26996
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

literal 0
HcmV?d00001

diff --git a/addons/nametags/UI/soundwave8.paa b/addons/nametags/UI/soundwave8.paa
new file mode 100644
index 0000000000000000000000000000000000000000..e6027d878a7d32fe6f30c326c15f8141b146863e
GIT binary patch
literal 27615
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
M2SSME><eB02UmgJOaK4?

literal 0
HcmV?d00001

diff --git a/addons/nametags/UI/soundwave9.paa b/addons/nametags/UI/soundwave9.paa
new file mode 100644
index 0000000000000000000000000000000000000000..91ddfd02df6f0953787d057c55cf30dabcf050d4
GIT binary patch
literal 27049
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
LFm-eGg|7bxu#VuD

literal 0
HcmV?d00001

diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf
index c73ec08cfe..127f639003 100644
--- a/addons/nametags/XEH_postInit.sqf
+++ b/addons/nametags/XEH_postInit.sqf
@@ -1,6 +1,8 @@
 // by commy2 and CAA-Picard
 #include "script_component.hpp"
 
+[] call FUNC(initIsSpeaking);
+
 if (!hasInterface) exitWith {};
 
 
diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp
index aa55dd2aad..c7ee208a60 100644
--- a/addons/nametags/config.cpp
+++ b/addons/nametags/config.cpp
@@ -41,7 +41,12 @@ class ACE_Settings {
         isClientSetable = 1;
         displayName = "$STR_ACE_NameTags_ShowNamesForAI";
     };
-
+    class GVAR(showSoundWaves) {
+        value = 0;
+        typeName = "BOOL";
+        isClientSetable = 1;
+        displayName = "$STR_ACE_NameTags_ShowSoundWaves";
+    };
     class GVAR(PlayerNamesViewDistance) {
         value = 5;
         typeName = "SCALAR";
diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf
index af3932f118..cd8b9b0452 100644
--- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf
+++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf
@@ -13,7 +13,7 @@
  */
 
 #include "script_component.hpp"
- 
+
 #define TEXTURES_RANKS [ \
     "", \
     "\A3\Ui_f\data\GUI\Cfg\Ranks\private_gs.paa", \
@@ -46,11 +46,23 @@ _color = if !(group _target == group _player) then {
 
 _name = [_target, true] call EFUNC(common,getName);
 
-_rank = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find rank _target) + 1);
-_size = [0, 1] select GVAR(showPlayerRanks);
+_icon = "";
+_size = 0;
+if (GVAR(showSoundWaves) && {_target getVariable [QGVAR(isSpeaking), false]}) then {
+    _icon = QUOTE(PATHTOF(UI\soundwave));
+    _icon = _icon + str (floor (random 10)) + ".paa"; //random
+    // _icon = _icon + str (diag_frameno % 10) + ".paa"; //play in order??
+    _size = 2;
+} else {
+    if (GVAR(showPlayerRanks)) then {
+        _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1);
+        _size = 1;
+    };
+};
+
 
 drawIcon3D [
-    _rank,
+    _icon,
     _color,
     _position,
     _size,
diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf
new file mode 100644
index 0000000000..7d632e51dd
--- /dev/null
+++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf
@@ -0,0 +1,77 @@
+/*
+ * Author: Glowbal, PabstMirror
+ * Starts up a PFEH to monitor the when players are talking.
+ * Compatiblity with TFR/ACRE and Arma's VON
+ *
+ * Arguments:
+ * NONE
+ *
+ * Return Value:
+ * NONE
+ *
+ * Example:
+ * [] call ACE_nametags_fnc_initIsSpeaking
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+if (isServer) then {
+    //If someone disconnects while speaking, reset their variable
+    addMissionEventHandler ["HandleDisconnect", {
+        PARAMS_1(_disconnectedPlayer);
+        if (_disconnectedPlayer getVariable [QGVAR(isSpeaking), false]) then {
+            _disconnectedPlayer setVariable [QGVAR(isSpeaking), false, true];
+        };
+    }];
+};
+
+if (!hasInterface) exitWith {};
+
+["playerChanged", {
+    //When player changes, make sure to reset old unit's variable
+    PARAMS_2(_newUnit,_oldUnit);
+    if (_oldUnit getVariable [QGVAR(isSpeaking), false]) then {
+        _oldUnit setVariable [QGVAR(isSpeaking), false, true];
+    };
+}] call EFUNC(common,addEventHandler);
+
+
+//For performance, chose different code paths at mission start based on installed mods (once, instead of checking each time)
+_pfEHCode = switch (true) do {
+case (isClass (configFile >> "cfgPatches" >> "acre_api")): {
+        {
+            _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false];
+            _newSetting = ([ACE_player] call ACRE_api_fnc_isBroadcasting) || {!(isNull findDisplay 55)};
+            if (!(_oldSetting isEqualTo _newSetting)) then {
+                ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true];
+                // ["IsTalking??", [ACE_player, _newSetting]] call localEvent  //any use in ACE for a "speaking event"?
+            };
+        };
+    };
+case (isClass (configFile >> "cfgPatches" >> "task_force_radio")): {
+        //Note: TFAR has a TFAR_fnc_isSpeaking function, but it has a fairly costly `callExtension`
+        //I think it's much faster to use the internal "tf_isSpeaking" variable
+        //If we don't care about the built-in VON, we could switch this to a pure event driven system
+        {
+            _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false];
+            _newSetting = (ACE_player getVariable ["tf_isSpeaking", false]) || {!(isNull findDisplay 55)};
+            if (!(_oldSetting isEqualTo _newSetting)) then {
+                ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true];
+            };
+        };
+    };
+    default {
+        //Note:  class RscDisplayVoiceChat {idd = 55};  //only present when talking
+        {
+            _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false];
+            _newSetting = (!(isNull findDisplay 55));
+            if (!(_oldSetting isEqualTo _newSetting)) then {
+                ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true];
+            };
+        };
+    };
+};
+
+//Is 0.05sec precision enough??
+[_pfEHCode, 0.05, []] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml
index 9cd99adaef..aee850faee 100644
--- a/addons/nametags/stringtable.xml
+++ b/addons/nametags/stringtable.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Edited with tabler - 2014-12-17 -->
+<!-- Edited with tabler - 2015-02-12 -->
 <Project name="ACE">
   <Package name="NameTags">
     <Key ID="STR_ACE_NameTags_ShowNames">
@@ -69,5 +69,10 @@
     <Key ID="STR_ACE_NameTags_ShowNamesForAI">
       <English>Show name tags for AI units</English>
     </Key>
+    <Key ID="STR_ACE_NameTags_ShowSoundWaves">
+      <English>Show SoundWaves when speaking</English>
+      <German>Zeigen Schallwelle im Gespräch</German>
+      <Spanish>Mostrar onda sonora cuando se habla</Spanish>
+    </Key>
   </Package>
-</Project>
+</Project>
\ No newline at end of file

From dbd33d52302fba6c560c3846a92c4921e9681cfb Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Thu, 12 Feb 2015 22:13:51 -0600
Subject: [PATCH 02/27] Missing fnc define

Why doesn't calling a nil function throw an error?
---
 addons/nametags/XEH_preInit.sqf | 1 +
 1 file changed, 1 insertion(+)

diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf
index 79258c5cec..b56841c2aa 100644
--- a/addons/nametags/XEH_preInit.sqf
+++ b/addons/nametags/XEH_preInit.sqf
@@ -6,6 +6,7 @@ PREP(canShow);
 PREP(doShow);
 PREP(drawNameTagIcon);
 PREP(getVehicleData);
+PREP(initIsSpeaking);
 PREP(moduleNameTags);
 PREP(onMouseZChanged);
 PREP(setText);

From ba2ee53804b6c50cd9e81e6021f6c3f31e868079 Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Fri, 13 Feb 2015 21:23:40 -0600
Subject: [PATCH 03/27] Nametag changes

Adds user options for showing soundwaves and default nametag color
Before nametags would show effectiveCommander for cursorTarget vehicles,
moved this to a module option (default off).
---
 .../functions/fnc_setSettingFromConfig.sqf    |   3 +-
 addons/nametags/CfgVehicles.hpp               |   9 ++
 addons/nametags/XEH_postInit.sqf              | 106 ++++++++++--------
 addons/nametags/config.cpp                    |  11 ++
 .../functions/fnc_drawNameTagIcon.sqf         |  42 ++++---
 .../nametags/functions/fnc_moduleNameTags.sqf |   1 +
 addons/nametags/stringtable.xml               |  11 +-
 7 files changed, 108 insertions(+), 75 deletions(-)

diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf
index 4151f3e0e4..e68157bfdb 100644
--- a/addons/common/functions/fnc_setSettingFromConfig.sqf
+++ b/addons/common/functions/fnc_setSettingFromConfig.sqf
@@ -16,8 +16,7 @@ EXPLODE_1_PVT(_this,_optionEntry);
 
 _fnc_getValueWithType = {
     EXPLODE_2_PVT(_this,_optionEntry,_typeName);
-
-    _value = getNumber (_optionEntry >> "value");
+   _value = if (isNumber (_optionEntry >> "value")) then {getNumber (_optionEntry >> "value")} else {0}; //getNumber on an array throws a warning
     TRACE_3("_fnc_getValueWithType:", configName _optionEntry, _typeName, _value);
     if (_typeName == "BOOL") exitWith {
         _value > 0
diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp
index e3c4227834..d61c761bfc 100644
--- a/addons/nametags/CfgVehicles.hpp
+++ b/addons/nametags/CfgVehicles.hpp
@@ -55,6 +55,15 @@ class CfgVehicles {
                     };
                 };
             };
+            class showCursorTagForVehicles {
+                displayName = "Show for Vehicles";
+                description = "Show cursor NameTag for vehicle commander (only if client has name tags enabled)Default: No";
+                typeName = "BOOL";
+                class values {
+                    class Yes {name = "Yes"; value = 1;};
+                    class No {default = 1; name = "No"; value = 0;};
+                };
+            };
         };
     };
 };
diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf
index 127f639003..fef1e4e4d3 100644
--- a/addons/nametags/XEH_postInit.sqf
+++ b/addons/nametags/XEH_postInit.sqf
@@ -28,56 +28,68 @@ if (!hasInterface) exitWith {};
 
 // Draw handle
 addMissionEventHandler ["Draw3D", {
-  if (GVAR(showPlayerNames) == 0) exitWith {};
+    if (GVAR(showPlayerNames) == 0) exitWith {};
 
-  _player = ACE_player;
-  if (GVAR(showPlayerNames) in [2,4]) then { //only on cursor
-    _target = cursorTarget;
-    _target = if (_target in allUnitsUAV) then {objNull} else {effectiveCommander _target};
+    _player = ACE_player;
 
-    if (!isNull _target && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
-      _distance = _player distance _target;
-      _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha);
-      if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress
-        _alpha = _alpha min (1 - (time - GVAR(ShowNamesTime) - 1));
-      };
-      [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
-    };
-  } else {
-    _pos = positionCameraToWorld [0, 0, 0];
-    _targets = _pos nearObjects ["Man", GVAR(PlayerNamesViewDistance) + 5];
-
-    if (!surfaceIsWater _pos) then {
-      _pos = ATLtoASL _pos;
-    };
-    _pos2 = positionCameraToWorld [0, 0, 1];
-    if (!surfaceIsWater _pos2) then {
-      _pos2 = ATLtoASL _pos2;
-    };
-    _vecy = _pos2 vectorDiff _pos;
-
-    {
-      _target = if (_x in allUnitsUAV) then {objNull} else {effectiveCommander _x};
-
-      if (!isNull _target && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
-        _relPos = (visiblePositionASL _target) vectorDiff _pos;
-        _distance = vectorMagnitude _relPos;
-        _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy));
-
-        _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha);
-
-        if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress
-          _alpha = _alpha min (1 - (time - GVAR(ShowNamesTime) - 1));
+    //When cursorTarget is on a vehicle show the nametag for the commander.
+    //If set to "Only On Keypress" settings, fade just like main tags
+    if (GVAR(showCursorTagForVehicles)) then {
+        _target = cursorTarget;
+        if ((!(_target isKindOf "Man")) && {!(_target in allUnitsUAV)}) then {
+            _target = effectiveCommander _target;
+            if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
+                _distance = _player distance _target;
+                _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha);
+                if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress
+                    _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time));
+                };
+                [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
+            };
         };
+    };
 
-        // Check if there is line of sight
-        if (_alpha > 0) then {
-          if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) then {
-            _alpha = 0;
-          };
+    if (GVAR(showPlayerNames) in [2,4]) then {
+        //"Only Cursor" mode, only show nametags for humans
+        _target = cursorTarget;
+        if ((!isNull _target) && {_target isKindOf "Man"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
+            _distance = _player distance _target;
+            _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha);
+            if ((GVAR(showPlayerNames) == 4)) then { //only on keypress
+                _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time));
+            };
+            [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
         };
-        [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
-      };
-    } forEach _targets;
-  };
+    } else {
+        _pos = positionCameraToWorld [0, 0, 0];
+        _targets = _pos nearObjects ["Man", GVAR(PlayerNamesViewDistance) + 5];
+
+        if (!surfaceIsWater _pos) then {
+            _pos = ATLtoASL _pos;
+        };
+        _pos2 = positionCameraToWorld [0, 0, 1];
+        if (!surfaceIsWater _pos2) then {
+            _pos2 = ATLtoASL _pos2;
+        };
+        _vecy = _pos2 vectorDiff _pos;
+
+        {
+            _target = _x;
+
+            if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
+                if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight
+                _relPos = (visiblePositionASL _target) vectorDiff _pos;
+                _distance = vectorMagnitude _relPos;
+                _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy));
+
+                _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha);
+
+                if (GVAR(showPlayerNames) == 3) then { //only on keypress
+                    _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time));
+                };
+
+                [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
+            };
+        } forEach _targets;
+    };
 }];
diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp
index c7ee208a60..d17c156b78 100644
--- a/addons/nametags/config.cpp
+++ b/addons/nametags/config.cpp
@@ -16,6 +16,12 @@ class CfgPatches {
 #include "CfgVehicles.hpp"
 
 class ACE_Settings {
+    class GVAR(defaultNametagColor) {
+        value[] = {0.77, 0.51, 0.08, 1};
+        typeName = "COLOR";
+        isClientSetable = 1;
+        displayName = "$STR_ACE_NameTags_DefaultNametagColor";
+    };
     class GVAR(showPlayerNames) {
         value = 1;
         typeName = "SCALAR";
@@ -40,6 +46,11 @@ class ACE_Settings {
         typeName = "BOOL";
         isClientSetable = 1;
         displayName = "$STR_ACE_NameTags_ShowNamesForAI";
+    };    
+    class GVAR(showCursorTagForVehicles) {
+        value = 0;
+        typeName = "BOOL";
+        isClientSetable = 0;
     };
     class GVAR(showSoundWaves) {
         value = 0;
diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf
index cd8b9b0452..ca2ed39c5e 100644
--- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf
+++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf
@@ -27,39 +27,37 @@
 
 private ["_player", "_target", "_alpha", "_heightOffset", "_height", "_position", "_color", "_name", "_rank", "_size"];
 
-_player = _this select 0;
-_target = _this select 1;
-_alpha = _this select 2;
-_heightOffset = _this select 3;
-
-_height = [2, 1.5, 1, 1.5, 1] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find stance _target);
-
-_position = visiblePositionASL _target;
-// Convert position to ASLW (expected by drawIcon3D) and add height offsets
-_position set [2, ((_target modelToWorld [0,0,0]) select 2) + _height + _heightOffset];
-
-_color = if !(group _target == group _player) then {
-    [0.77, 0.51, 0.08, _alpha]
-} else {
-    [[1, 1, 1, _alpha], [1, 0, 0, _alpha], [0, 1, 0, _alpha], [0, 0, 1, _alpha], [1, 1, 0, _alpha]] select (["MAIN", "RED", "GREEN", "BLUE", "YELLOW"] find (if (_target == _player) then {0} else {assignedTeam _target})) max 0
-};
+PARAMS_4(_player,_target,_alpha,_heightOffset);
 
 _name = [_target, true] call EFUNC(common,getName);
 
 _icon = "";
 _size = 0;
-if (GVAR(showSoundWaves) && {_target getVariable [QGVAR(isSpeaking), false]}) then {
-    _icon = QUOTE(PATHTOF(UI\soundwave));
-    _icon = _icon + str (floor (random 10)) + ".paa"; //random
-    // _icon = _icon + str (diag_frameno % 10) + ".paa"; //play in order??
-    _size = 2;
+
+if (GVAR(showSoundWaves) && {(_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}}) then {
+    _icon = QUOTE(PATHTOF(UI\soundwave)) + str (floor (random 10)) + ".paa";
+    _size = 0.75;
+    _alpha = _alpha + 0.6;//Boost alpha when speaking
 } else {
     if (GVAR(showPlayerRanks)) then {
         _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1);
-        _size = 1;
+        _size = 0.75;
     };
 };
 
+if (_alpha < 0) exitWith {}; //Don't waste time if not visable
+
+if !(group _target == group _player) then {
+    _color = +GVAR(defaultNametagColor); //Make a copy, then multiply both alpha values (allows client to decrease alpha in settings)
+    _color set [3, (_color select 3) * _alpha];
+} else {
+    _color = [[1, 1, 1, _alpha], [1, 0, 0, _alpha], [0, 1, 0, _alpha], [0, 0, 1, _alpha], [1, 1, 0, _alpha]] select (["MAIN", "RED", "GREEN", "BLUE", "YELLOW"] find (if (_target == _player) then {0} else {assignedTeam _target})) max 0
+};
+
+_height = [2, 1.5, 1, 1.5, 1] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find (stance _target));
+
+// Convert position to ASLW (expected by drawIcon3D) and add height offsets
+_position = _target modelToWorldVisual [0, 0, (_height + _heightOffset)];
 
 drawIcon3D [
     _icon,
diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf
index 24b30e5d6b..a998e5d8a3 100644
--- a/addons/nametags/functions/fnc_moduleNameTags.sqf
+++ b/addons/nametags/functions/fnc_moduleNameTags.sqf
@@ -25,5 +25,6 @@ GVAR(Module) = true;
 [_logic, QGVAR(PlayerNamesViewDistance),  "PlayerNamesViewDistance"     ] call EFUNC(common,readSettingFromModule);
 [_logic, QGVAR(ShowNamesForAI),           "ShowNamesForAI"              ] call EFUNC(common,readSettingFromModule);
 [_logic, QGVAR(showVehicleCrewInfo),      "showVehicleCrewInfo"         ] call EFUNC(common,readSettingFromModule);
+[_logic, QGVAR(showCursorTagForVehicles),  "showCursorTagForVehicles"    ] call EFUNC(common,readSettingFromModule);
 
 diag_log text "[ACE]: NameTags Module Initialized.";
diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml
index aee850faee..622df44aca 100644
--- a/addons/nametags/stringtable.xml
+++ b/addons/nametags/stringtable.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Edited with tabler - 2015-02-12 -->
+<!-- Edited with tabler - 2015-02-13 -->
 <Project name="ACE">
   <Package name="NameTags">
     <Key ID="STR_ACE_NameTags_ShowNames">
@@ -70,9 +70,12 @@
       <English>Show name tags for AI units</English>
     </Key>
     <Key ID="STR_ACE_NameTags_ShowSoundWaves">
-      <English>Show SoundWaves when speaking</English>
-      <German>Zeigen Schallwelle im Gespräch</German>
-      <Spanish>Mostrar onda sonora cuando se habla</Spanish>
+      <English>Show SoundWaves (requires player names)</English>
+      <German>Zeigen Schallwelle  (benötigt spielernamen)</German>
+      <Spanish>Mostrar onda sonora  (requiere Mostrar nombres de jugadores)</Spanish>
+    </Key>
+    <Key ID="STR_ACE_NameTags_DefaultNametagColor">
+      <English>Default Nametag Color (Non Group Members)</English>
     </Key>
   </Package>
 </Project>
\ No newline at end of file

From 1a2a9dd584fb4ed055c381b4a38e85b50a9066cf Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Sat, 14 Feb 2015 15:51:08 -0600
Subject: [PATCH 04/27] Remove support for Anthropomorphism

---
 addons/nametags/XEH_postInit.sqf | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf
index fef1e4e4d3..0837ce3e88 100644
--- a/addons/nametags/XEH_postInit.sqf
+++ b/addons/nametags/XEH_postInit.sqf
@@ -36,7 +36,7 @@ addMissionEventHandler ["Draw3D", {
     //If set to "Only On Keypress" settings, fade just like main tags
     if (GVAR(showCursorTagForVehicles)) then {
         _target = cursorTarget;
-        if ((!(_target isKindOf "Man")) && {!(_target in allUnitsUAV)}) then {
+        if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then {
             _target = effectiveCommander _target;
             if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
                 _distance = _player distance _target;
@@ -52,7 +52,7 @@ addMissionEventHandler ["Draw3D", {
     if (GVAR(showPlayerNames) in [2,4]) then {
         //"Only Cursor" mode, only show nametags for humans
         _target = cursorTarget;
-        if ((!isNull _target) && {_target isKindOf "Man"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
+        if ((!isNull _target) && {_target isKindOf "CAManBase"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
             _distance = _player distance _target;
             _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha);
             if ((GVAR(showPlayerNames) == 4)) then { //only on keypress
@@ -62,7 +62,7 @@ addMissionEventHandler ["Draw3D", {
         };
     } else {
         _pos = positionCameraToWorld [0, 0, 0];
-        _targets = _pos nearObjects ["Man", GVAR(PlayerNamesViewDistance) + 5];
+        _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5];
 
         if (!surfaceIsWater _pos) then {
             _pos = ATLtoASL _pos;

From dec34b4b30613e662a5d3d96e09b051076a35835 Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Sun, 15 Feb 2015 14:55:17 -0600
Subject: [PATCH 05/27] Surrender Fixes

Remove XEH GetIn and use vehicleChanged Event
Handle Zeus (showHUD)
Attempt to handle failed animation change
---
 addons/captives/CfgEventHandlers.hpp          | 10 -----
 addons/captives/XEH_postInit.sqf              |  3 ++
 addons/captives/XEH_preInit.sqf               |  3 +-
 addons/captives/functions/fnc_handleGetIn.sqf | 24 ------------
 .../functions/fnc_handleKnockedOut.sqf        | 25 ++++++++++++-
 .../functions/fnc_handlePlayerChanged.sqf     |  8 +++-
 .../functions/fnc_handleVehicleChanged.sqf    | 30 +++++++++++++++
 .../fnc_handleZeusDisplayChanged.sqf          | 31 ++++++++++++++++
 .../captives/functions/fnc_setHandcuffed.sqf  |  3 ++
 addons/captives/functions/fnc_surrender.sqf   | 37 ++++++++++---------
 10 files changed, 120 insertions(+), 54 deletions(-)
 delete mode 100644 addons/captives/functions/fnc_handleGetIn.sqf
 create mode 100644 addons/captives/functions/fnc_handleVehicleChanged.sqf
 create mode 100644 addons/captives/functions/fnc_handleZeusDisplayChanged.sqf

diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp
index 722750f915..8829d0f275 100644
--- a/addons/captives/CfgEventHandlers.hpp
+++ b/addons/captives/CfgEventHandlers.hpp
@@ -10,15 +10,6 @@ class Extended_PostInit_EventHandlers {
     };
 };
 
-//release escorted captive when entering a vehicle
-class Extended_GetIn_EventHandlers {
-    class All {
-        class GVAR(AutoDetachCaptive) {
-            getIn = QUOTE(_this call FUNC(handleGetIn));
-        };
-    };
-};
-
 //reset captive animation after leaving vehicle
 class Extended_GetOut_EventHandlers {
     class All {
@@ -45,4 +36,3 @@ class Extended_InitPost_EventHandlers {
         };
     };
 };
-
diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf
index 9d1a242d4d..9c124630ee 100644
--- a/addons/captives/XEH_postInit.sqf
+++ b/addons/captives/XEH_postInit.sqf
@@ -21,6 +21,9 @@ if (isServer) then {
     }];
 };
 
+["playerVehicleChanged", {_this call FUNC(handleVehicleChanged)}] call EFUNC(common,addEventHandler);
+["zeusDisplayChanged",   {_this call FUNC(handleZeusDisplayChanged)}] call EFUNC(common,addEventHandler);
+
 //TODO: Medical Integration Events???
 
 // [_unit, "knockedOut", {
diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf
index 75ee77e9bc..f6ec44225f 100644
--- a/addons/captives/XEH_preInit.sqf
+++ b/addons/captives/XEH_preInit.sqf
@@ -16,12 +16,13 @@ PREP(doFriskPerson);
 PREP(doLoadCaptive);
 PREP(doRemoveHandcuffs);
 PREP(doUnloadCaptive);
-PREP(handleGetIn);
 PREP(handleGetOut);
 PREP(handleKilled);
 PREP(handleKnockedOut);
 PREP(handlePlayerChanged);
 PREP(handleUnitInitPost);
+PREP(handleVehicleChanged);
+PREP(handleZeusDisplayChanged);
 PREP(handleWokeUp);
 PREP(moduleSurrender);
 PREP(setHandcuffed);
diff --git a/addons/captives/functions/fnc_handleGetIn.sqf b/addons/captives/functions/fnc_handleGetIn.sqf
deleted file mode 100644
index 54133e2362..0000000000
--- a/addons/captives/functions/fnc_handleGetIn.sqf
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Author: commy2
- * Handles when a unit gets in to a vehicle.  Release escorted captive when entering a vehicle
- *
- * Arguments:
- * 0: _vehicle <OBJECT>
- * 2: dunno <OBJECT>
- * 1: _unit <OBJECT>
- *
- * Return Value:
- * The return value <BOOL>
- *
- * Example:
- * [car2, x, player] call ACE_captives_fnc_handleGetIn
- *
- * Public: No
- */
-#include "script_component.hpp"
-
-PARAMS_3(_vehicle,_dontcare,_unit);
-
-if ((local _unit) && (_unit getVariable [QGVAR(isEscorting), false])) then {
-    _unit setVariable [QGVAR(isEscorting), false, true];
-};
diff --git a/addons/captives/functions/fnc_handleKnockedOut.sqf b/addons/captives/functions/fnc_handleKnockedOut.sqf
index 3257d544ca..aba01b194f 100644
--- a/addons/captives/functions/fnc_handleKnockedOut.sqf
+++ b/addons/captives/functions/fnc_handleKnockedOut.sqf
@@ -1,2 +1,25 @@
-// by commy2
+/*
+ * Author: PabstMirror
+ * Handles when a unit gets knocked out.  Ends surrendering.
+ *
+ * Arguments:
+ * 0: Unit <OBJECT>
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ * [bob, true] call ACE_captives_fnc_handleKnockedOut
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
 
+
+//ToDo: Waiting on medical integration
+
+PARAMS_1(_unit);
+
+if (_unit getVariable [QGVAR(isSurrendering), false]) then {  //If surrendering, stop
+    [_unit, _false] call FUNC(surrender);
+};
diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf
index 13e284ef80..21fd1e1ec3 100644
--- a/addons/captives/functions/fnc_handlePlayerChanged.sqf
+++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf
@@ -18,10 +18,16 @@
 
 PARAMS_2(_newUnit,_oldUnit);
 
+//set showHUD based on new unit status:
 if ((_newUnit getVariable [QGVAR(isHandcuffed), false]) || {_newUnit getVariable [QGVAR(isSurrendering), false]}) then {
     TRACE_1("Player Change (showHUD false)",_newUnit);
-    showHUD false; 
+    showHUD false;
 } else {
     TRACE_1("Player Change (showHUD true)",_newUnit);
     showHUD true;
 };
+
+//If old player was escorting, stop
+if (_oldUnit getVariable [QGVAR(isEscorting), false]) then {
+    _oldUnit setVariable [QGVAR(isEscorting), false, true];
+};
diff --git a/addons/captives/functions/fnc_handleVehicleChanged.sqf b/addons/captives/functions/fnc_handleVehicleChanged.sqf
new file mode 100644
index 0000000000..74f966ecc3
--- /dev/null
+++ b/addons/captives/functions/fnc_handleVehicleChanged.sqf
@@ -0,0 +1,30 @@
+/*
+ * Author: commy2
+ * Handles when a player's vehicle changes (supports scripted vehicle changes)
+ *
+ * Arguments:
+ * 0: unit <OBJECT>
+ * 1: newVehicle <OBJECT>
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ * [player, car] call ACE_captives_fnc_handleVehicleChanged
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+PARAMS_2(_unit,_vehicle);
+
+//When moved into a vehicle (action or scripted)
+if ((vehicle _unit) != _unit) then {
+    if (_unit getVariable [QGVAR(isEscorting), false]) then {
+        _unit setVariable [QGVAR(isEscorting), false, true];
+    };
+
+    if (_unit getVariable [QGVAR(isSurrendering), false]) then {
+        [_unit, false] call FUNC(surrender);
+    };
+};
diff --git a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf
new file mode 100644
index 0000000000..e328d410fa
--- /dev/null
+++ b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf
@@ -0,0 +1,31 @@
+/*
+ * Author: PabstMirror
+ * Handles handles ZeusDisplayChanged event
+ * Need to reset showHUD after closing zeus
+ *
+ * Arguments:
+ * 0: Unit <OBJECT>
+ * 1: Display is now open <BOOL>
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ * [bob1, false] call ACE_captives_fnc_handleZeusDisplayChanged
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+PARAMS_2(_unit,_zeusIsOpen);
+
+//set showHUD based on unit status:
+if (!_zeusIsOpen) then {
+    if ((_unit getVariable [QGVAR(isHandcuffed), false]) || {_unit getVariable [QGVAR(isSurrendering), false]}) then {
+        TRACE_1("Player Change (showHUD false)",_newUnit);
+        showHUD false;
+    } else {
+        TRACE_1("Player Change (showHUD true)",_newUnit);
+        showHUD true;
+    };
+};
diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf
index 912b00662f..06906167e9 100644
--- a/addons/captives/functions/fnc_setHandcuffed.sqf
+++ b/addons/captives/functions/fnc_setHandcuffed.sqf
@@ -30,6 +30,9 @@ if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) then {
 
 if (_state) then {
     _unit setVariable [QGVAR(isHandcuffed), true, true];
+    if (_unit getVariable [QGVAR(isSurrendering), false]) then {  //If surrendering, stop
+        [_unit, _false] call FUNC(surrender);
+    };
     [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus);
     _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true];
 
diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf
index 1f0e232926..25d5e6a008 100644
--- a/addons/captives/functions/fnc_surrender.sqf
+++ b/addons/captives/functions/fnc_surrender.sqf
@@ -30,12 +30,7 @@ if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) then {
 
 if (_state) then {
     _unit setVariable [QGVAR(isSurrendering), true, true];
-    [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus);
-
-    if (_unit == ACE_player) then {
-        showHUD false;
-    };
-
+    
     // fix anim on mission start (should work on dedicated servers)
     [{
         PARAMS_1(_unit);
@@ -45,19 +40,27 @@ if (_state) then {
         };
     }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute);
 
-    //PFEH - (TODO: move to event system?)
+    //Start up a pfeh to make sure the unit actualy goes into the animation
+    //Only change variables and captivity when they reach that state 
+    //fixes vaulting to break animation
     [{
-        EXPLODE_1_PVT((_this select 0),_unit);
-        if (_unit getVariable [QGVAR(isSurrendering), false]) then {
-            //If unit dies, gets knocked out, or is handcuffed then end surrender
-            if ((!alive _unit) || {_unit getVariable ["ACE_isUnconscious", false]} || {_unit getVariable [QGVAR(isHandcuffed), false]}) then {
-                [_unit, false] call FUNC(surrender);
-                [(_this select 1)] call CBA_fnc_removePerFrameHandler;
-            };
-        } else {
-            [(_this select 1)] call cba_fnc_removePerFrameHandler;
+        PARAMS_2(_args,_pfID);
+        EXPLODE_2_PVT(_args,_unit,_maxTime);
+
+        if (time > _maxTime) exitWith {
+            [_pfID] call CBA_fnc_removePerFrameHandler;
+            _unit setVariable [QGVAR(isSurrendering), false, true];
+            ERROR("Surrender animation failed");
         };
-    }, 0.0, [_unit]] call CBA_fnc_addPerFrameHandler;
+        if ((animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon") exitWith {
+            [_pfID] call CBA_fnc_removePerFrameHandler;
+             
+            if (_unit == ACE_player) then {
+                showHUD false;
+            };
+            [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus);
+        };
+    }, 0, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler;
 } else {
     _unit setVariable [QGVAR(isSurrendering), false, true];
     [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus);

From 3c65c422b1ab81db92640ee90a2c52f63fc67b02 Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Sun, 15 Feb 2015 16:42:00 -0600
Subject: [PATCH 06/27] More Surrender Fixes

Increase "drop hands" animation speed (now just 1/2 of normal)
Use "AnimChanged" EH to watch for animation breaks while surrendering
Only "crack" the hands up animation if we are in the right animation
state
---
 addons/captives/CfgMoves.hpp                  |  2 +-
 .../captives/functions/fnc_canSurrender.sqf   | 11 +++-
 addons/captives/functions/fnc_surrender.sqf   | 62 +++++++++++--------
 3 files changed, 46 insertions(+), 29 deletions(-)

diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp
index 6e67f3615b..d60fab5a33 100644
--- a/addons/captives/CfgMoves.hpp
+++ b/addons/captives/CfgMoves.hpp
@@ -72,7 +72,7 @@ class CfgMovesMaleSdr: CfgMovesBasic {
             InterpolateTo[] = {"Unconscious",0.01};
         };
         class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon {
-            speed = 0.333;  //for gameplay reasons, slow this down
+            speed = 0.5;  //for gameplay reasons, slow this down
             actions = "CivilStandActions";
             file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon";
             ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1};
diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf
index 238087c62b..4c16e8ccd0 100644
--- a/addons/captives/functions/fnc_canSurrender.sqf
+++ b/addons/captives/functions/fnc_canSurrender.sqf
@@ -18,5 +18,12 @@
 
 PARAMS_2(_unit,_newSurrenderState);
 
-//TODO: any other conditions??
-(!((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _newSurrenderState))
+private "_returnValue";
+
+_returnValue = if (_newSurrenderState) then {
+    !(_unit getVariable [QGVAR(isSurrendering), false]); //Not currently surrendering
+} else {
+    (_unit getVariable [QGVAR(isSurrendering), false]); //isSurrendering and on the hands up animation - // && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"};
+};
+
+_returnValue
diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf
index 25d5e6a008..f2103d2c1c 100644
--- a/addons/captives/functions/fnc_surrender.sqf
+++ b/addons/captives/functions/fnc_surrender.sqf
@@ -30,7 +30,12 @@ if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) then {
 
 if (_state) then {
     _unit setVariable [QGVAR(isSurrendering), true, true];
-    
+    [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus);
+
+    if (_unit == ACE_player) then {
+        showHUD false;
+    };
+
     // fix anim on mission start (should work on dedicated servers)
     [{
         PARAMS_1(_unit);
@@ -38,37 +43,42 @@ if (_state) then {
             [_unit] call EFUNC(common,fixLoweredRifleAnimation);
             [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation);
         };
-    }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute);
 
-    //Start up a pfeh to make sure the unit actualy goes into the animation
-    //Only change variables and captivity when they reach that state 
-    //fixes vaulting to break animation
-    [{
-        PARAMS_2(_args,_pfID);
-        EXPLODE_2_PVT(_args,_unit,_maxTime);
-
-        if (time > _maxTime) exitWith {
-            [_pfID] call CBA_fnc_removePerFrameHandler;
-            _unit setVariable [QGVAR(isSurrendering), false, true];
-            ERROR("Surrender animation failed");
-        };
-        if ((animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon") exitWith {
-            [_pfID] call CBA_fnc_removePerFrameHandler;
-             
-            if (_unit == ACE_player) then {
-                showHUD false;
+        //Adds an animation changed eh
+        //Should handle changes in animation
+        _animChangedEHID = _unit addEventHandler ["AnimChanged", {
+            PARAMS_2(_unit,_newAnimation);
+            if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then {
+                ERROR("Surrender animation failed");
+                systemChat "You Stop Surrendering";
+                [_unit, false] call FUNC(surrender);
             };
-            [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus);
-        };
-    }, 0, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler;
+        }];
+        _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID];
+
+    }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute);
 } else {
     _unit setVariable [QGVAR(isSurrendering), false, true];
     [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus);
 
-    if ((vehicle _unit) == _unit) then {
-        //Break out of hands up animation loop (doAnimation handles Unconscious prioity)
-        [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation);
-    };
+    _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1];
+    _unit removeEventHandler ["AnimChanged", _animChangedEHID];
+
+    //spin up a PFEH, to watching animationState for the next 10 seconds to make sure we don't enter
+    [{
+        PARAMS_2(_args,_pfID);
+        EXPLODE_2_PVT(_args,_unit,_maxTime);
+        //If maxtime or they re-surrendered, exit loop
+        if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith {
+            [_pfID] call CBA_fnc_removePerFrameHandler;
+        };
+        //Only break animation if they are actualy the "hands up" animation (because we are using switchmove)
+        if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith {
+            [_pfID] call CBA_fnc_removePerFrameHandler;
+            //Break out of hands up animation loop (doAnimation handles Unconscious prioity)
+            [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation);
+        };
+    }, 0.05, [_unit, (time + 15)]] call CBA_fnc_addPerFrameHandler;
 
     if (_unit == ACE_player) then {
         //only re-enable HUD if not handcuffed

From a0c2a00777052312583df4bac9e7c6954bf6d006 Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Sun, 15 Feb 2015 16:45:13 -0600
Subject: [PATCH 07/27] Cleanup

---
 addons/captives/functions/fnc_canSurrender.sqf     | 2 +-
 addons/captives/functions/fnc_handleKnockedOut.sqf | 2 +-
 addons/captives/functions/fnc_surrender.sqf        | 1 -
 3 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf
index 4c16e8ccd0..3ee687cfc1 100644
--- a/addons/captives/functions/fnc_canSurrender.sqf
+++ b/addons/captives/functions/fnc_canSurrender.sqf
@@ -23,7 +23,7 @@ private "_returnValue";
 _returnValue = if (_newSurrenderState) then {
     !(_unit getVariable [QGVAR(isSurrendering), false]); //Not currently surrendering
 } else {
-    (_unit getVariable [QGVAR(isSurrendering), false]); //isSurrendering and on the hands up animation - // && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"};
+    (_unit getVariable [QGVAR(isSurrendering), false]); //is Surrendering
 };
 
 _returnValue
diff --git a/addons/captives/functions/fnc_handleKnockedOut.sqf b/addons/captives/functions/fnc_handleKnockedOut.sqf
index aba01b194f..fadf63e971 100644
--- a/addons/captives/functions/fnc_handleKnockedOut.sqf
+++ b/addons/captives/functions/fnc_handleKnockedOut.sqf
@@ -1,5 +1,5 @@
 /*
- * Author: PabstMirror
+ * Author: commy2, PabstMirror
  * Handles when a unit gets knocked out.  Ends surrendering.
  *
  * Arguments:
diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf
index f2103d2c1c..adffc4d2aa 100644
--- a/addons/captives/functions/fnc_surrender.sqf
+++ b/addons/captives/functions/fnc_surrender.sqf
@@ -50,7 +50,6 @@ if (_state) then {
             PARAMS_2(_unit,_newAnimation);
             if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then {
                 ERROR("Surrender animation failed");
-                systemChat "You Stop Surrendering";
                 [_unit, false] call FUNC(surrender);
             };
         }];

From e0d1d08913061204d303135bdc4a7dcf6200eb7a Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Sun, 15 Feb 2015 18:19:01 -0600
Subject: [PATCH 08/27] Change AnimChange EH

---
 .../fnc_handleZeusDisplayChanged.sqf          |  4 +-
 .../captives/functions/fnc_setHandcuffed.sqf  |  2 +-
 addons/captives/functions/fnc_surrender.sqf   | 51 +++++++++++--------
 3 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf
index e328d410fa..2299fa7031 100644
--- a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf
+++ b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf
@@ -22,10 +22,10 @@ PARAMS_2(_unit,_zeusIsOpen);
 //set showHUD based on unit status:
 if (!_zeusIsOpen) then {
     if ((_unit getVariable [QGVAR(isHandcuffed), false]) || {_unit getVariable [QGVAR(isSurrendering), false]}) then {
-        TRACE_1("Player Change (showHUD false)",_newUnit);
+        TRACE_1("Player Change (showHUD false)",_unit);
         showHUD false;
     } else {
-        TRACE_1("Player Change (showHUD true)",_newUnit);
+        TRACE_1("Player Change (showHUD true)",_unit);
         showHUD true;
     };
 };
diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf
index 06906167e9..0d404f6c6e 100644
--- a/addons/captives/functions/fnc_setHandcuffed.sqf
+++ b/addons/captives/functions/fnc_setHandcuffed.sqf
@@ -31,7 +31,7 @@ if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) then {
 if (_state) then {
     _unit setVariable [QGVAR(isHandcuffed), true, true];
     if (_unit getVariable [QGVAR(isSurrendering), false]) then {  //If surrendering, stop
-        [_unit, _false] call FUNC(surrender);
+        [_unit, false] call FUNC(surrender);
     };
     [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus);
     _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true];
diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf
index adffc4d2aa..e1e4c19c11 100644
--- a/addons/captives/functions/fnc_surrender.sqf
+++ b/addons/captives/functions/fnc_surrender.sqf
@@ -4,7 +4,7 @@
  *
  * Arguments:
  * 0: Unit <OBJECT>
- * 1: State <BOOL>
+ * 1: True to surrender, false to un-surrender <BOOL>
  *
  * Return Value:
  * Nothing
@@ -45,12 +45,16 @@ if (_state) then {
         };
 
         //Adds an animation changed eh
-        //Should handle changes in animation
+        //If we get a change in animation before we've "locked" in the hands up animationState, then stop surrendering
         _animChangedEHID = _unit addEventHandler ["AnimChanged", {
             PARAMS_2(_unit,_newAnimation);
+
             if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then {
-                ERROR("Surrender animation failed");
-                [_unit, false] call FUNC(surrender);
+                if ((animationState _unit != "ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon") && (animationState _unit != "ACE_AmovPercMstpSsurWnonDnon")) then {
+                    ERROR("Surrender animation failed");
+                    systemChat "Debug: Surrender animation failed";
+                    [_unit, false] call FUNC(surrender);
+                };
             };
         }];
         _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID];
@@ -62,22 +66,7 @@ if (_state) then {
 
     _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1];
     _unit removeEventHandler ["AnimChanged", _animChangedEHID];
-
-    //spin up a PFEH, to watching animationState for the next 10 seconds to make sure we don't enter
-    [{
-        PARAMS_2(_args,_pfID);
-        EXPLODE_2_PVT(_args,_unit,_maxTime);
-        //If maxtime or they re-surrendered, exit loop
-        if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith {
-            [_pfID] call CBA_fnc_removePerFrameHandler;
-        };
-        //Only break animation if they are actualy the "hands up" animation (because we are using switchmove)
-        if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith {
-            [_pfID] call CBA_fnc_removePerFrameHandler;
-            //Break out of hands up animation loop (doAnimation handles Unconscious prioity)
-            [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation);
-        };
-    }, 0.05, [_unit, (time + 15)]] call CBA_fnc_addPerFrameHandler;
+    _unit setVariable [QGVAR(surrenderAnimEHID), -1];
 
     if (_unit == ACE_player) then {
         //only re-enable HUD if not handcuffed
@@ -85,4 +74,26 @@ if (_state) then {
             showHUD true;
         };
     };
+
+    //if we are in "hands up" animationState, crack it now
+    if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) then {
+        [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation);
+    } else {
+        //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter
+        //Handles long animation chains
+        [{
+            PARAMS_2(_args,_pfID);
+            EXPLODE_2_PVT(_args,_unit,_maxTime);
+            //If maxtime or they re-surrendered, exit loop
+            if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith {
+                [_pfID] call CBA_fnc_removePerFrameHandler;
+            };
+            //Only break animation if they are actualy the "hands up" animation (because we are using switchmove)
+            if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith {
+                [_pfID] call CBA_fnc_removePerFrameHandler;
+                //Break out of hands up animation loop (doAnimation handles Unconscious prioity)
+                [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation);
+            };
+        }, 0.05, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler;
+    };
 };

From eee4b256cd3f5285640283517b70873ab28bebfa Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Mon, 16 Feb 2015 18:03:09 -0600
Subject: [PATCH 09/27] More Changes and add EH

---
 addons/captives/CfgVehicles.hpp               |  6 +-
 addons/captives/XEH_postInit.sqf              | 10 +--
 addons/captives/XEH_preInit.sqf               |  2 +-
 .../functions/fnc_handleKnockedOut.sqf        |  2 +-
 .../functions/fnc_handleUnitInitPost.sqf      |  2 +-
 .../functions/fnc_handleVehicleChanged.sqf    |  2 +-
 .../functions/fnc_moduleSurrender.sqf         | 11 +++-
 .../captives/functions/fnc_setHandcuffed.sqf  | 34 +++++++---
 ...c_surrender.sqf => fnc_setSurrendered.sqf} | 64 ++++++++++---------
 9 files changed, 79 insertions(+), 54 deletions(-)
 rename addons/captives/functions/{fnc_surrender.sqf => fnc_setSurrendered.sqf} (56%)

diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp
index d292402bcf..75b1a85803 100644
--- a/addons/captives/CfgVehicles.hpp
+++ b/addons/captives/CfgVehicles.hpp
@@ -81,8 +81,8 @@ class CfgVehicles {
             };
             class ACE_StartSurrenderingSelf {
                 displayName = "$STR_ACE_Captives_StartSurrendering";
-                condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender));
-                statement = QUOTE([ARR_2(_player, true)] call FUNC(surrender));
+                condition = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered));
+                statement = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered));
                 exceptions[] = {};
                 showDisabled = 0;
                 priority = 0;
@@ -90,7 +90,7 @@ class CfgVehicles {
             class ACE_StopSurrenderingSelf {
                 displayName = "$STR_ACE_Captives_StopSurrendering";
                 condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender));
-                statement = QUOTE([ARR_2(_player, false)] call FUNC(surrender));
+                statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrender));
                 exceptions[] = {QGVAR(isNotSurrendering)};
                 showDisabled = 0;
                 priority = 0;
diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf
index 9c124630ee..da92307815 100644
--- a/addons/captives/XEH_postInit.sqf
+++ b/addons/captives/XEH_postInit.sqf
@@ -1,9 +1,5 @@
 #include "script_component.hpp"
 
-["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler);
-["MoveInCaptive", {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler);
-["MoveOutCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler);
-["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler);
 
 //Handles when someone starts escorting and then disconnects, leaving the captive attached
 //This is normaly handled by the PFEH in doEscortCaptive, but that won't be running if they DC
@@ -23,6 +19,12 @@ if (isServer) then {
 
 ["playerVehicleChanged", {_this call FUNC(handleVehicleChanged)}] call EFUNC(common,addEventHandler);
 ["zeusDisplayChanged",   {_this call FUNC(handleZeusDisplayChanged)}] call EFUNC(common,addEventHandler);
+["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler);
+["MoveInCaptive", {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler);
+["MoveOutCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler);
+
+["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler);
+["SetSurrendered", {_this call FUNC(setSurrendered)}] call EFUNC(common,addEventHandler);
 
 //TODO: Medical Integration Events???
 
diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf
index f6ec44225f..728f5fff69 100644
--- a/addons/captives/XEH_preInit.sqf
+++ b/addons/captives/XEH_preInit.sqf
@@ -26,7 +26,7 @@ PREP(handleZeusDisplayChanged);
 PREP(handleWokeUp);
 PREP(moduleSurrender);
 PREP(setHandcuffed);
-PREP(surrender);
+PREP(setSurrendered);
 PREP(vehicleCaptiveMoveIn);
 PREP(vehicleCaptiveMoveOut);
 
diff --git a/addons/captives/functions/fnc_handleKnockedOut.sqf b/addons/captives/functions/fnc_handleKnockedOut.sqf
index fadf63e971..1cd969807d 100644
--- a/addons/captives/functions/fnc_handleKnockedOut.sqf
+++ b/addons/captives/functions/fnc_handleKnockedOut.sqf
@@ -21,5 +21,5 @@
 PARAMS_1(_unit);
 
 if (_unit getVariable [QGVAR(isSurrendering), false]) then {  //If surrendering, stop
-    [_unit, _false] call FUNC(surrender);
+    [_unit, false] call FUNC(setSurrendered);
 };
diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf
index 1a5a8f2ecd..a8b601300a 100644
--- a/addons/captives/functions/fnc_handleUnitInitPost.sqf
+++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf
@@ -29,6 +29,6 @@ if (local _unit) then {
 
     if (_unit getVariable [QGVAR(isSurrendering), false]) then {
         _unit setVariable [QGVAR(isSurrendering), false];
-        [_unit, true] call FUNC(surrender);
+        [_unit, true] call FUNC(setSurrendered);
     };
 };
diff --git a/addons/captives/functions/fnc_handleVehicleChanged.sqf b/addons/captives/functions/fnc_handleVehicleChanged.sqf
index 74f966ecc3..a5cd7004a4 100644
--- a/addons/captives/functions/fnc_handleVehicleChanged.sqf
+++ b/addons/captives/functions/fnc_handleVehicleChanged.sqf
@@ -25,6 +25,6 @@ if ((vehicle _unit) != _unit) then {
     };
 
     if (_unit getVariable [QGVAR(isSurrendering), false]) then {
-        [_unit, false] call FUNC(surrender);
+        [_unit, false] call FUNC(setSurrender);
     };
 };
diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf
index 5cbf43aacc..d2e3fc9f5e 100644
--- a/addons/captives/functions/fnc_moduleSurrender.sqf
+++ b/addons/captives/functions/fnc_moduleSurrender.sqf
@@ -28,7 +28,14 @@ if (local _logic) then {
             _mouseOverObject = _bisMouseOver select 1;
             if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then {
                 systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)];
-                [_mouseOverObject, true] call FUNC(surrender);
+                [_mouseOverObject, true] call FUNC(setSurrendered);
+                
+                if (!(_mouseOverObject getVariable [GVAR(), false])) then {
+                    ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent);
+                } else {
+                    ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent);
+                };
+                
             } else {
                 systemChat format ["Only use on dismounted inf"];
             };
@@ -38,7 +45,7 @@ if (local _logic) then {
     } else {//an editor module
         {
             systemChat format ["Debug - module surrendering %1", (name _x)];
-            [_x, true] call FUNC(surrender);
+            [_x, true] call FUNC(setSurrendered);
         } forEach _units;
     };
 
diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf
index 0d404f6c6e..cec1a007e7 100644
--- a/addons/captives/functions/fnc_setHandcuffed.sqf
+++ b/addons/captives/functions/fnc_setHandcuffed.sqf
@@ -18,22 +18,23 @@
 
 PARAMS_2(_unit,_state);
 
-// We only want this function to work on local machines
-if (!local _unit) exitwith {
-    [_this, QUOTE(FUNC(setHandcuffed)), _unit] call EFUNC(common,execRemoteFnc);
-    TRACE_2("running setHandcuffed on remote unit",_unit,_state);
-};
 
-if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) then {
-    LOG("setHandcuffed: current state same as new");
+if (!local _unit) exitwith {
+    ERROR("running setHandcuffed on remote unit");
+};
+if ((_unit getVariable [QGVAR(isHandcuffed), false]) isEqualTo _state) exitWith {
+    ERROR("setHandcuffed: current state same as new");
 };
 
 if (_state) then {
     _unit setVariable [QGVAR(isHandcuffed), true, true];
-    if (_unit getVariable [QGVAR(isSurrendering), false]) then {  //If surrendering, stop
-        [_unit, false] call FUNC(surrender);
-    };
     [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus);
+    
+    if (_unit getVariable [QGVAR(isSurrendering), false]) then {  //If surrendering, stop
+        [_unit, false] call FUNC(setSurrendered);
+    };
+    
+    //Set unit cargoIndex (will be -1 if dismounted)
     _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true];
 
     if (_unit == ACE_player) then {
@@ -46,6 +47,19 @@ if (_state) then {
         if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then {
             [_unit] call EFUNC(common,fixLoweredRifleAnimation);
             [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation);
+            
+            //Adds an animation changed eh
+            //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain)
+            _animChangedEHID = _unit addEventHandler ["AnimChanged", {
+                PARAMS_2(_unit,_newAnimation);
+                if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && (_newAnimation != "Unconscious")) then {
+                    ERROR("Handcuff animation interrupted");
+                    systemChat format ["debug %2: new %1", _newAnimation, time];
+                    [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation);
+                };
+            }];
+            _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID];
+            
         };
     }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute);
 } else {
diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_setSurrendered.sqf
similarity index 56%
rename from addons/captives/functions/fnc_surrender.sqf
rename to addons/captives/functions/fnc_setSurrendered.sqf
index e1e4c19c11..e49c6e9453 100644
--- a/addons/captives/functions/fnc_surrender.sqf
+++ b/addons/captives/functions/fnc_setSurrendered.sqf
@@ -10,7 +10,7 @@
  * Nothing
  *
  * Example:
- * [Pierre, true] call ACE_captives_fnc_surrender;
+ * [Pierre, true] call ACE_captives_fnc_setSurrendered;
  *
  * Public: No
  */
@@ -18,52 +18,52 @@
 
 PARAMS_2(_unit,_state);
 
-// We only want this function to work on local machines
+
 if (!local _unit) exitwith {
-    [_this, QUOTE(FUNC(surrender)), _unit] call EFUNC(common,execRemoteFnc);
-    TRACE_2("running surrender on remote unit",_unit,_state);
+    ERROR("running surrender on remote unit");
 };
 
-if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) then {
-    LOG("Surrender: current state same as new");
+if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) exitWith {
+    ERROR("Surrender: current state same as new");
 };
 
 if (_state) then {
+    if ((vehicle _unit) != _unit) exitWith {ERROR("Cannot surrender while mounted");};
+    if (_unit getVariable [QGVAR(isHandcuffed), false]) exitWith {ERROR("Cannot surrender while handcuffed");};
+
     _unit setVariable [QGVAR(isSurrendering), true, true];
+
     [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus);
 
     if (_unit == ACE_player) then {
         showHUD false;
     };
 
+    [_unit] call EFUNC(common,fixLoweredRifleAnimation);
+    [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation);
+
     // fix anim on mission start (should work on dedicated servers)
     [{
         PARAMS_1(_unit);
-        if (_unit getVariable [QGVAR(isSurrendering), false] && {vehicle _unit == _unit}) then {
-            [_unit] call EFUNC(common,fixLoweredRifleAnimation);
-            [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation);
-        };
-
-        //Adds an animation changed eh
-        //If we get a change in animation before we've "locked" in the hands up animationState, then stop surrendering
-        _animChangedEHID = _unit addEventHandler ["AnimChanged", {
-            PARAMS_2(_unit,_newAnimation);
-
-            if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then {
-                if ((animationState _unit != "ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon") && (animationState _unit != "ACE_AmovPercMstpSsurWnonDnon")) then {
-                    ERROR("Surrender animation failed");
-                    systemChat "Debug: Surrender animation failed";
-                    [_unit, false] call FUNC(surrender);
+        if (_unit getVariable [QGVAR(isSurrendering), false] && {(vehicle _unit) == _unit}) then {
+            //Adds an animation changed eh
+            //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain)
+            _animChangedEHID = _unit addEventHandler ["AnimChanged", {
+                PARAMS_2(_unit,_newAnimation);
+                if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && (_newAnimation != "Unconscious")) then {
+                    ERROR("Surrender animation interrupted");
+                    systemChat format ["debug %2: new %1", _newAnimation, time];
+                    [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation);
                 };
-            };
-        }];
-        _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID];
-
+            }];
+            _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID];
+        };
     }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute);
 } else {
     _unit setVariable [QGVAR(isSurrendering), false, true];
     [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus);
 
+    //remove AnimChanged EH
     _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1];
     _unit removeEventHandler ["AnimChanged", _animChangedEHID];
     _unit setVariable [QGVAR(surrenderAnimEHID), -1];
@@ -75,25 +75,27 @@ if (_state) then {
         };
     };
 
+    if (_unit getVariable ["ACE_isUnconscious", false]) exitWith {};  //don't touch animations if unconscious
+
     //if we are in "hands up" animationState, crack it now
     if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) then {
         [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation);
     } else {
-        //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter
+        //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter "hands up"
         //Handles long animation chains
         [{
             PARAMS_2(_args,_pfID);
             EXPLODE_2_PVT(_args,_unit,_maxTime);
-            //If maxtime or they re-surrendered, exit loop
-            if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith {
+            //If waited long enough or they re-surrendered or they are unconscious, exit loop
+            if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]} || {_unit getVariable ["ACE_isUnconscious", false]}) exitWith {
                 [_pfID] call CBA_fnc_removePerFrameHandler;
             };
-            //Only break animation if they are actualy the "hands up" animation (because we are using switchmove)
+            //Only break animation if they are actualy the "hands up" animation (because we are using switchmove there won't be an transition)
             if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith {
                 [_pfID] call CBA_fnc_removePerFrameHandler;
-                //Break out of hands up animation loop (doAnimation handles Unconscious prioity)
+                //Break out of hands up animation loop
                 [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation);
             };
-        }, 0.05, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler;
+        }, 0, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler;
     };
 };

From dc82e50d72cafb9744e692f2576ef937d33bd85a Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Mon, 16 Feb 2015 18:30:35 -0600
Subject: [PATCH 10/27] fix

---
 addons/captives/CfgVehicles.hpp                   | 2 +-
 addons/captives/XEH_postInit.sqf                  | 1 +
 addons/captives/XEH_preInit.sqf                   | 2 +-
 addons/captives/functions/fnc_moduleSurrender.sqf | 6 +++---
 4 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp
index 75b1a85803..47bd557efc 100644
--- a/addons/captives/CfgVehicles.hpp
+++ b/addons/captives/CfgVehicles.hpp
@@ -81,7 +81,7 @@ class CfgVehicles {
             };
             class ACE_StartSurrenderingSelf {
                 displayName = "$STR_ACE_Captives_StartSurrendering";
-                condition = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered));
+                condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender));
                 statement = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered));
                 exceptions[] = {};
                 showDisabled = 0;
diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf
index da92307815..ac86d71915 100644
--- a/addons/captives/XEH_postInit.sqf
+++ b/addons/captives/XEH_postInit.sqf
@@ -3,6 +3,7 @@
 
 //Handles when someone starts escorting and then disconnects, leaving the captive attached
 //This is normaly handled by the PFEH in doEscortCaptive, but that won't be running if they DC
+
 if (isServer) then {
     addMissionEventHandler ["HandleDisconnect", {
         PARAMS_1(_disconnectedPlayer);
diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf
index 728f5fff69..d23d8759f8 100644
--- a/addons/captives/XEH_preInit.sqf
+++ b/addons/captives/XEH_preInit.sqf
@@ -22,8 +22,8 @@ PREP(handleKnockedOut);
 PREP(handlePlayerChanged);
 PREP(handleUnitInitPost);
 PREP(handleVehicleChanged);
-PREP(handleZeusDisplayChanged);
 PREP(handleWokeUp);
+PREP(handleZeusDisplayChanged);
 PREP(moduleSurrender);
 PREP(setHandcuffed);
 PREP(setSurrendered);
diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf
index d2e3fc9f5e..a33c56fc09 100644
--- a/addons/captives/functions/fnc_moduleSurrender.sqf
+++ b/addons/captives/functions/fnc_moduleSurrender.sqf
@@ -29,13 +29,13 @@ if (local _logic) then {
             if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then {
                 systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)];
                 [_mouseOverObject, true] call FUNC(setSurrendered);
-                
-                if (!(_mouseOverObject getVariable [GVAR(), false])) then {
+
+                if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then {
                     ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent);
                 } else {
                     ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent);
                 };
-                
+
             } else {
                 systemChat format ["Only use on dismounted inf"];
             };

From 9cdf06383dc8f5f6dda5b9c846d785eb65dac650 Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Mon, 16 Feb 2015 19:20:55 -0600
Subject: [PATCH 11/27] Back to getIn

---
 addons/captives/CfgEventHandlers.hpp             | 11 ++++++++---
 addons/captives/CfgVehicles.hpp                  |  2 +-
 addons/captives/XEH_preInit.sqf                  |  2 +-
 ...dleVehicleChanged.sqf => fnc_handleGetIn.sqf} | 16 ++++++++--------
 .../captives/functions/fnc_moduleSurrender.sqf   |  3 +--
 5 files changed, 19 insertions(+), 15 deletions(-)
 rename addons/captives/functions/{fnc_handleVehicleChanged.sqf => fnc_handleGetIn.sqf} (55%)

diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp
index 8829d0f275..0ce09280a7 100644
--- a/addons/captives/CfgEventHandlers.hpp
+++ b/addons/captives/CfgEventHandlers.hpp
@@ -9,7 +9,14 @@ class Extended_PostInit_EventHandlers {
         init = QUOTE(call COMPILE_FILE(XEH_postInit));
     };
 };
-
+//release escorted captive when entering a vehicle
+class Extended_GetIn_EventHandlers {
+    class All {
+        class GVAR(AutoDetachCaptive) {
+            getIn = QUOTE(_this call FUNC(handleGetIn));
+        };
+    };
+};
 //reset captive animation after leaving vehicle
 class Extended_GetOut_EventHandlers {
     class All {
@@ -18,7 +25,6 @@ class Extended_GetOut_EventHandlers {
         };
     };
 };
-
 //reset captivity and escorting status when getting killed
 class Extended_Killed_EventHandlers {
     class CAManBase {
@@ -27,7 +33,6 @@ class Extended_Killed_EventHandlers {
         };
     };
 };
-
 //mission start
 class Extended_InitPost_EventHandlers {
     class CAManBase {
diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp
index 47bd557efc..31b0ac713f 100644
--- a/addons/captives/CfgVehicles.hpp
+++ b/addons/captives/CfgVehicles.hpp
@@ -90,7 +90,7 @@ class CfgVehicles {
             class ACE_StopSurrenderingSelf {
                 displayName = "$STR_ACE_Captives_StopSurrendering";
                 condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender));
-                statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrender));
+                statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrendered));
                 exceptions[] = {QGVAR(isNotSurrendering)};
                 showDisabled = 0;
                 priority = 0;
diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf
index d23d8759f8..34c9bca910 100644
--- a/addons/captives/XEH_preInit.sqf
+++ b/addons/captives/XEH_preInit.sqf
@@ -16,12 +16,12 @@ PREP(doFriskPerson);
 PREP(doLoadCaptive);
 PREP(doRemoveHandcuffs);
 PREP(doUnloadCaptive);
+PREP(handleGetIn);
 PREP(handleGetOut);
 PREP(handleKilled);
 PREP(handleKnockedOut);
 PREP(handlePlayerChanged);
 PREP(handleUnitInitPost);
-PREP(handleVehicleChanged);
 PREP(handleWokeUp);
 PREP(handleZeusDisplayChanged);
 PREP(moduleSurrender);
diff --git a/addons/captives/functions/fnc_handleVehicleChanged.sqf b/addons/captives/functions/fnc_handleGetIn.sqf
similarity index 55%
rename from addons/captives/functions/fnc_handleVehicleChanged.sqf
rename to addons/captives/functions/fnc_handleGetIn.sqf
index a5cd7004a4..cf7d2c7271 100644
--- a/addons/captives/functions/fnc_handleVehicleChanged.sqf
+++ b/addons/captives/functions/fnc_handleGetIn.sqf
@@ -1,25 +1,25 @@
 /*
  * Author: commy2
- * Handles when a player's vehicle changes (supports scripted vehicle changes)
+ * Handles when a unit gets in to a vehicle.  Release escorted captive when entering a vehicle
  *
  * Arguments:
- * 0: unit <OBJECT>
- * 1: newVehicle <OBJECT>
+ * 0: _vehicle <OBJECT>
+ * 2: dunno <OBJECT>
+ * 1: _unit <OBJECT>
  *
  * Return Value:
- * Nothing
+ * The return value <BOOL>
  *
  * Example:
- * [player, car] call ACE_captives_fnc_handleVehicleChanged
+ * [car2, x, player] call ACE_captives_fnc_handleGetIn
  *
  * Public: No
  */
 #include "script_component.hpp"
 
-PARAMS_2(_unit,_vehicle);
+PARAMS_3(_vehicle,_dontcare,_unit);
 
-//When moved into a vehicle (action or scripted)
-if ((vehicle _unit) != _unit) then {
+if (local _unit) then {
     if (_unit getVariable [QGVAR(isEscorting), false]) then {
         _unit setVariable [QGVAR(isEscorting), false, true];
     };
diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf
index a33c56fc09..9311c7a1b9 100644
--- a/addons/captives/functions/fnc_moduleSurrender.sqf
+++ b/addons/captives/functions/fnc_moduleSurrender.sqf
@@ -28,8 +28,7 @@ if (local _logic) then {
             _mouseOverObject = _bisMouseOver select 1;
             if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then {
                 systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)];
-                [_mouseOverObject, true] call FUNC(setSurrendered);
-
+                
                 if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then {
                     ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent);
                 } else {

From 37216d51449665287dde4e9c3bdb702895887f2b Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Tue, 17 Feb 2015 17:05:07 -0600
Subject: [PATCH 12/27] Remove HandCuff animEH

---
 addons/captives/functions/fnc_setHandcuffed.sqf | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf
index cec1a007e7..0deb68dc8b 100644
--- a/addons/captives/functions/fnc_setHandcuffed.sqf
+++ b/addons/captives/functions/fnc_setHandcuffed.sqf
@@ -58,13 +58,19 @@ if (_state) then {
                     [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation);
                 };
             }];
-            _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID];
+            _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID];
             
         };
     }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute);
 } else {
     _unit setVariable [QGVAR(isHandcuffed), false, true];
     [_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus);
+    
+     //remove AnimChanged EH
+    _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1];
+    _unit removeEventHandler ["AnimChanged", _animChangedEHID];
+    _unit setVariable [QGVAR(handcuffAnimEHID), -1];
+    
     if ((vehicle _unit) == _unit) then {
         //Break out of hands up animation loop (doAnimation handles Unconscious prioity)
         [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation);

From ae61dff44e3474a6a6e050e64185dcf15d3c167e Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Thu, 19 Feb 2015 14:29:38 -0600
Subject: [PATCH 13/27] Move draw to function (wip)

---
 .../functions/fnc_canStopEscorting.sqf        | 16 +---
 addons/nametags/XEH_postInit.sqf              | 67 +---------------
 addons/nametags/XEH_preInit.sqf               |  1 +
 addons/nametags/config.cpp                    |  5 +-
 .../functions/fnc_drawNameTagIcon.sqf         |  2 +-
 .../nametags/functions/fnc_initIsSpeaking.sqf |  1 -
 addons/nametags/functions/fnc_onDraw3d.sqf    | 77 +++++++++++++++++++
 7 files changed, 85 insertions(+), 84 deletions(-)
 create mode 100644 addons/nametags/functions/fnc_onDraw3d.sqf

diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf
index e6a5a0e568..1767ea6ed0 100644
--- a/addons/captives/functions/fnc_canStopEscorting.sqf
+++ b/addons/captives/functions/fnc_canStopEscorting.sqf
@@ -19,22 +19,10 @@
 PARAMS_1(_unit);
 DEFAULT_PARAM(1,_target,objNull);
 
-private ["_isAttached"];
-
 if (isNull _target) then {
     _target = _unit getVariable [QGVAR(escortedUnit), objNull];
 };
 
-if (isNull _target) exitWith {
-    ERROR("Null Target (no ACE_escortedUnit)");
-    false
-};
+if (isNull _target) exitWith {false};
 
-_isAttached = _target in (attachedObjects _unit);
-
-if (_isAttached && (!(_target getVariable [QGVAR(isHandcuffed), false]))) exitWith {
-    ERROR("Attached But Not Captive");
-    false
-};
-
-_isAttached
+(_target in (attachedObjects _unit)) && {!(_target getVariable [QGVAR(isHandcuffed), false])}
diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf
index 0837ce3e88..1ad0e38879 100644
--- a/addons/nametags/XEH_postInit.sqf
+++ b/addons/nametags/XEH_postInit.sqf
@@ -27,69 +27,4 @@ if (!hasInterface) exitWith {};
 
 
 // Draw handle
-addMissionEventHandler ["Draw3D", {
-    if (GVAR(showPlayerNames) == 0) exitWith {};
-
-    _player = ACE_player;
-
-    //When cursorTarget is on a vehicle show the nametag for the commander.
-    //If set to "Only On Keypress" settings, fade just like main tags
-    if (GVAR(showCursorTagForVehicles)) then {
-        _target = cursorTarget;
-        if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then {
-            _target = effectiveCommander _target;
-            if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
-                _distance = _player distance _target;
-                _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha);
-                if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress
-                    _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time));
-                };
-                [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
-            };
-        };
-    };
-
-    if (GVAR(showPlayerNames) in [2,4]) then {
-        //"Only Cursor" mode, only show nametags for humans
-        _target = cursorTarget;
-        if ((!isNull _target) && {_target isKindOf "CAManBase"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
-            _distance = _player distance _target;
-            _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha);
-            if ((GVAR(showPlayerNames) == 4)) then { //only on keypress
-                _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time));
-            };
-            [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
-        };
-    } else {
-        _pos = positionCameraToWorld [0, 0, 0];
-        _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5];
-
-        if (!surfaceIsWater _pos) then {
-            _pos = ATLtoASL _pos;
-        };
-        _pos2 = positionCameraToWorld [0, 0, 1];
-        if (!surfaceIsWater _pos2) then {
-            _pos2 = ATLtoASL _pos2;
-        };
-        _vecy = _pos2 vectorDiff _pos;
-
-        {
-            _target = _x;
-
-            if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
-                if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight
-                _relPos = (visiblePositionASL _target) vectorDiff _pos;
-                _distance = vectorMagnitude _relPos;
-                _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy));
-
-                _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha);
-
-                if (GVAR(showPlayerNames) == 3) then { //only on keypress
-                    _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time));
-                };
-
-                [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
-            };
-        } forEach _targets;
-    };
-}];
+addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}];
diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf
index b56841c2aa..80c06cff1f 100644
--- a/addons/nametags/XEH_preInit.sqf
+++ b/addons/nametags/XEH_preInit.sqf
@@ -8,6 +8,7 @@ PREP(drawNameTagIcon);
 PREP(getVehicleData);
 PREP(initIsSpeaking);
 PREP(moduleNameTags);
+PREP(onDraw3d);
 PREP(onMouseZChanged);
 PREP(setText);
 
diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp
index d17c156b78..25992c0174 100644
--- a/addons/nametags/config.cpp
+++ b/addons/nametags/config.cpp
@@ -53,10 +53,11 @@ class ACE_Settings {
         isClientSetable = 0;
     };
     class GVAR(showSoundWaves) {
-        value = 0;
-        typeName = "BOOL";
+        value = 1;
+        typeName = "SCALAR";
         isClientSetable = 1;
         displayName = "$STR_ACE_NameTags_ShowSoundWaves";
+        values[] = {"Disabled", "Use Nametag settings", "Always Show All"};
     };
     class GVAR(PlayerNamesViewDistance) {
         value = 5;
diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf
index ca2ed39c5e..d991baf433 100644
--- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf
+++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf
@@ -25,7 +25,7 @@
     "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \
 ]
 
-private ["_player", "_target", "_alpha", "_heightOffset", "_height", "_position", "_color", "_name", "_rank", "_size"];
+private ["_height", "_position", "_color", "_name", "_rank", "_size"];
 
 PARAMS_4(_player,_target,_alpha,_heightOffset);
 
diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf
index 7d632e51dd..b7dc920fa2 100644
--- a/addons/nametags/functions/fnc_initIsSpeaking.sqf
+++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf
@@ -45,7 +45,6 @@ case (isClass (configFile >> "cfgPatches" >> "acre_api")): {
             _newSetting = ([ACE_player] call ACRE_api_fnc_isBroadcasting) || {!(isNull findDisplay 55)};
             if (!(_oldSetting isEqualTo _newSetting)) then {
                 ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true];
-                // ["IsTalking??", [ACE_player, _newSetting]] call localEvent  //any use in ACE for a "speaking event"?
             };
         };
     };
diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf
new file mode 100644
index 0000000000..49b4177dda
--- /dev/null
+++ b/addons/nametags/functions/fnc_onDraw3d.sqf
@@ -0,0 +1,77 @@
+#include "script_component.hpp"
+
+_player = ACE_player;
+
+//don't show nametags in spectator
+if (!alive _player) exitWith {};
+
+_onKeyPressAlphaMax = 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0
+
+//If set to only show on keypress and nothing would be visable, exit
+if ((GVAR(showPlayerNames) in [3,4]) && {GVAR(showSoundWaves) < 2} && {(2 + (GVAR(ShowNamesTime) - time)) < 0}) exitWith{};
+
+
+//When cursorTarget is on a vehicle show the nametag for the commander.
+//If set to "Only On Keypress" settings, fade just like main tags
+if (GVAR(showCursorTagForVehicles)) then {
+    _target = cursorTarget;
+    if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then {
+        _target = effectiveCommander _target;
+        if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
+            _distance = _player distance _target;
+            _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha);
+            if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress
+                _alpha = _alpha min _onKeyPressAlphaMax;
+            };
+            [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
+        };
+    };
+};
+
+//"Only Cursor" mode, only show nametags for humans
+if (GVAR(showPlayerNames) in [2,4]) then {
+    _target = cursorTarget;
+    if ((!isNull _target) && {_target isKindOf "CAManBase"} && {(side (group _target)) == (side (group _player))} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
+        _distance = _player distance _target;
+        _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha);
+        if ((GVAR(showPlayerNames) == 4)) then { //only on keypress
+            _alpha = _alpha min _onKeyPressAlphaMax;
+        };
+        [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
+    };
+};
+
+
+if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then {
+    _pos = positionCameraToWorld [0, 0, 0];
+    _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5];
+
+    if (!surfaceIsWater _pos) then {
+        _pos = ATLtoASL _pos;
+    };
+    _pos2 = positionCameraToWorld [0, 0, 1];
+    if (!surfaceIsWater _pos2) then {
+        _pos2 = ATLtoASL _pos2;
+    };
+    _vecy = _pos2 vectorDiff _pos;
+
+    {
+        _target = _x;
+
+        if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
+            if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight
+            _relPos = (visiblePositionASL _target) vectorDiff _pos;
+            _distance = vectorMagnitude _relPos;
+            _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy));
+
+            _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha);
+
+            if (GVAR(showPlayerNames) == 3) then { //only on keypress
+                _alpha = _alpha min _onKeyPressAlphaMax;
+            };
+
+            [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
+        };
+    } forEach _targets;
+};
+

From 3ade628d87430f180fc32123c0dc991dcd9872cd Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Thu, 19 Feb 2015 16:42:28 -0600
Subject: [PATCH 14/27] Handle 3 Soundwave options

---
 .../functions/fnc_canStopEscorting.sqf        |  2 +-
 .../functions/fnc_drawNameTagIcon.sqf         | 53 +++++++------
 addons/nametags/functions/fnc_onDraw3d.sqf    | 75 +++++++++++++------
 addons/nametags/script_component.hpp          |  8 +-
 4 files changed, 92 insertions(+), 46 deletions(-)

diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf
index 1767ea6ed0..56065a43fc 100644
--- a/addons/captives/functions/fnc_canStopEscorting.sqf
+++ b/addons/captives/functions/fnc_canStopEscorting.sqf
@@ -25,4 +25,4 @@ if (isNull _target) then {
 
 if (isNull _target) exitWith {false};
 
-(_target in (attachedObjects _unit)) && {!(_target getVariable [QGVAR(isHandcuffed), false])}
+(_target in (attachedObjects _unit)) && {_target getVariable [QGVAR(isHandcuffed), false]}
diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf
index d991baf433..8ccbfc9b4a 100644
--- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf
+++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf
@@ -4,9 +4,11 @@
  * Draw the nametag and rank icon.
  *
  * Argument:
- * 0: Unit (Array)
- * 1: alpha (Number)
- * 2: Height offset (Number)
+ * 0: Unit (Player) <OBJECT>
+ * 1: Target <OBJECT>
+ * 2: alpha (Number)
+ * 4: Height offset (Number)
+ * 5: Draw Type <NUMBER>
  *
  * Return value:
  * None.
@@ -23,30 +25,38 @@
     "\A3\Ui_f\data\GUI\Cfg\Ranks\captain_gs.paa", \
     "\A3\Ui_f\data\GUI\Cfg\Ranks\major_gs.paa", \
     "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \
-]
+    ]
 
 private ["_height", "_position", "_color", "_name", "_rank", "_size"];
 
-PARAMS_4(_player,_target,_alpha,_heightOffset);
+PARAMS_5(_player,_target,_alpha,_heightOffset,_iconType);
 
-_name = [_target, true] call EFUNC(common,getName);
+if (_alpha < 0) exitWith {}; //Don't waste time if not visable
+if (_iconType == ICON_NONE) exitWith {}; //Don't waste time if not visable
 
+
+//Set Text:
+_name = if (_iconType in [ICON_NAME, ICON_NAME_RANK, ICON_NAME_SPEAK]) then {
+    [_target, true] call EFUNC(common,getName)
+} else {
+    ""
+};
+
+//Set Icon:
 _icon = "";
 _size = 0;
-
-if (GVAR(showSoundWaves) && {(_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}}) then {
+if ((_iconType == ICON_NAME_SPEAK) || (_iconType == ICON_SPEAK)) then {
     _icon = QUOTE(PATHTOF(UI\soundwave)) + str (floor (random 10)) + ".paa";
     _size = 0.75;
     _alpha = _alpha + 0.6;//Boost alpha when speaking
 } else {
-    if (GVAR(showPlayerRanks)) then {
+    if (_iconType == ICON_NAME_RANK) then {
         _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1);
         _size = 0.75;
     };
 };
 
-if (_alpha < 0) exitWith {}; //Don't waste time if not visable
-
+//Set Color:
 if !(group _target == group _player) then {
     _color = +GVAR(defaultNametagColor); //Make a copy, then multiply both alpha values (allows client to decrease alpha in settings)
     _color set [3, (_color select 3) * _alpha];
@@ -55,19 +65,18 @@ if !(group _target == group _player) then {
 };
 
 _height = [2, 1.5, 1, 1.5, 1] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find (stance _target));
-
 // Convert position to ASLW (expected by drawIcon3D) and add height offsets
 _position = _target modelToWorldVisual [0, 0, (_height + _heightOffset)];
 
 drawIcon3D [
-    _icon,
-    _color,
-    _position,
-    _size,
-    _size,
-    0,
-    _name,
-    2,
-    0.033,
-    "PuristaMedium"
+_icon,
+_color,
+_position,
+_size,
+_size,
+0,
+_name,
+2,
+0.033,
+"PuristaMedium"
 ];
diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf
index 49b4177dda..127afb8561 100644
--- a/addons/nametags/functions/fnc_onDraw3d.sqf
+++ b/addons/nametags/functions/fnc_onDraw3d.sqf
@@ -5,44 +5,61 @@ _player = ACE_player;
 //don't show nametags in spectator
 if (!alive _player) exitWith {};
 
-_onKeyPressAlphaMax = 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0
-
-//If set to only show on keypress and nothing would be visable, exit
-if ((GVAR(showPlayerNames) in [3,4]) && {GVAR(showSoundWaves) < 2} && {(2 + (GVAR(ShowNamesTime) - time)) < 0}) exitWith{};
+_onKeyPressAlphaMax = if ((GVAR(showPlayerNames) in [3,4])) then {
+    2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0
+} else {
+    1
+};
 
+_defaultIcon = if (GVAR(showPlayerRanks)) then {
+    ICON_NAME_RANK;
+} else {
+    ICON_NAME;
+};
 
 //When cursorTarget is on a vehicle show the nametag for the commander.
 //If set to "Only On Keypress" settings, fade just like main tags
-if (GVAR(showCursorTagForVehicles)) then {
+if (GVAR(showCursorTagForVehicles) && {_onKeyPressAlphaMax > 0}) then {
     _target = cursorTarget;
     if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then {
         _target = effectiveCommander _target;
-        if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
+        if ((!isNull _target) &&
+                {(side (group _target)) == (side (group _player))} &&
+                {_target != _player} &&
+                {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} &&
+                {!(_target getVariable ["ACE_hideName", false])}) then {
             _distance = _player distance _target;
             _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha);
-            if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress
-                _alpha = _alpha min _onKeyPressAlphaMax;
-            };
-            [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
+            _alpha = _alpha min _onKeyPressAlphaMax;
+            [_player, _target, _alpha, _distance * 0.026, _defaultIcon] call FUNC(drawNameTagIcon);
         };
     };
 };
 
-//"Only Cursor" mode, only show nametags for humans
-if (GVAR(showPlayerNames) in [2,4]) then {
+//"Only Cursor" mode, only show nametags for humans on cursorTarget
+if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then {
     _target = cursorTarget;
-    if ((!isNull _target) && {_target isKindOf "CAManBase"} && {(side (group _target)) == (side (group _player))} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
+    if ((!isNull _target) &&
+            {_target isKindOf "CAManBase"} &&
+            {(side (group _target)) == (side (group _player))} &&
+            {_target != _player} &&
+            {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} &&
+            {!(_target getVariable ["ACE_hideName", false])}) then {
         _distance = _player distance _target;
         _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha);
-        if ((GVAR(showPlayerNames) == 4)) then { //only on keypress
-            _alpha = _alpha min _onKeyPressAlphaMax;
+        _alpha = _alpha min _onKeyPressAlphaMax;
+        _icon = ICON_NONE;
+        if (GVAR(showSoundWaves) == 2) then {  //icon will be drawn below, so only show name here
+            _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME} else {_defaultIcon};
+        } else {
+            _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME_SPEAK} else {_defaultIcon};
         };
-        [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
+
+        [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon);
     };
 };
 
-
-if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then {
+if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(showSoundWaves) == 2}) then {
     _pos = positionCameraToWorld [0, 0, 0];
     _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5];
 
@@ -58,7 +75,20 @@ if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then {
     {
         _target = _x;
 
-        if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then {
+        _icon = ICON_NONE;
+        if ((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) then {
+            if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon};
+        } else {
+            //showSoundWaves must be 2, only draw speak icon
+            if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_SPEAK;};
+        };
+
+        if ((_icon != ICON_NONE) &&
+                {(side (group _target)) == (side (group _player))} &&
+                {_target != _player} &&
+                {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} &&
+                {!(_target getVariable ["ACE_hideName", false])}) then {
+
             if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight
             _relPos = (visiblePositionASL _target) vectorDiff _pos;
             _distance = vectorMagnitude _relPos;
@@ -66,12 +96,13 @@ if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then {
 
             _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha);
 
-            if (GVAR(showPlayerNames) == 3) then { //only on keypress
+            if ((GVAR(showSoundWaves) == 2) && {(_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}}) then {
+                _alpha = 1;
+            } else {
                 _alpha = _alpha min _onKeyPressAlphaMax;
             };
 
-            [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon);
+            [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon);
         };
     } forEach _targets;
 };
-
diff --git a/addons/nametags/script_component.hpp b/addons/nametags/script_component.hpp
index 6cffb95618..e80768a723 100644
--- a/addons/nametags/script_component.hpp
+++ b/addons/nametags/script_component.hpp
@@ -9,4 +9,10 @@
     #define DEBUG_SETTINGS DEBUG_SETTINGS_NAMETAGS
 #endif
 
-#include "\z\ace\addons\main\script_macros.hpp"
\ No newline at end of file
+#include "\z\ace\addons\main\script_macros.hpp"
+
+#define ICON_NONE 0
+#define ICON_NAME 1
+#define ICON_NAME_RANK 2
+#define ICON_NAME_SPEAK 3
+#define ICON_SPEAK 4

From 3511a74ef95a73ea2f1f61fe1f8861660d5c2036 Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Thu, 19 Feb 2015 16:59:21 -0600
Subject: [PATCH 15/27] Don't show sound if not enabled

---
 addons/nametags/functions/fnc_onDraw3d.sqf | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf
index 127afb8561..8aa503d377 100644
--- a/addons/nametags/functions/fnc_onDraw3d.sqf
+++ b/addons/nametags/functions/fnc_onDraw3d.sqf
@@ -52,7 +52,7 @@ if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then {
         if (GVAR(showSoundWaves) == 2) then {  //icon will be drawn below, so only show name here
             _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME} else {_defaultIcon};
         } else {
-            _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME_SPEAK} else {_defaultIcon};
+            _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {ICON_NAME_SPEAK} else {_defaultIcon};
         };
 
         [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon);
@@ -77,7 +77,7 @@ if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(sho
 
         _icon = ICON_NONE;
         if ((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) then {
-            if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon};
+            if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon};
         } else {
             //showSoundWaves must be 2, only draw speak icon
             if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_SPEAK;};

From 6fde2de40f4b7d08eefa5b2aaa6cc851e582b482 Mon Sep 17 00:00:00 2001
From: Glowbal <thomasskooi@live.nl>
Date: Tue, 24 Feb 2015 17:14:19 +0100
Subject: [PATCH 16/27] Improved localization support and sendDisplayText to
 remote client objects.

---
 .../functions/fnc_displayTextPicture.sqf      | 19 ++++++++++++++++--
 .../functions/fnc_displayTextStructured.sqf   | 20 +++++++++++++++----
 2 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf
index 8472b3d1b6..6216adb20e 100644
--- a/addons/common/functions/fnc_displayTextPicture.sqf
+++ b/addons/common/functions/fnc_displayTextPicture.sqf
@@ -14,14 +14,29 @@
 
 #include "script_component.hpp"
 
-private ["_text", "_image", "_imageColor"];
+private ["_text", "_image", "_imageColor", "_target"];
 _text = _this select 0;
 _image = _this select 1;
 _imageColor = if (count _this > 2) then {_this select 2} else {[1,1,1]};
 _imageColor resize 3;
+_target = if (count _this > 3) then {_this select 3} else {ACE_player};
+
+if (!local _target && {_target != ACE_player}) exitwith {
+	[_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc);
+};
 
 if (typeName _text != "TEXT") then {
-  if (typeName _text == "STRING" && {isLocalized _text}) then {
+	if (typeName _text == "ARRAY") then {
+		if (count _text > 0) then {
+		    {
+		    	if (typeName _x == "STRING" && {isLocalized _x}) then {
+		    		_text set [_foreachIndex, localize _x];
+		    	};
+			}foreach _text;
+		    _text = format _text;
+		};
+	};
+  	if (typeName _text == "STRING" && {isLocalized _text}) then {
         _text = localize _text;
     };
   	_text = parseText format ["<t align='center'>%1</t>", _text];
diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf
index 054e98de70..be3e4b585b 100644
--- a/addons/common/functions/fnc_displayTextStructured.sqf
+++ b/addons/common/functions/fnc_displayTextStructured.sqf
@@ -13,14 +13,26 @@
 
 #include "script_component.hpp"
 
-private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position"];
-
+private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position", "_target"];
 _text = _this select 0;
-_size = _this select 1;
+_size = if (count _this > 1) then {_this select 1} else {0.1;};
+_target = if (count _this > 2) then {_this select 2} else {ACE_player};
 
-if (isNil "_size") then {_size = 1.5};
+if (!local _target && {_target != ACE_player}) exitwith {
+	[_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc);
+};
 
 if (typeName _text != "TEXT") then {
+	if (typeName _text == "ARRAY") then {
+		if (count _text > 0) then {
+		    {
+		    	if (typeName _x == "STRING" && {isLocalized _x}) then {
+		    		_text set [_foreachIndex, localize _x];
+		    	};
+			}foreach _text;
+		    _text = format _text;
+		};
+	};
     if (typeName _text == "STRING" && {isLocalized _text}) then {
         _text = localize _text;
     };

From 85c568a061c4d9ac215fd4d2b2457f8b229dda7b Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Tue, 24 Feb 2015 10:27:53 -0600
Subject: [PATCH 17/27] Comments

---
 addons/captives/functions/fnc_handleZeusDisplayChanged.sqf | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf
index 2299fa7031..84b90e78c2 100644
--- a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf
+++ b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf
@@ -1,6 +1,6 @@
 /*
  * Author: PabstMirror
- * Handles handles ZeusDisplayChanged event
+ * Handles ZeusDisplayChanged event
  * Need to reset showHUD after closing zeus
  *
  * Arguments:

From 278f0ab889cb3e5a19f80d67f97f5478ae1213f4 Mon Sep 17 00:00:00 2001
From: Glowbal <thomasskooi@live.nl>
Date: Tue, 24 Feb 2015 18:02:41 +0100
Subject: [PATCH 18/27] Fixed indentation Added check for AI units

---
 .../functions/fnc_displayTextPicture.sqf      | 27 ++++++++++---------
 .../functions/fnc_displayTextStructured.sqf   | 23 ++++++++--------
 2 files changed, 26 insertions(+), 24 deletions(-)

diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf
index 6216adb20e..9885524db7 100644
--- a/addons/common/functions/fnc_displayTextPicture.sqf
+++ b/addons/common/functions/fnc_displayTextPicture.sqf
@@ -22,24 +22,25 @@ _imageColor resize 3;
 _target = if (count _this > 3) then {_this select 3} else {ACE_player};
 
 if (!local _target && {_target != ACE_player}) exitwith {
-	[_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc);
+    [_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc);
 };
+if (_target != ACE_player) exitWith {};
 
 if (typeName _text != "TEXT") then {
-	if (typeName _text == "ARRAY") then {
-		if (count _text > 0) then {
-		    {
-		    	if (typeName _x == "STRING" && {isLocalized _x}) then {
-		    		_text set [_foreachIndex, localize _x];
-		    	};
-			}foreach _text;
-		    _text = format _text;
-		};
-	};
-  	if (typeName _text == "STRING" && {isLocalized _text}) then {
+    if (typeName _text == "ARRAY") then {
+        if (count _text > 0) then {
+            {
+                if (typeName _x == "STRING" && {isLocalized _x}) then {
+                    _text set [_foreachIndex, localize _x];
+                };
+            }foreach _text;
+            _text = format _text;
+        };
+    };
+    if (typeName _text == "STRING" && {isLocalized _text}) then {
         _text = localize _text;
     };
-  	_text = parseText format ["<t align='center'>%1</t>", _text];
+    _text = parseText format ["<t align='center'>%1</t>", _text];
 };
 _text = composeText [parseText format ["<img size='2' align='center' color='%2' image='%1'/>", _image, _imageColor call BIS_fnc_colorRGBtoHTML], lineBreak, _text];
 [_text, 2] call FUNC(displayTextStructured);
diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf
index be3e4b585b..90f066057b 100644
--- a/addons/common/functions/fnc_displayTextStructured.sqf
+++ b/addons/common/functions/fnc_displayTextStructured.sqf
@@ -19,20 +19,21 @@ _size = if (count _this > 1) then {_this select 1} else {0.1;};
 _target = if (count _this > 2) then {_this select 2} else {ACE_player};
 
 if (!local _target && {_target != ACE_player}) exitwith {
-	[_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc);
+    [_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc);
 };
+if (_target != ACE_player) exitWith {};
 
 if (typeName _text != "TEXT") then {
-	if (typeName _text == "ARRAY") then {
-		if (count _text > 0) then {
-		    {
-		    	if (typeName _x == "STRING" && {isLocalized _x}) then {
-		    		_text set [_foreachIndex, localize _x];
-		    	};
-			}foreach _text;
-		    _text = format _text;
-		};
-	};
+    if (typeName _text == "ARRAY") then {
+        if (count _text > 0) then {
+            {
+                if (typeName _x == "STRING" && {isLocalized _x}) then {
+                    _text set [_foreachIndex, localize _x];
+                };
+            }foreach _text;
+            _text = format _text;
+        };
+    };
     if (typeName _text == "STRING" && {isLocalized _text}) then {
         _text = localize _text;
     };

From 37031b5002ec9b0630ceb1bcd757f8adf7698b8d Mon Sep 17 00:00:00 2001
From: Glowbal <thomasskooi@live.nl>
Date: Tue, 24 Feb 2015 18:10:40 +0100
Subject: [PATCH 19/27] Replaced execRemoteFnc by ACE event system

---
 addons/common/XEH_postInit.sqf                        | 3 +++
 addons/common/functions/fnc_displayTextPicture.sqf    | 3 ---
 addons/common/functions/fnc_displayTextStructured.sqf | 3 ---
 3 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf
index dbb665d446..35b0f5c3fe 100644
--- a/addons/common/XEH_postInit.sqf
+++ b/addons/common/XEH_postInit.sqf
@@ -158,3 +158,6 @@ GVAR(OldPlayerTurret) = [ACE_player] call FUNC(getTurretIndex);
 PARAMS_2(_vehicle,_fuelLevel);
 _vehicle setFuel _fuelLevel;
 }] call FUNC(addEventhandler);
+
+["displayTextStructured", FUNC(displayTextStructured)] call FUNC(addEventhandler);
+["displayTextPicture", FUNC(displayTextPicture)] call FUNC(addEventhandler);
diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf
index 9885524db7..a2c6ec51e1 100644
--- a/addons/common/functions/fnc_displayTextPicture.sqf
+++ b/addons/common/functions/fnc_displayTextPicture.sqf
@@ -21,9 +21,6 @@ _imageColor = if (count _this > 2) then {_this select 2} else {[1,1,1]};
 _imageColor resize 3;
 _target = if (count _this > 3) then {_this select 3} else {ACE_player};
 
-if (!local _target && {_target != ACE_player}) exitwith {
-    [_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc);
-};
 if (_target != ACE_player) exitWith {};
 
 if (typeName _text != "TEXT") then {
diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf
index 90f066057b..3953f218d0 100644
--- a/addons/common/functions/fnc_displayTextStructured.sqf
+++ b/addons/common/functions/fnc_displayTextStructured.sqf
@@ -18,9 +18,6 @@ _text = _this select 0;
 _size = if (count _this > 1) then {_this select 1} else {0.1;};
 _target = if (count _this > 2) then {_this select 2} else {ACE_player};
 
-if (!local _target && {_target != ACE_player}) exitwith {
-    [_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc);
-};
 if (_target != ACE_player) exitWith {};
 
 if (typeName _text != "TEXT") then {

From 5364980997d49662a57126c17f002d8e590f5b58 Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Tue, 24 Feb 2015 11:36:49 -0600
Subject: [PATCH 20/27] Zeus Module Hints

---
 .../functions/fnc_moduleSurrender.sqf         | 21 ++++++++++---------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf
index 9311c7a1b9..07e7c1b9ad 100644
--- a/addons/captives/functions/fnc_moduleSurrender.sqf
+++ b/addons/captives/functions/fnc_moduleSurrender.sqf
@@ -27,24 +27,25 @@ if (local _logic) then {
         if ((count _bisMouseOver) == 2) then {//check what mouse was over before the module was placed
             _mouseOverObject = _bisMouseOver select 1;
             if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then {
-                systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)];
-                
-                if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then {
-                    ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent);
+                TRACE_2("Debug - module surrendering %1",_mouseOverObject,(name _mouseOverObject));
+                if (alive _mouseOverObject) then {
+                    if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then {
+                        ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent);
+                    } else {
+                        ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent);
+                    };
                 } else {
-                    ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent);
+                    ["STR_ACE_Captives_Zeus_OnlyAlive"] call EFUNC(commmon,displayTextStructured);
                 };
-
             } else {
-                systemChat format ["Only use on dismounted inf"];
+                ["STR_ACE_Captives_Zeus_OnlyInfentry"] call EFUNC(commmon,displayTextStructured);
             };
         } else {
-            systemChat format ["Nothing under mouse"];
+            ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(commmon,displayTextStructured);
         };
     } else {//an editor module
         {
-            systemChat format ["Debug - module surrendering %1", (name _x)];
-            [_x, true] call FUNC(setSurrendered);
+            ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent);
         } forEach _units;
     };
 

From ae3de331c465b5a3590c5b226ec80c82db6f6dff Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Tue, 24 Feb 2015 11:51:37 -0600
Subject: [PATCH 21/27] Module At Mission Start (Issue #148)

---
 addons/captives/functions/fnc_moduleSurrender.sqf | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf
index 07e7c1b9ad..1c10779220 100644
--- a/addons/captives/functions/fnc_moduleSurrender.sqf
+++ b/addons/captives/functions/fnc_moduleSurrender.sqf
@@ -43,10 +43,15 @@ if (local _logic) then {
         } else {
             ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(commmon,displayTextStructured);
         };
-    } else {//an editor module
-        {
-            ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent);
-        } forEach _units;
+    } else {
+        //an editor module
+        //Modules run before postInit can instal the event handler, so we need to wait a little bit
+        [{
+            PARAMS_1(_units);
+            {
+                ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent);
+            } forEach _units;
+        }, [_units], 0.05, 0.05]call EFUNC(common,waitAndExecute);
     };
 
     deleteVehicle _logic;

From 97d18899716f31d709bd44c72525785cd9a1bb5a Mon Sep 17 00:00:00 2001
From: PabstMirror <pabstmirror@gmail.com>
Date: Tue, 24 Feb 2015 12:40:22 -0600
Subject: [PATCH 22/27] Shift Display to Right if Zeus Interface is open

---
 addons/common/functions/fnc_displayTextStructured.sqf | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf
index 3953f218d0..6e8851a099 100644
--- a/addons/common/functions/fnc_displayTextStructured.sqf
+++ b/addons/common/functions/fnc_displayTextStructured.sqf
@@ -58,6 +58,12 @@ _xPos = ((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)
 _yPos = safeZoneY + 0.175 * safezoneH;
 _wPos =  (10 *(((safezoneW / safezoneH) min 1.2) / 40));
 _hPos = (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25));
+
+//Zeus Interface Open and Display would be under the "CREATE" list
+if (!isnull curatorCamera) then {
+    _xPos = _xPos min ((safezoneX + safezoneW - 12.5 * (((safezoneW / safezoneH) min 1.2) / 40)) - _wPos);
+};
+
 _position = [_xPos, _yPos, _wPos, _size * _hPos];
 
 _ctrlHint ctrlSetPosition _position;

From 80ac6d83deba2fd2d8327f7e7191665b326890e7 Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Tue, 24 Feb 2015 12:44:54 -0600
Subject: [PATCH 23/27] Zeus Module Messages

---
 addons/captives/functions/fnc_moduleSurrender.sqf |  6 +++---
 addons/captives/stringtable.xml                   | 11 ++++++++++-
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf
index 1c10779220..1a335131a8 100644
--- a/addons/captives/functions/fnc_moduleSurrender.sqf
+++ b/addons/captives/functions/fnc_moduleSurrender.sqf
@@ -35,13 +35,13 @@ if (local _logic) then {
                         ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent);
                     };
                 } else {
-                    ["STR_ACE_Captives_Zeus_OnlyAlive"] call EFUNC(commmon,displayTextStructured);
+                    ["STR_ACE_Captives_Zeus_OnlyAlive"] call EFUNC(common,displayTextStructured);
                 };
             } else {
-                ["STR_ACE_Captives_Zeus_OnlyInfentry"] call EFUNC(commmon,displayTextStructured);
+                ["STR_ACE_Captives_Zeus_OnlyInfentry"] call EFUNC(common,displayTextStructured);
             };
         } else {
-            ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(commmon,displayTextStructured);
+            ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(common,displayTextStructured);
         };
     } else {
         //an editor module
diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml
index 7d8096b3e6..f03f30a113 100644
--- a/addons/captives/stringtable.xml
+++ b/addons/captives/stringtable.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Edited with tabler - 2015-02-06 -->
+<!-- Edited with tabler - 2015-02-24 -->
 <Project name="ACE">
   <Package name="Captives">
     <Key ID="STR_ACE_Captives_SetCaptive">
@@ -136,5 +136,14 @@
     <Key ID="STR_ACE_Captives_StopSurrendering">
       <English>Stop Surrendering</English>
     </Key>
+    <Key ID="STR_ACE_Captives_Zeus_OnlyAlive">
+      <English>Only use on alive units</English>
+    </Key>
+    <Key ID="STR_ACE_Captives_Zeus_OnlyInfentry">
+      <English>Only use on dismounted inf</English>
+    </Key>
+    <Key ID="STR_ACE_Captives_Zeus_NothingSelected">
+      <English>Nothing under mouse</English>
+    </Key>
   </Package>
 </Project>
\ No newline at end of file

From e10c907454f12750a8a223653dd17c972f095e7c Mon Sep 17 00:00:00 2001
From: Glowbal <thomasskooi@live.nl>
Date: Tue, 24 Feb 2015 20:25:34 +0100
Subject: [PATCH 24/27] Added missing header arguments

---
 addons/common/functions/fnc_displayTextPicture.sqf    | 1 +
 addons/common/functions/fnc_displayTextStructured.sqf | 1 +
 2 files changed, 2 insertions(+)

diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf
index a2c6ec51e1..fadf28b480 100644
--- a/addons/common/functions/fnc_displayTextPicture.sqf
+++ b/addons/common/functions/fnc_displayTextPicture.sqf
@@ -7,6 +7,7 @@
  * 0: Text <ANY>
  * 1: Image <STRING>
  * 2: Image color <ARRAY> <OPTIONAL>
+ * 3: Target Unit. Will only display if target is the player controlled object <OBJECT> <OPTIONAL>
  *
  * Return value:
  * Nothing
diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf
index 3953f218d0..f1761c39a7 100644
--- a/addons/common/functions/fnc_displayTextStructured.sqf
+++ b/addons/common/functions/fnc_displayTextStructured.sqf
@@ -6,6 +6,7 @@
  * Argument:
  * 0: Text <ANY>
  * 1: Size of the textbox <NUMBER> <OPTIONAL>
+ * 2: Target Unit. Will only display if target is the player controlled object <OBJECT> <OPTIONAL>
  *
  * Return value:
  * Nothing

From 5b50910ef64df20dff80d75474ae688e6e1e4cb6 Mon Sep 17 00:00:00 2001
From: Glowbal <thomasskooi@live.nl>
Date: Wed, 25 Feb 2015 11:23:35 +0100
Subject: [PATCH 25/27] Fixed incorrect size

---
 addons/common/functions/fnc_displayTextStructured.sqf | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf
index 1bbb89052e..cfe2feb3cb 100644
--- a/addons/common/functions/fnc_displayTextStructured.sqf
+++ b/addons/common/functions/fnc_displayTextStructured.sqf
@@ -16,7 +16,7 @@
 
 private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position", "_target"];
 _text = _this select 0;
-_size = if (count _this > 1) then {_this select 1} else {0.1;};
+_size = if (count _this > 1) then {_this select 1} else {1.5;};
 _target = if (count _this > 2) then {_this select 2} else {ACE_player};
 
 if (_target != ACE_player) exitWith {};

From bf21a8bc917015dd1a650defdd132d4cbd165a6f Mon Sep 17 00:00:00 2001
From: PabstMirror <elephantisaterriblemascot@gmail.com>
Date: Fri, 27 Feb 2015 15:28:48 -0600
Subject: [PATCH 26/27] Pull configSetting from upstream

---
 addons/common/functions/fnc_setSettingFromConfig.sqf | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf
index e68157bfdb..27c727acab 100644
--- a/addons/common/functions/fnc_setSettingFromConfig.sqf
+++ b/addons/common/functions/fnc_setSettingFromConfig.sqf
@@ -16,7 +16,9 @@ EXPLODE_1_PVT(_this,_optionEntry);
 
 _fnc_getValueWithType = {
     EXPLODE_2_PVT(_this,_optionEntry,_typeName);
-   _value = if (isNumber (_optionEntry >> "value")) then {getNumber (_optionEntry >> "value")} else {0}; //getNumber on an array throws a warning
+
+    _valueConfig = (_optionEntry >> "value");
+    _value = if (isNumber (_optionEntry >> "value")) then {getNumber (_optionEntry >> "value")} else {0};
     TRACE_3("_fnc_getValueWithType:", configName _optionEntry, _typeName, _value);
     if (_typeName == "BOOL") exitWith {
         _value > 0

From 114718e8ae226a9f2350b9429646dbf86251228c Mon Sep 17 00:00:00 2001
From: KoffeinFlummi <koffeinflummi@gmail.com>
Date: Sat, 28 Feb 2015 15:22:21 +0100
Subject: [PATCH 27/27] Fix line ending in .editorconf

---
 .editorconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.editorconfig b/.editorconfig
index f6f23b8d1b..0deca3d2ab 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,7 +1,7 @@
 root = true
 
 [*]
-end_of_line = lf
+end_of_line = crlf
 insert_final_newline = true
 charset = utf-8
 indent_style = space