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