From 3feafc449f9ecf0baf3a0f12ce14c4daa1238c7b Mon Sep 17 00:00:00 2001
From: Dystopian <sddex@ya.ru>
Date: Mon, 26 Feb 2018 21:23:47 +0300
Subject: [PATCH] Interaction - Add Flip and Push actions to Quad Bike, Kart
 and Static Weapons (#6019)

* Add Flip and Push actions to Quad Bike

* Add actions to karts and static weapons

* Move magic number to macro

* Ditch here is

* Move condition to function
---
 addons/interaction/CfgVehicles.hpp           | 39 ++++++++++++++++++++
 addons/interaction/XEH_PREP.hpp              |  1 +
 addons/interaction/XEH_postInit.sqf          |  8 ++++
 addons/interaction/functions/fnc_canFlip.sqf | 25 +++++++++++++
 addons/interaction/stringtable.xml           |  6 ++-
 5 files changed, 78 insertions(+), 1 deletion(-)
 create mode 100644 addons/interaction/functions/fnc_canFlip.sqf

diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp
index fc89a0f2ec..13f84bd5d0 100644
--- a/addons/interaction/CfgVehicles.hpp
+++ b/addons/interaction/CfgVehicles.hpp
@@ -368,6 +368,40 @@ class CfgVehicles {
         };
     };
 
+    class Car_F: Car{};
+    class Quadbike_01_base_F: Car_F {
+        class ACE_Actions: ACE_Actions {
+            class ACE_MainActions: ACE_MainActions {
+                class GVAR(flip) {
+                    displayName = CSTRING(Flip);
+                    condition = QUOTE(call DFUNC(canFlip));
+                    statement = QUOTE([ARR_3(QQGVAR(flip),_target,_target)] call CBA_fnc_targetEvent);
+                };
+                class GVAR(push) {
+                    displayName = CSTRING(Push);
+                    condition = QUOTE(_target call FUNC(canPush));
+                    statement = QUOTE(call FUNC(push));
+                };
+            };
+        };
+    };
+    class Kart_01_Base_F: Car_F {
+        class ACE_Actions: ACE_Actions {
+            class ACE_MainActions: ACE_MainActions {
+                class GVAR(flip) {
+                    displayName = CSTRING(Flip);
+                    condition = QUOTE(call DFUNC(canFlip));
+                    statement = QUOTE([ARR_3(QQGVAR(flip),_target,_target)] call CBA_fnc_targetEvent);
+                };
+                class GVAR(push) {
+                    displayName = CSTRING(Push);
+                    condition = QUOTE(_target call FUNC(canPush));
+                    statement = QUOTE(call FUNC(push));
+                };
+            };
+        };
+    };
+
     class Tank: LandVehicle {
         class ACE_Actions {
             class ACE_MainActions {
@@ -545,6 +579,11 @@ class CfgVehicles {
                     exceptions[] = {"isNotSwimming"};
                     insertChildren = QUOTE(_this call DFUNC(addPassengersActions));
                 };
+                class GVAR(flip) {
+                    displayName = CSTRING(Flip);
+                    condition = QUOTE(call DFUNC(canFlip));
+                    statement = QUOTE([ARR_3(QQGVAR(flip),_target,_target)] call CBA_fnc_targetEvent);
+                };
             };
         };
 
diff --git a/addons/interaction/XEH_PREP.hpp b/addons/interaction/XEH_PREP.hpp
index 1a70de8831..06dd7acbe0 100644
--- a/addons/interaction/XEH_PREP.hpp
+++ b/addons/interaction/XEH_PREP.hpp
@@ -42,4 +42,5 @@ PREP(openDoor);
 PREP(canPush);
 PREP(push);
 
+PREP(canFlip);
 PREP(switchLamp);
diff --git a/addons/interaction/XEH_postInit.sqf b/addons/interaction/XEH_postInit.sqf
index a93f5461b2..3604f94511 100644
--- a/addons/interaction/XEH_postInit.sqf
+++ b/addons/interaction/XEH_postInit.sqf
@@ -28,6 +28,14 @@ ACE_Modifier = 0;
     {_lamp setHit [_x select 0, (_x select 1) max _disabledLampDMG];nil} count _hitPointsDamage;
 }] call CBA_fnc_addEventHandler;
 
+
+[QGVAR(flip), {
+    params ["_vehicle"];
+    private _position = getPosATL _vehicle;
+    _vehicle setVectorUp surfaceNormal _position;
+    _vehicle setPosATL _position;
+}] call CBA_fnc_addEventHandler;
+
 [QGVAR(setCollisionLight), {
     (_this select 0) setCollisionLight (_this select 1);
 }] call CBA_fnc_addEventHandler;
diff --git a/addons/interaction/functions/fnc_canFlip.sqf b/addons/interaction/functions/fnc_canFlip.sqf
new file mode 100644
index 0000000000..70c004920c
--- /dev/null
+++ b/addons/interaction/functions/fnc_canFlip.sqf
@@ -0,0 +1,25 @@
+/*
+ * Author: Dystopian
+ * Checks if vehicle can be flipped.
+ *
+ * Arguments:
+ * 0: Vehicle <OBJECT>
+ *
+ * Return Value:
+ * Can Flip <BOOL>
+ *
+ * Example:
+ * [cursorObject] call ace_interaction_fnc_canFlip
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+params ["_vehicle"];
+
+// most suitable mass for all vanilla, CUP and RHS statics ATM (ZU-23 suits, D-30 and M119 don't suit)
+#define FLIP_MAX_STATICWEAPON_MASS 2000
+
+1 < (vectorUp _vehicle) vectorDistance (surfaceNormal getPosATL _vehicle)
+&& {0 == {alive _x} count crew _vehicle || {isAutonomous _vehicle}}
+&& {getMass _vehicle <= FLIP_MAX_STATICWEAPON_MASS}
diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml
index c0fd822f86..50c086a8fa 100644
--- a/addons/interaction/stringtable.xml
+++ b/addons/interaction/stringtable.xml
@@ -832,7 +832,7 @@
             <Polish>Pchnij</Polish>
             <Czech>Tlačit</Czech>
             <Hungarian>Tolás</Hungarian>
-            <Russian>Толкать</Russian>
+            <Russian>Толкнуть</Russian>
             <Portuguese>Empurrar</Portuguese>
             <Italian>Spingere</Italian>
             <Japanese>押す</Japanese>
@@ -840,6 +840,10 @@
             <Chinesesimp>推</Chinesesimp>
             <Chinese>推</Chinese>
         </Key>
+        <Key ID="STR_ACE_Interaction_Flip">
+            <English>Flip</English>
+            <Russian>Перевернуть</Russian>
+        </Key>
         <Key ID="STR_ACE_Interaction_Interact">
             <English>Interact</English>
             <French>Interagir</French>