diff --git a/.hemtt/missions/test.Stratis/mission.sqm b/.hemtt/missions/test.Stratis/mission.sqm
index b842db4..d484f2e 100644
Binary files a/.hemtt/missions/test.Stratis/mission.sqm and b/.hemtt/missions/test.Stratis/mission.sqm differ
diff --git a/addons/m119/XEH_PREP.hpp b/addons/m119/XEH_PREP.hpp
index 288dd65..0c253c5 100644
--- a/addons/m119/XEH_PREP.hpp
+++ b/addons/m119/XEH_PREP.hpp
@@ -8,4 +8,8 @@ PREP(canUnfold);
PREP(fold);
PREP(unfold);
PREP(fired);
-PREP(eject);
\ No newline at end of file
+PREP(eject);
+PREP(canLoad);
+PREP(canUnload);
+PREP(load);
+PREP(unload);
diff --git a/addons/m119/XEH_preInit.sqf b/addons/m119/XEH_preInit.sqf
index d4d5ed5..c43a837 100644
--- a/addons/m119/XEH_preInit.sqf
+++ b/addons/m119/XEH_preInit.sqf
@@ -6,3 +6,18 @@
[QUOTE(TBD_M119), "fired", {_this call FUNC(fired)}] call CBA_fnc_addClassEventHandler;
ADDON = true;
+
+[
+ QGVAR(loadShell),
+ {
+ params ["_arty", "_shell", "_turret"];
+
+ // Remove all mags in given turret
+ private _mags = _arty magazinesTurret [_turret];
+ {
+ _arty removeMagazineTurret [_x, [_turret]];
+ } forEach _mags;
+
+ _arty addMagazineTurret [_shell, [_turret], 1];
+ }
+] call CBA_fnc_addEventHandler;
diff --git a/addons/m119/functions/fnc_canLoad.sqf b/addons/m119/functions/fnc_canLoad.sqf
new file mode 100644
index 0000000..6dd863e
--- /dev/null
+++ b/addons/m119/functions/fnc_canLoad.sqf
@@ -0,0 +1,44 @@
+/*
+ FILE: fnc_canLoad.sqf
+
+ Name: tbd_m119_m119_fnc_canLoad
+
+ Author(s):
+ ilbinek
+
+ Description:
+ Check if the M119 can be loaded with this type of round
+
+ Parameters:
+ _arty - object - M119 to be loaded
+ _shell - string - type of round to be loaded
+
+ Returns:
+ bool - true if the M119 can be loaded, false otherwise
+
+ Examples:
+ > [_arty, tbd_mortars_105mm_he_round_1] call tbd_m119_m119_fnc_canLoad;
+
+ Public:
+ No
+*/
+
+#include "..\script_component.hpp"
+
+params ["_arty", "_shell"];
+
+if !(_arty getVariable[QGVAR(breech), false]) exitWith {false};
+
+// Check of the mortar is empty
+private _mags = _arty magazinesTurret [0];
+if (count _mags != 0) exitWith {false};
+
+// Check if this shell is nearby
+private _veh = nearestObjects [player, [_shell], 3];
+
+private _ret = false;
+{
+ if (typeOf _x == _shell) exitWith {_ret = true;};
+} forEach _veh;
+
+_ret
diff --git a/addons/m119/functions/fnc_canUnload.sqf b/addons/m119/functions/fnc_canUnload.sqf
new file mode 100644
index 0000000..6ef6420
--- /dev/null
+++ b/addons/m119/functions/fnc_canUnload.sqf
@@ -0,0 +1,34 @@
+/*
+ FILE: fnc_canUnload.sqf
+
+ Name: tbd_m119_m119_fnc_canUnload
+
+ Author(s):
+ ilbinek
+
+ Description:
+ Check if the M119 can be unloaded
+
+ Parameters:
+ _arty - object - M119 to be checked
+
+ Returns:
+ bool - true if the M119 can be unloaded, false otherwise
+
+ Examples:
+ > [_arty] call tbd_m119_m119_fnc_canUnload;
+
+ Public:
+ No
+*/
+
+#include "..\script_component.hpp"
+
+params ["_arty"];
+
+if !(_arty getVariable[QGVAR(breech), false]) exitWith {false};
+
+// Check of the mortar is empty
+private _mags = _arty magazinesTurret [0];
+if (count _mags == 0) exitWith {false};
+true
diff --git a/addons/m119/functions/fnc_eject.sqf b/addons/m119/functions/fnc_eject.sqf
index 8f54e17..783f140 100644
--- a/addons/m119/functions/fnc_eject.sqf
+++ b/addons/m119/functions/fnc_eject.sqf
@@ -26,3 +26,18 @@
params ["_arty"];
+// tbd_mortars_105mm_casing_spent
+private _spawnPoint = _arty modelToWorldVisual (_arty selectionPosition ["casing_spawn", "Memory"]);
+private _dirAndUp = _arty selectionVectorDirAndUp ["casing_spawn", "Memory"];
+
+_dirAndUp set [0, _arty vectorModelToWorld _dirAndUp#0];
+_dirAndUp set [1, _arty vectorModelToWorld _dirAndUp#1];
+
+// Spawn a new magazine at this position
+private _casing = createVehicle ["tbd_mortars_105mm_casing_spent", _spawnPoint, [], 0, "CAN_COLLIDE"];
+_casing setVectorDirAndUp _dirAndUp;
+
+_casing allowDamage false;
+
+// Add vertical force to the magazine
+[{params ["_casing"]; _casing addForce [_casing vectorModelToWorld [0, -100, 0], [0, 0, 0]];}, [_casing]] call CBA_fnc_execNextFrame;
diff --git a/addons/m119/functions/fnc_fired.sqf b/addons/m119/functions/fnc_fired.sqf
index 924107c..1901d33 100644
--- a/addons/m119/functions/fnc_fired.sqf
+++ b/addons/m119/functions/fnc_fired.sqf
@@ -32,3 +32,11 @@ _arty animateSource ["recoil_barrel_source", 2, 20];
[{params ["_arty"]; _arty animateSource ["recoil_rest_source", 0, 0.2];}, [_arty], 0.1] call CBA_fnc_waitAndExecute;
_arty setVariable [QGVAR(fired), true, true];
+
+private _mags = _arty magazinesTurret [0];
+{
+ _arty removeMagazinesTurret [_x, [0]];
+} forEach _mags;
+
+_arty animateSource ["magazine_hide_source", 1, true];
+_arty animateSource ["magazine_load_source", 0, true];
diff --git a/addons/m119/functions/fnc_init.sqf b/addons/m119/functions/fnc_init.sqf
index 1774a78..9a0d037 100644
--- a/addons/m119/functions/fnc_init.sqf
+++ b/addons/m119/functions/fnc_init.sqf
@@ -34,3 +34,14 @@ _arty setVariable [QGVAR(towed), false, true];
_arty setVariable [QGVAR(fired), false, true];
_arty enableRopeAttach true;
+
+_arty addAction [
+ "",
+ {},
+ nil,
+ -1e10,
+ false,
+ false,
+ "defaultAction",
+ '_target getVariable [(QGVAR(breech)),false]'
+];
diff --git a/addons/m119/functions/fnc_load.sqf b/addons/m119/functions/fnc_load.sqf
new file mode 100644
index 0000000..236aba2
--- /dev/null
+++ b/addons/m119/functions/fnc_load.sqf
@@ -0,0 +1,55 @@
+/*
+ FILE: fnc_load.sqf
+
+ Name: tbd_m119_m119_fnc_load
+
+ Author(s):
+ ilbinek
+
+ Description:
+ Load the round into the M119
+
+ Parameters:
+ _arty - object - M119 to be loaded
+ _shell - string - type of round to be loaded
+ _turret - number - path to turret
+
+ Returns:
+ Nothing
+
+ Examples:
+ > [_arty, tbd_mortars_105mm_he_round_1, 0] call tbd_m119_m119_fnc_load;
+
+ Public:
+ No
+*/
+
+#include "..\script_component.hpp"
+
+params ["_arty", "_shell", "_turret"];
+
+if !([_arty, _shell] call FUNC(canLoad)) exitWith {};
+
+private _mag = "";
+
+switch (_shell) do {
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_1): {_mag = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_1)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_2): {_mag = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_2)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_3): {_mag = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_3)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_4): {_mag = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_4)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_5): {_mag = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_5)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_6): {_mag = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_6)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_7): {_mag = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_7)};
+};
+
+[QGVAR(loadShell), [_arty, _mag, _turret], _arty, [-1]] call CBA_fnc_turretEvent;
+
+// Delete closest
+private _veh = nearestObjects [player, [_shell], 3];
+{
+ if (typeOf _x == _shell) exitWith {deleteVehicle _x};
+} forEach _veh;
+
+_arty animateSource ["magazine_load_source", 0, true];
+_arty animateSource ["magazine_hide_source", 0, true];
+_arty animateSource ["magazine_load_source", 0.36, 0.2];
diff --git a/addons/m119/functions/fnc_unload.sqf b/addons/m119/functions/fnc_unload.sqf
new file mode 100644
index 0000000..891a8fc
--- /dev/null
+++ b/addons/m119/functions/fnc_unload.sqf
@@ -0,0 +1,52 @@
+/*
+ FILE: fnc_unload.sqf
+
+ Name: tbd_m119_m119_fnc_unload
+
+ Author(s):
+ ilbinek
+
+ Description:
+ Fired EH for the M119. This script is called when the M119 is fired. It animates the recoil of the M119.
+
+ Parameters:
+ _arty - object - M119 that fired
+
+ Returns:
+ Nothing
+
+ Examples:
+ > [_arty] call tbd_m119_m119_fnc_unload;
+
+ Public:
+ No
+*/
+
+#include "..\script_component.hpp"
+
+params ["_arty", "_turret"];
+
+if !([_arty] call FUNC(canUnload)) exitWith {};
+
+private _mags = _arty magazinesTurret [_turret];
+{
+ _arty removeMagazinesTurret [_x, [_turret]];
+} forEach _mags;
+
+private _veh = "";
+
+switch (_mags#0) do {
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_1): {_veh = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_1)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_2): {_veh = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_2)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_3): {_veh = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_3)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_4): {_veh = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_4)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_5): {_veh = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_5)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_6): {_veh = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_6)};
+ case QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_7): {_veh = QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_7)};
+};
+
+_arty animateSource ["magazine_hide_source", 1];
+_arty animateSource ["magazine_load_source", 0];
+
+private _s = _veh createVehicle (getPos player);
+[player, _s] call ace_dragging_fnc_startCarry;
diff --git a/addons/m119/script_component.hpp b/addons/m119/script_component.hpp
index b33abb3..ae76a3c 100644
--- a/addons/m119/script_component.hpp
+++ b/addons/m119/script_component.hpp
@@ -23,6 +23,14 @@
#define TBD_M119_SHOT_SOUNDSET tbd_m119_shot_soundset
#define TBD_M119_SHOT_SOUNDSHADER tbd_M119_shot_soundshader
+#define TBD_MORTARS_105mm_ROUND_HE_CHARGE_1 tbd_mortars_105mm_round_he_charge_1
+#define TBD_MORTARS_105mm_ROUND_HE_CHARGE_2 tbd_mortars_105mm_round_he_charge_2
+#define TBD_MORTARS_105mm_ROUND_HE_CHARGE_3 tbd_mortars_105mm_round_he_charge_3
+#define TBD_MORTARS_105mm_ROUND_HE_CHARGE_4 tbd_mortars_105mm_round_he_charge_4
+#define TBD_MORTARS_105mm_ROUND_HE_CHARGE_5 tbd_mortars_105mm_round_he_charge_5
+#define TBD_MORTARS_105mm_ROUND_HE_CHARGE_6 tbd_mortars_105mm_round_he_charge_6
+#define TBD_MORTARS_105mm_ROUND_HE_CHARGE_7 tbd_mortars_105mm_round_he_charge_7
+
#define TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_1 tbd_mortars_105mm_round_he_charge_mag_1
#define TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_2 tbd_mortars_105mm_round_he_charge_mag_2
#define TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_3 tbd_mortars_105mm_round_he_charge_mag_3
diff --git a/addons/m119/stringtable.xml b/addons/m119/stringtable.xml
index bca847e..a4197d8 100644
--- a/addons/m119/stringtable.xml
+++ b/addons/m119/stringtable.xml
@@ -21,5 +21,13 @@
Unfold
Rozložit
+
+ Load
+ Nabít
+
+
+ Unload
+ Vybít
+
diff --git a/addons/m119/tbd_m119/CfgVehicles.hpp b/addons/m119/tbd_m119/CfgVehicles.hpp
index 4e40ffd..e661187 100644
--- a/addons/m119/tbd_m119/CfgVehicles.hpp
+++ b/addons/m119/tbd_m119/CfgVehicles.hpp
@@ -94,7 +94,7 @@ class CfgVehicles {
memoryPointsGetInGunnerDir = "pos_gunner_dir";
proxyType = "CPGunner";
proxyIndex = 1;
- magazines[] = {QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_4),QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_4),QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_4),QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_4),QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_4),QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_4),QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_MAG_4)};
+ magazines[] = {};
};
};
htMin = 1;
@@ -261,6 +261,82 @@ class CfgVehicles {
displayName = CSTRING(close_breech);
statement = QUOTE([ARR_1(_target)] call FUNC(closeBreech));
};
+
+ class TBD_Load {
+ isplayName = CSTRING(load);
+ distance = 1.5;
+ showDisabled=0;
+ exceptions[]={};
+ priority=5;
+ selection = "casing_spawn";
+ icon = "x\tbd_mortars\addons\main\data\load.paa";
+
+ class TBD_LoadHECh1 {
+ displayName = "$STR_TBD_MORTARS_105mm_HE_CHARGE_1";
+ condition = QUOTE([ARR_2(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_1)))] call FUNC(canLoad));
+ statement = QUOTE([ARR_3(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_1)),0)] call FUNC(load));
+ showDisabled = 0;
+ exceptions[] = {};
+ };
+
+ class TBD_LoadHECh2 {
+ displayName = "$STR_TBD_MORTARS_105mm_HE_CHARGE_2";
+ condition = QUOTE([ARR_2(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_2)))] call FUNC(canLoad));
+ statement = QUOTE([ARR_3(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_2)),0)] call FUNC(load));
+ showDisabled = 0;
+ exceptions[] = {};
+ };
+
+ class TBD_LoadHECh3 {
+ displayName = "$STR_TBD_MORTARS_105mm_HE_CHARGE_3";
+ condition = QUOTE([ARR_2(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_3)))] call FUNC(canLoad));
+ statement = QUOTE([ARR_3(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_3)),0)] call FUNC(load));
+ showDisabled = 0;
+ exceptions[] = {};
+ };
+
+ class TBD_LoadHECh4 {
+ displayName = "$STR_TBD_MORTARS_105mm_HE_CHARGE_4";
+ condition = QUOTE([ARR_2(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_4)))] call FUNC(canLoad));
+ statement = QUOTE([ARR_3(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_4)),0)] call FUNC(load));
+ showDisabled = 0;
+ exceptions[] = {};
+ };
+
+ class TBD_LoadHECh5 {
+ displayName = "$STR_TBD_MORTARS_105mm_HE_CHARGE_5";
+ condition = QUOTE([ARR_2(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_5)))] call FUNC(canLoad));
+ statement = QUOTE([ARR_3(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_5)),0)] call FUNC(load));
+ showDisabled = 0;
+ exceptions[] = {};
+ };
+
+ class TBD_LoadHECh6 {
+ displayName = "$STR_TBD_MORTARS_105mm_HE_CHARGE_6";
+ condition = QUOTE([ARR_2(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_6)))] call FUNC(canLoad));
+ statement = QUOTE([ARR_3(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_6)),0)] call FUNC(load));
+ showDisabled = 0;
+ exceptions[] = {};
+ };
+
+ class TBD_LoadHECh7 {
+ displayName = "$STR_TBD_MORTARS_105mm_HE_CHARGE_7";
+ condition = QUOTE([ARR_2(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_7)))] call FUNC(canLoad));
+ statement = QUOTE([ARR_3(_target,QUOTE(QUOTE(TBD_MORTARS_105mm_ROUND_HE_CHARGE_7)),0)] call FUNC(load));
+ showDisabled = 0;
+ exceptions[] = {};
+ };
+ };
+
+ class TBD_Unload {
+ selection = "casing_spawn";
+ distance = 1.5;
+ showDisabled = 0;
+ displayName = CSTRING(unload);
+ condition = QUOTE([ARR_1(_target)] call FUNC(canUnload));
+ statement = QUOTE([ARR_2(_target,0)] call FUNC(unload));
+ icon = "x\tbd_mortars\addons\main\data\unload.paa";
+ };
};
};
};
diff --git a/addons/m119/tbd_m119/sounds/casing_drop.ogg b/addons/m119/tbd_m119/sounds/casing_drop.ogg
new file mode 100644
index 0000000..c4032ae
Binary files /dev/null and b/addons/m119/tbd_m119/sounds/casing_drop.ogg differ