diff --git a/.hemtt/project.toml b/.hemtt/project.toml index e24fd201fa..a8e50e494d 100644 --- a/.hemtt/project.toml +++ b/.hemtt/project.toml @@ -36,3 +36,11 @@ preset = "Hemtt" workshop = [ "450814997", # CBA_A3's Workshop ID ] + +[hemtt.launch.vn] +workshop = [ + "450814997", # CBA_A3's Workshop ID +] +dlc = [ + "S.O.G. Prairie Fire", +] diff --git a/AUTHORS.txt b/AUTHORS.txt index c26391b869..4561a063b7 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -10,7 +10,7 @@ Brett Mayson bux578 commy2 Dahlgren -Dani (TCVM) +tcvm esteldunedain Felix Wiegand Garth "L-H" de Wet @@ -21,11 +21,11 @@ Janus jokoho482 Jonpas Kieran +kymckay mharis001 NouberNou PabstMirror Ruthberg -SilentSpike tpM veteran29 ViperMaul @@ -44,6 +44,7 @@ aeroson Aggr094 alef Aleksey EpMAK Yermakov +AleM Alganthe Andrea "AtixNeon" Verano Anthariel @@ -113,6 +114,7 @@ Hawkins Head Hybrid V JasperRab +JDT john681611 JoramD Karneck @@ -131,6 +133,7 @@ MarcBook meat Michail Nikolaev MikeMatrix +MikeMF mjc4wilton Mysteryjuju nic547 @@ -174,7 +177,6 @@ Toaster Tonic Tourorist Tuupertunut -TyroneMF Valentin Torikian voiper VyMajoris(W-Cephei) diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index 6abf520b64..56dcb71372 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -2,22 +2,22 @@ if (!hasInterface) exitWith {}; -[missionNamespace, "ACE_setCustomAimCoef", QUOTE(ADDON), { - private _unit = ACE_player; - private _fatigue = _unit getVariable [QGVAR(aimFatigue), 0]; - - switch (stance _unit) do { +["baseline", { + private _fatigue = ACE_player getVariable [QGVAR(aimFatigue), 0]; + switch (stance ACE_player) do { case ("CROUCH"): { - (1.0 + _fatigue ^ 2 * 0.1) * GVAR(swayFactor) + (1.0 + _fatigue ^ 2 * 0.1) }; case ("PRONE"): { - (1.0 + _fatigue ^ 2 * 2.0) * GVAR(swayFactor) + (1.0 + _fatigue ^ 2 * 2.0) }; default { - (1.5 + _fatigue ^ 2 * 3.0) * GVAR(swayFactor) + (1.5 + _fatigue ^ 2 * 3.0) }; }; -}] call EFUNC(common,arithmeticSetSource); +}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor); + +["multiplier", {GVAR(swayFactor)}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor); // recheck weapon inertia after weapon swap, change of attachments or switching unit ["weapon", {[ACE_player] call FUNC(getWeaponInertia)}, true] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf index e9452c8c2c..4c453784b4 100644 --- a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf @@ -94,6 +94,3 @@ if (_overexhausted) then { }; _unit setVariable [QGVAR(aimFatigue), _fatigue]; - -private _aimCoef = [missionNamespace, "ACE_setCustomAimCoef", "max"] call EFUNC(common,arithmeticGetResult); -_unit setCustomAimCoef _aimCoef; diff --git a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf index ef47d939d0..f831bb67f3 100644 --- a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf +++ b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf @@ -38,7 +38,7 @@ if ((vehicle ACE_player == ACE_player) && {_currentSpeed > 0.1} && {isTouchingGr // Calculate muscle damage increase // Note: Muscle damage recovery is ignored as it takes multiple days -GVAR(muscleDamage) = GVAR(muscleDamage) + (_currentWork / GVAR(peakPower)) ^ 3.2 * 0.00004; +GVAR(muscleDamage) = (GVAR(muscleDamage) + (_currentWork / GVAR(peakPower)) ^ 3.2 * 0.00004) min 1; private _muscleIntegritySqrt = sqrt (1 - GVAR(muscleDamage)); // Calculate available power diff --git a/addons/advanced_throwing/functions/fnc_drawThrowable.sqf b/addons/advanced_throwing/functions/fnc_drawThrowable.sqf index 9d3879e59b..2421294d50 100644 --- a/addons/advanced_throwing/functions/fnc_drawThrowable.sqf +++ b/addons/advanced_throwing/functions/fnc_drawThrowable.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dslyecxi, Jonpas, SilentSpike + * Author: Dslyecxi, Jonpas, kymckay * Handles drawing the currently selected or cooked throwable. * * Arguments: diff --git a/addons/ai/XEH_PREP.hpp b/addons/ai/XEH_PREP.hpp index 97f2b64e9d..80c1e45239 100644 --- a/addons/ai/XEH_PREP.hpp +++ b/addons/ai/XEH_PREP.hpp @@ -1,3 +1,5 @@ +PREP(assignNVG); +PREP(assignNVGpfh); PREP(drawCuratorGarrisonPathing); PREP(garrison); PREP(garrisonMove); diff --git a/addons/ai/XEH_postInit.sqf b/addons/ai/XEH_postInit.sqf index 44f3c57472..fce5152e3d 100644 --- a/addons/ai/XEH_postInit.sqf +++ b/addons/ai/XEH_postInit.sqf @@ -68,3 +68,11 @@ params ["_unit", "_mode"]; _unit enableGunLights _mode; }] call CBA_fnc_addEventHandler; + + +if (isServer) then { + ["CAManBase", "init", { + // wait for HMD to be assigned so `hmd _unit` works + [FUNC(assignNVG), _this, 1] call CBA_fnc_waitAndExecute; + }] call CBA_fnc_addClassEventHandler; +}; diff --git a/addons/ai/XEH_preInit.sqf b/addons/ai/XEH_preInit.sqf index b47cf6628d..5ec0849ff9 100644 --- a/addons/ai/XEH_preInit.sqf +++ b/addons/ai/XEH_preInit.sqf @@ -6,4 +6,11 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +if (isServer) then { + GVAR(assignNVGthread) = false; + GVAR(assignNVGstate) = false; +}; + +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/ai/functions/fnc_assignNVG.sqf b/addons/ai/functions/fnc_assignNVG.sqf new file mode 100644 index 0000000000..b513a6edba --- /dev/null +++ b/addons/ai/functions/fnc_assignNVG.sqf @@ -0,0 +1,39 @@ +#include "script_component.hpp" +/* + * Author: Jonpas + * Assigns AI first found NVG in their inventory during night time and unassigns it during day time. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [cursorObject] call ace_ai_fnc_assignNVG + * + * Public: No + */ + +if (!GVAR(assignNVG)) exitWith {}; + +params ["_unit"]; + +if (alive _unit && {!isPlayer _unit}) then { + private _nvg = hmd _unit; + + if (GVAR(assignNVGstate)) then { + if (_nvg == "") then { + private _items = [_unit, false, true, true, true, false, false] call CBA_fnc_uniqueUnitItems; // backpack, vest, uniform + { + if (getText (configFile >> "CfgWeapons" >> _x >> "simulation") == "NVGoggles") exitWith { + _unit assignItem _x; + }; + } forEach _items; + }; + } else { + if (_nvg != "" && {currentVisionMode _unit == 0} && {_unit canAdd _nvg}) then { + _unit unassignItem _nvg; + }; + }; +}; diff --git a/addons/ai/functions/fnc_assignNVGpfh.sqf b/addons/ai/functions/fnc_assignNVGpfh.sqf new file mode 100644 index 0000000000..ad6ad62ea6 --- /dev/null +++ b/addons/ai/functions/fnc_assignNVGpfh.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: Jonpas + * waitAndExecute Handler for periodic NVG assignment. + * + * Arguments: + * None + + * Return Value: + * None + * + * Example: + * [] call ace_ai_fnc_assignNVGpfh + * + * Public: No + */ +TRACE_1("assignNVGpfh",count allUnits); + +if (!GVAR(assignNVG)) exitWith { TRACE_1("shutdown loop",_this); GVAR(assignNVGthread) = false; }; + +GVAR(assignNVGstate) = sunOrMoon < 1 || {moonIntensity > 0.8}; + +{ + _x call FUNC(assignNVG); +} forEach allUnits; + +[FUNC(assignNVGpfh), [], 300] call CBA_fnc_waitAndExecute; diff --git a/addons/ai/initSettings.sqf b/addons/ai/initSettings.sqf new file mode 100644 index 0000000000..0b2642c7ae --- /dev/null +++ b/addons/ai/initSettings.sqf @@ -0,0 +1,19 @@ +private _category = format ["ACE %1", LLSTRING(DisplayName)]; + +[ + QGVAR(assignNVG), "CHECKBOX", + [LSTRING(AssignNVG_DisplayName), LSTRING(AssignNVG_Description)], + _category, + false, + 1, + { + if (isServer) then { + params ["_enabled"]; + if (_enabled && {!GVAR(assignNVGthread)}) then { + TRACE_1("start loop",_this); + GVAR(assignNVGthread) = true; + [FUNC(assignNVGpfh), [], 1] call CBA_fnc_waitAndExecute; + }; + }; + } +] call CBA_fnc_addSetting; diff --git a/addons/ai/stringtable.xml b/addons/ai/stringtable.xml index b8c7887ace..82276304a9 100644 --- a/addons/ai/stringtable.xml +++ b/addons/ai/stringtable.xml @@ -1,6 +1,22 @@ + + AI + AI + IA + IA + AI + SI + ИИ + KI + UI + IA + AI + AI + AI + AI + Invalid position provided. Ungültige Position @@ -65,5 +81,11 @@ Nenalezena žádná budova. Bir yapı bulunamadı + + Auto-Equip NVGs + + + Equips NVG in inventory during night time and unequips it during day time.\nDoes not add NVGs to inventory! + diff --git a/addons/aircraft/CfgEventHandlers.hpp b/addons/aircraft/CfgEventHandlers.hpp index 66a525846a..f6503c2479 100644 --- a/addons/aircraft/CfgEventHandlers.hpp +++ b/addons/aircraft/CfgEventHandlers.hpp @@ -12,6 +12,6 @@ class Extended_PreInit_EventHandlers { class Extended_PostInit_EventHandlers { class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_postInit)); + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); }; }; diff --git a/addons/arsenal/ACE_Arsenal_Actions.hpp b/addons/arsenal/ACE_Arsenal_Actions.hpp new file mode 100644 index 0000000000..a5b95241e2 --- /dev/null +++ b/addons/arsenal/ACE_Arsenal_Actions.hpp @@ -0,0 +1 @@ +class GVAR(actions) {}; diff --git a/addons/arsenal/ACE_Arsenal_Stats.hpp b/addons/arsenal/ACE_Arsenal_Stats.hpp index 5fdd9cfa0d..f7493b4840 100644 --- a/addons/arsenal/ACE_Arsenal_Stats.hpp +++ b/addons/arsenal/ACE_Arsenal_Stats.hpp @@ -75,6 +75,14 @@ class GVAR(stats) { textStatement = QUOTE(call FUNC(statTextStatement_scopeMag)); tabs[] = {{}, {0}}; }; + class ACE_binoMagnification: statBase { + scope = 2; + priority = 2; + displayName = CSTRING(statMagnification); + showText = 1; + textStatement = QUOTE(call FUNC(statTextStatement_binoMag)); + tabs[] = {{9}, {}}; + }; class ACE_scopeVisionMode: statBase { scope = 2; priority = 1.6; @@ -83,6 +91,14 @@ class GVAR(stats) { textStatement = QUOTE(call FUNC(statTextStatement_scopeVisionMode)); tabs[] = {{}, {0}}; }; + class ACE_binoVisionMode: statBase { + scope = 2; + priority = 1.6; + displayName = CSTRING(statVisionModeGeneric); + showText = 1; + textStatement = QUOTE(call FUNC(statTextStatement_binoVisionMode)); + tabs[] = {{8,9}, {}}; + }; class ACE_ballisticProtection: statBase { scope = 2; priority = 5; @@ -128,4 +144,12 @@ class GVAR(stats) { textStatement = QUOTE(call FUNC(statTextStatement_explosionTime)); tabs[] = {{}, {5}}; }; + class ACE_magCount: statBase { + scope = 2; + priority = 1; + displayName = CSTRING(statMagCount); + showText = 1; + textStatement = QUOTE(call FUNC(statTextStatement_magCount)); + tabs[] = {{}, {4}}; + }; }; diff --git a/addons/arsenal/XEH_PREP.hpp b/addons/arsenal/XEH_PREP.hpp index d695861f40..3b063d8ebe 100644 --- a/addons/arsenal/XEH_PREP.hpp +++ b/addons/arsenal/XEH_PREP.hpp @@ -1,7 +1,8 @@ +PREP(addAction); PREP(addDefaultLoadout); PREP(addListBoxItem); -PREP(addSort); PREP(addRightPanelButton); +PREP(addSort); PREP(addStat); PREP(addVirtualItems); PREP(attributeAddCompatible); @@ -16,9 +17,11 @@ PREP(attributeLoad); PREP(attributeMode); PREP(attributeSelect); PREP(baseWeapon); +PREP(buttonActionsPage); PREP(buttonCargo); PREP(buttonClearAll); PREP(buttonExport); +PREP(buttonFavorites); PREP(buttonHide); PREP(buttonImport); PREP(buttonLoadoutsDelete); @@ -26,15 +29,17 @@ PREP(buttonLoadoutsLoad); PREP(buttonLoadoutsRename); PREP(buttonLoadoutsSave); PREP(buttonLoadoutsShare); -PREP(buttonStats); PREP(buttonStatsPage); +PREP(canEditDefaultLoadout); PREP(clearSearchbar); +PREP(compileActions); PREP(compileSorts); PREP(compileStats); PREP(fillLeftPanel); PREP(fillLoadoutsList); PREP(fillRightPanel); PREP(fillSort); +PREP(handleActions); PREP(handleLoadoutsSearchbar); PREP(handleMouse); PREP(handleScrollWheel); @@ -51,6 +56,7 @@ PREP(onLoadoutsClose); PREP(onLoadoutsOpen); PREP(onMouseButtonDown); PREP(onMouseButtonUp); +PREP(onPanelDblClick); PREP(onSelChangedLeft); PREP(onSelChangedLoadouts); PREP(onSelChangedRight); @@ -58,15 +64,21 @@ PREP(onSelChangedRightListnBox); PREP(open3DEN); PREP(openBox); PREP(portVALoadouts); +PREP(refresh); +PREP(removeAction); PREP(removeBox); +PREP(removeDefaultLoadout); PREP(removeSort); PREP(removeStat); PREP(removeVirtualItems); +PREP(renameDefaultLoadout); PREP(replaceUniqueItemsLoadout); PREP(scanConfig); PREP(showItem); PREP(sortPanel); PREP(sortStatement_accuracy); +PREP(statTextStatement_binoMag); +PREP(statTextStatement_binoVisionMode); PREP(sortStatement_amount); PREP(sortStatement_magCount); PREP(sortStatement_mass); @@ -80,6 +92,7 @@ PREP(statBarStatement_impact); PREP(statBarStatement_rateOfFIre); PREP(statTextStatement_accuracy); PREP(statTextStatement_explosionTime); +PREP(statTextStatement_magCount); PREP(statTextStatement_mass); PREP(statTextStatement_rateOfFire); PREP(statTextStatement_scopeMag); diff --git a/addons/arsenal/XEH_postInit.sqf b/addons/arsenal/XEH_postInit.sqf index c047f4800b..1aaa0203b1 100644 --- a/addons/arsenal/XEH_postInit.sqf +++ b/addons/arsenal/XEH_postInit.sqf @@ -14,6 +14,9 @@ GVAR(lastSortDirectionRight) = DESCENDING; [QGVAR(initBox), LINKFUNC(initBox)] call CBA_fnc_addEventHandler; [QGVAR(removeBox), LINKFUNC(removeBox)] call CBA_fnc_addEventHandler; +[QGVAR(addDefaultLoadout), LINKFUNC(addDefaultLoadout)] call CBA_fnc_addEventHandler; +[QGVAR(removeDefaultLoadout), LINKFUNC(removeDefaultLoadout)] call CBA_fnc_addEventHandler; +[QGVAR(renameDefaultLoadout), LINKFUNC(renameDefaultLoadout)] call CBA_fnc_addEventHandler; [QGVAR(broadcastFace), { params ["_unit", "_face"]; diff --git a/addons/arsenal/XEH_preInit.sqf b/addons/arsenal/XEH_preInit.sqf index 711da4a037..34299c1871 100644 --- a/addons/arsenal/XEH_preInit.sqf +++ b/addons/arsenal/XEH_preInit.sqf @@ -20,24 +20,14 @@ PREP_RECOMPILE_END; private _statsNextPageCtrl = _display displayCtrl IDC_statsNextPage; private _statsCurrentPageCtrl = _display displayCtrl IDC_statsCurrentPage; - private _statsButtonCtrl = _display displayCtrl IDC_statsButton; - private _statsButtonCloseCtrl = _display displayCtrl IDC_statsButtonClose; - { _x ctrlShow (GVAR(showStats) && {_showStats}); } forEach [ _statsCtrlGroupCtrl, _statsPreviousPageCtrl, _statsNextPageCtrl, - _statsCurrentPageCtrl, - _statsButtonCloseCtrl + _statsCurrentPageCtrl ]; - - _statsButtonCtrl ctrlShow (!GVAR(showStats) && {_showStats}) -}] call CBA_fnc_addEventHandler; - -[QGVAR(statsButton), { - _this call FUNC(buttonStats); }] call CBA_fnc_addEventHandler; [QGVAR(statsChangePage), { @@ -48,9 +38,35 @@ PREP_RECOMPILE_END; _this call FUNC(handleStats); }] call CBA_fnc_addEventHandler; -// Compile sorts and stats -call FUNC(compileStats); +[QGVAR(actionsChangePage), { + _this call FUNC(buttonActionsPage); +}] call CBA_fnc_addEventHandler; + +[QGVAR(displayActions), { + _this call FUNC(handleActions); +}] call CBA_fnc_addEventHandler; + +[QGVAR(actionsToggle), { + params ["_display", "_showActions"]; + + private _actionsCtrlGroupCtrl = _display displayCtrl IDC_actionsBox; + private _actionsPreviousPageCtrl = _display displayCtrl IDC_actionsPreviousPage; + private _actionsNextPageCtrl = _display displayCtrl IDC_actionsNextPage; + private _actionsCurrentPageCtrl = _display displayCtrl IDC_actionsCurrentPage; + + { + _x ctrlShow (GVAR(showActions) && {_showActions}); + } forEach [ + _actionsCtrlGroupCtrl, + _actionsPreviousPageCtrl, + _actionsNextPageCtrl, + _actionsCurrentPageCtrl + ]; +}] call CBA_fnc_addEventHandler; + +call FUNC(compileActions); call FUNC(compileSorts); +call FUNC(compileStats); [QUOTE(ADDON), {!isNil QGVAR(camera)}] call CBA_fnc_registerFeatureCamera; diff --git a/addons/arsenal/defines.hpp b/addons/arsenal/defines.hpp index 220a3d82c5..cfc12df3d3 100644 --- a/addons/arsenal/defines.hpp +++ b/addons/arsenal/defines.hpp @@ -5,7 +5,7 @@ #define WIDTH_TOTAL (safezoneW - 2 * (93 * GRID_W)) #define WIDTH_GAP (WIDTH_TOTAL / 100) -#define WIDTH_SINGLE ((WIDTH_TOTAL - 6 * WIDTH_GAP) / 5) +#define WIDTH_SINGLE ((WIDTH_TOTAL - 7 * WIDTH_GAP) / 6) // IDDs #define IDD_MISSION 46 @@ -19,6 +19,9 @@ #define ASCENDING 0 #define DESCENDING 1 +// Favorites +#define FAVORITES_COLOR (GVAR(favoritesColor) + [1]) + // IDCs #define IDD_ace_arsenal 1127001 #define IDC_mouseArea 0 @@ -39,6 +42,7 @@ #define IDC_buttonLoadouts 1003 #define IDC_buttonExport 1004 #define IDC_buttonImport 1005 +#define IDC_buttonFavorites 1006 #define IDC_infoBox 11 #define IDC_infoBackground 1101 #define IDC_infoName 1102 @@ -142,8 +146,20 @@ #define IDC_statsPreviousPage 52 #define IDC_statsNextPage 53 #define IDC_statsCurrentPage 54 -#define IDC_statsButton 55 -#define IDC_statsButtonClose 56 +#define IDC_actionsBox 90 +#define IDC_actionsText1 9001 +#define IDC_actionsButton1 9002 +#define IDC_actionsText2 9003 +#define IDC_actionsButton2 9004 +#define IDC_actionsText3 9005 +#define IDC_actionsButton3 9006 +#define IDC_actionsText4 9007 +#define IDC_actionsButton4 9008 +#define IDC_actionsText5 9009 +#define IDC_actionsButton5 9010 +#define IDC_actionsPreviousPage 91 +#define IDC_actionsNextPage 92 +#define IDC_actionsCurrentPage 93 #define IDD_loadouts_display 1127002 #define IDC_centerBox 3 diff --git a/addons/arsenal/functions/fnc_addAction.sqf b/addons/arsenal/functions/fnc_addAction.sqf new file mode 100644 index 0000000000..c867b9aea4 --- /dev/null +++ b/addons/arsenal/functions/fnc_addAction.sqf @@ -0,0 +1,122 @@ +#include "script_component.hpp" +/* + * Author: johnb43 + * Adds custom action buttons. + * + * Arguments: + * 0: Tabs to add action to + * 1: Action class (unique string for each action) + * 2: Title + * 3: Actions + * 4: Condition (default: {true}) + * 5: Scope editor (default: 2) + * + * Return Value: + * 0: Array of IDs + * + * Example: + * [[0, 5], "TAG_myActions", "My Actions", [ + * ["text", "Text", {true}, "Text"], + * ["statement", "Statement", {true}, "", {[_this select 0] call tag_fnc_myTextStatement}], + * ["button", "Button", {true}, "", {}, {_this call tag_fnc_myAction}] + * ]] call ace_arsenal_fnc_addAction + * + * Public: Yes + */ + +params [ + ["_tabs", [], [[]]], + ["_rootClass", "", [""]], + ["_title", "", [""]], + ["_actions", [], [[]]], + ["_rootCondition", {true}, [{}]], + ["_scopeEditor", 2, [0]] +]; + +// Compile actions from config (in case this is called before preInit) +call FUNC(compileActions); + +// Skip if not allowed in editor and in editor +if (is3DEN && {_scopeEditor != 2}) exitWith { + TRACE_1("Skipping action because in editor", _rootClass); + [] +}; + +// Class can't contain ~, because it's used for formatting result +if ("~" in _rootClass) exitWith { + TRACE_1("Classname can't contain '~'", _rootClass); + [] +}; + +private _return = []; + +private _fnc_addToGroup = { + params ["_group", "_tab"]; + + private _type = -1; + + { + _x params [["_class", "", [""]], ["_label", "", [""]], ["_condition", {true}, [{}]], ["_text", "", [""]], ["_textStatement", {}, [{}]], ["_statement", {}, [{}]]]; + + // Class can't contain ~, because it's used for formatting result + if (_class == "" || {"~" in _class}) then { + continue; + }; + + // Don't allow two of the same class + if (_group findIf {(_x select 0) == _class} != -1) then { + TRACE_1("An action with this ID already exists", _class); + continue; + }; + + _type = switch (false) do { + case (_text == ""): { + _statement = format ["{""%1""}", _text]; + ACTION_TYPE_TEXT + }; + case (_textStatement isEqualTo {}): { + _statement = _textStatement; + ACTION_TYPE_TEXT + }; + case (_statement isEqualTo {}): { + _statement = _statement; + ACTION_TYPE_BUTTON + }; + default { + -1 + }; + }; + + if (_type == -1) then { + continue; + }; + + _statement = compile format [QUOTE([GVAR(center)] call %1), _statement]; + + _group pushBack [_class, _type, _label, _statement, _condition]; + _return pushBack ([_rootClass, _class, _tab] joinString "~"); + } forEach _actions; +}; + +private _tab = []; +private _index = -1; +private _group = []; + +{ + _tab = GVAR(actionList) select _x; + _index = _tab findIf {(_x select 0) == _rootClass}; + + // Add to existing group + if (_index != -1) then { + [_tab select _index select 3, _x] call _fnc_addToGroup; + } else { + // Add to new group + _group = []; + + [_group, _x] call _fnc_addToGroup; + + _tab pushBack [_rootClass, _title, _rootCondition, _group]; + }; +} forEach _tabs; + +_return diff --git a/addons/arsenal/functions/fnc_addDefaultLoadout.sqf b/addons/arsenal/functions/fnc_addDefaultLoadout.sqf index b5a8f82d1c..f1593d82f9 100644 --- a/addons/arsenal/functions/fnc_addDefaultLoadout.sqf +++ b/addons/arsenal/functions/fnc_addDefaultLoadout.sqf @@ -7,6 +7,7 @@ * Arguments: * 0: Name of loadout * 1: CBA extended loadout or getUnitLoadout array + * 2: Add globally (default: false) * * Return Value: * None @@ -17,7 +18,11 @@ * Public: Yes */ -params [["_name", "", [""]], ["_loadout", [], [[]]]]; +params [["_name", "", [""]], ["_loadout", [], [[]]], ["_global", false, [false]]]; + +if (_global) then { + [QGVAR(addDefaultLoadout), [_name, _loadout]] call CBA_fnc_remoteEvent; +}; private _extendedInfo = createHashMap; @@ -45,3 +50,7 @@ if (_index != -1) then { // Otherwise just add GVAR(defaultLoadoutsList) pushBack [_name, [_loadout, _extendedInfo]]; }; + +if (is3DEN) then { + set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; +}; diff --git a/addons/arsenal/functions/fnc_addListBoxItem.sqf b/addons/arsenal/functions/fnc_addListBoxItem.sqf index 80e7de0dfc..fb5d3f18d0 100644 --- a/addons/arsenal/functions/fnc_addListBoxItem.sqf +++ b/addons/arsenal/functions/fnc_addListBoxItem.sqf @@ -1,4 +1,5 @@ #include "script_component.hpp" +#include "..\defines.hpp" /* * Author: Dedmen, johnb43 * Add a listbox row. @@ -20,6 +21,26 @@ params ["_configCategory", "_className", "_ctrlPanel", ["_pictureEntryName", "picture", [""]]]; +private _skip = GVAR(favoritesOnly) && {!(_className in GVAR(currentItems))} && {!((toLower _className) in GVAR(favorites))}; +if (_skip) then { + switch (GVAR(currentLeftPanel)) do { + case IDC_buttonPrimaryWeapon: { + _skip = !(_className in (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS)); + }; + case IDC_buttonHandgun: { + _skip = !(_className in (GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS)); + }; + case IDC_buttonSecondaryWeapon: { + _skip = !(_className in (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS)); + }; + case IDC_buttonBinoculars: { + _skip = !(_className in (GVAR(currentItems) select IDX_CURR_BINO_ITEMS)); + }; + }; +}; + +if (_skip) exitWith {}; + // Sanitise key, as it's public; If not in cache, find info and cache it for later use ((uiNamespace getVariable QGVAR(addListBoxItemCache)) getOrDefaultCall [_configCategory + _className, { // Get classname (config case), display name, picture and DLC @@ -35,3 +56,8 @@ _ctrlPanel lbSetData [_lbAdd, _className]; _ctrlPanel lbSetPicture [_lbAdd, _itemPicture]; _ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)]; _ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _className]]; + +if ((toLower _className) in GVAR(favorites)) then { + _ctrlPanel lbSetColor [_lbAdd, FAVORITES_COLOR]; + _ctrlPanel lbSetSelectColor [_lbAdd, FAVORITES_COLOR]; +}; diff --git a/addons/arsenal/functions/fnc_addSort.sqf b/addons/arsenal/functions/fnc_addSort.sqf index 7dac85af36..41ad0c5847 100644 --- a/addons/arsenal/functions/fnc_addSort.sqf +++ b/addons/arsenal/functions/fnc_addSort.sqf @@ -5,12 +5,12 @@ * * Arguments: * 0: Tabs to add sort to - * 0.0: Left Tab Indexes - * 0.1: Right Tab Indexes - * 1: Sort Class (a unique string for each algorithm) + * - 0: Left Tab Indexes + * - 1: Right Tab Indexes + * 1: Sort class (a unique string for each algorithm) * 2: Title * 3: Algorithm - * 4: Condition (default: true) + * 4: Condition (default: {true}) * * Return Value: * 0: Array of IDs @@ -27,7 +27,7 @@ * * _fireRate sort true; * _fireRate param [0, 0] - * }] call ace_arsenal_fnc_addSort; + * }] call ace_arsenal_fnc_addSort * * Public: Yes */ @@ -37,8 +37,7 @@ params [ ["_class", "", [""]], ["_title", "", [""]], ["_statement", {}, [{}]], - ["_condition", {true}, [{}]], - ["_overwrite", false, [false]] + ["_condition", {true}, [{}]] ]; _tabs params [ diff --git a/addons/arsenal/functions/fnc_addStat.sqf b/addons/arsenal/functions/fnc_addStat.sqf index d813974f40..3e62e2a438 100644 --- a/addons/arsenal/functions/fnc_addStat.sqf +++ b/addons/arsenal/functions/fnc_addStat.sqf @@ -1,22 +1,22 @@ #include "script_component.hpp" /* - * Author: Alganthe, johnb43 + * Author: Alganthe, johnb43, LinkIsGrim * Adds a stat to ACE Arsenal. * * Arguments: * 0: Tabs to add the stat to - * 0.0: Left tab indexes - * 0.1: Right tab indexes + * - 0: Left tab indexes + * - 1: Right tab indexes * 1: Stat class (unique string for each stat) * 2: Config entries to pass * 3: Title * 4: Show bar / show text bools - * 4.0: Show bar (default: false) - * 4.1: Show text (default: false) + * - 0: Show bar (default: false) + * - 1: Show text (default: false) * 5: Array of statements - * 5.0: Bar code (default: {}) - * 5.1: Text code (default: {}) - * 5.2: Condition code (default: {true}) + * - 0: Bar code (default: {}) + * - 1: Text code (default: {}) + * - 2: Condition code (default: {true}) * 6: Priority (default: 0) * * Return Value: @@ -76,20 +76,13 @@ private _fnc_addToTabs = { _currentTab = _tabsList select _x; // Find if there is an entry with same ID - if (_currentTab findIf {_x findIf {_x select 0 == _statName} != -1} != -1) then { + if (_currentTab findIf {_x select 5 == _statName} != -1) then { TRACE_1("A stat with this ID already exists", _statName); } else { _stat = +_finalArray; - _stat set [0, _statName]; + _stat set [5, _statName]; - _index = _currentTab findIf {count _x < 5}; - - // Add to existing page if there's enough space, otherwise create a new page - if (_index != -1) then { - (_currentTab select _index) pushBack _stat; - } else { - _currentTab pushBack [_stat]; - }; + _currentTab pushBack _stat; _return pushBack _statName; @@ -99,7 +92,7 @@ private _fnc_addToTabs = { } forEach _tabsToAddTo; }; -private _finalArray = ["", _stats, _title, [_showBar, _showText], [_barStatement, _textStatement, _condition], _priority]; +private _finalArray = [_priority, _stats, _title, [_showBar, _showText], [_barStatement, _textStatement, _condition], ""]; if (_leftTabs isNotEqualTo []) then { [GVAR(statsListLeftPanel), _leftTabs, "L"] call _fnc_addToTabs; @@ -109,7 +102,6 @@ if (_rightTabs isNotEqualTo []) then { [GVAR(statsListRightPanel), _rightTabs, "R"] call _fnc_addToTabs; }; -private _statsFlat = []; private _stats = []; private _tabToChange = []; @@ -123,34 +115,10 @@ private _tabToChange = []; GVAR(statsListLeftPanel) }; - _statsFlat = []; + _stats = _tabToChange select _tab; - // Get all stats of a tab into a single array - { - _statsFlat append _x; - } forEach (_tabToChange select _tab); - - // Put priority up front - { - reverse _x; - } forEach _statsFlat; - - // Sort numerically - _statsFlat sort false; - - // Put it back at the rear - { - reverse _x; - } forEach _statsFlat; - - _stats = []; - - // Group stats into groups of 5 - for "_index" from 0 to count _statsFlat - 1 step 5 do { - _stats pushBack (_statsFlat select [_index, _index + 5]); - }; - - _tabToChange set [_tab, _stats]; + // Sort by priority + _stats sort false; } forEach _changes; _return diff --git a/addons/arsenal/functions/fnc_attributeAddItems.sqf b/addons/arsenal/functions/fnc_attributeAddItems.sqf index 1d163afbcf..24372bfdeb 100644 --- a/addons/arsenal/functions/fnc_attributeAddItems.sqf +++ b/addons/arsenal/functions/fnc_attributeAddItems.sqf @@ -19,13 +19,20 @@ params ["_controlsGroup"]; private _category = lbCurSel (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_CATEGORY); -private _filter = toLower ctrlText (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_SEARCHBAR); +private _filter = ctrlText (_controlsGroup controlsGroupCtrl IDC_ATTRIBUTE_SEARCHBAR); private _configItems = uiNamespace getVariable QGVAR(configItems); private _magazineMiscItems = uiNamespace getVariable QGVAR(magazineMiscItems); private _attributeValue = uiNamespace getVariable [QGVAR(attributeValue), [[], 0]]; _attributeValue params ["_attributeItems", "_attributeMode"]; TRACE_3("Populating list",_category,_filter,_attributeValue); +if (_filter != "") then { + _filter = _filter call EFUNC(common,escapeRegex); + _filter = ".*?" + (_filter splitString " " joinString ".*?" + ".*?/io"); +} else { + _filter = ".*?/io"; +}; + private _modeSymbol = [SYMBOL_ITEM_VIRTUAL, SYMBOL_ITEM_REMOVE] select _attributeMode; @@ -59,7 +66,7 @@ if (_category == IDX_CAT_ALL) exitWith { _displayName = getText (_config >> "displayName"); // Add item if not filtered - if (_filter in (toLower _displayName) || {_filter in (toLower _x)}) then { + if (_displayName regexMatch _filter || {_x regexMatch _filter}) then { _index = _listbox lnbAddRow ["", _displayName, _modeSymbol]; _listbox lnbSetData [[_index, 1], _x]; _listbox lnbSetPicture [[_index, 0], getText (_config >> "picture")]; @@ -111,7 +118,7 @@ private _config = _cfgClass; _displayName = getText (_config >> _x >> "displayName"); // Add item if not filtered - if (_filter in (toLower _displayName) || {_filter in (toLower _x)}) then { + if (_displayName regexMatch _filter || {_x regexMatch _filter}) then { // Change symbol and alpha if item already selected if (_x in _attributeItems) then { _symbol = _modeSymbol; diff --git a/addons/arsenal/functions/fnc_buttonActionsPage.sqf b/addons/arsenal/functions/fnc_buttonActionsPage.sqf new file mode 100644 index 0000000000..7b30f42e4d --- /dev/null +++ b/addons/arsenal/functions/fnc_buttonActionsPage.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +#include "..\defines.hpp" +/* + * Author: Brett Mayson + * Handles the previous / next page buttons for actions + * + * Arguments: + * 0: Arsenal display + * 1: Actions control + * 2: Previous or next (false = previous, true = next) + * + * Return Value: + * None + * + * Public: No +*/ + +params ["_display", "_control", "_nextPage"]; + +TRACE_1("control enabled", ctrlEnabled _control); +if !(ctrlEnabled _control) exitWith {}; + +GVAR(currentActionPage) = GVAR(currentActionPage) + ([-1, 1] select _nextPage); + +GVAR(actionsInfo) params ["_panelControl", "_curSel", "_itemCfg"]; +[QGVAR(displayActions), [_display, _panelControl, _curSel, _itemCfg]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_buttonFavorites.sqf b/addons/arsenal/functions/fnc_buttonFavorites.sqf new file mode 100644 index 0000000000..b748ccc7ae --- /dev/null +++ b/addons/arsenal/functions/fnc_buttonFavorites.sqf @@ -0,0 +1,32 @@ +#include "script_component.hpp" +#include "..\defines.hpp" +/* + * Author: LinkIsGrim + * Switches the arsenal between displaying all items and favorites + * + * Arguments: + * 0: Arsenal display + * 1: Button control + * + * Return Value: + * None + * + * Public: No +*/ + +params ["_display", "_control"]; + +private _firstRun = false; + +if (isNil QGVAR(favoritesOnly)) then { + GVAR(favoritesOnly) = GVAR(defaultToFavorites); + _firstRun = true; +} else { + GVAR(favoritesOnly) = !GVAR(favoritesOnly); +}; + +_control ctrlSetText format ["%1: %2", localize "STR_GEAR_ITEMS", localize (["str_word_all", "STR_3DEN_Favorite_textPlural"] select GVAR(favoritesOnly))]; + +if (_firstRun) exitWith {}; + +[false] call FUNC(refresh); diff --git a/addons/arsenal/functions/fnc_buttonHide.sqf b/addons/arsenal/functions/fnc_buttonHide.sqf index 8432982f7b..6685150955 100644 --- a/addons/arsenal/functions/fnc_buttonHide.sqf +++ b/addons/arsenal/functions/fnc_buttonHide.sqf @@ -52,11 +52,10 @@ private _ctrl = controlNull; IDC_buttonCurrentMag2, IDC_iconBackgroundCurrentMag, IDC_iconBackgroundCurrentMag2, - IDC_statsButton, IDC_statsPreviousPage, IDC_statsNextPage, - IDC_statsCurrentPage, - IDC_statsButtonClose + IDC_statsCurrentPage ]; [QGVAR(statsToggle), [_display, _showToggle]] call CBA_fnc_localEvent; +[QGVAR(actionsToggle), [_display, _showToggle]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_buttonImport.sqf b/addons/arsenal/functions/fnc_buttonImport.sqf index eea1370f9b..8c5510c6ba 100644 --- a/addons/arsenal/functions/fnc_buttonImport.sqf +++ b/addons/arsenal/functions/fnc_buttonImport.sqf @@ -50,11 +50,8 @@ if (GVAR(shiftState) && {is3DEN}) then { if ((count _extendedLoadout) == 2) then { [GVAR(center), _extendedLoadout] call CBA_fnc_setLoadout; - // Update current item list - call FUNC(updateCurrentItemsList); - - // This takes care of items that aren't available in the arsenal (either wrong tab or arsenal doesn't have it whitelisted) - call FUNC(updateUniqueItemsList); + // Update current item list and unique items + [true] call FUNC(refresh); _extendedLoadout params ["_loadout", "_extendedInfo"]; diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsDelete.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsDelete.sqf index 511b8216be..79c2fd2884 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsDelete.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsDelete.sqf @@ -25,10 +25,8 @@ private _loadoutName = _contentPanelCtrl lnbText [_contentPanelCursSel, 1]; // If loadout is local or default if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then { // Find loadout and delete from list - if (is3DEN && {GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts}) then { - GVAR(defaultLoadoutsList) deleteAt (GVAR(defaultLoadoutsList) findIf {(_x select 0) == _loadoutName}); - - set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; + if (GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts) then { + [_loadoutName, !is3DEN] call FUNC(removeDefaultLoadout); } else { private _data = profileNamespace getVariable [QGVAR(saved_loadouts), []]; diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf index 9b09c0d66c..c02fcc4b7d 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsLoad.sqf @@ -37,11 +37,8 @@ private _extendedLoadout = switch (GVAR(currentLoadoutsTab)) do { // Apply loadout to unit [GVAR(center), _extendedLoadout, true] call CBA_fnc_setLoadout; -// Update current item list -call FUNC(updateCurrentItemsList); - -// This takes care of items that aren't available in the arsenal (either wrong tab or arsenal doesn't have it whitelisted) -call FUNC(updateUniqueItemsList); +// Update current item list and unique items +[true] call FUNC(refresh); _extendedLoadout params ["_loadout", "_extendedInfo"]; diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf index 9e7dc96c0e..e1c52f52b7 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsRename.sqf @@ -29,7 +29,7 @@ private _editBoxContent = ctrlText (_display displayCtrl IDC_textEditBox); // If it's the exact same name, don't do anything if (_editBoxContent isEqualTo _loadoutName) exitWith {}; -private _data = [profileNamespace getVariable [QGVAR(saved_loadouts), []], GVAR(defaultLoadoutsList)] select (is3DEN && {GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts}); +private _data = [profileNamespace getVariable [QGVAR(saved_loadouts), []], GVAR(defaultLoadoutsList)] select (call FUNC(canEditDefaultLoadout) && {GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts}); // If there is a loadout with a similar name and it's not chosen to be renamed, don't rename and exit if (_editBoxContent != _loadoutName && {_data findIf {(_x select 0) == _editBoxContent} != -1}) exitWith { @@ -42,8 +42,12 @@ private _loadoutIndex = _data findIf {(_x select 0) == _loadoutName}; // Set new name (_data select _loadoutIndex) set [0, _editBoxContent]; -if (is3DEN && {GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts}) then { - set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; +if (GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts) then { + if (is3DEN) then { + set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; + } else { + [QGVAR(renameDefaultLoadout), [_loadoutName, _editBoxContent]] call CBA_fnc_remoteEvent; + }; }; private _currentLoadoutsTab = str GVAR(currentLoadoutsTab); diff --git a/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf b/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf index 554065c425..785e7486e9 100644 --- a/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf +++ b/addons/arsenal/functions/fnc_buttonLoadoutsSave.sqf @@ -49,7 +49,7 @@ private _curSelLoadout = (_contentPanelCtrl getVariable (_loadoutName + str GVAR private _extendedLoadout = GVAR(center) call CBA_fnc_getLoadout; _extendedLoadout params ["_loadout"]; -private _loadouts = [profileNamespace getVariable [QGVAR(saved_loadouts), []], GVAR(defaultLoadoutsList)] select (is3DEN && {GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts}); +private _loadouts = [profileNamespace getVariable [QGVAR(saved_loadouts), []], GVAR(defaultLoadoutsList)] select ((call FUNC(canEditDefaultLoadout)) && {GVAR(currentLoadoutsTab) == IDC_buttonDefaultLoadouts}); private _loadoutIndex = _loadouts findIf {(_x select 0) == _editBoxContent}; // Return what loadout was saved @@ -57,16 +57,14 @@ private _savedLoadout = switch (GVAR(currentLoadoutsTab)) do { // Local loadouts tab case IDC_buttonMyLoadouts: { // If saved to default loadout - if (GVAR(shiftState) && {is3DEN} && {_loadoutName != ""} && {_curSelRow != -1} && {_loadoutIndex != -1}) then { + if (GVAR(shiftState) && FUNC(canEditDefaultLoadout) && {_loadoutName != ""} && {_curSelRow != -1} && {_loadoutIndex != -1}) then { private _defaultLoadoutsSearch = GVAR(defaultLoadoutsList) findIf {(_x select 0) == _loadoutName}; - if (_defaultLoadoutsSearch == -1) then { - _loadoutIndex = GVAR(defaultLoadoutsList) pushBack [_loadoutName, _curSelLoadout]; - } else { - GVAR(defaultLoadoutsList) set [_defaultLoadoutsSearch, [_loadoutName, _curSelLoadout]]; - }; + [_loadoutName, _curSelLoadout, !is3DEN] call FUNC(addDefaultLoadout); - set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; + if (_defaultLoadoutsSearch == -1) then { + _loadoutIndex = (count GVAR(defaultLoadoutsList)) - 1; + }; _curSelLoadout } else { @@ -111,19 +109,15 @@ private _savedLoadout = switch (GVAR(currentLoadoutsTab)) do { }; // Default loadouts tab case IDC_buttonDefaultLoadouts: { - if (is3DEN) then { - // Replace unique items with their bases and replace weapons with their base weapons - _loadout = [_loadout] call FUNC(replaceUniqueItemsLoadout); + if (call FUNC(canEditDefaultLoadout)) then { - // Add or overwrite loadout in loadout storage + [_editBoxContent, _extendedLoadout, !is3DEN] call FUNC(addDefaultLoadout); + + // Get loadout index if (_loadoutIndex == -1) then { - _loadoutIndex = GVAR(defaultLoadoutsList) pushBack [_editBoxContent, _extendedLoadout]; - } else { - GVAR(defaultLoadoutsList) set [_loadoutIndex, [_editBoxContent, _extendedLoadout]]; + _loadoutIndex = (count GVAR(defaultLoadoutsList)) - 1; }; - set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; - // Refresh loadout list; Delete previous loadout row for "_lbIndex" from 0 to (lnbSize _contentPanelCtrl select 0) - 1 do { if ((_contentPanelCtrl lnbText [_lbIndex, 1]) == _editBoxContent) exitWith { diff --git a/addons/arsenal/functions/fnc_buttonStats.sqf b/addons/arsenal/functions/fnc_buttonStats.sqf deleted file mode 100644 index 34dbfc608e..0000000000 --- a/addons/arsenal/functions/fnc_buttonStats.sqf +++ /dev/null @@ -1,30 +0,0 @@ -#include "script_component.hpp" -#include "..\defines.hpp" -/* - * Author: Alganthe - * Toggle the stats control group. - * - * Arguments: - * 0: Arsenal display - * - * Return Value: - * None - * - * Public: No -*/ - -params ["_display"]; - -(_display displayCtrl IDC_statsButton) ctrlShow GVAR(showStats); - -GVAR(showStats) = !GVAR(showStats); - -{ - (_display displayCtrl _x) ctrlShow GVAR(showStats); -} forEach [ - IDC_statsBox, - IDC_statsPreviousPage, - IDC_statsNextPage, - IDC_statsCurrentPage, - IDC_statsButtonClose -]; diff --git a/addons/arsenal/functions/fnc_buttonStatsPage.sqf b/addons/arsenal/functions/fnc_buttonStatsPage.sqf index a3ab2607bf..f3a98c802c 100644 --- a/addons/arsenal/functions/fnc_buttonStatsPage.sqf +++ b/addons/arsenal/functions/fnc_buttonStatsPage.sqf @@ -20,11 +20,8 @@ params ["_display", "_control", "_nextPage"]; TRACE_1("control enabled", ctrlEnabled _control); if !(ctrlEnabled _control) exitWith {}; -GVAR(statsInfo) params ["_isLeftPanel", "_statsIndex", "_panelControl", "_curSel", "_itemCfg"]; +GVAR(currentStatPage) = [GVAR(currentStatPage) - 1, GVAR(currentStatPage) + 1] select _nextPage; -private _pageList = [GVAR(statsPagesRight), GVAR(statsPagesLeft)] select _isLeftPanel; -private _newPageNumber = [(_pageList select _statsIndex) - 1, (_pageList select _statsIndex) + 1] select _nextPage; - -_pageList set [_statsIndex, _newPageNumber]; +GVAR(statsInfo) params ["_isLeftPanel", "_panelControl", "_curSel", "_itemCfg"]; [QGVAR(displayStats), [_display, _panelControl, _curSel, _itemCfg]] call CBA_fnc_localEvent; diff --git a/addons/arsenal/functions/fnc_canEditDefaultLoadout.sqf b/addons/arsenal/functions/fnc_canEditDefaultLoadout.sqf new file mode 100644 index 0000000000..6f9dc8738c --- /dev/null +++ b/addons/arsenal/functions/fnc_canEditDefaultLoadout.sqf @@ -0,0 +1,16 @@ +#include "script_component.hpp" +#include "..\defines.hpp" +/* + * Author: LinkIsGrim + * Whether the player can save a default loadout in the current mission state + * + * Arguments: + * None + * + * Return Value: + * Can Save + * + * Public: No +*/ + +is3DEN || EFUNC(common,hasZeusAccess) diff --git a/addons/arsenal/functions/fnc_compileActions.sqf b/addons/arsenal/functions/fnc_compileActions.sqf new file mode 100644 index 0000000000..1fec6005d1 --- /dev/null +++ b/addons/arsenal/functions/fnc_compileActions.sqf @@ -0,0 +1,107 @@ +#include "script_component.hpp" +/* + * Author: Brett Mayson + * Create the internal actions arrays when needed for the first time. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Public: No +*/ + +if (!isNil QGVAR(actionList)) exitWith {}; + +private _actionList = [ + [], // Primary 0 + [], // Handgun 1 + [], // Launcher 2 + [], // Uniform 3 + [], // Vests 4 + [], // Backpacks 5 + [], // Headgear 6 + [], // Goggles 7 + [], // NVGs 8 + [], // Binoculars 9 + [], // Map 10 + [], // GPS 11 + [], // Radio 12 + [], // Compass 13 + [], // Watch 14 + [], // Face 15 + [], // Voice 16 + [] // Insignia 17 +]; + +private _configGroupEntries = "true" configClasses (configFile >> QGVAR(actions)); + +{ + private _scopeEditor = getNumber (_x >> "scopeEditor"); + + if (is3DEN && {_scopeEditor != 2}) then {continue}; + + private _configActions = "true" configClasses _x; + + private _rootClass = configName _x; + private _rootDisplayName = getText (_x >> "displayName"); + private _rootCondition = getText (_x >> "condition"); + private _rootTabs = getArray (_x >> "tabs"); + + if (_rootCondition != "") then { + _rootCondition = compile _rootCondition; + } else { + _rootCondition = {true}; + }; + + private _group = []; + + { + private _class = configName _x; + private _label = getText (_x >> "label"); + private _condition = getText (_x >> "condition"); + private _statement = getText (_x >> "statement"); + private _text = getText (_x >> "text"); + private _textStatement = getText (_x >> "textStatement"); + + private _type = switch (false) do { + case (_text == ""): { + _statement = format ["""%1""", _text]; + ACTION_TYPE_TEXT + }; + case (_textStatement == ""): { + _statement = _textStatement; + ACTION_TYPE_TEXT + }; + case (_statement == ""): { + _statement = _statement; + ACTION_TYPE_BUTTON + }; + default { + -1 + }; + }; + + if (_type == -1) then { + continue; + }; + + _statement = compile format [QUOTE([GVAR(center)] call {%1}), _statement]; + + if (_condition != "") then { + _condition = compile _condition; + } else { + _condition = {true}; + }; + + // No duplicates are possible here + _group pushBack [_class, _type, _label, _statement, _condition]; + } forEach _configActions; + + { + (_actionList select _x) pushBack [_rootClass, _rootDisplayName, _rootCondition, _group]; + } forEach _rootTabs; +} forEach _configGroupEntries; + +GVAR(actionList) = _actionList; diff --git a/addons/arsenal/functions/fnc_compileSorts.sqf b/addons/arsenal/functions/fnc_compileSorts.sqf index d38cbe6b2e..de2fff4e4f 100644 --- a/addons/arsenal/functions/fnc_compileSorts.sqf +++ b/addons/arsenal/functions/fnc_compileSorts.sqf @@ -63,7 +63,6 @@ private _sortListRightPanel = [ [] // Misc 7 ]; -//------------------------- Config handling private _class = ""; private _displayName = ""; private _statement = ""; diff --git a/addons/arsenal/functions/fnc_compileStats.sqf b/addons/arsenal/functions/fnc_compileStats.sqf index 0d17942756..7b9eeac366 100644 --- a/addons/arsenal/functions/fnc_compileStats.sqf +++ b/addons/arsenal/functions/fnc_compileStats.sqf @@ -23,7 +23,7 @@ private _fnc_addToTabs = { { // Make stat name _stat = +_finalArray; - _stat set [0, [_class, _tabSide, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""]; + _stat set [5, [_class, _tabSide, [str _x, format ["0%1", _x]] select (_x < 10)] joinString ""]; (_tabsList select _x) pushBack _stat; } forEach _tabsToAddTo; @@ -31,39 +31,12 @@ private _fnc_addToTabs = { // Sort by priority private _fnc_sortLists = { - params ["_tabsList"]; + params ["_tabs"]; { - // Put priority up front - { - reverse _x; - } forEach _x; - // Sort numerically _x sort false; - - // Put it back at the rear - { - reverse _x; - } forEach _x; - } forEach _tabsList; -}; - -// Group stats into groups of 5 -private _fnc_toStatsArray = { - params ["_tabsList", "_tabsListAll"]; - - private _stats = []; - - { - _stats = []; - - for "_index" from 0 to count _x - 1 step 5 do { - _stats pushBack (_x select [_index, _index + 5]); - }; - - _tabsList set [_forEachIndex, _stats]; - } forEach _tabsList; + } forEach _tabs; }; private _statsListLeftPanel = [ @@ -95,7 +68,6 @@ private _statsListRightPanel = [ [] // Misc 7 ]; -//------------------------- Config handling private _finalArray = []; private _class = ""; private _stats = []; @@ -119,7 +91,7 @@ private _priority = 0; _condition = compile _condition; }; - _finalArray = ["", _stats, _displayName, [_showBar, _showText], [{}, {}, _condition], _priority]; + _finalArray = [_priority, _stats, _displayName, [_showBar, _showText], [{}, {}, _condition], ""]; if (_showBar) then { (_finalArray select 4) set [0, compile (getText (_x >> "barStatement"))]; @@ -144,10 +116,5 @@ private _priority = 0; [_statsListLeftPanel] call _fnc_sortLists; [_statsListRightPanel] call _fnc_sortLists; -// Group into 5 stats -[_statsListLeftPanel] call _fnc_toStatsArray; -[_statsListRightPanel] call _fnc_toStatsArray; - -//------------------------- Config Handling GVAR(statsListLeftPanel) = _statsListLeftPanel; GVAR(statsListRightPanel) = _statsListRightPanel; diff --git a/addons/arsenal/functions/fnc_fillRightPanel.sqf b/addons/arsenal/functions/fnc_fillRightPanel.sqf index 12c7d9d32b..3be98c737e 100644 --- a/addons/arsenal/functions/fnc_fillRightPanel.sqf +++ b/addons/arsenal/functions/fnc_fillRightPanel.sqf @@ -43,9 +43,13 @@ private _cfgMagazines = configFile >> "CfgMagazines"; private _cfgWeapons = configFile >> "CfgWeapons"; private _rightPanelCache = uiNamespace getVariable QGVAR(rightPanelCache); +private _currentCargo = itemsWithMagazines GVAR(center); + private _fnc_fillRightContainer = { params ["_configCategory", "_className", "_hasItemInfo", ["_isUnique", false, [false]], ["_unknownOrigin", false, [false]]]; + if (GVAR(favoritesOnly) && {!(_className in _currentCargo)} && {!((toLower _className) in GVAR(favorites))}) exitWith {}; + // If item is not in the arsenal, it must be unique if (!_isUnique && {!(_className in GVAR(virtualItemsFlat))}) then { _isUnique = true; @@ -94,11 +98,16 @@ private _fnc_fillRightContainer = { }, true]) params ["_displayName", "_picture", "_mass"]; private _lbAdd = _ctrlPanel lnbAddRow ["", _displayName, "0"]; + _ctrlPanel lnbSetText [[_lbAdd, 1], _displayName]; _ctrlPanel lnbSetData [[_lbAdd, 0], _className]; _ctrlPanel lnbSetPicture [[_lbAdd, 0], _picture]; _ctrlPanel lnbSetValue [[_lbAdd, 0], _mass]; _ctrlPanel lnbSetValue [[_lbAdd, 2], [0, 1] select _isUnique]; _ctrlPanel lnbSetTooltip [[_lbAdd, 0], format ["%1\n%2", _displayName, _className]]; + if ((toLower _className) in GVAR(favorites)) then { + _ctrlPanel lnbSetColor [[_lbAdd, 1], FAVORITES_COLOR]; + _ctrlPanel lnbSetColorRight [[_lbAdd, 1], FAVORITES_COLOR]; + }; }; private _ctrlPanel = _display displayCtrl IDC_rightTabContent; diff --git a/addons/arsenal/functions/fnc_handleActions.sqf b/addons/arsenal/functions/fnc_handleActions.sqf new file mode 100644 index 0000000000..c3c8e09c7e --- /dev/null +++ b/addons/arsenal/functions/fnc_handleActions.sqf @@ -0,0 +1,148 @@ +#include "script_component.hpp" +#include "..\defines.hpp" +/* + * Author: Brett Mayson + * Handles the actions control group + * + * Arguments: + * 0: Arsenal display + * 1: Current panel control + * 2: Current panel selection + * 3: Item config entry + * + * Return Value: + * None + * + * Public: No +*/ + +params ["_display", "_control", "_curSel", "_itemCfg"]; + +GVAR(actionsInfo) = [_control, _curSel, _itemCfg]; + +private _panel = [ + IDC_buttonPrimaryWeapon, + IDC_buttonHandgun, + IDC_buttonSecondaryWeapon, + IDC_buttonUniform, + IDC_buttonVest, + IDC_buttonBackpack, + IDC_buttonHeadgear, + IDC_buttonGoggles, + IDC_buttonNVG, + IDC_buttonBinoculars, + IDC_buttonMap, + IDC_buttonGPS, + IDC_buttonRadio, + IDC_buttonCompass, + IDC_buttonWatch, + IDC_buttonFace, + IDC_buttonVoice, + IDC_buttonInsignia +] find GVAR(currentLeftPanel); + +private _groups = (GVAR(actionList) select _panel) select { + [GVAR(center)] call (_x select 2) +}; + +private _show = _groups isNotEqualTo []; +private _ctrl = _display displayCtrl IDC_actionsBox; +_ctrl ctrlShow _show; +_ctrl ctrlCommit 0.15; + +if (!_show) exitWith {}; + +private _actionsBoxCtrl = _display displayCtrl IDC_actionsBox; +private _actionsCurrentPageCtrl = _display displayCtrl IDC_actionsCurrentPage; + +private _currentPage = GVAR(currentActionPage); +private _pages = count _groups; + +if (_currentPage < 0) then { + _currentPage = _pages - 1; +}; + +if (_currentPage >= _pages) then { + _currentPage = 0; + GVAR(currentActionPage) = _currentPage; +}; + +{ + private _ctrl = _display displayCtrl _x; + _ctrl ctrlShow (_pages > 1); + _ctrl ctrlCommit 0; +} forEach [IDC_actionsPreviousPage, IDC_actionsNextPage]; + +private _group = _groups select _currentPage; +private _items = _group select 3 select { + [GVAR(center)] call (_x select 4) +}; + +_actionsCurrentPageCtrl ctrlSetText (_group select 1); +_actionsCurrentPageCtrl ctrlSetFade 0; +_actionsCurrentPageCtrl ctrlShow true; +_actionsCurrentPageCtrl ctrlCommit 0; + +{ + _x params ["", "_type", "_label", "_statement"]; + + private _idc = 9001 + _forEachIndex * 2; + private _actionTextCtrl = _display displayCtrl _idc; + private _actionButtonCtrl = _display displayCtrl (_idc + 1); + + switch (_type) do { + case ACTION_TYPE_BUTTON: { + _actionButtonCtrl ctrlRemoveAllEventHandlers "ButtonClick"; + _actionButtonCtrl ctrlAddEventHandler ["ButtonClick", { + if (is3DEN) exitWith {[true] call FUNC(refresh)}; + [{ + [true] call FUNC(refresh); + }] call CBA_fnc_execNextFrame; + }]; + _actionButtonCtrl ctrlAddEventHandler ["ButtonClick", _statement]; + _actionButtonCtrl ctrlSetText _label; + _actionButtonCtrl ctrlSetFade 0; + _actionButtonCtrl ctrlEnable true; + _actionButtonCtrl ctrlCommit 0; + _actionTextCtrl ctrlSetFade 1; + _actionTextCtrl ctrlCommit 0; + }; + case ACTION_TYPE_TEXT: { + private _text = call _statement; + + if (isNil "_text") then { + _text = ""; + }; + + _actionTextCtrl ctrlSetText _text; + _actionTextCtrl ctrlSetFade 0; + _actionTextCtrl ctrlCommit 0; + _actionButtonCtrl ctrlSetFade 1; + _actionButtonCtrl ctrlCommit 0; + }; + default { + _actionTextCtrl ctrlSetFade 1; + _actionTextCtrl ctrlCommit 0; + _actionButtonCtrl ctrlSetFade 1; + _actionButtonCtrl ctrlCommit 0; + }; + }; +} forEach _items; + +private _actionCount = count _items; + +{ + private _idc = 9001 + _x * 2; + private _actionTextCtrl = _display displayCtrl _idc; + private _actionButtonCtrl = _display displayCtrl (_idc + 1); + + _actionTextCtrl ctrlSetFade 1; + _actionTextCtrl ctrlCommit 0; + _actionButtonCtrl ctrlSetFade 1; + _actionButtonCtrl ctrlCommit 0; +} forEach ([0, 1, 2, 3, 4] select [_actionCount, 5]); + +private _pos = ctrlPosition _actionsBoxCtrl; +_pos set [3, ([11, (5 * _actionCount) + 6] select (_actionCount > 0)) * GRID_H]; +_actionsBoxCtrl ctrlSetPosition _pos; +_actionsBoxCtrl ctrlCommit 0; diff --git a/addons/arsenal/functions/fnc_handleMouse.sqf b/addons/arsenal/functions/fnc_handleMouse.sqf index 4f434855e7..75dfc576f9 100644 --- a/addons/arsenal/functions/fnc_handleMouse.sqf +++ b/addons/arsenal/functions/fnc_handleMouse.sqf @@ -8,9 +8,9 @@ * Arguments: * 0: Not used * 1: Arguments - * 1.0: Mouse area control - * 1.1: Mouse X position - * 1.2: Mouse Y position + * - 0: Mouse area control + * - 1: Mouse X position + * - 2: Mouse Y position * * Return Value: * None diff --git a/addons/arsenal/functions/fnc_handleScrollWheel.sqf b/addons/arsenal/functions/fnc_handleScrollWheel.sqf index ddfb903f38..f412c8153c 100644 --- a/addons/arsenal/functions/fnc_handleScrollWheel.sqf +++ b/addons/arsenal/functions/fnc_handleScrollWheel.sqf @@ -6,8 +6,8 @@ * Arguments: * 0: Not used * 1: onMouseZChanged EH return - * 1.0: Not used - * 1.1: Mousewheel Z position + * - 0: Not used + * - 1: Mousewheel Z position * * Return Value: * None diff --git a/addons/arsenal/functions/fnc_handleSearchbar.sqf b/addons/arsenal/functions/fnc_handleSearchbar.sqf index 006e77541d..e83ec70c4d 100644 --- a/addons/arsenal/functions/fnc_handleSearchbar.sqf +++ b/addons/arsenal/functions/fnc_handleSearchbar.sqf @@ -17,11 +17,15 @@ params ["_display", "_control"]; private _searchString = ctrlText _control; +if (_searchString != "") then { + _searchString = _searchString call EFUNC(common,escapeRegex); + _searchString = ".*?" + (_searchString splitString " " joinString ".*?") + ".*?/io"; +}; // Right panel search bar if ((ctrlIDC _control) == IDC_rightSearchbar) then { // Don't refill if there is no need - if (GVAR(lastSearchTextRight) != "" && {(_searchString find GVAR(lastSearchTextRight)) != 0}) then { + if (GVAR(lastSearchTextRight) != "" && {GVAR(lastSearchTextRight) isNotEqualTo _searchString}) then { [_display, _display displayCtrl GVAR(currentRightPanel)] call FUNC(fillRightPanel); }; @@ -33,8 +37,6 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then { private _rightPanelState = GVAR(currentLeftPanel) in [IDC_buttonPrimaryWeapon, IDC_buttonHandgun, IDC_buttonSecondaryWeapon, IDC_buttonBinoculars]; private _rightPanelCtrl = [_display displayCtrl IDC_rightTabContentListnBox, _display displayCtrl IDC_rightTabContent] select _rightPanelState; - _searchString = toLower _searchString; - // If right panel selection is weapons or binoculars if (_rightPanelState) then { // Get the currently selected item in panel @@ -51,11 +53,11 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then { // Go through all items in panel and see if they need to be deleted or not for "_lbIndex" from (lbSize _rightPanelCtrl) - 1 to 0 step -1 do { - _currentDisplayName = toLower (_rightPanelCtrl lbText _lbIndex); - _currentClassname = toLower (_rightPanelCtrl lbData _lbIndex); + _currentDisplayName = _rightPanelCtrl lbText _lbIndex; + _currentClassname = _rightPanelCtrl lbData _lbIndex; // Remove item in panel if it doesn't match search, skip otherwise - if ((_currentDisplayName == "") || {!(_searchString in _currentDisplayName) && {!(_searchString in _currentClassname)}}) then { + if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchString) && {!(_currentClassname regexMatch _searchString)}}) then { _rightPanelCtrl lbDelete _lbIndex; }; }; @@ -91,11 +93,11 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then { // Go through all items in panel and see if they need to be deleted or not for "_lbIndex" from (lnbSize _rightPanelCtrl select 0) - 1 to 0 step -1 do { - _currentDisplayName = toLower (_rightPanelCtrl lnbText [_lbIndex, 1]); - _currentClassname = toLower (_rightPanelCtrl lnbData [_lbIndex, 0]); + _currentDisplayName = _rightPanelCtrl lnbText [_lbIndex, 1]; + _currentClassname = _rightPanelCtrl lnbData [_lbIndex, 0]; // Remove item in panel if it doesn't match search, skip otherwise - if ((_currentDisplayName == "") || {!(_searchString in _currentDisplayName) && {!(_searchString in _currentClassname)}}) then { + if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchString) && {!(_currentClassname regexMatch _searchString)}}) then { _rightPanelCtrl lnbDeleteRow _lbIndex; }; }; @@ -122,7 +124,7 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then { } else { // Left panel search bar // Don't refill if there is no need - if (GVAR(lastSearchTextLeft) != "" && {(_searchString find GVAR(lastSearchTextLeft)) != 0}) then { + if (GVAR(lastSearchTextLeft) != "" && {GVAR(lastSearchTextLeft) isNotEqualTo _searchString}) then { [_display, _display displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel); }; @@ -133,8 +135,6 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then { private _leftPanelCtrl = _display displayCtrl IDC_leftTabContent; - _searchString = toLower _searchString; - // Get the currently selected item in panel private _selectedItemIndex = lbCurSel _leftPanelCtrl; private _selectedItem = ""; @@ -149,11 +149,11 @@ if ((ctrlIDC _control) == IDC_rightSearchbar) then { // Go through all items in panel and see if they need to be deleted or not for "_lbIndex" from (lbSize _leftPanelCtrl) - 1 to 0 step -1 do { - _currentDisplayName = toLower (_leftPanelCtrl lbText _lbIndex); - _currentClassname = toLower (_leftPanelCtrl lbData _lbIndex); + _currentDisplayName = _leftPanelCtrl lbText _lbIndex; + _currentClassname = _leftPanelCtrl lbData _lbIndex; // Remove item in panel if it doesn't match search, skip otherwise - if ((_currentDisplayName == "") || {!(_searchString in _currentDisplayName) && {!(_searchString in _currentClassname)}}) then { + if ((_currentDisplayName == "") || {!(_currentDisplayName regexMatch _searchString) && {!(_currentClassname regexMatch _searchString)}}) then { _leftPanelCtrl lbDelete _lbIndex; }; }; diff --git a/addons/arsenal/functions/fnc_handleStats.sqf b/addons/arsenal/functions/fnc_handleStats.sqf index 95c078552d..a31a30bea4 100644 --- a/addons/arsenal/functions/fnc_handleStats.sqf +++ b/addons/arsenal/functions/fnc_handleStats.sqf @@ -16,20 +16,21 @@ * Public: No */ -params ["_display", "_control", "_curSel", "_itemCfg"]; +params ["_display", "_control", "_curSel", ["_itemCfg", configNull]]; private _statsBoxCtrl = _display displayCtrl IDC_statsBox; private _statsPreviousPageCtrl = _display displayCtrl IDC_statsPreviousPage; private _statsNextPageCtrl = _display displayCtrl IDC_statsNextPage; private _statsCurrentPageCtrl = _display displayCtrl IDC_statsCurrentPage; -private _hideUnusedFnc = { - params ["_numbers"]; +private _fnc_hideUnused = { + params ["_count"]; - { - private _statsTitleCtrl = _display displayCtrl (IDC_statsTitle1 + ((_x - 1) * 4)); - private _statsTitleIDC = ctrlIDC _statsTitleCtrl; + if (_count <= 0) exitWith {}; + for "_i" from 0 to (_count - 1) do { + private _statsTitleIDC = IDC_statsTitle5 - (_i * 4); + private _statsTitleCtrl = _display displayCtrl _statsTitleIDC; private _statsBackgroundCtrl = _display displayCtrl (_statsTitleIDC + 1); private _statsBarCtrl = _display displayCtrl (_statsTitleIDC + 2); private _statsTextCtrl = _display displayCtrl (_statsTitleIDC + 3); @@ -43,204 +44,28 @@ private _hideUnusedFnc = { _statsBarCtrl, _statsTextCtrl ]; - } forEach _numbers; + }; }; -if (!isNil "_itemCfg") then { - private _handleStatsFnc = { - params ["_statsIndex", "_leftPanel"]; +private _fnc_hideEverything = { + 5 call _fnc_hideUnused; - // Get the proper list and page - if (_leftPanel) then { - [(GVAR(statsListLeftPanel)) select _statsIndex, GVAR(statsPagesLeft) select _statsIndex] - } else { - [(GVAR(statsListRightPanel)) select _statsIndex, GVAR(statsPagesRight) select _statsIndex] - } params ["_statsArray", "_currentPage"]; - - private _statsList = _statsArray select _currentPage; - private _statsCount = 0; - - // Handle titles, bars and text - _statsList = _statsList select [0, 5]; - - if (_statsList isNotEqualTo []) then { - private _statsTitleCtrl = controlNull; - private _statsTitleIDC = -1; - private _statsBackgroundCtrl = controlNull; - private _statsBarCtrl = controlNull; - private _statsTextCtrl = controlNull; - private _textStatementResult = ""; - - { - _x params ["_ID", "_configEntry", "_title", "_bools", "_statements"]; - _bools params ["_showBar", "_showText"]; - _statements params [["_barStatement", {}, [{}]], ["_textStatement", {}, [{}]], ["_condition", {true}, [{}]]]; - - _statsTitleCtrl = _display displayCtrl (IDC_statsTitle1 + _forEachIndex * 4); - _statsTitleIDC = ctrlIDC _statsTitleCtrl; - _statsBackgroundCtrl = _display displayCtrl (_statsTitleIDC + 1); - _statsBarCtrl = _display displayCtrl (_statsTitleIDC + 2); - _statsTextCtrl = _display displayCtrl (_statsTitleIDC + 3); - - _statsCount = _statsCount + 1; - _statsTitleCtrl ctrlSetText _title; - _statsTitleCtrl ctrlSetFade 0; - - // Handle bars - if (_showBar) then { - _statsBarCtrl progressSetPosition ([_configEntry, _itemCfg] call _barStatement); - _statsBackgroundCtrl ctrlSetFade 0; - _statsBarCtrl ctrlSetFade 0; - } else { - _statsBackgroundCtrl ctrlSetFade 1; - _statsBarCtrl ctrlSetFade 1; - }; - - // Handle text entries - if (_showText) then { - _textStatementResult = [_configEntry, _itemCfg] call _textStatement; - - if !(_textStatementResult isEqualtype "") then { - _textStatementResult = str _textStatementResult; - }; - - _statsTextCtrl ctrlSetText _textStatementResult; - _statsTextCtrl ctrlSetTextColor ([[1, 1, 1, 1], [0, 0, 0, 1]] select (_showBar)); - _statsTextCtrl ctrlSetFade 0; - } else { - _statsTextCtrl ctrlSetFade 1; - }; - - { - _x ctrlCommit 0; - } forEach [ - _statsTitleCtrl, - _statsBackgroundCtrl, - _statsBarCtrl, - _statsTextCtrl - ]; - } forEach (_statsList select { - _x params ["", "_configEntry", "", "", "_statements"]; - _statements params ["", "", ["_condition", {true}, [{}]]]; - - ([_configEntry, _itemCfg] call _condition) - }); - }; - - // Resize the window - [[1, 2, 3, 4, 5] select [_statsCount, 5]] call _hideUnusedFnc; - _statsBoxCtrl ctrlSetPosition [ - (0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP, - safezoneY + 1.8 * GRID_H, - 47 * GRID_W, - ([11, (10 * _statsCount) + 5] select (_statsCount > 0)) * GRID_H - ]; - _statsBoxCtrl ctrlCommit 0; - - GVAR(statsInfo) = [_leftPanel, _statsIndex, _control, _curSel, _itemCfg]; - - // Toggle page buttons - _statsPreviousPageCtrl ctrlEnable (_currentPage > 0); - _statsNextPageCtrl ctrlEnable (_currentPage + 1 < count _statsArray); - _statsCurrentPageCtrl ctrlSetText ([LLSTRING(page), str (_currentPage + 1)] joinString " "); - - { - _x ctrlSetFade 0; - _x ctrlCommit 0; - } forEach [ - _statsPreviousPageCtrl, - _statsNextPageCtrl, - _statsCurrentPageCtrl - ]; - }; - - // Check if in left or right panel - if (ctrlIDC _control == IDC_leftTabContent) then { - // Faces, voices and insigna do not have stats - if ([IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsignia] find GVAR(currentLeftPanel) > -1) then { - [[1, 2, 3, 4, 5]] call _hideUnusedFnc; - _statsBoxCtrl ctrlSetPosition [ - (0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP, - safezoneY + 1.8 * GRID_H, - 47 * GRID_W, - 11 * GRID_H - ]; - _statsBoxCtrl ctrlCommit 0; - - { - _x ctrlSetFade 1; - _x ctrlCommit 0; - } forEach [ - _statsPreviousPageCtrl, - _statsNextPageCtrl, - _statsCurrentPageCtrl - ]; - } else { - [[ - IDC_buttonPrimaryWeapon, - IDC_buttonHandgun, - IDC_buttonSecondaryWeapon, - IDC_buttonUniform, - IDC_buttonVest, - IDC_buttonBackpack, - IDC_buttonHeadgear, - IDC_buttonGoggles, - IDC_buttonNVG, - IDC_buttonBinoculars, - IDC_buttonMap, - IDC_buttonGPS, - IDC_buttonRadio, - IDC_buttonCompass, - IDC_buttonWatch - ] find GVAR(currentLeftPanel), true] call _handleStatsFnc; - }; - } else { - switch (GVAR(currentRightPanel)) do { - case IDC_buttonOptic: { - [0, false] call _handleStatsFnc; - }; - case IDC_buttonItemAcc: { - [1, false] call _handleStatsFnc; - }; - case IDC_buttonMuzzle: { - [2, false] call _handleStatsFnc; - }; - case IDC_buttonBipod: { - [3, false] call _handleStatsFnc; - }; - case IDC_buttonCurrentMag; - case IDC_buttonCurrentMag2; - case IDC_buttonMag; - case IDC_buttonMagALL: { - [4, false] call _handleStatsFnc; - }; - case IDC_buttonThrow: { - [5, false] call _handleStatsFnc; - }; - case IDC_buttonPut: { - [6, false] call _handleStatsFnc; - }; - case IDC_buttonMisc: { - [7, false] call _handleStatsFnc; - }; - default { - if (GVAR(currentRightPanel) in [RIGHT_PANEL_CUSTOM_BUTTONS]) then { - [7, false] call _handleStatsFnc; - }; - }; - }; - }; -} else { - // If nothing is chosen, hide stats - [[1, 2, 3, 4, 5]] call _hideUnusedFnc; + // Hide the stats box _statsBoxCtrl ctrlSetPosition [ (0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP, safezoneY + 1.8 * GRID_H, - 47 * GRID_W, - 11 * GRID_H + 0, + 0 ]; _statsBoxCtrl ctrlCommit 0; + // Move action display + private _ctrl = _display displayCtrl IDC_actionsBox; + private _pos = ctrlPosition _ctrl; + _pos set [1, safezoneY + 1.8 * GRID_H]; + _ctrl ctrlSetPosition _pos; + _ctrl ctrlCommit 0; + { _x ctrlSetFade 1; _x ctrlCommit 0; @@ -250,3 +75,187 @@ if (!isNil "_itemCfg") then { _statsCurrentPageCtrl ]; }; + +// If nothing is chosen, hide stats +if (isNull _itemCfg) exitWith { + call _fnc_hideEverything +}; + +private _fnc_handleStats = { + params ["_statsIndex", "_leftPanel"]; + + private _statsPanel = [GVAR(statsListRightPanel), GVAR(statsListLeftPanel)] select _leftPanel; + + // Get all viable stats for this tab + private _statsTab = _statsPanel select _statsIndex select { + _x params ["", "_configEntry", "", "", "_statements"]; + _statements params ["", "", ["_condition", {true}, [{}]]]; + + ([_configEntry, _itemCfg] call _condition) + }; + + // If there are no stats to show (unlikely), just hide everything + if (_statsTab isEqualTo []) exitWith { + call _fnc_hideEverything + }; + + GVAR(currentStatPage) = GVAR(currentStatPage) min floor ((count _statsTab) / 5); + private _statsToDisplay = _statsTab select [GVAR(currentStatPage) * 5, 5]; + + + private _statsCount = 0; + + private _statsTitleCtrl = controlNull; + private _statsTitleIDC = -1; + private _statsBackgroundCtrl = controlNull; + private _statsBarCtrl = controlNull; + private _statsTextCtrl = controlNull; + private _textStatementResult = ""; + + { + _x params ["", "_configEntry", "_title", "_bools", "_statements"]; + _bools params ["_showBar", "_showText"]; + _statements params [["_barStatement", {}, [{}]], ["_textStatement", {}, [{}]], ["_condition", {true}, [{}]]]; + + _statsTitleCtrl = _display displayCtrl (IDC_statsTitle1 + _forEachIndex * 4); + _statsTitleIDC = ctrlIDC _statsTitleCtrl; + _statsBackgroundCtrl = _display displayCtrl (_statsTitleIDC + 1); + _statsBarCtrl = _display displayCtrl (_statsTitleIDC + 2); + _statsTextCtrl = _display displayCtrl (_statsTitleIDC + 3); + + _statsCount = _statsCount + 1; + _statsTitleCtrl ctrlSetText _title; + _statsTitleCtrl ctrlSetFade 0; + + // Handle bars + if (_showBar) then { + _statsBarCtrl progressSetPosition ([_configEntry, _itemCfg] call _barStatement); + _statsBackgroundCtrl ctrlSetFade 0; + _statsBarCtrl ctrlSetFade 0; + } else { + _statsBackgroundCtrl ctrlSetFade 1; + _statsBarCtrl ctrlSetFade 1; + }; + + // Handle text entries + if (_showText) then { + _textStatementResult = [_configEntry, _itemCfg] call _textStatement; + + if !(_textStatementResult isEqualtype "") then { + _textStatementResult = str _textStatementResult; + }; + + _statsTextCtrl ctrlSetText _textStatementResult; + _statsTextCtrl ctrlSetTextColor ([[1, 1, 1, 1], [0, 0, 0, 1]] select (_showBar)); + _statsTextCtrl ctrlSetFade 0; + } else { + _statsTextCtrl ctrlSetFade 1; + }; + + { + _x ctrlCommit 0; + } forEach [ + _statsTitleCtrl, + _statsBackgroundCtrl, + _statsBarCtrl, + _statsTextCtrl + ]; + } forEach _statsToDisplay; + + + // Resize the window + (5 - _statsCount) call _fnc_hideUnused; + private _height = 10 * _statsCount + 5; + _statsBoxCtrl ctrlSetPosition [ + (0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP, + safezoneY + 1.8 * GRID_H, + 47 * GRID_W, + _height * GRID_H + ]; + _statsBoxCtrl ctrlCommit 0; + + // Move the actions box + private _ctrl = _display displayCtrl IDC_actionsBox; + private _pos = ctrlPosition _ctrl; + _pos set [1, safezoneY + (_height + 3.6) * GRID_H]; + _ctrl ctrlSetPosition _pos; + _ctrl ctrlCommit 0; + + + GVAR(statsInfo) = [_leftPanel, _control, _curSel, _itemCfg]; + + // Toggle page buttons + _statsPreviousPageCtrl ctrlEnable (GVAR(currentStatPage) > 0); + _statsNextPageCtrl ctrlEnable ((GVAR(currentStatPage) + 1) * 5 < count _statsTab); + _statsCurrentPageCtrl ctrlSetText ([LLSTRING(page), str (GVAR(currentStatPage) + 1)] joinString " "); + + { + _x ctrlSetFade 0; + _x ctrlCommit 0; + } forEach [ + _statsPreviousPageCtrl, + _statsNextPageCtrl, + _statsCurrentPageCtrl + ]; +}; + +// Check if in left or right panel +if (ctrlIDC _control == IDC_leftTabContent) then { + // Faces, voices and insigna do not have stats + if ([IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsignia] find GVAR(currentLeftPanel) > -1) then { + call _fnc_hideEverything; + } else { + [[ + IDC_buttonPrimaryWeapon, + IDC_buttonHandgun, + IDC_buttonSecondaryWeapon, + IDC_buttonUniform, + IDC_buttonVest, + IDC_buttonBackpack, + IDC_buttonHeadgear, + IDC_buttonGoggles, + IDC_buttonNVG, + IDC_buttonBinoculars, + IDC_buttonMap, + IDC_buttonGPS, + IDC_buttonRadio, + IDC_buttonCompass, + IDC_buttonWatch + ] find GVAR(currentLeftPanel), true] call _fnc_handleStats; + }; +} else { + switch (GVAR(currentRightPanel)) do { + case IDC_buttonOptic: { + [0, false] call _fnc_handleStats; + }; + case IDC_buttonItemAcc: { + [1, false] call _fnc_handleStats; + }; + case IDC_buttonMuzzle: { + [2, false] call _fnc_handleStats; + }; + case IDC_buttonBipod: { + [3, false] call _fnc_handleStats; + }; + case IDC_buttonCurrentMag; + case IDC_buttonCurrentMag2; + case IDC_buttonMag; + case IDC_buttonMagALL: { + [4, false] call _fnc_handleStats; + }; + case IDC_buttonThrow: { + [5, false] call _fnc_handleStats; + }; + case IDC_buttonPut: { + [6, false] call _fnc_handleStats; + }; + case IDC_buttonMisc: { + [7, false] call _fnc_handleStats; + }; + default { + if (GVAR(currentRightPanel) in [RIGHT_PANEL_CUSTOM_BUTTONS]) then { + [7, false] call _fnc_handleStats; + }; + }; + }; +}; diff --git a/addons/arsenal/functions/fnc_itemInfo.sqf b/addons/arsenal/functions/fnc_itemInfo.sqf index 710864e3e3..793d5a85e2 100644 --- a/addons/arsenal/functions/fnc_itemInfo.sqf +++ b/addons/arsenal/functions/fnc_itemInfo.sqf @@ -26,6 +26,7 @@ if (isClass _itemCfg) then { _ctrlInfo ctrlCommit FADE_DELAY; [QGVAR(displayStats), [_display, _control, _curSel, _itemCfg]] call CBA_fnc_localEvent; + [QGVAR(displayActions), [_display, _control, _curSel, _itemCfg]] call CBA_fnc_localEvent; // Name + author (_display displayCtrl IDC_infoName) ctrlSetText ([_control lbText _curSel, _control lnbText [_curSel, 1]] select (ctrlType _control == CT_LISTNBOX)); @@ -48,16 +49,16 @@ if (isClass _itemCfg) then { // If an item is from a DLC, set it so when you press the icon on the bottom right it opens the DLC page if ((getNumber (configfile >> "CfgMods" >> _dlc >> "appId")) > 0) then { - _ctrlDLC ctrlSetEventHandler ["mouseExit", format ["(_this select 0) ctrlSetText '%1';", _logo]]; - _ctrlDLC ctrlSetEventHandler ["mouseEnter", format ["(_this select 0) ctrlSetText '%1';", _logoOver]]; + _ctrlDLC ctrlSetEventHandler ["MouseExit", format ["(_this select 0) ctrlSetText '%1';", _logo]]; + _ctrlDLC ctrlSetEventHandler ["MouseEnter", format ["(_this select 0) ctrlSetText '%1';", _logoOver]]; _ctrlDLC ctrlSetEventHandler [ - "buttonClick", + "ButtonClick", format ["uiNamespace setVariable ['RscDisplayDLCPreview_dlc','%1']; ctrlParent (_this select 0) createDisplay 'RscDisplayDLCPreview';", _dlc] ]; } else { - _ctrlDLC ctrlRemoveAllEventHandlers "mouseExit"; - _ctrlDLC ctrlRemoveAllEventHandlers "mouseEnter"; - _ctrlDLC ctrlRemoveAllEventHandlers "buttonClick"; + _ctrlDLC ctrlRemoveAllEventHandlers "MouseExit"; + _ctrlDLC ctrlRemoveAllEventHandlers "MouseEnter"; + _ctrlDLC ctrlRemoveAllEventHandlers "ButtonClick"; }; } else { _ctrlDLC ctrlSetFade 1; @@ -69,6 +70,7 @@ if (isClass _itemCfg) then { } else { [QGVAR(displayStats), [_display, _control, -1, nil]] call CBA_fnc_localEvent; + [QGVAR(displayActions), [_display, _control, -1, nil]] call CBA_fnc_localEvent; _ctrlInfo ctrlSetFade 1; _ctrlInfo ctrlCommit FADE_DELAY; diff --git a/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf b/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf index 8b6e973ad8..13300bb2a4 100644 --- a/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf +++ b/addons/arsenal/functions/fnc_loadoutsChangeTab.sqf @@ -48,7 +48,7 @@ switch (ctrlIDC _control) do { case IDC_buttonMyLoadouts: { _centerBoxTitleCtrl ctrlSetText LLSTRING(tabMyLoadoutsText); - if (is3DEN) then { + if (call FUNC(canEditDefaultLoadout)) then { _saveButtonCtrl ctrlSetTooltip format ["%1\n%2", LLSTRING(buttonSaveTooltip), LLSTRING(buttonSaveTooltip_shiftClick)]; }; @@ -59,18 +59,18 @@ switch (ctrlIDC _control) do { case IDC_buttonDefaultLoadouts: { _centerBoxTitleCtrl ctrlSetText LLSTRING(tabDefaultLoadoutsText); - if (is3DEN) then { + if (call FUNC(canEditDefaultLoadout)) then { _saveButtonCtrl ctrlSetTooltip LLSTRING(buttonSaveTooltip); }; - _saveButtonCtrl ctrlEnable is3DEN; + _saveButtonCtrl ctrlEnable call FUNC(canEditDefaultLoadout); _saveButtonCtrl ctrlCommit 0; }; // Shared loadouts case IDC_buttonSharedLoadouts: { _centerBoxTitleCtrl ctrlSetText LLSTRING(tabSharedLoadoutsText); - if (is3DEN) then { + if (call FUNC(canEditDefaultLoadout)) then { _saveButtonCtrl ctrlSetTooltip LLSTRING(buttonSaveTooltip); }; diff --git a/addons/arsenal/functions/fnc_onArsenalClose.sqf b/addons/arsenal/functions/fnc_onArsenalClose.sqf index 38db27e196..222ef8a9d9 100644 --- a/addons/arsenal/functions/fnc_onArsenalClose.sqf +++ b/addons/arsenal/functions/fnc_onArsenalClose.sqf @@ -6,8 +6,8 @@ * Arguments: * 0: Not used * 1: Args - * 1.0: Not used - * 1.1: Exit code + * - 0: Not used + * - 1: Exit code * * Return Value: * None @@ -121,10 +121,16 @@ GVAR(currentInsignia) = nil; GVAR(currentAction) = nil; GVAR(showStats) = nil; -GVAR(statsPagesLeft) = nil; -GVAR(statsPagesRight) = nil; +GVAR(currentStatPage) = nil; GVAR(statsInfo) = nil; +GVAR(showActions) = nil; +GVAR(currentActionPage) = nil; + +profileNamespace setVariable [QGVAR(favorites), GVAR(favorites)]; +GVAR(favoritesOnly) = nil; +GVAR(favorites) = nil; + GVAR(center) = nil; GVAR(centerNotPlayer) = nil; diff --git a/addons/arsenal/functions/fnc_onArsenalOpen.sqf b/addons/arsenal/functions/fnc_onArsenalOpen.sqf index c4c90c2b26..f3c499cef0 100644 --- a/addons/arsenal/functions/fnc_onArsenalOpen.sqf +++ b/addons/arsenal/functions/fnc_onArsenalOpen.sqf @@ -7,7 +7,7 @@ * Arguments: * 0: Not used * 1: Arguments - * 1.0: Arsenal display + * - 0: Arsenal display * * Return Value: * None @@ -76,6 +76,8 @@ if (isNil QGVAR(virtualItems)) then { GVAR(virtualItemsFlat) = _virtualItemsFlat; }; +GVAR(virtualItemsFlatAll) = +GVAR(virtualItemsFlat); + GVAR(currentFace) = face GVAR(center); GVAR(currentVoice) = speaker GVAR(center); GVAR(currentInsignia) = GVAR(center) call BIS_fnc_getUnitInsignia; @@ -84,105 +86,20 @@ GVAR(currentAction) = "Stand"; GVAR(shiftState) = false; GVAR(showStats) = true; -GVAR(statsPagesLeft) = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; -GVAR(statsPagesRight) = [0, 0, 0, 0, 0, 0, 0, 0]; -GVAR(statsInfo) = [true, 0, controlNull, nil, nil]; +GVAR(currentStatPage) = 0; +GVAR(statsInfo) = [true, controlNull, nil, nil]; -// Add the items the player has to virtualItems -{ - switch (_forEachIndex) do { - // Primary weapon, Secondary weapon, Handgun weapon, Binoculars - case IDX_LOADOUT_PRIMARY_WEAPON; - case IDX_LOADOUT_SECONDARY_WEAPON; - case IDX_LOADOUT_HANDGUN_WEAPON; - case IDX_LOADOUT_BINO: { - _x params [["_weapon", ""], ["_muzzle", ""], ["_flashlight", ""], ["_optics", ""], ["_primaryMagazine", []], ["_secondaryMagazine", []], ["_bipod", ""]]; - - // Add weapon - if (_weapon != "") then { - _weapon = _weapon call FUNC(baseWeapon); - - // If bino, add it in a different place than regular weapons - if (_forEachIndex != IDX_LOADOUT_BINO) then { - ((GVAR(virtualItems) get IDX_VIRT_WEAPONS) get _forEachIndex) set [_weapon, nil]; - } else { - (GVAR(virtualItems) get IDX_VIRT_BINO) set [_weapon, nil]; - }; - }; - - // Add weapon attachments - { - if (_x != "") then { - ((GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get _forEachIndex) set [_x call FUNC(baseWeapon), nil]; - }; - } forEach [_optics, _flashlight, _muzzle, _bipod]; - - // Add magazines - { - // Check if there is a magazine (ammo count is unnecssary to check) - if ((_x param [0, ""]) != "") then { - (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL) set [_x select 0, nil]; - }; - } forEach [_primaryMagazine, _secondaryMagazine]; - }; - - // Uniform, vest, backpack - case IDX_LOADOUT_UNIFORM; - case IDX_LOADOUT_VEST; - case IDX_LOADOUT_BACKPACK: { - _x params [["_containerClass", ""]]; - - if (_containerClass != "") then { - (GVAR(virtualItems) get (_forEachIndex + 1)) set [_containerClass, nil]; - }; - }; - // Helmet - case IDX_LOADOUT_HEADGEAR: { - if (_x != "") then { - (GVAR(virtualItems) get IDX_VIRT_HEADGEAR) set [_x, nil]; - }; - }; - // Facewear - case IDX_LOADOUT_GOGGLES: { - if (_x != "") then { - (GVAR(virtualItems) get IDX_VIRT_GOGGLES) set [_x, nil]; - }; - }; - // Assigned items: Map, Compass, Watch, GPS / UAV Terminal, Radio, NVGs - case IDX_LOADOUT_ASSIGNEDITEMS: { - { - // Order of storing virtualItems is different than what getUnitLoadout returns, so do some math - if (_x != "") then { - (GVAR(virtualItems) get (IDX_VIRT_NVG + ([2, 6, 4, 3, 5, 0] select _forEachIndex))) set [_x, nil]; - }; - } forEach _x; - }; - }; -} forEach (getUnitLoadout GVAR(center)); // Only need items, not extended loadout - -// Get a list of all virtual items, including single panel items that are unique -private _virtualItemsFlat = +GVAR(virtualItems); -private _weapons = _virtualItemsFlat deleteAt IDX_VIRT_WEAPONS; -private _attachments = _virtualItemsFlat deleteAt IDX_VIRT_ATTACHMENTS; - -for "_index" from IDX_VIRT_ITEMS_ALL to IDX_VIRT_MISC_ITEMS do { - _virtualItemsFlat merge [_virtualItemsFlat deleteAt _index, true]; -}; - -for "_index" from IDX_VIRT_PRIMARY_WEAPONS to IDX_VIRT_HANDGUN_WEAPONS do { - _virtualItemsFlat merge [_weapons deleteAt _index, true]; -}; - -for "_index" from IDX_VIRT_OPTICS_ATTACHMENTS to IDX_VIRT_BIPOD_ATTACHMENTS do { - _virtualItemsFlat merge [_attachments deleteAt _index, true]; -}; - -GVAR(virtualItemsFlatAll) = _virtualItemsFlat; +GVAR(showActions) = true; +GVAR(currentActionPage) = 0; // Update current item list call FUNC(updateCurrentItemsList); -// This takes care of items that aren't available in the arsenal (either wrong tab or arsenal doesn't have it whitelisted) +// Setup favorites button text and switch to default mode defined by setting +[_display, _display displayCtrl IDC_buttonFavorites] call FUNC(buttonFavorites); +GVAR(favorites) = profileNamespace getVariable [QGVAR(favorites), createHashMap]; + +// This takes care of unique inventory items and unique equipment (arsenal doesn't have items/equipment whitelisted) call FUNC(updateUniqueItemsList); [QGVAR(displayOpened), [_display]] call CBA_fnc_localEvent; @@ -223,7 +140,15 @@ _statsBoxCtrl ctrlSetPosition [ _statsBoxCtrl ctrlEnable false; _statsBoxCtrl ctrlCommit 0; -(_display displayCtrl IDC_statsButton) ctrlShow false; +// Handle actions +private _actionsBoxCtrl = _display displayCtrl IDC_actionsBox; +_actionsBoxCtrl ctrlSetPosition [ + (0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP, + safezoneY + 58.6 * GRID_H, + 47 * GRID_W, + 11 * GRID_H +]; +_actionsBoxCtrl ctrlCommit 0; // Disable import in MP if (isMultiplayer) then { @@ -291,7 +216,7 @@ if (is3DEN) then { _ctrl ctrlCommit 0; } forEach [IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsignia]; - _buttonCloseCtrl = _display displayCtrl IDC_menuBarClose; + private _buttonCloseCtrl = _display displayCtrl IDC_menuBarClose; _buttonCloseCtrl ctrlSetText (localize "str_ui_debug_but_apply"); } else { GVAR(centerNotPlayer) = GVAR(center) != player; diff --git a/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf b/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf index 6a0cd1ef5b..ecfce2925b 100644 --- a/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf +++ b/addons/arsenal/functions/fnc_onLoadoutsOpen.sqf @@ -7,7 +7,7 @@ * Arguments: * 0: Not used * 1: Arguments - * 1.0: Loadouts display + * - 0: Loadouts display * * Return Value: * None diff --git a/addons/arsenal/functions/fnc_onMouseButtonDown.sqf b/addons/arsenal/functions/fnc_onMouseButtonDown.sqf index 1541289e0e..77d7ea84c4 100644 --- a/addons/arsenal/functions/fnc_onMouseButtonDown.sqf +++ b/addons/arsenal/functions/fnc_onMouseButtonDown.sqf @@ -6,10 +6,10 @@ * Arguments: * 0: Not used * 1: Args - * 1.0: Not used - * 1.1: Mouse button - * 1.2: Mouse X position - * 1.3: Mouse Y position + * - 0: Not used + * - 1: Mouse button + * - 2: Mouse X position + * - 3: Mouse Y position * * Return Value: * None diff --git a/addons/arsenal/functions/fnc_onMouseButtonUp.sqf b/addons/arsenal/functions/fnc_onMouseButtonUp.sqf index 1866db5e13..d84b8dae2d 100644 --- a/addons/arsenal/functions/fnc_onMouseButtonUp.sqf +++ b/addons/arsenal/functions/fnc_onMouseButtonUp.sqf @@ -6,8 +6,8 @@ * Arguments: * 0: Not used * 1: Args - * 1.0: Not used - * 1.1: Mouse button + * - 0: Not used + * - 1: Mouse button * * Return Value: * None diff --git a/addons/arsenal/functions/fnc_onPanelDblClick.sqf b/addons/arsenal/functions/fnc_onPanelDblClick.sqf new file mode 100644 index 0000000000..d9ea3583be --- /dev/null +++ b/addons/arsenal/functions/fnc_onPanelDblClick.sqf @@ -0,0 +1,50 @@ +#include "script_component.hpp" +#include "..\defines.hpp" +#include "\a3\ui_f\hpp\defineResincl.inc" +/* + * Author: LinkIsGrim + * Add or remove item(s) to favorites when LShift is pressed + * + * Arguments: + * 0: Left panel control + * 1: Left panel selection + * + * Return Value: + * None + * + * Public: No +*/ +params ["_control", "_curSel"]; + +if !(GVAR(shiftState)) exitWith {}; + +if (GVAR(currentLeftPanel) in [IDC_buttonFace, IDC_buttonVoice, IDC_buttonInsigina]) exitWith {}; + +private _isLnB = (ctrlType _control) == CT_LISTNBOX; + +private _favorited = false; + +// Favorites/blacklist will always be lowercase to handle configCase changes +private _item = ""; +if (_isLnB) then { + _item = toLower (_control lnbData [_curSel, 0]); +} else { + _item = toLower (_control lbData _curSel); +}; + +if (_item in GVAR(favorites)) then { + GVAR(favorites) deleteAt _item; +} else { + GVAR(favorites) set [_item, nil]; + _favorited = true; +}; + +private _color = ([[1, 1, 1], GVAR(favoritesColor)] select _favorited) + [1]; + +if (_isLnB) then { + _control lnbSetColor [[_curSel, 1], _color]; + _control lnbSetColorRight [[_curSel, 1], _color]; +} else { + _control lbSetColor [_curSel, _color]; + _control lbSetSelectColor [_curSel, _color]; +}; diff --git a/addons/arsenal/functions/fnc_onSelChangedLoadouts.sqf b/addons/arsenal/functions/fnc_onSelChangedLoadouts.sqf index 0d742347c9..b982652071 100644 --- a/addons/arsenal/functions/fnc_onSelChangedLoadouts.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedLoadouts.sqf @@ -74,7 +74,7 @@ switch (GVAR(currentLoadoutsTab)) do { // Enable delete and renaming button if in 3DEN { - _x ctrlEnable (is3DEN); + _x ctrlEnable (call FUNC(canEditDefaultLoadout)); _x ctrlCommit 0; } forEach [_renameButtonCtrl, _deleteButtonCtrl]; diff --git a/addons/arsenal/functions/fnc_onSelChangedRight.sqf b/addons/arsenal/functions/fnc_onSelChangedRight.sqf index 125cb0aa86..c0cf00d0d9 100644 --- a/addons/arsenal/functions/fnc_onSelChangedRight.sqf +++ b/addons/arsenal/functions/fnc_onSelChangedRight.sqf @@ -27,6 +27,7 @@ private _itemIndex = [IDC_buttonMuzzle, IDC_buttonItemAcc, IDC_buttonOptic, IDC_ switch (_currentItemsIndex) do { // Primary weapon case IDX_CURR_PRIMARY_WEAPON_ITEMS: { + private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS) select _itemIndex; // If removal if (_item == "") then { private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS) select 5; @@ -40,11 +41,11 @@ switch (_currentItemsIndex) do { // Add magazine back into primary muzzle GVAR(center) addWeaponItem [primaryWeapon GVAR(center), _secondaryMagazine, true]; } else { - GVAR(center) removePrimaryWeaponItem ((GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS) select _itemIndex); + GVAR(center) removePrimaryWeaponItem _currentItemInSlot; }; } else { - // Don't add item if it isn't a different item than what the unit already has - if (_item != ((GVAR(currentItems) select IDX_CURR_PRIMARY_WEAPON_ITEMS) select _itemIndex)) then { + // Don't add item if it isn't a magazine or a different item than what the unit already has + if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then { // If magazine, make sure to add to correct muzzle if (_itemIndex >= 4) then { private _weapon = primaryWeapon GVAR(center); @@ -64,6 +65,7 @@ switch (_currentItemsIndex) do { }; // Secondary weapon case IDX_CURR_SECONDARY_WEAPON_ITEMS: { + private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS) select _itemIndex; private _isDisposable = CBA_disposable_replaceDisposableLauncher && {!isNil {CBA_disposable_loadedLaunchers getVariable (secondaryWeapon GVAR(center))}}; // If removal @@ -84,11 +86,11 @@ switch (_currentItemsIndex) do { // Add magazine back into primary muzzle GVAR(center) addWeaponItem [secondaryWeapon GVAR(center), _secondaryMagazine, true]; } else { - GVAR(center) removeSecondaryWeaponItem ((GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS) select _itemIndex); + GVAR(center) removeSecondaryWeaponItem _currentItemInSlot; }; } else { - // Don't add item if it isn't a different item than what the unit already has - if (_item != ((GVAR(currentItems) select IDX_CURR_SECONDARY_WEAPON_ITEMS) select _itemIndex)) then { + // Don't add item if it isn't a magazine or a different item than what the unit already has + if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then { // If magazine, make sure to add to correct muzzle if (_itemIndex >= 4) then { private _weapon = secondaryWeapon GVAR(center); @@ -110,6 +112,7 @@ switch (_currentItemsIndex) do { }; // Handgun weapon case IDX_CURR_HANDGUN_WEAPON_ITEMS: { + private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS) select _itemIndex; if (_item == "") then { private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS) select 5; @@ -122,11 +125,11 @@ switch (_currentItemsIndex) do { // Add magazine back into primary muzzle GVAR(center) addWeaponItem [handgunWeapon GVAR(center), _secondaryMagazine, true]; } else { - GVAR(center) removeHandgunItem ((GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS) select _itemIndex); + GVAR(center) removeHandgunItem _currentItemInSlot; }; } else { - // Don't add item if it isn't a different item than what the unit already has - if (_item != ((GVAR(currentItems) select IDX_CURR_HANDGUN_WEAPON_ITEMS) select _itemIndex)) then { + // Don't add item if it isn't a magazine or a different item than what the unit already has + if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then { // If magazine, make sure to add to correct muzzle if (_itemIndex >= 4) then { private _weapon = handgunWeapon GVAR(center); @@ -140,20 +143,13 @@ switch (_currentItemsIndex) do { // Update currentItems (getUnitLoadout GVAR(center) select IDX_LOADOUT_HANDGUN_WEAPON) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; - - // https://feedback.bistudio.com/T173880 - _primaryMagazine = _primaryMagazine param [0, ""]; - private _handgunMagazines = handgunMagazine GVAR(center); - - // Delete the first magazine (but keep one if both magazines are the same) - _handgunMagazines deleteAt (_handgunMagazines findIf {_x == _primaryMagazine}); - - GVAR(currentItems) set [IDX_CURR_HANDGUN_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine, _handgunMagazines param [0, ""]]]; + GVAR(currentItems) set [IDX_CURR_HANDGUN_WEAPON_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine param [0, ""], _secondaryMagazine param [0, ""]]]; [_display, _control, _curSel, configFile >> ["CfgWeapons", "CfgMagazines"] select (_itemIndex >= 4) >> _item] call FUNC(itemInfo); }; // Binoculars case IDX_CURR_BINO_ITEMS: { + private _currentItemInSlot = (GVAR(currentItems) select IDX_CURR_BINO_ITEMS) select _itemIndex; if (_item == "") then { private _secondaryMagazine = (GVAR(currentItems) select IDX_CURR_BINO_ITEMS) select 5; @@ -166,11 +162,11 @@ switch (_currentItemsIndex) do { // Add magazine back into primary muzzle GVAR(center) addWeaponItem [binocular GVAR(center), _secondaryMagazine, true]; } else { - GVAR(center) removeBinocularItem ((GVAR(currentItems) select IDX_CURR_BINO_ITEMS) select _itemIndex); + GVAR(center) removeBinocularItem _currentItemInSlot; }; } else { - // Don't add item if it isn't a different item than what the unit already has - if (_item != ((GVAR(currentItems) select IDX_CURR_BINO_ITEMS) select _itemIndex)) then { + // Don't add item if it isn't a magazine or a different item than what the unit already has + if (_itemIndex >= 4 || {_item != _currentItemInSlot}) then { // If magazine, make sure to add to correct muzzle if (_itemIndex >= 4) then { private _weapon = binocular GVAR(center); @@ -184,15 +180,7 @@ switch (_currentItemsIndex) do { // Update currentItems (getUnitLoadout GVAR(center) select IDX_LOADOUT_BINO) params ["", "_muzzle", "_flashlight", "_optics", "_primaryMagazine", "_secondaryMagazine", "_bipod"]; - - // https://feedback.bistudio.com/T173880 (unsure if binocular weapons are affected by this) - _primaryMagazine = _primaryMagazine param [0, ""]; - private _binocularMagazines = binocularMagazine GVAR(center); - - // Delete the first magazine (but keep one if both magazines are the same) - _binocularMagazines deleteAt (_binocularMagazines findIf {_x == _primaryMagazine}); - - GVAR(currentItems) set [IDX_CURR_BINO_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine, _binocularMagazines param [0, ""]]]; + GVAR(currentItems) set [IDX_CURR_BINO_ITEMS, [_muzzle, _flashlight, _optics, _bipod, _primaryMagazine param [0, ""], _secondaryMagazine param [0, ""]]]; [_display, _control, _curSel, configFile >> ["CfgWeapons", "CfgMagazines"] select (_itemIndex >= 4) >> _item] call FUNC(itemInfo); }; diff --git a/addons/arsenal/functions/fnc_refresh.sqf b/addons/arsenal/functions/fnc_refresh.sqf new file mode 100644 index 0000000000..45358a3ce6 --- /dev/null +++ b/addons/arsenal/functions/fnc_refresh.sqf @@ -0,0 +1,33 @@ +#include "script_component.hpp" +#include "..\defines.hpp" +/* + * Author: Brett Mayson, johnb43 + * Refreshes the arsenal to show external changes. + * + * Arguments: + * 0: Update current and unique items lists (default: true) + * + * Return Value: + * None + * + * Example: + * call ace_arsenal_fnc_refresh + * + * Public: Yes +*/ +params [["_updateItems", true, [true]]]; + +if (_updateItems) then { + // Update current item list + call FUNC(updateCurrentItemsList); + + // This takes care of unique inventory items (arsenal doesn't have it whitelisted) + call FUNC(updateUniqueItemsList); +}; + +// Don't refresh left panel if in loadout tab +if (!isNull findDisplay IDD_loadouts_display) exitWith {}; + +private _display = findDisplay IDD_ace_arsenal; + +[_display, _display displayCtrl GVAR(currentLeftPanel)] call FUNC(fillLeftPanel); diff --git a/addons/arsenal/functions/fnc_removeAction.sqf b/addons/arsenal/functions/fnc_removeAction.sqf new file mode 100644 index 0000000000..1c11dce4a9 --- /dev/null +++ b/addons/arsenal/functions/fnc_removeAction.sqf @@ -0,0 +1,41 @@ +#include "script_component.hpp" +/* + * Author: johnb43 + * Remove a custom action button from ACE Arsenal. + * + * Arguments: + * 0: Array of IDs + * + * Return Value: + * None + * + * Example: + * [["TAG_myActions~text~0", "TAG_myActions~statement~0", "TAG_myActions~button~0"]] call ace_arsenal_fnc_removeAction + * + * Public: Yes +*/ + +params ["_IDList"]; + +// Compile sorts from config (in case this is called before preInit) +call FUNC(compileActions); + +// Remove entries (all names are unique, there are no duplicates) +{ + (_x splitString "~") params ["_rootClass", "_class", "_tab"]; + + _tab = parseNumber _tab; + + { + if ((_x select 0) == _rootClass) exitWith { + (_x select 3) deleteAt ((_x select 3) findIf {(_x select 0) == _class}); + + // If no entries left in group, remove group + if ((_x select 3) isEqualTo []) then { + (GVAR(actionList) select _tab) deleteAt _forEachIndex; + }; + }; + } forEach (GVAR(actionList) select _tab); +} forEach _IDList; + +nil // return diff --git a/addons/arsenal/functions/fnc_removeDefaultLoadout.sqf b/addons/arsenal/functions/fnc_removeDefaultLoadout.sqf new file mode 100644 index 0000000000..fd0c31bd62 --- /dev/null +++ b/addons/arsenal/functions/fnc_removeDefaultLoadout.sqf @@ -0,0 +1,28 @@ +#include "script_component.hpp" +/* + * Author: LinkIsGrim + * Removes a loadout from the "Default Loadouts" list. + * + * Arguments: + * 0: Name of loadout + * 1: Remove globally (default: false) + * + * Return Value: + * None + * + * Example: + * ["Squad Leader", true] call ace_arsenal_fnc_removeDefaultLoadout + * + * Public: Yes +*/ +params [["_name", "", [""]], ["_global", false, [false]]]; + +if (_global) then { + [QGVAR(removeDefaultLoadout), [_name]] call CBA_fnc_remoteEvent; +}; + +GVAR(defaultLoadoutsList) deleteAt (GVAR(defaultLoadoutsList) findIf {(_x select 0) == _name}); + +if (is3DEN) then { + set3DENMissionAttributes [[QGVAR(DummyCategory), QGVAR(DefaultLoadoutsListAttribute), GVAR(defaultLoadoutsList)]]; +}; diff --git a/addons/arsenal/functions/fnc_removeSort.sqf b/addons/arsenal/functions/fnc_removeSort.sqf index 8b9c818217..4fe98569d1 100644 --- a/addons/arsenal/functions/fnc_removeSort.sqf +++ b/addons/arsenal/functions/fnc_removeSort.sqf @@ -10,8 +10,7 @@ * None * * Example: - * - [["scopeSortL00", "scopeSortL01", "scopeSortL02", "scopeSortR07"]] call ace_arsenal_fnc_removeSort; + * [["scopeSortL00", "scopeSortL01", "scopeSortL02", "scopeSortR07"]] call ace_arsenal_fnc_removeSort; * * Public: Yes */ diff --git a/addons/arsenal/functions/fnc_removeStat.sqf b/addons/arsenal/functions/fnc_removeStat.sqf index 8c480c5a1b..ccbb34810e 100644 --- a/addons/arsenal/functions/fnc_removeStat.sqf +++ b/addons/arsenal/functions/fnc_removeStat.sqf @@ -25,7 +25,6 @@ private _stringCount = 0; private _tabSide = ""; private _tab = ""; private _tabToChange = []; -private _changes = []; { // Get tab info @@ -44,41 +43,5 @@ private _changes = []; }; // Delete stat - { - _x deleteAt (_x findIf {_x select 0 == _currentID}); - } forEach _tabToChange; - - // Store information, so that only tabs that were changed can be sorted again - _changes pushBackUnique [_tab, _tabSide]; + _tabToChange deleteAt (_tabToChange findIf {_x select 5 == _currentID}); } forEach _IDList; - -private _statsFlat = []; -private _stats = []; - -// Fill empty spots -{ - _x params ["_tab", "_tabSide"]; - - _tabToChange = if (_tabSide == "R") then { - GVAR(statsListRightPanel) - } else { - GVAR(statsListLeftPanel) - }; - - _statsFlat = []; - - // Get all stats of a tab into a single array - { - _statsFlat append _x; - } forEach (_tabToChange select _tab); - - // Priority has stayed intact, so no need to sort - _stats = []; - - // Group stats into groups of 5 - for "_index" from 0 to count _statsFlat - 1 step 5 do { - _stats pushBack (_statsFlat select [_index, _index + 5]); - }; - - _tabToChange set [_tab, _stats]; -} forEach _changes; diff --git a/addons/arsenal/functions/fnc_renameDefaultLoadout.sqf b/addons/arsenal/functions/fnc_renameDefaultLoadout.sqf new file mode 100644 index 0000000000..9d39acd550 --- /dev/null +++ b/addons/arsenal/functions/fnc_renameDefaultLoadout.sqf @@ -0,0 +1,25 @@ +#include "script_component.hpp" +/* + * Author: LinkIsGrim + * Renames a loadout from the "Default Loadouts" list. + * + * Arguments: + * 0: Current name of loadout + * 1: New name of loadout + * + * Return Value: + * None + * + * Example: + * ["Squad Leader", "Team Leader"] call ace_arsenal_fnc_renameDefaultLoadout + * + * Public: Yes +*/ +params [["_currentName", "", [""]], ["_newName", "", [""]]]; + +if (_currentName isEqualTo _newName) exitWith {}; + +private _loadoutIndex = GVAR(defaultLoadoutsList) findIf {(_x select 0) == _currentName}; +if (_loadoutIndex isEqualTo -1) exitWith {}; + +(GVAR(defaultLoadoutsList) select _loadoutIndex) set [0, _newName]; diff --git a/addons/arsenal/functions/fnc_replaceUniqueItemsLoadout.sqf b/addons/arsenal/functions/fnc_replaceUniqueItemsLoadout.sqf index 9155ea98d7..c984cb81ca 100644 --- a/addons/arsenal/functions/fnc_replaceUniqueItemsLoadout.sqf +++ b/addons/arsenal/functions/fnc_replaceUniqueItemsLoadout.sqf @@ -98,12 +98,16 @@ private _cfgVehicles = configFile >> "CfgVehicles"; // Check weapon & weapon attachments { - // Magazines + // Magazines in weapons have 2 entries: Name and ammo count if (_forEachIndex in [4, 5]) then { - _uniqueBaseCfgText = (getText (_cfgMagazines >> _x >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName); + _x params [["_magazine", ""], "_count"]; - if (_uniqueBaseCfgText != "") then { - _weaponsInfo set [_forEachIndex, _uniqueBaseCfgText]; + if (_magazine != "") then { + _uniqueBaseCfgText = (getText (_cfgMagazines >> _magazine >> QGVAR(uniqueBase))) call EFUNC(common,getConfigName); + + if (_uniqueBaseCfgText != "") then { + _weaponsInfo set [_forEachIndex, [_uniqueBaseCfgText, _count]]; + }; }; } else { // Other @@ -132,7 +136,7 @@ private _cfgVehicles = configFile >> "CfgVehicles"; // Assigned items: Map, Compass, Watch, GPS / UAV Terminal, Radio, NVGs case IDX_LOADOUT_ASSIGNEDITEMS: { // Check if assignedItems have items that need replacing with a defined base - _items = _x; + private _items = _x; { if (_x != "") then { diff --git a/addons/arsenal/functions/fnc_scanConfig.sqf b/addons/arsenal/functions/fnc_scanConfig.sqf index 87cb1c0b9e..335089534c 100644 --- a/addons/arsenal/functions/fnc_scanConfig.sqf +++ b/addons/arsenal/functions/fnc_scanConfig.sqf @@ -141,6 +141,7 @@ private _isTool = false; } forEach configProperties [_cfgWeapons, _filterFunction, true]; // Get all grenades +// Explicitly don't look at scope for these, we want hidden items to be sorted as grenades/explosives properly private _grenadeList = createHashMap; { @@ -154,11 +155,17 @@ private _putList = createHashMap; _putList insert [true, (getArray (_cfgWeapons >> "Put" >> _x >> "magazines")) apply {_x call EFUNC(common,getConfigName)}, []]; } forEach getArray (_cfgWeapons >> "Put" >> "muzzles"); +// Get all magazine misc items +private _magazineMiscItems = createHashMap; + +{ + _magazineMiscItems set [configName _x, nil]; +} forEach ((toString {getNumber (_x >> "ACE_isUnique") == 1}) configClasses _cfgMagazines); + // Remove invalid/non-existent entries _grenadeList deleteAt ""; _putList deleteAt ""; - -private _magazineMiscItems = createHashMap; +_magazineMiscItems deleteAt ""; // Get all other grenades, explosives (and similar) and magazines { @@ -166,9 +173,8 @@ private _magazineMiscItems = createHashMap; switch (true) do { // "Misc. items" magazines (e.g. spare barrels, intel, photos) - case (getNumber (_x >> "ACE_isUnique") isEqualTo 1): { + case (_className in _magazineMiscItems): { (_configItems get IDX_VIRT_MISC_ITEMS) set [_className, nil]; - _magazineMiscItems set [_className, nil]; if (getNumber (_x >> "ACE_isTool") isEqualTo 1) then {_toolList set [_className, nil]}; }; // Grenades diff --git a/addons/arsenal/functions/fnc_sortPanel.sqf b/addons/arsenal/functions/fnc_sortPanel.sqf index 117ad79297..7cb2c970db 100644 --- a/addons/arsenal/functions/fnc_sortPanel.sqf +++ b/addons/arsenal/functions/fnc_sortPanel.sqf @@ -132,6 +132,7 @@ private _quantity = ""; private _itemCfg = configNull; private _value = ""; private _name = ""; +private _fillerChar = toString [1]; private _magazineMiscItems = uiNamespace getVariable QGVAR(magazineMiscItems); private _sortCache = uiNamespace getVariable QGVAR(sortCache); @@ -217,16 +218,20 @@ _for do { // Save the current row's item's name in a cache and set text to it's sorting value if (_right) then { - _originalNames set [_item, _panel lnbText [_i, 1]]; + _name = _panel lnbText [_i, 1]; + _originalNames set [_item, _name]; - // Use tooltip to sort, as it also contains the classname, which means a fixed alphabetical order is guaranteed - _panel lnbSetText [[_i, 1], format ["%1%2", _value, _panel lbTooltip (_i * _countColumns)]]; + // Use value, display name and classname to sort, which means a fixed alphabetical order is guaranteed + // Filler char has lowest lexicographical order possible + _panel lnbSetText [[_i, 1], format ["%1%2%4%3", _value, _name, _item, _fillerChar]]; } else { if (_item != "") then { - _originalNames set [_item, _panel lbText _i]; + _name = _panel lbText _i; + _originalNames set [_item, _name]; - // Use tooltip to sort, as it also contains the classname, which means a fixed alphabetical order is guaranteed - _panel lbSetText [_i, format ["%1%2", _value, _panel lbTooltip _i]]; + // Use value, display name and classname to sort, which means a fixed alphabetical order is guaranteed + // Filler char has lowest lexicographical order possible + _panel lbSetText [_i, format ["%1%2%4%3", _value, _name, _item, _fillerChar]]; }; }; }; diff --git a/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf b/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf index 22076ae143..f6fcae8030 100644 --- a/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf +++ b/addons/arsenal/functions/fnc_statBarStatement_accuracy.sqf @@ -7,8 +7,8 @@ * 0: Not used * 1: Item config path * 2: Args - * 2.0: Stat limits - * 2.1: Bar limits + * - 0: Stat limits + * - 1: Bar limits * * Return Value: * diff --git a/addons/arsenal/functions/fnc_statBarStatement_default.sqf b/addons/arsenal/functions/fnc_statBarStatement_default.sqf index 8c547078f6..c346b3a2e0 100644 --- a/addons/arsenal/functions/fnc_statBarStatement_default.sqf +++ b/addons/arsenal/functions/fnc_statBarStatement_default.sqf @@ -7,9 +7,9 @@ * 0: Stat * 1: Item config path * 2: Args for configExtreme - * 2.0: Stat limits - * 2.1: Bar limits - * 2.2: Evaluate as a logarithmic number + * - 0: Stat limits + * - 1: Bar limits + * - 2: Evaluate as a logarithmic number * * Return Value: * Bar statement diff --git a/addons/arsenal/functions/fnc_statBarStatement_impact.sqf b/addons/arsenal/functions/fnc_statBarStatement_impact.sqf index 84d82eb466..8384a386e9 100644 --- a/addons/arsenal/functions/fnc_statBarStatement_impact.sqf +++ b/addons/arsenal/functions/fnc_statBarStatement_impact.sqf @@ -8,8 +8,8 @@ * 0: Stats array * 1: Item config path * 2: Args for configExtreme - * 2.0: Stats limits - * 2.1: Bar limits + * - 0: Stats limits + * - 1: Bar limits * * Return Value: * Number diff --git a/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf b/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf index 22d29d7f9b..a4fb3d2970 100644 --- a/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf +++ b/addons/arsenal/functions/fnc_statBarStatement_rateOfFIre.sqf @@ -7,8 +7,8 @@ * 0: Not used * 1: Item config path * 2: Args - * 2.0: Stat limits - * 2.1: Bar limits + * - 0: Stat limits + * - 1: Bar limits * * Return Value: * Number diff --git a/addons/arsenal/functions/fnc_statTextStatement_binoMag.sqf b/addons/arsenal/functions/fnc_statTextStatement_binoMag.sqf new file mode 100644 index 0000000000..c00b4c3875 --- /dev/null +++ b/addons/arsenal/functions/fnc_statTextStatement_binoMag.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror, LinkIsGrim + * Text statement for the binocular magnification stat. + * + * Arguments: + * 0: Not used + * 1: Item config path + * + * Return Value: + * Stat Text + * + * Public: No + */ + +params ["", "_config"]; +TRACE_1("statTextStatement_binoMag",_config); + +private _minZoom = getNumber (_config >> "opticsZoomMin"); // FOV, so smaller is more zoomed in +private _maxZoom = getNumber (_config >> "opticsZoomMax"); + +if (_minZoom == 0) exitWith {"?"}; + +private _maxMagnification = (0.25 / _minZoom) toFixed 1; +private _minMagnification = (0.25 / _maxZoom); +if (_minMagnification < 1) then { + _minMagnification = 1; +}; +_minMagnification = _minMagnification toFixed 1; + +if (_minMagnification == _maxMagnification) exitWith { + format ["%1x", _maxMagnification] +}; + +format ["%1x-%2x", _minMagnification, _maxMagnification] diff --git a/addons/arsenal/functions/fnc_statTextStatement_binoVisionMode.sqf b/addons/arsenal/functions/fnc_statTextStatement_binoVisionMode.sqf new file mode 100644 index 0000000000..bbc3ac2053 --- /dev/null +++ b/addons/arsenal/functions/fnc_statTextStatement_binoVisionMode.sqf @@ -0,0 +1,27 @@ +#include "script_component.hpp" +/* + * Author: Dedmen, johnb43, LinkIsGrim + * Text statement for the binocular/NVG vision mode stat. + * + * Arguments: + * 0: Not used + * 1: Item config path + * + * Return Value: + * Stat Text + * + * Public: No + */ + +params ["", "_config"]; +TRACE_1("statTextStatement_binoVisionMode",_config); + +private _text = []; +private _visionModes = getArray (_config >> "visionMode") apply {toLower _x}; +{ + if (_x in _visionModes) then { + _text pushBack (localize ([LSTRING(VisionNormal), LSTRING(VisionNight), LSTRING(VisionThermal)] select _forEachIndex)); + }; +} forEach ["normal", "nvg", "ti"]; + +_text joinString ", " diff --git a/addons/arsenal/functions/fnc_statTextStatement_magCount.sqf b/addons/arsenal/functions/fnc_statTextStatement_magCount.sqf new file mode 100644 index 0000000000..312010acf0 --- /dev/null +++ b/addons/arsenal/functions/fnc_statTextStatement_magCount.sqf @@ -0,0 +1,19 @@ +#include "script_component.hpp" +/* + * Author: LinkIsGrim + * Text statement for the magazine capacity stat. + * + * Arguments: + * 0: Stats Array (not used) + * 1: Item config path + * + * Return Value: + * String to display + * + * Public: No +*/ + +params ["", "_config"]; +TRACE_1("statTextStatement_magCount",_config) + +getNumber (_config >> "count"); diff --git a/addons/arsenal/functions/fnc_statTextStatement_scopeMag.sqf b/addons/arsenal/functions/fnc_statTextStatement_scopeMag.sqf index 681d76aab1..4cc521c2ec 100644 --- a/addons/arsenal/functions/fnc_statTextStatement_scopeMag.sqf +++ b/addons/arsenal/functions/fnc_statTextStatement_scopeMag.sqf @@ -17,11 +17,31 @@ params ["", "_config"]; TRACE_1("statTextStatement_scopeMag",_config); private _minZoom = 999; // FOV, so smaller is more zoomed in +private _maxZoom = 1.25; // Cap at 1x zoomed out +private _opticsModes = "true" configClasses (_config >> "ItemInfo" >> "OpticsModes"); { + // If there is a primary mode then just use that + if (getNumber (_x >> "useModelOptics") == 1 || {count _opticsModes == 1}) exitWith { + _minZoom = getNumber (_x >> "opticsZoomMin"); + _maxZoom = getNumber (_x >> "opticsZoomMax"); + }; + // Otherwise go through the optic's modes _minZoom = _minZoom min (getNumber (_x >> "opticsZoomMin")); -} forEach configProperties [_config >> "ItemInfo" >> "OpticsModes"]; + _maxZoom = _maxZoom max (getNumber (_x >> "opticsZoomMax")); +} forEach _opticsModes; if (_minZoom in [0, 999]) exitWith {"?"}; -format ["%1x", (0.25 / _minZoom) toFixed 1] +private _maxMagnification = (0.25 / _minZoom) toFixed 1; +private _minMagnification = (0.25 / _maxZoom); +if (_minMagnification < 1) then { + _minMagnification = 1; +}; +_minMagnification = _minMagnification toFixed 1; + +if (_minMagnification == _maxMagnification) exitWith { + format ["%1x", _maxMagnification] +}; + +format ["%1x-%2x", _minMagnification, _maxMagnification] diff --git a/addons/arsenal/functions/fnc_updateRightPanel.sqf b/addons/arsenal/functions/fnc_updateRightPanel.sqf index 04e93445ae..f1ef077c92 100644 --- a/addons/arsenal/functions/fnc_updateRightPanel.sqf +++ b/addons/arsenal/functions/fnc_updateRightPanel.sqf @@ -22,15 +22,18 @@ private _rightPanelCache = uiNamespace getVariable [QGVAR(rightPanelCache), crea private _mass = -1; private _color = []; +private _alpha = 1; // Grey out items that are too big to fit in remaining space of the container for "_row" from 0 to (lnbSize _control select 0) - 1 do { _mass = _rightPanelCache getOrDefault [_control lnbData [_row, 0], 0]; + _color = _control lnbColor [_row, 1]; // Lower alpha on color for items that can't fit - _color = [1, 1, 1, [0.25, 1] select (_mass <= _loadRemaining)]; + _alpha = [0.25, 1] select (_mass <= _loadRemaining); + _color set [3, _alpha]; _control lnbSetColor [[_row, 1], _color]; - _control lnbSetColor [[_row, 2], _color]; + _control lnbSetColor [[_row, 2], [1, 1, 1, _alpha]]; }; private _display = ctrlParent _control; diff --git a/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf b/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf index 13f414fe25..5f8211f50d 100644 --- a/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf +++ b/addons/arsenal/functions/fnc_updateUniqueItemsList.sqf @@ -2,8 +2,9 @@ #include "..\defines.hpp" /* * Author: Alganthe, johnb43 - * Updates the list of unique items. - * Unique items are items that can't be multiplied using the arsenal. + * Updates the list of unique inventory items and unique equipment. + * Unique inventory items are items within containers that can't be multiplied using the arsenal. + * Unique equipment are any items (such as weapons, containers, etc.) that can't be multiplied using the arsenal. * * Arguments: * None @@ -30,14 +31,111 @@ private _cfgMagazines = configFile >> "CfgMagazines"; private _cfgVehicles = configFile >> "CfgVehicles"; private _cfgGlasses = configFile >> "CfgGlasses"; +// Remove unique equipment in every panel +private _items = createHashMap; + +private _fnc_uniqueEquipment = { + params ["_items", "_item", ["_removeAllUniqueItems", true]]; + + // Remove all unique equipment from tab + if (_removeAllUniqueItems) then { + private _itemsToDelete = []; + + { + if (!isNil "_y") then { + _itemsToDelete pushBack _x; + }; + } forEach _items; + + { + _items deleteAt _x; + GVAR(virtualItemsFlatAll) deleteAt _x; + } forEach _itemsToDelete; + }; + + // Add item as a unique equipment + if (_item != "") then { + _items set [_item, true, true]; + GVAR(virtualItemsFlatAll) set [_item, true, true]; + }; +}; + +// Add the items the player has to virtualItems as unique equipment +{ + switch (_forEachIndex) do { + // Primary weapon, Secondary weapon, Handgun weapon, Binoculars + case IDX_LOADOUT_PRIMARY_WEAPON; + case IDX_LOADOUT_SECONDARY_WEAPON; + case IDX_LOADOUT_HANDGUN_WEAPON; + case IDX_LOADOUT_BINO: { + _x params [["_weapon", ""], ["_muzzle", ""], ["_flashlight", ""], ["_optics", ""], ["_primaryMagazine", []], ["_secondaryMagazine", []], ["_bipod", ""]]; + + // If bino, add it in a different place than regular weapons + _items = if (_forEachIndex != IDX_LOADOUT_BINO) then { + (GVAR(virtualItems) get IDX_VIRT_WEAPONS) get _forEachIndex + } else { + GVAR(virtualItems) get IDX_VIRT_BINO + }; + + // Remove all unique equipment in tab; Add weapon as a unique equipment + [_items, _weapon call FUNC(baseWeapon)] call _fnc_uniqueEquipment; + + private _removeUniqueItems = _forEachIndex == IDX_LOADOUT_PRIMARY_WEAPON; + + // Add weapon attachments + { + // Remove all unique equipment in tab; Add weapon attachment as a unique equipment + [(GVAR(virtualItems) get IDX_VIRT_ATTACHMENTS) get _forEachIndex, _x call FUNC(baseWeapon), _removeUniqueItems] call _fnc_uniqueEquipment; + } forEach [_optics, _flashlight, _muzzle, _bipod]; + + // Add magazines + { + // Remove all unique equipment in tab; Add magazine as unique equipment + [GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL, _x param [0, ""], _removeUniqueItems && {_forEachIndex == 0}] call _fnc_uniqueEquipment; + } forEach [_primaryMagazine, _secondaryMagazine]; + }; + + // Uniform, vest, backpack + case IDX_LOADOUT_UNIFORM; + case IDX_LOADOUT_VEST; + case IDX_LOADOUT_BACKPACK: { + _x params [["_containerClass", ""]]; + + // Remove all unique equipment in tab; Add container as a unique equipment + [GVAR(virtualItems) get (_forEachIndex + 1), _containerClass] call _fnc_uniqueEquipment; + }; + // Helmet + case IDX_LOADOUT_HEADGEAR: { + // Remove all unique equipment in tab; Add item as a unique equipment + [GVAR(virtualItems) get IDX_VIRT_HEADGEAR, _x] call _fnc_uniqueEquipment; + }; + // Facewear + case IDX_LOADOUT_GOGGLES: { + // Remove all unique equipment in tab; Add item as a unique equipment + [GVAR(virtualItems) get IDX_VIRT_GOGGLES, _x] call _fnc_uniqueEquipment; + }; + // Assigned items: Map, Compass, Watch, GPS / UAV Terminal, Radio, NVGs + case IDX_LOADOUT_ASSIGNEDITEMS: { + { + // Order of storing virtualItems is different than what getUnitLoadout returns, so do some math + // Remove all unique equipment in tab; Add item as a unique equipment + [GVAR(virtualItems) get (IDX_VIRT_NVG + ([2, 6, 4, 3, 5, 0] select _forEachIndex)), _x] call _fnc_uniqueEquipment; + } forEach _x; + }; + }; +} forEach (getUnitLoadout GVAR(center)); // Only need items, not extended loadout + + private _isMagazine = false; private _isWeapon = false; +private _isGrenade = false; +private _isPut = false; +private _isMiscItem = false; private _config = configNull; private _simulationType = ""; private _configItemInfo = ""; private _hasItemInfo = false; private _itemInfoType = 0; -private _isMiscItem = false; { _isMagazine = isClass (_cfgMagazines >> _x); @@ -47,39 +145,42 @@ private _isMiscItem = false; // Magazines case (_isMagazine): { _config = _cfgMagazines >> _x; + _isGrenade = _x in (uiNamespace getVariable QGVAR(grenadeCache)); + _isPut = _x in (uiNamespace getVariable QGVAR(putCache)); + _isMiscItem = _x in (uiNamespace getVariable QGVAR(magazineMiscItems)); switch (true) do { // "Misc. items" magazines (e.g. spare barrels, intel, photos) case ( !(_x in (GVAR(virtualItems) get IDX_VIRT_MISC_ITEMS)) && - {_x in (uiNamespace getVariable QGVAR(magazineMiscItems)) || - {getNumber (_config >> "ACE_isUnique") == 1}} + {_isMiscItem} ): { (GVAR(virtualItems) get IDX_VIRT_UNIQUE_MISC_ITEMS) set [_x, nil]; }; - // Primary, Handgun, Secondary weapon magazines - case ( - !(_x in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)) && - {_x in (_configItems get IDX_VIRT_ITEMS_ALL) || - {getNumber (_config >> QGVAR(hide)) == -1} || - {getNumber (_config >> "type") in [TYPE_MAGAZINE_PRIMARY_AND_THROW, TYPE_MAGAZINE_SECONDARY_AND_PUT, 1536, TYPE_MAGAZINE_HANDGUN_AND_GL, TYPE_MAGAZINE_MISSILE]}} - ): { - (GVAR(virtualItems) get IDX_VIRT_UNIQUE_VIRT_ITEMS_ALL) set [_x, nil]; - }; // Grenades case ( !(_x in (GVAR(virtualItems) get IDX_VIRT_GRENADES)) && - {_x in (uiNamespace getVariable QGVAR(grenadeCache))} + {_isGrenade} ): { (GVAR(virtualItems) get IDX_VIRT_UNIQUE_GRENADES) set [_x, nil]; }; // Explosives case ( !(_x in (GVAR(virtualItems) get IDX_VIRT_EXPLOSIVES)) && - {_x in (uiNamespace getVariable QGVAR(putCache))} + {_isPut} ): { (GVAR(virtualItems) get IDX_VIRT_UNIQUE_EXPLOSIVES) set [_x, nil]; }; + // Primary, Handgun, Secondary weapon magazines + case ( + !(_x in (GVAR(virtualItems) get IDX_VIRT_ITEMS_ALL)) && + {!_isGrenade && {!_isPut} && {!_isMiscItem}} && + {_x in (_configItems get IDX_VIRT_ITEMS_ALL) || + {getNumber (_config >> QGVAR(hide)) == -1} || + {getNumber (_config >> "type") in [TYPE_MAGAZINE_PRIMARY_AND_THROW, TYPE_MAGAZINE_SECONDARY_AND_PUT, 1536, TYPE_MAGAZINE_HANDGUN_AND_GL, TYPE_MAGAZINE_MISSILE]}} + ): { + (GVAR(virtualItems) get IDX_VIRT_UNIQUE_VIRT_ITEMS_ALL) set [_x, nil]; + }; // Unknown default { // Don't add items that are part of the arsenal diff --git a/addons/arsenal/initSettings.sqf b/addons/arsenal/initSettings.sqf index ea549528ad..bc093eb522 100644 --- a/addons/arsenal/initSettings.sqf +++ b/addons/arsenal/initSettings.sqf @@ -33,10 +33,29 @@ private _category = LLSTRING(settingCategory); true ] call CBA_fnc_addSetting; +[ + QGVAR(defaultToFavorites), + "CHECKBOX", + [LSTRING(defaultToFavoritesSetting), LSTRING(defaultToFavoritesTooltip)], + _category, + false, + 2 // never overwrite the client +] call CBA_fnc_addSetting; + +[ + QGVAR(favoritesColor), + "COLOR", + [LSTRING(favoritesColorSetting), LSTRING(favoritesColorTooltip)], + _category, + [0.9, 0.875, 0.6], + 2 // never overwrite the client +] call CBA_fnc_addSetting; + private _loadoutCategory = LLSTRING(loadoutSubcategory); // Arsenal loadouts -[QGVAR(allowDefaultLoadouts), +[ + QGVAR(allowDefaultLoadouts), "CHECKBOX", [LSTRING(allowDefaultLoadoutsSetting), LSTRING(defaultLoadoutsTooltip)], [_category, _loadoutCategory], @@ -44,7 +63,8 @@ private _loadoutCategory = LLSTRING(loadoutSubcategory); true ] call CBA_fnc_addSetting; -[QGVAR(allowSharedLoadouts), +[ + QGVAR(allowSharedLoadouts), "CHECKBOX", LLSTRING(allowSharingSetting), [_category, _loadoutCategory], @@ -52,7 +72,8 @@ private _loadoutCategory = LLSTRING(loadoutSubcategory); true ] call CBA_fnc_addSetting; -[QGVAR(EnableRPTLog), +[ + QGVAR(EnableRPTLog), "CHECKBOX", [LSTRING(printToRPTSetting), LSTRING(printToRPTTooltip)], @@ -61,21 +82,24 @@ private _loadoutCategory = LLSTRING(loadoutSubcategory); false ] call CBA_fnc_addSetting; -[QGVAR(loadoutsSaveFace), +[ + QGVAR(loadoutsSaveFace), "CHECKBOX", LLSTRING(loadoutsSaveFaceSetting), [_category, _loadoutCategory], false ] call CBA_fnc_addSetting; -[QGVAR(loadoutsSaveVoice), +[ + QGVAR(loadoutsSaveVoice), "CHECKBOX", LLSTRING(loadoutsSaveVoiceSetting), [_category, _loadoutCategory], false ] call CBA_fnc_addSetting; -[QGVAR(loadoutsSaveInsignia), +[ + QGVAR(loadoutsSaveInsignia), "CHECKBOX", LLSTRING(loadoutsSaveInsigniaSetting), [_category, _loadoutCategory], diff --git a/addons/arsenal/script_component.hpp b/addons/arsenal/script_component.hpp index 2eb9c3f170..0f7348b9db 100644 --- a/addons/arsenal/script_component.hpp +++ b/addons/arsenal/script_component.hpp @@ -15,3 +15,6 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#define ACTION_TYPE_BUTTON 0 +#define ACTION_TYPE_TEXT 1 diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml index 7d8657fe2a..cfc12c227c 100644 --- a/addons/arsenal/stringtable.xml +++ b/addons/arsenal/stringtable.xml @@ -997,7 +997,7 @@ Ninguna unidad de jugador disponible! Coloca una unidad y márcala como "Jugador". Aucune unité joueur disponible ! Placez une unité et marquez-la en tant que "joueur". Keine Spielereinheit verfügbar. Setze eine Einheit und markiere sie als "Spieler". - プレイヤー ユニットがありません!ユニットを設置し"Player"と名付けてください。 + プレイヤーユニットがありません!ユニットを設置し"Player"と名付けてください。 플레이어 유닛을 사용할 수 없습니다! 유닛을 놓고 "플레이어"라고 표시하십시오. 沒有可用的玩家單位!請擺放一個單位並設定成"玩家" 没有可用的玩家单位!请摆放一个单位并设定成“玩家”。 @@ -1240,6 +1240,70 @@ Desteklenmiyor 지원되지 않음 + + Vision Mode + Sichtmodus + ビジョン モード + Modalità Visiva + 視覺模式 + 视觉模式 + 보기 모드 + Mode de vision + Tryb Wizji + Режим видения + Modo de Visão + Režim sledování + Görüş Modu + Modo de visión + + + Normal + Normal + Normalna + Normal + Нормальное + Normální + Normal + Normale + Normale + 通常 + 일반 + 正常 + 正常 + Normal + + + Night + Nacht + Noc + Visão Norturna + Ночное + Noční + Nocturna + Notturno + Nocturne + 暗視装置 + 야간 + 夜视 + 夜視 + Gece + + + Thermal + Wärme + Termo + Térmica + Тепловизор + Termální + Térmica + Termico + Thermique + 熱源画像 + 열상 + 热成像 + 熱成像 + Termal + Page Página @@ -1261,7 +1325,7 @@ Habilitar las pestañas de caras / voces / insignias Aktiviere die Gesichter-, Stimmen- und Abzeichenübersicht Activer les onglets visages/voix/insignes - 顔 / 声 / 記章タブを有効化 + 顔 / 声 / 記章(バッジ)タブを有効化 启用脸谱/语音/徽章选项 啟用臉譜/聲音/徽章選項 Abilita volti, voci e insegne @@ -1470,24 +1534,29 @@ 얼굴 저장 Сохранить лицо Guardar Cara + 顔の保存 Save Voice 목소리 저장 Сохранить голос Guardar Voz + 声の保存 Save Insignia 계급장 저장 Сохранить эмблему Guardar Insignia + 記章(バッジ)の保存 Descending + 下降 Ascending + 昇順 Tools @@ -1505,5 +1574,29 @@ 工具 Araçlar + + Ammo count + 弾薬数 + + + Default to Favorites + お気に入りをデフォルト + + + Controls whether the ACE Arsenal defaults to showing all items or favorites. + ACE Arsenalがデフォルトで全てのアイテムを表示するか、お気に入りを表示するかを制御します。 + + + Favorites Color + お気に入りの色 + + + Highlight color for favorited items. + お気に入りアイテムのハイライト色。 + + + Switch between displaying all items or your favorites.\nDouble click while holding Shift to add or remove an item. + Shiftを押しながらダブルクリックするとアイテムを追加・削除できます。 + diff --git a/addons/arsenal/ui/RscAttributes.hpp b/addons/arsenal/ui/RscAttributes.hpp index 431869cb14..3a707a3dc3 100644 --- a/addons/arsenal/ui/RscAttributes.hpp +++ b/addons/arsenal/ui/RscAttributes.hpp @@ -176,6 +176,7 @@ class GVAR(display) { text = CSTRING(buttonHideText); sizeEx = QUOTE(5 * GRID_H); tooltip = CSTRING(buttonHideTooltip); + onMouseEnter = QUOTE(ctrlSetFocus (_this select 0)); onButtonClick = QUOTE([ctrlParent (_this select 0)] call FUNC(buttonHide)); }; class buttonLoadouts: buttonHide { @@ -199,10 +200,17 @@ class GVAR(display) { tooltip = CSTRING(buttonImportTooltip); onButtonClick = QUOTE([ctrlParent (_this select 0)] call FUNC(buttonImport)); }; + class buttonFavorites: buttonHide { + idc = IDC_buttonFavorites; + x = QUOTE(5 * WIDTH_GAP + 4 * WIDTH_SINGLE); + text = ""; + tooltip = CSTRING(buttonFavoritesTooltip); + onButtonClick = QUOTE([ARR_2(ctrlParent (_this select 0), (_this select 0))] call FUNC(buttonFavorites)); + }; class buttonClose: ctrlButtonOK { idc = IDC_menuBarClose; colorBackground[] = {0,0,0,0.8}; - x = QUOTE(5 * WIDTH_GAP + 4 * WIDTH_SINGLE); + x = QUOTE(6 * WIDTH_GAP + 5 * WIDTH_SINGLE); y = QUOTE(0); w = QUOTE(WIDTH_SINGLE); h = QUOTE(7 * GRID_H); @@ -403,17 +411,6 @@ class GVAR(display) { }; }; }; - class statsButton: ctrlButton { - idc = IDC_statsButton; - style = 2; - text = ">"; - onButtonClick = QUOTE([ARR_2(QQGVAR(statsButton), [ctrlParent (_this select 0)])] call CBA_fnc_localEvent); - x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP); - y = QUOTE(safezoneY + 1.8 * GRID_H); - w = QUOTE(6 * GRID_W); - h = QUOTE(6 * GRID_H); - sizeEx = QUOTE(5 * GRID_H); - }; class statsPreviousPage: ctrlButton { idc = IDC_statsPreviousPage; style = 2; @@ -431,29 +428,126 @@ class GVAR(display) { idc = IDC_statsNextPage; text = ">"; onButtonClick = QUOTE([ARR_2(QQGVAR(statsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, true)])] call CBA_fnc_localEvent); - x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 30 * GRID_W); + x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 42 * GRID_W); }; class statsCurrentPage: RscText { idc = IDC_statsCurrentPage; style = ST_CENTER; x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 5 * GRID_W); y = QUOTE(safezoneY + 1.8 * GRID_H); - w = QUOTE(25 * GRID_W); + w = QUOTE(37 * GRID_W); h = QUOTE(5 * GRID_H); colorBackground[] = {0,0,0,0}; shadow = 2; sizeEx = QUOTE(5 * GRID_H); text = ""; }; - class statsButtonClose: ctrlButtonPicture { - idc = IDC_statsButtonClose; - colorBackground[] = {0,0,0,0}; - text = "\a3\3DEN\Data\Displays\Display3DEN\search_end_ca.paa"; - onButtonClick = QUOTE([ARR_2(QQGVAR(statsButton), [ctrlParent (_this select 0)])] call CBA_fnc_localEvent); - x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP + 42 * GRID_W); - y = QUOTE(safezoneY + 1.8 * GRID_H); - w = QUOTE(5 * GRID_W); - h = QUOTE(5 * GRID_H); + class actionsBox: RscControlsGroupNoScrollbars { + idc = IDC_actionsBox; + x = QUOTE((0.5 - WIDTH_TOTAL / 2) + WIDTH_GAP); + y = QUOTE(safezoneY + 58.6 * GRID_H); + w = QUOTE(47 * GRID_W); + h = QUOTE(55 * GRID_H); + class controls { + class actionsStaticBackground1: ctrlStaticBackground { + idc = -1; + x = QUOTE(0); + y = QUOTE(0); + w = QUOTE(47 * GRID_W); + h = QUOTE(56 * GRID_H); + colorBackground[]={0.1,0.1,0.1,0.5}; + }; + class actionsStaticBackground2: ctrlStaticBackground { + idc = -1; + x = QUOTE(0); + y = QUOTE(0); + w = QUOTE(47 * GRID_W); + h = QUOTE(5 * GRID_H); + colorBackground[]={0.1,0.1,0.1,0.8}; + }; + class actionsText1: RscText { + idc = IDC_actionsText1; + fade = 1; + x = QUOTE(0 * GRID_W); + y = QUOTE(5 * GRID_H); + w = QUOTE(45 * GRID_W); + h = QUOTE(5 * GRID_H); + colorBackground[]={0,0,0,0}; + colorText[]={0.7,0.7,0.7,1}; + sizeEx = QUOTE(5 * GRID_H); + text = ""; + }; + class actionsButton1: ctrlButton { + idc = IDC_actionsButton1; + fade = 1; + text = ""; + x = QUOTE(1 * GRID_W); + y = QUOTE(6 * GRID_H); + w = QUOTE(45 * GRID_W); + h = QUOTE(4 * GRID_H); + }; + class actionsText2: actionsText1 { + idc = IDC_actionsText2; + y = QUOTE(10 * GRID_H); + }; + class actionsButton2: actionsButton1 { + idc = IDC_actionsButton2; + y = QUOTE(11 * GRID_H); + }; + class actionsText3: actionsText1 { + idc = IDC_actionsText3; + y = QUOTE(15 * GRID_H); + }; + class actionsButton3: actionsButton1 { + idc = IDC_actionsButton3; + y = QUOTE(16 * GRID_H); + }; + class actionsText4: actionsText1 { + idc = IDC_actionsText4; + y = QUOTE(20 * GRID_H); + }; + class actionsButton4: actionsButton1 { + idc = IDC_actionsButton4; + y = QUOTE(21 * GRID_H); + }; + class actionsText5: actionsText1 { + idc = IDC_actionsText5; + y = QUOTE(25 * GRID_H); + }; + class actionsButton5: actionsButton1 { + idc = IDC_actionsButton5; + y = QUOTE(26 * GRID_H); + }; + class actionsPreviousPage: ctrlButton { + idc = IDC_actionsPreviousPage; + style= 2; + text="<"; + colorBackground[]={0,0,0,0}; + colorBackgroundDisabled[]= {0,0,0,0}; + onButtonClick = QUOTE([ARR_2(QQGVAR(actionsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, false)])] call CBA_fnc_localEvent); + x = QUOTE(0); + y = QUOTE(0); + w = QUOTE(5 * GRID_W); + h = QUOTE(5 * GRID_H); + sizeEx = QUOTE(5.5 * GRID_H); + }; + class actionsNextPage: actionsPreviousPage { + idc = IDC_actionsNextPage; + text = ">"; + onButtonClick = QUOTE([ARR_2(QQGVAR(actionsChangePage),[ARR_3(ctrlParent (_this select 0), _this select 0, true)])] call CBA_fnc_localEvent); + x = QUOTE(42 * GRID_W); + }; + class actionsCurrentPage: RscText { + idc = IDC_actionsCurrentPage; + style = ST_CENTER; + x = QUOTE(5 * GRID_W); + w = QUOTE(37 * GRID_W); + colorBackground[]={0,0,0,0}; + shadow=2; + sizeEx = QUOTE(5 * GRID_H); + text = ""; + }; + }; }; class mouseBlock: RscText { idc = IDC_mouseBlock; @@ -473,6 +567,7 @@ class GVAR(display) { colorSelect2[] = {1,1,1,1}; colorPictureRightSelected[] = {1,1,1,1}; onLBSelChanged = QUOTE(_this call FUNC(onSelChangedLeft)); + onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick)); onSetFocus = QUOTE(GVAR(leftTabFocus) = true); onKillFocus = QUOTE(GVAR(leftTabFocus) = false); x = QUOTE(safezoneX + 13 * GRID_W); @@ -486,6 +581,7 @@ class GVAR(display) { drawSideArrows = 1; disableOverflow = 1; onLBSelChanged = QUOTE(_this call FUNC(onSelChangedRight)); + onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick)); onSetFocus = QUOTE(GVAR(rightTabFocus) = true); onKillFocus = QUOTE(GVAR(rightTabFocus) = false); x = QUOTE(safezoneX + safezoneW - 93 * GRID_W); @@ -506,6 +602,7 @@ class GVAR(display) { drawSideArrows = 1; disableOverflow = 1; onLBSelChanged = QUOTE(_this call FUNC(onSelChangedRightListnBox)); + onLBDblClick = QUOTE(_this call FUNC(onPanelDblClick)); onSetFocus = QUOTE(GVAR(rightTabLnBFocus) = true); onKillFocus = QUOTE(GVAR(rightTabLnBFocus) = false); x = QUOTE(safezoneX + safezoneW - 93 * GRID_W); diff --git a/addons/artillerytables/functions/fnc_interactMenuOpened.sqf b/addons/artillerytables/functions/fnc_interactMenuOpened.sqf index 8e396a0f13..c0cc1fb80c 100644 --- a/addons/artillerytables/functions/fnc_interactMenuOpened.sqf +++ b/addons/artillerytables/functions/fnc_interactMenuOpened.sqf @@ -46,10 +46,10 @@ TRACE_2("searching for new vehicles",_vehicleAdded,_rangeTablesShown); } forEach allTurrets _vehicle; TRACE_3("",_vehicle,configName _vehicleCfg,_turret); if (isNull _turretCfg) exitWith { ERROR_1("no primaryGunner %1",configName _vehicleCfg); }; - if ((count _turret) != 1) then { WARNING_2("sub turret %1-%2",_typeOf,_turret); }; + if ((count _turret) != 1) then { WARNING_2("sub turret %1-%2",configName _vehicleCfg,_turret); }; private _weaponsTurret = _vehicle weaponsTurret _turret; - if ((count _weaponsTurret) != 1) exitWith { WARNING_1("multiple weapons - %1",_typeOf); }; + if ((count _weaponsTurret) != 1) exitWith { WARNING_1("multiple weapons - %1",configName _vehicleCfg); }; private _weapon = _weaponsTurret select 0; private _turretAnimBody = getText (_turretCfg >> "animationSourceBody"); diff --git a/addons/ballistics/ACE_Arsenal_Stats.hpp b/addons/ballistics/ACE_Arsenal_Stats.hpp index 67e7d246e3..c3a1de2bce 100644 --- a/addons/ballistics/ACE_Arsenal_Stats.hpp +++ b/addons/ballistics/ACE_Arsenal_Stats.hpp @@ -24,6 +24,7 @@ class EGVAR(arsenal,stats) { stats[] = {"ammo", "displayName"}; displayName = "$STR_dn_ammo"; showText = 1; + condition = QUOTE(getText (_this select 1 >> _this select 0 select 0) isNotEqualTo ''); textStatement = QUOTE(params [ARR_2('_stat', '_config')]; private _ammoDisplayName = getText (configFile >> 'CfgAmmo' >> (getText (_config >> 'ammo')) >> _stat select 1); [ARR_2(_ammoDisplayName, getText (_config >> _stat select 0))] select (_ammoDisplayName == '')); tabs[] = {{}, {4}}; }; @@ -50,11 +51,11 @@ class EGVAR(arsenal,stats) { class ACE_magMuzzleVelocity: statBase { scope = 2; priority = 3; - stats[] = {"initSpeed"}; + stats[] = {"initSpeed", "ammo"}; displayName= CSTRING(statMuzzleVelocity); showText= 1; textStatement = QUOTE([ARR_2(_this select 0, _this select 1)] call FUNC(statTextStatement_magazineMuzzleVelocity)); - condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) > 0); + condition = QUOTE(getText (_this select 1 >> _this select 0 select 1) isNotEqualTo '' && {getNumber (_this select 1 >> (_this select 0) select 0) > 0}); tabs[] = {{}, {4}}; }; class ACE_weaponMuzzleVelocity: statBase { @@ -66,4 +67,14 @@ class EGVAR(arsenal,stats) { textStatement = QUOTE([ARR_2(_this select 0, _this select 1)] call FUNC(statTextStatement_weaponMuzzleVelocity)); tabs[] = {{0,1}, {}}; }; + class ACE_magazineAiUsage: statBase { + scope = 2; + priority = 0; + stats[] = {"aiAmmoUsageFlags"}; + displayName= CSTRING(ammoUsage_ai); + showText= 1; + textStatement = QUOTE(call FUNC(statTextStatement_magazineAiUsage)); + condition = QUOTE(is3DEN || {!isNull getAssignedCuratorLogic player} || {missionNamespace getVariable [ARR_2(QQGVAR(showAIMagazineUse), missionName == 'Arsenal')]}); + tabs[] = {{}, {4}}; + }; }; diff --git a/addons/ballistics/XEH_PREP.hpp b/addons/ballistics/XEH_PREP.hpp index c370b5fe1f..03a5055fcb 100644 --- a/addons/ballistics/XEH_PREP.hpp +++ b/addons/ballistics/XEH_PREP.hpp @@ -1,2 +1,3 @@ -PREP(statTextStatement_weaponMuzzleVelocity); +PREP(statTextStatement_magazineAiUsage); PREP(statTextStatement_magazineMuzzleVelocity); +PREP(statTextStatement_weaponMuzzleVelocity); diff --git a/addons/ballistics/functions/fnc_statTextStatement_magazineAiUsage.sqf b/addons/ballistics/functions/fnc_statTextStatement_magazineAiUsage.sqf new file mode 100644 index 0000000000..fa3e602440 --- /dev/null +++ b/addons/ballistics/functions/fnc_statTextStatement_magazineAiUsage.sqf @@ -0,0 +1,32 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Text statement for the magazine's AI Usage. + * + * Arguments: + * 0: not used + * 1: item config path (CONFIG) + * + * Return Value: + * String to display + * + * Public: No + */ + +params ["", "_config"]; +TRACE_1("statTextStatement_magazineAiUsage",_config); + +private _ammo = getText (_config >> "ammo"); +private _aiAmmoUsageFlags = getNumber (configFile >> "CfgAmmo" >> _ammo >> "aiAmmoUsageFlags"); +private _cost = getNumber (configFile >> "CfgAmmo" >> _ammo >> "cost"); + +private _output = []; + +if ([_aiAmmoUsageFlags, 1] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_illumination) }; +if ([_aiAmmoUsageFlags, 4] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_concealment) }; +if ([_aiAmmoUsageFlags, 64] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_infantry) }; +if ([_aiAmmoUsageFlags, 128] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_lightVehicle) }; +if ([_aiAmmoUsageFlags, 256] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_armor) }; +if ([_aiAmmoUsageFlags, 512] call BIS_fnc_bitflagsCheck) then { _output pushBack LLSTRING(ammoUsageShort_aircraft) }; + +(_output joinString ", ") + format [" [%1 %2]", localize "str_a3_cfgvehicles_modulecuratorsetobjectcost_f_arguments_cost", _cost] diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 576e239f2f..a961037093 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -3511,5 +3511,33 @@ Namlu çıkış hızı 총구 속도 + + AI Usage + AIの使用 + + + Illum + 照明弾 + + + Smoke + 発煙弾 + + + Inf + 歩兵 + + + Veh + 車両 + + + Armor + 機甲 + + + Air + 航空 + diff --git a/addons/captives/CfgWeapons.hpp b/addons/captives/CfgWeapons.hpp index 34f7b59e10..23c7d0c2ce 100644 --- a/addons/captives/CfgWeapons.hpp +++ b/addons/captives/CfgWeapons.hpp @@ -4,6 +4,7 @@ class CfgWeapons { class ACE_CableTie: ACE_ItemCore { author = ECSTRING(common,ACETeam); + GVAR(restraint) = 1; displayName = CSTRING(CableTie); descriptionShort = CSTRING(CableTieDescription); model = QPATHTOF(models\ace_cabletie.p3d); diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 61bd9788a3..8ec915e4f2 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -8,6 +8,8 @@ PREP_RECOMPILE_END; GVAR(captivityEnabled) = false; +GVAR(restraints) = call (uiNamespace getVariable QGVAR(restraints)); + #include "initSettings.sqf" ADDON = true; diff --git a/addons/captives/XEH_preStart.sqf b/addons/captives/XEH_preStart.sqf index 022888575e..75cbb90ef9 100644 --- a/addons/captives/XEH_preStart.sqf +++ b/addons/captives/XEH_preStart.sqf @@ -1,3 +1,6 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +private _restraints = (QUOTE(getNumber (_x >> QQGVAR(restraint)) > 0) configClasses (configFile >> "CfgWeapons") apply {configName _x}); +uiNamespace setVariable [QGVAR(restraints), compileFinal str _restraints]; diff --git a/addons/captives/functions/fnc_canApplyHandcuffs.sqf b/addons/captives/functions/fnc_canApplyHandcuffs.sqf index 72ac745517..5c97606f2e 100644 --- a/addons/captives/functions/fnc_canApplyHandcuffs.sqf +++ b/addons/captives/functions/fnc_canApplyHandcuffs.sqf @@ -20,7 +20,7 @@ params ["_unit", "_target"]; //Check sides, Player has cableTie, target is alive and not already handcuffed (GVAR(allowHandcuffOwnSide) || {(side _unit) != (side _target)}) && -{"ACE_CableTie" in (_unit call EFUNC(common,uniqueItems))} && +{((_unit call EFUNC(common,uniqueItems)) findAny GVAR(restraints)) != -1} && {alive _target} && {!(_target getVariable [QGVAR(isHandcuffed), false])} && { diff --git a/addons/captives/functions/fnc_doApplyHandcuffs.sqf b/addons/captives/functions/fnc_doApplyHandcuffs.sqf index ad1ef3f2d6..76ae4c1b32 100644 --- a/addons/captives/functions/fnc_doApplyHandcuffs.sqf +++ b/addons/captives/functions/fnc_doApplyHandcuffs.sqf @@ -23,4 +23,6 @@ playSound3D [QUOTE(PATHTO_R(sounds\cable_tie_zipping.ogg)), objNull, false, (get [QGVAR(setHandcuffed), [_target, true, _unit], [_target]] call CBA_fnc_targetEvent; -_unit removeItem "ACE_CableTie"; +private _cuffs = (_unit call EFUNC(common,uniqueItems)) arrayIntersect GVAR(restraints); + +_unit removeItem (_cuffs#0); diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 6b8b3b0bc4..8c4f85db06 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -430,7 +430,7 @@ Require AI surrendering Benötigt für KI Kapitulation Necessita arresa AI - AI の投降を必要とする + AIの投降を必要とする 需要AI先行投降 需要 AI 先行投降 AI 항복 필요 @@ -445,7 +445,7 @@ Require AI to surrender before they can be arrested KI muss sich erst ergeben, bevor sie gefangen genommen werden kann Necessita che le AI si arrendano prima di essere arrestate - AI の拘束は AI が投降している場合に限り可能にします。 + AIの拘束はAIが投降している場合に限り可能にします。 在逮捕AI之前該AI必須先進入投降狀態 在俘获 AI 之前该 AI 必须先进入投降状态。 포박하기 전에 먼저 AI가 투항해야만 합니다. diff --git a/addons/cargo/functions/fnc_getSizeItem.sqf b/addons/cargo/functions/fnc_getSizeItem.sqf index 5d66e59b72..f866104bd5 100644 --- a/addons/cargo/functions/fnc_getSizeItem.sqf +++ b/addons/cargo/functions/fnc_getSizeItem.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Glowbal, SilentSpike + * Author: Glowbal, kymckay * Get the cargo size of an object. * * Arguments: diff --git a/addons/cargo/functions/fnc_initObject.sqf b/addons/cargo/functions/fnc_initObject.sqf index c2158443be..5e26b06022 100644 --- a/addons/cargo/functions/fnc_initObject.sqf +++ b/addons/cargo/functions/fnc_initObject.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Glowbal, SilentSpike + * Author: Glowbal, kymckay * Initializes variables for loadable objects. Called from init EH. * * Arguments: diff --git a/addons/cargo/functions/fnc_setSize.sqf b/addons/cargo/functions/fnc_setSize.sqf index 9c9cc34f39..a35ec7c27c 100644 --- a/addons/cargo/functions/fnc_setSize.sqf +++ b/addons/cargo/functions/fnc_setSize.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Set the cargo size of any object. Has global effect. * Adds the load action menu if necessary. * Negative size makes unloadable. diff --git a/addons/cargo/functions/fnc_setSpace.sqf b/addons/cargo/functions/fnc_setSpace.sqf index ed34914fdc..4d9879dde7 100644 --- a/addons/cargo/functions/fnc_setSpace.sqf +++ b/addons/cargo/functions/fnc_setSpace.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Set the cargo space of any object. Has global effect. * Adds the cargo action menu if necessary. * diff --git a/addons/cargo/stringtable.xml b/addons/cargo/stringtable.xml index 455379633d..89a7cd7d2c 100644 --- a/addons/cargo/stringtable.xml +++ b/addons/cargo/stringtable.xml @@ -497,12 +497,14 @@ 화물 내린 후 운반 Нести после выгрузки Llevar encima tras la descarga + 荷降ろし後の運搬 Controls whether cargo items are carried or dragged after unloading. 화물 아이템을 내린 후 들거나 끌지 여부를 결정합니다. Нужно ли переносить или тащить предметы после их выгрузки. Controla si los objetos de carga son llevados encima o arrastrados despues de la descarga. + 荷降ろし後、貨物アイテムを運ぶか引きずるかを制御する。 diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp index d016ab26d6..eb0fd41440 100644 --- a/addons/common/XEH_PREP.hpp +++ b/addons/common/XEH_PREP.hpp @@ -10,6 +10,7 @@ PREP(readSettingsFromParamsArray); PREP(actionKeysNamesConverted); PREP(addCanInteractWithCondition); PREP(addLineToDebugDraw); +PREP(addSwayFactor); PREP(addToInventory); PREP(addWeapon); PREP(assignedItemFix); @@ -51,6 +52,7 @@ PREP(dropBackpack); PREP(endRadioTransmission); PREP(eraseCache); PREP(errorMessage); +PREP(escapeRegex); PREP(findUnloadPosition); PREP(firedEH); PREP(fixCollision); @@ -180,6 +182,7 @@ PREP(statusEffect_sendEffects); PREP(statusEffect_set); PREP(stringCompare); PREP(stringToColoredText); +PREP(swayLoop); PREP(switchPersistentLaser); PREP(switchToGroupSide); PREP(throttledPublicVariable); diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index bbe5fd03c2..ba1b8946c6 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -481,6 +481,23 @@ GVAR(reloadMutex_lastMagazines) = []; GVAR(reloadMutex_lastMagazines) = _mags; }, true] call CBA_fnc_addPlayerEventHandler; +////////////////////////////////////////////////// +// Start the sway loop +////////////////////////////////////////////////// +["CBA_settingsInitialized", { + [{ + // frame after settingsInitialized to ensure all other addons have added their factors + if ((GVAR(swayFactorsBaseline) + GVAR(swayFactorsMultiplier)) isNotEqualTo []) then { + call FUNC(swayLoop) + }; + // check for pre-3.16 sway factors being added + if (!isNil {missionNamespace getVariable "ACE_setCustomAimCoef"}) then { + WARNING("ACE_setCustomAimCoef no longer supported - use ace_common_fnc_addSwayFactor"); + WARNING_1("source: %1",(missionNamespace getVariable "ACE_setCustomAimCoef") apply {_x}); + }; + }] call CBA_fnc_execNextFrame; +}] call CBA_fnc_addEventHandler; + ////////////////////////////////////////////////// // Set up PlayerJIP eventhandler ////////////////////////////////////////////////// @@ -545,21 +562,30 @@ GVAR(deviceKeyCurrentIndex) = -1; [0xC7, [true, false, false]], false] call CBA_fnc_addKeybind; //SHIFT + Home Key -["ACE3 Weapons", QGVAR(unloadWeapon), LLSTRING(unloadWeapon), { - // Conditions: - if !([ACE_player, objNull, ["isNotInside"]] call FUNC(canInteractWith)) exitWith {false}; +["ACE3 Weapons", QGVAR(unloadWeapon), LSTRING(unloadWeapon), { + private _unit = ACE_player; - private _currentWeapon = currentWeapon ACE_player; - if !(_currentWeapon != primaryWeapon _unit && {_currentWeapon != handgunWeapon _unit} && {_currentWeapon != secondaryWeapon _unit}) exitWith {false}; + // Conditions + if !([_unit, objNull, ["isNotInside"]] call FUNC(canInteractWith)) exitWith {false}; - private _currentMuzzle = currentMuzzle ACE_player; - private _currentAmmoCount = ACE_player ammo _currentMuzzle; - if (_currentAmmoCount < 1) exitWith {false}; + if !(_unit call CBA_fnc_canUseWeapon) exitWith {false}; + + (weaponState _unit) params ["_weapon", "_muzzle", "", "_magazine", "_ammo"]; + + // Check if there is any ammo + if (_ammo < 1) exitWith {false}; + + // Check if the unit has a weapon + if (_weapon == "") exitWith {false}; + + // Check if the unit has a weapon selected + if !(_weapon in [primaryWeapon _unit, handgunWeapon _unit, secondaryWeapon _unit]) exitWith {false}; + + // Statement + [_unit, _weapon, _muzzle, _magazine, _ammo, false] call FUNC(unloadUnitWeapon); - // Statement: - [ACE_player, _currentWeapon, _currentMuzzle, _currentAmmoCount, false] call FUNC(unloadUnitWeapon); true -}, {false}, [19, [false, false, true]], false] call CBA_fnc_addKeybind; //ALT + R Key +}, {false}, [19, [false, false, true]], false] call CBA_fnc_addKeybind; // Alt + R ["CBA_loadoutSet", { params ["_unit", "_loadout"]; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 95f61fa7a1..efe9b10c0c 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -19,6 +19,9 @@ GVAR(isModLoadedCache) = createHashMap; GVAR(settingsInitFinished) = false; GVAR(runAtSettingsInitialized) = []; +GVAR(swayFactorsBaseline) = []; +GVAR(swayFactorsMultiplier) = []; + // @todo: Generic local-managed global-synced objects (createVehicleLocal) //Debug diff --git a/addons/common/functions/fnc_addSwayFactor.sqf b/addons/common/functions/fnc_addSwayFactor.sqf new file mode 100644 index 0000000000..ea2273f0f9 --- /dev/null +++ b/addons/common/functions/fnc_addSwayFactor.sqf @@ -0,0 +1,35 @@ +#include "script_component.hpp" +/* + * Author: LinkIsGrim + * Adds a factor to player sway calculation + * + * Arguments: + * 0: Type of factor, "baseline" or "multiplier" + * 1: Factor function, must return number + * 2: Factor ID, unique to type + * + * Return Value: + * Factor added + * + * Example: + * ["baseline", {1}, "ace_common"] call ace_common_fnc_addSwayFactor + * + * Public: Yes +*/ +params ["_type", "_code", "_id"]; + +_type = toLower _type; + +if !(_type in ["baseline", "multiplier"]) exitWith { ERROR_2("%1-%2 type unsupported",_type,_id); false }; + +if !((call _code) isEqualType 0) exitWith { ERROR_2("%1-%2 bad return type",_type,_id); false }; + +[missionNamespace, format ["ACE_setCustomAimCoef_%1", _type], _id, _code] call FUNC(arithmeticSetSource); + +if (_type isEqualTo "baseline") then { + GVAR(swayFactorsBaseline) pushBackUnique [_id]; +} else { + GVAR(swayFactorsMultiplier) pushBackUnique [_id]; +}; + +true diff --git a/addons/common/functions/fnc_canDig.sqf b/addons/common/functions/fnc_canDig.sqf index 14e7a0b843..4a8da4e177 100644 --- a/addons/common/functions/fnc_canDig.sqf +++ b/addons/common/functions/fnc_canDig.sqf @@ -22,8 +22,8 @@ private _posASL = _input; if ((_input isEqualType objNull) && { _posASL = getPosASL _input; - (getPosATL _unit) select 2 > 0.05 || // Walking on objects, such as buildings, pavements, etc. - {surfaceIsWater _posASL} // posATL in low water (not as low to allow awalking) is negative + (getPosATL _input) select 2 > 0.05 || // Walking on objects, such as buildings, pavements, etc. + {surfaceIsWater _posASL} // posATL in low water (not as low to allow walking) is negative }) exitWith {false}; private _surfaceClass = (surfaceType _posASL) select [1]; diff --git a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf index 6e7a4456c7..08ebd101f5 100644 --- a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf +++ b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf @@ -55,7 +55,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x private _cbaSettingType = ""; private _cbaValueInfo = []; - _cbaValueInfoHint = "default value"; + private _cbaValueInfoHint = "default value"; switch (_typeName) do { case ("SCALAR"): { // ACE's Scalar can be a float or an index for a list if (!isNumber (_config >> "value")) then {WARNING_2("Setting [%1] - value type [%2] is missing number",_varName,_typeName);}; diff --git a/addons/common/functions/fnc_dummy.sqf b/addons/common/functions/fnc_dummy.sqf index a70fed35c0..30074d29c8 100644 --- a/addons/common/functions/fnc_dummy.sqf +++ b/addons/common/functions/fnc_dummy.sqf @@ -1,5 +1,5 @@ /* - * Author: SilentSpike + * Author: kymckay * A dummy function which does nothing. Can be useful. * * Arguments: diff --git a/addons/common/functions/fnc_escapeRegex.sqf b/addons/common/functions/fnc_escapeRegex.sqf new file mode 100644 index 0000000000..adaa8bb557 --- /dev/null +++ b/addons/common/functions/fnc_escapeRegex.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Author: LinkIsGrim + * Escapes special characters used in regex from a string + * + * Arguments: + * 0: String + * + * Return Value: + * Safe string + * + * Example: + * "\Q.*?AK-15.*?\E" call ace_common_fnc_escapeRegex + * + * Public: Yes + */ +params [["_string", "", [""]]]; + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping +_string regexReplace ["[.?*+^$[\]\\(){}|-]/gio", "\\$&"] diff --git a/addons/common/functions/fnc_hideUnit.sqf b/addons/common/functions/fnc_hideUnit.sqf index e67f68dcc3..df2e15f488 100644 --- a/addons/common/functions/fnc_hideUnit.sqf +++ b/addons/common/functions/fnc_hideUnit.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike (based on muteUnit) + * Author: kymckay (based on muteUnit) * Globally hides a unit. This allows the handling of more than one reason to hide an object globally. * * Arguments: diff --git a/addons/common/functions/fnc_isMedic.sqf b/addons/common/functions/fnc_isMedic.sqf index b6aade5fbc..bfe9cd459a 100644 --- a/addons/common/functions/fnc_isMedic.sqf +++ b/addons/common/functions/fnc_isMedic.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Check if a unit is a medic * * Arguments: diff --git a/addons/common/functions/fnc_numberToDigits.sqf b/addons/common/functions/fnc_numberToDigits.sqf index d6a0249f86..c39ea2bbd0 100644 --- a/addons/common/functions/fnc_numberToDigits.sqf +++ b/addons/common/functions/fnc_numberToDigits.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: commy2, SilentSpike + * Author: commy2, kymckay * Transforms a number to an array of the correspondending digits. * * Arguments: diff --git a/addons/common/functions/fnc_removeSpecificMagazine.sqf b/addons/common/functions/fnc_removeSpecificMagazine.sqf index 98eee7ba5a..aed1c275c4 100644 --- a/addons/common/functions/fnc_removeSpecificMagazine.sqf +++ b/addons/common/functions/fnc_removeSpecificMagazine.sqf @@ -25,18 +25,8 @@ private _fnc_removeMagazine = { params ["_container", "_magArray"]; _magArray params ["_magazineType", "_ammoCount"]; - private _allMagazines = magazinesAmmoCargo _container; - private _specificMagazineIndex = _allMagazines findIf {_x isEqualTo _magArray}; - _allMagazines deleteAt _specificMagazineIndex; - - if (_specificMagazineIndex > -1) exitWith { - clearMagazineCargoGlobal _container; - if (_container isKindOf "WeaponHolder" && {_allMagazines isNotEqualTo []}) then { - _container = createVehicle [typeOf _container, getPosATL _container, [], 0, "CAN_COLLIDE"]; - }; - { - _container addMagazineAmmoCargo [_x select 0, 1, _x select 1]; - } forEach _allMagazines; + if (_magArray in (magazinesAmmoCargo _container)) exitWith { + _container addMagazineAmmoCargo [_magazineType, -1, _ammoCount]; true }; false diff --git a/addons/common/functions/fnc_swayLoop.sqf b/addons/common/functions/fnc_swayLoop.sqf new file mode 100644 index 0000000000..ab2266b1f5 --- /dev/null +++ b/addons/common/functions/fnc_swayLoop.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: LinkIsGrim + * Calculates and applies final sway coefficient from sway factors + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_common_fnc_swayLoop + * + * Public: No +*/ + +private _baseline = 1; +if (GVAR(swayFactorsBaseline) isNotEqualTo []) then { + _baseline = 1 max ([missionNamespace, "ACE_setCustomAimCoef_baseline", "max"] call EFUNC(common,arithmeticGetResult)); +}; + +private _multiplier = 1; +if (GVAR(swayFactorsMultiplier) isNotEqualTo []) then { + _multiplier = [missionNamespace, "ACE_setCustomAimCoef_multiplier", "product"] call EFUNC(common,arithmeticGetResult); +}; + +ACE_player setCustomAimCoef (_baseline * _multiplier); + +[FUNC(swayLoop), [], 1] call CBA_fnc_waitAndExecute diff --git a/addons/common/functions/fnc_unhideUnit.sqf b/addons/common/functions/fnc_unhideUnit.sqf index b6d669366e..6057e15878 100644 --- a/addons/common/functions/fnc_unhideUnit.sqf +++ b/addons/common/functions/fnc_unhideUnit.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike (based on unmuteUnit) + * Author: kymckay (based on unmuteUnit) * Globally unhides a unit. Only unhides if the last reason was removed. * * Arguments: diff --git a/addons/common/functions/fnc_unloadPersonLocal.sqf b/addons/common/functions/fnc_unloadPersonLocal.sqf index 21c16f8f6d..3a48ae2b10 100644 --- a/addons/common/functions/fnc_unloadPersonLocal.sqf +++ b/addons/common/functions/fnc_unloadPersonLocal.sqf @@ -19,7 +19,7 @@ #define GROUP_SWITCH_ID QFUNC(loadPerson) -params ["_unit", "_vehicle", ["_unloader", objNull]]; +params ["_unit", ["_vehicle", objNull], ["_unloader", objNull]]; TRACE_3("unloadpersonLocal",_unit,_vehicle,_unloader); //This covers testing vehicle stability and finding a safe position @@ -46,16 +46,20 @@ if (count _emptyPos != 3) exitwith { unassignVehicle _unit; [_unit] orderGetIn false; -TRACE_1("Ejecting", alive _unit); -private _vehicle = vehicle _unit; +TRACE_2("Ejecting",alive _unit,local _vehicle); + if (local _vehicle) then { _unit action ["Eject", _vehicle]; // Failsafe - sometimes eject alone doesn't work, but moveOut does [{ params ["_unit"]; - if (vehicle _unit != _unit) then { - WARNING_1("UnloadPersonLocal [%1] did not eject normally",_unit); + if (!isNull objectParent _unit) then { + if ([_unit] call FUNC(isAwake)) then { + WARNING_1("UnloadPersonLocal [%1] did not eject normally",_unit); + } else { + TRACE_1("UnloadPersonLocal dead/uncon did not eject normally",_unit); + }; moveOut _unit; }; }, [_unit], 1] call CBA_fnc_waitAndExecute; @@ -64,18 +68,21 @@ if (local _vehicle) then { moveOut _unit; }; -[{ - params ["_unit", "_emptyPos"]; - (alive _unit) && {(vehicle _unit) != _unit} -}, { - params ["_unit", "_emptyPos"]; - TRACE_2("success",_unit,_emptyPos); - _unit setPosASL AGLToASL _emptyPos; -}, [_unit, _emptyPos], 2, { - params ["_unit", "_emptyPos"]; - if (!alive _unit) exitWith {}; - WARNING_2("timeout %1->%2",_unit,vehicle _unit); -}] call CBA_fnc_waitUntilAndExecute; +// Wait until unit has actually exited vehicle and then move them to the unload position +if (alive _unit) then { + [{ + params ["_unit", "_emptyPos"]; + (alive _unit) && {isNull objectParent _unit} + }, { + params ["_unit", "_emptyPos"]; + TRACE_2("unload success",_unit,_emptyPos); + _unit setPosASL AGLToASL _emptyPos; + }, [_unit, _emptyPos], 2, { + params ["_unit", "_emptyPos"]; + if (!alive _unit) exitWith {}; + WARNING_2("timeout %1->%2",_unit,objectParent _unit); + }] call CBA_fnc_waitUntilAndExecute; +}; [_unit, false, GROUP_SWITCH_ID, side group _unit] call FUNC(switchToGroupSide); diff --git a/addons/common/functions/fnc_unloadUnitWeapon.sqf b/addons/common/functions/fnc_unloadUnitWeapon.sqf index 6998370e36..e3dabe5949 100644 --- a/addons/common/functions/fnc_unloadUnitWeapon.sqf +++ b/addons/common/functions/fnc_unloadUnitWeapon.sqf @@ -1,37 +1,61 @@ #include "script_component.hpp" /* - * Author: drofseh & Commy2 + * Author: drofseh, commy2, johnb43 * Unload the magazine from the unit's weapon and attempt to put it in a sensible place. * * Arguments: - * 0: Player + * 0: Unit * 1: Weapon - * 2: Muzzle (optional, default: Weapon) - * 3: Ammo count (optional, default: ammo currentMuzzle Player) - * 4: Skip animation? (optional, default: false) + * 2: Muzzle (default: Weapon) + * 3: Magazine (default: magazine in Weapon) + * 4: Ammo count (default: Unit ammo Muzzle) + * 5: Skip animation? (default: false) * * Return Value: * None * * Example: -* [ACE_player, currentWeapon ACE_player, currentMuzzle ACE_player, 23, false] call ace_common_fnc_unloadUnitWeapon + * [ACE_player, currentWeapon ACE_player, currentMuzzle ACE_player, currentMagazine ACE_player, 23, false] call ace_common_fnc_unloadUnitWeapon * * Public: No */ -params ["_unit", "_weapon", ["_muzzle", _weapon], ["_ammoCount", _unit ammo _muzzle ], ["_skipAnim", false]]; -TRACE_5("params",_unit,_weapon,_muzzle,_ammoCount,_skipAnim); +params ["_unit", "_weapon", "_muzzle", "_magazine", "_ammoCount", ["_skipAnim", false]]; +TRACE_6("params",_unit,_weapon,_muzzle,_magazine,_ammoCount,_skipAnim); -// audiovisual effects +if (_unit getVariable [QGVAR(isUnloadingWeapon), false]) exitWith {}; + +// Only allow 1 weapon to be unloaded at a time (because of animation length) +_unit setVariable [QGVAR(isUnloadingWeapon), true]; + +if (isNil "_muzzle") then { + _muzzle = _weapon; +}; + +if (isNil "_magazine") then { + private _weaponState = _unit weaponState _muzzle; + + _magazine = _weaponState select 3; + _ammoCount = _weaponState select 4; +}; + +if (isNil "_ammoCount") then { + _ammoCount = _unit ammo _muzzle; +}; + +// Audiovisual effects private _delay = 0; -if !(_skipAnim) then { + +if (!_skipAnim) then { _delay = 1.5; + private _config = configFile >> "CfgWeapons" >> _weapon; + if (_weapon != _muzzle) then { _config = _config >> _muzzle; }; - // get and play animation + // Get and play animation private _unloadAction = getText (_config >> "ACE_unloadAction"); if (_unloadAction == "") then { @@ -40,22 +64,31 @@ if !(_skipAnim) then { [_unit, _unloadAction, 1] call FUNC(doGesture); - // get and play sound + // Get and play sound private _unloadSound = getText (_config >> "ACE_unloadSound"); if (_unloadSound == "") then { _unloadSound = "A3\Sounds_F\arsenal\weapons\Rifles\Katiba\reload_Katiba.wss"; + private _unloadSoundArray = getArray (_config >> "reloadMagazineSound"); - // file extention is required for playSound3D + // File extention is required for playSound3D if (_unloadSoundArray isNotEqualTo []) then { private _wssTest = format ["%1.wss", _unloadSoundArray select 0]; + if (fileExists _wssTest) then { _unloadSound = _wssTest; } else { private _wavTest = format ["%1.wav", _unloadSoundArray select 0]; + if (fileExists _wavTest) then { _unloadSound = _wavTest; + } else { + private _oggTest = format ["%1.ogg", _unloadSoundArray select 0]; + + if (fileExists _oggTest) then { + _unloadSound = _oggTest; + }; }; }; }; @@ -64,24 +97,32 @@ if !(_skipAnim) then { playSound3D [_unloadSound, _unit]; }; -// remove magazine from weapon and add it to inventory +// Remove magazine from weapon and add it to inventory [{ - params ["_unit", "_weapon", "_ammoCount"]; + params ["_unit", "_weapon", "_muzzle", "_magazine", "_ammoCount"]; - // remove weapon item - private _magazineClass = currentMagazine _unit; + _unit setVariable [QGVAR(isUnloadingWeapon), nil]; - switch true do { - case (_weapon == primaryWeapon _unit): { - _unit removePrimaryWeaponItem _magazineClass; + private _returnMagazine = true; + + // Check if it's possible to remove given item from weapon; If possible, remove weapon item + switch (true) do { + case (_weapon == primaryWeapon _unit && {_weapon canAdd [_magazine, _muzzle]}): { + _unit removePrimaryWeaponItem _magazine; }; - case (_weapon == handgunWeapon _unit): { - _unit removeHandgunItem _magazineClass; + case (_weapon == handgunWeapon _unit && {_weapon canAdd [_magazine, _muzzle]}): { + _unit removeHandgunItem _magazine; }; - case (_weapon == secondaryWeapon _unit): { - _unit removeSecondaryWeaponItem _magazineClass; + case (_weapon == secondaryWeapon _unit && {_weapon canAdd [_magazine, _muzzle]}): { + _unit removeSecondaryWeaponItem _magazine; + }; + default { + _returnMagazine = false; }; }; - [_unit, _magazineClass, _ammoCount, true] call CBA_fnc_addMagazine; -}, [_unit, _weapon, _ammoCount], _delay] call CBA_fnc_waitAndExecute; + // Avoid duplicating magazines (e.g. by switching weapons mid unload) + if (!_returnMagazine) exitWith {}; + + [_unit, _magazine, _ammoCount, true] call CBA_fnc_addMagazine; +}, [_unit, _weapon, _muzzle, _magazine, _ammoCount], _delay] call CBA_fnc_waitAndExecute; diff --git a/addons/common/functions/fnc_watchVariable.sqf b/addons/common/functions/fnc_watchVariable.sqf index 2bb2d053ef..cdd88e1771 100644 --- a/addons/common/functions/fnc_watchVariable.sqf +++ b/addons/common/functions/fnc_watchVariable.sqf @@ -8,11 +8,11 @@ * 1: Code to generate result (passed nothing, can return any) (default: {}) * 2: Array containing modifiers (default: []) * For Numbers: - * 2.0: Show Delta change (default: true) - * 2.1: Slider Min Value (default: 0) - * 2.1: Slider Max Value (default: 0) + * - 0: Show Delta change (default: true) + * - 1: Slider Min Value (default: 0) + * - 2: Slider Max Value (default: 0) * For Anything else: - * 2.0: Number of structured text lines (default: 1) + * + 0: Number of structured text lines (default: 1) * * Return Value: * None diff --git a/addons/common/initSettings.sqf b/addons/common/initSettings.sqf index b0329732ff..e6b8b73248 100644 --- a/addons/common/initSettings.sqf +++ b/addons/common/initSettings.sqf @@ -68,7 +68,7 @@ private _categoryColors = [_category, format ["| %1 |", LLSTRING(subcategory_col QGVAR(persistentLaserEnabled), "CHECKBOX", [LSTRING(SettingPersistentLaserName), LSTRING(SettingPersistentLaserDesc)], - localize LSTRING(ACEKeybindCategoryWeapons), + LSTRING(ACEKeybindCategoryWeapons), false, false, LINKFUNC(switchPersistentLaser) diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 5a2234da05..b31f629027 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -683,7 +683,7 @@ Barva fontu ACE nápověd. Toto je standardní barva pro všechen text zobrazovaný ACE nápovědami, pokud nemá nápověda žádnou specifikanou barvu. Az ACE-súgók betűkészletének színek. Ez a szín alapértelmezett az összes szövegre az ACE-súgórendszerben, ha a súgószöveg maga nem ad meg más színt. A cor do texto das hints do ACE. Essa cor é a cor default para todos os texos exibidos pelo sistema de hints do ACE , caso o texto da hint não tem outra cor especificada. - ACE によるヒントの文章へ、色を設定できます。この色は ACE ヒント システムを介して表示される全文章の色と標準でなっており、特定の色を設定していても、標準色になります。 + ACE によるヒントの文章に色を設定できます。この色は ACE ヒント システムを介して表示される全文章の色と標準でなっており、特定の色を設定していても、標準色になります。 ACE 힌트에 쓰이는 글씨 색입니다. 힌트 글씨의 색이 정해지지 않을경우 모든 힌트의 색은 기본으로 설정됩니다. 設定ACE提示文字的顏色。若提示字體並無指定其他顏色,將會自動選用ACE系統的預設顏色 设定 ACE 提示文字的颜色。若提示字体并无指定其他颜色,将会自动选用 ACE 的预设颜色。 @@ -1321,7 +1321,7 @@ ACE 무분류 ACE Unkategorisiert ACE Nieskategoryzowane - ACE 無区分 + ACE 未区分 ACE Без категории ACE Sin categoría @@ -1515,7 +1515,7 @@ Joueurs et IA Játékosok és AI Giocatori ed IA - プレイヤーと AI + プレイヤーとAI 플레이어 및 인공지능 玩家与 AI 玩家與AI diff --git a/addons/compat_csla/$PBOPREFIX$ b/addons/compat_csla/$PBOPREFIX$ new file mode 100644 index 0000000000..4d7b298fef --- /dev/null +++ b/addons/compat_csla/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\compat_csla diff --git a/addons/compat_csla/CfgMagazines.hpp b/addons/compat_csla/CfgMagazines.hpp new file mode 100644 index 0000000000..f938272c8b --- /dev/null +++ b/addons/compat_csla/CfgMagazines.hpp @@ -0,0 +1,22 @@ +class CfgMagazines { + + class CSLA_UK59_50rnd_7_62vz59; + class CSLA_UK59_50rnd_7_62Sv59: CSLA_UK59_50rnd_7_62vz59 { + ace_isBelt = 1; + }; + + class US85_Magazine; + class US85_50Rnd_762x51: US85_Magazine { + ace_isBelt = 1; + }; + + class US85_20Rnd_762x51; + class US85_100Rnd_762x51: US85_20Rnd_762x51 { + ace_isBelt = 1; + }; + + class US85_30Rnd_556x45; + class US85_200Rnd_556x45: US85_30Rnd_556x45 { + ace_isBelt = 1; + }; +}; diff --git a/addons/compat_csla/CfgWeapons.hpp b/addons/compat_csla/CfgWeapons.hpp new file mode 100644 index 0000000000..dcfa6744cc --- /dev/null +++ b/addons/compat_csla/CfgWeapons.hpp @@ -0,0 +1,72 @@ +class CfgWeapons { + + class CSLA_LauncherBase; + class CSLA_Launcher_AT; + class CSLA_MachinegunBase_7_62; + + class CSLA_RPG7: CSLA_Launcher_AT { + EGVAR(reloadlaunchers,enabled) = 1; + }; + + // class CSLA_RPG75: CSLA_Launcher_AT {}; + + class CSLA_Strela: CSLA_LauncherBase { + EGVAR(overpressure,angle) = 30; + EGVAR(overpressure,damage) = 0.5; + EGVAR(overpressure,range) = 2; + }; + + class CSLA_UK59L: CSLA_MachinegunBase_7_62 { + EGVAR(overheating,allowSwapBarrel) = 1; + EGVAR(overheating,closedBolt) = 0; + }; + + class US85_Launcher_AA; + class US85_Launcher_AT; + class US85_MachinegunBase_5_56; + class US85_MachinegunBase_7_62; + class US85_weaponBase; + + // class US85_M16_base: US85_weaponBase {}; + + class US85_M249: US85_MachinegunBase_5_56 { + EGVAR(overheating,allowSwapBarrel) = 1; + EGVAR(overheating,closedBolt) = 0; + }; + + class US85_M60: US85_MachinegunBase_7_62 { + EGVAR(overheating,allowSwapBarrel) = 1; + EGVAR(overheating,closedBolt) = 0; + }; + + class US85_FIM92: US85_Launcher_AA { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,damage) = 0.3; + EGVAR(overpressure,range) = 6; + }; + + class US85_LAW72: US85_Launcher_AT { + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,damage) = 0.5; + EGVAR(overpressure,range) = 15; + }; + + class US85_M136: US85_Launcher_AT { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,damage) = 0.3; + EGVAR(overpressure,range) = 10; + }; + + class US85_MAAWS: US85_Launcher_AT { + EGVAR(reloadlaunchers,enabled) = 1; + EGVAR(overpressure,angle) = 60; + EGVAR(overpressure,damage) = 0.7; + EGVAR(overpressure,priority) = 1; + EGVAR(overpressure,range) = 10; + }; + + class US85_SMAW: US85_Launcher_AT { + EGVAR(reloadlaunchers,enabled) = 1; + EGVAR(overpressure,angle) = 45; + }; +}; diff --git a/addons/compat_csla/compat_csla_explosives/CfgMagazines.hpp b/addons/compat_csla/compat_csla_explosives/CfgMagazines.hpp new file mode 100644 index 0000000000..b29f7e717d --- /dev/null +++ b/addons/compat_csla/compat_csla_explosives/CfgMagazines.hpp @@ -0,0 +1,15 @@ +class CfgMagazines { + class US85_Magazine; + class US85_ATMine_mag: US85_Magazine { + EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_US85_ATMine_mag"; + useAction = 0; + }; + class US85_M14Mine_mag: US85_Magazine { + EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_US85_M14Mine"; + useAction = 0; + }; + class US85_SatchelCharge_Mag: US85_Magazine { + EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_US85_SatchelCharge_Mag"; + useAction = 0; + }; +}; diff --git a/addons/compat_csla/compat_csla_explosives/CfgVehicles.hpp b/addons/compat_csla/compat_csla_explosives/CfgVehicles.hpp new file mode 100644 index 0000000000..02dd9367ea --- /dev/null +++ b/addons/compat_csla/compat_csla_explosives/CfgVehicles.hpp @@ -0,0 +1,18 @@ +class CfgVehicles { + + // ACE Explosives + class ACE_Explosives_Place; + + class ACE_Explosives_Place_US85_ATMine_mag: ACE_Explosives_Place { + model = "\a3\weapons_f\explosives\mine_at.p3d"; + }; + + class ACE_Explosives_Place_US85_M14Mine: ACE_Explosives_Place { + model = "\a3\weapons_f\explosives\mine_ap.p3d"; + }; + + class ACE_Explosives_Place_US85_SatchelCharge_Mag: ACE_Explosives_Place { + model = "\a3\weapons_f\explosives\satchel.p3d"; + }; + +}; diff --git a/addons/compat_csla/compat_csla_explosives/config.cpp b/addons/compat_csla/compat_csla_explosives/config.cpp new file mode 100644 index 0000000000..d85e9f34a8 --- /dev/null +++ b/addons/compat_csla/compat_csla_explosives/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_explosives", "CSLA", "US85"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Dahlgren"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_csla/compat_csla_explosives/script_component.hpp b/addons/compat_csla/compat_csla_explosives/script_component.hpp new file mode 100644 index 0000000000..cdcfa0c070 --- /dev/null +++ b/addons/compat_csla/compat_csla_explosives/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_csla\script_component.hpp" + +#define SUBCOMPONENT explosives +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_csla/config.cpp b/addons/compat_csla/config.cpp new file mode 100644 index 0000000000..d0f99c092c --- /dev/null +++ b/addons/compat_csla/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common", "CSLA", "US85"}; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Dahlgren"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgMagazines.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/compat_csla/script_component.hpp b/addons/compat_csla/script_component.hpp new file mode 100644 index 0000000000..480a8cc4cc --- /dev/null +++ b/addons/compat_csla/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT compat_csla +#define COMPONENT_BEAUTIFIED CSLA Compatibility + +#include "\z\ace\addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_gm/$PBOPREFIX$ b/addons/compat_gm/$PBOPREFIX$ similarity index 100% rename from optionals/compat_gm/$PBOPREFIX$ rename to addons/compat_gm/$PBOPREFIX$ diff --git a/optionals/compat_rhs_gref3/CfgEventHandlers.hpp b/addons/compat_gm/CfgEventHandlers.hpp similarity index 100% rename from optionals/compat_rhs_gref3/CfgEventHandlers.hpp rename to addons/compat_gm/CfgEventHandlers.hpp diff --git a/addons/compat_gm/CfgMagazines.hpp b/addons/compat_gm/CfgMagazines.hpp new file mode 100644 index 0000000000..ee5d017275 --- /dev/null +++ b/addons/compat_gm/CfgMagazines.hpp @@ -0,0 +1,28 @@ +class CfgMagazines { + // MG3 + class gm_120rnd_762x51mm_mg3_grn; + class gm_120Rnd_762x51mm_B_T_DM21_mg3_grn: gm_120rnd_762x51mm_mg3_grn { + ACE_isBelt = 1; + }; + class gm_120Rnd_762x51mm_B_T_DM21A1_mg3_grn: gm_120rnd_762x51mm_mg3_grn { + ACE_isBelt = 1; + }; + class gm_120Rnd_762x51mm_B_T_DM21A2_mg3_grn: gm_120rnd_762x51mm_mg3_grn { + ACE_isBelt = 1; + }; + + // PK + class gm_100rnd_762x54mmR_pk_grn; + class gm_100Rnd_762x54mm_API_b32_pk_grn: gm_100rnd_762x54mmR_pk_grn { + ACE_isBelt = 1; + }; + class gm_100Rnd_762x54mm_B_T_t46_pk_grn: gm_100rnd_762x54mmR_pk_grn { + ACE_isBelt = 1; + }; + class gm_100Rnd_762x54mmR_API_7bz3_pk_grn: gm_100rnd_762x54mmR_pk_grn { + ACE_isBelt = 1; + }; + class gm_100Rnd_762x54mmR_B_T_7t2_pk_grn: gm_100rnd_762x54mmR_pk_grn { + ACE_isBelt = 1; + }; +}; diff --git a/optionals/compat_gm/CfgVehicles.hpp b/addons/compat_gm/CfgVehicles.hpp similarity index 81% rename from optionals/compat_gm/CfgVehicles.hpp rename to addons/compat_gm/CfgVehicles.hpp index a9813fdc0c..6d03465cd7 100644 --- a/optionals/compat_gm/CfgVehicles.hpp +++ b/addons/compat_gm/CfgVehicles.hpp @@ -1,72 +1,5 @@ class CfgVehicles { - // EXPLOSIVES - - class Items_base_F; - class ACE_Explosives_Place: Items_base_F { - class ACE_Actions { - class ACE_MainActions; - }; - }; - - // CHARGE - class ACE_Explosives_Place_gm_explosive_petn: ACE_Explosives_Place { - displayName = "PETN Charge"; - model = "gm\gm_weapons\gm_put\gm_explosive_charge_petn"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.002, 0.022, 0.02]"; - }; - }; - }; - class ACE_Explosives_Place_gm_explosive_plnp: ACE_Explosives_Place { - displayName = "PLNP Charge"; - model = "gm\gm_weapons\gm_put\gm_explosive_charge_plnp"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.002, 0.022, 0.02]"; - }; - }; - }; - // AT MINE - class ACE_Explosives_Place_gm_mine_tm46: ACE_Explosives_Place { - displayName = "AT Mine TM46"; - model = "gm\gm_weapons\gm_put\gm_mine_at_tm46"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.002, 0.022, 0.02]"; - }; - }; - }; - class ACE_Explosives_Place_gm_explosive_dm21: ACE_Explosives_Place { - displayName = "AT Mine DM21"; - model = "gm\gm_weapons\gm_put\gm_mine_at_dm21"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.002, 0.022, 0.02]"; - }; - }; - }; - class ACE_Explosives_Place_gm_explosive_m111: ACE_Explosives_Place { - displayName = "MN 111"; - model = "gm\gm_weapons\gm_launchers\gm_platan\gm_mine_at_mn111_disarmed"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.002, 0.022, 0.02]"; - }; - }; - }; - // AP - class ACE_Explosives_Place_gm_explosive_dm31: ACE_Explosives_Place { - displayName = "AP Mine DM31"; - model = "gm\gm_weapons\gm_put\gm_mine_ap_dm31"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.002, 0.022, 0.02]"; - }; - }; - }; - // REPAIR, REFUEL, REARM class ReammoBox_F; @@ -160,12 +93,10 @@ class CfgVehicles { }; class gm_ural4320_reammo_base: gm_ural4320_base { - transportAmmo = 0; EGVAR(rearm,defaultSupply) = 1200; }; class gm_ural4320_refuel_base: gm_ural4320_base { - transportFuel = 0; EGVAR(refuel,hooks)[] = {{-0.05,-3.6,-0.45}}; EGVAR(refuel,fuelCargo) = 10000; }; @@ -174,11 +105,6 @@ class CfgVehicles { EGVAR(medical,medicClass) = 1; }; - class gm_ural4320_repair_base: gm_ural4320_base { - transportRepair = 0; - EGVAR(repair,canRepair) = 1; - }; - // WEST @@ -223,12 +149,6 @@ class CfgVehicles { EGVAR(refuel,fuelCapacity) = 390; }; - class gm_fuchsa0_base; - class gm_fuchsa0_engineer_base: gm_fuchsa0_base { - transportRepair = 0; - EGVAR(repair,canRepair) = 1; - }; - class gm_luchs_base: gm_wheeled_APC_base { EGVAR(refuel,fuelCapacity) = 500; EGVAR(cookoff,cookoffSelections)[] = {"mainturret_hatch", "commanderturret_hatch"}; @@ -316,15 +236,12 @@ class CfgVehicles { }; class gm_m113a1dk_base; - class gm_m113a1dk_engineer_base: gm_m113a1dk_base { - transportRepair = 0; - EGVAR(repair,canRepair) = 1; - }; - class gm_m113a1dk_medic_base: gm_m113a1dk_base { EGVAR(medical,medicClass) = 1; }; + // If any hard edits are made, move to an appropriate subcomponent + // fastroping not needed unlike RHS as no hard edits are made here // H E L I C O P T E R S class Helicopter_Base_F; @@ -340,6 +257,7 @@ class CfgVehicles { EGVAR(refuel,fuelCapacity) = 3700; EGVAR(fastroping,enabled) = 0; + // TODO: stringtables class UserActions { class openDoor_L { displayNameDefault = "Open left Door"; diff --git a/optionals/compat_gm/CfgWeapons.hpp b/addons/compat_gm/CfgWeapons.hpp similarity index 100% rename from optionals/compat_gm/CfgWeapons.hpp rename to addons/compat_gm/CfgWeapons.hpp diff --git a/optionals/compat_gm/XEH_PREP.hpp b/addons/compat_gm/XEH_PREP.hpp similarity index 100% rename from optionals/compat_gm/XEH_PREP.hpp rename to addons/compat_gm/XEH_PREP.hpp diff --git a/optionals/compat_gm/XEH_preStart.sqf b/addons/compat_gm/XEH_preStart.sqf similarity index 100% rename from optionals/compat_gm/XEH_preStart.sqf rename to addons/compat_gm/XEH_preStart.sqf diff --git a/optionals/compat_gm/XEH_preinit.sqf b/addons/compat_gm/XEH_preinit.sqf similarity index 100% rename from optionals/compat_gm/XEH_preinit.sqf rename to addons/compat_gm/XEH_preinit.sqf diff --git a/optionals/compat_gm/CfgAmmo.hpp b/addons/compat_gm/compat_gm_explosives/CfgAmmo.hpp similarity index 52% rename from optionals/compat_gm/CfgAmmo.hpp rename to addons/compat_gm/compat_gm_explosives/CfgAmmo.hpp index 30a86758e5..3da49f45ab 100644 --- a/optionals/compat_gm/CfgAmmo.hpp +++ b/addons/compat_gm/compat_gm_explosives/CfgAmmo.hpp @@ -1,25 +1,25 @@ class CfgAmmo { class PipeBombBase; class gm_explosive_petn_charge: PipeBombBase { - EGVAR(explosive,defuseObjectPosition)[] = {0, 0, 0.02}; + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; }; class gm_explosive_plnp_charge: PipeBombBase { - EGVAR(explosive,defuseObjectPosition)[] = {0, 0, 0.02}; + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; }; class gm_mine_at_base; class gm_mine_at_mn111: gm_mine_at_base { - EGVAR(explosive,defuseObjectPosition)[] = {0, 0, 0.02}; + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; }; class gm_mine_at_dm21: gm_mine_at_base { - EGVAR(explosive,defuseObjectPosition)[] = {0, 0, 0.02}; + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; }; class gm_mine_at_tm46: gm_mine_at_base { - EGVAR(explosive,defuseObjectPosition)[] = {0, 0, 0.02}; + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; }; class gm_mine_bounce_base; class gm_mine_ap_dm31: gm_mine_bounce_base { - EGVAR(explosive,defuseObjectPosition)[] = {0, 0, 0.02}; + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02}; }; }; diff --git a/optionals/compat_gm/CfgMagazines.hpp b/addons/compat_gm/compat_gm_explosives/CfgMagazines.hpp similarity index 64% rename from optionals/compat_gm/CfgMagazines.hpp rename to addons/compat_gm/compat_gm_explosives/CfgMagazines.hpp index b439c1ecaa..17d51d3b45 100644 --- a/optionals/compat_gm/CfgMagazines.hpp +++ b/addons/compat_gm/compat_gm_explosives/CfgMagazines.hpp @@ -1,37 +1,10 @@ -class cfgMagazines { - // MG3 - class gm_120rnd_762x51mm_mg3_grn; - class gm_120Rnd_762x51mm_B_T_DM21_mg3_grn: gm_120rnd_762x51mm_mg3_grn { - ACE_isBelt = 1; - }; - class gm_120Rnd_762x51mm_B_T_DM21A1_mg3_grn: gm_120rnd_762x51mm_mg3_grn { - ACE_isBelt = 1; - }; - class gm_120Rnd_762x51mm_B_T_DM21A2_mg3_grn: gm_120rnd_762x51mm_mg3_grn { - ACE_isBelt = 1; - }; - - // PK - class gm_100rnd_762x54mmR_pk_grn; - class gm_100Rnd_762x54mm_API_b32_pk_grn: gm_100rnd_762x54mmR_pk_grn { - ACE_isBelt = 1; - }; - class gm_100Rnd_762x54mm_B_T_t46_pk_grn: gm_100rnd_762x54mmR_pk_grn { - ACE_isBelt = 1; - }; - class gm_100Rnd_762x54mmR_API_7bz3_pk_grn: gm_100rnd_762x54mmR_pk_grn { - ACE_isBelt = 1; - }; - class gm_100Rnd_762x54mmR_B_T_7t2_pk_grn: gm_100rnd_762x54mmR_pk_grn { - ACE_isBelt = 1; - }; - +class CfgMagazines { // Explosives class gm_explosive_petn_charge_base; class gm_explosive_petn_charge: gm_explosive_petn_charge_base { EGVAR(explosives,DelayTime) = 1; EGVAR(explosives,Placeable) = 1; - EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_gm_explosive_petn"; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_petn); useAction = 0; class ACE_Triggers { SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; @@ -50,7 +23,7 @@ class cfgMagazines { class gm_explosive_plnp_charge: gm_explosive_plnp_charge_base { EGVAR(explosives,DelayTime) = 1; EGVAR(explosives,Placeable) = 1; - EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_gm_explosive_plnp"; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_plnp); useAction = 0; class ACE_Triggers { SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; @@ -68,7 +41,7 @@ class cfgMagazines { class gm_mine_at_base; class gm_mine_at_tm46: gm_mine_at_base { EGVAR(explosives,Placeable) = 1; - EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_gm_mine_tm46"; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_mine_tm46); useAction = 0; class ACE_Triggers { SupportedTriggers[] = {"PressurePlate"}; @@ -79,7 +52,7 @@ class cfgMagazines { }; class gm_mine_at_dm21: gm_mine_at_base { EGVAR(explosives,Placeable) = 1; - EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_gm_explosive_dm21"; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_dm21); useAction = 0; class ACE_Triggers { SupportedTriggers[] = {"PressurePlate"}; @@ -90,7 +63,7 @@ class cfgMagazines { }; class gm_mine_at_mn111: gm_mine_at_base { EGVAR(explosives,Placeable) = 1; - EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_gm_explosive_m111"; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_m111); useAction = 0; class ACE_Triggers { SupportedTriggers[] = {"PressurePlate"}; @@ -102,7 +75,7 @@ class cfgMagazines { class gm_mine_ap_dm31: gm_mine_at_base { EGVAR(explosives,Placeable) = 1; - EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_gm_explosive_dm31"; + EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_dm31); useAction = 0; class ACE_Triggers { SupportedTriggers[] = {"Tripwire"}; diff --git a/addons/compat_gm/compat_gm_explosives/CfgVehicles.hpp b/addons/compat_gm/compat_gm_explosives/CfgVehicles.hpp new file mode 100644 index 0000000000..bb279c82b9 --- /dev/null +++ b/addons/compat_gm/compat_gm_explosives/CfgVehicles.hpp @@ -0,0 +1,67 @@ +class CfgVehicles { + + class Items_base_F; + class EGVAR(explosives,Place): Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + }; + + // CHARGE + class EGVAR(explosives,Place_gm_explosive_petn): EGVAR(explosives,Place) { + displayName = "PETN Charge"; + model = "gm\gm_weapons\gm_put\gm_explosive_charge_petn"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + class EGVAR(explosives,Place_gm_explosive_plnp): EGVAR(explosives,Place) { + displayName = "PLNP Charge"; + model = "gm\gm_weapons\gm_put\gm_explosive_charge_plnp"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + // AT MINE + class EGVAR(explosives,Place_gm_mine_tm46): EGVAR(explosives,Place) { + displayName = "AT Mine TM46"; + model = "gm\gm_weapons\gm_put\gm_mine_at_tm46"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + class EGVAR(explosives,Place_gm_explosive_dm21): EGVAR(explosives,Place) { + displayName = "AT Mine DM21"; + model = "gm\gm_weapons\gm_put\gm_mine_at_dm21"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + class EGVAR(explosives,Place_gm_explosive_m111): EGVAR(explosives,Place) { + displayName = "MN 111"; + model = "gm\gm_weapons\gm_launchers\gm_platan\gm_mine_at_mn111_disarmed"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + // AP + class EGVAR(explosives,Place_gm_explosive_dm31): EGVAR(explosives,Place) { + displayName = "AP Mine DM31"; + model = "gm\gm_weapons\gm_put\gm_mine_ap_dm31"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; +}; diff --git a/addons/compat_gm/compat_gm_explosives/config.cpp b/addons/compat_gm/compat_gm_explosives/config.cpp new file mode 100644 index 0000000000..aa3de76d41 --- /dev/null +++ b/addons/compat_gm/compat_gm_explosives/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + addonRootClass = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "gm_core", + "ace_explosives" + }; + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_gm/compat_gm_explosives/script_component.hpp b/addons/compat_gm/compat_gm_explosives/script_component.hpp new file mode 100644 index 0000000000..f2c819d89e --- /dev/null +++ b/addons/compat_gm/compat_gm_explosives/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_gm\script_component.hpp" + +#define SUBCOMPONENT explosives +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_gm/compat_gm_refuel/CfgEventHandlers.hpp b/addons/compat_gm/compat_gm_refuel/CfgEventHandlers.hpp new file mode 100644 index 0000000000..81ef39f88d --- /dev/null +++ b/addons/compat_gm/compat_gm_refuel/CfgEventHandlers.hpp @@ -0,0 +1,7 @@ +class Extended_InitPost_EventHandlers { + class gm_jerrycan { + class ADDON { + init = QUOTE(call EFUNC(refuel,makeJerryCan)); + }; + }; +}; diff --git a/addons/compat_gm/compat_gm_refuel/CfgVehicles.hpp b/addons/compat_gm/compat_gm_refuel/CfgVehicles.hpp new file mode 100644 index 0000000000..46a4deeefd --- /dev/null +++ b/addons/compat_gm/compat_gm_refuel/CfgVehicles.hpp @@ -0,0 +1,6 @@ +class CfgVehicles { + class gm_ural4320_base; + class gm_ural4320_refuel_base: gm_ural4320_base { + transportFuel = 0; + }; +}; diff --git a/addons/compat_gm/compat_gm_refuel/config.cpp b/addons/compat_gm/compat_gm_refuel/config.cpp new file mode 100644 index 0000000000..9f367e99f9 --- /dev/null +++ b/addons/compat_gm/compat_gm_refuel/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + addonRootClass = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "gm_core", + "ace_refuel" + }; + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_gm/compat_gm_refuel/script_component.hpp b/addons/compat_gm/compat_gm_refuel/script_component.hpp new file mode 100644 index 0000000000..e5a1095957 --- /dev/null +++ b/addons/compat_gm/compat_gm_refuel/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_gm\script_component.hpp" + +#define SUBCOMPONENT refuel +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/optionals/compat_gm/config.cpp b/addons/compat_gm/config.cpp similarity index 77% rename from optionals/compat_gm/config.cpp rename to addons/compat_gm/config.cpp index 47191aed12..63f43635d5 100644 --- a/optionals/compat_gm/config.cpp +++ b/addons/compat_gm/config.cpp @@ -6,7 +6,8 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_csw", "ace_explosives", "ace_rearm", "ace_refuel", "ace_repair", "gm_core"}; + requiredAddons[] = {"ace_common", "gm_core"}; + skipWhenMissingDependencies = 1; author = ECSTRING(common,ACETeam); authors[] = {"sancron", "nomisum"}; url = ECSTRING(main,URL); @@ -14,7 +15,6 @@ class CfgPatches { }; }; -#include "CfgAmmo.hpp" #include "CfgEventHandlers.hpp" #include "CfgMagazines.hpp" #include "CfgWeapons.hpp" diff --git a/optionals/compat_gm/functions/fnc_onCut.sqf b/addons/compat_gm/functions/fnc_onCut.sqf similarity index 100% rename from optionals/compat_gm/functions/fnc_onCut.sqf rename to addons/compat_gm/functions/fnc_onCut.sqf diff --git a/optionals/compat_gm/functions/fnc_onCutRopes.sqf b/addons/compat_gm/functions/fnc_onCutRopes.sqf similarity index 100% rename from optionals/compat_gm/functions/fnc_onCutRopes.sqf rename to addons/compat_gm/functions/fnc_onCutRopes.sqf diff --git a/optionals/compat_gm/functions/fnc_onDeployRopes.sqf b/addons/compat_gm/functions/fnc_onDeployRopes.sqf similarity index 100% rename from optionals/compat_gm/functions/fnc_onDeployRopes.sqf rename to addons/compat_gm/functions/fnc_onDeployRopes.sqf diff --git a/optionals/compat_gm/functions/fnc_onPrepare.sqf b/addons/compat_gm/functions/fnc_onPrepare.sqf similarity index 100% rename from optionals/compat_gm/functions/fnc_onPrepare.sqf rename to addons/compat_gm/functions/fnc_onPrepare.sqf diff --git a/optionals/compat_gm/functions/script_component.hpp b/addons/compat_gm/functions/script_component.hpp similarity index 100% rename from optionals/compat_gm/functions/script_component.hpp rename to addons/compat_gm/functions/script_component.hpp diff --git a/optionals/compat_gm/script_component.hpp b/addons/compat_gm/script_component.hpp similarity index 74% rename from optionals/compat_gm/script_component.hpp rename to addons/compat_gm/script_component.hpp index 1d5854d451..6b044b1192 100644 --- a/optionals/compat_gm/script_component.hpp +++ b/addons/compat_gm/script_component.hpp @@ -3,5 +3,3 @@ #include "\z\ace\addons\main\script_mod.hpp" #include "\z\ace\addons\main\script_macros.hpp" - -#include "\z\ace\addons\csw\script_config_macros_csw.hpp" diff --git a/optionals/compat_rhs_afrf3/$PBOPREFIX$ b/addons/compat_rhs_afrf3/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rhs_afrf3/$PBOPREFIX$ rename to addons/compat_rhs_afrf3/$PBOPREFIX$ diff --git a/optionals/compat_rhs_afrf3/CfgAmmo.hpp b/addons/compat_rhs_afrf3/CfgAmmo.hpp similarity index 78% rename from optionals/compat_rhs_afrf3/CfgAmmo.hpp rename to addons/compat_rhs_afrf3/CfgAmmo.hpp index 90a3e64b0a..54ff3bd2c2 100644 --- a/optionals/compat_rhs_afrf3/CfgAmmo.hpp +++ b/addons/compat_rhs_afrf3/CfgAmmo.hpp @@ -154,24 +154,24 @@ class CfgAmmo { class GrenadeHand; class rhs_ammo_rgd5: GrenadeHand { - ace_frag_enabled = 1; - ace_frag_metal = 200; - ace_frag_charge = 110; - ace_frag_gurney_c = 2440; - ace_frag_gurney_k = "3/5"; - ace_frag_classes[] = {"ACE_frag_small_HD"}; - ace_frag_skip = 0; - ace_frag_force = 1; + EGVAR(frag,enabled) = 1; + EGVAR(frag,metal) = 200; + EGVAR(frag,charge) = 110; + EGVAR(frag,gurney_c) = 2440; + EGVAR(frag,gurney_k) = "3/5"; + EGVAR(frag,classes)[] = {"ACE_frag_small_HD"}; + EGVAR(frag,skip) = 0; + EGVAR(frag,force) = 1; }; class rhs_ammo_rgn: rhs_ammo_rgd5 { - ace_frag_enabled = 0; - ace_frag_skip = 1; - ace_frag_force = 0; + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; }; class rhs_ammo_fakel: GrenadeHand { - ace_frag_enabled = 0; - ace_frag_skip = 1; - ace_frag_force = 0; + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; }; class rhs_ammo_fakels: rhs_ammo_fakel {}; class rhs_ammo_zarya2: rhs_ammo_fakels {}; @@ -182,91 +182,44 @@ class CfgAmmo { class rhs_rpg26_rocket: R_PG32V_F {}; class rhs_rpg7v2_pg7vl: rhs_rpg26_rocket {}; class rhs_rpg7v2_og7v: rhs_rpg7v2_pg7vl { - ace_frag_enabled = 1; - ace_frag_metal = 400; - ace_frag_charge = 210; - ace_frag_gurney_c = 2800; - ace_frag_gurney_k = "3/5"; - ace_frag_classes[] = {"ACE_frag_medium_HD"}; - ace_frag_skip = 0; - ace_frag_force = 1; + EGVAR(frag,enabled) = 1; + EGVAR(frag,metal) = 400; + EGVAR(frag,charge) = 210; + EGVAR(frag,gurney_c) = 2800; + EGVAR(frag,gurney_k) = "3/5"; + EGVAR(frag,classes)[] = {"ACE_frag_medium_HD"}; + EGVAR(frag,skip) = 0; + EGVAR(frag,force) = 1; EGVAR(vehicle_damage,incendiary) = 0.1; }; class rhs_rpg7v2_tbg7v: rhs_rpg7v2_pg7vl { - ace_frag_enabled = 0; - ace_frag_skip = 1; - ace_frag_force = 0; + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; EGVAR(vehicle_damage,incendiary) = 0.7; }; class rhs_rshg2_rocket: rhs_rpg7v2_tbg7v { - ace_frag_enabled = 0; - ace_frag_skip = 1; - ace_frag_force = 0; + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; }; class G_40mm_HE; class rhs_g_vog25: G_40mm_HE {}; class rhs_g_vg40tb: rhs_g_vog25 { //Thermobaric - ace_frag_force = 0; + EGVAR(frag,force) = 0; }; class rhs_g_vg40sz: rhs_g_vog25 { //Flashbang - ace_frag_force = 0; + EGVAR(frag,force) = 0; }; class rhs_g_gdm40: rhs_g_vog25 { //Smoke - ace_frag_force = 0; + EGVAR(frag,force) = 0; }; class rhs_g_vg40md_white: rhs_g_vog25 { //Smoke - ace_frag_force = 0; + EGVAR(frag,force) = 0; }; - // ACE Explosives - class MineBase; - class rhs_mine_tm62m_ammo: MineBase { - ace_explosives_defuseObjectPosition[] = {-0.005, 0.025, 0.06}; - }; - class rhs_mine_pmn2_ammo: MineBase { - ace_explosives_defuseObjectPosition[] = {0, 0, 0.012}; - }; - - class ATMine_Range_Ammo; - class rhs_ammo_ptm1: ATMine_Range_Ammo { - ace_explosives_defuseObjectPosition[] = {0, 0.17, 0.02}; - }; - - class APERSMine_Range_Ammo; - class rhs_ammo_pfm1: APERSMine_Range_Ammo { - ace_explosives_defuseObjectPosition[] = {0.015, -0.018, 0}; - }; - - class PipeBombBase; - class rhs_ec75_ammo: PipeBombBase { - ace_explosives_defuseObjectPosition[] = {0, 0.04, 0.02}; - }; - - class rhs_ec200_ammo: rhs_ec75_ammo { - ace_explosives_defuseObjectPosition[] = {0, 0.05, 0.008}; - }; - - class rhs_ec400_ammo: rhs_ec75_ammo { - ace_explosives_defuseObjectPosition[] = {0, 0.03, 0.02}; - }; - - class rhs_mine_msk40p_white_ammo: APERSMine_Range_Ammo { - ace_explosives_defuseObjectPosition[] = {0.025, 0, 0.4}; - }; - - class rhs_mine_sm320_white_ammo: rhs_mine_msk40p_white_ammo { - ace_explosives_defuseObjectPosition[] = {0.01, 0, 0.25}; - }; - - class rhs_mine_ozm72_a_ammo: APERSMine_Range_Ammo { - ace_explosives_defuseObjectPosition[] = {0, -0.125, 0.11}; - }; - - class rhs_mine_ozm72_c_ammo: rhs_mine_ozm72_a_ammo { - ace_explosives_defuseObjectPosition[] = {0, -0.015, 0.12}; - }; class Sh_125mm_APFSDS; class Sh_125mm_HE; class rhs_ammo_bm_base: Sh_125mm_APFSDS { diff --git a/optionals/compat_rhs_afrf3/CfgEventHandlers.hpp b/addons/compat_rhs_afrf3/CfgEventHandlers.hpp similarity index 100% rename from optionals/compat_rhs_afrf3/CfgEventHandlers.hpp rename to addons/compat_rhs_afrf3/CfgEventHandlers.hpp diff --git a/addons/compat_rhs_afrf3/CfgMagazines.hpp b/addons/compat_rhs_afrf3/CfgMagazines.hpp new file mode 100644 index 0000000000..b554686f3d --- /dev/null +++ b/addons/compat_rhs_afrf3/CfgMagazines.hpp @@ -0,0 +1,20 @@ +class cfgMagazines { + class VehicleMagazine; + class rhs_30Rnd_545x39_7N6_AK; + + class rhs_100Rnd_762x54mmR: rhs_30Rnd_545x39_7N6_AK { + ACE_isBelt = 1; + }; + class rhs_mag_127x108mm_50: VehicleMagazine { + ACE_isBelt = 1; + }; + class rhs_mag_127x108mm_150: rhs_mag_127x108mm_50 { + ACE_isBelt = 0; + }; + class rhs_mag_127x108mm_1470: rhs_mag_127x108mm_50 { + ACE_isBelt = 0; + }; + class RHS_mag_VOG30_30: VehicleMagazine { + ACE_isBelt = 1; + }; +}; diff --git a/optionals/compat_rhs_afrf3/CfgVehicles.hpp b/addons/compat_rhs_afrf3/CfgVehicles.hpp similarity index 69% rename from optionals/compat_rhs_afrf3/CfgVehicles.hpp rename to addons/compat_rhs_afrf3/CfgVehicles.hpp index db66255a49..622d764ad2 100644 --- a/optionals/compat_rhs_afrf3/CfgVehicles.hpp +++ b/addons/compat_rhs_afrf3/CfgVehicles.hpp @@ -79,64 +79,15 @@ class CfgVehicles { class RHS_Mi8_base: Heli_Light_02_base_F { EGVAR(map,vehicleLightColor)[] = {1,0,0,0.1}; EGVAR(refuel,fuelCapacity) = 3700; - EGVAR(fastroping,enabled) = 0; - class EventHandlers: EventHandlers { - class RHS_EventHandlers; - }; }; - - class RHS_Mi8amt_base: RHS_Mi8_base { - EGVAR(fastroping,enabled) = 1; - EGVAR(fastroping,ropeOrigins)[] = {{-1.13, 4.67, -0.89}}; - EGVAR(fastroping,onCut) = QFUNC(onCut); - EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); - - class UserActions { - class openDoor; - class closeDoor_L: openDoor { - condition = QUOTE((this doorPhase 'LeftDoor' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); - }; - }; - - class EventHandlers: EventHandlers { - class RHS_EventHandlers: RHS_EventHandlers { - getOut = QUOTE(if !((_this select 0) getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)]) then {_this call rhs_fnc_mi8_doors}); - }; - }; - }; - - class RHS_Mi8_VVS_Base: RHS_Mi8_base {}; - class RHS_Mi8mt_vvs: RHS_Mi8_VVS_Base {}; - class RHS_Mi8mt_Cargo_vvs: RHS_Mi8mt_vvs { - EGVAR(fastroping,enabled) = 1; - EGVAR(fastroping,ropeOrigins)[] = {{-1.13, 4.67, -0.89}}; - EGVAR(fastroping,onCut) = QFUNC(onCut); - EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); - - class UserActions { - class openDoor_L; - class closeDoor_L: openDoor_L { - condition = QUOTE((this doorPhase 'LeftDoor' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); - }; - }; - - class EventHandlers: EventHandlers { - class RHS_EventHandlers: RHS_EventHandlers { - getOut = QUOTE(if !((_this select 0) getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)]) then {_this call rhs_fnc_mi8_doors}); - }; - }; - }; - class Heli_Attack_02_base_F: Helicopter_Base_F {}; class RHS_Ka52_base: Heli_Attack_02_base_F { EGVAR(refuel,fuelCapacity) = 1870; - EGVAR(fastroping,enabled) = 0; }; class RHS_Mi24_base: Heli_Attack_02_base_F { EGVAR(map,vehicleLightColor)[] = {1,0,0,0.1}; EGVAR(refuel,fuelCapacity) = 1851; - EGVAR(fastroping,enabled) = 0; }; class rhs_t80b: rhs_tank_base { @@ -152,22 +103,15 @@ class CfgVehicles { class RHS_Ural_MSV_Base: RHS_Ural_Base {}; class RHS_Ural_Support_MSV_Base_01: RHS_Ural_MSV_Base {}; class RHS_Ural_Fuel_MSV_01: RHS_Ural_Support_MSV_Base_01 { - transportFuel = 0; EGVAR(refuel,hooks)[] = {{-0.05,-3.6,-0.45}}; EGVAR(refuel,fuelCargo) = 10000; }; - class RHS_Ural_Repair_MSV_01: RHS_Ural_Support_MSV_Base_01 { - transportRepair = 0; - EGVAR(repair,canRepair) = 1; - }; class RHS_Ural_Ammo_Base: RHS_Ural_Base { - transportAmmo = 0; - ace_rearm_defaultSupply = 1200; + EGVAR(rearm,defaultSupply) = 1200; }; class rhs_kraz255b1_base; class rhs_kraz255b1_fuel_base: rhs_kraz255b1_base { - transportFuel = 0; EGVAR(refuel,hooks)[] = {{-0.05,-3.6,-0.45}}; EGVAR(refuel,fuelCargo) = 10000; }; @@ -176,21 +120,14 @@ class CfgVehicles { EGVAR(refuel,fuelCapacity) = 210; }; - class rhs_gaz66_vmf: rhs_truck {}; - class rhs_gaz66_repair_base: rhs_gaz66_vmf { - transportRepair = 0; - EGVAR(repair,canRepair) = 1; - }; - + class rhs_gaz66_vmf; class rhs_gaz66_ammo_base: rhs_gaz66_vmf { - transportAmmo = 0; - ace_rearm_defaultSupply = 1200; + EGVAR(rearm,defaultSupply) = 1200; }; class rhs_kamaz5350; class rhs_kamaz5350_ammo_base: rhs_kamaz5350 { - transportAmmo = 0; - ace_rearm_defaultSupply = 1200; + EGVAR(rearm,defaultSupply) = 1200; }; class MRAP_02_base_F; @@ -603,52 +540,7 @@ class CfgVehicles { }; }; - class StaticWeapon: LandVehicle { - class ACE_Actions { - class ACE_MainActions; - }; - }; - class StaticMGWeapon: StaticWeapon {}; - class AT_01_base_F: StaticMGWeapon {}; - - class rhs_SPG9_base: AT_01_base_F { - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = ""; - }; - }; - // ENABLE_CSW_ATTRIBUTE; - class ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_weap_SPG9); - magazineLocation = "_target selectionPosition 'breach'"; - disassembleWeapon = QGVAR(spg9_carry); - disassembleTurret = QEGVAR(csw,spg9Tripod); - desiredAmmo = 1; - ammoLoadTime = 5; - ammoUnloadTime = 3; - }; - }; - class rhs_Kornet_Base: AT_01_base_F { - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = ""; - selection = "tripod"; - }; - }; - // ENABLE_CSW_ATTRIBUTE; - class ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_weap_9K133_launcher); - magazineLocation = "_target selectionPosition 'gun'"; - disassembleWeapon = QGVAR(kornet_carry); - disassembleTurret = ""; - desiredAmmo = 1; - ammoLoadTime = 7; - ammoUnloadTime = 5; - }; - }; - + // Wirecutter Backpacks class rhs_assault_umbts; class rhs_assault_umbts_engineer: rhs_assault_umbts { EGVAR(logistics_wirecutter,hasWirecutter) = 1; @@ -664,7 +556,33 @@ class CfgVehicles { EGVAR(logistics_wirecutter,hasWirecutter) = 1; }; + // Interaction positions for static weapons + // Not a fan of this style of inheritance but it's less of a headache in this case + class StaticWeapon: LandVehicle { + class ACE_Actions { + class ACE_MainActions; + }; + }; + class StaticMGWeapon: StaticWeapon {}; + class AT_01_base_F: StaticMGWeapon {}; class StaticMortar: StaticWeapon {}; + + class rhs_SPG9_base: AT_01_base_F { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + }; + }; + }; + class rhs_Kornet_Base: AT_01_base_F { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + selection = "tripod"; + }; + }; + }; + class rhs_2b14_82mm_Base: StaticMortar { class ACE_Actions: ACE_Actions { class ACE_MainActions: ACE_MainActions { @@ -672,246 +590,5 @@ class CfgVehicles { selection = ""; // no good selections for this mortar }; }; - // ENABLE_CSW_ATTRIBUTE; - class ACE_CSW { - enabled = 1; - magazineLocation = ""; - proxyWeapon = QGVAR(rhs_weap_2b14); - disassembleWeapon = QGVAR(2b14_carry); // carry weapon [CfgWeapons] - disassembleTurret = QEGVAR(csw,mortarBaseplate); // turret [CfgVehicles] - desiredAmmo = 1; - ammoLoadTime = 3; - ammoUnloadTime = 3; - }; - }; - - class rhs_nsv_tripod_base: StaticMGWeapon { - class ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_weap_nsvt_effects); - magazineLocation = "_target selectionPosition 'magazine'"; - disassembleWeapon = QGVAR(nsv_carry); - disassembleTurret = QEGVAR(csw,kordTripodLow); - desiredAmmo = 50; - ammoLoadTime = 10; - ammoUnloadTime = 8; - }; - }; - - class RHS_KORD_Base: rhs_nsv_tripod_base { - class ACE_CSW: ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_weap_KORD); - disassembleWeapon = QGVAR(kord_carry); - disassembleTurret = QEGVAR(csw,kordTripodLow); - }; - }; - - class RHS_KORD_high_base: RHS_KORD_Base { - class ACE_CSW: ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_weap_KORD); - disassembleWeapon = QGVAR(kord_carry); - disassembleTurret = QEGVAR(csw,kordTripod); - }; - }; - - class StaticGrenadeLauncher: StaticWeapon {}; - class RHS_AGS30_TriPod_base: StaticGrenadeLauncher { - // ENABLE_CSW_ATTRIBUTE; - class ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_weap_AGS30); - magazineLocation = "_target selectionPosition 'magazine'"; - disassembleWeapon = QGVAR(ags30_carry); - disassembleTurret = QEGVAR(csw,sag30Tripod); - desiredAmmo = 30; - ammoLoadTime = 10; - ammoUnloadTime = 8; - }; - }; - - class rhs_SPG9M_base: rhs_SPG9_base { - class ACE_CSW: ACE_CSW { - enabled = 1; - disassembleWeapon = QGVAR(spg9m_carry); - }; - }; - - class rhs_Metis_Base: AT_01_base_F { - // ENABLE_CSW_ATTRIBUTE; - class ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_weap_9K115_2_launcher); - magazineLocation = "_target selectionPosition 'gun'"; - disassembleWeapon = QGVAR(metis_carry); - disassembleTurret = ""; - desiredAmmo = 1; - ammoLoadTime = 7; - ammoUnloadTime = 5; - }; - }; - - // ACE Explosives - class Items_base_F; - class ACE_Explosives_Place: Items_base_F { - class ACE_Actions { - class ACE_MainActions; - }; - }; - - class ACE_Explosives_Place_rhs_mine_tm62m: ACE_Explosives_Place { - displayName = "$STR_RHS_CFGMAGAZINES_TM62M0"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_tm62m"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[0.005, -0.025, 0.06]"; - }; - }; - }; - - class ACE_Explosives_Place_rhs_mine_pmn2: ACE_Explosives_Place { - displayName = "$STR_RHS_CFGMAGAZINES_PMN20"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_pmn2"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[0, 0, 0.012]"; - }; - }; - }; - - class ACE_Explosives_Place_rhs_mine_ptm1: ACE_Explosives_Place { - displayName = "$STR_RHS_PTM1_NAME"; - model = "\rhsafrf\addons\rhs_airweapons\rhs_m_ptm1_d"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[0, -0.17, 0.02]"; - }; - }; - }; - - class ACE_Explosives_Place_rhs_mine_pfm1: ACE_Explosives_Place { - displayName = "$STR_RHS_PFM1_NAME"; - model = "\rhsafrf\addons\rhs_airweapons\rhs_m_pfm1_d"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.015, 0.018, 0]"; - }; - }; - }; - - class ACE_Explosives_Place_rhs_ec75: ACE_Explosives_Place { - displayName = "$STR_RHS_CFGMAGAZINES_EC75"; - model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec75_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[0, -0.04, 0.02]"; - }; - }; - }; - - class ACE_Explosives_Place_rhs_ec75_sand: ACE_Explosives_Place_rhs_ec75 { - displayName = "$STR_RHS_CFGMAGAZINES_EC75_SAND"; - model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec75_sand_e"; - }; - - class ACE_Explosives_Place_rhs_ec200: ACE_Explosives_Place { - displayName = "$STR_RHS_CFGMAGAZINES_EC200"; - model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec200_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[0, -0.05, 0.008]"; - }; - }; - }; - - class ACE_Explosives_Place_rhs_ec200_sand: ACE_Explosives_Place_rhs_ec200 { - displayName = "$STR_RHS_CFGMAGAZINES_EC200_SAND"; - model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec200_sand_e"; - }; - - class ACE_Explosives_Place_rhs_ec400: ACE_Explosives_Place { - displayName = "$STR_RHS_CFGMAGAZINES_EC400"; - model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec400_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[0, -0.03, 0.02]"; - }; - }; - }; - - class ACE_Explosives_Place_rhs_ec400_sand: ACE_Explosives_Place_rhs_ec400 { - displayName = "$STR_RHS_CFGMAGAZINES_EC400_SAND"; - model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec400_sand_e"; - }; - - class ACE_Explosives_Place_rhs_mine_msk40p_white: ACE_Explosives_Place { - displayName = "$STR_RHS_MINE_MSK40P_W_MAG_DISPLAYNAME"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_white_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.025, 0, 0.4]"; - }; - }; - }; - - class ACE_Explosives_Place_rhs_mine_msk40p_red: ACE_Explosives_Place_rhs_mine_msk40p_white { - displayName = "$STR_RHS_MINE_MSK40P_R_MAG_DISPLAYNAME"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_red_e"; - }; - - class ACE_Explosives_Place_rhs_mine_msk40p_green: ACE_Explosives_Place_rhs_mine_msk40p_white { - displayName = "$STR_RHS_MINE_MSK40P_G_MAG_DISPLAYNAME"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_green_e"; - }; - - class ACE_Explosives_Place_rhs_mine_msk40p_blue: ACE_Explosives_Place_rhs_mine_msk40p_white { - displayName = "$STR_RHS_MINE_MSK40P_B_MAG_DISPLAYNAME"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_blue_e"; - }; - - class ACE_Explosives_Place_rhs_mine_sm320_white: ACE_Explosives_Place { - displayName = "$STR_RHS_MINE_SM320_W_MAG_DISPLAYNAME"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_sm320_white_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.01, 0, 0.25]"; - }; - }; - }; - - class ACE_Explosives_Place_rhs_mine_sm320_red: ACE_Explosives_Place_rhs_mine_sm320_white { - displayName = "$STR_RHS_MINE_SM320_R_MAG_DISPLAYNAME"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_sm320_red_e"; - }; - - class ACE_Explosives_Place_rhs_mine_sm320_green: ACE_Explosives_Place_rhs_mine_sm320_white { - displayName = "$STR_RHS_MINE_SM320_G_MAG_DISPLAYNAME"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_sm320_green_e"; - }; - - class ACE_Explosives_Place_rhs_mine_ozm72_a: ACE_Explosives_Place { - displayName = "$STR_RHS_CFGMAGAZINES_OZM72A"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_ozm72_a_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[0, 0.125, 0.11]"; - }; - }; - }; - - class ACE_Explosives_Place_rhs_mine_ozm72_b: ACE_Explosives_Place_rhs_mine_ozm72_a { - displayName = "$STR_RHS_CFGMAGAZINES_OZM72B"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_ozm72_b_e"; - }; - - class ACE_Explosives_Place_rhs_mine_ozm72_c: ACE_Explosives_Place_rhs_mine_ozm72_a { - displayName = "$STR_RHS_CFGMAGAZINES_OZM72C"; - model = "\rhsafrf\addons\rhs_weapons\mines\rhs_ozm72_c_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[0, 0.015, 0.12]"; - }; - }; }; }; diff --git a/addons/compat_rhs_afrf3/CfgWeapons.hpp b/addons/compat_rhs_afrf3/CfgWeapons.hpp new file mode 100644 index 0000000000..17aa535a79 --- /dev/null +++ b/addons/compat_rhs_afrf3/CfgWeapons.hpp @@ -0,0 +1,170 @@ +class CfgWeapons { + class hgun_Rook40_F; + class rhs_weap_pya: hgun_Rook40_F { + ACE_barrelTwist = 254.0; + ACE_barrelLength = 111.76; + }; + class Pistol_Base_F; + class rhs_weap_makarov_pm: rhs_weap_pya { + ACE_barrelTwist = 240.03; + ACE_barrelLength = 93.472; + }; + class rhs_weap_ak74m_Base_F; + class rhs_weap_ak74m: rhs_weap_ak74m_Base_F { + ACE_RailHeightAboveBore = -0.456233; + ACE_barrelTwist = 199.898; + ACE_barrelLength = 414.02; + }; + class rhs_weap_ak103_base; + class rhs_weap_ak104: rhs_weap_ak103_base { + ACE_barrelLength = 314.96; + }; + class rhs_weap_ak105: rhs_weap_ak74m { + ACE_barrelLength = 314.96; + }; + class rhs_weap_akm: rhs_weap_ak74m { + ACE_RailHeightAboveBore = -0.456233;//from rhs_weap_akmn and rhs_weap_ak74m + ACE_barrelTwist = 199.898; + ACE_barrelLength = 414.02; + }; + class rhs_weap_aks74; + class rhs_weap_aks74u: rhs_weap_aks74 { + ACE_RailHeightAboveBore = -0.30262; + ACE_barrelTwist = 160.02; + ACE_barrelLength = 210.82; + }; + class rhs_weap_asval: rhs_weap_ak74m { + ACE_barrelTwist = 210.82; + ACE_barrelLength = 200.66; + }; + class rhs_weap_svd: rhs_weap_ak74m { + ACE_RailHeightAboveBore = -0.617396; + ACE_barrelTwist = 238.76; + ACE_barrelLength = 619.76; + }; + class rhs_weap_svdp; + class rhs_weap_svdp_npz: rhs_weap_svdp { + ACE_RailHeightAboveBore = 4.3348; + }; + class rhs_weap_svdp_wd: rhs_weap_svdp { + ACE_RailHeightAboveBore = -0.617396; + }; + class rhs_weap_svdp_wd_npz: rhs_weap_svdp_wd { + ACE_RailHeightAboveBore = 4.3348; + }; + class rhs_weap_svds: rhs_weap_svdp { + ACE_RailHeightAboveBore = -0.617396; + ACE_barrelTwist = 238.76; + ACE_barrelLength = 563.88; + }; + class rhs_weap_svds_npz: rhs_weap_svds { + ACE_RailHeightAboveBore = 4.3348; + }; + class rhs_weap_rpk_base; + class rhs_weap_rpk74_base: rhs_weap_rpk_base { + ACE_barrelLength = 590.00; + ACE_barrelTwist = 195.072; + }; + class rhs_pkp_base; + class rhs_weap_pkp: rhs_pkp_base { + ACE_barrelTwist = 240.03; + ACE_barrelLength = 657.86; + }; + class rhs_weap_pkm: rhs_weap_pkp { + EGVAR(overheating,allowSwapBarrel) = 1; + ACE_barrelTwist = 240.03; + ACE_barrelLength = 645.16; + }; + class rhs_weap_orsis_Base_F; + class rhs_weap_t5000: rhs_weap_orsis_Base_F { // http://en.orsis.com/production/catalog/19046/ + ACE_barrelTwist = 254.0; // 1:10" + ACE_barrelLength = 698.5; // 27.5" + ACE_RailHeightAboveBore = 2.12198; + }; + + class Launcher_Base_F; + class rhs_weap_rpg7: Launcher_Base_F { + EGVAR(reloadlaunchers,enabled) = 1; + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,offset) = 0.9; + }; + + class rhs_weap_rpg26: Launcher_Base_F { + EGVAR(overpressure,range) = 10; + EGVAR(overpressure,angle) = 50; + EGVAR(overpressure,offset) = 0.65; + }; + + class rhs_weap_rpg18: rhs_weap_rpg26 { + EGVAR(overpressure,angle) = 45; + EGVAR(overpressure,offset) = 1; + }; + + class rhs_weap_strela; + class rhs_weap_igla: rhs_weap_strela { + EGVAR(overpressure,range) = 6; + EGVAR(overpressure,angle) = 40; + EGVAR(overpressure,damage) = 0.6; + EGVAR(overpressure,offset) = 1.65; + }; + + #define HEARING_PROTECTION_VICCREW EGVAR(hearing,protection) = 0.85; EGVAR(hearing,lowerVolume) = 0.6; + #define HEARING_PROTECTION_EARMUFF EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0.5; + #define HEARING_PROTECTION_PELTOR EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0; + class H_HelmetB; + class rhs_tsh4: H_HelmetB { + HEARING_PROTECTION_VICCREW + }; + + class rhs_6b47_bare; + class rhs_6b48: rhs_6b47_bare { + HEARING_PROTECTION_VICCREW + }; + + class rhs_zsh7a: H_HelmetB { + HEARING_PROTECTION_VICCREW + }; + class rhs_zsh7a_alt: rhs_zsh7a { + ACE_Protection = 1; + }; + class rhs_zsh7a_mike; + class rhs_zsh7a_mike_alt: rhs_zsh7a_mike { + ACE_Protection = 1; + }; + class rhs_zsh7a_mike_green; + class rhs_zsh7a_mike_green_alt: rhs_zsh7a_mike_green { + ACE_Protection = 1; + }; + + class rhs_gssh18: H_HelmetB { + HEARING_PROTECTION_EARMUFF + }; + + class rhs_6b47; + class rhs_6b47_6m2: rhs_6b47 { + HEARING_PROTECTION_PELTOR + }; + class rhs_6b47_6m2_1: rhs_6b47 { + HEARING_PROTECTION_PELTOR + }; + + class rhs_6m2: H_HelmetB { + HEARING_PROTECTION_PELTOR + }; + + class rhs_weap_d81; + class rhs_weap_2a70: rhs_weap_d81 { // "Low pressure" 100mm cannon + EGVAR(overpressure,range) = 15; + EGVAR(overpressure,damage) = 0.5; + }; + class cannon_120mm; + class rhs_weap_2a28_base: cannon_120mm { // "Low pressure" + EGVAR(overpressure,range) = 15; + EGVAR(overpressure,damage) = 0.5; + }; + + class rhs_uniform_flora; + class rhs_uniform_df15: rhs_uniform_flora { + ACE_GForceCoef = 0.8; + }; +}; diff --git a/optionals/compat_rhs_afrf3/XEH_PREP.hpp b/addons/compat_rhs_afrf3/XEH_PREP.hpp similarity index 100% rename from optionals/compat_rhs_afrf3/XEH_PREP.hpp rename to addons/compat_rhs_afrf3/XEH_PREP.hpp diff --git a/optionals/compat_rhs_afrf3/XEH_postInit.sqf b/addons/compat_rhs_afrf3/XEH_postInit.sqf similarity index 100% rename from optionals/compat_rhs_afrf3/XEH_postInit.sqf rename to addons/compat_rhs_afrf3/XEH_postInit.sqf diff --git a/optionals/compat_rhs_afrf3/XEH_preInit.sqf b/addons/compat_rhs_afrf3/XEH_preInit.sqf similarity index 100% rename from optionals/compat_rhs_afrf3/XEH_preInit.sqf rename to addons/compat_rhs_afrf3/XEH_preInit.sqf diff --git a/optionals/compat_rhs_afrf3/XEH_preStart.sqf b/addons/compat_rhs_afrf3/XEH_preStart.sqf similarity index 100% rename from optionals/compat_rhs_afrf3/XEH_preStart.sqf rename to addons/compat_rhs_afrf3/XEH_preStart.sqf diff --git a/optionals/compat_rhs_afrf3/CfgMagazineGroups.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgMagazineGroups.hpp similarity index 100% rename from optionals/compat_rhs_afrf3/CfgMagazineGroups.hpp rename to addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgMagazineGroups.hpp diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgMagazines.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgMagazines.hpp new file mode 100644 index 0000000000..d94f12326b --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgMagazines.hpp @@ -0,0 +1,143 @@ +class CfgMagazines { + // RHS magazines for crew handled ammo + class rhs_mag_9M131M; + class GVAR(mag_9M131M): rhs_mag_9M131M { + scope = 2; + displayName = CSTRING(mag_9M131M_displayName); + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_metis_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_9M131F; + class GVAR(mag_9M131F): rhs_mag_9M131F { + scope = 2; + displayName = CSTRING(mag_9M131F_displayName); + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_metis_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_9m133; + class GVAR(mag_9m133): rhs_mag_9m133 { + scope = 2; + displayName = CSTRING(mag_9m133_displayName); + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_9m133f; + class GVAR(mag_9m133f): rhs_mag_9m133f { + scope = 2; + displayName = CSTRING(mag_9m133f_displayName); + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_9m1331; + class GVAR(mag_9m1331): rhs_mag_9m1331 { + scope = 2; + displayName = CSTRING(mag_9m1331_displayName); + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_9m133m2; + class GVAR(mag_9m133m2): rhs_mag_9m133m2 { + scope = 2; + displayName = CSTRING(mag_9m133m2_displayName); + type = 256; + count = 1; + mass = 55; + model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; + picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; + }; + class rhs_mag_PG9V; + class GVAR(mag_PG9V): rhs_mag_PG9V { + scope = 2; + displayName = CSTRING(mag_PG9V_displayName); + type = 256; + count = 1; + mass = 80; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; + }; + class rhs_mag_PG9N; + class GVAR(mag_PG9N): rhs_mag_PG9N { + scope = 2; + displayName = CSTRING(mag_PG9N_displayName); + type = 256; + count = 1; + mass = 80; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; + }; + class rhs_mag_PG9VNT; + class GVAR(mag_PG9VNT): rhs_mag_PG9VNT { + scope = 2; + displayName = CSTRING(mag_PG9VNT_displayName); + type = 256; + count = 1; + mass = 80; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; + }; + class rhs_mag_OG9VM; + class GVAR(mag_OG9VM): rhs_mag_OG9VM { + scope = 2; + displayName = CSTRING(mag_OG9VM_displayName); + type = 256; + count = 1; + mass = 80; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; + }; + class rhs_mag_OG9V; + class GVAR(mag_OG9V): rhs_mag_OG9V { + scope = 2; + displayName = CSTRING(mag_OG9V_displayName); + type = 256; + count = 1; + mass = 80; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; + }; + class RHS_mag_VOG30_30; + class GVAR(mag_VOG30_30): RHS_mag_VOG30_30 { + scope = 2; + displayName = CSTRING(mag_VOG30_30_displayName); + type = 256; + count = 30; + mass = 40; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); + }; + class RHS_mag_GPD30_30; + class GVAR(mag_GPD30_30): RHS_mag_GPD30_30 { + scope = 2; + displayName = CSTRING(mag_GPD30_30_displayName); + type = 256; + count = 30; + mass = 40; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); + }; + class RHS_mag_VOG17m_30; + class GVAR(mag_VOG17m_30): RHS_mag_VOG17m_30 { + scope = 2; + displayName = CSTRING(mag_VOG17m_30_displayName); + type = 256; + count = 30; + mass = 40; + model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; + picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgVehicles.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgVehicles.hpp new file mode 100644 index 0000000000..fd889cd096 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgVehicles.hpp @@ -0,0 +1,114 @@ +class CfgVehicles { + class AT_01_base_F; + class StaticMortar; + class StaticMGWeapon; + class StaticGrenadeLauncher; + + class rhs_SPG9_base: AT_01_base_F { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_SPG9); + magazineLocation = "_target selectionPosition 'breach'"; + disassembleWeapon = QGVAR(spg9_carry); + disassembleTurret = QEGVAR(csw,spg9Tripod); + desiredAmmo = 1; + ammoLoadTime = 5; + ammoUnloadTime = 3; + }; + }; + + class rhs_SPG9M_base: rhs_SPG9_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + disassembleWeapon = QGVAR(spg9m_carry); + }; + }; + + class rhs_Kornet_Base: AT_01_base_F { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_9K133_launcher); + magazineLocation = "_target selectionPosition 'gun'"; + disassembleWeapon = QGVAR(kornet_carry); + disassembleTurret = ""; + desiredAmmo = 1; + ammoLoadTime = 7; + ammoUnloadTime = 5; + }; + }; + + class rhs_Metis_Base: AT_01_base_F { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_9K115_2_launcher); + magazineLocation = "_target selectionPosition 'gun'"; + disassembleWeapon = QGVAR(metis_carry); + disassembleTurret = ""; + desiredAmmo = 1; + ammoLoadTime = 7; + ammoUnloadTime = 5; + }; + }; + + class rhs_2b14_82mm_Base: StaticMortar { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + magazineLocation = ""; + proxyWeapon = QGVAR(rhs_weap_2b14); + disassembleWeapon = QGVAR(2b14_carry); // carry weapon [CfgWeapons] + disassembleTurret = QEGVAR(csw,mortarBaseplate); // turret [CfgVehicles] + desiredAmmo = 1; + ammoLoadTime = 3; + ammoUnloadTime = 3; + }; + }; + + class rhs_nsv_tripod_base: StaticMGWeapon { + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_nsvt_effects); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(nsv_carry); + disassembleTurret = QEGVAR(csw,kordTripodLow); + desiredAmmo = 50; + ammoLoadTime = 10; + ammoUnloadTime = 8; + }; + }; + + class RHS_KORD_Base: rhs_nsv_tripod_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_KORD); + disassembleWeapon = QGVAR(kord_carry); + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; + }; + + class RHS_KORD_high_base: RHS_KORD_Base { + class ACE_CSW: ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_KORD); + disassembleWeapon = QGVAR(kord_carry); + disassembleTurret = QEGVAR(csw,kordTripod); + }; + }; + + class RHS_AGS30_TriPod_base: StaticGrenadeLauncher { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_AGS30); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(ags30_carry); + disassembleTurret = QEGVAR(csw,sag30Tripod); + desiredAmmo = 30; + ammoLoadTime = 10; + ammoUnloadTime = 8; + }; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgWeapons.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgWeapons.hpp new file mode 100644 index 0000000000..1e8f4dbdfd --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/CfgWeapons.hpp @@ -0,0 +1,191 @@ +class CfgWeapons { + CREATE_CSW_PROXY(rhs_weap_2b14); + CREATE_CSW_PROXY(rhs_weap_nsvt_effects); + CREATE_CSW_PROXY(rhs_weap_KORD); + CREATE_CSW_PROXY(RHS_weap_AGS30); + CREATE_CSW_PROXY(rhs_weap_SPG9); + CREATE_CSW_PROXY(rhs_weap_9K133_launcher); + CREATE_CSW_PROXY(rhs_weap_9K115_2_launcher); + + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; + + class GVAR(2b14_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "weapon"; + deployTime = 20; + pickupTime = 25; + class assembleTo { + EGVAR(csw,mortarBaseplate) = "rhs_2b14_82mm_msv"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + // One WeaponSlot with a positive value for iconScale forces game to use icon overlay method. + // Required, because the inventory icon has no accessory variants. + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 670; // 2B14 Mortar Weight + }; + displayName = ECSTRING(CSW,2b14_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_2b14_82mm_msv_ca.paa"; + }; + + class GVAR(nsv_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,kordTripodLow) = "RHS_NSV_TriPod_MSV"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 550; + }; + displayName = ECSTRING(CSW,nsv_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\RHS_NSV_TriPod_MSV_ca.paa"; + }; + + class GVAR(kord_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,kordTripod) = "rhs_KORD_high_MSV"; + EGVAR(csw,kordTripodLow) = "rhs_KORD_MSV"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 550; + }; + displayName = ECSTRING(CSW,kord_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_KORD_MSV_ca.paa"; + }; + + class GVAR(ags30_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,sag30Tripod) = "RHS_AGS30_TriPod_MSV"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 400; // https://odin.tradoc.army.mil/mediawiki/index.php/AGS-17_Russian_30mm_Automatic_Grenade_Launcher + }; + displayName = ECSTRING(CSW,ags30_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\RHS_AGS30_TriPod_MSV_ca.paa"; + }; + + class GVAR(spg9_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,spg9Tripod) = "rhs_SPG9_INS"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 1000; + }; + displayName = ECSTRING(csw,spg9_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_SPG9_INS_ca.paa"; + }; + + class GVAR(spg9m_carry): GVAR(spg9_carry) { + class ACE_CSW: ACE_CSW { + class assembleTo { + EGVAR(csw,spg9Tripod) = "rhs_SPG9M_MSV"; + }; + }; + displayName = ECSTRING(csw,spg9m_tube); + author = ECSTRING(common,ACETeam); + }; + + class GVAR(metis_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "mount"; + deployTime = 4; + pickupTime = 4; + deploy = "rhs_Metis_9k115_2_msv"; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 300; + }; + displayName = ECSTRING(csw,metis_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_Metis_9k115_2_msv_ca.paa"; + }; + + class GVAR(kornet_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "mount"; + deployTime = 4; + pickupTime = 4; + deploy = "rhs_Kornet_9M133_2_msv"; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 600; + }; + displayName = ECSTRING(csw,kornet_launcher); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_Kornet_9M133_2_msv_ca.paa"; + }; +}; diff --git a/optionals/compat_rhs_afrf3/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/config.cpp similarity index 73% rename from optionals/compat_rhs_afrf3/config.cpp rename to addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/config.cpp index ddd2d598fe..71ddf3b478 100644 --- a/optionals/compat_rhs_afrf3/config.cpp +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/config.cpp @@ -1,23 +1,27 @@ #include "script_component.hpp" + +// Config will be binerized, so this include is only required at build-time #include "\z\ace\addons\csw\script_config_macros_csw.hpp" class CfgPatches { class ADDON { - name = COMPONENT_NAME; + name = QUOTE(COMPONENT); units[] = {}; weapons[] = {QGVAR(2b14_carry), QGVAR(nsv_carry), QGVAR(kord_carry), QGVAR(ags30_carry), QGVAR(spg9_carry), QGVAR(spg9m_carry), QGVAR(metis_carry), QGVAR(kornet_carry)}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_explosives", "ace_csw", "ace_rearm", "ace_refuel", "ace_repair", "rhs_main_loadorder"}; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_csw" + }; author = ECSTRING(common,ACETeam); authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; url = ECSTRING(main,URL); + skipWhenMissingDependencies = 1; VERSION_CONFIG; }; }; -#include "CfgAmmo.hpp" -#include "CfgEventHandlers.hpp" #include "CfgMagazines.hpp" -#include "CfgWeapons.hpp" -#include "CfgVehicles.hpp" #include "CfgMagazineGroups.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/script_component.hpp new file mode 100644 index 0000000000..318b08f74f --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_afrf3\script_component.hpp" + +#define SUBCOMPONENT csw +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/optionals/compat_rhs_afrf3/stringtable.xml b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/stringtable.xml similarity index 89% rename from optionals/compat_rhs_afrf3/stringtable.xml rename to addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/stringtable.xml index b0a9b33d6a..ba168178d9 100644 --- a/optionals/compat_rhs_afrf3/stringtable.xml +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_csw/stringtable.xml @@ -1,7 +1,7 @@ - - + + [CSW] VOG-17M [CSW] VOG-17M [CSW] VOG-17M @@ -15,7 +15,7 @@ [CSW] VOG-17M [班组] VOG-17M - + [CSW] VOG-30 [CSW] VOG-30 [CSW] VOG-30 @@ -29,7 +29,7 @@ [CSW] VOG-30 [班组] VOG-30 - + [CSW] GPD-30 [CSW] GPD-30 [CSW] GPD-30 @@ -43,7 +43,7 @@ [CSW] GPD-30 [班组] GPD-30 - + [CSW] ATGM 9M131M [CSW] ATGM 9M131M [CSW] ATGM 9M131M @@ -57,7 +57,7 @@ [CSW] ATGM 9M131M [班组] 9M131M 反坦克导弹 - + [CSW] ATGM 9M131F [CSW] ATGM 9M131F [CSW] ATGM 9M131F @@ -71,7 +71,7 @@ [CSW] ATGM 9M131F [班组] 9M131F 反坦克导弹 - + [CSW] ATGM 9M133F [CSW] ATGM 9M133F [CSW] ATGM 9M133F @@ -85,7 +85,7 @@ [CSW] ATGM 9M133F [班组] 9M133F 反坦克导弹 - + [CSW] ATGM 9M133 [CSW] ATGM 9M133 [CSW] ATGM 9M133 @@ -99,7 +99,7 @@ [CSW] ATGM 9M133 [班组] 9M133 反坦克导弹 - + [CSW] ATGM 9M133-1 [CSW] ATGM 9M133-1 [CSW] ATGM 9M133-1 @@ -113,7 +113,7 @@ [CSW] ATGM 9M133-1 [班组] 9M133-1 反坦克导弹 - + [CSW] ATGM 9M133M2 [CSW] ATGM 9M133M2 [CSW] ATGM 9M133M2 @@ -127,7 +127,7 @@ [CSW] ATGM 9M133M2 [班组] 9M133M2 反坦克导弹 - + [CSW] HEAT PG-9V [CSW] HEAT PG-9V [CSW] HEAT PG-9V @@ -141,7 +141,7 @@ [CSW] HEAT PG-9V [班组] PG-9V 破甲弹 - + [CSW] HEAT PG-9N [CSW] HEAT PG-9N [CSW] HEAT PG-9N @@ -155,7 +155,7 @@ [CSW] HEAT PG-9N [班组] PG-9N 破甲弹 - + [CSW] HEAT PG-9VNT [CSW] HEAT PG-9VNT [CSW] HEAT PG-9VNT @@ -169,7 +169,7 @@ [CSW] HEAT PG-9VNT [班组] PG-9VN 破甲弹 - + [CSW] HE-FRAG OG-9V [CSW] HE-FRAG OG-9V [CSW] HE-FRAG OG-9V @@ -183,7 +183,7 @@ [CSW] HE-FRAG OG-9V [班组] OG-9V 高爆破片弹 - + [CSW] HE-FRAG OG-9VM [CSW] HE-FRAG OG-9VM [CSW] HE-FRAG OG-9VM diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgAmmo.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgAmmo.hpp new file mode 100644 index 0000000000..fd994e3f99 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgAmmo.hpp @@ -0,0 +1,50 @@ +class CfgAmmo { + // ACE Explosives + class MineBase; + class rhs_mine_tm62m_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {-0.005, 0.025, 0.06}; + }; + + class rhs_mine_pmn2_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.012}; + }; + + class ATMine_Range_Ammo; + class rhs_ammo_ptm1: ATMine_Range_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.17, 0.02}; + }; + + class APERSMine_Range_Ammo; + class rhs_ammo_pfm1: APERSMine_Range_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0.015, -0.018, 0}; + }; + + class PipeBombBase; + class rhs_ec75_ammo: PipeBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.04, 0.02}; + }; + + class rhs_ec200_ammo: rhs_ec75_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.05, 0.008}; + }; + + class rhs_ec400_ammo: rhs_ec75_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.03, 0.02}; + }; + + class rhs_mine_msk40p_white_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0.025, 0, 0.4}; + }; + + class rhs_mine_sm320_white_ammo: rhs_mine_msk40p_white_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0.01, 0, 0.25}; + }; + + class rhs_mine_ozm72_a_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, -0.125, 0.11}; + }; + + class rhs_mine_ozm72_c_ammo: rhs_mine_ozm72_a_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, -0.015, 0.12}; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgMagazines.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgMagazines.hpp new file mode 100644 index 0000000000..4f8e808bd5 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgMagazines.hpp @@ -0,0 +1,147 @@ +class CfgMagazines { + // ACE Explosives + class ATMine_Range_Mag; + class rhs_mine_tm62m_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_tm62m); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.09; + }; + }; + }; + + class rhs_mine_pmn2_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_pmn2); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.02; + }; + }; + }; + + class rhs_mag_mine_ptm1: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ptm1); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.04; + }; + }; + }; + + class rhs_mag_mine_pfm1: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_pfm1); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.02; + }; + }; + }; + + class rhs_ec75_mag: ATMine_Range_Mag { + EGVAR(explosives,DelayTime) = 1; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec75); + useAction = 0; + class ACE_Triggers { + SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; + class Timer { + FuseTime = 0.5; + }; + class Command { + FuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + class DeadmanSwitch: Command {}; + }; + }; + + class rhs_ec75_sand_mag: rhs_ec75_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec75_sand); + }; + + class rhs_ec200_mag: rhs_ec75_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec200); + }; + + class rhs_ec200_sand_mag: rhs_ec200_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec200_sand); + }; + + class rhs_ec400_mag: rhs_ec75_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec400); + }; + + class rhs_ec400_sand_mag: rhs_ec400_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec400_sand); + }; + + class rhs_mine_msk40p_white_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_white); + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.07; + }; + }; + }; + + class rhs_mine_msk40p_red_mag: rhs_mine_msk40p_white_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_red); + }; + + class rhs_mine_msk40p_green_mag: rhs_mine_msk40p_white_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_green); + }; + + class rhs_mine_msk40p_blue_mag: rhs_mine_msk40p_white_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_blue); + }; + + class rhs_mine_sm320_white_mag: rhs_mine_msk40p_white_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_white); + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.05; + }; + }; + }; + + class rhs_mine_sm320_red_mag: rhs_mine_sm320_white_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_red); + }; + + class rhs_mine_sm320_green_mag: rhs_mine_sm320_white_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_green); + }; + + class rhs_mine_ozm72_a_mag: ATMine_Range_Mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_a); + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.04; + }; + }; + }; + + class rhs_mine_ozm72_b_mag: rhs_mine_ozm72_a_mag { + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_b); + }; + + class rhs_mine_ozm72_c_mag: rhs_mine_ozm72_a_mag { + EGVAR(explosives,DelayTime) = 1; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_c); + useAction = 0; + class ACE_Triggers { + SupportedTriggers[] = {"Command", "MK16_Transmitter"}; + class Command { + FuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + }; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgVehicles.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgVehicles.hpp new file mode 100644 index 0000000000..8e874d8d11 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/CfgVehicles.hpp @@ -0,0 +1,164 @@ +class CfgVehicles { + // ACE Explosives + class Items_base_F; + class EGVAR(explosives,Place): Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + }; + + class EGVAR(explosives,Place_rhs_mine_tm62m): EGVAR(explosives,Place) { + displayName = "$STR_RHS_CFGMAGAZINES_TM62M0"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_tm62m"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0.005, -0.025, 0.06]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhs_mine_pmn2): EGVAR(explosives,Place) { + displayName = "$STR_RHS_CFGMAGAZINES_PMN20"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_pmn2"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0, 0.012]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhs_mine_ptm1): EGVAR(explosives,Place) { + displayName = "$STR_RHS_PTM1_NAME"; + model = "\rhsafrf\addons\rhs_airweapons\rhs_m_ptm1_d"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.17, 0.02]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhs_mine_pfm1): EGVAR(explosives,Place) { + displayName = "$STR_RHS_PFM1_NAME"; + model = "\rhsafrf\addons\rhs_airweapons\rhs_m_pfm1_d"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.015, 0.018, 0]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhs_ec75): EGVAR(explosives,Place) { + displayName = "$STR_RHS_CFGMAGAZINES_EC75"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec75_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.04, 0.02]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhs_ec75_sand): EGVAR(explosives,Place_rhs_ec75) { + displayName = "$STR_RHS_CFGMAGAZINES_EC75_SAND"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec75_sand_e"; + }; + + class EGVAR(explosives,Place_rhs_ec200): EGVAR(explosives,Place) { + displayName = "$STR_RHS_CFGMAGAZINES_EC200"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec200_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.05, 0.008]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhs_ec200_sand): EGVAR(explosives,Place_rhs_ec200) { + displayName = "$STR_RHS_CFGMAGAZINES_EC200_SAND"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec200_sand_e"; + }; + + class EGVAR(explosives,Place_rhs_ec400): EGVAR(explosives,Place) { + displayName = "$STR_RHS_CFGMAGAZINES_EC400"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec400_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.03, 0.02]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhs_ec400_sand): EGVAR(explosives,Place_rhs_ec400) { + displayName = "$STR_RHS_CFGMAGAZINES_EC400_SAND"; + model = "\rhsafrf\addons\rhs_weapons2\explosives\rhs_ec400_sand_e"; + }; + + class EGVAR(explosives,Place_rhs_mine_msk40p_white): EGVAR(explosives,Place) { + displayName = "$STR_RHS_MINE_MSK40P_W_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_white_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.025, 0, 0.4]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhs_mine_msk40p_red): EGVAR(explosives,Place_rhs_mine_msk40p_white) { + displayName = "$STR_RHS_MINE_MSK40P_R_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_red_e"; + }; + + class EGVAR(explosives,Place_rhs_mine_msk40p_green): EGVAR(explosives,Place_rhs_mine_msk40p_white) { + displayName = "$STR_RHS_MINE_MSK40P_G_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_green_e"; + }; + + class EGVAR(explosives,Place_rhs_mine_msk40p_blue): EGVAR(explosives,Place_rhs_mine_msk40p_white) { + displayName = "$STR_RHS_MINE_MSK40P_B_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_msk40p_blue_e"; + }; + + class EGVAR(explosives,Place_rhs_mine_sm320_white): EGVAR(explosives,Place) { + displayName = "$STR_RHS_MINE_SM320_W_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_sm320_white_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.01, 0, 0.25]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhs_mine_sm320_red): EGVAR(explosives,Place_rhs_mine_sm320_white) { + displayName = "$STR_RHS_MINE_SM320_R_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_sm320_red_e"; + }; + + class EGVAR(explosives,Place_rhs_mine_sm320_green): EGVAR(explosives,Place_rhs_mine_sm320_white) { + displayName = "$STR_RHS_MINE_SM320_G_MAG_DISPLAYNAME"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_sm320_green_e"; + }; + + class EGVAR(explosives,Place_rhs_mine_ozm72_a): EGVAR(explosives,Place) { + displayName = "$STR_RHS_CFGMAGAZINES_OZM72A"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_ozm72_a_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0.125, 0.11]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhs_mine_ozm72_b): EGVAR(explosives,Place_rhs_mine_ozm72_a) { + displayName = "$STR_RHS_CFGMAGAZINES_OZM72B"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_ozm72_b_e"; + }; + + class EGVAR(explosives,Place_rhs_mine_ozm72_c): EGVAR(explosives,Place_rhs_mine_ozm72_a) { + displayName = "$STR_RHS_CFGMAGAZINES_OZM72C"; + model = "\rhsafrf\addons\rhs_weapons\mines\rhs_ozm72_c_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, 0.015, 0.12]"; + }; + }; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/config.cpp new file mode 100644 index 0000000000..9e767987da --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_explosives" + }; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/script_component.hpp new file mode 100644 index 0000000000..7aa7c4a768 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_explosives/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_afrf3\script_component.hpp" + +#define SUBCOMPONENT explosives +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/CfgVehicles.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/CfgVehicles.hpp new file mode 100644 index 0000000000..8b8e76f29c --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/CfgVehicles.hpp @@ -0,0 +1,65 @@ +class CfgVehicles { + class Air; + class Helicopter: Air {}; + class Helicopter_Base_F: Helicopter {}; + class Helicopter_Base_H: Helicopter_Base_F { + class EventHandlers; + }; + class Heli_Light_02_base_F: Helicopter_Base_H {}; + class RHS_Mi8_base: Heli_Light_02_base_F { + EGVAR(fastroping,enabled) = 0; + class EventHandlers: EventHandlers { + class RHS_EventHandlers; + }; + }; + + class RHS_Mi8amt_base: RHS_Mi8_base { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{-1.13, 4.67, -0.89}}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_arf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_arf3,onPrepare); + class UserActions { + class openDoor; + class closeDoor_L: openDoor { + condition = QUOTE((this doorPhase 'LeftDoor' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); + }; + }; + + class EventHandlers: EventHandlers { + class RHS_EventHandlers: RHS_EventHandlers { + getOut = QUOTE(if !((_this select 0) getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)]) then {_this call rhs_fnc_mi8_doors}); + }; + }; + }; + + class RHS_Mi8_VVS_Base: RHS_Mi8_base {}; + class RHS_Mi8mt_vvs: RHS_Mi8_VVS_Base {}; + class RHS_Mi8mt_Cargo_vvs: RHS_Mi8mt_vvs { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{-1.13, 4.67, -0.89}}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_arf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_arf3,onPrepare); + + class UserActions { + class openDoor_L; + class closeDoor_L: openDoor_L { + condition = QUOTE((this doorPhase 'LeftDoor' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); + }; + }; + + class EventHandlers: EventHandlers { + class RHS_EventHandlers: RHS_EventHandlers { + getOut = QUOTE(if !((_this select 0) getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)]) then {_this call rhs_fnc_mi8_doors}); + }; + }; + }; + + class Heli_Attack_02_base_F: Helicopter_Base_F {}; + class RHS_Ka52_base: Heli_Attack_02_base_F { + EGVAR(fastroping,enabled) = 0; + }; + + class RHS_Mi24_base: Heli_Attack_02_base_F { + EGVAR(fastroping,enabled) = 0; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/config.cpp new file mode 100644 index 0000000000..d47b787f32 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +// Config will be binerized, so this include is only required at build-time +#include "\z\ace\addons\fastroping\script_macros.hpp" + +class CfgPatches { + class ADDON { + name = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_fastroping" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/script_component.hpp new file mode 100644 index 0000000000..70b5181236 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_fastroping/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_afrf3\script_component.hpp" + +#define SUBCOMPONENT fastroping +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/CfgWeapons.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/CfgWeapons.hpp new file mode 100644 index 0000000000..6720519685 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/CfgWeapons.hpp @@ -0,0 +1,8 @@ +class CfgWeapons { + class NVGoggles; + class rhs_1PN138: NVGoggles { // Monocular + modelOptics = ""; + EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_4096.paa); + EGVAR(nightvision,bluRadius) = 0.13; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/config.cpp new file mode 100644 index 0000000000..3950c7890e --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_nightvision" + }; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/script_component.hpp new file mode 100644 index 0000000000..2ea0f08dc6 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_nightvision/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_afrf3\script_component.hpp" + +#define SUBCOMPONENT nightvision +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/CfgVehicles.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/CfgVehicles.hpp new file mode 100644 index 0000000000..047e264c6e --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/CfgVehicles.hpp @@ -0,0 +1,10 @@ +class CfgVehicles { + class RHS_Ural_Support_MSV_Base_01; + class RHS_Ural_Fuel_MSV_01: RHS_Ural_Support_MSV_Base_01 { + transportFuel = 0; + }; + class rhs_kraz255b1_base; + class rhs_kraz255b1_fuel_base: rhs_kraz255b1_base { + transportFuel = 0; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/config.cpp new file mode 100644 index 0000000000..328d049bea --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_refuel" + }; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/script_component.hpp new file mode 100644 index 0000000000..4487ef20dc --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_refuel/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_afrf3\script_component.hpp" + +#define SUBCOMPONENT refuel +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/CfgWeapons.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/CfgWeapons.hpp new file mode 100644 index 0000000000..c6666f0192 --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/CfgWeapons.hpp @@ -0,0 +1,34 @@ +class CfgWeapons { + class rhs_acc_sniper_base; + class rhs_acc_pso1m2: rhs_acc_sniper_base { + ACE_ScopeHeightAboveRail = 4.41386; + ACE_ScopeAdjust_Vertical[] = {0, 0}; + ACE_ScopeAdjust_Horizontal[] = {-10, 10}; + ACE_ScopeAdjust_VerticalIncrement = 0.5; + ACE_ScopeAdjust_HorizontalIncrement = 0.5; + }; + class rhs_acc_pso1m21: rhs_acc_pso1m2 { + ACE_ScopeHeightAboveRail = 7.75566; + ACE_ScopeAdjust_Vertical[] = {0, 0}; + ACE_ScopeAdjust_Horizontal[] = {-10, 10}; + ACE_ScopeAdjust_VerticalIncrement = 0.5; + ACE_ScopeAdjust_HorizontalIncrement = 0.5; + }; + class ItemCore; + class InventoryOpticsItem_Base_F; + class rhs_acc_dh520x56: ItemCore { // http://nightvision.ru/catalog/4/item/35 + ACE_ScopeHeightAboveRail = 4.71476; + ACE_ScopeAdjust_Vertical[] = {0, 33}; + ACE_ScopeAdjust_Horizontal[] = {-9, 9}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class dedal_520 { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/config.cpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/config.cpp new file mode 100644 index 0000000000..ce2272766d --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/config.cpp @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhs_main_loadorder", + "ace_scopes" + }; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/script_component.hpp b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/script_component.hpp new file mode 100644 index 0000000000..86f82ef9da --- /dev/null +++ b/addons/compat_rhs_afrf3/compat_rhs_afrf3_scopes/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_afrf3\script_component.hpp" + +#define SUBCOMPONENT scopes +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_afrf3/config.cpp b/addons/compat_rhs_afrf3/config.cpp new file mode 100644 index 0000000000..3497a8e956 --- /dev/null +++ b/addons/compat_rhs_afrf3/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"rhs_main_loadorder"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; + url = ECSTRING(main,URL); + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgMagazines.hpp" +#include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" diff --git a/optionals/compat_rhs_afrf3/functions/fnc_onCut.sqf b/addons/compat_rhs_afrf3/functions/fnc_onCut.sqf similarity index 100% rename from optionals/compat_rhs_afrf3/functions/fnc_onCut.sqf rename to addons/compat_rhs_afrf3/functions/fnc_onCut.sqf diff --git a/optionals/compat_rhs_afrf3/functions/fnc_onPrepare.sqf b/addons/compat_rhs_afrf3/functions/fnc_onPrepare.sqf similarity index 100% rename from optionals/compat_rhs_afrf3/functions/fnc_onPrepare.sqf rename to addons/compat_rhs_afrf3/functions/fnc_onPrepare.sqf diff --git a/optionals/compat_rhs_afrf3/functions/script_component.hpp b/addons/compat_rhs_afrf3/functions/script_component.hpp similarity index 100% rename from optionals/compat_rhs_afrf3/functions/script_component.hpp rename to addons/compat_rhs_afrf3/functions/script_component.hpp diff --git a/optionals/compat_rhs_afrf3/script_component.hpp b/addons/compat_rhs_afrf3/script_component.hpp similarity index 67% rename from optionals/compat_rhs_afrf3/script_component.hpp rename to addons/compat_rhs_afrf3/script_component.hpp index 69297e6029..58681cf6a0 100644 --- a/optionals/compat_rhs_afrf3/script_component.hpp +++ b/addons/compat_rhs_afrf3/script_component.hpp @@ -4,3 +4,7 @@ #include "\z\ace\addons\main\script_mod.hpp" #include "\z\ace\addons\main\script_macros.hpp" + +// Backwards compatibility +#undef GVAR +#define GVAR(var) TRIPLES(PREFIX,COMPONENT,var) diff --git a/optionals/compat_rhs_gref3/$PBOPREFIX$ b/addons/compat_rhs_gref3/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rhs_gref3/$PBOPREFIX$ rename to addons/compat_rhs_gref3/$PBOPREFIX$ diff --git a/addons/compat_rhs_gref3/CfgAmmo.hpp b/addons/compat_rhs_gref3/CfgAmmo.hpp new file mode 100644 index 0000000000..566f7c87fe --- /dev/null +++ b/addons/compat_rhs_gref3/CfgAmmo.hpp @@ -0,0 +1,44 @@ +class CfgAmmo { + class GrenadeHand; + class rhsgref_ammo_rkg3em: GrenadeHand { // Scripted shaped charge + ace_frag_force = 0; + }; + + class BulletBase; + class rhs_ammo_762x25_Ball: BulletBase { + ACE_caliber = 7.874; + ACE_bulletLength = 13.856; + ACE_bulletMass = 5.5728; + ACE_ammoTempMuzzleVelocityShifts[] = {-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[] = {0.17}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {360, 380, 400}; + ACE_barrelLengths[] = {101.6, 152.4, 228.6}; + }; + + class rhs_ammo_792x57_Ball: BulletBase { + ACE_caliber = 8.077; + ACE_bulletLength = 28.651; + ACE_bulletMass = 12.7008; + ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[] = {0.315}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {785, 800, 815}; + ACE_barrelLengths[] = {508.0, 599.948, 660.4}; + }; + + class rhs_ammo_3bk12_penetrator; + class rhsgref_ammo_rkg3em_penetrator: rhs_ammo_3bk12_penetrator { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class rhs_ammo_rpg75_penetrator: rhs_ammo_3bk12_penetrator { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; + class rhs_ammo_panzerfaust60_penetrator: rhs_ammo_3bk12_penetrator { + EGVAR(vehicle_damage,incendiary) = 1.0; + }; +}; diff --git a/optionals/compat_gm/CfgEventHandlers.hpp b/addons/compat_rhs_gref3/CfgEventHandlers.hpp similarity index 59% rename from optionals/compat_gm/CfgEventHandlers.hpp rename to addons/compat_rhs_gref3/CfgEventHandlers.hpp index 2e06ca222b..865276cfba 100644 --- a/optionals/compat_gm/CfgEventHandlers.hpp +++ b/addons/compat_rhs_gref3/CfgEventHandlers.hpp @@ -9,11 +9,3 @@ class Extended_PreInit_EventHandlers { init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); }; }; - -class Extended_InitPost_EventHandlers { - class gm_jerrycan { - class ADDON { - init = QUOTE(call EFUNC(refuel,makeJerryCan)); - }; - }; -}; diff --git a/addons/compat_rhs_gref3/CfgMagazines.hpp b/addons/compat_rhs_gref3/CfgMagazines.hpp new file mode 100644 index 0000000000..f5e84fca6c --- /dev/null +++ b/addons/compat_rhs_gref3/CfgMagazines.hpp @@ -0,0 +1,9 @@ +class CfgMagazines { + class CA_Magazine; + class rhsgref_50Rnd_792x57_SmE_drum: CA_Magazine { // drum, but still just a belt + ACE_isBelt = 1; + }; + class rhsgref_296Rnd_792x57_SmE_belt: CA_Magazine { + ACE_isBelt = 1; + }; +}; diff --git a/addons/compat_rhs_gref3/CfgVehicles.hpp b/addons/compat_rhs_gref3/CfgVehicles.hpp new file mode 100644 index 0000000000..89692c8300 --- /dev/null +++ b/addons/compat_rhs_gref3/CfgVehicles.hpp @@ -0,0 +1,18 @@ +class CfgVehicles { + class Rubber_duck_base_F; + class rhsgref_canoe_base: Rubber_duck_base_F { + // Canoes are propelled by paddlers + EGVAR(refuel,canReceive) = 0; + }; + + class Wheeled_APC_F; + class rhsgref_BRDM2: Wheeled_APC_F { + GVAR(hullDetonationProb) = 0.2; + GVAR(turretDetonationProb) = 0.2; + GVAR(engineDetonationProb) = 0; + GVAR(hullFireProb) = 0.7; + GVAR(turretFireProb) = 0.7; + GVAR(engineFireProb) = 0.7; + GVAR(detonationDuringFireProb) = 0.5; + }; +}; diff --git a/optionals/compat_rhs_gref3/CfgWeapons.hpp b/addons/compat_rhs_gref3/CfgWeapons.hpp similarity index 75% rename from optionals/compat_rhs_gref3/CfgWeapons.hpp rename to addons/compat_rhs_gref3/CfgWeapons.hpp index 823bf1cc5a..68c2c08d06 100644 --- a/optionals/compat_rhs_gref3/CfgWeapons.hpp +++ b/addons/compat_rhs_gref3/CfgWeapons.hpp @@ -116,14 +116,12 @@ class CfgWeapons { EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; }; - CREATE_CSW_PROXY(rhs_weap_DSHKM); - class Launcher; class Launcher_Base_F: Launcher { class WeaponSlotsInfo; }; - class rhs_weap_panzerfaust60: Launcher_Base_F { + class rhs_weap_panzerfaust60: Launcher_Base_F { EGVAR(overpressure,range) = 6; EGVAR(overpressure,angle) = 30; EGVAR(overpressure,damage) = 0.4; @@ -133,30 +131,4 @@ class CfgWeapons { EGVAR(overpressure,angle) = 40; EGVAR(overpressure,offset) = 0.9; }; - - class GVAR(dshkm_carry): Launcher_Base_F { - class ACE_CSW { - type = "weapon"; - deployTime = 4; - pickupTime = 4; - class assembleTo { - EGVAR(csw,kordTripod) = "rhsgref_ins_DSHKM"; - EGVAR(csw,kordTripodLow) = "rhsgref_ins_DSHKM_Mini_TriPod"; - }; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - // One WeaponSlot with a positive value for iconScale forces game to use icon overlay method. - // Required, because the inventory icon has no accessory variants. - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 740; - }; - displayName = ECSTRING(csw,dshk_gun); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsafrf\addons\rhs_heavyweapons\data\mapico\icomap_DShKM_CA.paa"; - }; }; diff --git a/optionals/compat_rhs_gref3/XEH_PREP.hpp b/addons/compat_rhs_gref3/XEH_PREP.hpp similarity index 100% rename from optionals/compat_rhs_gref3/XEH_PREP.hpp rename to addons/compat_rhs_gref3/XEH_PREP.hpp diff --git a/optionals/compat_rhs_gref3/XEH_preInit.sqf b/addons/compat_rhs_gref3/XEH_preInit.sqf similarity index 100% rename from optionals/compat_rhs_gref3/XEH_preInit.sqf rename to addons/compat_rhs_gref3/XEH_preInit.sqf diff --git a/optionals/compat_rhs_gref3/XEH_preStart.sqf b/addons/compat_rhs_gref3/XEH_preStart.sqf similarity index 100% rename from optionals/compat_rhs_gref3/XEH_preStart.sqf rename to addons/compat_rhs_gref3/XEH_preStart.sqf diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgVehicles.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgVehicles.hpp new file mode 100644 index 0000000000..220aec4c24 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgVehicles.hpp @@ -0,0 +1,22 @@ +class CfgVehicles { + class StaticMGWeapon; + class rhs_DSHKM_base: StaticMGWeapon { + // ENABLE_CSW_ATTRIBUTE; + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_DSHKM); + magazineLocation = "_target selectionPosition 'otocvez'"; + disassembleWeapon = QGVAR(dshkm_carry); + disassembleTurret = QEGVAR(csw,kordTripod); + desiredAmmo = 50; + ammoLoadTime = 10; + ammoUnloadTime = 8; + }; + }; + class rhs_DSHkM_Mini_TriPod_base: rhs_DSHKM_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + disassembleTurret = QEGVAR(csw,kordTripodLow); + }; + }; +}; diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgWeapons.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgWeapons.hpp new file mode 100644 index 0000000000..15ff9488ca --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/CfgWeapons.hpp @@ -0,0 +1,34 @@ +class CfgWeapons { + CREATE_CSW_PROXY(rhs_weap_DSHKM); + + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; + + class GVAR(dshkm_carry): Launcher_Base_F { + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,kordTripod) = "rhsgref_ins_DSHKM"; + EGVAR(csw,kordTripodLow) = "rhsgref_ins_DSHKM_Mini_TriPod"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + // One WeaponSlot with a positive value for iconScale forces game to use icon overlay method. + // Required, because the inventory icon has no accessory variants. + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 740; + }; + displayName = ECSTRING(csw,dshk_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsafrf\addons\rhs_heavyweapons\data\mapico\icomap_DShKM_CA.paa"; + }; +}; diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_csw/config.cpp b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/config.cpp new file mode 100644 index 0000000000..975dd19825 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/config.cpp @@ -0,0 +1,24 @@ +#include "script_component.hpp" + +// Config will be binerized, so this include is only required at build-time +#include "\z\ace\addons\csw\script_config_macros_csw.hpp" + +class CfgPatches { + class ADDON { + name = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {QGVAR(dshkm_carry)}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsgref_main_loadorder", + "ace_csw" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_csw/script_component.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/script_component.hpp new file mode 100644 index 0000000000..045e7140c3 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_csw/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_gref3\script_component.hpp" + +#define SUBCOMPONENT csw +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/optionals/compat_rhs_gref3/CfgAmmo.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgAmmo.hpp similarity index 62% rename from optionals/compat_rhs_gref3/CfgAmmo.hpp rename to addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgAmmo.hpp index 64db7dd7e3..0808c7ff1d 100644 --- a/optionals/compat_rhs_gref3/CfgAmmo.hpp +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgAmmo.hpp @@ -1,37 +1,4 @@ class CfgAmmo { - class GrenadeHand; - class rhsgref_ammo_rkg3em: GrenadeHand { // Scripted shaped charge - ace_frag_force = 0; - }; - - class BulletBase; - class rhs_ammo_762x25_Ball: BulletBase { - ACE_caliber = 7.874; - ACE_bulletLength = 13.856; - ACE_bulletMass = 5.5728; - ACE_ammoTempMuzzleVelocityShifts[] = {-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[] = {0.17}; - ACE_velocityBoundaries[] = {}; - ACE_standardAtmosphere = "ASM"; - ACE_dragModel = 1; - ACE_muzzleVelocities[] = {360, 380, 400}; - ACE_barrelLengths[] = {101.6, 152.4, 228.6}; - }; - - class rhs_ammo_792x57_Ball: BulletBase { - ACE_caliber = 8.077; - ACE_bulletLength = 28.651; - ACE_bulletMass = 12.7008; - ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[] = {0.315}; - ACE_velocityBoundaries[] = {}; - ACE_standardAtmosphere = "ASM"; - ACE_dragModel = 1; - ACE_muzzleVelocities[] = {785, 800, 815}; - ACE_barrelLengths[] = {508.0, 599.948, 660.4}; - }; - - // ACE Explosives class APERSMine_Range_Ammo; class rhs_mine_a200_bz_ammo: APERSMine_Range_Ammo { ace_explosives_defuseObjectPosition[] = {0, 0, 0.035}; @@ -113,15 +80,4 @@ class CfgAmmo { class rhs_charge_M2tet_x2_ammo: DemoCharge_Remote_Ammo { ace_explosives_defuseObjectPosition[] = {0.095, 0, 0.055}; }; - - class rhs_ammo_3bk12_penetrator; - class rhsgref_ammo_rkg3em_penetrator: rhs_ammo_3bk12_penetrator { - EGVAR(vehicle_damage,incendiary) = 1.0; - }; - class rhs_ammo_rpg75_penetrator: rhs_ammo_3bk12_penetrator { - EGVAR(vehicle_damage,incendiary) = 1.0; - }; - class rhs_ammo_panzerfaust60_penetrator: rhs_ammo_3bk12_penetrator { - EGVAR(vehicle_damage,incendiary) = 1.0; - }; }; diff --git a/optionals/compat_rhs_gref3/CfgMagazines.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgMagazines.hpp similarity index 96% rename from optionals/compat_rhs_gref3/CfgMagazines.hpp rename to addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgMagazines.hpp index 1f166ed1b2..ce882e1825 100644 --- a/optionals/compat_rhs_gref3/CfgMagazines.hpp +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgMagazines.hpp @@ -1,13 +1,4 @@ class CfgMagazines { - class CA_Magazine; - class rhsgref_50Rnd_792x57_SmE_drum: CA_Magazine { // drum, but still just a belt - ACE_isBelt = 1; - }; - class rhsgref_296Rnd_792x57_SmE_belt: CA_Magazine { - ACE_isBelt = 1; - }; - - // ACE Explosives class APERSMine_Range_Mag; class rhs_mine_a200_bz_mag: APERSMine_Range_Mag { ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_a200_bz"; diff --git a/optionals/compat_rhs_gref3/CfgVehicles.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgVehicles.hpp similarity index 70% rename from optionals/compat_rhs_gref3/CfgVehicles.hpp rename to addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgVehicles.hpp index 206358a5e3..9e68a4a524 100644 --- a/optionals/compat_rhs_gref3/CfgVehicles.hpp +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/CfgVehicles.hpp @@ -1,107 +1,4 @@ class CfgVehicles { - class Rubber_duck_base_F; - class rhsgref_canoe_base: Rubber_duck_base_F { - // Canoes are propelled by paddlers - EGVAR(refuel,canReceive) = 0; - }; - - class Wheeled_APC_F; - class rhsgref_BRDM2: Wheeled_APC_F { - GVAR(hullDetonationProb) = 0.2; - GVAR(turretDetonationProb) = 0.2; - GVAR(engineDetonationProb) = 0; - GVAR(hullFireProb) = 0.7; - GVAR(turretFireProb) = 0.7; - GVAR(engineFireProb) = 0.7; - GVAR(detonationDuringFireProb) = 0.5; - }; - - class StaticMGWeapon; - class rhs_DSHKM_base: StaticMGWeapon { - // ENABLE_CSW_ATTRIBUTE; - class ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_weap_DSHKM); - magazineLocation = "_target selectionPosition 'otocvez'"; - disassembleWeapon = QGVAR(dshkm_carry); - disassembleTurret = QEGVAR(csw,kordTripod); - desiredAmmo = 50; - ammoLoadTime = 10; - ammoUnloadTime = 8; - }; - }; - class rhs_DSHkM_Mini_TriPod_base: rhs_DSHKM_base { - class ACE_CSW: ACE_CSW { - enabled = 1; - disassembleTurret = QEGVAR(csw,kordTripodLow); - }; - }; - - class Helicopter_Base_H; - class rhs_uh1h_base: Helicopter_Base_H { - EGVAR(fastroping,enabled) = 2; - EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; - EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.95, -0.26}; - EGVAR(fastroping,onCut) = QFUNC(onCut); - EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); - EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; - }; - - class rhs_uh1h_hidf: rhs_uh1h_base { - class Attributes { - EQUIP_FRIES_ATTRIBUTE; - }; - }; - - class rhs_uh1h_hidf_unarmed: rhs_uh1h_hidf { - EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.8, -0.27}; - - class UserActions { - class Open_Side_Doors; - - class Close_Side_Doors: Open_Side_Doors { - condition = QUOTE([ARR_2(this,'close_cargo_doors')] call FUNC(canCloseDoor)); - }; - }; - - class Attributes: Attributes { - EQUIP_FRIES_ATTRIBUTE; - }; - }; - - class rhs_uh1h_idap: rhs_uh1h_base { - EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.8, -0.27}; - - class UserActions { - class Open_Side_Doors; - - class Close_Side_Doors: Open_Side_Doors { - condition = QUOTE([ARR_2(this,'close_cargo_doors')] call FUNC(canCloseDoor)); - }; - }; - - class Attributes { - EQUIP_FRIES_ATTRIBUTE; - }; - }; - - class rhs_uh1h_un: rhs_uh1h_base { - EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.8, -0.27}; - - class UserActions { - class Open_Side_Doors; - - class Close_Side_Doors: Open_Side_Doors { - condition = QUOTE([ARR_2(this,'close_cargo_doors')] call FUNC(canCloseDoor)); - }; - }; - - class Attributes { - EQUIP_FRIES_ATTRIBUTE; - }; - }; - - // ACE Explosives class Items_base_F; class ACE_Explosives_Place: Items_base_F { class ACE_Actions { diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/config.cpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/config.cpp new file mode 100644 index 0000000000..5c646c42b4 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsgref_main_loadorder", + "ace_explosives" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/script_component.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/script_component.hpp new file mode 100644 index 0000000000..c3655089bd --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_explosives/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_gref3\script_component.hpp" + +#define SUBCOMPONENT explosives +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/CfgVehicles.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/CfgVehicles.hpp new file mode 100644 index 0000000000..39bda1b8b6 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/CfgVehicles.hpp @@ -0,0 +1,59 @@ +class CfgVehicles { + class Helicopter_Base_H; + class rhs_uh1h_base: Helicopter_Base_H { + EGVAR(fastroping,enabled) = 2; + EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.95, -0.26}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_gref3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_gref3,onPrepare); + EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; + }; + + class rhs_uh1h_hidf: rhs_uh1h_base { + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + + class rhs_uh1h_hidf_unarmed: rhs_uh1h_hidf { + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.8, -0.27}; + class UserActions { + class Open_Side_Doors; + + class Close_Side_Doors: Open_Side_Doors { + condition = QUOTE([ARR_2(this,'close_cargo_doors')] call EFUNC(compat_rhs_gref3,canCloseDoor)); + }; + }; + + class Attributes: Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + + class rhs_uh1h_idap: rhs_uh1h_base { + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.8, -0.27}; + class UserActions { + class Open_Side_Doors; + + class Close_Side_Doors: Open_Side_Doors { + condition = QUOTE([ARR_2(this,'close_cargo_doors')] call EFUNC(compat_rhs_gref3,canCloseDoor)); + }; + }; + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + + class rhs_uh1h_un: rhs_uh1h_base { + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.8, -0.27}; + class UserActions { + class Open_Side_Doors; + class Close_Side_Doors: Open_Side_Doors { + condition = QUOTE([ARR_2(this,'close_cargo_doors')] call EFUNC(compat_rhs_gref3,canCloseDoor)); + }; + }; + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; +}; diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/config.cpp b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/config.cpp new file mode 100644 index 0000000000..19c4d2f612 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +// Config will be binerized, so this include is only required at build-time +#include "\z\ace\addons\fastroping\script_macros.hpp" + +class CfgPatches { + class ADDON { + name = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsgref_main_loadorder", + "ace_fastroping" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/script_component.hpp b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/script_component.hpp new file mode 100644 index 0000000000..2faf389ac7 --- /dev/null +++ b/addons/compat_rhs_gref3/compat_rhs_gref3_fastroping/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_gref3\script_component.hpp" + +#define SUBCOMPONENT fastroping +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/optionals/compat_rhs_gref3/config.cpp b/addons/compat_rhs_gref3/config.cpp similarity index 70% rename from optionals/compat_rhs_gref3/config.cpp rename to addons/compat_rhs_gref3/config.cpp index a836906329..f2e7aeacde 100644 --- a/optionals/compat_rhs_gref3/config.cpp +++ b/addons/compat_rhs_gref3/config.cpp @@ -1,13 +1,13 @@ #include "script_component.hpp" -#include "\z\ace\addons\csw\script_config_macros_csw.hpp" class CfgPatches { class ADDON { name = COMPONENT_NAME; units[] = {}; - weapons[] = {QGVAR(dshkm_carry)}; + weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_fastroping", "ace_explosives", "ace_csw", "rhsgref_main_loadorder"}; + requiredAddons[] = {"rhsgref_main_loadorder"}; + skipWhenMissingDependencies = 1; author = ECSTRING(common,ACETeam); authors[] = {"PabstMirror", "Ruthberg", "Anton"}; url = ECSTRING(main,URL); diff --git a/optionals/compat_rhs_gref3/functions/fnc_canCloseDoor.sqf b/addons/compat_rhs_gref3/functions/fnc_canCloseDoor.sqf similarity index 100% rename from optionals/compat_rhs_gref3/functions/fnc_canCloseDoor.sqf rename to addons/compat_rhs_gref3/functions/fnc_canCloseDoor.sqf diff --git a/optionals/compat_rhs_gref3/functions/fnc_onCut.sqf b/addons/compat_rhs_gref3/functions/fnc_onCut.sqf similarity index 100% rename from optionals/compat_rhs_gref3/functions/fnc_onCut.sqf rename to addons/compat_rhs_gref3/functions/fnc_onCut.sqf diff --git a/optionals/compat_rhs_gref3/functions/fnc_onPrepare.sqf b/addons/compat_rhs_gref3/functions/fnc_onPrepare.sqf similarity index 100% rename from optionals/compat_rhs_gref3/functions/fnc_onPrepare.sqf rename to addons/compat_rhs_gref3/functions/fnc_onPrepare.sqf diff --git a/optionals/compat_rhs_gref3/functions/script_component.hpp b/addons/compat_rhs_gref3/functions/script_component.hpp similarity index 100% rename from optionals/compat_rhs_gref3/functions/script_component.hpp rename to addons/compat_rhs_gref3/functions/script_component.hpp diff --git a/optionals/compat_rhs_gref3/script_component.hpp b/addons/compat_rhs_gref3/script_component.hpp similarity index 67% rename from optionals/compat_rhs_gref3/script_component.hpp rename to addons/compat_rhs_gref3/script_component.hpp index ed1feba1fa..9ee2dcf965 100644 --- a/optionals/compat_rhs_gref3/script_component.hpp +++ b/addons/compat_rhs_gref3/script_component.hpp @@ -4,4 +4,7 @@ #include "\z\ace\addons\main\script_mod.hpp" #include "\z\ace\addons\main\script_macros.hpp" -#include "\z\ace\addons\fastroping\script_macros.hpp" + +// Backwards compatibility +#undef GVAR +#define GVAR(var) TRIPLES(PREFIX,COMPONENT,var) diff --git a/optionals/compat_rhs_saf3/$PBOPREFIX$ b/addons/compat_rhs_saf3/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rhs_saf3/$PBOPREFIX$ rename to addons/compat_rhs_saf3/$PBOPREFIX$ diff --git a/addons/compat_rhs_saf3/CfgAmmo.hpp b/addons/compat_rhs_saf3/CfgAmmo.hpp new file mode 100644 index 0000000000..e194042490 --- /dev/null +++ b/addons/compat_rhs_saf3/CfgAmmo.hpp @@ -0,0 +1,25 @@ +class CfgAmmo { + // ACE Ballistics + class BulletBase; + class rhs_ammo_792x57_Ball: BulletBase { + ACE_caliber = 8.077; + ACE_bulletLength = 28.651; + ACE_bulletMass = 12.7008; + ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[] = {0.315}; + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; + ACE_dragModel = 1; + ACE_muzzleVelocities[] = {785, 800, 815}; + ACE_barrelLengths[] = {508.0, 599.948, 660.4}; + }; + + class rhs_B_762x39_Ball; + class rhssaf_ammo_762x39_m82_api: rhs_B_762x39_Ball { + ACE_Caliber = 7.8994; + ACE_bulletMass = 7.6074; + ACE_bulletLength = 27.2796; + ACE_muzzleVelocities[] = {650, 700, 748}; + ACE_barrelLengths[] = {206.85, 329.62, 412.75}; + }; +}; diff --git a/optionals/compat_rhs_saf3/CfgWeapons.hpp b/addons/compat_rhs_saf3/CfgWeapons.hpp similarity index 100% rename from optionals/compat_rhs_saf3/CfgWeapons.hpp rename to addons/compat_rhs_saf3/CfgWeapons.hpp diff --git a/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgAmmo.hpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgAmmo.hpp new file mode 100644 index 0000000000..4730718639 --- /dev/null +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgAmmo.hpp @@ -0,0 +1,33 @@ +class CfgAmmo { + // ACE Explosives + class DirectionalBombBase; + class rhssaf_mine_mrud_a_ammo: DirectionalBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {-0.034, 0, 0.202}; + }; + + class rhssaf_mine_mrud_d_ammo: rhssaf_mine_mrud_a_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0.0325, 0, 0.18}; + }; + + class MineBase; + class rhssaf_mine_pma3_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.025}; + }; + + class rhssaf_mine_tma4_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.045}; + }; + + class PipeBombBase; + class rhssaf_tm100_ammo: PipeBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {-0.055, 0, 0.014}; + }; + + class rhssaf_tm200_ammo: rhssaf_tm100_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {-0.055, 0, 0.018}; + }; + + class rhssaf_tm500_ammo: rhssaf_tm100_ammo { + EGVAR(explosives,defuseObjectPosition)[] = {-0.056, 0, 0.032}; + }; +}; diff --git a/optionals/compat_rhs_saf3/CfgMagazines.hpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgMagazines.hpp similarity index 66% rename from optionals/compat_rhs_saf3/CfgMagazines.hpp rename to addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgMagazines.hpp index 07319f313f..c004f58446 100644 --- a/optionals/compat_rhs_saf3/CfgMagazines.hpp +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgMagazines.hpp @@ -3,22 +3,22 @@ class CfgMagazines { // ACE Explosives class ATMine_Range_Mag; class rhssaf_mine_mrud_a_mag: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhssaf_mine_mrud_a"; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_a); class ACE_Triggers { SupportedTriggers[] = {"Tripwire"}; }; }; class rhssaf_mine_mrud_b_mag: rhssaf_mine_mrud_a_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhssaf_mine_mrud_b"; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_b); }; class rhssaf_mine_mrud_c_mag: rhssaf_mine_mrud_a_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhssaf_mine_mrud_c"; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_c); }; class rhssaf_mine_mrud_d_mag: rhssaf_mine_mrud_a_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhssaf_mine_mrud_d"; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_d); class ACE_Triggers { SupportedTriggers[] = {"Command", "MK16_Transmitter"}; class Command { @@ -29,7 +29,7 @@ class CfgMagazines { }; class rhssaf_mine_pma3_mag: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhssaf_mine_pma3"; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_pma3); class ACE_Triggers { SupportedTriggers[] = {"PressurePlate"}; class PressurePlate { @@ -39,7 +39,7 @@ class CfgMagazines { }; class rhssaf_mine_tma4_mag: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhssaf_mine_tma4"; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_tma4); class ACE_Triggers { SupportedTriggers[] = {"PressurePlate"}; class PressurePlate { @@ -51,9 +51,9 @@ class CfgMagazines { class CA_Magazine; class rhssaf_tm100_mag: CA_Magazine { useAction = 0; - ace_explosives_DelayTime = 1; - ace_explosives_Placeable = 1; - ace_explosives_SetupObject = "ACE_Explosives_Place_rhssaf_tm100"; + EGVAR(explosives,DelayTime) = 1; + EGVAR(explosives,Placeable) = 1; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm100); class ACE_Triggers { SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter"}; class Timer { @@ -67,10 +67,10 @@ class CfgMagazines { }; class rhssaf_tm200_mag: rhssaf_tm100_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhssaf_tm200"; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm200); }; class rhssaf_tm500_mag: rhssaf_tm100_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhssaf_tm500"; + EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm500); }; }; diff --git a/optionals/compat_rhs_saf3/CfgVehicles.hpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgVehicles.hpp similarity index 76% rename from optionals/compat_rhs_saf3/CfgVehicles.hpp rename to addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgVehicles.hpp index 722328d1e9..33771084b5 100644 --- a/optionals/compat_rhs_saf3/CfgVehicles.hpp +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/CfgVehicles.hpp @@ -2,13 +2,13 @@ class CfgVehicles { // ACE Explosives class Items_base_F; - class ACE_Explosives_Place: Items_base_F { + class EGVAR(explosives,Place): Items_base_F { class ACE_Actions { class ACE_MainActions; }; }; - class ACE_Explosives_Place_rhssaf_mine_mrud_a: ACE_Explosives_Place { + class EGVAR(explosives,Place_rhssaf_mine_mrud_a): EGVAR(explosives,Place) { displayName = "$STR_RHSSAF_MRUD_A_DISPLAYNAME"; model = "\rhssaf\addons\rhssaf_m_explosives\mines_ap\mrud\rhssaf_mrud_a_e"; class ACE_Actions: ACE_Actions { @@ -18,17 +18,17 @@ class CfgVehicles { }; }; - class ACE_Explosives_Place_rhssaf_mine_mrud_b: ACE_Explosives_Place_rhssaf_mine_mrud_a { + class EGVAR(explosives,Place_rhssaf_mine_mrud_b): EGVAR(explosives,Place_rhssaf_mine_mrud_a) { displayName = "$STR_RHSSAF_MRUD_B_DISPLAYNAME"; model = "\rhssaf\addons\rhssaf_m_explosives\mines_ap\mrud\rhssaf_mrud_b_e"; }; - class ACE_Explosives_Place_rhssaf_mine_mrud_c: ACE_Explosives_Place_rhssaf_mine_mrud_a { + class EGVAR(explosives,Place_rhssaf_mine_mrud_c): EGVAR(explosives,Place_rhssaf_mine_mrud_a) { displayName = "$STR_RHSSAF_MRUD_C_DISPLAYNAME"; model = "\rhssaf\addons\rhssaf_m_explosives\mines_ap\mrud\rhssaf_mrud_c_e"; }; - class ACE_Explosives_Place_rhssaf_mine_mrud_d: ACE_Explosives_Place_rhssaf_mine_mrud_a { + class EGVAR(explosives,Place_rhssaf_mine_mrud_d): EGVAR(explosives,Place_rhssaf_mine_mrud_a) { displayName = "$STR_RHSSAF_MRUD_D_DISPLAYNAME"; model = "\rhssaf\addons\rhssaf_m_explosives\mines_ap\mrud\rhssaf_mrud_d_e"; class ACE_Actions: ACE_Actions { @@ -38,7 +38,7 @@ class CfgVehicles { }; }; - class ACE_Explosives_Place_rhssaf_mine_pma3: ACE_Explosives_Place { + class EGVAR(explosives,Place_rhssaf_mine_pma3): EGVAR(explosives,Place) { displayName = "$STR_RHSSAF_PMA3_DISPLAYNAME"; model = "\rhssaf\addons\rhssaf_m_explosives\mines_ap\pma\rhssaf_pma3_d"; class ACE_Actions: ACE_Actions { @@ -48,7 +48,7 @@ class CfgVehicles { }; }; - class ACE_Explosives_Place_rhssaf_mine_tma4: ACE_Explosives_Place { + class EGVAR(explosives,Place_rhssaf_mine_tma4): EGVAR(explosives,Place) { displayName = "$STR_RHSSAF_TMA4_DISPLAYNAME"; model = "\rhssaf\addons\rhssaf_m_explosives\mines_at\tma4\rhssaf_tma4_d"; class ACE_Actions: ACE_Actions { @@ -58,7 +58,7 @@ class CfgVehicles { }; }; - class ACE_Explosives_Place_rhssaf_tm100: ACE_Explosives_Place { + class EGVAR(explosives,Place_rhssaf_tm100): EGVAR(explosives,Place) { displayName = "$STR_RHSSAF_TM100_DISPLAYNAME"; model = "\rhssaf\addons\rhssaf_m_explosives\tm500\rhssaf_tm100_e"; class ACE_Actions: ACE_Actions { @@ -68,7 +68,7 @@ class CfgVehicles { }; }; - class ACE_Explosives_Place_rhssaf_tm200: ACE_Explosives_Place { + class EGVAR(explosives,Place_rhssaf_tm200): EGVAR(explosives,Place) { displayName = "$STR_RHSSAF_TM200_DISPLAYNAME"; model = "\rhssaf\addons\rhssaf_m_explosives\tm500\rhssaf_tm200_e"; class ACE_Actions: ACE_Actions { @@ -78,7 +78,7 @@ class CfgVehicles { }; }; - class ACE_Explosives_Place_rhssaf_tm500: ACE_Explosives_Place { + class EGVAR(explosives,Place_rhssaf_tm500): EGVAR(explosives,Place) { displayName = "$STR_RHSSAF_TM500_DISPLAYNAME"; model = "\rhssaf\addons\rhssaf_m_explosives\tm500\rhssaf_tm500_e"; class ACE_Actions: ACE_Actions { diff --git a/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/config.cpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/config.cpp new file mode 100644 index 0000000000..45d4945c5a --- /dev/null +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/config.cpp @@ -0,0 +1,22 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhssaf_main_loadorder", + "ace_explosives" + }; + author = ECSTRING(common,ACETeam); + authors[] = {}; + url = ECSTRING(main,URL); + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" diff --git a/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/script_component.hpp b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/script_component.hpp new file mode 100644 index 0000000000..f587912569 --- /dev/null +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_explosives/script_component.hpp @@ -0,0 +1,10 @@ +#define COMPONENT compat_rhs_saf3 +#define COMPONENT_BEAUTIFIED RHS SAF Compatibility + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" + +#define SUBCOMPONENT explosives +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/optionals/compat_rhs_saf3/config.cpp b/addons/compat_rhs_saf3/config.cpp similarity index 74% rename from optionals/compat_rhs_saf3/config.cpp rename to addons/compat_rhs_saf3/config.cpp index cb0981fc52..e6b708dcbb 100644 --- a/optionals/compat_rhs_saf3/config.cpp +++ b/addons/compat_rhs_saf3/config.cpp @@ -6,15 +6,14 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_explosives", "rhssaf_main_loadorder"}; + requiredAddons[] = {"rhssaf_main_loadorder"}; author = ECSTRING(common,ACETeam); authors[] = {}; url = ECSTRING(main,URL); + skipWhenMissingDependencies = 1; VERSION_CONFIG; }; }; #include "CfgAmmo.hpp" -#include "CfgMagazines.hpp" #include "CfgWeapons.hpp" -#include "CfgVehicles.hpp" diff --git a/optionals/compat_rhs_saf3/script_component.hpp b/addons/compat_rhs_saf3/script_component.hpp similarity index 100% rename from optionals/compat_rhs_saf3/script_component.hpp rename to addons/compat_rhs_saf3/script_component.hpp diff --git a/optionals/compat_rhs_usf3/$PBOPREFIX$ b/addons/compat_rhs_usf3/$PBOPREFIX$ similarity index 100% rename from optionals/compat_rhs_usf3/$PBOPREFIX$ rename to addons/compat_rhs_usf3/$PBOPREFIX$ diff --git a/optionals/compat_rhs_usf3/CfgAmmo.hpp b/addons/compat_rhs_usf3/CfgAmmo.hpp similarity index 83% rename from optionals/compat_rhs_usf3/CfgAmmo.hpp rename to addons/compat_rhs_usf3/CfgAmmo.hpp index 4162adcedb..6b885d7e04 100644 --- a/optionals/compat_rhs_usf3/CfgAmmo.hpp +++ b/addons/compat_rhs_usf3/CfgAmmo.hpp @@ -337,118 +337,56 @@ class CfgAmmo { EGVAR(vehicle_damage,incendiary) = 0.8; }; - class MissileBase; - class rhs_ammo_M_fgm148_AT: MissileBase { - irLock = 1; - laserLock = 0; - airLock = 0; - - // Begin ACE guidance Configs - class ace_missileguidance { - enabled = 1; - - minDeflection = 0.00005; // Minium flap deflection for guidance - maxDeflection = 0.025; // Maximum flap deflection for guidance - incDeflection = 0.00005; // The incrmeent in which deflection adjusts. - - canVanillaLock = 0; - - // Guidance type for munitions - defaultSeekerType = "Optic"; - seekerTypes[] = { "Optic" }; - - defaultSeekerLockMode = "LOBL"; - seekerLockModes[] = { "LOBL" }; - - seekerAngle = 180; // Angle in front of the missile which can be searched - seekerAccuracy = 1; // seeker accuracy multiplier - - seekerMinRange = 0; - seekerMaxRange = 2500; // Range from the missile which the seeker can visually search - - seekLastTargetPos = 1; // seek last target position [if seeker loses LOS of target, continue to last known pos] - - // Attack profile type selection - defaultAttackProfile = "JAV_TOP"; - attackProfiles[] = { "JAV_TOP", "JAV_DIR" }; - useModeForAttackProfile = 1; - }; - }; - class GrenadeHand; class rhs_ammo_mk3a2: GrenadeHand { - ace_frag_enabled = 0; - ace_frag_skip = 1; - ace_frag_force = 0; + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; }; class rhs_ammo_m84: GrenadeHand { - ace_frag_enabled = 0; - ace_frag_skip = 1; - ace_frag_force = 0; + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; }; class rhs_ammo_m7a3_cs: GrenadeHand { - ace_frag_enabled = 0; - ace_frag_skip = 1; - ace_frag_force = 0; + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; }; class GrenadeHand_stone; class rhs_ammo_m69: GrenadeHand_stone { - ace_frag_enabled = 0; - ace_frag_skip = 1; - ace_frag_force = 0; + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; }; class rhs_ammo_m67: GrenadeHand { - ace_frag_enabled = 1; - ace_frag_metal = 213; - ace_frag_charge = 185; - ace_frag_gurney_c = 2700; - ace_frag_gurney_k = "3/5"; - ace_frag_classes[] = {"ACE_frag_medium_HD"}; - ace_frag_skip = 0; - ace_frag_force = 1; + EGVAR(frag,enabled) = 1; + EGVAR(frag,metal) = 213; + EGVAR(frag,charge) = 185; + EGVAR(frag,gurney_c) = 2700; + EGVAR(frag,gurney_k) = "3/5"; + EGVAR(frag,classes)[] = {"ACE_frag_medium_HD"}; + EGVAR(frag,skip) = 0; + EGVAR(frag,force) = 1; }; class rhs_ammo_M136_hedp_rocket: rhs_ammo_M136_rocket { - ace_frag_enabled = 1; - ace_frag_metal = 330; - ace_frag_charge = 280; - ace_frag_gurney_c = 2800; - ace_frag_gurney_k = "3/5"; - ace_frag_classes[] = {"ACE_frag_medium_HD"}; - ace_frag_skip = 0; - ace_frag_force = 1; + EGVAR(frag,enabled) = 1; + EGVAR(frag,metal) = 330; + EGVAR(frag,charge) = 280; + EGVAR(frag,gurney_c) = 2800; + EGVAR(frag,gurney_k) = "3/5"; + EGVAR(frag,classes)[] = {"ACE_frag_medium_HD"}; + EGVAR(frag,skip) = 0; + EGVAR(frag,force) = 1; EGVAR(vehicle_damage,incendiary) = 0.8; }; class rhs_ammo_m72a7_rocket: rhs_ammo_M136_hedp_rocket { EGVAR(vehicle_damage,incendiary) = 1.0; - ace_frag_enabled = 0; - ace_frag_skip = 1; - ace_frag_force = 0; + EGVAR(frag,enabled) = 0; + EGVAR(frag,skip) = 1; + EGVAR(frag,force) = 0; }; class rhs_ammo_smaw_SR: RocketBase { ACE_caliber = 9; }; - - // ACE Explosives - class PipeBombBase; - class rhsusf_m112_ammo: PipeBombBase { - ace_explosives_defuseObjectPosition[] = {0.055, 0, 0.038}; - }; - - class rhsusf_m112x4_ammo: PipeBombBase { - ace_explosives_defuseObjectPosition[] = {0.055, -0.025, 0.102}; - }; - - class MineBase; - class rhsusf_mine_m19_ammo: MineBase { - ace_explosives_defuseObjectPosition[] = {0, 0.02, 0.046}; - }; - - class rhsusf_mine_m14_ammo: MineBase { - ace_explosives_defuseObjectPosition[] = {-0.02, -0.015, 0.02}; - }; - - class APERSMine_Range_Ammo; - class rhsusf_mine_m49a1_3m_ammo: APERSMine_Range_Ammo { - ace_explosives_defuseObjectPosition[] = {0, 0.016, 0.296}; - }; }; diff --git a/optionals/compat_rhs_usf3/CfgEventHandlers.hpp b/addons/compat_rhs_usf3/CfgEventHandlers.hpp similarity index 57% rename from optionals/compat_rhs_usf3/CfgEventHandlers.hpp rename to addons/compat_rhs_usf3/CfgEventHandlers.hpp index e9aed5c5ea..865276cfba 100644 --- a/optionals/compat_rhs_usf3/CfgEventHandlers.hpp +++ b/addons/compat_rhs_usf3/CfgEventHandlers.hpp @@ -9,11 +9,3 @@ class Extended_PreInit_EventHandlers { init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); }; }; - -class Extended_InitPost_EventHandlers { - class rhsusf_props_ScepterMFC_Base { - class ADDON { - init = QUOTE(call EFUNC(refuel,makeJerryCan)); - }; - }; -}; diff --git a/optionals/compat_rhs_usf3/CfgGlasses.hpp b/addons/compat_rhs_usf3/CfgGlasses.hpp similarity index 100% rename from optionals/compat_rhs_usf3/CfgGlasses.hpp rename to addons/compat_rhs_usf3/CfgGlasses.hpp diff --git a/optionals/compat_rhs_usf3/CfgMagazineWells.hpp b/addons/compat_rhs_usf3/CfgMagazineWells.hpp similarity index 100% rename from optionals/compat_rhs_usf3/CfgMagazineWells.hpp rename to addons/compat_rhs_usf3/CfgMagazineWells.hpp diff --git a/addons/compat_rhs_usf3/CfgMagazines.hpp b/addons/compat_rhs_usf3/CfgMagazines.hpp new file mode 100644 index 0000000000..f11dad081c --- /dev/null +++ b/addons/compat_rhs_usf3/CfgMagazines.hpp @@ -0,0 +1,58 @@ +class cfgMagazines { + class CA_Magazine; + class VehicleMagazine; + class rhsusf_mag_40Rnd_46x30_AP: CA_Magazine { + descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; + initSpeed = 680; // according with the ACE_muzzleVelocities at 15°C, default RHS value 680.1 + }; + class rhsusf_mag_40Rnd_46x30_FMJ: CA_Magazine { + descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; + initSpeed = 620; // default RHS value according with the ACE_muzzleVelocities at 15°C + lastRoundsTracer = 0; + picture = "\rhsusf\addons\rhsusf_weapons2\glock17g4\data\rhs_mag1_glock17g4_ca.paa"; + tracersEvery = 0; + }; + class rhsusf_mag_40Rnd_46x30_JHP: CA_Magazine { + descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; + initSpeed = 690; // according with the ACE_muzzleVelocities at 15°C, default RHS value 620 + }; + class rhs_mag_30Rnd_556x45_M855A1_Stanag; + + class rhsusf_100Rnd_556x45_soft_pouch: rhs_mag_30Rnd_556x45_M855A1_Stanag { + ACE_isBelt = 1; + }; + class rhsusf_50Rnd_762x51: CA_Magazine { + ACE_isBelt = 1; + }; + class rhs_mag_100rnd_127x99_mag: VehicleMagazine { + ACE_isBelt = 1; + }; + class RHS_48Rnd_40mm_MK19: VehicleMagazine { + ACE_isBelt = 1; + }; + + class CA_LauncherMagazine; + class rhs_mag_smaw_SR: CA_LauncherMagazine { + EGVAR(overpressure,priority) = 99; + EGVAR(overpressure,angle) = 0; + EGVAR(overpressure,range) = 0; + EGVAR(overpressure,damage) = 0; + }; + + class rhs_mag_AGM114K_2; + class GVAR(pylon_mag_2rnd_hellfire_k): rhs_mag_AGM114K_2 { + displayName = "2x AGM-114K [ACE]"; + pylonWeapon = "ace_hellfire_launcher"; + ammo = "ACE_Hellfire_AGM114K"; + }; + class GVAR(pylon_mag_2rnd_hellfire_n): rhs_mag_AGM114K_2 { + displayName = "2x AGM-114N [ACE]"; + pylonWeapon = "ace_hellfire_launcher_N"; + ammo = "ACE_Hellfire_AGM114N"; + }; + class GVAR(pylon_mag_2rnd_hellfire_l): rhs_mag_AGM114K_2 { + displayName = "2x AGM-114L [ACE]"; + pylonWeapon = "ace_hellfire_launcher_L"; + ammo = "ACE_Hellfire_AGM114L"; + }; +}; diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/addons/compat_rhs_usf3/CfgVehicles.hpp similarity index 54% rename from optionals/compat_rhs_usf3/CfgVehicles.hpp rename to addons/compat_rhs_usf3/CfgVehicles.hpp index 87d4c50dee..52fccd808d 100644 --- a/optionals/compat_rhs_usf3/CfgVehicles.hpp +++ b/addons/compat_rhs_usf3/CfgVehicles.hpp @@ -1,173 +1,24 @@ class CfgVehicles { - class LandVehicle; - class Car: LandVehicle { - class ACE_Actions { - class ACE_MainActions {}; - }; - }; - class Car_F: Car {}; - class Truck_F: Car_F {}; - class rhs_truck: Truck_F {}; - - class Tank: LandVehicle { - class NewTurret; - class ACE_Actions { - class ACE_MainActions {}; - }; - }; - class Tank_F: Tank { - class Turrets { - class MainTurret: NewTurret { - class Turrets { - class CommanderOptics; - }; - }; - }; - }; - class Air; - class Helicopter: Air { - class Turrets { - class MainTurret; - }; - }; - - class MBT_01_base_F: Tank_F {}; - class Helicopter_Base_F: Helicopter { - class Eventhandlers; - }; - class Heli_Light_03_base_F: Helicopter_Base_F {}; + class Heli_Light_03_base_F; class RHS_UH1_Base: Heli_light_03_base_F { EGVAR(refuel,fuelCapacity) = 1447; }; - - class RHS_UH1Y_base: RHS_UH1_Base { - class Attributes { - EQUIP_FRIES_ATTRIBUTE; - }; - }; - class RHS_UH1Y_US_base: RHS_UH1Y_base {}; - class RHS_UH1Y: RHS_UH1Y_US_base { - EGVAR(fastroping,enabled) = 2; - EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; - EGVAR(fastroping,friesAttachmentPoint)[] = {0, 2.38, -0.135}; - EGVAR(fastroping,onCut) = QFUNC(onCut); - EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); - EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; - - class UserActions; - class EventHandlers: EventHandlers { - class RHSUSF_EventHandlers; - }; - }; - class RHS_UH1Y_FFAR: RHS_UH1Y { - class UserActions: UserActions { - class OpenCargoDoor; - class CloseCargoDoor: OpenCargoDoor { - condition = QUOTE([ARR_2(this,'doorRB')] call FUNC(canCloseDoor)); - }; - class CloseCargoLDoor: OpenCargoDoor { - condition = QUOTE([ARR_2(this,'doorLB')] call FUNC(canCloseDoor)); - }; - }; - }; - - class Helicopter_Base_H: Helicopter_Base_F { - class Eventhandlers; - }; - class Heli_Transport_01_base_F: Helicopter_Base_H {}; - - class RHS_MELB_base: Helicopter_Base_H {}; - class RHS_MELB_MH6M: RHS_MELB_base { - EGVAR(fastroping,enabled) = 1; - EGVAR(fastroping,ropeOrigins)[] = {{1.166, 0.79, -0.01}, {-1.166, 0.79, -0.01}}; - EGVAR(fastroping,onCut) = QFUNC(onCut); - EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); - }; + class Heli_Transport_01_base_F; class RHS_UH60_Base: Heli_Transport_01_base_F { EGVAR(refuel,fuelCapacity) = 1360; }; - class RHS_UH60M_base: RHS_UH60_Base { - class Attributes { - EQUIP_FRIES_ATTRIBUTE; - }; - }; - class RHS_UH60M_US_base: RHS_UH60M_base {}; - class RHS_UH60M: RHS_UH60M_US_base { - EGVAR(fastroping,enabled) = 2; - EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; - EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.25, -0.65}; - EGVAR(fastroping,onCut) = QFUNC(onCut); - EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); - EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; - - class UserActions { - class OpenCargoDoor; - class CloseCargoDoor: OpenCargoDoor { - condition = QUOTE([ARR_2(this,'doorRB')] call FUNC(canCloseDoor)); - }; - class CloseCargoLDoor: OpenCargoDoor { - condition = QUOTE([ARR_2(this,'doorLB')] call FUNC(canCloseDoor)); - }; - }; - }; - class RHS_UH60M2: RHS_UH60M {}; - - class RHS_UH60M_ESSS: RHS_UH60M2 { - EGVAR(fastroping,enabled) = 0; - class Attributes: Attributes { - delete EGVAR(fastroping,equipFRIES); - }; - }; - - class RHS_UH60M_MEV: RHS_UH60M { - EGVAR(fastroping,enabled) = 0; - class Attributes: Attributes { - delete EGVAR(fastroping,equipFRIES); - }; - }; - - class RHS_UH60M_MEV2: RHS_UH60M_MEV { - EGVAR(fastroping,enabled) = 2; - class Attributes: Attributes { - EQUIP_FRIES_ATTRIBUTE; - }; - }; - class Heli_Transport_02_base_F; class RHS_CH_47F_base: Heli_Transport_02_base_F { EGVAR(refuel,fuelCapacity) = 3914; - EGVAR(fastroping,enabled) = 1; - EGVAR(fastroping,ropeOrigins)[] = {{0.5, -7.15, -0.95}, {-0.5, -7.15, -0.95}}; - EGVAR(fastroping,onCut) = QFUNC(onCut); - EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); - - class UserActions { - class OpenCargoDoor; - class CloseCargoDoor: OpenCargoDoor { - condition = QUOTE([ARR_2(this,'ramp_anim')] call FUNC(canCloseDoor)); - }; - }; }; - + class Helicopter_Base_H; class rhsusf_CH53E_USMC: Helicopter_Base_H { EGVAR(interaction,bodyWidth) = 3.5; EGVAR(map,vehicleLightColor)[] = {1,0,0,0.1}; - EGVAR(fastroping,enabled) = 1; - EGVAR(fastroping,ropeOrigins)[] = {{0,-9.5,2.6}}; - EGVAR(fastroping,onCut) = QFUNC(onCut); - EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); - - class UserActions { - class RampOpen; - class RampClose: RampOpen { - condition = QUOTE([ARR_2(this,'ramp_bottom')] call FUNC(canCloseDoor)); - }; - }; }; - class Heli_Attack_01_base_F: Helicopter_Base_F {}; - + class Heli_Attack_01_base_F; class RHS_AH1Z_base: Heli_Attack_01_base_F { EGVAR(refuel,fuelCapacity) = 1600; EGVAR(hellfire,addLaserDesignator) = 1; @@ -192,67 +43,44 @@ class CfgVehicles { EGVAR(refuel,fuelCapacity) = 302; }; + class Truck_F; class Truck_01_base_F: Truck_F {}; class rhsusf_fmtv_base: Truck_01_base_F { EGVAR(refuel,fuelCapacity) = 219; }; class rhsusf_M1078A1P2_B_M2_fmtv_usarmy; class rhsusf_M1078A1R_SOV_M2_D_fmtv_socom: rhsusf_M1078A1P2_B_M2_fmtv_usarmy { - transportAmmo = 0; EGVAR(rearm,defaultSupply) = 800; - transportFuel = 0; EGVAR(refuel,hooks)[] = {{1.1,0.9,-1.2}}; EGVAR(refuel,fuelCargo) = 900; // 45 jerrycans - transportRepair = 0; - EGVAR(repair,canRepair) = 1; }; class rhsusf_HEMTT_A4_base: Truck_01_base_F {}; class rhsusf_M977A4_usarmy_wd: rhsusf_HEMTT_A4_base {}; class rhsusf_M977A4_AMMO_usarmy_wd: rhsusf_M977A4_usarmy_wd { - transportAmmo = 0; EGVAR(rearm,defaultSupply) = 1200; }; - class rhsusf_M977A4_BKIT_usarmy_wd: rhsusf_M977A4_usarmy_wd {}; + class rhsusf_M977A4_BKIT_usarmy_wd; class rhsusf_M977A4_AMMO_BKIT_usarmy_wd: rhsusf_M977A4_BKIT_usarmy_wd { - transportAmmo = 0; EGVAR(rearm,defaultSupply) = 1200; }; - class rhsusf_M977A4_BKIT_M2_usarmy_wd: rhsusf_M977A4_usarmy_wd {}; + class rhsusf_M977A4_BKIT_M2_usarmy_wd; class rhsusf_M977A4_AMMO_BKIT_M2_usarmy_wd: rhsusf_M977A4_BKIT_M2_usarmy_wd { - transportAmmo = 0; EGVAR(rearm,defaultSupply) = 1200; }; class rhsusf_M978A4_usarmy_wd: rhsusf_M977A4_usarmy_wd { - transportFuel = 0; EGVAR(refuel,hooks)[] = {{-0.44,-4.87,0}, {0.5,-4.87,0}}; EGVAR(refuel,fuelCargo) = 10000; }; class rhsusf_M978A4_BKIT_usarmy_wd: rhsusf_M977A4_usarmy_wd { - transportFuel = 0; EGVAR(refuel,hooks)[] = {{-0.44,-4.87,0}, {0.5,-4.87,0}}; EGVAR(refuel,fuelCargo) = 10000; }; - - class rhsusf_M977A4_REPAIR_usarmy_wd: rhsusf_M977A4_usarmy_wd { - transportRepair = 0; - EGVAR(repair,canRepair) = 1; - }; - - class rhsusf_M977A4_REPAIR_BKIT_usarmy_wd: rhsusf_M977A4_BKIT_usarmy_wd { - transportRepair = 0; - EGVAR(repair,canRepair) = 1; - }; - - class rhsusf_M977A4_REPAIR_BKIT_M2_usarmy_wd: rhsusf_M977A4_BKIT_M2_usarmy_wd { - transportRepair = 0; - EGVAR(repair,canRepair) = 1; - }; - + class Tank_F; class APC_Tracked_02_base_F: Tank_F {}; class rhsusf_m113tank_base: APC_Tracked_02_base_F { EGVAR(map,vehicleLightColor)[] = {0,1,0,0.1}; @@ -266,9 +94,8 @@ class CfgVehicles { EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; }; - class rhsusf_m113_usarmy: rhsusf_m113tank_base {}; + class rhsusf_m113_usarmy; class rhsusf_m113_usarmy_supply: rhsusf_m113_usarmy { - transportAmmo = 0; EGVAR(rearm,defaultSupply) = 1200; }; @@ -303,6 +130,7 @@ class CfgVehicles { EGVAR(vehicle_damage,engineFireProb) = 0.7; EGVAR(vehicle_damage,detonationDuringFireProb) = 0.5; }; + class MBT_01_base_F; class rhsusf_m1a1tank_base: MBT_01_base_F { EGVAR(refuel,fuelCapacity) = 1909; EGVAR(vehicle_damage,hullDetonationProb) = 0; @@ -413,85 +241,6 @@ class CfgVehicles { EGVAR(cargo,hasCargo) = 1; }; - class StaticWeapon: LandVehicle { - class ACE_Actions { - class ACE_MainActions; - }; - }; - class StaticMortar: StaticWeapon {}; - class RHS_M252_Base: StaticMortar { - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = ""; - selection = "main_gun"; - }; - }; - // ENABLE_CSW_ATTRIBUTE; - class ACE_CSW { - enabled = 1; - magazineLocation = ""; - proxyWeapon = QGVAR(rhs_mortar_81mm); - disassembleWeapon = QGVAR(m252_carry); // carry weapon [CfgWeapons] - disassembleTurret = QEGVAR(csw,mortarBaseplate); // turret [CfgVehicles] - desiredAmmo = 1; - ammoLoadTime = 3; - ammoUnloadTime = 3; - }; - }; - - class StaticMGWeapon: StaticWeapon {}; - - class rhs_m2staticmg_base: StaticMGWeapon { - // ENABLE_CSW_ATTRIBUTE; - class ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_M2); - magazineLocation = "_target selectionPosition 'magazine'"; - disassembleWeapon = QGVAR(m2_carry); - disassembleTurret = QEGVAR(csw,m3Tripod); - desiredAmmo = 100; - ammoLoadTime = 10; - ammoUnloadTime = 8; - }; - }; - - class RHS_M2StaticMG_MiniTripod_base: rhs_m2staticmg_base { - class ACE_CSW: ACE_CSW { - enabled = 1; - disassembleTurret = QEGVAR(csw,m3TripodLow); - }; - }; - - class StaticGrenadeLauncher: StaticWeapon {}; - class RHS_MK19_TriPod_base: StaticGrenadeLauncher { - // ENABLE_CSW_ATTRIBUTE; - class ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_MK19); - magazineLocation = "_target selectionPosition 'magazine'"; - disassembleWeapon = QGVAR(mk19_carry); - disassembleTurret = QEGVAR(csw,m3TripodLow); - desiredAmmo = 48; - ammoLoadTime = 10; - ammoUnloadTime = 8; - }; - }; - - class StaticATWeapon: StaticWeapon {}; - class RHS_TOW_TriPod_base: StaticATWeapon { - // ENABLE_CSW_ATTRIBUTE; - class ACE_CSW { - enabled = 1; - proxyWeapon = QGVAR(rhs_weap_TOW_Launcher_static); - magazineLocation = "_target selectionPosition 'tube'"; - disassembleWeapon = QGVAR(tow_carry); - disassembleTurret = QEGVAR(csw,m220Tripod); - desiredAmmo = 1; - ammoLoadTime = 8; - ammoUnloadTime = 5; - }; - }; - class rhsusf_infantry_usmc_base; class rhsusf_usmc_marpat_wd_helipilot: rhsusf_infantry_usmc_base { ace_gforcecoef = 0.55; @@ -508,73 +257,6 @@ class CfgVehicles { }; class Items_base_F; - class ACE_Explosives_Place: Items_base_F { - class ACE_Actions { - class ACE_MainActions; - }; - }; - - // ACE Explosives - class ACE_Explosives_Place_rhsusf_explosive_m112: ACE_Explosives_Place { - displayName = "$STR_RHSUSF_M112_EXPLOSIVE_DISPLAY_NAME"; - model = "\rhsusf\addons\rhsusf_weapons\explosives\rhsusf_m112x1_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.055, 0, 0.038]"; - }; - }; - }; - - class ACE_Explosives_Place_rhsusf_explosive_m112x4: ACE_Explosives_Place { - displayName = "$STR_RHSUSF_M112X4_EXPLOSIVE_DISPLAY_NAME"; - model = "\rhsusf\addons\rhsusf_weapons\explosives\rhsusf_m112x4_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.055, 0.025, 0.102]"; - }; - }; - }; - - class ACE_Explosives_Place_rhsusf_mine_M19: ACE_Explosives_Place { - displayName = "$STR_RHSUSF_M19_ATMINE_DISPLAY_NAME"; - model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m19_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.014, -0.002, 0.046]"; - }; - }; - }; - - class ACE_Explosives_Place_rhsusf_mine_m14: ACE_Explosives_Place { - displayName = "$STR_RHSUSF_M14_APMINE_DISPLAY_NAME"; - model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m14_d"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[-0.002, 0.022, 0.02]"; - }; - }; - }; - - class ACE_Explosives_Place_rhsusf_mine_m49a1_3m: ACE_Explosives_Place { - displayName = "M49A1 (3m)"; - model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_a_e"; - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - position = "[0, -0.016, 0.296]"; - }; - }; - }; - - class ACE_Explosives_Place_rhsusf_mine_m49a1_6m: ACE_Explosives_Place_rhsusf_mine_m49a1_3m { - displayName = "M49A1 (6m)"; - model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_b_e"; - }; - - class ACE_Explosives_Place_rhsusf_mine_m49a1_10m: ACE_Explosives_Place_rhsusf_mine_m49a1_3m { - displayName = "M49A1 (10m)"; - model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_c_e"; - }; - class rhsusf_props_JerryCan_Base: Items_base_F { EGVAR(cargo,canLoad) = 1; EGVAR(cargo,size) = 1; diff --git a/optionals/compat_rhs_usf3/CfgWeapons.hpp b/addons/compat_rhs_usf3/CfgWeapons.hpp similarity index 61% rename from optionals/compat_rhs_usf3/CfgWeapons.hpp rename to addons/compat_rhs_usf3/CfgWeapons.hpp index 88cbbc84a9..53234acf1b 100644 --- a/optionals/compat_rhs_usf3/CfgWeapons.hpp +++ b/addons/compat_rhs_usf3/CfgWeapons.hpp @@ -1,16 +1,4 @@ class CfgWeapons { - class NVGoggles; - class rhsusf_ANPVS_14: NVGoggles { // Monocular - modelOptics = ""; - EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_4096.paa); - EGVAR(nightvision,bluRadius) = 0.13; - }; - class rhsusf_ANPVS_15: rhsusf_ANPVS_14 { // Binocular (same as base) - modelOptics = ""; - EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_binos_4096.paa); - EGVAR(nightvision,bluRadius) = 0.15; - }; - class Pistol_Base_F; class Rifle_Base_F; class rhs_weap_m14ebrri_base; @@ -186,146 +174,8 @@ class CfgWeapons { EGVAR(overheating,jamTypesAllowed)[] = {"Fire", "Dud"}; }; - // RHS sniper scopes - class ItemCore; - class InventoryOpticsItem_Base_F; - class rhsusf_acc_sniper_base: ItemCore { - ACE_ScopeAdjust_Vertical[] = {-4, 30}; - ACE_ScopeAdjust_Horizontal[] = {-6, 6}; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class pso1_scope { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - // ACOG is a sniper scope for some reason, but we don't want scope adjust - class rhsusf_acc_ACOG: rhsusf_acc_sniper_base { - ACE_ScopeAdjust_Vertical[] = { 0, 0 }; - ACE_ScopeAdjust_Horizontal[] = { 0, 0 }; - ACE_ScopeAdjust_VerticalIncrement = 0; - ACE_ScopeAdjust_HorizontalIncrement = 0; - }; - class rhsusf_acc_LEUPOLDMK4: rhsusf_acc_sniper_base { - ACE_ScopeHeightAboveRail = 2.62567; - }; - class rhsusf_acc_LEUPOLDMK4_2: rhsusf_acc_sniper_base { - ACE_ScopeHeightAboveRail = 3.86377; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class pso1_scope { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class rhsusf_acc_premier: rhsusf_acc_LEUPOLDMK4_2 { - ACE_ScopeHeightAboveRail = 5.26066; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class pso1_scope { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class rhsusf_acc_premier_low: rhsusf_acc_premier { - ACE_ScopeHeightAboveRail = 3.90899; - }; - class rhsusf_acc_premier_anpvs27: rhsusf_acc_premier { - ACE_ScopeHeightAboveRail = 5.25066; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class pso1_nvg { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class rhsusf_acc_M8541: rhsusf_acc_premier { // http://www.schmidtundbender.de/en/products/police-and-military-forces/3-12x50-pm-iilpmtc.html - ACE_ScopeHeightAboveRail = 4.2235; - ACE_ScopeAdjust_Vertical[] = {0, 22}; - ACE_ScopeAdjust_Horizontal[] = {-6, 6}; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class Snip { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class rhsusf_acc_M8541_low: rhsusf_acc_M8541 { - ACE_ScopeHeightAboveRail = 2.9789; - }; - class rhsusf_acc_nxs_3515x50_base: ItemCore { // http://www.nightforceusa.com/PDF/nightforce-2011-catalog.pdf#page=12 - ACE_ScopeAdjust_Vertical[] = {0, 30}; - ACE_ScopeAdjust_Horizontal[] = {-10.9, 10.9}; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class nxs_scope { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class rhsusf_acc_nxs_3515x50f1_base: rhsusf_acc_sniper_base { // http://www.nightforceusa.com/PDF/nightforce-2011-catalog.pdf#page=12 - ACE_ScopeAdjust_Vertical[] = {0, 30}; - ACE_ScopeAdjust_Horizontal[] = {-10.9, 10.9}; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class nxs_scope { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class rhsusf_acc_nxs_5522x56_base: ItemCore { // http://www.nightforceusa.com/PDF/nightforce-2011-catalog.pdf#page=12 - ACE_ScopeAdjust_Vertical[] = {0, 27.3}; - ACE_ScopeAdjust_Horizontal[] = {-8.2, 8.2}; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class nxs_scope { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - - // RHS lauchers + // RHS launchers class launch_O_Titan_F; - class rhs_weap_fgm148: launch_O_Titan_F { - EGVAR(javelin,enabled) = 1; - EGVAR(overpressure,offset) = 1.1; - weaponInfoType = "ACE_RscOptics_javelin"; - modelOptics = "\z\ace\addons\javelin\data\reticle_titan.p3d"; - canLock = 0; - lockingTargetSound[] = {"",0,1}; - lockedTargetSound[] = {"",0,1}; - class Single; - class Cruise: Single { - EGVAR(missileGuidance,attackProfile) = "JAV_DIR"; - }; - class TopDown: Single { - EGVAR(missileGuidance,attackProfile) = "JAV_TOP"; - }; - }; class rhs_weap_fim92: launch_O_Titan_F { EGVAR(overpressure,range) = 6; @@ -334,10 +184,7 @@ class CfgWeapons { EGVAR(overpressure,offset) = 1.45; }; - class Launcher; - class Launcher_Base_F: Launcher { - class WeaponSlotsInfo; - }; + class Launcher_Base_F; class rhs_weap_smaw: Launcher_Base_F { EGVAR(reloadlaunchers,enabled) = 1; @@ -586,108 +433,4 @@ class CfgWeapons { ACE_Protection = 1; HEARING_PROTECTION_VICCREW }; - - CREATE_CSW_PROXY(rhs_mortar_81mm); - CREATE_CSW_PROXY(RHS_M2); - CREATE_CSW_PROXY(RHS_MK19); - CREATE_CSW_PROXY(Rhs_weap_TOW_Launcher_static); - - class GVAR(m252_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "weapon"; - deployTime = 20; - pickupTime = 25; - class assembleTo { - EGVAR(csw,mortarBaseplate) = "RHS_M252_WD"; - }; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - // One WeaponSlot with a positive value for iconScale forces game to use icon overlay method. - // Required, because the inventory icon has no accessory variants. - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 620; // M252 Mortar Weight - }; - displayName = ECSTRING(CSW,m252_tube); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\RHS_M252_D_ca.paa"; - }; - - class GVAR(m2_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "weapon"; - deployTime = 4; - pickupTime = 4; - class assembleTo { - EGVAR(csw,m3Tripod) = "RHS_M2StaticMG_WD"; - EGVAR(csw,m3TripodLow) = "RHS_M2StaticMG_MiniTripod_WD"; - }; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 840; - }; - displayName = ECSTRING(CSW,m2_gun); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\RHS_M2StaticMG_D_ca.paa"; - }; - - class GVAR(mk19_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "weapon"; - deployTime = 4; - pickupTime = 4; - class assembleTo { - EGVAR(csw,m3TripodLow) = "RHS_MK19_TriPod_WD"; - }; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 770; - }; - displayName = ECSTRING(CSW,mk19_gun); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\RHS_MK19_TriPod_D_ca.paa"; - }; - - class GVAR(tow_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "weapon"; - deployTime = 4; - pickupTime = 4; - class assembleTo { - EGVAR(csw,m220Tripod) = "RHS_TOW_TriPod_WD"; - }; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 500; - }; - displayName = ECSTRING(CSW,tow_tube); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsusf\addons\rhsusf_heavyweapons\data\Ico\RHS_TOW_TriPod_D_ca.paa"; - }; }; diff --git a/optionals/compat_rhs_usf3/XEH_PREP.hpp b/addons/compat_rhs_usf3/XEH_PREP.hpp similarity index 100% rename from optionals/compat_rhs_usf3/XEH_PREP.hpp rename to addons/compat_rhs_usf3/XEH_PREP.hpp diff --git a/optionals/compat_rhs_usf3/XEH_preInit.sqf b/addons/compat_rhs_usf3/XEH_preInit.sqf similarity index 100% rename from optionals/compat_rhs_usf3/XEH_preInit.sqf rename to addons/compat_rhs_usf3/XEH_preInit.sqf diff --git a/optionals/compat_rhs_usf3/XEH_preStart.sqf b/addons/compat_rhs_usf3/XEH_preStart.sqf similarity index 100% rename from optionals/compat_rhs_usf3/XEH_preStart.sqf rename to addons/compat_rhs_usf3/XEH_preStart.sqf diff --git a/optionals/compat_rhs_usf3/CfgMagazineGroups.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgMagazineGroups.hpp similarity index 100% rename from optionals/compat_rhs_usf3/CfgMagazineGroups.hpp rename to addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgMagazineGroups.hpp diff --git a/optionals/compat_rhs_usf3/CfgMagazines.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgMagazines.hpp similarity index 54% rename from optionals/compat_rhs_usf3/CfgMagazines.hpp rename to addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgMagazines.hpp index b3457b1d91..8fb6b777b1 100644 --- a/optionals/compat_rhs_usf3/CfgMagazines.hpp +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgMagazines.hpp @@ -1,124 +1,5 @@ -class cfgMagazines { - class CA_Magazine; - class VehicleMagazine; - class rhsusf_mag_40Rnd_46x30_AP: CA_Magazine { - descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; - initSpeed = 680; // according with the ACE_muzzleVelocities at 15°C, default RHS value 680.1 - }; - class rhsusf_mag_40Rnd_46x30_FMJ: CA_Magazine { - descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; - initSpeed = 620; // default RHS value according with the ACE_muzzleVelocities at 15°C - lastRoundsTracer = 0; - picture = "\rhsusf\addons\rhsusf_weapons2\glock17g4\data\rhs_mag1_glock17g4_ca.paa"; - tracersEvery = 0; - }; - class rhsusf_mag_40Rnd_46x30_JHP: CA_Magazine { - descriptionShort = "Caliber: 4.6x30 mm
Rounds: 40
Used in: MP7A2"; - initSpeed = 690; // according with the ACE_muzzleVelocities at 15°C, default RHS value 620 - }; - class rhs_mag_30Rnd_556x45_M855A1_Stanag; - - class rhsusf_100Rnd_556x45_soft_pouch: rhs_mag_30Rnd_556x45_M855A1_Stanag { - ace_isbelt = 1; - }; - class rhsusf_50Rnd_762x51: CA_Magazine { - ace_isbelt = 1; - }; - class rhs_mag_100rnd_127x99_mag: VehicleMagazine { - ace_isbelt = 1; - }; - class RHS_48Rnd_40mm_MK19: VehicleMagazine { - ace_isbelt = 1; - }; - - class CA_LauncherMagazine; - class rhs_mag_smaw_SR: CA_LauncherMagazine { - EGVAR(overpressure,priority) = 99; - EGVAR(overpressure,angle) = 0; - EGVAR(overpressure,range) = 0; - EGVAR(overpressure,damage) = 0; - }; - - class rhs_mag_AGM114K_2; - class GVAR(pylon_mag_2rnd_hellfire_k): rhs_mag_AGM114K_2 { - displayName = "2x AGM-114K [ACE]"; - pylonWeapon = "ace_hellfire_launcher"; - ammo = "ACE_Hellfire_AGM114K"; - }; - class GVAR(pylon_mag_2rnd_hellfire_n): rhs_mag_AGM114K_2 { - displayName = "2x AGM-114N [ACE]"; - pylonWeapon = "ace_hellfire_launcher_N"; - ammo = "ACE_Hellfire_AGM114N"; - }; - class GVAR(pylon_mag_2rnd_hellfire_l): rhs_mag_AGM114K_2 { - displayName = "2x AGM-114L [ACE]"; - pylonWeapon = "ace_hellfire_launcher_L"; - ammo = "ACE_Hellfire_AGM114L"; - }; - - // ACE Explosives - class rhsusf_m112_mag: CA_Magazine { - ace_explosives_DelayTime = 1; - ace_explosives_Placeable = 1; - ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_explosive_m112"; - useAction = 0; - class ACE_Triggers { - SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; - class Timer { - FuseTime = 0.5; - }; - class Command { - FuseTime = 0.5; - }; - class MK16_Transmitter: Command {}; - class DeadmanSwitch: Command {}; - }; - }; - - class rhsusf_m112x4_mag: rhsusf_m112_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_explosive_m112x4"; - }; - - class ATMine_Range_Mag; - class rhs_mine_M19_mag: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_mine_M19"; - class ACE_Triggers { - SupportedTriggers[] = {"PressurePlate"}; - class PressurePlate { - digDistance = 0.075; - }; - }; - }; - - class rhsusf_mine_m14_mag: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_mine_m14"; - class ACE_Triggers { - SupportedTriggers[] = {"PressurePlate"}; - class PressurePlate { - digDistance = 0.03; - }; - }; - }; - - class rhsusf_mine_m49a1_3m_mag: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_mine_m49a1_3m"; - class ACE_Triggers { - SupportedTriggers[] = {"Tripwire"}; - class Tripwire { - digDistance = 0.125; - }; - }; - }; - - class rhsusf_mine_m49a1_6m_mag: rhsusf_mine_m49a1_3m_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_mine_m49a1_6m"; - }; - - class rhsusf_mine_m49a1_10m_mag: rhsusf_mine_m49a1_3m_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhsusf_mine_m49a1_10m"; - }; - - // RHS magazines for crew handled ammo +class CfgMagazines { + // RHS magazines for crew handled ammo class rhs_mag_TOW; class GVAR(mag_TOW): rhs_mag_TOW { scope = 2; @@ -200,6 +81,7 @@ class cfgMagazines { picture = "\A3\Weapons_F_beta\Launchers\titan\Data\UI\gear_titan_missile_at_CA.paa"; }; + class RHS_48Rnd_40mm_MK19; class GVAR(48Rnd_40mm_MK19): RHS_48Rnd_40mm_MK19 { scope = 2; displayName = CSTRING(48Rnd_40mm_MK19_displayName); diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgVehicles.hpp new file mode 100644 index 0000000000..cbca20cce7 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgVehicles.hpp @@ -0,0 +1,77 @@ +class CfgVehicles { + class LandVehicle; + class StaticWeapon: LandVehicle { + class ACE_Actions { + class ACE_MainActions; + }; + }; + class StaticMortar: StaticWeapon {}; + class RHS_M252_Base: StaticMortar { + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = ""; + selection = "main_gun"; + }; + }; + + class ACE_CSW { + enabled = 1; + magazineLocation = ""; + proxyWeapon = QGVAR(rhs_mortar_81mm); + disassembleWeapon = QGVAR(m252_carry); // carry weapon [CfgWeapons] + disassembleTurret = QEGVAR(csw,mortarBaseplate); // turret [CfgVehicles] + desiredAmmo = 1; + ammoLoadTime = 3; + ammoUnloadTime = 3; + }; + }; + + class StaticMGWeapon; + class rhs_m2staticmg_base: StaticMGWeapon { + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_M2); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(m2_carry); + disassembleTurret = QEGVAR(csw,m3Tripod); + desiredAmmo = 100; + ammoLoadTime = 10; + ammoUnloadTime = 8; + }; + }; + + class RHS_M2StaticMG_MiniTripod_base: rhs_m2staticmg_base { + class ACE_CSW: ACE_CSW { + enabled = 1; + disassembleTurret = QEGVAR(csw,m3TripodLow); + }; + }; + + class StaticGrenadeLauncher; + class RHS_MK19_TriPod_base: StaticGrenadeLauncher { + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_MK19); + magazineLocation = "_target selectionPosition 'magazine'"; + disassembleWeapon = QGVAR(mk19_carry); + disassembleTurret = QEGVAR(csw,m3TripodLow); + desiredAmmo = 48; + ammoLoadTime = 10; + ammoUnloadTime = 8; + }; + }; + + class StaticATWeapon; + class RHS_TOW_TriPod_base: StaticATWeapon { + class ACE_CSW { + enabled = 1; + proxyWeapon = QGVAR(rhs_weap_TOW_Launcher_static); + magazineLocation = "_target selectionPosition 'tube'"; + disassembleWeapon = QGVAR(tow_carry); + disassembleTurret = QEGVAR(csw,m220Tripod); + desiredAmmo = 1; + ammoLoadTime = 8; + ammoUnloadTime = 5; + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgWeapons.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgWeapons.hpp new file mode 100644 index 0000000000..d373e7fe67 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/CfgWeapons.hpp @@ -0,0 +1,110 @@ +class CfgWeapons { + CREATE_CSW_PROXY(rhs_mortar_81mm); + CREATE_CSW_PROXY(RHS_M2); + CREATE_CSW_PROXY(RHS_MK19); + CREATE_CSW_PROXY(Rhs_weap_TOW_Launcher_static); + + class Launcher; + class Launcher_Base_F: Launcher { + class WeaponSlotsInfo; + }; + + class GVAR(m252_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "weapon"; + deployTime = 20; + pickupTime = 25; + class assembleTo { + EGVAR(csw,mortarBaseplate) = "RHS_M252_WD"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + // One WeaponSlot with a positive value for iconScale forces game to use icon overlay method. + // Required, because the inventory icon has no accessory variants. + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 620; // M252 Mortar Weight + }; + displayName = ECSTRING(CSW,m252_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\RHS_M252_D_ca.paa"; + }; + + class GVAR(m2_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,m3Tripod) = "RHS_M2StaticMG_WD"; + EGVAR(csw,m3TripodLow) = "RHS_M2StaticMG_MiniTripod_WD"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 840; + }; + displayName = ECSTRING(CSW,m2_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\RHS_M2StaticMG_D_ca.paa"; + }; + + class GVAR(mk19_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,m3TripodLow) = "RHS_MK19_TriPod_WD"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 770; + }; + displayName = ECSTRING(CSW,mk19_gun); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsusf\addons\rhsusf_heavyweapons\data\ico\RHS_MK19_TriPod_D_ca.paa"; + }; + + class GVAR(tow_carry): Launcher_Base_F { + dlc = "ace"; + class ACE_CSW { + type = "weapon"; + deployTime = 4; + pickupTime = 4; + class assembleTo { + EGVAR(csw,m220Tripod) = "RHS_TOW_TriPod_WD"; + }; + }; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + iconScale = 0.1; + }; + mass = 500; + }; + displayName = ECSTRING(CSW,tow_tube); + author = ECSTRING(common,ACETeam); + scope = 2; + model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); + modes[] = {}; + picture = "\rhsusf\addons\rhsusf_heavyweapons\data\Ico\RHS_TOW_TriPod_D_ca.paa"; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/config.cpp new file mode 100644 index 0000000000..9bd4ef913a --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/config.cpp @@ -0,0 +1,24 @@ +#include "script_component.hpp" + +// Config will be binerized, so this include is only required at build-time +#include "\z\ace\addons\csw\script_config_macros_csw.hpp" + +class CfgPatches { + class ADDON { + addonRootClass = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {QGVAR(m252_carry), QGVAR(m2_carry), QGVAR(mk19_carry), QGVAR(tow_carry)}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_csw" + }; + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgMagazines.hpp" +#include "CfgMagazineGroups.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/script_component.hpp new file mode 100644 index 0000000000..d113809426 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_usf3\script_component.hpp" + +#define SUBCOMPONENT csw +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/optionals/compat_rhs_usf3/stringtable.xml b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/stringtable.xml similarity index 83% rename from optionals/compat_rhs_usf3/stringtable.xml rename to addons/compat_rhs_usf3/compat_rhs_usf3_csw/stringtable.xml index 1755f7a1ae..d79afe08c6 100644 --- a/optionals/compat_rhs_usf3/stringtable.xml +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/stringtable.xml @@ -1,7 +1,7 @@ - - + + [CSW] BGM-71A TOW [CSW] BGM-71A TOW [CSW] BGM-71A TOW @@ -9,7 +9,7 @@ [CSW] BGM-71A TOW [CSW] BGM-71A TOW - + [CSW] BGM-71B TOW [CSW] BGM-71B TOW [CSW] BGM-71B TOW @@ -17,7 +17,7 @@ [CSW] BGM-71B TOW [CSW] BGM-71B TOW - + [CSW] BGM-71C ITOW [CSW] BGM-71C ITOW [CSW] BGM-71C ITOW @@ -25,7 +25,7 @@ [CSW] BGM-71C ITOW [CSW] BGM-71C ITOW - + [CSW] BGM-71D TOW-2 [CSW] BGM-71D TOW-2 [CSW] BGM-71D TOW-2 @@ -33,7 +33,7 @@ [CSW] BGM-71D TOW-2 [CSW] BGM-71D TOW-2 - + [CSW] BGM-71E TOW-2A [CSW] BGM-71E TOW-2A [CSW] BGM-71E TOW-2A @@ -41,7 +41,7 @@ [CSW] BGM-71E TOW-2A [CSW] BGM-71E TOW-2A - + [CSW] BGM-71F TOW-2B [CSW] BGM-71F TOW-2B [CSW] BGM-71F TOW-2B @@ -49,7 +49,7 @@ [CSW] BGM-71F TOW-2B [CSW] BGM-71F TOW-2B - + [CSW] BGM-71F-3 TOW-2B AERO [CSW] BGM-71F-3 TOW-2B AERO [CSW] BGM-71F-3 TOW-2B AERO @@ -57,7 +57,7 @@ [CSW] BGM-71F-3 TOW-2B AERO [CSW] BGM-71F-3 TOW-2B AERO - + [CSW] BGM-71H Bunker Buster [CSW] BGM-71H 벙커버스터 [CSW] BGM-71H Bunker Buster @@ -65,7 +65,7 @@ [CSW] BGM-71H Bunker Buster [CSW] BGM-71H Anti-Búnquer - + [CSW] Mk. 19 40mm M384 HE [CSW] Mk.19 40mm M384 HE [CSW] Mk. 19 40mm M384 HE @@ -73,7 +73,7 @@ [CSW] Mk. 19 40 мм M384 HE [CSW] Mk. 19 40mm M384 HE - + [CSW] Mk. 19 40mm M430I HEDP [CSW] Mk.19 40mm M430I 이중목적고폭탄 [CSW] Mk. 19 40mm M430I HEDP @@ -81,7 +81,7 @@ [CSW] Mk. 19 40 мм M430I HEDP [CSW] Mk. 19 40mm M430I HEDP - + [CSW] Mk. 19 40mm M430A1 HEDP [CSW] Mk.19 40mm M430A1 이중목적고폭탄 [CSW] Mk. 19 40mm M430A1 HEDP @@ -89,7 +89,7 @@ [CSW] Mk. 19 40 мм M430A1 HEDP [CSW] Mk. 19 40mm M430A1 HEDP - + [CSW] Mk. 19 40mm M1001 Canister [CSW] Mk.19 40mm M1001 산탄 [CSW] Mk. 19 40mm M1001 キャニスター diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgAmmo.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgAmmo.hpp new file mode 100644 index 0000000000..eea589b99b --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgAmmo.hpp @@ -0,0 +1,25 @@ +class CfgAmmo { + // ACE Explosives + class PipeBombBase; + class rhsusf_m112_ammo: PipeBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {0.055, 0, 0.038}; + }; + + class rhsusf_m112x4_ammo: PipeBombBase { + EGVAR(explosives,defuseObjectPosition)[] = {0.055, -0.025, 0.102}; + }; + + class MineBase; + class rhsusf_mine_m19_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.02, 0.046}; + }; + + class rhsusf_mine_m14_ammo: MineBase { + EGVAR(explosives,defuseObjectPosition)[] = {-0.02, -0.015, 0.02}; + }; + + class APERSMine_Range_Ammo; + class rhsusf_mine_m49a1_3m_ammo: APERSMine_Range_Ammo { + EGVAR(explosives,defuseObjectPosition)[] = {0, 0.016, 0.296}; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgMagazines.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgMagazines.hpp new file mode 100644 index 0000000000..552ef8628c --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgMagazines.hpp @@ -0,0 +1,63 @@ +class CfgMagazines { + class CA_Magazine; + class rhsusf_m112_mag: CA_Magazine { + EGVAR(explosives,delayTime) = 1; + EGVAR(explosives,placeable) = 1; + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_m112); + useAction = 0; + class ACE_Triggers { + SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; + class Timer { + FuseTime = 0.5; + }; + class Command { + FuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + class DeadmanSwitch: Command {}; + }; + }; + + class rhsusf_m112x4_mag: rhsusf_m112_mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_m112x4); + }; + + class ATMine_Range_Mag; + class rhs_mine_M19_mag: ATMine_Range_Mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_mine_M19); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.075; + }; + }; + }; + + class rhsusf_mine_m14_mag: ATMine_Range_Mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_mine_m14); + class ACE_Triggers { + SupportedTriggers[] = {"PressurePlate"}; + class PressurePlate { + digDistance = 0.03; + }; + }; + }; + + class rhsusf_mine_m49a1_3m_mag: ATMine_Range_Mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_mine_m49a1_3m); + class ACE_Triggers { + SupportedTriggers[] = {"Tripwire"}; + class Tripwire { + digDistance = 0.125; + }; + }; + }; + + class rhsusf_mine_m49a1_6m_mag: rhsusf_mine_m49a1_3m_mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_mine_m49a1_6m); + }; + + class rhsusf_mine_m49a1_10m_mag: rhsusf_mine_m49a1_3m_mag { + EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_mine_m49a1_10m); + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgVehicles.hpp new file mode 100644 index 0000000000..668631b70d --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/CfgVehicles.hpp @@ -0,0 +1,69 @@ +class CfgVehicles { + class Items_base_F; + class EGVAR(explosives,Place): Items_base_F { + class ACE_Actions { + class ACE_MainActions; + }; + }; + + // ACE Explosives + class EGVAR(explosives,Place_rhsusf_explosive_m112): EGVAR(explosives,Place) { + displayName = "$STR_RHSUSF_M112_EXPLOSIVE_DISPLAY_NAME"; + model = "\rhsusf\addons\rhsusf_weapons\explosives\rhsusf_m112x1_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.055, 0, 0.038]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhsusf_explosive_m112x4): EGVAR(explosives,Place) { + displayName = "$STR_RHSUSF_M112X4_EXPLOSIVE_DISPLAY_NAME"; + model = "\rhsusf\addons\rhsusf_weapons\explosives\rhsusf_m112x4_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.055, 0.025, 0.102]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhsusf_mine_M19): EGVAR(explosives,Place) { + displayName = "$STR_RHSUSF_M19_ATMINE_DISPLAY_NAME"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m19_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.014, -0.002, 0.046]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhsusf_mine_m14): EGVAR(explosives,Place) { + displayName = "$STR_RHSUSF_M14_APMINE_DISPLAY_NAME"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m14_d"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[-0.002, 0.022, 0.02]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhsusf_mine_m49a1_3m): EGVAR(explosives,Place) { + displayName = "M49A1 (3m)"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_a_e"; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + position = "[0, -0.016, 0.296]"; + }; + }; + }; + + class EGVAR(explosives,Place_rhsusf_mine_m49a1_6m): EGVAR(explosives,Place_rhsusf_mine_m49a1_3m) { + displayName = "M49A1 (6m)"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_b_e"; + }; + + class EGVAR(explosives,Place_rhsusf_mine_m49a1_10m): EGVAR(explosives,Place_rhsusf_mine_m49a1_3m) { + displayName = "M49A1 (10m)"; + model = "\rhsusf\addons\rhsusf_weapons\mines\rhsusf_m49a1_c_e"; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/config.cpp new file mode 100644 index 0000000000..3ac788a89d --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + addonRootClass = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_explosives" + }; + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/script_component.hpp new file mode 100644 index 0000000000..b2b8019d85 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_explosives/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_usf3\script_component.hpp" + +#define SUBCOMPONENT explosives +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/CfgVehicles.hpp new file mode 100644 index 0000000000..2bda24364b --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/CfgVehicles.hpp @@ -0,0 +1,127 @@ +class CfgVehicles { + class Air; + class Helicopter: Air {}; + class Helicopter_Base_F: Helicopter { + class Eventhandlers; + }; + class Heli_Light_03_base_F: Helicopter_Base_F {}; + class RHS_UH1_Base: Heli_light_03_base_F {}; + class RHS_UH1Y_base: RHS_UH1_Base { + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + class RHS_UH1Y_US_base: RHS_UH1Y_base {}; + class RHS_UH1Y: RHS_UH1Y_US_base { + EGVAR(fastroping,enabled) = 2; + EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 2.38, -0.135}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_usf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_usf3,onPrepare); + EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; + + class UserActions; + class EventHandlers: EventHandlers { + class RHSUSF_EventHandlers; + }; + }; + class RHS_UH1Y_FFAR: RHS_UH1Y { + class UserActions: UserActions { + class OpenCargoDoor; + class CloseCargoDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorRB')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + class CloseCargoLDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorLB')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + }; + }; + + class Helicopter_Base_H: Helicopter_Base_F { + class Eventhandlers; + }; + class Heli_Transport_01_base_F: Helicopter_Base_H {}; + + class RHS_MELB_base: Helicopter_Base_H {}; + class RHS_MELB_MH6M: RHS_MELB_base { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{1.166, 0.79, -0.01}, {-1.166, 0.79, -0.01}}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_usf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_usf3,onPrepare); + }; + class RHS_UH60_Base: Heli_Transport_01_base_F {}; + class RHS_UH60M_base: RHS_UH60_Base { + class Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + class RHS_UH60M_US_base: RHS_UH60M_base {}; + class RHS_UH60M: RHS_UH60M_US_base { + EGVAR(fastroping,enabled) = 2; + EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.25, -0.65}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_usf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_usf3,onPrepare); + EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; + + class UserActions { + class OpenCargoDoor; + class CloseCargoDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorRB')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + class CloseCargoLDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorLB')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + }; + }; + class RHS_UH60M2: RHS_UH60M {}; + class RHS_UH60M_ESSS: RHS_UH60M2 { + EGVAR(fastroping,enabled) = 0; + class Attributes: Attributes { + delete EGVAR(fastroping,equipFRIES); + }; + }; + + class RHS_UH60M_MEV: RHS_UH60M { + EGVAR(fastroping,enabled) = 0; + class Attributes: Attributes { + delete EGVAR(fastroping,equipFRIES); + }; + }; + + class RHS_UH60M_MEV2: RHS_UH60M_MEV { + EGVAR(fastroping,enabled) = 2; + class Attributes: Attributes { + EQUIP_FRIES_ATTRIBUTE; + }; + }; + + class Heli_Transport_02_base_F; + class RHS_CH_47F_base: Heli_Transport_02_base_F { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{0.5, -7.15, -0.95}, {-0.5, -7.15, -0.95}}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_usf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_usf3,onPrepare); + + class UserActions { + class OpenCargoDoor; + class CloseCargoDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'ramp_anim')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + }; + }; + + class rhsusf_CH53E_USMC: Helicopter_Base_H { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{0,-9.5,2.6}}; + EGVAR(fastroping,onCut) = QEFUNC(compat_rhs_usf3,onCut); + EGVAR(fastroping,onPrepare) = QEFUNC(compat_rhs_usf3,onPrepare); + + class UserActions { + class RampOpen; + class RampClose: RampOpen { + condition = QUOTE([ARR_2(this,'ramp_bottom')] call EFUNC(compat_rhs_usf3,canCloseDoor)); + }; + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/config.cpp new file mode 100644 index 0000000000..345f70a1e7 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/config.cpp @@ -0,0 +1,23 @@ +#include "script_component.hpp" + +// Config will be binerized, so this include is only required at build-time +#include "\z\ace\addons\fastroping\script_macros.hpp" + +class CfgPatches { + class ADDON { + name = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_fastroping" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/script_component.hpp new file mode 100644 index 0000000000..fc676b170e --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_fastroping/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_usf3\script_component.hpp" + +#define SUBCOMPONENT fastroping +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgAmmo.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgAmmo.hpp new file mode 100644 index 0000000000..65ca880587 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgAmmo.hpp @@ -0,0 +1,39 @@ +class CfgAmmo { + class MissileBase; + class rhs_ammo_M_fgm148_AT: MissileBase { + irLock = 1; + laserLock = 0; + airLock = 0; + + // Begin ACE guidance Configs + class ace_missileguidance { + enabled = 1; + + minDeflection = 0.00005; // Minium flap deflection for guidance + maxDeflection = 0.025; // Maximum flap deflection for guidance + incDeflection = 0.00005; // The incrmeent in which deflection adjusts. + + canVanillaLock = 0; + + // Guidance type for munitions + defaultSeekerType = "Optic"; + seekerTypes[] = { "Optic" }; + + defaultSeekerLockMode = "LOBL"; + seekerLockModes[] = { "LOBL" }; + + seekerAngle = 180; // Angle in front of the missile which can be searched + seekerAccuracy = 1; // seeker accuracy multiplier + + seekerMinRange = 0; + seekerMaxRange = 2500; // Range from the missile which the seeker can visually search + + seekLastTargetPos = 1; // seek last target position [if seeker loses LOS of target, continue to last known pos] + + // Attack profile type selection + defaultAttackProfile = "JAV_TOP"; + attackProfiles[] = { "JAV_TOP", "JAV_DIR" }; + useModeForAttackProfile = 1; + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgWeapons.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgWeapons.hpp new file mode 100644 index 0000000000..678293925d --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/CfgWeapons.hpp @@ -0,0 +1,19 @@ +class CfgWeapons { + class launch_O_Titan_F; + class rhs_weap_fgm148: launch_O_Titan_F { + EGVAR(javelin,enabled) = 1; + EGVAR(overpressure,offset) = 1.1; + weaponInfoType = "ACE_RscOptics_javelin"; + modelOptics = "\z\ace\addons\javelin\data\reticle_titan.p3d"; + canLock = 0; + lockingTargetSound[] = {"",0,1}; + lockedTargetSound[] = {"",0,1}; + class Single; + class Cruise: Single { + EGVAR(missileGuidance,attackProfile) = "JAV_DIR"; + }; + class TopDown: Single { + EGVAR(missileGuidance,attackProfile) = "JAV_TOP"; + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/config.cpp new file mode 100644 index 0000000000..c5c581c01f --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + addonRootClass = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_javelin" + }; + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/script_component.hpp new file mode 100644 index 0000000000..312c8ef2af --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_javelin/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_usf3\script_component.hpp" + +#define SUBCOMPONENT javelin +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/CfgWeapons.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/CfgWeapons.hpp new file mode 100644 index 0000000000..006d332186 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/CfgWeapons.hpp @@ -0,0 +1,13 @@ +class CfgWeapons { + class NVGoggles; + class rhsusf_ANPVS_14: NVGoggles { // Monocular + modelOptics = ""; + EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_4096.paa); + EGVAR(nightvision,bluRadius) = 0.13; + }; + class rhsusf_ANPVS_15: rhsusf_ANPVS_14 { // Binocular (same as base) + modelOptics = ""; + EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_binos_4096.paa); + EGVAR(nightvision,bluRadius) = 0.15; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/config.cpp new file mode 100644 index 0000000000..dcbdc49509 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + addonRootClass = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_nightvision" + }; + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/script_component.hpp new file mode 100644 index 0000000000..bf614add9e --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_nightvision/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_usf3\script_component.hpp" + +#define SUBCOMPONENT nightvision +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgEventHandlers.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgEventHandlers.hpp new file mode 100644 index 0000000000..9d5f334607 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgEventHandlers.hpp @@ -0,0 +1,7 @@ +class Extended_InitPost_EventHandlers { + class rhsusf_props_ScepterMFC_Base { + class ADDON { + init = QUOTE(call EFUNC(refuel,makeJerryCan)); + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgVehicles.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgVehicles.hpp new file mode 100644 index 0000000000..5aaf6b4e22 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/CfgVehicles.hpp @@ -0,0 +1,15 @@ +class CfgVehicles { + class rhsusf_M1078A1P2_B_M2_fmtv_usarmy; + class rhsusf_M1078A1R_SOV_M2_D_fmtv_socom: rhsusf_M1078A1P2_B_M2_fmtv_usarmy { + transportFuel = 0; + }; + + class rhsusf_M977A4_usarmy_wd; + class rhsusf_M978A4_usarmy_wd: rhsusf_M977A4_usarmy_wd { + transportFuel = 0; + }; + + class rhsusf_M978A4_BKIT_usarmy_wd: rhsusf_M977A4_usarmy_wd { + transportFuel = 0; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/config.cpp new file mode 100644 index 0000000000..b336b89cc6 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + addonRootClass = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_refuel" + }; + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/script_component.hpp new file mode 100644 index 0000000000..adead3e752 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_refuel/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_usf3\script_component.hpp" + +#define SUBCOMPONENT refuel +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/CfgWeapons.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/CfgWeapons.hpp new file mode 100644 index 0000000000..8e440c8c57 --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/CfgWeapons.hpp @@ -0,0 +1,123 @@ +class CfgWeapons { + // RHS sniper scopes + class ItemCore; + class InventoryOpticsItem_Base_F; + class rhsusf_acc_sniper_base: ItemCore { + ACE_ScopeAdjust_Vertical[] = {-4, 30}; + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class pso1_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + // ACOG is a sniper scope for some reason, but we don't want scope adjust + class rhsusf_acc_ACOG: rhsusf_acc_sniper_base { + ACE_ScopeAdjust_Vertical[] = { 0, 0 }; + ACE_ScopeAdjust_Horizontal[] = { 0, 0 }; + ACE_ScopeAdjust_VerticalIncrement = 0; + ACE_ScopeAdjust_HorizontalIncrement = 0; + }; + class rhsusf_acc_LEUPOLDMK4: rhsusf_acc_sniper_base { + ACE_ScopeHeightAboveRail = 2.62567; + }; + class rhsusf_acc_LEUPOLDMK4_2: rhsusf_acc_sniper_base { + ACE_ScopeHeightAboveRail = 3.86377; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class pso1_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_premier: rhsusf_acc_LEUPOLDMK4_2 { + ACE_ScopeHeightAboveRail = 5.26066; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class pso1_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_premier_low: rhsusf_acc_premier { + ACE_ScopeHeightAboveRail = 3.90899; + }; + class rhsusf_acc_premier_anpvs27: rhsusf_acc_premier { + ACE_ScopeHeightAboveRail = 5.25066; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class pso1_nvg { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_M8541: rhsusf_acc_premier { // http://www.schmidtundbender.de/en/products/police-and-military-forces/3-12x50-pm-iilpmtc.html + ACE_ScopeHeightAboveRail = 4.2235; + ACE_ScopeAdjust_Vertical[] = {0, 22}; + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class Snip { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_M8541_low: rhsusf_acc_M8541 { + ACE_ScopeHeightAboveRail = 2.9789; + }; + class rhsusf_acc_nxs_3515x50_base: ItemCore { // http://www.nightforceusa.com/PDF/nightforce-2011-catalog.pdf#page=12 + ACE_ScopeAdjust_Vertical[] = {0, 30}; + ACE_ScopeAdjust_Horizontal[] = {-10.9, 10.9}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class nxs_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_nxs_3515x50f1_base: rhsusf_acc_sniper_base { // http://www.nightforceusa.com/PDF/nightforce-2011-catalog.pdf#page=12 + ACE_ScopeAdjust_Vertical[] = {0, 30}; + ACE_ScopeAdjust_Horizontal[] = {-10.9, 10.9}; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class nxs_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + class rhsusf_acc_nxs_5522x56_base: ItemCore { // http://www.nightforceusa.com/PDF/nightforce-2011-catalog.pdf#page=12 + ACE_ScopeAdjust_Vertical[] = {0, 27.3}; + ACE_ScopeAdjust_Horizontal[] = {-8.2, 8.2}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo: InventoryOpticsItem_Base_F { + class OpticsModes { + class nxs_scope { + discreteDistance[] = {100}; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/config.cpp b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/config.cpp new file mode 100644 index 0000000000..7c7a65b79e --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + addonRootClass = QUOTE(COMPONENT); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "rhsusf_main_loadorder", + "ace_scopes" + }; + skipWhenMissingDependencies = 1; + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/script_component.hpp b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/script_component.hpp new file mode 100644 index 0000000000..98856e550e --- /dev/null +++ b/addons/compat_rhs_usf3/compat_rhs_usf3_scopes/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_rhs_usf3\script_component.hpp" + +#define SUBCOMPONENT scopes +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/optionals/compat_rhs_usf3/config.cpp b/addons/compat_rhs_usf3/config.cpp similarity index 62% rename from optionals/compat_rhs_usf3/config.cpp rename to addons/compat_rhs_usf3/config.cpp index 1e169fdf6a..bdfc2e1d51 100644 --- a/optionals/compat_rhs_usf3/config.cpp +++ b/addons/compat_rhs_usf3/config.cpp @@ -1,16 +1,16 @@ #include "script_component.hpp" -#include "\z\ace\addons\csw\script_config_macros_csw.hpp" class CfgPatches { class ADDON { name = COMPONENT_NAME; units[] = {}; - weapons[] = {QGVAR(m252_carry), QGVAR(m2_carry), QGVAR(mk19_carry), QGVAR(tow_carry)}; + weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_explosives", "ace_javelin", "ace_rearm", "ace_refuel", "ace_repair", "ace_csw", "rhsusf_main_loadorder"}; + requiredAddons[] = {"rhsusf_main_loadorder"}; author = ECSTRING(common,ACETeam); authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "Fyuran"}; url = ECSTRING(main,URL); + skipWhenMissingDependencies = 1; VERSION_CONFIG; }; }; @@ -22,5 +22,3 @@ class CfgPatches { #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" #include "CfgGlasses.hpp" -#include "CfgMagazineGroups.hpp" - diff --git a/optionals/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf b/addons/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf similarity index 100% rename from optionals/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf rename to addons/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf diff --git a/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf b/addons/compat_rhs_usf3/functions/fnc_onCut.sqf similarity index 100% rename from optionals/compat_rhs_usf3/functions/fnc_onCut.sqf rename to addons/compat_rhs_usf3/functions/fnc_onCut.sqf diff --git a/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf b/addons/compat_rhs_usf3/functions/fnc_onPrepare.sqf similarity index 100% rename from optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf rename to addons/compat_rhs_usf3/functions/fnc_onPrepare.sqf diff --git a/optionals/compat_rhs_usf3/functions/script_component.hpp b/addons/compat_rhs_usf3/functions/script_component.hpp similarity index 100% rename from optionals/compat_rhs_usf3/functions/script_component.hpp rename to addons/compat_rhs_usf3/functions/script_component.hpp diff --git a/addons/compat_rhs_usf3/script_component.hpp b/addons/compat_rhs_usf3/script_component.hpp new file mode 100644 index 0000000000..b84324ad8f --- /dev/null +++ b/addons/compat_rhs_usf3/script_component.hpp @@ -0,0 +1,10 @@ +#define COMPONENT compat_rhs_usf3 +#define COMPONENT_BEAUTIFIED RHS USAF Compatibility + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" + +// Backwards compatibility +#undef GVAR +#define GVAR(var) TRIPLES(PREFIX,COMPONENT,var) diff --git a/optionals/compat_sog/$PBOPREFIX$ b/addons/compat_sog/$PBOPREFIX$ similarity index 100% rename from optionals/compat_sog/$PBOPREFIX$ rename to addons/compat_sog/$PBOPREFIX$ diff --git a/optionals/compat_sog/ACE_CSW_Groups.hpp b/addons/compat_sog/ACE_CSW_Groups.hpp similarity index 100% rename from optionals/compat_sog/ACE_CSW_Groups.hpp rename to addons/compat_sog/ACE_CSW_Groups.hpp diff --git a/optionals/compat_sog/ACE_Medical_Injuries.hpp b/addons/compat_sog/ACE_Medical_Injuries.hpp similarity index 100% rename from optionals/compat_sog/ACE_Medical_Injuries.hpp rename to addons/compat_sog/ACE_Medical_Injuries.hpp diff --git a/optionals/compat_sog/ACE_Triggers.hpp b/addons/compat_sog/ACE_Triggers.hpp similarity index 100% rename from optionals/compat_sog/ACE_Triggers.hpp rename to addons/compat_sog/ACE_Triggers.hpp diff --git a/optionals/compat_sog/CfgAmmo.hpp b/addons/compat_sog/CfgAmmo.hpp similarity index 100% rename from optionals/compat_sog/CfgAmmo.hpp rename to addons/compat_sog/CfgAmmo.hpp diff --git a/optionals/compat_sog/CfgAmmo/bombs.hpp b/addons/compat_sog/CfgAmmo/bombs.hpp similarity index 100% rename from optionals/compat_sog/CfgAmmo/bombs.hpp rename to addons/compat_sog/CfgAmmo/bombs.hpp diff --git a/optionals/compat_sog/CfgAmmo/explosives.hpp b/addons/compat_sog/CfgAmmo/explosives.hpp similarity index 100% rename from optionals/compat_sog/CfgAmmo/explosives.hpp rename to addons/compat_sog/CfgAmmo/explosives.hpp diff --git a/optionals/compat_sog/CfgAmmo/grenades.hpp b/addons/compat_sog/CfgAmmo/grenades.hpp similarity index 100% rename from optionals/compat_sog/CfgAmmo/grenades.hpp rename to addons/compat_sog/CfgAmmo/grenades.hpp diff --git a/optionals/compat_sog/CfgAmmo/melee.hpp b/addons/compat_sog/CfgAmmo/melee.hpp similarity index 100% rename from optionals/compat_sog/CfgAmmo/melee.hpp rename to addons/compat_sog/CfgAmmo/melee.hpp diff --git a/optionals/compat_sog/CfgEventHandlers.hpp b/addons/compat_sog/CfgEventHandlers.hpp similarity index 100% rename from optionals/compat_sog/CfgEventHandlers.hpp rename to addons/compat_sog/CfgEventHandlers.hpp diff --git a/optionals/compat_sog/CfgGlasses.hpp b/addons/compat_sog/CfgGlasses.hpp similarity index 100% rename from optionals/compat_sog/CfgGlasses.hpp rename to addons/compat_sog/CfgGlasses.hpp diff --git a/optionals/compat_sog/CfgMagazines.hpp b/addons/compat_sog/CfgMagazines.hpp similarity index 100% rename from optionals/compat_sog/CfgMagazines.hpp rename to addons/compat_sog/CfgMagazines.hpp diff --git a/optionals/compat_sog/CfgMagazines/belts.hpp b/addons/compat_sog/CfgMagazines/belts.hpp similarity index 100% rename from optionals/compat_sog/CfgMagazines/belts.hpp rename to addons/compat_sog/CfgMagazines/belts.hpp diff --git a/optionals/compat_sog/CfgMagazines/csw.hpp b/addons/compat_sog/CfgMagazines/csw.hpp similarity index 100% rename from optionals/compat_sog/CfgMagazines/csw.hpp rename to addons/compat_sog/CfgMagazines/csw.hpp diff --git a/optionals/compat_sog/CfgMagazines/explosives.hpp b/addons/compat_sog/CfgMagazines/explosives.hpp similarity index 100% rename from optionals/compat_sog/CfgMagazines/explosives.hpp rename to addons/compat_sog/CfgMagazines/explosives.hpp diff --git a/optionals/compat_sog/CfgMagazines/food.hpp b/addons/compat_sog/CfgMagazines/food.hpp similarity index 100% rename from optionals/compat_sog/CfgMagazines/food.hpp rename to addons/compat_sog/CfgMagazines/food.hpp diff --git a/optionals/compat_sog/CfgVehicles.hpp b/addons/compat_sog/CfgVehicles.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles.hpp rename to addons/compat_sog/CfgVehicles.hpp diff --git a/optionals/compat_sog/CfgVehicles/backpacks.hpp b/addons/compat_sog/CfgVehicles/backpacks.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles/backpacks.hpp rename to addons/compat_sog/CfgVehicles/backpacks.hpp diff --git a/optionals/compat_sog/CfgVehicles/boats.hpp b/addons/compat_sog/CfgVehicles/boats.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles/boats.hpp rename to addons/compat_sog/CfgVehicles/boats.hpp diff --git a/optionals/compat_sog/CfgVehicles/boxes.hpp b/addons/compat_sog/CfgVehicles/boxes.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles/boxes.hpp rename to addons/compat_sog/CfgVehicles/boxes.hpp diff --git a/optionals/compat_sog/CfgVehicles/explosives.hpp b/addons/compat_sog/CfgVehicles/explosives.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles/explosives.hpp rename to addons/compat_sog/CfgVehicles/explosives.hpp diff --git a/optionals/compat_sog/CfgVehicles/helicopters.hpp b/addons/compat_sog/CfgVehicles/helicopters.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles/helicopters.hpp rename to addons/compat_sog/CfgVehicles/helicopters.hpp diff --git a/optionals/compat_sog/CfgVehicles/land.hpp b/addons/compat_sog/CfgVehicles/land.hpp similarity index 92% rename from optionals/compat_sog/CfgVehicles/land.hpp rename to addons/compat_sog/CfgVehicles/land.hpp index 23f7577e6c..c939026590 100644 --- a/optionals/compat_sog/CfgVehicles/land.hpp +++ b/addons/compat_sog/CfgVehicles/land.hpp @@ -24,7 +24,8 @@ class Land_vn_usaf_fueltank_75_01: Land_vn_building_b_base { EGVAR(refuel,hooks)[] = {{0, -0.4, -0.5}}; EGVAR(refuel,fuelCargo) = 2840; // 750 * 3.785 }; -class Land_vn_b_prop_fueldrum_01: Land_vn_building_b_base { +class Land_vn_object_b_base; +class Land_vn_b_prop_fueldrum_01: Land_vn_object_b_base { transportFuel = 0; EGVAR(refuel,hooks)[] = {{0, 0, 0.5}}; // reference is Land_FlexibleTank_01_F EGVAR(refuel,fuelCargo) = 300; // reference is Land_FlexibleTank_01_F diff --git a/optionals/compat_sog/CfgVehicles/planes.hpp b/addons/compat_sog/CfgVehicles/planes.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles/planes.hpp rename to addons/compat_sog/CfgVehicles/planes.hpp diff --git a/optionals/compat_sog/CfgVehicles/tracked.hpp b/addons/compat_sog/CfgVehicles/tracked.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles/tracked.hpp rename to addons/compat_sog/CfgVehicles/tracked.hpp diff --git a/optionals/compat_sog/CfgVehicles/turrets.hpp b/addons/compat_sog/CfgVehicles/turrets.hpp similarity index 91% rename from optionals/compat_sog/CfgVehicles/turrets.hpp rename to addons/compat_sog/CfgVehicles/turrets.hpp index cb9a5efef4..6142a018e8 100644 --- a/optionals/compat_sog/CfgVehicles/turrets.hpp +++ b/addons/compat_sog/CfgVehicles/turrets.hpp @@ -505,37 +505,4 @@ class vn_o_vc_spiderhole_01: StaticWeapon { EGVAR(dragging,canDrag) = 0; EGVAR(cargo,canLoad) = 0; - - EGVAR(trenches,diggingDuration) = QEGVAR(trenches,smallEnvelopeDigDuration); - EGVAR(trenches,removalDuration) = QEGVAR(trenches,smallEnvelopeRemoveDuration); - EGVAR(trenches,noGeoClass) = QGVAR(spiderhole_01_nogeo); - EGVAR(trenches,placementData)[] = {1.5, 1.5, 0.1}; - EGVAR(trenches,grassCuttingPoints)[] = {}; - - class ACE_Actions: ACE_Actions { - class ACE_MainActions: ACE_MainActions { - class ACE_ContinueDiggingTrench { - displayName = ECSTRING(trenches,ContinueDiggingTrench); - condition = QUOTE([ARR_2(_target,_player)] call EFUNC(trenches,canContinueDiggingTrench)); - statement = QUOTE([ARR_2(_target,_player)] call EFUNC(trenches,continueDiggingTrench);); - }; - }; - }; -}; -class vn_o_vc_spiderhole_02: vn_o_vc_spiderhole_01 { - EGVAR(trenches,noGeoClass) = QGVAR(spiderhole_02_nogeo); -}; -class vn_o_vc_spiderhole_03: vn_o_vc_spiderhole_01 { - EGVAR(trenches,noGeoClass) = QGVAR(spiderhole_03_nogeo); - EGVAR(trenches,placementData)[] = {1.5, 2.5, 0.1}; -}; - -class GVAR(spiderhole_01_nogeo): vn_o_vc_spiderhole_01 { - scope = 1; -}; -class GVAR(spiderhole_02_nogeo): vn_o_vc_spiderhole_02 { - scope = 1; -}; -class GVAR(spiderhole_03_nogeo): vn_o_vc_spiderhole_03 { - scope = 1; }; diff --git a/addons/compat_sog/CfgVehicles/units.hpp b/addons/compat_sog/CfgVehicles/units.hpp new file mode 100644 index 0000000000..e0d194227d --- /dev/null +++ b/addons/compat_sog/CfgVehicles/units.hpp @@ -0,0 +1,14 @@ +class vn_b_men_aircrew_base; +class vn_b_men_jetpilot_01: vn_b_men_aircrew_base { + ACE_GForceCoef = 0.55; +}; + +class vn_o_men_aircrew_01; +class vn_o_men_aircrew_05: vn_o_men_aircrew_01 { + ACE_GForceCoef = 0.55; +}; + +class vn_i_men_aircrew_base; +class vn_i_men_jetpilot_01: vn_i_men_aircrew_base { + ACE_GForceCoef = 0.55; +}; diff --git a/optionals/compat_sog/CfgVehicles/vn_boxes.hpp b/addons/compat_sog/CfgVehicles/vn_boxes.hpp similarity index 100% rename from optionals/compat_sog/CfgVehicles/vn_boxes.hpp rename to addons/compat_sog/CfgVehicles/vn_boxes.hpp diff --git a/optionals/compat_sog/CfgVehicles/wheeled.hpp b/addons/compat_sog/CfgVehicles/wheeled.hpp similarity index 77% rename from optionals/compat_sog/CfgVehicles/wheeled.hpp rename to addons/compat_sog/CfgVehicles/wheeled.hpp index c0561375bd..3525328d3f 100644 --- a/optionals/compat_sog/CfgVehicles/wheeled.hpp +++ b/addons/compat_sog/CfgVehicles/wheeled.hpp @@ -9,14 +9,8 @@ class vn_wheeled_m54_fuel_base: vn_wheeled_m54_cab_base { EGVAR(refuel,hooks)[] = {{-1.15, -2.3, 0.28}}; EGVAR(refuel,fuelCargo) = 4542; }; -class vn_wheeled_m54_03_base; -class vn_wheeled_m54_repair_base: vn_wheeled_m54_03_base { - transportRepair = 0; - EGVAR(repair,canRepair) = 1; -}; class vn_wheeled_m54_01_base; class vn_wheeled_m54_ammo_base: vn_wheeled_m54_01_base { - transportAmmo = 0; EGVAR(rearm,defaultSupply) = 1200; }; @@ -35,13 +29,8 @@ class vn_wheeled_z157_fuel_base: vn_wheeled_z157_base { EGVAR(refuel,hooks)[] = {{-1.36, -3.575, -0.4}}; EGVAR(refuel,fuelCargo) = 4000; }; -class vn_wheeled_z157_repair_base: vn_wheeled_z157_base { - transportRepair = 0; - EGVAR(repair,canRepair) = 1; -}; class vn_wheeled_z157_01_base; class vn_wheeled_z157_ammo_base: vn_wheeled_z157_01_base { - transportAmmo = 0; EGVAR(rearm,defaultSupply) = 1200; }; diff --git a/optionals/compat_sog/CfgWeapons.hpp b/addons/compat_sog/CfgWeapons.hpp similarity index 100% rename from optionals/compat_sog/CfgWeapons.hpp rename to addons/compat_sog/CfgWeapons.hpp diff --git a/optionals/compat_sog/CfgWeapons/csw.hpp b/addons/compat_sog/CfgWeapons/csw.hpp similarity index 100% rename from optionals/compat_sog/CfgWeapons/csw.hpp rename to addons/compat_sog/CfgWeapons/csw.hpp diff --git a/optionals/compat_sog/CfgWeapons/helmets.hpp b/addons/compat_sog/CfgWeapons/helmets.hpp similarity index 100% rename from optionals/compat_sog/CfgWeapons/helmets.hpp rename to addons/compat_sog/CfgWeapons/helmets.hpp diff --git a/optionals/compat_sog/CfgWeapons/launchers.hpp b/addons/compat_sog/CfgWeapons/launchers.hpp similarity index 100% rename from optionals/compat_sog/CfgWeapons/launchers.hpp rename to addons/compat_sog/CfgWeapons/launchers.hpp diff --git a/optionals/compat_sog/CfgWeapons/pistols.hpp b/addons/compat_sog/CfgWeapons/pistols.hpp similarity index 100% rename from optionals/compat_sog/CfgWeapons/pistols.hpp rename to addons/compat_sog/CfgWeapons/pistols.hpp diff --git a/optionals/compat_sog/CfgWeapons/uniforms.hpp b/addons/compat_sog/CfgWeapons/uniforms.hpp similarity index 100% rename from optionals/compat_sog/CfgWeapons/uniforms.hpp rename to addons/compat_sog/CfgWeapons/uniforms.hpp diff --git a/optionals/compat_sog/CfgWeapons/weapons.hpp b/addons/compat_sog/CfgWeapons/weapons.hpp similarity index 100% rename from optionals/compat_sog/CfgWeapons/weapons.hpp rename to addons/compat_sog/CfgWeapons/weapons.hpp diff --git a/optionals/compat_sog/CfgWeapons/weapons_melee.hpp b/addons/compat_sog/CfgWeapons/weapons_melee.hpp similarity index 100% rename from optionals/compat_sog/CfgWeapons/weapons_melee.hpp rename to addons/compat_sog/CfgWeapons/weapons_melee.hpp diff --git a/optionals/compat_sog/EMM_mainMenu_CfgMenus.hpp b/addons/compat_sog/EMM_mainMenu_CfgMenus.hpp similarity index 100% rename from optionals/compat_sog/EMM_mainMenu_CfgMenus.hpp rename to addons/compat_sog/EMM_mainMenu_CfgMenus.hpp diff --git a/optionals/compat_sog/UI/ammo_1rnd_60mm_ca.paa b/addons/compat_sog/UI/ammo_1rnd_60mm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_1rnd_60mm_ca.paa rename to addons/compat_sog/UI/ammo_1rnd_60mm_ca.paa diff --git a/optionals/compat_sog/UI/ammo_1rnd_81mm_ca.paa b/addons/compat_sog/UI/ammo_1rnd_81mm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_1rnd_81mm_ca.paa rename to addons/compat_sog/UI/ammo_1rnd_81mm_ca.paa diff --git a/optionals/compat_sog/UI/ammo_1rnd_82mm_ca.paa b/addons/compat_sog/UI/ammo_1rnd_82mm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_1rnd_82mm_ca.paa rename to addons/compat_sog/UI/ammo_1rnd_82mm_ca.paa diff --git a/optionals/compat_sog/UI/ammo_1rnd_TOW_ca.paa b/addons/compat_sog/UI/ammo_1rnd_TOW_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_1rnd_TOW_ca.paa rename to addons/compat_sog/UI/ammo_1rnd_TOW_ca.paa diff --git a/optionals/compat_sog/UI/ammo_200rnd_762mm_ca.paa b/addons/compat_sog/UI/ammo_200rnd_762mm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_200rnd_762mm_ca.paa rename to addons/compat_sog/UI/ammo_200rnd_762mm_ca.paa diff --git a/optionals/compat_sog/UI/ammo_250rnd_30cal_ca.paa b/addons/compat_sog/UI/ammo_250rnd_30cal_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_250rnd_30cal_ca.paa rename to addons/compat_sog/UI/ammo_250rnd_30cal_ca.paa diff --git a/optionals/compat_sog/UI/ammo_50rnd_127mm_ca.paa b/addons/compat_sog/UI/ammo_50rnd_127mm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/ammo_50rnd_127mm_ca.paa rename to addons/compat_sog/UI/ammo_50rnd_127mm_ca.paa diff --git a/optionals/compat_sog/UI/csw_dshkm_aa_ca.paa b/addons/compat_sog/UI/csw_dshkm_aa_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_dshkm_aa_ca.paa rename to addons/compat_sog/UI/csw_dshkm_aa_ca.paa diff --git a/optionals/compat_sog/UI/csw_dshkm_ca.paa b/addons/compat_sog/UI/csw_dshkm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_dshkm_ca.paa rename to addons/compat_sog/UI/csw_dshkm_ca.paa diff --git a/optionals/compat_sog/UI/csw_dshkm_shield_ca.paa b/addons/compat_sog/UI/csw_dshkm_shield_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_dshkm_shield_ca.paa rename to addons/compat_sog/UI/csw_dshkm_shield_ca.paa diff --git a/optionals/compat_sog/UI/csw_m1919a4_ca.paa b/addons/compat_sog/UI/csw_m1919a4_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m1919a4_ca.paa rename to addons/compat_sog/UI/csw_m1919a4_ca.paa diff --git a/optionals/compat_sog/UI/csw_m1919a6_ca.paa b/addons/compat_sog/UI/csw_m1919a6_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m1919a6_ca.paa rename to addons/compat_sog/UI/csw_m1919a6_ca.paa diff --git a/optionals/compat_sog/UI/csw_m29_ca.paa b/addons/compat_sog/UI/csw_m29_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m29_ca.paa rename to addons/compat_sog/UI/csw_m29_ca.paa diff --git a/optionals/compat_sog/UI/csw_m2_ca.paa b/addons/compat_sog/UI/csw_m2_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m2_ca.paa rename to addons/compat_sog/UI/csw_m2_ca.paa diff --git a/optionals/compat_sog/UI/csw_m2b_ca.paa b/addons/compat_sog/UI/csw_m2b_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m2b_ca.paa rename to addons/compat_sog/UI/csw_m2b_ca.paa diff --git a/optionals/compat_sog/UI/csw_m60_ca.paa b/addons/compat_sog/UI/csw_m60_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_m60_ca.paa rename to addons/compat_sog/UI/csw_m60_ca.paa diff --git a/optionals/compat_sog/UI/csw_mg42_ca.paa b/addons/compat_sog/UI/csw_mg42_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_mg42_ca.paa rename to addons/compat_sog/UI/csw_mg42_ca.paa diff --git a/optionals/compat_sog/UI/csw_mk18_ca.paa b/addons/compat_sog/UI/csw_mk18_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_mk18_ca.paa rename to addons/compat_sog/UI/csw_mk18_ca.paa diff --git a/optionals/compat_sog/UI/csw_pk_ca.paa b/addons/compat_sog/UI/csw_pk_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_pk_ca.paa rename to addons/compat_sog/UI/csw_pk_ca.paa diff --git a/optionals/compat_sog/UI/csw_rpd_ca.paa b/addons/compat_sog/UI/csw_rpd_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_rpd_ca.paa rename to addons/compat_sog/UI/csw_rpd_ca.paa diff --git a/optionals/compat_sog/UI/csw_sgm_ca.paa b/addons/compat_sog/UI/csw_sgm_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_sgm_ca.paa rename to addons/compat_sog/UI/csw_sgm_ca.paa diff --git a/optionals/compat_sog/UI/csw_sgm_shield_ca.paa b/addons/compat_sog/UI/csw_sgm_shield_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_sgm_shield_ca.paa rename to addons/compat_sog/UI/csw_sgm_shield_ca.paa diff --git a/optionals/compat_sog/UI/csw_tow_ca.paa b/addons/compat_sog/UI/csw_tow_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_tow_ca.paa rename to addons/compat_sog/UI/csw_tow_ca.paa diff --git a/optionals/compat_sog/UI/csw_type53_ca.paa b/addons/compat_sog/UI/csw_type53_ca.paa similarity index 100% rename from optionals/compat_sog/UI/csw_type53_ca.paa rename to addons/compat_sog/UI/csw_type53_ca.paa diff --git a/optionals/compat_sog/XEH_PREP.hpp b/addons/compat_sog/XEH_PREP.hpp similarity index 100% rename from optionals/compat_sog/XEH_PREP.hpp rename to addons/compat_sog/XEH_PREP.hpp diff --git a/optionals/compat_sog/XEH_postInit.sqf b/addons/compat_sog/XEH_postInit.sqf similarity index 100% rename from optionals/compat_sog/XEH_postInit.sqf rename to addons/compat_sog/XEH_postInit.sqf diff --git a/optionals/compat_sog/XEH_preInit.sqf b/addons/compat_sog/XEH_preInit.sqf similarity index 100% rename from optionals/compat_sog/XEH_preInit.sqf rename to addons/compat_sog/XEH_preInit.sqf diff --git a/optionals/compat_sog/XEH_preStart.sqf b/addons/compat_sog/XEH_preStart.sqf similarity index 100% rename from optionals/compat_sog/XEH_preStart.sqf rename to addons/compat_sog/XEH_preStart.sqf diff --git a/addons/compat_sog/compat_sog_trenches/CfgVehicles.hpp b/addons/compat_sog/compat_sog_trenches/CfgVehicles.hpp new file mode 100644 index 0000000000..3c2ba22410 --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches/CfgVehicles.hpp @@ -0,0 +1,63 @@ +class CfgVehicles { + // Trench Actions + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class EGVAR(trenches,digEnvelopeSmall); + class EGVAR(compat_sog,digSpiderhole): EGVAR(trenches,digEnvelopeSmall) { + displayName = ECSTRING(compat_sog,Action_DigSpiderhole); + statement = QUOTE([ARR_2({_this call EFUNC(trenches,placeTrench)},[ARR_2(_this select 0,'vn_o_vc_spiderhole_01')])] call CBA_fnc_execNextFrame); + }; + class EGVAR(compat_sog,digSpiderholeAngled): EGVAR(trenches,digEnvelopeSmall) { + displayName = ECSTRING(compat_sog,Action_DigSpiderholeAngled); + statement = QUOTE([ARR_2({_this call EFUNC(trenches,placeTrench)},[ARR_2(_this select 0,'vn_o_vc_spiderhole_02')])] call CBA_fnc_execNextFrame); + }; + class EGVAR(compat_sog,digSpiderholeDual): EGVAR(trenches,digEnvelopeSmall) { + displayName = ECSTRING(compat_sog,Action_DigSpiderholeDual); + statement = QUOTE([ARR_2({_this call EFUNC(trenches,placeTrench)},[ARR_2(_this select 0,'vn_o_vc_spiderhole_03')])] call CBA_fnc_execNextFrame); + }; + }; + }; + }; + + // Spiderholes + class LandVehicle; + class StaticWeapon: LandVehicle { + class ACE_Actions { + class ACE_MainActions; + }; + }; + class vn_o_vc_spiderhole_01: StaticWeapon { + EGVAR(trenches,diggingDuration) = QEGVAR(trenches,smallEnvelopeDigDuration); + EGVAR(trenches,removalDuration) = QEGVAR(trenches,smallEnvelopeRemoveDuration); + EGVAR(trenches,noGeoClass) = QEGVAR(compat_sog,spiderhole_01_nogeo); + EGVAR(trenches,placementData)[] = {1.5, 1.5, 0.1}; + EGVAR(trenches,grassCuttingPoints)[] = {}; + class ACE_Actions: ACE_Actions { + class ACE_MainActions: ACE_MainActions { + class ACE_ContinueDiggingTrench { + displayName = ECSTRING(trenches,ContinueDiggingTrench); + condition = QUOTE([ARR_2(_target,_player)] call EFUNC(trenches,canContinueDiggingTrench)); + statement = QUOTE([ARR_2(_target,_player)] call EFUNC(trenches,continueDiggingTrench);); + }; + }; + }; + }; + class vn_o_vc_spiderhole_02: vn_o_vc_spiderhole_01 { + EGVAR(trenches,noGeoClass) = QEGVAR(compat_sog,spiderhole_02_nogeo); + }; + class vn_o_vc_spiderhole_03: vn_o_vc_spiderhole_01 { + EGVAR(trenches,noGeoClass) = QEGVAR(compat_sog,spiderhole_03_nogeo); + EGVAR(trenches,placementData)[] = {1.5, 2.5, 0.1}; + }; + class EGVAR(compat_sog,spiderhole_01_nogeo): vn_o_vc_spiderhole_01 { + scope = 1; + }; + class EGVAR(compat_sog,spiderhole_02_nogeo): vn_o_vc_spiderhole_02 { + scope = 1; + }; + class EGVAR(compat_sog,spiderhole_03_nogeo): vn_o_vc_spiderhole_03 { + scope = 1; + }; +}; diff --git a/addons/compat_sog/compat_sog_trenches/config.cpp b/addons/compat_sog/compat_sog_trenches/config.cpp new file mode 100644 index 0000000000..9559ddf189 --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "loadorder_f_vietnam", "ace_trenches" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"BaerMitUmlaut", "veteran29"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_sog/compat_sog_trenches/script_component.hpp b/addons/compat_sog/compat_sog_trenches/script_component.hpp new file mode 100644 index 0000000000..15bb9d933b --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_sog\script_component.hpp" + +#define SUBCOMPONENT trenches +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/addons/compat_sog/compat_sog_trenches_grad/CfgVehicles.hpp b/addons/compat_sog/compat_sog_trenches_grad/CfgVehicles.hpp new file mode 100644 index 0000000000..a9c8873ceb --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches_grad/CfgVehicles.hpp @@ -0,0 +1,20 @@ +class CfgVehicles { + // Trench Actions + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + // delete in reverse order + delete EGVAR(compat_sog,digSpiderholeDual); + delete EGVAR(compat_sog,digSpiderholeAngled); + delete EGVAR(compat_sog,digSpiderhole); + delete EGVAR(trenches,digEnvelopeSmall); + }; + }; + }; + + // Spiderholes + delete EGVAR(compat_sog,spiderhole_01_nogeo); + delete EGVAR(compat_sog,spiderhole_02_nogeo); + delete EGVAR(compat_sog,spiderhole_03_nogeo); +}; diff --git a/addons/compat_sog/compat_sog_trenches_grad/config.cpp b/addons/compat_sog/compat_sog_trenches_grad/config.cpp new file mode 100644 index 0000000000..8a25324454 --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches_grad/config.cpp @@ -0,0 +1,20 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "loadorder_f_vietnam", "ace_compat_sog_trenches", "grad_trenches_main" + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"BaerMitUmlaut", "veteran29"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgVehicles.hpp" diff --git a/addons/compat_sog/compat_sog_trenches_grad/script_component.hpp b/addons/compat_sog/compat_sog_trenches_grad/script_component.hpp new file mode 100644 index 0000000000..b7b8f3c707 --- /dev/null +++ b/addons/compat_sog/compat_sog_trenches_grad/script_component.hpp @@ -0,0 +1,5 @@ +#include "\z\ace\addons\compat_sog\script_component.hpp" + +#define SUBCOMPONENT trenches_grad +#undef ADDON +#define ADDON TRIPLES(PREFIX,COMPONENT,SUBCOMPONENT) diff --git a/optionals/compat_sog/config.cpp b/addons/compat_sog/config.cpp similarity index 93% rename from optionals/compat_sog/config.cpp rename to addons/compat_sog/config.cpp index 3cb5c7156b..8a6ed30148 100644 --- a/optionals/compat_sog/config.cpp +++ b/addons/compat_sog/config.cpp @@ -35,10 +35,8 @@ class CfgPatches { QGVAR(mortar_type53_carry) }; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = { - "ace_trenches", - "loadorder_f_vietnam" - }; + requiredAddons[] = {"ace_common", "loadorder_f_vietnam"}; + skipWhenMissingDependencies = 1; author = ECSTRING(common,ACETeam); authors[] = {"BaerMitUmlaut", "veteran29"}; url = ECSTRING(main,URL); diff --git a/optionals/compat_sog/functions/fnc_disableCookoff.sqf b/addons/compat_sog/functions/fnc_disableCookoff.sqf similarity index 100% rename from optionals/compat_sog/functions/fnc_disableCookoff.sqf rename to addons/compat_sog/functions/fnc_disableCookoff.sqf diff --git a/optionals/compat_sog/functions/fnc_handleBikeMinePlace.sqf b/addons/compat_sog/functions/fnc_handleBikeMinePlace.sqf similarity index 100% rename from optionals/compat_sog/functions/fnc_handleBikeMinePlace.sqf rename to addons/compat_sog/functions/fnc_handleBikeMinePlace.sqf diff --git a/optionals/compat_sog/functions/fnc_handlePunjiTrapDamage.sqf b/addons/compat_sog/functions/fnc_handlePunjiTrapDamage.sqf similarity index 100% rename from optionals/compat_sog/functions/fnc_handlePunjiTrapDamage.sqf rename to addons/compat_sog/functions/fnc_handlePunjiTrapDamage.sqf diff --git a/optionals/compat_sog/functions/fnc_handlePunjiTrapPlace.sqf b/addons/compat_sog/functions/fnc_handlePunjiTrapPlace.sqf similarity index 100% rename from optionals/compat_sog/functions/fnc_handlePunjiTrapPlace.sqf rename to addons/compat_sog/functions/fnc_handlePunjiTrapPlace.sqf diff --git a/optionals/compat_sog/functions/fnc_handlePunjiTrapTrigger.sqf b/addons/compat_sog/functions/fnc_handlePunjiTrapTrigger.sqf similarity index 100% rename from optionals/compat_sog/functions/fnc_handlePunjiTrapTrigger.sqf rename to addons/compat_sog/functions/fnc_handlePunjiTrapTrigger.sqf diff --git a/optionals/compat_sog/functions/fnc_woundsHandlerIncendiary.sqf b/addons/compat_sog/functions/fnc_woundsHandlerIncendiary.sqf similarity index 100% rename from optionals/compat_sog/functions/fnc_woundsHandlerIncendiary.sqf rename to addons/compat_sog/functions/fnc_woundsHandlerIncendiary.sqf diff --git a/optionals/compat_sog/functions/script_component.hpp b/addons/compat_sog/functions/script_component.hpp similarity index 100% rename from optionals/compat_sog/functions/script_component.hpp rename to addons/compat_sog/functions/script_component.hpp diff --git a/optionals/compat_sog/script_component.hpp b/addons/compat_sog/script_component.hpp similarity index 100% rename from optionals/compat_sog/script_component.hpp rename to addons/compat_sog/script_component.hpp diff --git a/optionals/compat_sog/stringtable.xml b/addons/compat_sog/stringtable.xml similarity index 100% rename from optionals/compat_sog/stringtable.xml rename to addons/compat_sog/stringtable.xml diff --git a/addons/compat_ws/config.cpp b/addons/compat_ws/config.cpp index 3be9d1797e..32a3f6f73c 100644 --- a/addons/compat_ws/config.cpp +++ b/addons/compat_ws/config.cpp @@ -1,13 +1,5 @@ #include "script_component.hpp" -#if __has_include("\lxWS\data_f_lxWS\config.bin") -#else -#define PATCH_SKIP "Western Sahara" -#endif - -#ifdef PATCH_SKIP -ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) -#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -15,6 +7,7 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"data_f_lxWS_Loadorder"}; + skipWhenMissingDependencies = 1; author = ECSTRING(common,ACETeam); authors[] = {"Mike"}; url = ECSTRING(main,URL); @@ -23,5 +16,3 @@ class CfgPatches { }; #include "CfgWeapons.hpp" - -#endif diff --git a/addons/cookoff/functions/fnc_cookOff.sqf b/addons/cookoff/functions/fnc_cookOff.sqf index b9d951e822..79644a273e 100644 --- a/addons/cookoff/functions/fnc_cookOff.sqf +++ b/addons/cookoff/functions/fnc_cookOff.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Start a cook-off in the given vehicle. * * Arguments: @@ -16,7 +16,7 @@ * Public: No */ -params ["_vehicle", "_intensity", ["_instigator", objNull], ["_smokeDelayEnabled", true], ["_ammoDetonationChance", 0], ["_detonateAfterCookoff", false], ["_fireSource", ""], ["_canRing", true], ["_maxIntensity", MAX_COOKOFF_INTENSITY, [0]]]; +params ["_vehicle", "_intensity", ["_instigator", objNull], ["_smokeDelayEnabled", true], ["_ammoDetonationChance", 0], ["_detonateAfterCookoff", false], ["_fireSource", ""], ["_canRing", true], ["_maxIntensity", MAX_COOKOFF_INTENSITY, [0]], ["_canJet", true, [true]]]; if (GVAR(enable) == 0) exitWith {}; if !(GVAR(enableFire)) exitWith {}; @@ -25,7 +25,8 @@ if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] in [0, false]) exitWith { if (_vehicle getVariable [QGVAR(enable), GVAR(enable)] isEqualTo 1 && {fullCrew [_vehicle, "", false] findIf {isPlayer (_x select 0)} == -1}) exitWith {}; -TRACE_9("cooking off",_vehicle,_intensity,_instigator,_smokeDelayEnabled,_ammoDetonationChance,_detonateAfterCookoff,_fireSource,_canRing,_maxIntensity); +TRACE_2("cooking off",_vehicle,_intensity); +TRACE_8("",_instigator,_smokeDelayEnabled,_ammoDetonationChance,_detonateAfterCookoff,_fireSource,_canRing,_maxIntensity,_canJet); if (_vehicle getVariable [QGVAR(isCookingOff), false]) exitWith {}; _vehicle setVariable [QGVAR(isCookingOff), true, true]; @@ -51,9 +52,6 @@ if (_positions isEqualTo []) then { }; }; -// default fire jet to enabled when not set in configs -private _canJet = ([_config >> QGVAR(canHaveFireJet), "number", 1] call CBA_fnc_getConfigEntry) == 1; - private _delay = 0; if (_smokeDelayEnabled) then { _delay = SMOKE_TIME + random SMOKE_TIME; diff --git a/addons/cookoff/functions/fnc_cookOffBox.sqf b/addons/cookoff/functions/fnc_cookOffBox.sqf index 28e3a91108..72a1259990 100644 --- a/addons/cookoff/functions/fnc_cookOffBox.sqf +++ b/addons/cookoff/functions/fnc_cookOffBox.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: KoffeinFlummi, commy2, SilentSpike + * Author: KoffeinFlummi, commy2, kymckay * Start a cook-off in the given ammo box. * * Arguments: diff --git a/addons/cookoff/functions/fnc_cookOffEffect.sqf b/addons/cookoff/functions/fnc_cookOffEffect.sqf index 2634d0ceb3..41a6f0aab4 100644 --- a/addons/cookoff/functions/fnc_cookOffEffect.sqf +++ b/addons/cookoff/functions/fnc_cookOffEffect.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Spawn cook-off effects * * Arguments: diff --git a/addons/cookoff/functions/fnc_detonateAmmunition.sqf b/addons/cookoff/functions/fnc_detonateAmmunition.sqf index 9cbe1c9f17..3d2089fe88 100644 --- a/addons/cookoff/functions/fnc_detonateAmmunition.sqf +++ b/addons/cookoff/functions/fnc_detonateAmmunition.sqf @@ -6,8 +6,8 @@ * Arguments: * 0: vehicle * 1: Ammo Array - * 0: Magazine Classname - * 1: Ammo Count + * - 0: Magazine Classname + * - 1: Ammo Count * 2: Total Ammo Count * * Return Value: diff --git a/addons/cookoff/functions/fnc_getVehicleAmmo.sqf b/addons/cookoff/functions/fnc_getVehicleAmmo.sqf index 95caf09dd5..9be02b75bb 100644 --- a/addons/cookoff/functions/fnc_getVehicleAmmo.sqf +++ b/addons/cookoff/functions/fnc_getVehicleAmmo.sqf @@ -8,8 +8,8 @@ * * Return Value: * 0: Ammo Array - * 0: Magazine Classname - * 1: Ammo Count + * - 0: Magazine Classname + * - 1: Ammo Count * 1: Total Ammo Count * * Example: diff --git a/addons/cookoff/functions/fnc_smoke.sqf b/addons/cookoff/functions/fnc_smoke.sqf index fa8968f884..7d7e70c2dd 100644 --- a/addons/cookoff/functions/fnc_smoke.sqf +++ b/addons/cookoff/functions/fnc_smoke.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Starts vehicle barrel smoke effect. * * Arguments: diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index 8e46fe89c5..e09ef2988b 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -172,9 +172,11 @@ 殉爆发生后摧毁载具 Уничтожать технику после детонации Destruir vehículos tras la detonación inducida por calor + 誘爆後に車両を破壊する Controls whether vehicles will always be destroyed after cooking off. + 誘爆後に車両を破壊するかどうかを設定する。 Enable Cook-Off Vehicle Fire diff --git a/addons/csw/XEH_postInit.sqf b/addons/csw/XEH_postInit.sqf index fddac69385..a1aa348659 100644 --- a/addons/csw/XEH_postInit.sqf +++ b/addons/csw/XEH_postInit.sqf @@ -4,7 +4,10 @@ GVAR(vehicleMagCache) = createHashMap; ["CBA_settingsInitialized", { TRACE_3("settingsInit",GVAR(defaultAssemblyMode),GVAR(handleExtraMagazines),GVAR(ammoHandling)); - ["StaticWeapon", "init", LINKFUNC(staticWeaponInit), true, [], true] call CBA_fnc_addClassEventHandler; + ["StaticWeapon", "Init", { + // needs a small delay for network syncing, or we end up with duplicate mags with ammo handling + [LINKFUNC(staticWeaponInit), _this, 1] call CBA_fnc_waitAndExecute; + }, true, [], true] call CBA_fnc_addClassEventHandler; }] call CBA_fnc_addEventHandler; diff --git a/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf index ac51d03347..05cfe1461a 100644 --- a/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf +++ b/addons/csw/functions/fnc_aceRearmGetCarryMagazines.sqf @@ -18,27 +18,33 @@ params ["_vehicle", ["_targetTurret", true, [[], true]]]; -if (!(_vehicle isKindOf "StaticWeapon")) exitWith { [[],[]] }; // limit to statics for now -// Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default] -if ((GVAR(ammoHandling) == 0) && {!([false, true, true, GVAR(defaultAssemblyMode)] select (_vehicle getVariable [QGVAR(assemblyMode), 3]))}) exitWith { [[],[]] }; +private _return = [[], []]; + +if !(_vehicle isKindOf "StaticWeapon") exitWith {_return}; // limit to statics for now +// Assembly mode: [0=disabled, 1=enabled, 2=enabled&unload, 3=default] +if ((GVAR(ammoHandling) == 0) && {!([false, true, true, GVAR(defaultAssemblyMode)] select (_vehicle getVariable [QGVAR(assemblyMode), 3]))}) exitWith {_return}; + +private _turretMagsCSW = _return select 0; +private _allCarryMags = _return select 1; + +private _turrets = allTurrets _vehicle; +if (_targetTurret isNotEqualTo true) then { + _turrets = _turrets select {_x isEqualTo _targetTurret}; +}; -private _turretMagsCSW = []; -private _allCarryMags = []; { private _turretPath = _x; - if ((_targetTurret isEqualTo true) || {_turretPath isEqualTo _targetTurret}) then { + { + private _weapon = _x; { - private _weapon = _x; - { - private _xMag = _x; - private _carryMag = _xMag call FUNC(getCarryMagazine); - if (_carryMag != "") then { - _turretMagsCSW pushBackUnique _xMag; - _allCarryMags pushBackUnique _carryMag; - }; - } forEach ([_weapon] call CBA_fnc_compatibleMagazines); - } forEach (_vehicle weaponsTurret _turretPath); - }; -} forEach (allTurrets _vehicle); + private _xMag = _x; + private _carryMag = _xMag call FUNC(getCarryMagazine); + if (_carryMag != "") then { + _turretMagsCSW pushBackUnique _xMag; + _allCarryMags pushBackUnique _carryMag; + }; + } forEach (compatibleMagazines _weapon); + } forEach (_vehicle weaponsTurret _turretPath); +} forEach _turrets; -[_turretMagsCSW, _allCarryMags] +_return diff --git a/addons/csw/functions/fnc_assemble_canDeployTripod.sqf b/addons/csw/functions/fnc_assemble_canDeployTripod.sqf index e06b68ec19..3a8b3196f4 100644 --- a/addons/csw/functions/fnc_assemble_canDeployTripod.sqf +++ b/addons/csw/functions/fnc_assemble_canDeployTripod.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * Checks if the player can deploy the tripod. * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf b/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf index b139de392e..9bcd253dad 100644 --- a/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_canDeployWeapon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * Checks if you can deploy a weapon on the tripod * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_canPickupTripod.sqf b/addons/csw/functions/fnc_assemble_canPickupTripod.sqf index 6850a3cb09..cde5caa771 100644 --- a/addons/csw/functions/fnc_assemble_canPickupTripod.sqf +++ b/addons/csw/functions/fnc_assemble_canPickupTripod.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * Checks if the player can pick-up the tripod. * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf index 9736fb97dd..1e51c95840 100644 --- a/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_canPickupWeapon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * If the CSW is mounted or in use this will not allow you to dismount the weapon * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_deployTripod.sqf b/addons/csw/functions/fnc_assemble_deployTripod.sqf index 35c3fb70c2..4d52a07367 100644 --- a/addons/csw/functions/fnc_assemble_deployTripod.sqf +++ b/addons/csw/functions/fnc_assemble_deployTripod.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * Deploys the tripod * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_deployWeapon.sqf b/addons/csw/functions/fnc_assemble_deployWeapon.sqf index 0e5c0b27f8..748e5fcf14 100644 --- a/addons/csw/functions/fnc_assemble_deployWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_deployWeapon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * Deploys the current CSW * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_pickupTripod.sqf b/addons/csw/functions/fnc_assemble_pickupTripod.sqf index d74af7f1c1..8b25745a89 100644 --- a/addons/csw/functions/fnc_assemble_pickupTripod.sqf +++ b/addons/csw/functions/fnc_assemble_pickupTripod.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * Picks up the tripod and adds it to the player launcher slot * * Arguments: diff --git a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf index 9b17fcaf73..1b8b231d73 100644 --- a/addons/csw/functions/fnc_assemble_pickupWeapon.sqf +++ b/addons/csw/functions/fnc_assemble_pickupWeapon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * Dismounts the weapon from the tripod and drops its backpack beside * * Arguments: diff --git a/addons/csw/functions/fnc_canGetIn.sqf b/addons/csw/functions/fnc_canGetIn.sqf index 052f48f8b0..9ffd853a1a 100644 --- a/addons/csw/functions/fnc_canGetIn.sqf +++ b/addons/csw/functions/fnc_canGetIn.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * Checks if the player can get in the weapon * * Arguments: diff --git a/addons/csw/functions/fnc_getIn.sqf b/addons/csw/functions/fnc_getIn.sqf index 9a11553ce9..035c32b285 100644 --- a/addons/csw/functions/fnc_getIn.sqf +++ b/addons/csw/functions/fnc_getIn.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * An action for the player to get in the CSW * Due to the fact that the default static weapons "Get In" memory point is at the front of * the gun and can't be acssesed from the back, I am implementing this to get around that issue. diff --git a/addons/csw/functions/fnc_proxyWeapon.sqf b/addons/csw/functions/fnc_proxyWeapon.sqf index e4449bbbce..1c9f48dd89 100644 --- a/addons/csw/functions/fnc_proxyWeapon.sqf +++ b/addons/csw/functions/fnc_proxyWeapon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM), PabstMirror + * Author: tcvm, PabstMirror * Handles the use of proxy weapons to fix engine-reload times * * Arguments: @@ -37,6 +37,9 @@ if ((missionNamespace getVariable [_proxyWeapon, objNull]) isEqualType {}) then }; if (!_needed) exitWith { TRACE_2("not needed",_needed,_proxyWeapon); }; +// Rearm compatibility, prevent reloading entire static and breaking CSW +_staticWeapon setVariable [QEGVAR(rearm,scriptedLoadout), true, true]; + TRACE_2("swapping to proxy weapon",_currentWeapon,_proxyWeapon); _staticWeapon removeWeaponTurret [_currentWeapon, _turret]; _staticWeapon addWeaponTurret [_proxyWeapon, _turret]; diff --git a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf index 1fbd2e4708..16e1930dc9 100644 --- a/addons/csw/functions/fnc_reload_canLoadMagazine.sqf +++ b/addons/csw/functions/fnc_reload_canLoadMagazine.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: PabstMirror &Dani (TCVM) + * Author: PabstMirror &tcvm * Tests if unit can load a magazine into a static weapon. * * Arguments: diff --git a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf index 8cdd9d29fe..7601e667dd 100644 --- a/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf +++ b/addons/csw/functions/fnc_reload_handleAddTurretMag.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM), PabstMirror + * Author:tcvm, PabstMirror * Handles adding ammo to a turret * Called from a global event but only runs where turret is local * diff --git a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf index c78c141449..005d439cdf 100644 --- a/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf +++ b/addons/csw/functions/fnc_reload_handleRemoveTurretMag.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author:Dani (TCVM) + * Author:tcvm * Handles removing ammo from a turret * Called from a global event but only runs where turret is local * diff --git a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf index 52a1490320..d30de71ed5 100644 --- a/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf +++ b/addons/csw/functions/fnc_reload_handleReturnAmmo.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) and PabstMirror + * Author: tcvm and PabstMirror * Handles returned ammo (either from unloading or leftovers from linking) * * Arguments: diff --git a/addons/csw/functions/fnc_staticWeaponInit.sqf b/addons/csw/functions/fnc_staticWeaponInit.sqf index 6ddaa9d36a..f360ff2af3 100644 --- a/addons/csw/functions/fnc_staticWeaponInit.sqf +++ b/addons/csw/functions/fnc_staticWeaponInit.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Initializes weapon to disable weapon disassembling * * Arguments: diff --git a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf index 41845c0eb3..92ba32722c 100644 --- a/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf +++ b/addons/csw/functions/fnc_staticWeaponInit_unloadExtraMags.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM), PabstMirror + * Author: tcvm, PabstMirror * Dumps ammo to container * * Arguments: diff --git a/addons/dogtags/functions/fnc_ssn.sqf b/addons/dogtags/functions/fnc_ssn.sqf index 3da972ecd8..d5349f631f 100644 --- a/addons/dogtags/functions/fnc_ssn.sqf +++ b/addons/dogtags/functions/fnc_ssn.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Reports a social security number generated from the units name. * * Arguments: diff --git a/addons/dogtags/stringtable.xml b/addons/dogtags/stringtable.xml index 8f4547eeda..ac9dc939f5 100644 --- a/addons/dogtags/stringtable.xml +++ b/addons/dogtags/stringtable.xml @@ -70,7 +70,7 @@ Zabrałeś nieśmiertelnik %1... Жетон снят с %1... Sebral jsem známku od %1... - %1からドッグ タグを取っています・・・ + %1 からドッグ タグを取っています・・・ Erkennungsmarke von %1 genommen... %1(으)로부터 군번줄을 회수했습니다... Plaque d'identification prise sur %1... diff --git a/addons/dragging/functions/fnc_carryObjectPFH.sqf b/addons/dragging/functions/fnc_carryObjectPFH.sqf index 2a392a20a6..ee9234a3c8 100644 --- a/addons/dragging/functions/fnc_carryObjectPFH.sqf +++ b/addons/dragging/functions/fnc_carryObjectPFH.sqf @@ -5,9 +5,9 @@ * * Arguments: * 0: Arguments - * 0.0: Unit - * 0.1: Target - * 0.2: Start time + * - 0: Unit + * - 1: Target + * - 2: Start time * 1: PFEH Id * * Return Value: diff --git a/addons/dragging/functions/fnc_dragObjectPFH.sqf b/addons/dragging/functions/fnc_dragObjectPFH.sqf index c5346bcd0e..24cd95ce6a 100644 --- a/addons/dragging/functions/fnc_dragObjectPFH.sqf +++ b/addons/dragging/functions/fnc_dragObjectPFH.sqf @@ -5,9 +5,9 @@ * * Arguments: * 0: Arguments - * 0.0: Unit - * 0.1: Target - * 0.2: Start time + * - 0: Unit + * - 1: Target + * - 2: Start time * 1: PFEH Id * * Return Value: diff --git a/addons/dragging/functions/fnc_startCarryPFH.sqf b/addons/dragging/functions/fnc_startCarryPFH.sqf index 8271b005e1..d96f29a0f3 100644 --- a/addons/dragging/functions/fnc_startCarryPFH.sqf +++ b/addons/dragging/functions/fnc_startCarryPFH.sqf @@ -5,9 +5,9 @@ * * Arguments: * 0: Arguments - * 0.0: Unit - * 0.1: Target - * 0.2: Timeout + * - 0: Unit + * - 1: Target + * - 2: Timeout * 1: PFEH Id * * Return Value: diff --git a/addons/dragging/functions/fnc_startDragPFH.sqf b/addons/dragging/functions/fnc_startDragPFH.sqf index ef5883e0e9..e72313828d 100644 --- a/addons/dragging/functions/fnc_startDragPFH.sqf +++ b/addons/dragging/functions/fnc_startDragPFH.sqf @@ -5,9 +5,9 @@ * * Arguments: * 0: Arguments - * 0.0: Unit - * 0.1: Target - * 0.2: Timeout + * - 0: Unit + * - 1: Target + * - 2: Timeout * 1: PFEH Id * * Return Value: diff --git a/addons/dragging/stringtable.xml b/addons/dragging/stringtable.xml index 2c5b39d9f3..48f8177e38 100644 --- a/addons/dragging/stringtable.xml +++ b/addons/dragging/stringtable.xml @@ -149,15 +149,19 @@ Allow Running with Lightweight Objects + 軽量物を持って走れるようにする Allow the player to run when carrying lightweight objects. + プレイヤーが軽量オブジェクトを持ち運んでいるときに走れるようにする。 Skip Object Weight + オブジェクトの重量を無視 Determines whether object's weight is added onto weight calculations. + 重量計算にオブジェクトの重量を追加するかどうかを決定します。 diff --git a/addons/dragon/config.cpp b/addons/dragon/config.cpp index d43bf90184..2acf1e6c70 100644 --- a/addons/dragon/config.cpp +++ b/addons/dragon/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_hot","ace_csw"}; author = ECSTRING(common,ACETeam); - authors[] = {"Dani (TCVM)"}; + authors[] = {"tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf index 99627a632f..352ed61cc3 100644 --- a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf +++ b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) (Code inspired by NouberNou's Dragon Guidance) + * Author: tcvm (Code inspired by NouberNou's Dragon Guidance) * Attack profile: Dragon Guidance * * Arguments: diff --git a/addons/dragon/functions/fnc_canPickupTripod.sqf b/addons/dragon/functions/fnc_canPickupTripod.sqf index 936282048b..16fbfae913 100644 --- a/addons/dragon/functions/fnc_canPickupTripod.sqf +++ b/addons/dragon/functions/fnc_canPickupTripod.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Determines if you can pick-up the Dragon missile. If the missile was fired you will not be able to pick up the tripod. * * Arguments: diff --git a/addons/dragon/functions/fnc_onFired.sqf b/addons/dragon/functions/fnc_onFired.sqf index 5f3dc8d87f..49dd6584f8 100644 --- a/addons/dragon/functions/fnc_onFired.sqf +++ b/addons/dragon/functions/fnc_onFired.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Runs when Dragon is fired * * Arguments: diff --git a/addons/dragon/functions/fnc_sightAttach.sqf b/addons/dragon/functions/fnc_sightAttach.sqf index 3b93d83fc2..43e2fc2eaa 100644 --- a/addons/dragon/functions/fnc_sightAttach.sqf +++ b/addons/dragon/functions/fnc_sightAttach.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Attaches the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/functions/fnc_sightCanAttach.sqf b/addons/dragon/functions/fnc_sightCanAttach.sqf index 3695dc3670..7782e99fd0 100644 --- a/addons/dragon/functions/fnc_sightCanAttach.sqf +++ b/addons/dragon/functions/fnc_sightCanAttach.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Determines if you can attach the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/functions/fnc_sightCanDetach.sqf b/addons/dragon/functions/fnc_sightCanDetach.sqf index d5f1d7b9b8..77f672d101 100644 --- a/addons/dragon/functions/fnc_sightCanDetach.sqf +++ b/addons/dragon/functions/fnc_sightCanDetach.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Determines if you can attach the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/dragon/functions/fnc_sightDetach.sqf b/addons/dragon/functions/fnc_sightDetach.sqf index 444ce19bb7..ae84fa9698 100644 --- a/addons/dragon/functions/fnc_sightDetach.sqf +++ b/addons/dragon/functions/fnc_sightDetach.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Attaches the sighting unit to the Dragon missile. * * Arguments: diff --git a/addons/explosives/CfgWeapons.hpp b/addons/explosives/CfgWeapons.hpp index 9a3c3e273b..30e1fb95cb 100644 --- a/addons/explosives/CfgWeapons.hpp +++ b/addons/explosives/CfgWeapons.hpp @@ -48,6 +48,7 @@ class CfgWeapons { picture = QPATHTOF(Data\UI\Pliers.paa); model = "\A3\Structures_F\Items\Tools\Pliers_F.p3d"; ACE_isTool = 1; + GVAR(defusalKit) = 1; class ItemInfo: ACE_ExplosiveItem { mass = 5; diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index 8604b048d8..ff908106a7 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -13,4 +13,6 @@ PREP_RECOMPILE_END; GVAR(detonationHandlers) = []; GVAR(excludedMines) = []; +GVAR(defusalKits) = call (uiNamespace getVariable QGVAR(defusalKits)); + ADDON = true; diff --git a/addons/explosives/XEH_preStart.sqf b/addons/explosives/XEH_preStart.sqf index 022888575e..c62a1e1d3c 100644 --- a/addons/explosives/XEH_preStart.sqf +++ b/addons/explosives/XEH_preStart.sqf @@ -1,3 +1,6 @@ #include "script_component.hpp" #include "XEH_PREP.hpp" + +private _defusalKits = (QUOTE(getNumber (_x >> QQGVAR(defusalKit)) > 0) configClasses (configFile >> "CfgWeapons") apply {configName _x}); +uiNamespace setVariable [QGVAR(defusalKits), compileFinal str _defusalKits]; diff --git a/addons/explosives/functions/fnc_canDefuse.sqf b/addons/explosives/functions/fnc_canDefuse.sqf index a4ead7eb47..f394217125 100644 --- a/addons/explosives/functions/fnc_canDefuse.sqf +++ b/addons/explosives/functions/fnc_canDefuse.sqf @@ -24,7 +24,7 @@ if (isNull _explosive) exitWith { deleteVehicle _target; false }; -if (vehicle _unit != _unit || {!("ACE_DefusalKit" in (_unit call EFUNC(common,uniqueItems)))}) exitWith {false}; +if (vehicle _unit != _unit || {(_unit call EFUNC(common,uniqueItems)) findAny GVAR(defusalKits) == -1}) exitWith {false}; if (GVAR(RequireSpecialist) && {!([_unit] call EFUNC(Common,isEOD))}) exitWith {false}; diff --git a/addons/explosives/functions/fnc_detonateExplosive.sqf b/addons/explosives/functions/fnc_detonateExplosive.sqf index 3b2740fab2..2e84b66195 100644 --- a/addons/explosives/functions/fnc_detonateExplosive.sqf +++ b/addons/explosives/functions/fnc_detonateExplosive.sqf @@ -7,8 +7,8 @@ * 0: Unit * 1: Max range (-1 to ignore) * 2: Explosive - * 2.0: Explosive - * 2.1: Fuse time + * - 0: Explosive + * - 1: Fuse time * 3: Trigger Item Classname * * Return Value: diff --git a/addons/explosives/functions/fnc_detonateExplosiveAll.sqf b/addons/explosives/functions/fnc_detonateExplosiveAll.sqf index ec1f1e661a..f99e308423 100644 --- a/addons/explosives/functions/fnc_detonateExplosiveAll.sqf +++ b/addons/explosives/functions/fnc_detonateExplosiveAll.sqf @@ -7,8 +7,8 @@ * 0: Unit * 1: Range (-1 to ignore) * 2: Explosives to detonate - * 0: Explosive - * 1: Fuse time + * - 0: Explosive + * - 1: Fuse time * 3: Trigger Item Classname * * Return Value: diff --git a/addons/explosives/functions/fnc_interactEH.sqf b/addons/explosives/functions/fnc_interactEH.sqf index da7215bb81..334c3d2722 100644 --- a/addons/explosives/functions/fnc_interactEH.sqf +++ b/addons/explosives/functions/fnc_interactEH.sqf @@ -25,7 +25,7 @@ TRACE_1("Explosives interactEH",_interactionType); if ( _interactionType != 0 || {vehicle ACE_player != ACE_player} - || {!("ACE_DefusalKit" in (ACE_player call EFUNC(common,uniqueItems)))} + || {(ACE_player call EFUNC(common,uniqueItems)) findAny GVAR(defusalKits) == -1} ) exitWith {}; [{ diff --git a/addons/fastroping/XEH_postInit.sqf b/addons/fastroping/XEH_postInit.sqf index 43e5de24f9..27d3ca4008 100644 --- a/addons/fastroping/XEH_postInit.sqf +++ b/addons/fastroping/XEH_postInit.sqf @@ -32,6 +32,17 @@ }, {false}] call CBA_fnc_addKeybind; +if (isServer) then { + ["Helicopter", "init", { + if (!GVAR(autoAddFRIES)) exitWith {}; + params ["_vehicle"]; + if (isNumber (configOf _vehicle >> QGVAR(enabled)) && {isNil {_vehicle getVariable [QGVAR(FRIES), nil]}}) then { + [_vehicle] call FUNC(equipFRIES); + }; + }, true, ["ACE_friesBase"], true] call CBA_fnc_addClassEventHandler; +}; + + #ifdef DRAW_FASTROPE_INFO addMissionEventHandler ["Draw3D", { if (!(cursorObject isKindOf "Helicopter")) exitWith {}; diff --git a/addons/fastroping/config.cpp b/addons/fastroping/config.cpp index be8f70a482..dbf1f35e6a 100644 --- a/addons/fastroping/config.cpp +++ b/addons/fastroping/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction","ace_logistics_rope"}; author = ECSTRING(common,ACETeam); - authors[] = {"KoffeinFlummi", "BaerMitUmlaut", "Pokertour"}; + authors[] = {"KoffeinFlummi", "BaerMitUmlaut", "Pokertour", "veteran29"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/fastroping/functions/fnc_deployAIWaypoint.sqf b/addons/fastroping/functions/fnc_deployAIWaypoint.sqf index 273d148329..4ca5164a6e 100644 --- a/addons/fastroping/functions/fnc_deployAIWaypoint.sqf +++ b/addons/fastroping/functions/fnc_deployAIWaypoint.sqf @@ -24,7 +24,7 @@ private _speedMode = speedMode _group; // - Approach ----------------------------------------------------------------- if (_vehicle distance2D _position > 50) then { _group setSpeedMode "LIMITED"; - _vehicle flyInHeight 20; + _vehicle flyInHeight [20, true]; _commander doMove _position; waitUntil {_vehicle distance2D _position < 50}; waitUntil {vectorMagnitude (velocity _vehicle) < 3}; diff --git a/addons/fastroping/functions/fnc_equipFRIES.sqf b/addons/fastroping/functions/fnc_equipFRIES.sqf index 6dcb29e3e7..39b9e881b5 100644 --- a/addons/fastroping/functions/fnc_equipFRIES.sqf +++ b/addons/fastroping/functions/fnc_equipFRIES.sqf @@ -15,15 +15,20 @@ * Public: Yes */ -params ["_vehicle"]; +[{ + params ["_vehicle"]; -private _config = configOf _vehicle; -if !(isNumber (_config >> QGVAR(enabled))) then { - ["%1 has not been configured for ACE_Fastroping.", getText (_config >> "displayName")] call BIS_fnc_error; -} else { - if (getNumber (_config >> QGVAR(enabled)) == 2) then { - private _fries = (getText (_config >> QGVAR(friesType))) createVehicle [0, 0, 0]; - _fries attachTo [_vehicle, getArray (_config >> QGVAR(friesAttachmentPoint))]; - _vehicle setVariable [QGVAR(FRIES), _fries, true]; + if (!alive _vehicle) exitWith { WARNING_1("bad vehicle %1",_this); }; + if (alive (_vehicle getVariable [QGVAR(FRIES),objNull])) exitWith { WARNING_1("already equiped %1",_this); }; + + private _config = configOf _vehicle; + if !(isNumber (_config >> QGVAR(enabled))) then { + ["%1 has not been configured for ACE_Fastroping.", getText (_config >> "displayName")] call BIS_fnc_error; + } else { + if (getNumber (_config >> QGVAR(enabled)) == 2) then { + private _fries = (getText (_config >> QGVAR(friesType))) createVehicle [0, 0, 0]; + _fries attachTo [_vehicle, getArray (_config >> QGVAR(friesAttachmentPoint))]; + _vehicle setVariable [QGVAR(FRIES), _fries, true]; + }; }; -}; +}, _this] call CBA_fnc_execNextFrame; diff --git a/addons/fastroping/initSettings.sqf b/addons/fastroping/initSettings.sqf index 0334d90c76..844de927a2 100644 --- a/addons/fastroping/initSettings.sqf +++ b/addons/fastroping/initSettings.sqf @@ -9,3 +9,11 @@ private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(setting_c {[QGVAR(requireRopeItems), _this] call EFUNC(common,cbaSettings_settingChanged)}, false // needRestart ] call CBA_fnc_addSetting; + +[ + QGVAR(autoAddFRIES), "CHECKBOX", + [LSTRING(setting_autoAddFRIES_displayName), LSTRING(setting_autoAddFRIES_description)], + _category, + false, // default value + true // isGlobal +] call CBA_fnc_addSetting; diff --git a/addons/fastroping/stringtable.xml b/addons/fastroping/stringtable.xml index acee249496..b88decf9ff 100644 --- a/addons/fastroping/stringtable.xml +++ b/addons/fastroping/stringtable.xml @@ -314,5 +314,15 @@ Halatla kaymak için halat gerekli 줄이 필요합니다 + + Auto-Equip FRIES + Automatycznie Zamontuj FRIES + FRIESの自動装備 + + + Automatically add FRIES to helicopters that support them. + Automatycznie dodawaj FRIES do śmigłowców które je wspierają. + FRIESをサポートするヘリコプターに自動的にFRIESを追加します。 + diff --git a/addons/field_rations/stringtable.xml b/addons/field_rations/stringtable.xml index f4ebf7fc32..34c7fa2240 100644 --- a/addons/field_rations/stringtable.xml +++ b/addons/field_rations/stringtable.xml @@ -566,7 +566,7 @@ Esse %1... 食用 %1... 食用 %1... - %1を食べています・・・ + %1 を食べています・・・ Jedzenie %1... Поедание %1... %1 Yeniyor... @@ -578,7 +578,7 @@ Trinke %1... 飲用自 %1... 饮用 %1... - %1を飲んでいます・・・ + %1 を飲んでいます・・・ Picie %1... Выпивание %1... %1 Içiliyor... @@ -590,7 +590,7 @@ Trinke von %1... 飲用%1的水中... 从%1饮用中... - %1から飲んでいます・・・ + %1 から飲んでいます・・・ Picie z %1... Выпивание из %1... %1 den içiliyor... diff --git a/addons/compat_ws/addon.toml b/addons/fire/addon.toml similarity index 100% rename from addons/compat_ws/addon.toml rename to addons/fire/addon.toml diff --git a/addons/fire/config.cpp b/addons/fire/config.cpp index 3a8307de72..ac9f7009ec 100644 --- a/addons/fire/config.cpp +++ b/addons/fire/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -8,7 +15,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common", "ace_medical_engine"}; author = ECSTRING(common,ACETeam); - authors[] = {"commy2", "Dani (TCVM)"}; + authors[] = {"commy2", "tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; @@ -18,3 +25,5 @@ class CfgPatches { #include "CfgSounds.hpp" #include "ACE_Medical_Treatment_Actions.hpp" #include "RscTitles.hpp" + +#endif diff --git a/addons/fire/functions/fnc_burn.sqf b/addons/fire/functions/fnc_burn.sqf index 31da540fc2..b6c4aff05e 100644 --- a/addons/fire/functions/fnc_burn.sqf +++ b/addons/fire/functions/fnc_burn.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Makes object catch fire. Only call from events. Local effects only. * Arbitrary values to ignite people. Assumed maximum is "10". * diff --git a/addons/fire/functions/fnc_burnIndicator.sqf b/addons/fire/functions/fnc_burnIndicator.sqf index 6da7a83892..7e1fda3b5d 100644 --- a/addons/fire/functions/fnc_burnIndicator.sqf +++ b/addons/fire/functions/fnc_burnIndicator.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Run once per second in a PFH. Update screen effects with burn indicator. * * Arguments: diff --git a/addons/fire/functions/fnc_burnReaction.sqf b/addons/fire/functions/fnc_burnReaction.sqf index 87f6c2dbb3..108136faaa 100644 --- a/addons/fire/functions/fnc_burnReaction.sqf +++ b/addons/fire/functions/fnc_burnReaction.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM), veteran29 + * Author: tcvm, veteran29 * Handles burning reactions of an unit, like screaming or throwing the weapons away due to pain. * * Arguments: diff --git a/addons/fire/functions/fnc_fireManagerPFH.sqf b/addons/fire/functions/fnc_fireManagerPFH.sqf index ea5705c4e2..d5243ed309 100644 --- a/addons/fire/functions/fnc_fireManagerPFH.sqf +++ b/addons/fire/functions/fnc_fireManagerPFH.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Handles various fire objects and determines if local units deserves to get burned. * Used to handle external burning objects, not used internally because internal methods are more performant. * diff --git a/addons/fire/functions/fnc_medical_canPatDown.sqf b/addons/fire/functions/fnc_medical_canPatDown.sqf index b7f56e8bf2..46ef896e03 100644 --- a/addons/fire/functions/fnc_medical_canPatDown.sqf +++ b/addons/fire/functions/fnc_medical_canPatDown.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Returns if unit can pat down fire or not. * * Arguments: diff --git a/addons/fire/functions/fnc_medical_progress.sqf b/addons/fire/functions/fnc_medical_progress.sqf index 67bca9b55d..20bbc4f4e9 100644 --- a/addons/fire/functions/fnc_medical_progress.sqf +++ b/addons/fire/functions/fnc_medical_progress.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Checks if patient is still burning for medical progress to continue. * * Arguments: diff --git a/addons/fire/functions/fnc_medical_success.sqf b/addons/fire/functions/fnc_medical_success.sqf index f3a30faee9..0783013551 100644 --- a/addons/fire/functions/fnc_medical_success.sqf +++ b/addons/fire/functions/fnc_medical_success.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Decreases burning intensity on successful medical action. * * Arguments: diff --git a/addons/fortify/functions/fnc_modifyAction.sqf b/addons/fortify/functions/fnc_modifyAction.sqf index 4587840396..c81c4eff12 100644 --- a/addons/fortify/functions/fnc_modifyAction.sqf +++ b/addons/fortify/functions/fnc_modifyAction.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" - /* +/* * Author: PabstMirror * Modifies the fortify action, shows current budget. * diff --git a/addons/goggles/functions/fnc_isInRotorWash.sqf b/addons/goggles/functions/fnc_isInRotorWash.sqf index d978cde0ce..34f46047ca 100644 --- a/addons/goggles/functions/fnc_isInRotorWash.sqf +++ b/addons/goggles/functions/fnc_isInRotorWash.sqf @@ -9,8 +9,8 @@ * * Return Value: * Array : - * 0: In rotorwash - * 1: Amount of rotor wash. + * - 0: In rotorwash + * - 1: Amount of rotor wash. * * Example: * if ([ace_player, 10] call ace_goggles_fnc_isInRotorWash select 0) then { hint "Rotor wash"; }; diff --git a/addons/gunbag/ACE_Arsenal_Actions.hpp b/addons/gunbag/ACE_Arsenal_Actions.hpp new file mode 100644 index 0000000000..6064384ad1 --- /dev/null +++ b/addons/gunbag/ACE_Arsenal_Actions.hpp @@ -0,0 +1,26 @@ +class EGVAR(arsenal,actions) { + class ADDON { + displayName = CSTRING(DisplayName); + condition = QUOTE(_this call FUNC(hasGunbag)); + scopeEditor = 0; // variables are reset between 3DEN and mission start + tabs[] = {0,5}; + class GVAR(status) { + textStatement = QUOTE([_this select 0] call FUNC(weaponName)); + }; + class GVAR(store) { + label = CSTRING(ToGunbag); + condition = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(canInteract) == 0); + statement = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(toGunbagCallback)); + }; + class GVAR(retrieve) { + label = CSTRING(OffGunbag); + condition = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(canInteract) == 1); + statement = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(offGunbagCallback)); + }; + class GVAR(swap) { + label = CSTRING(SwapGunbag); + condition = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(canInteract) == 2); + statement = QUOTE([ARR_2(_this select 0,_this select 0)] call FUNC(swapGunbagCallback)); + }; + }; +}; diff --git a/addons/gunbag/XEH_PREP.hpp b/addons/gunbag/XEH_PREP.hpp index 2e2c57a056..78b7be0968 100644 --- a/addons/gunbag/XEH_PREP.hpp +++ b/addons/gunbag/XEH_PREP.hpp @@ -12,3 +12,4 @@ PREP(hasGunbag); PREP(isMachineGun); PREP(BIArsenalClose); PREP(BIArsenalOpen); +PREP(weaponName); diff --git a/addons/gunbag/XEH_preInit.sqf b/addons/gunbag/XEH_preInit.sqf index 7829c58074..ad244390fa 100644 --- a/addons/gunbag/XEH_preInit.sqf +++ b/addons/gunbag/XEH_preInit.sqf @@ -26,34 +26,18 @@ PREP_RECOMPILE_END; }, _this] call CBA_fnc_execNextFrame; }] call CBA_fnc_addClassEventHandler; -[QEGVAR(arsenal,displayOpened), { - - private _center = EGVAR(arsenal,center); - - if (_center call FUNC(hasGunBag)) then { - GVAR(arsenalCache) = (backpackContainer _center) getVariable [QGVAR(gunbagWeapon), []]; - }; -}] call CBA_fnc_addEventHandler; - -[QEGVAR(arsenal,displayClosed), { - - if (!isNil QGVAR(arsenalCache)) then { - (backpackContainer EGVAR(arsenal,center)) setVariable [QGVAR(gunbagWeapon),GVAR(arsenalCache), true]; - }; - - GVAR(arsenalCache) = nil; -}] call CBA_fnc_addEventHandler; - ["CBA_loadoutSet", { params ["_unit", "_loadout", "_extendedInfo"]; private _gunbagWeapon = _extendedInfo getOrDefault [QGVAR(gunbagWeapon), []]; if (_gunbagWeapon isNotEqualTo []) then { - (backpackContainer _unit) setVariable [QGVAR(gunbagWeapon), _gunbagWeapon, true]; - - // Prevent the arsenal closed event from overwriting new info - if (!isNil QGVAR(arsenalCache)) then { - GVAR(arsenalCache) = _gunbagWeapon; + if (!isNil QEGVAR(arsenal,virtualItemsFlatAll)) then { + private _weapon = (_gunbagWeapon select 0) call EFUNC(arsenal,baseWeapon); + if !(_weapon in EGVAR(arsenal,virtualItemsFlatAll)) then { + INFO_1("removing [%1] from loadout",_gunbagWeapon); + _gunbagWeapon = []; + }; }; + (backpackContainer _unit) setVariable [QGVAR(gunbagWeapon), _gunbagWeapon, true]; }; }] call CBA_fnc_addEventHandler; diff --git a/addons/gunbag/config.cpp b/addons/gunbag/config.cpp index 6efaceb5d6..037d3d5df8 100644 --- a/addons/gunbag/config.cpp +++ b/addons/gunbag/config.cpp @@ -16,3 +16,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" +#include "ACE_Arsenal_Actions.hpp" diff --git a/addons/gunbag/functions/fnc_weaponName.sqf b/addons/gunbag/functions/fnc_weaponName.sqf new file mode 100644 index 0000000000..6232c24685 --- /dev/null +++ b/addons/gunbag/functions/fnc_weaponName.sqf @@ -0,0 +1,26 @@ +#include "script_component.hpp" +/* + * Author: Ir0n1E, Brett Mayson + * Get gunbag weapon name + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call ace_gunbag_fnc_weaponName + * + * Public: No + */ + +params ["_unit"]; + +private _state = (backpackContainer _unit) getVariable [QGVAR(gunbagWeapon), []]; + +private _name = localize LSTRING(empty); +if (_state isNotEqualTo []) then { + _name = getText (configFile >> "CfgWeapons" >> _state#0 >> "displayName"); +}; +_name diff --git a/addons/headless/stringtable.xml b/addons/headless/stringtable.xml index 26adbe7f10..3956c14a87 100644 --- a/addons/headless/stringtable.xml +++ b/addons/headless/stringtable.xml @@ -19,7 +19,7 @@ Dieses Modul erlaubt es dir, die KI automatisch auf einen Headless Client zu transferieren. (Standard: Nein) Ten moduł zezwala na automatyczny transfer AI do Headless Cient. (Domyślnie: Nie) 이 모듈을 사용하면 헤드리스 클라이언트에 AI 자동 전송을 설정할 수 있습니다. (기본값 : No) - モジュールは AI を自動的にヘッドレス クライアントへ移行します。(標準: 無効) + モジュールはAIを自動的にヘッドレスクライアントへ移行します。(標準: 無効) Ce module permet de mettre en place un transfert aotmatique de l'IA vers le Headless Clients. (Défaut: Non) 此模块能让你自动转换 AI 的控制权给其他 Headless 客户端。(预设:关闭) 此模塊能讓你自動轉換AI的控制權給其他無頭客戶端。(預設:關閉) @@ -32,7 +32,7 @@ Aktiviert den Transfer der KI auf die Headless Clients. Włącza transfer AI do Headless Client. AI를 헤드리스 클라이언트로 전송할 수 있습니다. - AI をヘッドレス クライアントへ移行を有効化 + AIをヘッドレスクライアントへ移行を有効化 Permet le transfert des IA au Headless Clients. 开启转换 AI 控制权给 Headless 客户端。 開啟轉換AI控制權給無頭客戶端。 @@ -83,7 +83,7 @@ End mission when there are no players connected (same as 'persistent = 0' in server configuration but with Headless Client support). Beende die Mission, wenn keine Spieler mehr verbunden sind (das gleiche wie 'persitent = 0' in den Serverkonfigurationen aber mit Headless Client Unterstützung). 연결된 플레이어가 없을 때 임무 종료. (서버 구성에서는 'persistent = 0'과 같지만 Headless Client는 지원함) - プレイヤーが接続していない場合はミッション終了します。(サーバ設定の'presistent =0'と同じですが、ヘッドレス クライアントは適用されます) + プレイヤーが接続していない場合はミッション終了します。(サーバ設定の'presistent =0'と同じですが、ヘッドレスクライアントは適用されます) Termine la mission lorsqu'il n'y a plus de joueur connecté (idem que 'persistent = 0' dans la config serveur mais avec la gestion du Headless Client). 当服务器里没有任何玩家还连线时自动结束任务(效果同于伺服器设定的'persistent = 0',但支援 Headless 客户端)。 當伺服器裡沒有任何玩家還連線時自動結束任務(效果同於伺服器設定的'persistent = 0',但支援無頭客戶端)。 @@ -136,7 +136,7 @@ Zeichnet Transferstatistiken, Verbindungen und Verbindungsabbrüche in einer RPT-Datei auf. (Standard: Nein) Zapisz statystyki transferu i status połączenia Headless Clienta do RPT. (Domyślnie: Tak) 전송 통계 및 헤드리스 클라이언트 연결(해제)를 RPT파일에 로그함. (기본값: No) - 統計とヘッドレス クライアントの接続有無を PRT へ記録します。(標準: 無効) + 統計とヘッドレスクライアントの接続有無を PRT へ記録します。(標準: 無効) Archive les statistiques de transfert et de (dé)connections du Headless Client dans le RPT. (Défaut: Non) 记录 Headless 客户端间的转换数量与连线/断线等记录到 RPT 报告档中。(预设:关闭) 記錄無頭客戶端間的轉換數量與連線/斷線等記錄到RPT報告檔中。(預設:關閉) @@ -158,7 +158,7 @@ Transfer loadout of units attempts to work around an issue where units appear naked after transferring to a Headless Client. Transferiere die Ausrüstung einer Einheit, um einen Fehler zu umgehen, bei welchem Einheiten nach dem Transfer auf einen Headless Client nackt erscheinen. - 装備の移送はヘッドレス クライアントへの移行後にユニットが裸で出現する問題の回避を試みます。 + 装備の移送はヘッドレスクライアントへの移行後にユニットが裸で出現する問題の回避を試みます。 Передача снаряжения юнитов позволяет обходить проблему, при которой юниты оказываются без снаряжения после передачи управления Headless клиенту. 裝備傳輸用於試著暫時應付單位透過無頭客戶端傳輸時所導致裸裝之問題。 装备转移用于试着暂时应付单位透过 Headless 客户端传输时所导致裸装之问题。 @@ -191,7 +191,7 @@ Headless Blacklist Headless Blacklist - ヘッドレス ブラックリスト + ヘッドレスブラックリスト Liste noire Headless Headless 客户端黑名单 無頭客戶端黑名單 @@ -204,7 +204,7 @@ Disables transferring of this AI unit/group to Headless Clients. No effect on player units. Schaltet das Übertragen dieser KI Einheit/Gruppe zu einem Headless Client aus. Hat keinen Effekt auf Spielereinheiten. - ヘッドレス クライアントへ移行させない AI ユニット/グループを指定します。プレイヤー ユニットへ効果はありません。 + ヘッドレスクライアントへ移行させないAIユニット/グループを指定します。プレイヤーユニットへ効果はありません。 Désactive le transfert de ce(tte) unité/groupe au Headless Clients. Sans effet sur les unités des joueurs. 禁止转换黑名单中的 AI 单位/群组到 Headless 客户端上。此功能对玩家单位无用。 禁止轉換黑名單中的AI單位/群組到無頭客戶端上。此功能對玩家單位無用。 diff --git a/addons/hearing/functions/fnc_updateVolume.sqf b/addons/hearing/functions/fnc_updateVolume.sqf index 11dc919a7e..6cff2a9fe5 100644 --- a/addons/hearing/functions/fnc_updateVolume.sqf +++ b/addons/hearing/functions/fnc_updateVolume.sqf @@ -5,7 +5,7 @@ * * Arguments: * 0: Args - * 0: Just update volume (skip ringing/recovery) (default: false) + * - 0: Just update volume (skip ringing/recovery) (default: false) * * Return Value: * None diff --git a/addons/hellfire/CfgMagazines.hpp b/addons/hellfire/CfgMagazines.hpp index eaee714f88..8abf2529b5 100644 --- a/addons/hellfire/CfgMagazines.hpp +++ b/addons/hellfire/CfgMagazines.hpp @@ -16,7 +16,7 @@ class CfgMagazines { count = 1; mass = 70; pylonWeapon = QGVAR(launcher); - hardpoints[] = {"SCALPEL_1RND"}; + hardpoints[] = {"SCALPEL_1RND", "HellfireRail_MELB"}; model = "\A3\Weapons_F\DynamicLoadout\PylonMissile_1x_Bomb_04_F.p3d"; }; class PylonRack_1Rnd_ACE_Hellfire_AGM114K: 6Rnd_ACE_Hellfire_AGM114K { // 1x Launcher Support Rack diff --git a/addons/hot/config.cpp b/addons/hot/config.cpp index d285b08cfc..bdb7ad956f 100644 --- a/addons/hot/config.cpp +++ b/addons/hot/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common","ace_missileguidance"}; author = ECSTRING(common,ACETeam); - authors[] = {"Dani (TCVM)"}; + authors[] = {"tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/hot/stringtable.xml b/addons/hot/stringtable.xml index 1c0a745a89..85c8690fef 100644 --- a/addons/hot/stringtable.xml +++ b/addons/hot/stringtable.xml @@ -6,7 +6,7 @@ Drahtgelenkt Kierowany przewodem Filoguidato - ワイヤ有線誘導 + 有線誘導 Проводное управление Guiado por Fio 有線制導 @@ -18,11 +18,11 @@ 유선 유도 - Semi-automatic command to line of sight + Semi-automatic command to line of sight (SACLOS) Halbautomatische Steuerung über Sichtverbindung (SACLOS) Semi-automatyczna komenda do pola widzenia Comando Semi-Automatico via Contatto Visivo(SACLOS) - 半自動指令照準線一致誘導方式 + 半自動指令照準線一致誘導方式 (SACLOS) Полуавтоматическое командное наведение по линии визирования (SACLOS) Comando semi-automático para a linha de visão (SACLOS) 視線內半自動指令 @@ -38,7 +38,7 @@ Drahtgelenkte Rakete Pocisk kierowany przewodowo Missile filoguidato - ワイヤ有線誘導ミサイル + 有線誘導ミサイル Ракета с проводным управлением Míssil Guiado por Fio 有線制導飛彈 @@ -134,7 +134,7 @@ Anti Personen Lenkflugkörper Pocisk kierowany przewodowo (przeciwpiechotny) Missile filoguidato antiuomo - ワイヤ有線誘導ミサイル (対人) + 有線誘導ミサイル (対人) Ракета с проводным управлением (Противопехотная) Míssil Guiado por Fio (Anti-Pessoal) 有線制導飛彈(反步兵) diff --git a/addons/hunterkiller/stringtable.xml b/addons/hunterkiller/stringtable.xml index 1439d9a3a9..c422eef3f5 100644 --- a/addons/hunterkiller/stringtable.xml +++ b/addons/hunterkiller/stringtable.xml @@ -6,30 +6,35 @@ 헌터 킬러 Hunter Killer Hunter Killer + ハンターキラー Override 오버라이드 Указать Anular + オーバーライド Force other turret to slew onto your viewpoint 다른 포탑이 시야에 오도록 강제합니다. Повернуть другую турель туда, куда смотрит твоя Forzar otra torreta a dirigirse hacia tu zona de apuntado. + 他のタレットを強制的に自分の視点に旋回させる Observe 관측 Наблюдать Observar + オブザーブ Slew your turret onto other turret's viewpoint 포탑을 다른 포탑의 시야에 놓습니다. Повернуть свою турель туда, куда смотрит другая Dirigir tu propia torreta hacia la zona de apuntado de otra torreta. + 自分のタレットを相手のタレットの視点に旋回させる。 diff --git a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf index 675cebe61f..d718dac5e7 100644 --- a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Compile the zeus action menu (only to be done once) * * Arguments: diff --git a/addons/interaction/functions/fnc_doRemoteControl.sqf b/addons/interaction/functions/fnc_doRemoteControl.sqf index 90cad9e49c..a663ed1954 100644 --- a/addons/interaction/functions/fnc_doRemoteControl.sqf +++ b/addons/interaction/functions/fnc_doRemoteControl.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike, joko + * Author: kymckay, joko * * Arguments: * None diff --git a/addons/interaction/functions/fnc_joinTeam.sqf b/addons/interaction/functions/fnc_joinTeam.sqf index 06a1ea9f72..28287c84b7 100644 --- a/addons/interaction/functions/fnc_joinTeam.sqf +++ b/addons/interaction/functions/fnc_joinTeam.sqf @@ -19,7 +19,7 @@ params ["_unit", "_team", ["_displayHint", false, [false]]]; -["CBA_teamColorChanged", [_unit, _team]] call CBA_fnc_globalEvent; +_unit assignTeam _team; // display message if (_unit == ACE_player) then { diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 4e74dc4101..27ddd5cb46 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -1069,7 +1069,7 @@ Should players receive negative rating? When enabled players are only receiving positive ratings which prevents friendly AI fire when destroying friendly equipment or killing team members. Sollen Spieler negative Bewertungen erhalten dürfen? Wenn diese Option aktiviert ist, erhalten Spieler nur positive Bewertungen, was Freundbeschuss durch KI verhindert, wenn befreundete Ausrüstung zerstört oder befreundete Einheiten von Spielern des selben Teams getötet werden. - 否定評価を受けますか?有効化した場合プレイヤーは肯定評価のみを受け、友軍の装備を壊したり殺害をしても AI からの攻撃を防ぎます。 + 否定評価を受けますか?有効化した場合プレイヤーは肯定評価のみを受け、友軍の装備を壊したり殺害をしてもAIからの攻撃を防ぎます。 I giocatori dovrebbero ricevere delle valutazioni negative ? Quando è abilitato i giocatori ricevono esclusivamente valutazioni positive che prevengono il fuoco delle AI alleate quando distruggono equipaggiamenti o uccidono membri della squadra. 玩家是否會收到負面評價? 當本功能開啟時玩家只會接收到正面評價,所以當玩家做出擊殺友軍AI、毀壞友軍裝備或殺害小隊夥伴都不會收到負面評價 玩家是否会收到负面评价? 当本功能开启时玩家只会接收到正面评价,所以当玩家做出击杀友军 AI、毁坏友军装备或杀害小队伙伴都不会收到负面评价。 diff --git a/addons/laser/RscInGameUI.hpp b/addons/laser/RscInGameUI.hpp index 49ce3fdf5b..753564385c 100644 --- a/addons/laser/RscInGameUI.hpp +++ b/addons/laser/RscInGameUI.hpp @@ -1,117 +1,18 @@ class RscInGameUI { class RscOptics_LaserDesignator { - idd = 300; - controls[] = {"CA_IGUI_elements_group"}; - - onLoad = "uiNameSpace setVariable ['ACE_RscOptics_LaserDesignator',(_this select 0)];"; - onUnload = "uiNameSpace setVariable ['ACE_RscOptics_LaserDesignator',nil];"; - class CA_IGUI_elements_group: RscControlsGroup { - idc = 170; - - x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; - y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; - w = "53.5 * (0.01875 * SafezoneH)"; - h = "40 * (0.025 * SafezoneH)"; - class VScrollbar: VScrollbar { - width = 0; - }; - class HScrollbar: HScrollbar { - height = 0; - }; class controls { - class CA_OpticsZoom: RscText { - idc = 180; - style = 1; - colorText[] = {0.706,0.0745,0.0196,1}; - sizeEx = "0.038*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "4.5"; - x = "43.85 * (0.01875 * SafezoneH)"; - y = "19.6 * (0.025 * SafezoneH)"; - w = "4.5 * (0.01875 * SafezoneH)"; - h = "1.1 * (0.025 * SafezoneH)"; - }; - class ACE_Distance: RscText { - idc = 123002; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "2456"; - x = "24.6 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; - }; + // Hide the vanilla distance display class CA_Distance: RscText { - idc = 151; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "2456"; - x = 0; - y = 0; - w = 0; - h = 0; + idc = IDC_LASERDESIGNATOR_DISTANCE; // Purposeful overwrite, makes range update constantly, do not remove + fade = 1; + colorText[] = {0,0,0,0}; // fade doesn't work in some cases (e.g. controlling remote designator uav) }; - class CA_Elev: RscText { - idc = 175; - style = 1; - sizeEx = "0.038*SafezoneH"; + class ACE_Distance: CA_Distance { + idc = IDC_LASERDESIGNATOR_ACEDISTANCE; + fade = 0; colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "80.5"; - x = "32.7 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; }; - class CA_VisionMode: RscText { - idc = 179; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "VIS"; - x = "6.5 * (0.01875 * SafezoneH)"; - y = "19.6 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.1 * (0.025 * SafezoneH)"; - }; - class CA_Laser: RscText { - idc = 158; - style = "0x30 + 0x800"; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa"; - x = "29.2 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "3.5 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; - }; - class CA_Heading: RscText { - idc = 156; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "023"; - x = "16.1 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "3.5 * (0.01875 * SafezoneH)"; - h = "1.6 * (0.025 * SafezoneH)"; - }; - class ACE_LaserCode_Helper: RscMapControl { idc = -1; onDraw = QUOTE(_this call FUNC(onLaserDesignatorDraw)); @@ -119,7 +20,7 @@ class RscInGameUI { h = 0; }; class ACE_LaserCode: RscText { - idc = 123001; + idc = IDC_LASERDESIGNATOR_LASERCODE; style = 0; sizeEx = "0.038*SafezoneH"; colorText[] = {0.706,0.0745,0.0196,1}; diff --git a/addons/laser/XEH_PREP.hpp b/addons/laser/XEH_PREP.hpp index 8f75906346..9b9be64752 100644 --- a/addons/laser/XEH_PREP.hpp +++ b/addons/laser/XEH_PREP.hpp @@ -7,6 +7,7 @@ PREP(handleLaserTargetCreation); PREP(keyLaserCodeChange); PREP(laserOff); PREP(laserOn); +PREP(laserPointTrack); PREP(laserTargetPFH); PREP(onLaserDesignatorDraw); PREP(rotateVectLine); @@ -15,3 +16,4 @@ PREP(seekerFindLaserSpot); PREP(shootCone); PREP(shootRay); PREP(showVehicleHud); +PREP(toggleLST); diff --git a/addons/laser/XEH_postInit.sqf b/addons/laser/XEH_postInit.sqf index 2ede72f372..364e9a682f 100644 --- a/addons/laser/XEH_postInit.sqf +++ b/addons/laser/XEH_postInit.sqf @@ -33,7 +33,12 @@ if (hasInterface) then { ["ace_laserOn", { params ["_uuid", "_args"]; TRACE_2("ace_laserOn eh",_uuid,_args); + GVAR(laserEmitters) set [_uuid, _args]; + private _unit = _args select 0; + if (local _unit && {hasPilotCamera _unit}) then { + [_unit] call FUNC(laserPointTrack); + }; }] call CBA_fnc_addEventHandler; ["ace_laserOff", { @@ -52,6 +57,19 @@ if (hasInterface) then { }; }] call CBA_fnc_addEventHandler; +["AllVehicles", "init", { + params ["_unit"]; + if (hasPilotCamera _unit) then { + _unit setVariable [QGVAR(hasLaserSpotTracker), true]; + _unit setVariable [QGVAR(laserSpotTrackerOn), false]; + private _actionOff = ["LSTOff", localize LSTRING(LSTOff), "", {[_this select 0] call FUNC(toggleLST)}, {(_this select 0) getVariable [QGVAR(laserSpotTrackerOn), false]}] call ace_interact_menu_fnc_createAction; + [_unit, 1, ["ACE_SelfActions"], _actionOff] call ace_interact_menu_fnc_addActionToObject; + private _actionOn = ["LSTOn", localize LSTRING(LSTOn), "", {[_this select 0] call FUNC(toggleLST)}, {!((_this select 0) getVariable [QGVAR(laserSpotTrackerOn), false])}] call ace_interact_menu_fnc_createAction; + [_unit, 1, ["ACE_SelfActions"], _actionOn] call ace_interact_menu_fnc_addActionToObject; + }; +}, true, [], true] call CBA_fnc_addClassEventHandler; + + // Shows detector and mine posistions in 3d when debug is on #ifdef DRAW_LASER_INFO addMissionEventHandler ["Draw3D", {_this call FUNC(dev_drawVisibleLaserTargets)}]; diff --git a/addons/laser/config.cpp b/addons/laser/config.cpp index 2d59a177de..5bd8bf8548 100644 --- a/addons/laser/config.cpp +++ b/addons/laser/config.cpp @@ -20,8 +20,6 @@ class CfgPatches { class RscControlsGroup; -class VScrollbar; -class HScrollbar; class RscText; class RscMapControl; class RscControlsGroupNoScrollbars; diff --git a/addons/laser/functions/fnc_findLaserSource.sqf b/addons/laser/functions/fnc_findLaserSource.sqf index 878b3e91db..d7b535a5de 100644 --- a/addons/laser/functions/fnc_findLaserSource.sqf +++ b/addons/laser/functions/fnc_findLaserSource.sqf @@ -6,7 +6,7 @@ * Arguments: * 0: Vehicle (shooter of laser) * 6: Method Args - * 0: Laser Source selection on Vehicle + * - 0: Laser Source selection on Vehicle * * Return Value: * [position, direction] diff --git a/addons/laser/functions/fnc_keyLaserCodeChange.sqf b/addons/laser/functions/fnc_keyLaserCodeChange.sqf index 32d9151083..ee5f49b6c3 100644 --- a/addons/laser/functions/fnc_keyLaserCodeChange.sqf +++ b/addons/laser/functions/fnc_keyLaserCodeChange.sqf @@ -40,8 +40,14 @@ if (isNull (ACE_controlledUAV param [0, objNull])) then { }; TRACE_2("",_currentShooter,_currentWeapon); -if (((getNumber (configFile >> "CfgWeapons" >> _currentWeapon >> "laser")) == 0) && - {(getNumber (configFile >> "CfgWeapons" >> _currentWeapon >> QGVAR(canSelect))) == 0}) exitWith {false}; +private _currentWeaponCfg = configFile >> "CfgWeapons" >> _currentWeapon; +if ( + (getNumber (_currentWeaponCfg >> "laser") == 0) && + { + !(_currentShooter getVariable [QGVAR(hasLaserSpotTracker), false]) && + {(getNumber (_currentWeaponCfg >> QGVAR(canSelect))) == 0} + } +) exitWith {false}; private _oldLaserCode = _currentShooter getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE]; private _newLaserCode = _oldLaserCode; diff --git a/addons/laser/functions/fnc_laserPointTrack.sqf b/addons/laser/functions/fnc_laserPointTrack.sqf new file mode 100644 index 0000000000..bfb0f26571 --- /dev/null +++ b/addons/laser/functions/fnc_laserPointTrack.sqf @@ -0,0 +1,39 @@ +#include "script_component.hpp" +/* + * Author: LorenLuke + * Toggles laser point tracking when a laser is on, for tracking coordinates. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * Nothing + * + * Example: + * [vehicle player] call ace_laser_fnc_laserPointTrack + * + * Public: No + */ +params ["_vehicle"]; + +[{ + params ["_args", "_pfhID"]; + _args params ["_vehicle"]; + if !(alive _vehicle && {local _vehicle} && {hasPilotCamera _vehicle} && {!isNull (laserTarget _vehicle)}) exitWith { + [_pfhID] call CBA_fnc_removePerFrameHandler; + }; + (getPilotCameraTarget _vehicle) params ["_isTracking", "_spotPos", "_targetObj"]; + if (!_isTracking) exitWith {}; + if (isNull _targetObj) then { + private _laserTargetPos = getPosASL laserTarget _vehicle; + private _distance = _spotPos distance _laserTargetPos; + if (_distance > 0.15) then { + private _vehPos = getPosASL _vehicle; + private _vectorToLaser = _vehPos vectorFromTo _laserTargetPos; + private _vectorToSpot = _vehPos vectorFromTo _spotPos; + if (acos (_vectorToLaser vectorCos _vectorToSpot) < 0.025) then { + _vehicle setPilotCameraTarget _laserTargetPos; + }; + }; + }; +}, 0, [_vehicle]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf b/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf index e7a4994ce2..9c85689f4a 100644 --- a/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf +++ b/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf @@ -15,14 +15,26 @@ * Public: No */ -private _laserCode = ACE_player getVariable[QGVAR(code), ACE_DEFAULT_LASER_CODE]; -if (!isNil "_laserCode") then { - __LaserDesignatorIGUI_LaserCode ctrlSetText format["Code: %1", [_laserCode, 4, 0, false] call CBA_fnc_formatNumber]; +params ["_ctrl"]; + +private _display = ctrlParent _ctrl; + +private _currentShooter = ACE_controlledUAV param [0, objNull]; +if (isNull _currentShooter) then { + if (ACE_player call CBA_fnc_canUseWeapon) then { + _currentShooter = ACE_player; + } else { + _currentShooter = objectParent ACE_player; + }; }; -if (! (ctrlShown __LaserDesignatorIGUI_LaserOn) ) then { - // TODO: hide distance - __LaserDesignatorIGUI_ACE_Distance ctrlSetText "----"; -} else { - __LaserDesignatorIGUI_ACE_Distance ctrlSetText (ctrlText __LaserDesignatorIGUI_CA_Distance); +private _laserCode = _currentShooter getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE]; +private _ctrlLaserCode = _display displayCtrl IDC_LASERDESIGNATOR_LASERCODE; +_ctrlLaserCode ctrlSetText format ["Code: %1", [_laserCode, 4, 0, false] call CBA_fnc_formatNumber]; + +private _ctrlDistanceACE = _display displayCtrl IDC_LASERDESIGNATOR_ACEDISTANCE; +if (!isLaserOn _currentShooter) exitWith { + _ctrlDistanceACE ctrlSetText "----"; }; + +_ctrlDistanceACE ctrlSetText (ctrlText (_display displayCtrl IDC_LASERDESIGNATOR_DISTANCE)); diff --git a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf index c5677d3bf7..4c7277a72c 100644 --- a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf +++ b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf @@ -12,6 +12,8 @@ * 4: Seeker wavelength sensitivity range, [1550,1550] is common eye safe * 5: Seeker laser code. * 6: Ignore 1 (e.g. Player's vehicle) (default: objNull) + * 7: Ignore 2 (e.g. Attached object) (default: objNull) + * 8: Owners to ignore (e.g. Player's vehicle) (default: []) * * Return Value: * [Strongest compatible laser spot ASL pos, owner object] Nil array values if nothing found @@ -24,7 +26,7 @@ BEGIN_COUNTER(seekerFindLaserSpot); -params ["_posASL", "_dir", "_seekerFov", "_seekerMaxDistance", "_seekerWavelengths", "_seekerCode", ["_ignoreObj1", objNull]]; +params ["_posASL", "_dir", "_seekerFov", "_seekerMaxDistance", "_seekerWavelengths", "_seekerCode", ["_ignoreObj1", objNull], ["_ignoreObj2", objNull], ["_ignoreOwners", []]]; _dir = vectorNormalized _dir; _seekerWavelengths params ["_seekerWavelengthMin", "_seekerWavelengthMax"]; @@ -43,6 +45,8 @@ private _finalOwner = objNull; _x params ["_obj", "_owner", "_laserMethod", "_emitterWavelength", "_laserCode", "_divergence"]; TRACE_6("laser",_obj,_owner,_laserMethod,_emitterWavelength,_laserCode,_divergence); + if (_owner in _ignoreOwners) then {continue}; + if (alive _obj && {_emitterWavelength >= _seekerWavelengthMin} && {_emitterWavelength <= _seekerWavelengthMax} && {_laserCode == _seekerCode}) then { private _laser = []; @@ -142,7 +146,7 @@ if ((count _spots) > 0) then { _bucketList = _finalBuckets select _index; { private _testPos = (_x select 0) vectorAdd [0,0,0.05]; - private _testIntersections = lineIntersectsSurfaces [_posASL, _testPos, _ignoreObj1]; + private _testIntersections = lineIntersectsSurfaces [_posASL, _testPos, _ignoreObj1, _ignoreObj2]; if ([] isEqualTo _testIntersections) then { _bucketList pushBack _x; }; diff --git a/addons/laser/functions/fnc_toggleLST.sqf b/addons/laser/functions/fnc_toggleLST.sqf new file mode 100644 index 0000000000..09b55d8c44 --- /dev/null +++ b/addons/laser/functions/fnc_toggleLST.sqf @@ -0,0 +1,67 @@ +#include "script_component.hpp" +/* + * Author: LorenLuke + * Toggles the laser spot tracker for any enabled vehicle. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * Nothing + * + * Example: + * [vehicle player] call ace_laser_fnc_toggleLST + * + * Public: No + */ + + +params ["_vehicle"]; + +if !(_vehicle getVariable [QGVAR(hasLaserSpotTracker), false]) exitWith {}; + +private _enabled = _vehicle getVariable [QGVAR(laserSpotTrackerOn), false]; +_vehicle setVariable [QGVAR(laserSpotTrackerOn), !_enabled]; + +private _LSTmessage = if (_vehicle getVariable [QGVAR(laserSpotTrackerOn), false]) then {localize LSTRING(LSTOn)} else {localize LSTRING(LSTOff)}; +private _string = format ["%1
", _LSTmessage]; +private _laserCode = _vehicle getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE]; +_string = format ["%1%2: %3
",_string, localize LSTRING(laserCode), _laserCode]; +[_string] call EFUNC(common,displayTextStructured); + +if (_enabled) exitWith {}; + +[{ + params ["_args", "_pfhID"]; + _args params ["_vehicle"]; + + if !(_vehicle getVariable [QGVAR(laserSpotTrackerOn), false] && {alive _vehicle}) exitWith { + [_pfhID] call CBA_fnc_removePerFrameHandler; + }; + + private _laserCode = _vehicle getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE]; + private _angle = 25; + + private _pos = _vehicle modelToWorldVisualWorld [0,0,0]; + private _pilotCameraPos = getPilotCameraPosition _vehicle; + private _pilotCameraVector = _pos vectorFromTo (_vehicle modelToWorldVisualWorld (getPilotCameraDirection _vehicle)); + + (getPilotCameraTarget _vehicle) params ["_isTracking", "_spotPos"]; + + if (_isTracking) then { + _angle = 0.25; + }; + + private _laserSource = _vehicle modelToWorldWorld _pilotCameraPos; + private _laserResult = [_laserSource, _pilotCameraVector, _angle, 5000, [ACE_DEFAULT_LASER_WAVELENGTH,ACE_DEFAULT_LASER_WAVELENGTH], _laserCode, _vehicle, laserTarget _vehicle, [_vehicle]] call FUNC(seekerFindLaserSpot); + private _foundTargetPos = _laserResult select 0; + + if (_isTracking) then { + private _distance = _spotPos distance _foundTargetPos; + if (_distance > 0.75) then { + _vehicle setPilotCameraTarget _foundTargetPos; + }; + } else { + _vehicle setPilotCameraTarget _foundTargetPos; + }; +}, 0, [_vehicle]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/laser/script_component.hpp b/addons/laser/script_component.hpp index b0d9951bf3..64a9a85f13 100644 --- a/addons/laser/script_component.hpp +++ b/addons/laser/script_component.hpp @@ -17,14 +17,11 @@ #include "\z\ace\addons\main\script_macros.hpp" - -#define __LaserDesignatorIGUI (uiNamespace getVariable ["ACE_RscOptics_LaserDesignator", nil]) -#define __LaserDesignatorIGUI_LaserCode (__LaserDesignatorIGUI displayCtrl 123001) -#define __LaserDesignatorIGUI_ACE_Distance (__LaserDesignatorIGUI displayCtrl 123002) -#define __LaserDesignatorIGUI_CA_Distance (__LaserDesignatorIGUI displayCtrl 151) -#define __LaserDesignatorIGUI_LaserOn (__LaserDesignatorIGUI displayCtrl 158) - #define IDC_MODECONTROLGROUP 1000 #define IDC_ATTACKMODE 1001 #define IDC_LASERCODE 1002 #define IDC_LASERICON 1003 + +#define IDC_LASERDESIGNATOR_LASERCODE 123001 +#define IDC_LASERDESIGNATOR_ACEDISTANCE 123002 +#define IDC_LASERDESIGNATOR_DISTANCE 151 diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml index ccab698ada..dfcc00db5f 100644 --- a/addons/laser/stringtable.xml +++ b/addons/laser/stringtable.xml @@ -85,6 +85,14 @@ 雷射 - 循環切換雷射碼 下 Lazer - Çevrim Kodu aşağı + + Laser Spot Tracker: On + レーザースポットトラッカー: オン + + + Laser Spot Tracker: Off + レーザースポットトラッカー: オフ + Draw Laser on Map 地図上にレーザーを表示する diff --git a/addons/laserpointer/initSettings.sqf b/addons/laserpointer/initSettings.sqf index edf9138b7b..8e1d3bf425 100644 --- a/addons/laserpointer/initSettings.sqf +++ b/addons/laserpointer/initSettings.sqf @@ -1,7 +1,7 @@ [ QGVAR(enabled), "CHECKBOX", LSTRING(DisplayName), - localize ELSTRING(common,ACEKeybindCategoryWeapons), + ELSTRING(common,ACEKeybindCategoryWeapons), true, 1 ] call CBA_fnc_addSetting; diff --git a/addons/logistics_wirecutter/ACE_Arsenal_Stats.hpp b/addons/logistics_wirecutter/ACE_Arsenal_Stats.hpp new file mode 100644 index 0000000000..e317c1a19f --- /dev/null +++ b/addons/logistics_wirecutter/ACE_Arsenal_Stats.hpp @@ -0,0 +1,23 @@ +class EGVAR(arsenal,stats) { + class statBase; + class GVAR(wireCutter): statBase { + scope = 2; + priority = -1; + stats[] = {QGVAR(hasWirecutter)}; + displayName = CSTRING(wirecutterName); + showText = 1; + textStatement = QUOTE(localize QUOTE(ELSTRING(common,yes))); + condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) > 0); + tabs[] = {{4,5}, {}}; + }; + class GVAR(wireCutterItem): statBase { + scope = 2; + priority = -1; + stats[] = {"ACE_isWirecutter"}; + displayName = CSTRING(wirecutterName); + showText = 1; + textStatement = QUOTE(localize QUOTE(ELSTRING(common,yes))); + condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) > 0); + tabs[] = {{}, {7}}; + }; +}; diff --git a/addons/logistics_wirecutter/config.cpp b/addons/logistics_wirecutter/config.cpp index c68f362be8..34107e57b1 100644 --- a/addons/logistics_wirecutter/config.cpp +++ b/addons/logistics_wirecutter/config.cpp @@ -17,3 +17,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" +#include "ACE_Arsenal_Stats.hpp" diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index af91e31401..96d96f5dd5 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -38,6 +38,7 @@ #define GETEGVAR(var1,var2,var3) GETMVAR(EGVAR(var1,var2),var3) #define ARR_SELECT(ARRAY,INDEX,DEFAULT) (if (count ARRAY > INDEX) then {ARRAY select INDEX} else {DEFAULT}) +#define ANY_OF(ARRAY,CONDITION) (ARRAY findIf {CONDITION} != -1) // ACEX Merge #define ACEX_PREFIX acex diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index c4c844bc4c..5379ca4a50 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -10,7 +10,7 @@ #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD // MINIMAL required version for the Mod. Components can specify others.. -#define REQUIRED_VERSION 2.12 +#define REQUIRED_VERSION 2.14 #define REQUIRED_CBA_VERSION {3,15,7} #ifdef COMPONENT_BEAUTIFIED diff --git a/addons/map/functions/fnc_updateMapEffects.sqf b/addons/map/functions/fnc_updateMapEffects.sqf index bebb15ac4f..d93df504f6 100644 --- a/addons/map/functions/fnc_updateMapEffects.sqf +++ b/addons/map/functions/fnc_updateMapEffects.sqf @@ -21,7 +21,7 @@ private _mapCentre = _mapCtrl ctrlMapScreenToWorld [0.5, 0.5]; if (GVAR(mapIllumination)) then { //get nearby lighting - private _light = [[ACE_player], FUNC(determineMapLight), missionNamespace, QGVAR(mapLight), 0.1] call EFUNC(common,cachedCall); + private _light = [ACE_player] call FUNC(determineMapLight); _light params ["_applyLighting", "_lightLevel"]; diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 9e168aba89..e9b54537f0 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -284,7 +284,7 @@ AI csoportok elrejtése Скрыть группы ботов Nascondere gruppi IA - AI グループを非表示 + AIグループを非表示 인공지능 그룹 숨기기 隐藏 AI 小队 隱藏AI小隊 @@ -300,7 +300,7 @@ Jelölők elrejtése "csak AI" csoportoknál? Скрыть маркеры групп, которые состоят полностью из ботов? Nascondi markers per gruppi di sole IA? - 'AI のみ'グループのマーカー表示有無を設定できます。 + 'AIのみ'グループのマーカー表示有無を設定できます。 인공지능만 있는 그룹의 마커를 숨깁니까? 隐藏'AI 小队'的追踪? 隱藏'AI小隊'的蹤跡? diff --git a/addons/map_gestures/stringtable.xml b/addons/map_gestures/stringtable.xml index d701baf3c1..64168b6b70 100644 --- a/addons/map_gestures/stringtable.xml +++ b/addons/map_gestures/stringtable.xml @@ -167,7 +167,7 @@ Ersatz-Farbwert für Gruppenführer wenn keine Gruppeneinstellung vorhanden ist. [Modul: leer lassen um Anwendung bei Clients nicht zu erzwingen] Color por defecto para líderes cuando no está configurado [Módulo: dejar en blanco para no forzar] Définit la couleur par défaut pour les chefs de groupe quand il n'y a pas de réglage de groupe. [Module : laisser vide pour ne pas forcer chez les clients.] - グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません] + グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません] 그룹 설정이 없는 경우 리더의 예비 색상 값입니다. [모듈: 클라이언트에서 강체하지 않기 위해 공백으로 비워둘 것] 当没有设定小队颜色时,此功能会定义队长的指示颜色。[模块:此栏留空来保持预设颜色] 當沒有設定小隊顏色時,此功能會定義隊長的指示器顏色。[模塊: 此欄留空來保持預設顏色] @@ -198,7 +198,7 @@ Ersatz-Farbwert wenn keine Gruppeneinstellung vorhanden ist. [Modul: leer lassen um Anwendung bei Clients nicht zu erzwingen] Color por defecto cuando no está configurado [Módulo: dejar en blanco para no forzar] Définit la couleur par défaut quand il n'y a pas de réglage pour le groupe. [Module : laisser vide pour ne pas forcer chez les clients.] - グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません] + グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません] 그룹 설정이 없을 경우의 예비 색상입니다. [모듈: 클라이언트에서 강체하지 않기 위해 공백으로 비워둘 것] 当没有设定小队颜色时,此功能会定义玩家的指示颜色。[模块:此栏留空来保持预设颜色] 當沒有設定小隊顏色時,此功能會定義玩家的指示器顏色。[模塊: 此欄留空來保持預設顏色] diff --git a/addons/maptools/data/mapToolFixed.paa b/addons/maptools/data/mapToolFixed.paa index 854d1eb17e..964cf6da20 100644 Binary files a/addons/maptools/data/mapToolFixed.paa and b/addons/maptools/data/mapToolFixed.paa differ diff --git a/addons/maptools/data/mapToolRotatingNormal.paa b/addons/maptools/data/mapToolRotatingNormal.paa index fcfb11cfa7..7437dd50c3 100644 Binary files a/addons/maptools/data/mapToolRotatingNormal.paa and b/addons/maptools/data/mapToolRotatingNormal.paa differ diff --git a/addons/maptools/data/mapToolRotatingNormalOriginal.paa b/addons/maptools/data/mapToolRotatingNormalOriginal.paa new file mode 100644 index 0000000000..fcfb11cfa7 Binary files /dev/null and b/addons/maptools/data/mapToolRotatingNormalOriginal.paa differ diff --git a/addons/maptools/data/mapToolRotatingSmall.paa b/addons/maptools/data/mapToolRotatingSmall.paa index 4f37dea565..b9582eadd5 100644 Binary files a/addons/maptools/data/mapToolRotatingSmall.paa and b/addons/maptools/data/mapToolRotatingSmall.paa differ diff --git a/addons/maptools/data/mapToolRotatingSmallOriginal.paa b/addons/maptools/data/mapToolRotatingSmallOriginal.paa new file mode 100644 index 0000000000..4f37dea565 Binary files /dev/null and b/addons/maptools/data/mapToolRotatingSmallOriginal.paa differ diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index a3be0e2c97..480372bac9 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -41,7 +41,7 @@ if (GVAR(freedrawing)) then {[_theMap, _textureWidth] call FUNC(drawLinesOnRoame // Update scale of both parts getResolution params ["_resWidth", "_resHeight", "", "", "_aspectRatio"]; private _scaleX = 32 * _textureWidth * CONSTANT_SCALE * (call FUNC(calculateMapScale)); -private _scaleY = _scaleX * ((_resWidth / _resHeight) / _aspectRatio); //handle bad aspect ratios +private _scaleY = _scaleX; // Position of the fixed part private _xPos = GVAR(mapTool_pos) select 0; diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index 8fdb3d9f33..0d6cebe370 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -182,7 +182,7 @@ Направление: %1° Direzione: %1° Direção: %1 - 方位:%1° + 方位: %1° 방위: %1° 方位:%1° 方位: %1° diff --git a/addons/marker_flags/stringtable.xml b/addons/marker_flags/stringtable.xml index 4ae07c9914..05c3d07479 100644 --- a/addons/marker_flags/stringtable.xml +++ b/addons/marker_flags/stringtable.xml @@ -37,6 +37,7 @@ 마킹용 깃발 꽂기 Поставить флажок Colocar Bandera de señalizado + マーカーフラッグを置く Adjust height @@ -45,6 +46,7 @@ 높이 조정 Регулировать высоту Ajustar altura + 高さを調整する Cancel diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 89c3ced877..23c90b2579 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -5,9 +5,15 @@ if (!hasInterface) exitWith {}; -[missionNamespace, "ACE_setCustomAimCoef", QUOTE(ADDON), { - (linearConversion [0, 1, GET_PAIN_PERCEIVED(ACE_player), 1, 5, true]) + (ACE_player getVariable [QEGVAR(medical_engine,aimFracture), 0]) -}] call EFUNC(common,arithmeticSetSource); +// Fractures affect base sway, pain makes it worse +["baseline", { + ACE_player getVariable [QEGVAR(medical_engine,aimFracture), 0] +}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor); + +// Max pain = 5x sway +["multiplier", { + 1 + (GET_PAIN_PERCEIVED(ACE_player) * 4) +}, QUOTE(ADDON)] call EFUNC(common,addSwayFactor); #ifdef DEBUG_MODE_FULL call compile preprocessFileLineNumbers QPATHTOF(dev\reportSettings.sqf); diff --git a/optionals/compat_sog/addon.toml b/addons/medical/addon.toml similarity index 100% rename from optionals/compat_sog/addon.toml rename to addons/medical/addon.toml diff --git a/addons/medical/config.cpp b/addons/medical/config.cpp index 6c93d1e3e8..76e9818124 100644 --- a/addons/medical/config.cpp +++ b/addons/medical/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -21,3 +28,5 @@ class CfgPatches { class ACE_Tests { medicalHitpoints = QPATHTOF(dev\test_hitpointConfigs.sqf); }; + +#endif diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 4be9a4029f..5d2b66ae6c 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -21,7 +21,7 @@ Unconscious Wake Up Chance Wahrscheinlichkeit um aufzuwachen - 気絶から覚醒の可能性 + 気絶時の覚醒確率 Шанс очнуться при потере сознания Chance de reprendre connaissance Chance de recuperar consciência @@ -37,7 +37,7 @@ The probability that a person with stable vitals will wake up from unconsciousness (checked every 15 seconds). Wahrscheinlichkeit, dass eine bewusstlose Person mit stabilen Vitalwerten wieder aufwacht (Überprüfung alle 15 Sekunden) - 容体が安定しているユニットが気絶する確率を決定できます。(15 秒毎に確認) + 容体が安定しているユニットが意識回復する確率を設定します。(15 秒毎に確認) Вероятность, что стабилизированный юнит очнется от потери сознания (Проверяется каждые 15 сек) La probabilité pour qu'une unité inconsciente en état stable reprenne conscience spontanément (état vérifié toutes les 15 secondes). A probabilidade que uma unidade com vitais estabilizados possa recuperar consciências (verificado a cada 15 segundos) @@ -57,7 +57,7 @@ 腎上腺素甦醒率加成 肾上腺素苏醒概率加成 Erhöhung der Aufwachüberprüfungsrate durch Epinephrin - アドレナリン覚醒率の上昇 + アドレナリンによる覚醒確率上昇 Zvýšení pravděpodobnosti probuzení s Epinefrinem Увеличение шанса очнуться от адреналина Epinefrin Uyanma Şansı Artışı @@ -66,7 +66,7 @@ When an unconscious patient has Epinephrine in their system, the time between spontaneous wake up checks is divided by this value. - 患者がアドレナリンを投与されると自発的に覚醒する確率を上昇させます。 + 患者の体内に投与されたアドレナリンがある場合、\n覚醒計算の確率が上昇(値で除算)されます。 增加因病患的循環系統裡面的腎上腺素自我甦醒的機率。 增加因病患的循环系统里面的肾上腺素自我苏醒的机率。 Augmente la fréquence des tests de réveil lorsque le patient a de l'épinéphrine dans son système sanguin.\n(L'épinéphrine n'accélère pas la reprise de conscience si la valeur est définie sur 1.) @@ -83,7 +83,7 @@ Limping Хромота - 跛行 + 足の引きずり(跛行) Boitement Mancando 跛腳 @@ -98,7 +98,7 @@ Controls whether open or bandaged wounds cause a person to limp. - 創傷開放か傷があると跛行するかどうかを決定できます。 + 開放状態の負傷や包帯で治療した負傷がある時、\n足を引きずる(跛行する)かを設定します。 控制裂開或者已包紮傷口是否會讓人跛腳。 控制裂开或者已包扎伤口是否会让人跛脚。 Permet de définir si les plaies ouvertes ou pansées font boiter une personne. @@ -115,7 +115,7 @@ Limp on Open Wounds Хромота при открытых ранах - 創傷開放時に跛行 + 開放創傷で跛行 Boiter si plaies ouvertes Mancar se possuir feridas abertas 傷口裂開時跛腳 @@ -131,7 +131,7 @@ Limp on Open or Bandaged Wounds Хромота при открытых или забинтованых ранах - 手当した傷か創傷開放すると跛行 + 開放創傷または包帯創傷で跛行 Boiter si plaies ouvertes ou pansées Mancar se possuir feridas abertas ou atadas 使裂開或者包紮過的傷口讓人跛腳 @@ -162,7 +162,7 @@ Controls the effect of using splints to treat fractures.\nWhen disabled, injuries will not cause fractures. - 医療機能で骨折に添え木効果を使うかどうかを決定できます。\n無効化すると、骨折効果は表れません。 + 骨折の治療に添え木を使用した際の効果を設定します。\n無効にすると、骨折しません。 控制是否讓固定版能夠治療骨折。\n當停用時,受傷時不會導致骨折發生。 控制是否让固定板能够治疗骨折。 \n当停用时,受伤时不会导致骨折发生。 Permet de définir le niveau d'efficacité des attelles pour le traitement des fractures.\nSi l'option est désactivée, les blessures ne causent pas de fractures. @@ -236,7 +236,7 @@ The probability of a fracture causing wound resulting in a fracture. La probabilité pour qu'une blessure pouvant causer une fracture en crée effectivement une. - 骨折の原因となる負傷で骨折する確率を決定します。 + 骨折の原因となる負傷が骨折に至る確率を設定します。 骨折导致的伤口再次骨折的可能性。 Výška šance kdy zranění způsobující zlomeniny skutečně způsobí zlomeninu. Вероятность перелома при получении соответствующих ран. @@ -274,7 +274,7 @@ Sélectionne pour quelles unités les soins avancés seront actifs. Kiválasztható, mely egységek számára legyen engedélyezve a fejlett orvosi rendszer Seleziona per quali unità verrà abilitato il sistema medico avanzato - 選択されたユニットが、アドバンスド医療が使えるようになります + 選択されたユニットが、高度な医療が使えるようになります 어느 인원에게 고급 의료 시스템을 적용시킬지 선택하십시요. 选择进阶医疗系统影响的物体 選擇進階醫療系統影響的對象 @@ -308,7 +308,7 @@ Joueurs et IA Játékosok és AI Giocatori ed IA - プレイヤーと AI + プレイヤーとAI 플레이어 및 인공지능 玩家与 AI 玩家與AI @@ -342,7 +342,7 @@ Définit si les unités subissent des dégâts en cas d'accidents en véhicule. Sérülnek-e az egységek autós ütközés során? Le unità sostengono danni da incidenti con veicoli? - ユニットは車両の衝突による損傷を受けるようにしますか? + ユニットが車両の衝突による負傷を受けるようにしますか? 차량 사고시 인원들이 부상을 입습니까? 设定人员是否会因为载具冲撞别的物体而产生伤害? 設定人員是否會因為載具衝撞別的物件而產生傷害? @@ -409,7 +409,7 @@ %1 je příliš daleko, léčba není možná Distanza da %1 è diventata troppo alta per permettere trattamento %1 est trop loin pour être soigné. - %1 は治療をできない所まで離れた + %1 は治療出来ない距離まで離れた %1 부터의 거리가 너무 멀어 치료할 수 없습니다 设定当距离超过%1将不能使用治疗动作 設定當距離超過%1將不能使用治療動作 diff --git a/addons/medical_ai/addon.toml b/addons/medical_ai/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_ai/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_ai/config.cpp b/addons/medical_ai/config.cpp index c42fc98f95..b9fb4386ad 100644 --- a/addons/medical_ai/config.cpp +++ b/addons/medical_ai/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -16,3 +23,5 @@ class CfgPatches { #include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" + +#endif diff --git a/addons/medical_ai/stringtable.xml b/addons/medical_ai/stringtable.xml index 67381ebb18..b96449dee7 100644 --- a/addons/medical_ai/stringtable.xml +++ b/addons/medical_ai/stringtable.xml @@ -4,7 +4,7 @@ Medic AI Sanitäts KI - AI 衛生兵 + AI衛生兵 ИИ Медик Médecine IA IA Médico @@ -20,7 +20,7 @@ AI will respond to injury and unconsciousness KI reagiert auf Verletzungen und Bewusstlosigkeit - AI が負傷者と気絶している人に対して行動するようになります。 + AIが負傷者と気絶している人に対して行動するようになります。 ИИ будет реагировать на травмы и потерю сознания Les unités IA seront sensibles aux blessures, ainsi qu'à la perte de connaissance. A IA irá responder a ferimentos e perdas de consciência diff --git a/addons/medical_blood/addon.toml b/addons/medical_blood/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_blood/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_blood/config.cpp b/addons/medical_blood/config.cpp index 3e5d5227da..c10bd80ee0 100644 --- a/addons/medical_blood/config.cpp +++ b/addons/medical_blood/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -16,3 +23,5 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "ACE_Settings.hpp" + +#endif diff --git a/addons/medical_blood/stringtable.xml b/addons/medical_blood/stringtable.xml index d2027e3ac4..5320cab219 100644 --- a/addons/medical_blood/stringtable.xml +++ b/addons/medical_blood/stringtable.xml @@ -35,7 +35,7 @@ Enables the creation of blood drops when units are bleeding or take damage. - ユニットが出血かダメージを受けた時に、血痕を残すようにします。 + ユニットが出血や負傷した時に、血痕を残すようにします。 Si une unité saigne, elle laissera des traces de sang derrière elle. Разрешает создание капель крови при кровотечении или получении урона Permitir a criação de gotas de sangue quando as unidades recebem ferimentos ou estão sangrando. @@ -51,7 +51,7 @@ Max Blood Objects - 最大血痕数 + 血痕最大数 Quantité de sang à afficher Макс. кол-во капель крови Limite de objetos de sangue @@ -67,7 +67,7 @@ Sets the maximum number of blood drop objects which can be spawned, excessive amounts can cause FPS lag. - 生成される血痕オブジェクト数を設定できます。極端に増やすと FPS ラグを引き起こします。 + 生成される血痕オブジェクト数を設定できます。極端に設定するとFPSのラグを引き起こす可能性があります。 Définit le nombre maximal de traces de sangs pouvant être affichées.\nUne quantité excessive peut engendrer une baisse de FPS. Задает макс. количество создаваемых объектов капель крови. Чрезмерное количество может вызвать задержку FPS Define o limite máximo de objetos de gota de sangue que podem ser criados, quantidades excessivas podem causar lag de FPS. diff --git a/addons/medical_damage/addon.toml b/addons/medical_damage/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_damage/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_damage/config.cpp b/addons/medical_damage/config.cpp index 5edaa691b3..712ec44a01 100644 --- a/addons/medical_damage/config.cpp +++ b/addons/medical_damage/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -27,3 +34,5 @@ class ACE_Extensions { }; }; */ + +#endif diff --git a/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf b/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf index 6e6757c486..07ab619c00 100644 --- a/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf +++ b/addons/medical_damage/functions/fnc_getTypeOfDamage.sqf @@ -29,7 +29,7 @@ if (isNil "_damageType") then { // config may define an invalid damage type if !(_damageType in GVAR(damageTypeDetails)) then { - WARNING_2("Damage type [%1] for ammo [%2] not found",_typeOfDamage,_typeOfProjectile); + WARNING_2("Damage type [%1] for ammo [%2] not found",_damageType,_typeOfProjectile); _damageType = "unknown"; }; diff --git a/addons/medical_damage/initSettings.sqf b/addons/medical_damage/initSettings.sqf index 14dac50f1a..0ce21319e2 100644 --- a/addons/medical_damage/initSettings.sqf +++ b/addons/medical_damage/initSettings.sqf @@ -34,6 +34,15 @@ true ] call CBA_fnc_addSetting; +[ + QEGVAR(medical,painUnconsciousThreshold), + "SLIDER", + [LSTRING(PainUnconsciousThreshold_DisplayName), LSTRING(PainUnconsciousThreshold_Description)], + ELSTRING(medical,Category), + [0, 1, 0.5, 2, false], + true +] call CBA_fnc_addSetting; + [ QEGVAR(medical,deathChance), "SLIDER", diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml index 20465959e0..cca0c7a018 100644 --- a/addons/medical_damage/stringtable.xml +++ b/addons/medical_damage/stringtable.xml @@ -3,7 +3,7 @@ Player Critical Damage Threshold - プレイヤーのクリティカル ダメージしきい値 + プレイヤーのクリティカルダメージしきい値 Seuil de dégât critique du joueur Порог критического урона игрока Limite de Dano Crítico do Jogador @@ -18,7 +18,7 @@ Sets the amount of damage a player can receive before going unconscious (and dying if "Sum of Trauma" is enabled). - プレイヤーが気絶になる前に受けられるダメージ量を決定できます。 + プレイヤーが気絶するまでに受けられるダメージ量を設定します。\n("外傷の合計"が有効な場合は死亡するまでに受けられるダメージ量) Définit la quantité de dégâts qu'un joueur peut subir avant de perdre connaissance (ou mourir, si l'option "Somme des traumatismes" est sélectionnée). Устанавливает количество урона, которое может получить игрок, прежде чем потеряет сознание. Define a quantidade de dano que um jogador pode receber antes de ficar inconsciente. @@ -34,7 +34,7 @@ AI Critical Damage Threshold - AI のクリティカル ダメージしきい値 + AIのクリティカルダメージしきい値 Seuil de dégât critique de l'IA Порог критического урона AI Limite de Dano Crítico da IA @@ -49,7 +49,7 @@ Sets the amount of damage an AI unit can receive before going unconscious (or dying when "Sum of Trauma" is enabled). - AI が気絶になる前に受けられるダメージ量を決定できます。 + AIが気絶するまでに受けられるダメージ量を設定します。\n("外傷の合計"が有効な場合は死亡するまでに受けられるダメージ量) Définit la quantité de dégâts qu'une unité IA peut subir avant de perdre connaissance (ou mourir, si l'option "Somme des traumatismes" est sélectionnée). Устанавливает количество урона, которое может получить ИИ, прежде чем потеряет сознание. Define a quantidade de dano que uma IA pode receber antes de ficar inconsciente. @@ -641,7 +641,7 @@ Only large hits to vital organs Только серьезные попадания в жизненно важные органы - 重要器官に大きなダメージを受けた時のみ + 重要臓器に大きなダメージを受けた時のみ 只有重要器官之重傷 只有重要器官受到重创 Grosses blessures sur organes vitaux @@ -657,7 +657,7 @@ Sum of trauma Совокупность травмы - 外傷の数 + 外傷の合計 外部創傷累計 创伤总和 Somme des traumatismes @@ -672,7 +672,7 @@ Either Оба - 両方 + どちらか 兩者都是 二者之一 Les deux @@ -698,7 +698,7 @@ Minor Thermal Burn - 小さな熱傷 + 軽度の熱傷 Légère brûlure thermique Незначительный термический ожог Leichte thermische Verbrennung @@ -709,7 +709,7 @@ Medium Thermal Burn - 中くらいの熱傷 + 中度の熱傷 Brûlure thermique modérée Средний термический ожог Mittlere thermische Verbrennung @@ -720,7 +720,7 @@ Major Thermal Burn - 大きな熱傷 + 重度の熱傷 Sévère brûlure thermique Сильный термический ожог Schwere thermische Verbrennung @@ -746,7 +746,7 @@ Sets the amount of damage a unit can receive before going unconscious. (0 for mission default) Legt die Höhe des Schadens fest, den eine Einheit erhalten kann, bevor diese ohnmächtig wird. (0 für Misionsnormalwert) Définit la quantité de dégâts que l'unité peut subir avant de perdre connaissance (ou mourir, si l'option "Somme des traumatismes" est sélectionnée).\n(0 utilise la valeur définie dans la mission.) - ユニットが気絶するまで許容できるダメージ値を設定できます。標準: 0 + ユニットが気絶するまで許容できるダメージ値を設定できます。(ミッション開始時は0) Určuje kolik poškození může jednotka utrpět než upadne do bezvědomí. (pro použití standardní hodnoty mise zadejte 0) Устанавливает количество урона, которое может получить юнит перед тем, как потерять сознание. (0 для значения миссии) Ustawia próg obrażeń jakie może otrzymać jednostka przed utratą przytomności. (0 jako ustawienie domyślne misji) @@ -759,7 +759,7 @@ Pain Unconscious Chance Шанс потерять сознание от боли Szansa na nieprzytomność przez ból - 気絶確率 + 痛みによる気絶確率 Probabilidad de inconsciencia por dolor Douleur - Chance d'évanouissement Chance für Bewusslosigkeit durch Schmerz @@ -770,13 +770,25 @@ The probability of a person falling unconscious when their pain is above the tolerance threshold upon receiving damage. Шанс, что человек потеряет сознание, когда его боль выше допустимого порога при получении травмы. Szansa że osoba straci przytomność gdy jej ból jest powyżej tolerowalnego progu podczas otrzymywania obrażeń. - ユニットがダメージを受けた時に痛みが許容しきい値を超えた場合、気絶をする確率を設定します。 + ユニットがダメージを受けた時の痛みが許容しきい値を超えていた場合に気絶する確率を設定します。 La probabilidad de que una persona caiga inconsciente cuando su dolor está por encima del umbral al haber recibido daño. La probabilité pour qu'une personne perde connaissance lorsque la douleur ressentie est supérieure à son seuil de tolérance. Die Wahrscheinlichkeit, dass eine Person bewusstlos wird, wenn ihre Schmerzen bei einer Verwundung über der Toleranzschwelle liegen. 当一个人的疼痛超过承受能力的极限时,他陷入昏迷的概率。 고통 한계점을 넘을 시 기절하는 확률을 정합니다. + + Pain Unconscious Threshold + Порог боли для потери сознания + Seuil d'inconscience par la douleur. + 気絶する痛みのしきい値 + + + Sets the threshold for severe pain, above which a person can fall unconscious upon receiving damage. + Устанавливает количество боли от полученной травмы, при котором юнит может потерять сознание. + Définis le niveau de douleur à partir duquel une personne peut perdre connaissance. Cf PainUnconsciousChance. + 激しい痛みのしきい値を設定します。このしきい値を超えた状態でダメージを受けると意識を失う可能性があります。 + Fatal Injury Death Chance Вероятность смерти от смертельной травмы diff --git a/addons/medical_engine/XEH_postInit.sqf b/addons/medical_engine/XEH_postInit.sqf index f1f1780fa8..64f8bab83b 100644 --- a/addons/medical_engine/XEH_postInit.sqf +++ b/addons/medical_engine/XEH_postInit.sqf @@ -85,8 +85,8 @@ ["ace_unconscious", { params ["_unit", "_unconscious"]; - - if (vehicle _unit != _unit && {local vehicle _unit}) then { + TRACE_3("unit uncon",_unit,objectParent _unit,local _unit); + if (!isNull objectParent _unit && {local objectParent _unit}) then { if (_unconscious) then { [_unit] call FUNC(lockUnconsciousSeat); } else { @@ -94,3 +94,19 @@ }; }; }] call CBA_fnc_addEventHandler; + +["ace_killed", { // global event + params ["_unit"]; + TRACE_3("unit Killed",_unit,objectParent _unit,local _unit); + if (!isNull objectParent _unit && {local objectParent _unit}) exitWith { + [_unit] call FUNC(lockUnconsciousSeat); + }; +}] call CBA_fnc_addEventHandler; + +["CAManBase", "deleted", { + params ["_unit"]; + TRACE_3("unit deleted",_unit,objectParent _unit,local _unit); + if ((!isNull objectParent _unit) && {local objectParent _unit}) then { + [_unit] call FUNC(unlockUnconsciousSeat); + }; +}, true, []] call CBA_fnc_addClassEventHandler; diff --git a/addons/medical_engine/XEH_preInit.sqf b/addons/medical_engine/XEH_preInit.sqf index 8157baa4ec..da2ab02141 100644 --- a/addons/medical_engine/XEH_preInit.sqf +++ b/addons/medical_engine/XEH_preInit.sqf @@ -14,7 +14,6 @@ if (isNil QUOTE(ORGAN_DAMAGE_THRESHOLD)) then {ORGAN_DAMAGE_THRESHOLD = ORGAN_DA if (isNil QUOTE(HEART_HIT_CHANCE)) then {HEART_HIT_CHANCE = HEART_HIT_CHANCE_DEFAULT}; if (isNil QUOTE(PENETRATION_THRESHOLD)) then {PENETRATION_THRESHOLD = PENETRATION_THRESHOLD_DEFAULT}; if (isNil QUOTE(BLOOD_LOSS_KNOCK_OUT_THRESHOLD)) then {BLOOD_LOSS_KNOCK_OUT_THRESHOLD = BLOOD_LOSS_KNOCK_OUT_THRESHOLD_DEFAULT}; -if (isNil QUOTE(PAIN_UNCONSCIOUS)) then {PAIN_UNCONSCIOUS = PAIN_UNCONSCIOUS_DEFAULT}; if (isNil QUOTE(PAIN_FADE_TIME)) then {PAIN_FADE_TIME = PAIN_FADE_TIME_DEFAULT}; if (isNil QUOTE(LIMPING_DAMAGE_THRESHOLD)) then {LIMPING_DAMAGE_THRESHOLD = LIMPING_DAMAGE_THRESHOLD_DEFAULT}; if (isNil QUOTE(FRACTURE_DAMAGE_THRESHOLD)) then {FRACTURE_DAMAGE_THRESHOLD = FRACTURE_DAMAGE_THRESHOLD_DEFAULT}; diff --git a/addons/medical_engine/addon.toml b/addons/medical_engine/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_engine/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_engine/config.cpp b/addons/medical_engine/config.cpp index be5dc54040..8d718155d1 100644 --- a/addons/medical_engine/config.cpp +++ b/addons/medical_engine/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -21,3 +28,5 @@ class CfgPatches { #include "CfgMoves.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" + +#endif diff --git a/addons/medical_engine/functions/fnc_handleDamage.sqf b/addons/medical_engine/functions/fnc_handleDamage.sqf index 1b3bb238a1..230a1f037e 100644 --- a/addons/medical_engine/functions/fnc_handleDamage.sqf +++ b/addons/medical_engine/functions/fnc_handleDamage.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: commy2, SilentSpike + * Author: commy2, kymckay * HandleDamage EH where wound events are raised based on incoming damage. * Be aware that for each source of damage, the EH can fire multiple times (once for each hitpoint). * We store these incoming damages and compare them on our final hitpoint: "ace_hdbracket". @@ -116,7 +116,7 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith { _allDamages sort false; _allDamages = _allDamages apply {[_x select 2, _x select 3, _x select 0]}; - + // Environmental damage sources all have empty ammo string // No explicit source given, we infer from differences between them if (_ammo isEqualTo "") then { diff --git a/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf b/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf index 97d514278e..dc748426b7 100644 --- a/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf +++ b/addons/medical_engine/functions/fnc_lockUnconsciousSeat.sqf @@ -11,10 +11,13 @@ * * Public: No */ +if (missionNamespace getVariable [QGVAR(disableSeatLocking), false]) exitWith {}; params ["_unit"]; private _vehicle = objectParent _unit; +TRACE_3("lockUnconsciousSeat",_unit,_vehicle,lifeState _unit); +if (isNull _vehicle) exitWith {}; if (alive _unit && {lifeState _unit != "INCAPACITATED"}) exitWith {}; switch (true) do { @@ -35,3 +38,4 @@ switch (true) do { _unit setVariable [QGVAR(lockedSeat), [_vehicle, "turret", _turretPath], true]; }; }; +TRACE_1("locked",_unit getVariable QGVAR(lockedSeat)); diff --git a/addons/medical_engine/functions/fnc_unlockUnconsciousSeat.sqf b/addons/medical_engine/functions/fnc_unlockUnconsciousSeat.sqf index 6c772b5c24..858442d1d3 100644 --- a/addons/medical_engine/functions/fnc_unlockUnconsciousSeat.sqf +++ b/addons/medical_engine/functions/fnc_unlockUnconsciousSeat.sqf @@ -16,6 +16,7 @@ params ["_unit"]; private _seat = _unit getVariable [QGVAR(lockedSeat), []]; _seat params ["_vehicle", "_type", "_position"]; +TRACE_2("unlockUnconsciousSeat",_unit,_seat); if (_seat isEqualTo []) exitWith {}; switch (_type) do { diff --git a/addons/medical_engine/script_macros_medical.hpp b/addons/medical_engine/script_macros_medical.hpp index 962c8d6219..2924d83b13 100644 --- a/addons/medical_engine/script_macros_medical.hpp +++ b/addons/medical_engine/script_macros_medical.hpp @@ -73,8 +73,7 @@ #define DAMAGE_TOTAL_COLORS 10 // --- pain -#define PAIN_UNCONSCIOUS EGVAR(medical,const_painUnconscious) -#define PAIN_UNCONSCIOUS_DEFAULT 0.5 +#define PAIN_UNCONSCIOUS EGVAR(medical,painUnconsciousThreshold) // Pain fade out time (time it takes until pain is guaranteed to be completly gone) #define PAIN_FADE_TIME EGVAR(medical,const_painFadeTime) diff --git a/addons/medical_feedback/addon.toml b/addons/medical_feedback/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_feedback/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_feedback/config.cpp b/addons/medical_feedback/config.cpp index 50eb2bbab3..caea028b79 100644 --- a/addons/medical_feedback/config.cpp +++ b/addons/medical_feedback/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -20,3 +27,5 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "RscTitles.hpp" #include "RscInGameUI.hpp" + +#endif diff --git a/addons/medical_feedback/stringtable.xml b/addons/medical_feedback/stringtable.xml index 36ad0192b6..b6f433d399 100644 --- a/addons/medical_feedback/stringtable.xml +++ b/addons/medical_feedback/stringtable.xml @@ -4,7 +4,7 @@ Feedback Rückmeldung - 感触 + フィードバック Реакция на ранения Réaction aux blessures Reação a Lesões @@ -28,7 +28,7 @@ Fájdalom-effekt típusa Tipo do efeito de dor Efekt pro bolest - 痛み効果種類 + 痛み効果の種類 고통 효과 종류 疼痛效果類型 疼痛效果类型 @@ -36,7 +36,7 @@ Selects the used pain effect type. - 痛みの効果を選択できます。 + 痛みの画面効果を選択できます。 Permet de choisir quel effet provoque la douleur. Выбирает тип визуализации болевого эффекта. Selecione o tipo de efeito de dor. @@ -93,7 +93,7 @@ Kromatikus aberráció Chromatická aberace Aberração cromática - 色の収差 + 色収差 색수차 色差 色差 @@ -101,7 +101,7 @@ Only high pain effect - 強い痛みの時のみ + 強い痛み効果のみ 只有在強烈疼痛時使用 仅在剧烈疼痛下启用 Juste un fort effet douloureux @@ -119,7 +119,7 @@ Low Blood Volume Effect Type Визуальный эффект низкого объема крови Effet de faible volume sanguin - 低血液量時の効果種類 + 低血液量時効果の種類 Efekt pro nízké množství krve Efekt po utracie znacznej ilości krwi Düşük Kan Efekt Türü @@ -132,7 +132,7 @@ Selects the used low blood volume effect type. Выбирает тип визуализации эффекта низкого объема крови. Permet de choisir quel effet provoque un faible volume sanguin. - 低血液量時の効果を選択できます。 + 低血液量時の画面効果を選択できます。 Nastavuje který efekt pro nízké množství krve bude používán. Wybiera efekt ktory będzie pokazywany po utracie znacznej ilości krwi. Kullanılan düşük kan hacmi efekt türünü seçer. @@ -209,7 +209,7 @@ Si cette option est activée, les unités blessées crieront, voire hurleront sous l'effet de la douleur. Engedélyezi a sérült egységek kiáltásait Abilita Grida da parte delle unità ferite - 負傷したユニットを叫ぶようにします。 + 負傷したユニットが叫ぶようにします。 부상당한 인원이 소리지르는 것을 활성화합니다 启用伤者的惨叫声 啟用傷者的尖叫聲 diff --git a/addons/medical_gui/addon.toml b/addons/medical_gui/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_gui/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_gui/config.cpp b/addons/medical_gui/config.cpp index b09143a6c9..eb3ac27561 100644 --- a/addons/medical_gui/config.cpp +++ b/addons/medical_gui/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -18,3 +25,5 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "gui.hpp" + +#endif diff --git a/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf b/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf index 71c40bc2ae..94414b1d7a 100644 --- a/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf +++ b/addons/medical_gui/functions/fnc_bloodLossToRGBA.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: ShackTac, SilentSpike + * Author: ShackTac, kymckay * Converts a blood loss value into a representative RGBA colour. * * Arguments: diff --git a/addons/medical_gui/functions/fnc_collectActions.sqf b/addons/medical_gui/functions/fnc_collectActions.sqf index cfc5dc5a03..a1f28e03bf 100644 --- a/addons/medical_gui/functions/fnc_collectActions.sqf +++ b/addons/medical_gui/functions/fnc_collectActions.sqf @@ -48,3 +48,8 @@ if ("ace_dragging" call EFUNC(common,isModLoaded)) then { } ]; }; + +// testing code for multi-line +// for "_i" from 0 to 12 do { +// GVAR(actions) pushBack [format ["Example %1", _i], "medication", {true}, compile format ['systemChat "%1"', _i]] +// }; diff --git a/addons/medical_gui/functions/fnc_damageToRGBA.sqf b/addons/medical_gui/functions/fnc_damageToRGBA.sqf index 236b8a8f98..87bb9fc603 100644 --- a/addons/medical_gui/functions/fnc_damageToRGBA.sqf +++ b/addons/medical_gui/functions/fnc_damageToRGBA.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: ShackTac, SilentSpike + * Author: ShackTac, kymckay * Converts a damage value into a representative RGBA colour. * * Arguments: diff --git a/addons/medical_gui/functions/fnc_modifyAction.sqf b/addons/medical_gui/functions/fnc_modifyAction.sqf index f3f11b04ba..d968808378 100644 --- a/addons/medical_gui/functions/fnc_modifyAction.sqf +++ b/addons/medical_gui/functions/fnc_modifyAction.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: esteldunedain, SilentSpike, mharis001 + * Author: esteldunedain, kymckay, mharis001 * Modifies the medical action icons to show blood loss and tourniquets. * * Arguments: diff --git a/addons/medical_gui/functions/fnc_updateActions.sqf b/addons/medical_gui/functions/fnc_updateActions.sqf index def2466009..3718d1936e 100644 --- a/addons/medical_gui/functions/fnc_updateActions.sqf +++ b/addons/medical_gui/functions/fnc_updateActions.sqf @@ -19,39 +19,45 @@ params ["_display"]; private _selectedCategory = GVAR(selectedCategory); -// Clear all action buttons -{ - private _ctrl = _display displayCtrl _x; - _ctrl ctrlRemoveAllEventHandlers "ButtonClick"; - _ctrl ctrlShow false; -} forEach IDCS_ACTION_BUTTONS; +private _group = _display displayCtrl IDC_ACTION_BUTTON_GROUP; +private _actionButons = allControls _group; // Handle triage list (no actions shown) private _ctrlTriage = _display displayCtrl IDC_TRIAGE_CARD; private _showTriage = _selectedCategory == "triage"; _ctrlTriage ctrlEnable _showTriage; +_group ctrlEnable !_showTriage; lbClear _ctrlTriage; if (_showTriage) exitWith { + { ctrlDelete _x } forEach _actionButons; [_ctrlTriage, GVAR(target)] call FUNC(updateTriageCard); }; // Show treatment options on action buttons -private _idcIndex = 0; - +private _shownIndex = 0; { _x params ["_displayName", "_category", "_condition", "_statement"]; // Check action category and condition if (_category == _selectedCategory && {call _condition}) then { - private _ctrl = _display displayCtrl (IDCS_ACTION_BUTTONS select _idcIndex); + private _ctrl = if (_shownIndex >= count _actionButons) then { + _actionButons pushBack (_display ctrlCreate ["ACE_Medical_Menu_ActionButton", -1, _group]); + }; + _ctrl = _actionButons # _shownIndex; + _ctrl ctrlRemoveAllEventHandlers "ButtonClick"; + _ctrl ctrlSetPositionY POS_H(1.1 * _shownIndex); + _ctrl ctrlCommit 0; + _ctrl ctrlSetText _displayName; _ctrl ctrlShow true; _ctrl ctrlAddEventHandler ["ButtonClick", _statement]; _ctrl ctrlAddEventHandler ["ButtonClick", {GVAR(pendingReopen) = true}]; - _idcIndex = _idcIndex + 1; + _shownIndex = _shownIndex + 1; }; } forEach GVAR(actions); + +{ ctrlDelete _x } forEach (_actionButons select [_shownIndex, 9999]); diff --git a/addons/medical_gui/functions/fnc_updateBodyImage.sqf b/addons/medical_gui/functions/fnc_updateBodyImage.sqf index 7d3b6f03c5..925779dc88 100644 --- a/addons/medical_gui/functions/fnc_updateBodyImage.sqf +++ b/addons/medical_gui/functions/fnc_updateBodyImage.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Glowbal, SilentSpike, mharis001 + * Author: Glowbal, kymckay, mharis001 * Updates the body image for given target. * * Arguments: diff --git a/addons/medical_gui/functions/fnc_updateCategories.sqf b/addons/medical_gui/functions/fnc_updateCategories.sqf index ac1c068fb7..4780f5b996 100644 --- a/addons/medical_gui/functions/fnc_updateCategories.sqf +++ b/addons/medical_gui/functions/fnc_updateCategories.sqf @@ -24,8 +24,17 @@ params ["_display"]; private _enable = GVAR(actions) findIf {_category == _x select 1 && {call (_x select 2)}} > -1; _ctrl ctrlEnable _enable; + private _selectedColor = [ + profileNamespace getVariable ["GUI_BCG_RGB_R", 0.13], + profileNamespace getVariable ["GUI_BCG_RGB_G", 0.54], + profileNamespace getVariable ["GUI_BCG_RGB_B", 0.21], + profileNamespace getVariable ["GUI_BCG_RGB_A", 0.8] + ]; private _color = [[0.4, 0.4, 0.4, 1], [1, 1, 1, 1]] select _enable; + _color = [_color, _selectedColor] select (GVAR(selectedCategory) isEqualTo _category); _ctrl ctrlSetTextColor _color; + _color set [-1, 0.8]; // Mouseover change + _ctrl ctrlSetActiveColor _color; } forEach [ [IDC_EXAMINE, "examine"], [IDC_BANDAGE, "bandage"], diff --git a/addons/medical_gui/gui.hpp b/addons/medical_gui/gui.hpp index ef6674137d..e0f836f058 100644 --- a/addons/medical_gui/gui.hpp +++ b/addons/medical_gui/gui.hpp @@ -4,6 +4,7 @@ class RscPicture; class RscListBox; class RscActivePicture; class RscButtonMenu; +class RscControlsGroup; class RscControlsGroupNoScrollbars; class GVAR(BodyImage): RscControlsGroupNoScrollbars { @@ -157,6 +158,22 @@ class GVAR(TriageSelect): RscControlsGroupNoScrollbars { }; }; +class ACE_Medical_Menu_ActionButton: RscButtonMenu { + idc = -1; + style = ST_LEFT; + x = 0; + y = 0; + w = QUOTE(POS_W(11.833)); + h = QUOTE(POS_H(1)); + size = QUOTE(POS_H(0.9)); + class Attributes { + align = "center"; + color = "#E5E5E5"; + font = "RobotoCondensed"; + shadow = "false"; + }; +}; + class ACE_Medical_Menu { idd = IDD_MEDICAL_MENU; movingEnable = 1; @@ -224,6 +241,7 @@ class ACE_Medical_Menu { w = QUOTE(POS_W(1.5)); h = QUOTE(POS_H(1.5)); color[] = {1, 1, 1, 1}; + colorActive[] = {1, 1, 1, 0.8}; soundClick[] = {"\a3\ui_f\data\sound\rscbutton\soundClick", 0.09, 1}; soundEnter[] = {"\a3\ui_f\data\sound\rscbutton\soundEnter", 0.09, 1}; soundEscape[] = {"\a3\ui_f\data\sound\rscbutton\soundEscape", 0.09, 1}; @@ -282,7 +300,7 @@ class ACE_Medical_Menu { idc = IDC_TRIAGE_CARD; x = QUOTE(POS_X(1.5)); y = QUOTE(POS_Y(4.4)); - w = QUOTE(POS_W(12)); + w = QUOTE(POS_W(11.833)); h = QUOTE(POS_H(10)); sizeEx = QUOTE(POS_H(0.7)); colorSelect[] = {1, 1, 1, 1}; @@ -292,52 +310,12 @@ class ACE_Medical_Menu { colorSelectBackground2[] = {0, 0, 0, 0}; colorScrollbar[] = {0.9, 0.9, 0.9, 1}; }; - class Action1: RscButtonMenu { - idc = IDC_ACTION_1; - style = ST_LEFT; + class ActionButtonGroup: RscControlsGroup { + idc = IDC_ACTION_BUTTON_GROUP; x = QUOTE(POS_X(1.5)); y = QUOTE(POS_Y(4.4)); - w = QUOTE(POS_W(12)); - h = QUOTE(POS_H(1)); - size = QUOTE(POS_H(0.9)); - class Attributes { - align = "center"; - color = "#E5E5E5"; - font = "RobotoCondensed"; - shadow = "false"; - }; - }; - class Action2: Action1 { - idc = IDC_ACTION_2; - y = QUOTE(POS_Y(5.5)); - }; - class Action3: Action1 { - idc = IDC_ACTION_3; - y = QUOTE(POS_Y(6.6)); - }; - class Action4: Action1 { - idc = IDC_ACTION_4; - y = QUOTE(POS_Y(7.7)); - }; - class Action5: Action1 { - idc = IDC_ACTION_5; - y = QUOTE(POS_Y(8.8)); - }; - class Action6: Action1 { - idc = IDC_ACTION_6; - y = QUOTE(POS_Y(9.9)); - }; - class Action7: Action1 { - idc = IDC_ACTION_7; - y = QUOTE(POS_Y(11)); - }; - class Action8: Action1 { - idc = IDC_ACTION_8; - y = QUOTE(POS_Y(12.1)); - }; - class Action9: Action1 { - idc = IDC_ACTION_9; - y = QUOTE(POS_Y(13.2)); + w = QUOTE(POS_W(11.833)); + h = QUOTE(POS_H(10)); }; class BodyImage: GVAR(BodyImage) {}; class SelectHead: RscButton { diff --git a/addons/medical_gui/script_component.hpp b/addons/medical_gui/script_component.hpp index 48382ed6fa..62c38447ee 100644 --- a/addons/medical_gui/script_component.hpp +++ b/addons/medical_gui/script_component.hpp @@ -51,17 +51,7 @@ #define IDC_ACTIVITY 1420 #define IDC_QUICKVIEW 1430 -#define IDC_ACTION_1 1500 -#define IDC_ACTION_2 1510 -#define IDC_ACTION_3 1520 -#define IDC_ACTION_4 1530 -#define IDC_ACTION_5 1540 -#define IDC_ACTION_6 1550 -#define IDC_ACTION_7 1560 -#define IDC_ACTION_8 1570 -#define IDC_ACTION_9 1580 - -#define IDCS_ACTION_BUTTONS [IDC_ACTION_1, IDC_ACTION_2, IDC_ACTION_3, IDC_ACTION_4, IDC_ACTION_5, IDC_ACTION_6, IDC_ACTION_7, IDC_ACTION_8, IDC_ACTION_9] +#define IDC_ACTION_BUTTON_GROUP 1599 #define IDC_BODY_GROUP 6000 #define IDC_BODY_HEAD 6005 diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml index afcd58b6e4..a000e2c8b5 100644 --- a/addons/medical_gui/stringtable.xml +++ b/addons/medical_gui/stringtable.xml @@ -20,7 +20,7 @@ Enable Medical Actions Aktiviere Sanitätsaktionen - 医療行為を有効化 + 治療インタラクションの有効化 Разрешить Медицинские действия Activer les actions médicales Ativar Ações Médicas @@ -86,7 +86,7 @@ Enable Medical Self Actions Medizinische Selbst-Interaktionen anzeigen - 自分への医療行為を有効化 + 治療セルフインタラクションの有効化 Разрешить Медицинские действия на себе Activer les actions médicales sur soi-même Ativar ações médicas em si mesmo @@ -150,7 +150,7 @@ Reopen Medical Menu Sanitätsmenü wieder öffnen - 医療メニューの再使用 + 医療メニューの再表示 Открывать меню после лечения Rouvrir le menu médical Reabrir Menu Médico @@ -166,7 +166,7 @@ Reopen the Medical Menu after successful treatment. Öffne das Sanitätsmenü nach einer Behandlung - 治療が成功した後に、再度医療メニューを開きます。 + 治療の完了後に、再度医療メニューを開きます。 Открывает Медицинское меню после успешного лечения Réouvre le menu médical suite à l'application d'un soin. Reabrir Menu Médico após um tratamento com sucesso @@ -358,7 +358,7 @@ VISÃO GERAL PŘEHLED PANORAMICA - オーバービュー + 概況 개요 总览 概述 @@ -390,7 +390,7 @@ VISÃO RÁPIDA RYCHLÝ NÁHLED VISTA RAPIDA - クイック ビュー + 簡易概況 퀵 뷰 快速检查 快速檢查 @@ -423,7 +423,7 @@ Ver cartão de triagem Zkontrolovat štítek Guarda Triage Card - トリアージ カードを見る + トリアージカードを見る 부상자 카드 보기 查看分诊卡 查看診斷卡 @@ -439,7 +439,7 @@ Examinar paciente Zkontrolovat pacienta Esamina Paziente - 患者を調べる + 患者の診察 환자 검사하기 检查伤员 檢查傷者 @@ -471,7 +471,7 @@ Medicação Léky Medicazione - 薬物による治療 + 投薬 약물 치료 药物 藥物 @@ -487,7 +487,7 @@ Dýchací systém Gestione Vie Respiratorie Atemwegssicherung - 気道を確保 + 気道管理 기도 관리 呼吸道管理 呼吸道管理 @@ -887,7 +887,7 @@ Respiração normal Normální dýchání Respirazione Normale - 通常の呼吸 + 正常な呼吸 정상 호흡 呼吸正常 正常呼吸 @@ -903,7 +903,7 @@ Sem respiração Nedýchá Nessuna Respirazione - 息をしていない + 呼吸していない 호흡이 없음 没有呼吸 沒有呼吸 @@ -919,7 +919,7 @@ Dificuldade para respirar Potíže s dýcháním Difficoltà Respiratorie - 呼吸が難しそうだ + 呼吸が厳しそうだ 호흡 곤란 呼吸困难 呼吸困難 @@ -1138,7 +1138,7 @@ Partial %1 - 部分的な%1 + 部分的な %1 部分 %1 Partiel %1 Parziale %1 @@ -1253,26 +1253,32 @@ Show Trauma Sustained Mostrar Traumatismo Sofrido + 外傷の表示 Show trauma sustained in the injury list. Mostrar traumatismo sofrido na lista de feridas. + 負傷リストに外傷を表示する。 Minor Trauma Traumatismo Leve + 軽度の外傷 Major Trauma Traumatismo Significante + 中度の外傷 Severe Trauma Traumatismo Severo + 重度の外傷 Chronic Trauma Traumatismo Crônico + 慢性的な外傷 diff --git a/addons/medical_statemachine/addon.toml b/addons/medical_statemachine/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_statemachine/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_statemachine/config.cpp b/addons/medical_statemachine/config.cpp index 23a55f5258..2b396c8b8c 100644 --- a/addons/medical_statemachine/config.cpp +++ b/addons/medical_statemachine/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -16,3 +23,5 @@ class CfgPatches { #include "Statemachine.hpp" #include "CfgEventHandlers.hpp" + +#endif diff --git a/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf b/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf index 9d020719eb..a71745735a 100644 --- a/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf +++ b/addons/medical_statemachine/functions/fnc_enteredStateDeath.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Handles a unit reaching the point of death (calls for a status update). * * Arguments: diff --git a/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf b/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf index b29adcb9f4..3806819929 100644 --- a/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf +++ b/addons/medical_statemachine/functions/fnc_resetStateDefault.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Resets the default state on a unit after respawning. * * Arguments: diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml index 354de84066..aa30396617 100644 --- a/addons/medical_statemachine/stringtable.xml +++ b/addons/medical_statemachine/stringtable.xml @@ -52,7 +52,7 @@ AI Fatal Injuries Lesões Fatais da IA - AI の致命傷 + AIの致命傷 AI致命傷 AI 致命伤 Décès si blessure mortelle (IA) @@ -68,7 +68,7 @@ Controls when AI can receive fatal injuries. A fatal injury is caused by significant damage to the head or troso.\nWhen set to "Always", this effectively produces "AI Instant Death" behaviour as AI will immediately die from any fatal injury.\nNOTE: Any mode other than "Always" requires AI Unconsciousness to be enabled. Controla quando a IA pode receber lesões fatais. Uma lesão fatal é causada por um dano significante na cabeça ou tronco.\nQuando definido para "Sempre", isso efetivamente causa a "Morte Instantânea da IA", pois a IA irá imediatamente morrer para qualquer lesão fatal.\nNOTA: Qualquer opção além de "Sempre" requer que Inconsciência de IA esteja ativada. - AI が致命傷を受けた時の挙動を管理できます。頭部や胸部に受ける大きなダメージは致命傷になります。\n"常に"に設定されていると、いかなる致命傷でも "AI の即死" 効果が生まれます。\n注: "常に"以外のモードでは AI の無意識化を有効化させる必要があります。 + AIが致命傷を受けた時の挙動を管理できます。頭部や胸部に受ける大きなダメージは致命傷になります。\n"常に"に設定されていると、いかなる致命傷でも "AIの即死" 効果が生まれます。\n注: "常に"以外のモードではAIの無意識化を有効化させる必要があります。 控制當AI受致命傷時是否能救起。致命傷是指對頭部或身體造成可觀傷害所造成的。\n當設置為"總是"時,這會使其與"AI 瞬間死亡"同一個效果,在AI受到致命傷時瞬間死亡。\n備註:選了"總是"以外的選項的話必須開啟「AI無意識」的選項。 控制当 AI 受致命伤时是否能救起。致命伤是指对头部或躯干遭受重大伤害。\n当设置为"总是"时,这将有效地产生"AI 即时死亡"行为,因为 AI 将立即死于任何致命伤。\n注意:"总是"以外的任何模式都需要启用 AI 无意识。 Détermine si les unités IA décèdent en cas de blessure mortelle. Une blessure mortelle est définie par des dommages importants à la tête ou au cœur.\nSi réglé sur "Toujours", cela produit effectivement un comportement de "Mort instantanée" car les unités IA mourront immédiatement de toute blessure mortelle.\nNOTE : Tout mode autre que "Toujours" nécessite l'activation de l'option "Inconscience IA". @@ -92,7 +92,7 @@ Inconscience IA AI eszméletlenség Incoscienza IA - AI の気絶 + AIの気絶 인공지능 기절 AI 无意识 AI無意識 @@ -101,7 +101,7 @@ Controls whether AI can go unconscious instead of immediately dying.\nThis setting works together with the "AI Fatal Injuries" setting since, going into cardiac arrest requires that the unit is able to go unconscious.\nHowever, these settings are separated because units can go unconscious from critical vitals resulting from non-fatal injuries.\nIn essence, this means that in order to enable cardiac arrest for AI units, this setting must be enabled. Controla se a IA pode ficar inconsciente ao invés de morrer imediatamente.\nEssa configuração funciona com "Lesões Fatais de IA", pois para uma unidade ter uma parada cardíaca é necessário que a IA possa fica inconsciente.\nContudo, essas configurações são separadas pois unidades podem ficar inconscientes por vitais críticos causados por ferimentos não-fatais.\nEssencialmente, isso significa que para ativar uma parada cardíaca em IA, essa configuração precisa estar ativa. - AI が即死する代わりに気絶するかどうかを決定できます。\nこれは "AI の致命傷" 設定と連動します。これは AI の進呈しを起こすにはユニットが気絶する必要がある為です。\nしかしながら、これらの設定はユニットが非致死性の負傷により重体となって気絶できるよう分離されています。\n本質的にはこの設定は AI ユニットの心停止を可能にするものであり、有効化されておくべきです。 + AIが即死する代わりに気絶するかどうかを決定できます。\nこれは "AIの致命傷" 設定と連動します。これはAIの心停止を起こすにはユニットが気絶する必要がある為です。\nしかしながら、これらの設定はユニットが非致死性の負傷により重体となって気絶できるよう分離されています。\n本質的にはこの設定はAIユニットの心停止を可能にするものであり、有効化されておくべきです。 控制AI是否能進入無意識狀態而非立刻原地死亡。\n這個選項會與「AI致命傷」的選項聯動,使單位心搏停止的話必須先讓其無意識。\n然而,兩個設定分開之原因是使單位能因從非致命傷的攻擊情況下進入生命危險的狀態。\n簡單來說,你想要讓AI單位有心搏停止可能的話,該選項必須啟用。 控制 AI 是否可以进入昏迷状态而不是立即死亡。\n这个设置与"AI 致命伤"设置一起工作,因为进入心脏骤停需要单位能够昏迷。\n然而,这些设置是分开的,因为单位可能会因非致命伤害导致的关键生命体征而昏迷过去。\n从本质上讲,这意味着为了使 AI 单位的心脏骤停,必须启用此设置。 Définit si les unités IA peuvent perdre connaissance au lieu de mourir immédiatement.\nCe paramètre fonctionne conjointement avec l'option "Décès si blessure mortelle (IA)" car, pour qu'une unité IA subisse un arrêt cardiaque, elle doit également pouvoir perdre connaissance.\nCependant, ces paramètres sont séparés car les unités peuvent s'évanouir suite à des signes vitaux critiques résultant de blessures non mortelles.\nEn résumé, cela signifie que ce paramètre doit absolument être activé pour qu'une unité IA puisse entrer en état d'arrêt cardiaque. diff --git a/addons/medical_status/XEH_PREP.hpp b/addons/medical_status/XEH_PREP.hpp index 811c49c103..77f9712eb1 100644 --- a/addons/medical_status/XEH_PREP.hpp +++ b/addons/medical_status/XEH_PREP.hpp @@ -1,3 +1,4 @@ +PREP(addInventoryActions); PREP(addMedicationAdjustment); PREP(adjustPainLevel); PREP(getBloodLoss); @@ -14,5 +15,6 @@ PREP(isBeingDragged); PREP(isInStableCondition); PREP(setCardiacArrestState); PREP(setDead); +PREP(setStatusEffects); PREP(setUnconsciousState); PREP(updateWoundBloodLoss); diff --git a/addons/medical_status/XEH_postInit.sqf b/addons/medical_status/XEH_postInit.sqf index 9b7d186b46..3f342987c9 100644 --- a/addons/medical_status/XEH_postInit.sqf +++ b/addons/medical_status/XEH_postInit.sqf @@ -2,3 +2,35 @@ // Handle pain changes on injury [QEGVAR(medical,injured), LINKFUNC(adjustPainLevel)] call CBA_fnc_addEventHandler; + + +// Add inventory and open backpack actions to units +[QGVAR(addInventoryActions), LINKFUNC(addInventoryActions)] call CBA_fnc_addEventHandler; +// apply to all living and dead now +{ + [QGVAR(addInventoryActions), _x] call CBA_fnc_localEvent; +} forEach (allUnits + allDeadMen); +// apply to all future units +["CAManBase", "init", LINKFUNC(addInventoryActions), true, [], false] call CBA_fnc_addClassEventHandler; +// Respawn is called locally +["CAManBase", "respawn", { + params ["_unit"]; + if (!local _unit) exitWith {}; + [QGVAR(addInventoryActions), _unit] call CBA_fnc_globalEvent; +}, true] call CBA_fnc_addClassEventHandler; + + +// Handle comms status effects for spectator +// Separate from medical_feedback as these affect unit behavior rather than what the player sees +["featureCamera", { + params ["_unit", "_newCamera"]; + + if (_unit isNotEqualTo ACE_player) exitWith {}; + + if (_newCamera == "") then { // switched back to player view + private _status = IS_UNCONSCIOUS(_unit); + [_unit, _status] call FUNC(setStatusEffects); + } else { + [_unit, false, true] call FUNC(setStatusEffects); + }; +}] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/medical_status/XEH_preInit.sqf b/addons/medical_status/XEH_preInit.sqf index 89386bf4fa..c6343dcb63 100644 --- a/addons/medical_status/XEH_preInit.sqf +++ b/addons/medical_status/XEH_preInit.sqf @@ -25,20 +25,4 @@ PREP_RECOMPILE_END; addMissionEventHandler ["EntityKilled", {_this call FUNC(handleKilledMission)}]; -if (hasInterface) then { - //Add Inventory action to uncon units - ["CAManBase", "init", { - params ["_unit"]; - - private _id = _unit addAction ["", { - params ["_target", "_caller", "_actionId", "_arguments"]; - - _caller action ["Gear", _target]; - }, nil, 5.1, true, true, "gear", "_target getVariable ['ACE_isUnconscious',false] && {alive _target}", 3.5]; - - _unit setUserActionText [_id, localize "STR_ACTION_GEAR", ""]; - - }, nil, nil, true] call CBA_fnc_addClassEventHandler; -}; - ADDON = true; diff --git a/addons/medical_status/addon.toml b/addons/medical_status/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_status/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_status/config.cpp b/addons/medical_status/config.cpp index 69c1b2fd27..dc68c63bcc 100644 --- a/addons/medical_status/config.cpp +++ b/addons/medical_status/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -16,3 +23,5 @@ class CfgPatches { #include "ACE_settings.hpp" #include "CfgEventHandlers.hpp" + +#endif diff --git a/addons/medical_status/functions/fnc_addInventoryActions.sqf b/addons/medical_status/functions/fnc_addInventoryActions.sqf new file mode 100644 index 0000000000..6112904fcd --- /dev/null +++ b/addons/medical_status/functions/fnc_addInventoryActions.sqf @@ -0,0 +1,50 @@ +#include "script_component.hpp" +/* + * Author: LinkIsGrim, johnb43 + * Adds inventory and open backpack actions to uncon units. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [cursorTarget] call ace_medical_status_fnc_addInventoryActions + * + * Public: No + */ + +if (!hasInterface) exitWith {}; + +params ["_unit"]; + +// Gear Action - For Unconscious Units +private _id = _unit addAction ["", { + params ["_target", "_caller"]; + + _caller action ["Gear", _target]; +}, nil, 5.1, true, true, "gear", toString { + (_target isNotEqualTo ACE_player) && + {(lifeState _target) isEqualTo "INCAPACITATED"} +}, 2]; + +_unit setUserActionText [_id, localize "STR_ACTION_GEAR", ""]; + +// Open Bag Action - For Dead Units +_unit addAction ["OpenBag", { + params ["_target", "_caller"]; + + _caller action ["OpenBag", _target]; +}, nil, 5.2, true, true, "", toString { + private _backpackContainer = backpackContainer _target; + private _backpackConfig = configOf _backpackContainer; + + (_target isNotEqualTo ACE_player) && + {!((lifeState _target) in ["HEALTHY", "INJURED", "INCAPACITATED"])} && + {!isNull _backpackContainer} && + {!lockedInventory _backpackContainer} && + {maxLoad _backpackContainer > 0} && + {getNumber (_backpackConfig >> "disableInventory") != 1} && + {_target setUserActionText [_actionId, format [localize "STR_ACTION_OPEN_BAG", getText (_backpackConfig >> "displayName")]]; true} +}, 2]; diff --git a/addons/medical_status/functions/fnc_getCardiacOutput.sqf b/addons/medical_status/functions/fnc_getCardiacOutput.sqf index cf405b52bc..1d59ce89fe 100644 --- a/addons/medical_status/functions/fnc_getCardiacOutput.sqf +++ b/addons/medical_status/functions/fnc_getCardiacOutput.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Glowbal, SilentSpike + * Author: Glowbal, kymckay * Get the cardiac output from the Heart, based on current Heart Rate and Blood Volume. * * Arguments: diff --git a/addons/medical_status/functions/fnc_handleKilled.sqf b/addons/medical_status/functions/fnc_handleKilled.sqf index f2b253cf3e..29e5e42cec 100644 --- a/addons/medical_status/functions/fnc_handleKilled.sqf +++ b/addons/medical_status/functions/fnc_handleKilled.sqf @@ -53,4 +53,7 @@ if (_unit == player) then { ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); }; +// Remove status effects before respawn, in case mission is using spectator +[_unit, false] call FUNC(setStatusEffects); + ["ace_killed", [_unit, _causeOfDeath, _killer, _instigator]] call CBA_fnc_globalEvent; diff --git a/addons/medical_status/functions/fnc_setStatusEffects.sqf b/addons/medical_status/functions/fnc_setStatusEffects.sqf new file mode 100644 index 0000000000..9d93354de3 --- /dev/null +++ b/addons/medical_status/functions/fnc_setStatusEffects.sqf @@ -0,0 +1,30 @@ +#include "script_component.hpp" +/* + * Author: LinkIsGrim + * Sets status effects for a unit. + * For Internal Use: Called by FUNC(setUnconsciousState), FUNC(handleKilled), and on featureCamera changes. + * + * Arguments: + * 0: The unit + * 1: Status effects value + * 2: Skip setHidden (default: false) + * + * Return Value: + * None + * + * Public: No + */ + +params ["_unit", "_set", ["_skipSetHidden", false]]; +TRACE_3("setStatusEffect",_unit,_set,_skipSetHidden); + +// Block radio on unconsciousness for compatibility with captive module +[_unit, "blockRadio", "ace_unconscious", _set] call EFUNC(common,statusEffect_set); + +// Block speaking on unconsciousness +[_unit, "blockSpeaking", "ace_unconscious", _set] call EFUNC(common,statusEffect_set); + +if (_skipSetHidden) exitWith {}; + +// Stop AI firing at unconscious units in most situations (global effect) +[_unit, "setHidden", "ace_unconscious", _set] call EFUNC(common,statusEffect_set); diff --git a/addons/medical_status/functions/fnc_setUnconsciousState.sqf b/addons/medical_status/functions/fnc_setUnconsciousState.sqf index 214005f8d4..ccc9a8938f 100644 --- a/addons/medical_status/functions/fnc_setUnconsciousState.sqf +++ b/addons/medical_status/functions/fnc_setUnconsciousState.sqf @@ -28,14 +28,8 @@ _unit setVariable [VAR_UNCON, _active, true]; // Toggle unit ragdoll state [_unit, _active] call EFUNC(medical_engine,setUnconsciousAnim); -// Stop AI firing at unconscious units in most situations (global effect) -[_unit, "setHidden", "ace_unconscious", _active] call EFUNC(common,statusEffect_set); - -// Block radio on unconsciousness for compatibility with captive module -[_unit, "blockRadio", "ace_unconscious", _active] call EFUNC(common,statusEffect_set); - -// Block speaking on unconsciousness -[_unit, "blockSpeaking", "ace_unconscious", _active] call EFUNC(common,statusEffect_set); +// Handle hiding from AI and talking blocks. +[_unit, _active] call FUNC(setStatusEffects); if (_active) then { // Don't bother setting this if not used diff --git a/addons/medical_treatment/addon.toml b/addons/medical_treatment/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_treatment/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_treatment/config.cpp b/addons/medical_treatment/config.cpp index 1664eed719..9c77b37f13 100644 --- a/addons/medical_treatment/config.cpp +++ b/addons/medical_treatment/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -22,3 +29,5 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" #include "Cfg3DEN.hpp" + +#endif diff --git a/addons/medical_treatment/functions/fnc_hasItem.sqf b/addons/medical_treatment/functions/fnc_hasItem.sqf index 78d3f79b68..87d5c8b72e 100644 --- a/addons/medical_treatment/functions/fnc_hasItem.sqf +++ b/addons/medical_treatment/functions/fnc_hasItem.sqf @@ -4,6 +4,7 @@ * Checks if one of the given items are present between the medic and patient. * Does not respect the priority defined by the allowSharedEquipment setting. * Will check medic first and then patient if shared equipment is allowed. + * If medic or patient are in a vehicle then vehicle's inventory will also be checked. * * Arguments: * 0: Medic @@ -25,6 +26,10 @@ private _fnc_checkItems = { params ["_unit"]; private _unitItems = _unit call EFUNC(common,uniqueItems); + private _unitVehicle = objectParent _unit; + if (!isNull _unitVehicle) then { + _unitItems append (itemCargo _unitVehicle); + }; _items findIf {_x in _unitItems} != -1 }; diff --git a/addons/medical_treatment/functions/fnc_loadUnit.sqf b/addons/medical_treatment/functions/fnc_loadUnit.sqf index 91656c3c19..2aaa9039e3 100644 --- a/addons/medical_treatment/functions/fnc_loadUnit.sqf +++ b/addons/medical_treatment/functions/fnc_loadUnit.sqf @@ -52,7 +52,6 @@ if (isNull _vehicle) exitWith { TRACE_1("no vehicle found",_vehicle); }; private _vehicleName = getText (configOf _vehicle >> "displayName"); [[LSTRING(LoadedInto), _patientName, _vehicleName], 3] call EFUNC(common,displayTextStructured); }, [_patient, _vehicle], 3, { - params ["_unit", "_emptyPos"]; + params ["_unit", "_vehicle"]; WARNING_3("loadPerson failed to load %1[local %2] -> %3 ",_unit,local _unit,_vehicle); }] call CBA_fnc_waitUntilAndExecute; - diff --git a/addons/medical_treatment/functions/fnc_useItem.sqf b/addons/medical_treatment/functions/fnc_useItem.sqf index 5425e0848c..d642380910 100644 --- a/addons/medical_treatment/functions/fnc_useItem.sqf +++ b/addons/medical_treatment/functions/fnc_useItem.sqf @@ -2,6 +2,7 @@ /* * Author: Glowbal, mharis001 * Uses one of the treatment items. Respects the priority defined by the allowSharedEquipment setting. + * Can use items from vehicle inventory if either unit is in a vehicle. * * Arguments: * 0: Medic @@ -25,9 +26,14 @@ private _useOrder = [[_patient, _medic], [_medic, _patient], [_medic]] select GV { private _unit = _x; + private _unitVehicle = objectParent _unit; private _unitItems = _x call EFUNC(common,uniqueItems); { + if (!isNull _unitVehicle && {_x in (itemCargo _unitVehicle)}) then { + _unitVehicle addItemCargoGlobal [_x, -1]; + [_unit, _x] breakOut "Main"; + }; if (_x in _unitItems) then { _unit removeItem _x; [_unit, _x] breakOut "Main"; diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index e444a441bc..051b0e6d00 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -51,7 +51,7 @@ Enables the Check Pulse, Check Blood Pressure, and Check Response treatment actions instead of the generic Diagnose action.\nWhen disabled, the CPR action will only be shown when performing CPR is appropriate.\nThe actions this setting enables are needed to determine whether a person is unconscious or in cardiac arrest. - 有効化すると通常の診断動作に代わり、心拍や血圧測定、反応を確認できます。 + 有効化すると通常の診断動作に代わり、脈拍や血圧測定、反応を確認できます。 Active le diagnostic avancé, permettant la vérification du pouls, de la pression sanguine, ainsi que la réponse du patient aux traitements.\nSi l'option est désactivée, l'action de RCP ne sera visible que si elle est effectivement appropriée.\nLe diagnostic avancé est indispensable pour différencier une personne inconsciente d'une personne en arrêt cardiaque. Включает действия «Проверить пульс», «Проверить давление» и «Проверить реакцию» вместо общего действия «Диагностика». Ativa as opções de Verificar Pulso, Verificar Pressão Sanguínea e Verificar Resposta, ao invés do diagnóstico geral. @@ -719,6 +719,7 @@ What should be consumed after use. Legt fest, ob etwas nach der Anwendung verwendet werden soll. Qué debe ser consumido despues de su uso. + 縫合キットの使用後に消費するかどうかを決定します。 Self Stitching @@ -951,7 +952,7 @@ Max Litter Objects - 最大廃棄物数 + 廃棄物最大数 Nombre maximum de détritus Макс. кол-во мусора Máximo de Objetos de Lixo @@ -967,7 +968,7 @@ Sets the maximum number of litter objects which can be spawned, excessive amounts can cause FPS lag. - 生成される最大廃棄物数を設定できます。極端に増やすと FPS ラグを引き起こします。 + 生成される廃棄物の最大数を設定できます。極端に増やすと FPS ラグを引き起こします。 Définit le nombre maximal de détritus pouvant être affichés.\nUne quantité excessive peut engendrer une baisse de FPS. Устанавливает максимальное количество создаваемых объектов мусора. Чрезмерное значение может вызвать задержку FPS. Define o limite máximo de objetos de lixo que podem ser criados, quantidade excessivas podem causar lag de FPS. @@ -998,7 +999,7 @@ Controls the lifetime of litter objects, in seconds. -1 is forever. - 廃棄物の寿命を秒で決定できます。-1 で永遠です。 + 廃棄物の寿命を秒で決定できます。-1 にすると恒久的になります。 Définit la durée d'affichage des détritus, en secondes. Durée illimitée : -1. Управляет временем жизни объектов мусора в секундах. -1 означает Навсегда. Controla o tempo de vida de objetos de lixo criados em segundos. -1 é para sempre. @@ -1119,7 +1120,7 @@ Probabilité minimale de rétablir un rythme cardiaque suite à une RCP.\nCette valeur minimale est définie pour un patient à l'état "A perdu une quantité critique de sang".\nUne interpolation est faite entre la chance minimale et maximale, en fonction du volume sanguin du patient. Минимальная вероятность того, что выполнение искусственного дыхания восстановит сердечный ритм.\nЭто минимальное значение используется, когда пациент, по крайней мере, получил статус "Фатальная кровопотеря".\n Интерполированная вероятность используется, когда объем крови пациента находится между минимальным и максимальным порогами. Minimalna wartość szansy na to że CPR przywróci bicie serca.\nTa minimalna wartość jest używana gdy pacjent ma status "Stracił krytyczną ilość krwi".\nInterpolowana wartość szansy jest używana gdy pacjent ma poziom krwi będący pomiędzy minimum a maksimum. - 心肺蘇生を行うことで心拍が回復する最低成功確率を設定します。\nこの値は患者が"致命的な程失血している"時に使用されます。\n患者の血液量が最低値と最大値の間だった場合は、補完確率が適用されます。 + 心肺蘇生を行うことで脈拍が回復する最低成功確率を設定します。\nこの値は患者が"致命的な程失血している"時に使用されます。\n患者の血液量が最低値と最大値の間だった場合は、補完確率が適用されます。 Minimale Wahrscheinlichkeit, dass die Durchführung einer HLW den Herzrhythmus wiederherstellt.\nDieser Mindestwert wird verwendet, wenn der Patient mindestens "eine tödliche Menge Blut verloren" hat.\nEine interpolierte Wahrscheinlichkeit wird verwendet, wenn das Blutvolumen des Patienten zwischen dem minimalen und dem maximalen Schwellenwert liegt. 实施心肺复苏恢复心律的最小可能性。\n当伤员至少有"致命失血量"时,就取该最小值。\n当伤员的血量介于最小和最大阈值之间时,将使用插值概率。 심폐소생술 시 제일 낮은 성공 가능성을 결정합니다.\n이 가능성은 환자가 최소 "심각한 양의 혈액을 잃음"일 때 사용됩니다. @@ -1130,7 +1131,7 @@ Probabilité maximale de rétablir un rythme cardiaque suite à une RCP.\nCette valeur maximale est définie pour un patient à l'état "A perdu une faible quantité de sang".\nUne interpolation est faite entre la chance minimale et maximale, en fonction du volume sanguin du patient. Максимальная вероятность того, что выполнение искусственного дыхания восстановит сердечный ритм.\nЭто максимальное значение используется, когда пациент, по крайней мере, получил статус "Фатальная кровопотеря".\n Интерполированная вероятность используется, когда объем крови пациента находится между минимальным и максимальным порогами. Maksymalna wartość szansy na to że CPR przywróci bicie serca.\nTa maksymalna wartość jest używana gdy pacjent ma status "Stracił trochę krwi".\nInterpolowana wartość szansy jest używana gdy pacjent ma poziom krwi będący pomiędzy minimum a maksimum. - 心肺蘇生を行うことで心拍が回復する最高成功確率を設定します。\nこの値は患者が"いくらか失血している"時以上の場合に使用されます。\n患者の血液量が最低値と最大値の間だった場合は、補完確率が適用されます。 + 心肺蘇生を行うことで脈拍が回復する最高成功確率を設定します。\nこの値は患者が"いくらか失血している"時以上の場合に使用されます。\n患者の血液量が最低値と最大値の間だった場合は、補完確率が適用されます。 Maximale Wahrscheinlichkeit, dass die Durchführung einer HLW den Herzrhythmus wiederherstellt.\nDieser Maximalwert wird verwendet, wenn der Patient höchstens "Blut verloren" hat.\nEine interpolierte Wahrscheinlichkeit wird verwendet, wenn das Blutvolumen des Patienten zwischen dem minimalen und dem maximalen Schwellenwert liegt. 实施心肺复苏恢复心律的最大可能性。\n当伤员最多“失血一些”时,就取该最大值。\n当伤员的血量介于最小和最大阈值之间时,将使用插值概率。 심폐소생술 시 제일 높은 성공 가능성을 결정합니다.\n이 가능성은 환자가 최소 "혈액을 조금 잃음"일 때 사용됩니다. @@ -1174,7 +1175,7 @@ Controls whether weapons must be holstered / lowered in order to perform medical actions.\nExcept Exam options allow examination actions (checking pulse, blood pressure, response) at all times regardless of this setting. - 何らかの治療をするには武器を下げるか収めるかどうかを決定します。\nなお次の診断行動は設定で例外できます: 心拍確認、血圧測定、反応確認 + 何らかの治療をするには武器を下げるか収めるかどうかを決定します。\nなお次の診断行動は設定で例外できます: 脈拍確認、血圧測定、反応確認 控制是否要先放下或把武器放入武器套才能做出醫療行為。\n除了診斷 - 允許未放下或未放入的情況下進行一連串的診斷(檢查脈搏,血壓,反應)。 控制是否要先放下或把武器放起才能做出医疗行为。\n除了诊断—允许未放下或未收起的情况下进行一连串的诊断(检查脉搏,血压,反应)。 Définit si les armes doivent être rengainées ou abaissées avant de pouvoir effectuer des actes médicaux.\nLes options "sauf examens" autorisent les examens (vérification du pouls, de la tension artérielle, de l'état de conscience) en toutes circonstances. @@ -1639,7 +1640,7 @@ Rallenta la perdita di sangue in caso di sanguinamento Reduz a velocidade da perda de sangue Zpomaluje ztráty krve při krvácení - 出血時に失血量を減らします。 + 出血時の失血を抑えます。 출혈 시 혈액손실을 늦춰줍니다 减缓失血速度 減緩失血的速度 @@ -1656,7 +1657,7 @@ Un laccio emostatico usato per comprimere le vene e arterie per bloccare o rallentare la circolazione del sangue e quindi rallentare dissanguamenti. A aparelho que comprime as artérias e veias para diminuir a perda de sangue. Zařízení používané ke stlačení venózního a arteriálního oběhu. V důsledku dochází ke zpomalení toku krve a tedy i snížení ztrát krve. - 止血帯は静脈や動脈へ圧力をかけ、循環を遅らせることで血液の流れを遅し失血を防ぎます。 + 静脈と動脈の循環を圧迫し、血流を抑制または減速させ、出血時の失血を抑えます。 정맥과 동맥을 압축시키켜 혈액순환을 억제 혹은 늦추게하여 혈액손실을 줄이는 도구입니다. 用于压迫静脉与动脉的血液流动,以达到减缓失血速度的目的 用於壓迫靜脈與動脈的血液流動, 達到減緩失血速度的目的 @@ -1722,7 +1723,7 @@ Usato per combattere il dolore. Usado para combater dores moderadas e severas Slouží k tlumení středně těžkých a těžkých bolestí - 戦闘が収まった時に痛みに対して使います。 + 中等度から重度の痛みに対処するために使用される。 심한 통증을 완화하는데 쓰입니다 用于削减中度至重度疼痛 減低中度至重度的疼痛感 @@ -1738,7 +1739,7 @@ Un analgesico usato per combattere il dolore. Um analgésico usado para combater dores moderadas e fortes. Analgetikum slouží k tlumení středně těžkých a těžkých bolestí - 戦闘が収まった時にモルヒネを痛みに対して使います。 + 中等度から重度の痛みに対処するための鎮痛薬。 심한 통증을 완화하기 위해 쓰이는 진통제입니다. 一种用于削减中度至重度疼痛的止痛药 止痛藥的一種, 用於減低中度至重度的疼痛感 @@ -1866,7 +1867,7 @@ Aumenta il battito cardiaco e combatte gli effetti di reazioni allergiche. Aumenta a frequência cardíaca e combate efeitos causados por reações alérgicas Zvyšuje srdeční frekvenci a chrání před alergickými reakcemi - 心拍数を増加させたり、アレルギー反応を収める効果もあります。 + 脈拍数を増加させたり、アレルギー反応を収める効果もあります。 심박수를 높이며 알러지 반응의 대응책입니다 用于提升心率的一种药物 增加心跳速率的一種藥物 @@ -1882,7 +1883,7 @@ Uma droga trabalha dilatando os bronquios, aumentando a frequência cardíaca e combate efeitos de reações alérgicas(anáfilaticas). Usado em casos de parada cardiaca com poucas changes de recuperação. Egy hormon, mely a szimpatikus idegrendszer által kitágítja a hörgőket, valamint megnöveli a szívverést, ezzel ellensúlyozva ilyen jellegű allergiás reakciókat (anafilaxiás sokk). Hirtelen szívmegállás esetén is használt, idő alatt csökkenő hatásfokkal. Zúžení periferních cév díky působení na alfa receptory a následné kontrakci hladkých svalů, tím dochází k tzv. centralizaci oběhu, krev se soustřeďuje v životně důležitých centrálních orgánech (srdce, mozek, plíce), působí také pozitivně na srdeční činnost a dochází ke zvýšení krevního tlaku a tepu. Dále se používá při náhlé srdeční zástavě. - 気管支を拡張するよう交感神経を拡張させ、心拍数を増加させます。それにアレルギー反応を収める効果もあります (アナフィラキシー ショック)。得られる効果は少ないですが、心停止している場合などにも使われます。 + 気管支を拡張するよう交感神経を拡張させ、脈拍数を増加させます。それにアレルギー反応を収める効果もあります (アナフィラキシー ショック)。得られる効果は少ないですが、心停止している場合などにも使われます。 기관지를 확장시키고 교감 신경 반응을 이끌어내는 약물로써, 심박을 높이고 알러지 효과(과민증)에 대응합니다. 심정지의 경우 호전이 되지 않을 때 사용합니다. 俗称强心针,为一种支气管扩张药物, 会增加心跳速率并减缓过敏反应(过敏性休克), 在心跳骤停时有恢复心跳的效果! 俗稱強心針, 為一種支氣管擴張藥物, 會增加心跳速率並減緩過敏反應(過敏性休克), 在心跳驟停時有恢復心跳的效果! @@ -1914,7 +1915,7 @@ Volumenerweiterungsmittel (künstliches Blutvolumen) Suplemento para expandir o volume sanguíneo. Intravenózně podávaný doplněk k zvětšení objemu krve - 血液量を増加させる補助です。 + 血液量の増加を補助します。 혈액량을 늘리기위한 보조수단 입니다. 可快速得到血液补充 可快速得到血液補充 @@ -1930,7 +1931,7 @@ Volumenerweiterungsmittel (künstliches Blutvolumen) Suplemento para expandir o volume sanguíneo. Intravenózně podávaný doplněk k zvětšení objemu krve - 血液量を増加させる補助です。 + 血液量の増加を補助します。 혈액량을 늘리기위한 보조수단 입니다. 可快速得到血液补充 可快速得到血液補充 @@ -1997,7 +1998,7 @@ Blut IV, um den Bluthaushalt des Patienten wiederherzustellen. Sangue intravenoso, para restaurar o volume sanguinio do paciente. Krevní transfuze pro doplnění pacientovi krve - 血液 IV は、患者へ血液を補給します。 + 血液 IVは患者の血液量を回復させます。 혈액 IV, 환자에게 혈액을 공급합니다. 血液,用于补充伤者流失的血液 血液, 用於補充傷者流失的血液 @@ -2014,7 +2015,7 @@ Sangue O- , utilizado em casos raros para rapidamente repor o sangue. Uso habitual ocorre durante o transporte ou em estações de tratamento. Nullás vércsoportú, Rh-negatív vér-infúzió, melyet kritikus és ritka helyzetekben vérutánpótlásra használnak, jellemzően az orvosi ellátás szállítási fázisa közben. 0 Rh negativní krev se používá v vzácných případech k doplnění pacientovy hladiny krve, obvykle při převozu zraněné osoby do nemocnice. - O 型への輸血はまれで厳格であり、通常は治療のための輸送段階で輸血をおこないます。 + 血液型O-の輸血は、厳密かつ稀な事象において行われる。通常、医療の搬送段階で血液を補充するために使用される。 O형 혈액 투여는 매우 엄격하고 드문 혈액 보급의 경우에 쓰이는데 주로 치료의 운송단계에서 사용됩니다. O型负值注射用血液,在紧急情况时使用, 用于补充伤者流失的血液 O型陰性注射用血液, 在緊急情況時使用, 用於補充傷者流失的血液 @@ -2081,7 +2082,7 @@ Kochsalzlösung, ein medizinisches Volumenersatzmittel Solução Salina Intravenosa 0.9%, para restaurar o volume de sangue temporariamente. Fyziologický roztok se aplikuje intravenózně a slouží k obnově pacientovi krve - 生理食塩水 IV は、患者の血液量を補助します + 生理食塩水 IVは患者の血液量を回復させます。 생리식염수, 환자의 혈액량을 보충할때 쓰입니다 生理盐水,用于恢复伤者血液 生理食鹽水, 用於恢復傷者血液 @@ -2097,7 +2098,7 @@ Ein medizinisches Volumenersatzmittel, dass durch einen intravenösen Zugang in den Blutkreislauf verabreicht wird. Uma reposição temporaria para restaurar a pressão arterial perdida por perda de sangue. Fyziologický roztok se využívá nejčastěji jako infuze při dehydrataci organismu. - 生理食塩水 IV を静脈へ投与し、血液量を増加させることができます。 + 点滴で血液系に導入される医療用血液量補充剤。 혈류에 IV로 투여되는 의료 용적 대체 요법 利用静脉注射进入人体血液系统,帮助伤者血液恢复 利用靜脈注射進入人體血液系統, 幫助傷者血液恢復 @@ -2325,16 +2326,19 @@ Suture Naht Sutura + 縫合糸 Surgical Suture for stitching injuries. Chirurgisches Nahtmaterial zum Nähen von Wunden. Sutura quirúrjica para heridas de puntos. + 傷害縫合用の外科縫合糸。 Surgical Suture for stitching injuries. Chirurgisches Nahtmaterial zum Nähen von Wunden. Sutura quirúrjica para heridas de puntos. + 傷害縫合用の外科縫合糸。 Bodybag @@ -2887,7 +2891,7 @@ Pulzus ellenőrzése Controlla il polso Checar Pulso - 心拍数を計る + 脈拍を計る 맥박 확인 检查脉搏 檢查脈搏 @@ -2938,7 +2942,7 @@ Érszorító Laccio emostatico Torniquete - 止血帯 + 止血帯を巻く 지혈대 止血带 軍用止血帶 @@ -3004,7 +3008,7 @@ Diagnosztizálás Diagnóza Diagnosticar - 診断する + 診断をする 진단 诊断 診斷 @@ -3038,7 +3042,7 @@ Újraélesztés CPR SBV - 心肺蘇生 + 心肺蘇生をする 심폐소생술 心肺复苏(CPR) 心肺復甦術 @@ -3369,7 +3373,7 @@ In mild pain Hat leichte Schmerzen - 中くらいの痛みがある + 軽い痛みがある Небольшая боль Légère douleur Com dor leve @@ -3490,7 +3494,7 @@ %1 ellenőrizte a vérnyomást: %2 %1 zkontroloval krevní tlak: %2 %1 verificou pressão arterial: %2 - %1 が測った血圧は: %2 + %1 が測定した血圧: %2 %1 (이)가 혈압을 측정했습니다: %2 %1 测得血压为 %2 已由%1確認血壓: %2 @@ -3540,7 +3544,7 @@ La pressione sanguigna è bassa Pressão Arterial baixa Naměřil si nízký krevní tlak - 血圧はかなり低い + 血圧は低い 혈압이 매우 낮습니다 血压低 發現到低血壓 @@ -3557,7 +3561,7 @@ La pressione sanguigna è normale Pressão Arterial normal Naměřil si normální krevní tlak - 血圧は通常 + 血圧は正常 혈압이 정상입니다 血压正常 發現到正常血壓 @@ -3574,7 +3578,7 @@ La pressione sanguigna è alta Pressão Arterial Alta Naměřil si vysoký krevní tlak - 血圧はかなり高い + 血圧は高い 혈압이 매우 높습니다 血压高 發現到高血壓 @@ -3608,7 +3612,7 @@ Manca strumento per misurare pressione sanguigna Você falhou em aferir a Pressão Arterial Nedokázal si změřit krevní tlak - 血圧を測るのに失敗 + 血圧を測るのに失敗した 혈압을 측정하는데 실패했습니다 无法测得血压 檢查血壓的動作失敗 @@ -3642,7 +3646,7 @@ Normális Normální Normal - 通常 + 正常 보통 正常 正常 @@ -3693,7 +3697,7 @@ Polso Pulso Puls - 心拍数 + 脈拍数 맥박 脉搏 脈搏 @@ -3727,7 +3731,7 @@ Hai diagnosticato %1 Você aferiu o paciente %1 Zkontroloval si %1 - 心拍数は %1 + 脈拍数は %1 맥박은 %1 입니다 你已检查 %1 你已經檢查 %1 @@ -3743,7 +3747,7 @@ %1 ellenőrizte a szívverés-számot: %2 %1 zkontroloval srdeční tep: %2 %1 verificou a frequência cardíaca: %2 - %1 が測った心拍数は: %2 + %1 が測定した心拍数: %2 %1 (이)가 맥박을 측정했습니다: %2 %1 测得心率为 %2 已由%1確認心跳: %2 @@ -3793,7 +3797,7 @@ Normális Normální Normal - 通常 + 正常 보통 正常 正常 @@ -3843,7 +3847,7 @@ Hai riscontrato un debole battito cardiaco Freqüência Cardíaca baixa Nahmatal jsi slabý srdeční puls - 心拍数は低い + 心拍は弱い 약한 맥박입니다 心率微弱 心跳微弱 @@ -3860,7 +3864,7 @@ Hai riscontrato un forte battito cardiaco Freqüência Cardíaca normal Nahmatal jsi silný srdeční puls - 心拍数は強い + 心拍は強い 강한 맥박입니다 心率过快 心跳過快 @@ -3877,7 +3881,7 @@ Hai riscontrato un normale battito cardiaco Freqüência Cardíaca alta Nahmatal jsi normální srdeční puls - 心拍数は通常 + 心拍は正常 보통 맥박입니다 心率正常 心跳正常 @@ -3894,7 +3898,7 @@ Hai riscontrato una assenza di battito cardiaco Sem Freqüência Cardíaca Žádný puls - 心拍数を測れなかった + 心拍を測れなかった 맥박을 찾을 수가 없습니다 无法测得心率 量不到心跳 @@ -4500,7 +4504,7 @@ %1 ha somministrato una EV %1 aplicou um intravenoso %1 již aplikoval IV - %1 は IV を投与した + %1 はIVを投与した %1 (이)가 IV를 실시했다 %1 已进行静脉注射 %1 已經給予靜脈注射液 @@ -4665,7 +4669,7 @@ Žádné škrtidlo na této části těla! Non c'è nessun laccio emostatico su questa parte del corpo! Il n'y a pas de garrot sur ce membre ! - 身体には止血帯が無い! + この部位には止血帯がない! 이 부위에는 지혈대가 없습니다! 该部位没有使用止血带! 這部位沒有止血帶! @@ -4675,7 +4679,7 @@ The body twitched and may not be dead! Тело дернулось и, возможно, пациент жив! L'unité a bougé et n'est peut-être pas morte ! - 身体が動き死んでないようだ! + 身体が痙攣している、まだ死んでないようだ! ¡El cuerpo se retorció y puede que no esté muerto! Ciało drgnęło i może nie być martwe! Der Körper zuckte und kann nicht tot sein! diff --git a/addons/medical_vitals/addon.toml b/addons/medical_vitals/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/medical_vitals/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/medical_vitals/config.cpp b/addons/medical_vitals/config.cpp index 91995242c9..f00fbe7174 100644 --- a/addons/medical_vitals/config.cpp +++ b/addons/medical_vitals/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\nomedical\script_component.hpp") +#define PATCH_SKIP "No Medical" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -15,3 +22,5 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" + +#endif diff --git a/addons/metis/config.cpp b/addons/metis/config.cpp index 6758b0cc47..f16d3c7892 100644 --- a/addons/metis/config.cpp +++ b/addons/metis/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_missileguidance"}; author = ECSTRING(common,ACETeam); - authors[] = {"Dani (TCVM)"}; + authors[] = {"tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/microdagr/functions/fnc_updateDisplay.sqf b/addons/microdagr/functions/fnc_updateDisplay.sqf index d4cc5000c3..97f2ae21e4 100644 --- a/addons/microdagr/functions/fnc_updateDisplay.sqf +++ b/addons/microdagr/functions/fnc_updateDisplay.sqf @@ -44,7 +44,7 @@ case (APP_MODE_INFODISPLAY): { (_display displayCtrl IDC_MODEDISPLAY_ELEVATIONNUM) ctrlSetText _aboveSeaLevelText; //Heading: - _compassAngleText = if (GVAR(settingUseMils)) then { + private _compassAngleText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (([ACE_player] call CBA_fnc_headDir) select 0))), 4, 0] call CBA_fnc_formatNumber; } else { ([([ACE_player] call CBA_fnc_headDir) select 0, 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 @@ -65,8 +65,8 @@ case (APP_MODE_INFODISPLAY): { } else { private _targetPosName = ""; private _targetPosLocationASL = []; - _bearingText = "----"; - _rangeText = "----"; + private _bearingText = "----"; + private _rangeText = "----"; _aboveSeaLevelText = "----"; if (GVAR(currentWaypoint) == -2) then { @@ -134,8 +134,8 @@ case (APP_MODE_COMPASS): { _targetPosLocationASL = (_waypoints select GVAR(currentWaypoint)) select 1; }; - _bearingText = "---"; - _rangeText = "---"; + private _bearingText = "---"; + private _rangeText = "---"; if (_targetPosLocationASL isNotEqualTo []) then { private _bearing = [(getPosASL ACE_player), _targetPosLocationASL] call BIS_fnc_dirTo; diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 0d31bceca0..f090377c2f 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -495,7 +495,7 @@ Semmi (nem használható a térképnézet) Не показывать (запрещает использовать режим карты) Nessuno (Non puoi usare la vista mappa) - なし(地図表示を使えません) + なし (地図表示を使えません) 없음 (지도를 볼 수 없음) 无(无法检视地图) 無 (無法檢視地圖) diff --git a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf index 25afa133ef..1c5d3b194b 100644 --- a/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf +++ b/addons/missileguidance/functions/fnc_SACLOS_onFired.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Sets up SACLOS state arrays (called from missileGuidance's onFired). * * Arguments: diff --git a/addons/missileguidance/functions/fnc_ahr_onFired.sqf b/addons/missileguidance/functions/fnc_ahr_onFired.sqf index 951673f6e4..615b97cefd 100644 --- a/addons/missileguidance/functions/fnc_ahr_onFired.sqf +++ b/addons/missileguidance/functions/fnc_ahr_onFired.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Sets up Active Radar state arrays (called from missileGuidance's onFired). * * Arguments: diff --git a/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf b/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf index 6ff2bef4c8..d5fad837c7 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_BEAM.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Attack profile: Beam guided. Exact same as wire-guided, except no wire cutting * * Arguments: diff --git a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf index 53ec068319..ca4b8bf845 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_WIRE.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Attack profile: Wire guided * * Arguments: diff --git a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf b/addons/missileguidance/functions/fnc_seekerType_ARH.sqf index 94c61f49f6..4f3843c0f9 100644 --- a/addons/missileguidance/functions/fnc_seekerType_ARH.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_ARH.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Active Radar Homing seeker * * Arguments: diff --git a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf index fa9f20674c..31ec6df25b 100644 --- a/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_SACLOS.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * SACLOS seeker * * Arguments: diff --git a/addons/missileguidance/functions/fnc_wire_onFired.sqf b/addons/missileguidance/functions/fnc_wire_onFired.sqf index 1909f1e9f6..e683636287 100644 --- a/addons/missileguidance/functions/fnc_wire_onFired.sqf +++ b/addons/missileguidance/functions/fnc_wire_onFired.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Sets up wireGuided state arrays (called from missileGuidance's onFired). * * Arguments: diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index 11092501b2..dc050272b1 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -182,7 +182,7 @@ Játékosok és AI Игрок и боты Giocatore ed IA - プレイヤーと AI + プレイヤーとAI 玩家和 AI 玩家和AI 플레이어와 AI diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index 464d654346..b5b50a4f08 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -241,7 +241,7 @@ Toglie i proiettili dal mortaio. I colpi singoli devono essere caricati dall'operatore. Non cambia quado l'IA spara. Elimina os carregadores do morteiro, requerendo que o atirador ou carregador utilize de forma individual a munição. Não afeta os morteiros controlados pela IA. Удаляет артиллерийские магазины, требует загрузку отдельных снарядов стрелком или заряжающим. Не влияет на артиллерию ИИ. - 迫撃砲から弾薬を除去します。射手か装填手により予め装填されている必要があります。AI 迫撃砲へ影響を与えません。 + 迫撃砲から弾薬を除去します。射手か装填手により予め装填されている必要があります。AI迫撃砲へ影響を与えません。 박격포 탄창을 제거합니다, 사수나 장전수가 개별적으로 탄환을 넣어줘야 합니다. 인공지능은 영향을 받지 않습니다. 开启此功能时。迫击炮的弹药需由炮手与装填手共同合作来进行装填。此功能并不影响由 AI 射击的迫击炮 開啟此功能時。迫擊砲的彈藥需由砲手與裝填手共同合作來進行裝填。此功能並不影響由AI射擊的迫擊砲 diff --git a/addons/nametags/XEH_PREP.hpp b/addons/nametags/XEH_PREP.hpp index a27102a4e5..33b21f04ec 100644 --- a/addons/nametags/XEH_PREP.hpp +++ b/addons/nametags/XEH_PREP.hpp @@ -1,9 +1,5 @@ - -PREP(canShow); -PREP(doShow); PREP(drawNameTagIcon); PREP(getCachedFlags); -PREP(getVehicleData); PREP(initIsSpeaking); PREP(moduleNameTags); PREP(onDraw3d); diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index e663274dbd..85115690b4 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -15,7 +15,6 @@ GVAR(showNamesTime) = -10; // Statement GVAR(showNamesTime) = CBA_missionTime; - // if (call FUNC(canShow)) then{ call FUNC(doShow); }; // This code doesn't work (canShow has a nil / has never worked??) // Return false so it doesn't block other actions false }, diff --git a/addons/nametags/functions/common.hpp b/addons/nametags/functions/common.hpp deleted file mode 100644 index ef3706cd32..0000000000 --- a/addons/nametags/functions/common.hpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Author: aeroson - * Images, index in images and order of roles. - * Defined number also implies order, lower number shows more on top of the list. - */ - -#define PILOT 0 -#define DRIVER 1 -#define COPILOT PILOT -#define COMMANDER 2 -#define GUNNER 3 -#define FFV 4 -#define CARGO 5 - -#define ROLE_IMAGES [ \ - "a3\ui_f\data\IGUI\Cfg\Actions\getinpilot_ca.paa", \ - "a3\ui_f\data\IGUI\Cfg\Actions\getindriver_ca.paa", \ - "a3\ui_f\data\IGUI\Cfg\Actions\getincommander_ca.paa", \ - "a3\ui_f\data\IGUI\Cfg\Actions\getingunner_ca.paa", \ - QPATHTOF(UI\icon_position_ffv.paa), \ - "a3\ui_f\data\IGUI\Cfg\Actions\getincargo_ca.paa" \ -] diff --git a/addons/nametags/functions/fnc_canShow.sqf b/addons/nametags/functions/fnc_canShow.sqf deleted file mode 100644 index 9cc83cfd91..0000000000 --- a/addons/nametags/functions/fnc_canShow.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "script_component.hpp" -/* - * Author: aeroson - * Checks if crew info can be shown. - * Might be called several times a second. - * - * Arguments: - * None - * - * Return Value: - * Can show Crew Info - * - * Example: - * call ace_nametags_fnc_canShow - * - * Public: No - */ - -((vehicle ACE_player) != ACE_player) && -{GVAR(ShowCrewInfo)} && -{!(vehicle ACE_player isKindOf "ParachuteBase")}; diff --git a/addons/nametags/functions/fnc_doShow.sqf b/addons/nametags/functions/fnc_doShow.sqf deleted file mode 100644 index 32acffe045..0000000000 --- a/addons/nametags/functions/fnc_doShow.sqf +++ /dev/null @@ -1,86 +0,0 @@ -#include "script_component.hpp" -#include "common.hpp" -/* - * Author: aeroson - * Shows the actual text and sets text the crew info. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ace_nametags_fnc_doShow - * - * Public: No - */ - -private _player = ACE_player; -private _vehicle = vehicle _player; -private _type = typeOf _vehicle; -private _config = configOf _vehicle; -private _text = format[" %2
", getText(_config>>"picture"), getText (_config >> "DisplayName")]; - -private _data = [_type] call FUNC(getVehicleData); - -private _isAir = _data select 0; -private _data = _data select 1; - -private _turretUnits = _data apply {_vehicle turretUnit (_x select 0)}; -private _turretRoles = _data apply {_x select 1}; - -private _roleType = CARGO; -private _toShow = []; -{ - switch (_x) do { - case commander _vehicle: { - _roleType = COMMANDER; - }; - case gunner _vehicle: { - _roleType = GUNNER; - }; - case driver _vehicle: { - _roleType = if(_isAir) then { PILOT } else { DRIVER }; - }; - default { - _index = _turretUnits find _x; - if(_index !=-1 ) then { - _roleType = _turretRoles select _index; - } else { - _roleType = CARGO; - }; - }; - }; - _toShow pushBack [_x, _roleType]; -} forEach crew _vehicle; - -_toShow = [ - _toShow, - [], - { - _x select 1 - }, - "ASCEND", - { - _unit = _x select 0; - alive _unit - } -] call BIS_fnc_sortBy; - -private _roleImages = ROLE_IMAGES; -{ - private _unit = _x select 0; - private _roleType = _x select 1; - _text = _text + format["%1
", [_unit] call EFUNC(common,getName), _roleImages select _roleType]; -} forEach _toShow; - -("ACE_CrewInfo_CrewInfo" call BIS_fnc_rscLayer) cutRsc ["ACE_CrewInfo_dialog", "PLAIN", 1, false]; - -terminate (missionNamespace getVariable [QGVAR(hideCrewInfoHandle), scriptNull]); -GVAR(hideCrewInfoHandle) = 0 spawn { - sleep 2; - ("ACE_CrewInfo_CrewInfo" call BIS_fnc_rscLayer) cutFadeOut 2; -}; - -[_text] call FUNC(setText); diff --git a/addons/nametags/functions/fnc_getVehicleData.sqf b/addons/nametags/functions/fnc_getVehicleData.sqf deleted file mode 100644 index 48eeab4626..0000000000 --- a/addons/nametags/functions/fnc_getVehicleData.sqf +++ /dev/null @@ -1,103 +0,0 @@ -#include "script_component.hpp" -#include "common.hpp" -/* - * Author: aeroson - * Gathers and caches data needed by ace_nametags_fnc_doShow. - * What really does make difference for the engine is simulation of CfgAmmo. - * Priority of roles is: driver/pilot, gunner, copilot, commander, FFV, cargo. - * - * Arguments: - * None - * - * Return Value: - * Data - * 0: Vehicle inherits from Air - * 1: Categorized vehicle's turrets - * - * Example: - * call ace_nametags_fnc_getVehicleData - * - * Public: No - */ - -params ["_type"]; - -private _varName = format ["ACE_CrewInfo_Cache_%1", _type]; -private _data = + (uiNamespace getVariable _varName); - -if (!isNil "_data") exitWith {_data}; - -_data = []; -private _isAir = _type isKindOf "Air"; - -private _fnc_addTurretUnit = { - params ["_config", "_path"]; - private _role = CARGO; - - private _simulationEmpty = 0; - private _simulationLaserDesignate = 0; - private _simulationOther = 0; - { - { - private _magazine = configFile >> "CfgMagazines" >> _x; - private _ammo = configFile >> "CfgAmmo" >> getText (_magazine >> "ammo"); - private _simulation = getText (_ammo >> "simulation"); - - if(_simulation=="") then { - _simulationEmpty = _simulationEmpty + 1; - } else { - if(_simulation=="laserDesignate") then { - _simulationLaserDesignate = _simulationLaserDesignate + 1; - } else { - _simulationOther = _simulationOther + 1; - }; - }; - - } forEach getArray (configFile >> "CfgWeapons" >> _x >> "magazines"); - } forEach getArray (_config >> "weapons"); - - if(_simulationOther>0) then { - _role = GUNNER; - }; - if (_role == CARGO && {getNumber (_config >> "isCopilot") == 1}) then { - _role = COPILOT; - }; - if (_role == CARGO && {_simulationLaserDesignate>0 || getNumber (_config >> "primaryObserver") == 1}) then { - _role = COMMANDER; - }; - if (_role == CARGO && {getNumber (_config >> "isPersonTurret") == 1}) then { - _role = FFV; - }; - - _data pushBack [_path, _role]; -}; - - -private _fnc_addTurret = { - params ["_config", "_path"]; - - _config = _config >> "Turrets"; - private _count = count _config; - - private _offset = 0; - - for "_index" from 0 to (_count - 1) do { - private _turretPath = _path + [_index - _offset]; - private _turretConfig = _config select _index; - if (isClass _turretConfig) then { - [_turretConfig, _turretPath] call _fnc_addTurretUnit; - [_turretConfig, _turretPath] call _fnc_addTurret; - } else { - _offset = _offset + 1; - }; - }; -}; - - -_config = configFile >> "CfgVehicles" >> _type; -[_config, []] call _fnc_addTurret; - -_data = [_isAir, _data]; -uiNamespace setVariable [_varName, _data]; - -_data diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 3e395e567b..791050abef 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -215,7 +215,7 @@ Névcímkék mutatása MI-egységeknél Mostra i nomi delle le unità AI Mostrar nomes para unidades de IA - AI ユニットの名札を表示 + AIユニットの名札を表示 인공지능 인원 이름 표시 显示 AI 单位名字 顯示AI單位名稱 @@ -232,7 +232,7 @@ Mutassa-e a szövetséges AI egységek nevét és rangját? Alapértelmezett: Nincs felülbírálás Показывать имена и звания дружественных ботов? По умолчанию: Не обязывать Mostra etichette nomi ed etichette gradi per unità IA alleate? Default: Non forzare - 友軍の AI にも名前と階級を表示しますか? 標準: 強制しない + 友軍のAIにも名前と階級を表示しますか? 標準: 強制しない 아군 인공지능의 계급을 표시합니까? 기본설정: 강제하지 않음 显示友军 AI 的名字和军阶? 预设:不显示 顯示友軍AI的名稱和軍階? 預設: 不顯示 @@ -434,7 +434,7 @@ Alap névcímke-szín (csoporton kívüli személyek) Colore dei nomi non appartenenti al gruppo Cor padrão do nome (unidades fora do grupo) - 標準の名札の色(グループ メンバ以外) + 標準の名札の色 (グループメンバー以外) 기본 이름표 색상 (비그룹 멤버) 预设名字颜色(非同小队队友) 預設名稱顏色 (非同小隊隊友) diff --git a/addons/nightvision/ACE_Arsenal_Stats.hpp b/addons/nightvision/ACE_Arsenal_Stats.hpp new file mode 100644 index 0000000000..0b42d136f6 --- /dev/null +++ b/addons/nightvision/ACE_Arsenal_Stats.hpp @@ -0,0 +1,12 @@ +class EGVAR(arsenal,stats) { + class statBase; + class GVAR(generation): statBase { + scope = 2; + priority = 1.6; + condition = QUOTE('nvg' in (getArray ((_this select 1) >> 'visionMode') apply {toLower _x})); + displayName = CSTRING(NVGeneration); + showText = 1; + textStatement = QUOTE(call FUNC(statTextStatement_NVGeneration)); + tabs[] = {{8}, {}}; + }; +}; diff --git a/addons/nightvision/CfgWeapons.hpp b/addons/nightvision/CfgWeapons.hpp index 52c3d32d18..0e3d03c35e 100644 --- a/addons/nightvision/CfgWeapons.hpp +++ b/addons/nightvision/CfgWeapons.hpp @@ -5,6 +5,12 @@ class CfgWeapons { modelOptics = ""; GVAR(border) = QPATHTOF(data\nvg_mask_binos_4096.paa); GVAR(bluRadius) = 0.15; + NVG_GREEN_PRESET; + }; + class ACE_NVGoggles_WP: NVGoggles { + displayName = CSTRING(NVG_Gen3_brown_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; }; class O_NVGoggles_hex_F: NVGoggles { // APEX NVG with multiple lenses (spider eyes) modelOptics = ""; @@ -21,10 +27,20 @@ class CfgWeapons { modelOptics = ""; displayName = CSTRING(NVG_Gen3_black); }; + class ACE_NVGoggles_OPFOR_WP: NVGoggles_OPFOR { + displayName = CSTRING(NVG_Gen3_black_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class NVGoggles_INDEP: NVGoggles { modelOptics = ""; displayName = CSTRING(NVG_Gen3_green); }; + class ACE_NVGoggles_INDEP_WP: NVGoggles_INDEP { + displayName = CSTRING(NVG_Gen3_green_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class ACE_NVG_Gen1: NVGoggles_OPFOR { author = ECSTRING(common,ACETeam); displayName = CSTRING(NVG_Gen1_black); @@ -60,31 +76,61 @@ class CfgWeapons { displayName = CSTRING(NVG_Gen4_black); GVAR(generation) = 4; }; + class ACE_NVG_Gen4_Black_WP: ACE_NVG_Gen4_Black { + displayName = CSTRING(NVG_Gen4_black_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class ACE_NVG_Gen4: NVGoggles { author = ECSTRING(common,ACETeam); displayName = CSTRING(NVG_Gen4_brown); GVAR(generation) = 4; }; + class ACE_NVG_Gen4_WP: ACE_NVG_Gen4 { + displayName = CSTRING(NVG_Gen4_brown_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class ACE_NVG_Gen4_Green: NVGoggles_INDEP { author = ECSTRING(common,ACETeam); displayName = CSTRING(NVG_Gen4_green); GVAR(generation) = 4; }; + class ACE_NVG_Gen4_Green_WP: ACE_NVG_Gen4_Green { + displayName = CSTRING(NVG_Gen4_green_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class ACE_NVG_Wide_Black: NVGoggles_OPFOR { author = ECSTRING(common,ACETeam); modelOptics = QPATHTOF(models\ACE_nvg_wide_optics); displayName = CSTRING(NVG_Wide_black); }; + class ACE_NVG_Wide_Black_WP: ACE_NVG_Wide_Black { + displayName = CSTRING(NVG_Wide_black_wP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class ACE_NVG_Wide: NVGoggles { author = ECSTRING(common,ACETeam); modelOptics = QPATHTOF(models\ACE_nvg_wide_optics); displayName = CSTRING(NVG_Wide_brown); }; + class ACE_NVG_Wide_WP: ACE_NVG_Wide { + displayName = CSTRING(NVG_Wide_brown_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; class ACE_NVG_Wide_Green: NVGoggles_INDEP { author = ECSTRING(common,ACETeam); modelOptics = QPATHTOF(models\ACE_nvg_wide_optics); displayName = CSTRING(NVG_Wide_green); }; + class ACE_NVG_Wide_Green_WP: ACE_NVG_Wide_Green { + displayName = CSTRING(NVG_Wide_green_WP); + descriptionShort = CSTRING(NVG_WP_desc); + NVG_WHITE_PRESET; + }; // Examples of different goggle effect types (scope=1) diff --git a/addons/nightvision/XEH_PREP.hpp b/addons/nightvision/XEH_PREP.hpp index c212d22b18..988cfaa623 100644 --- a/addons/nightvision/XEH_PREP.hpp +++ b/addons/nightvision/XEH_PREP.hpp @@ -10,3 +10,4 @@ PREP(pfeh); PREP(refreshGoggleType); PREP(scaleCtrl); PREP(setupDisplayEffects); +PREP(statTextStatement_NVGeneration); diff --git a/addons/nightvision/XEH_postInit.sqf b/addons/nightvision/XEH_postInit.sqf index 77187b2d7c..9bfee4d166 100644 --- a/addons/nightvision/XEH_postInit.sqf +++ b/addons/nightvision/XEH_postInit.sqf @@ -31,6 +31,7 @@ GVAR(isUsingMagnification) = false; ["cameraView", LINKFUNC(onCameraViewChanged), true] call CBA_fnc_addPlayerEventHandler; ["vehicle", LINKFUNC(refreshGoggleType), false] call CBA_fnc_addPlayerEventHandler; ["turret", LINKFUNC(refreshGoggleType), true] call CBA_fnc_addPlayerEventHandler; + ["ACE_controlledUAV", LINKFUNC(refreshGoggleType)] call CBA_fnc_addEventHandler; // handle only brightness if effects are disabled GVAR(ppEffectNVGBrightness) = ppEffectCreate ["ColorCorrections", 1236]; diff --git a/addons/nightvision/config.cpp b/addons/nightvision/config.cpp index f416af9d38..9028e6951e 100644 --- a/addons/nightvision/config.cpp +++ b/addons/nightvision/config.cpp @@ -13,8 +13,11 @@ class CfgPatches { "ACE_NVG_Gen2", /*"ACE_NVG_Gen3",*/ "ACE_NVG_Gen4_Black", + "ACE_NVG_Gen4_Black_WP", "ACE_NVG_Gen4", + "ACE_NVG_Gen4_WP", "ACE_NVG_Gen4_Green", + "ACE_NVG_Gen4_Green_WP", "ACE_NVG_Wide_Black", "ACE_NVG_Wide", "ACE_NVG_Wide_Green" @@ -34,3 +37,4 @@ class CfgPatches { #include "CfgWeapons.hpp" #include "ACE_Settings.hpp" #include "RscTitles.hpp" +#include "ACE_Arsenal_Stats.hpp" diff --git a/addons/nightvision/functions/fnc_pfeh.sqf b/addons/nightvision/functions/fnc_pfeh.sqf index 794fe9b555..2cc8e1bc47 100644 --- a/addons/nightvision/functions/fnc_pfeh.sqf +++ b/addons/nightvision/functions/fnc_pfeh.sqf @@ -140,7 +140,7 @@ if (CBA_missionTime < GVAR(nextEffectsUpdate)) then { // ColorCorrections - Changes brightness, contrast and "green" color of nvg // Params: [brightness(0..2), contrast(0..inf), offset(-x..+x), blendArray, colorizeArray, weightArray] GVAR(ppeffectColorCorrect) = ppEffectCreate ["ColorCorrections", 2003]; - GVAR(ppeffectColorCorrect) ppEffectAdjust [_brightFinal, _contrastFinal, 0, [0.0, 0.0, 0.0, 0.0], [1.3, 1.2, 0.0, 0.9], [6, 1, 1, 0.0]]; + GVAR(ppeffectColorCorrect) ppEffectAdjust [_brightFinal, _contrastFinal, GVAR(nvgOffset), GVAR(nvgBlend), GVAR(nvgColorize), GVAR(nvgWeight)]; GVAR(ppeffectColorCorrect) ppEffectCommit 0; GVAR(ppeffectColorCorrect) ppEffectForceInNVG true; GVAR(ppeffectColorCorrect) ppEffectEnable true; diff --git a/addons/nightvision/functions/fnc_refreshGoggleType.sqf b/addons/nightvision/functions/fnc_refreshGoggleType.sqf index 6bb9e35fdb..6d8ce8ef46 100644 --- a/addons/nightvision/functions/fnc_refreshGoggleType.sqf +++ b/addons/nightvision/functions/fnc_refreshGoggleType.sqf @@ -26,7 +26,9 @@ private _hideHex = true; private _nvgGen = 3; private _blurRadius = -1; -if (alive ACE_player) then { +// Adds Array of Params / Original ACE3's (ST's) by default. (NVG_GREEN_PRESET) +private _preset = getArray (configFile >> "CfgWeapons" >> "NVGoggles" >> "colorPreset"); +if ((alive ACE_player) && {isNull (ACE_controlledUAV select 0)}) then { if (((vehicle ACE_player) == ACE_player) || { // Test if we are using player's nvg or if sourced from vehicle: @@ -61,6 +63,7 @@ if (alive ACE_player) then { TRACE_1("souce: binocular",binocular ACE_player); // Source is from player's binocular (Rangefinder/Vector21bNite) private _config = configFile >> "CfgWeapons" >> (binocular ACE_player); if (isNumber (_config >> QGVAR(generation))) then {_nvgGen = getNumber (_config >> QGVAR(generation));}; + if (isArray (_config >> "colorPreset")) then {_preset = getArray (_config >> "colorPreset");}; }; TRACE_1("source: hmd",GVAR(playerHMD)); // Source is player's HMD (or possibly a NVG scope, but no good way to detect that) @@ -75,7 +78,7 @@ if (alive ACE_player) then { if (isNumber (_config >> QGVAR(bluRadius))) then {_blurRadius = getNumber (_config >> QGVAR(bluRadius));}; }; if (isNumber (_config >> QGVAR(generation))) then {_nvgGen = getNumber (_config >> QGVAR(generation));}; - + if (isArray (_config >> "colorPreset")) then {_preset = getArray (_config >> "colorPreset");}; } else { TRACE_1("source: vehicle - defaults",typeOf vehicle ACE_player); }; @@ -86,9 +89,18 @@ systemChat format ["NVG Refresh - Border: %1", _borderImage]; systemChat format ["EyeCups: %1, HideHex %2, NVGen: %3, BluRadius: %4", _eyeCups, _hideHex, _nvgGen, _blurRadius]; #endif +// Selection cancelled, params added +_preset params ["_offset", "_blend", "_colorize", "_weight"]; + GVAR(nvgBlurRadius) = _blurRadius; GVAR(nvgGeneration) = _nvgGen; +// Additional Global variables for Params transfer & supporting +GVAR(nvgOffset) = _offset; +GVAR(nvgBlend) = _blend; +GVAR(nvgColorize) = _colorize; +GVAR(nvgWeight) = _weight; + // Setup border and hex image based on NVG config: private _scale = (call EFUNC(common,getZoom)) * 1.12513; diff --git a/addons/nightvision/functions/fnc_statTextStatement_NVGeneration.sqf b/addons/nightvision/functions/fnc_statTextStatement_NVGeneration.sqf new file mode 100644 index 0000000000..0ecb8979db --- /dev/null +++ b/addons/nightvision/functions/fnc_statTextStatement_NVGeneration.sqf @@ -0,0 +1,24 @@ +#include "script_component.hpp" +/* + * Author: LinkIsGrim + * Text statement for the NV Generation stat. + * + * Arguments: + * 0: Not used + * 1: Item config path + * + * Return Value: + * Stat Text + * + * Public: No + */ + +params ["", "_config"]; +TRACE_1("statTextStatement_nvGeneration",_config); + +private _gen = 3; // Default +if (isNumber (_config >> QGVAR(generation))) then { + _gen = getNumber (_config >> QGVAR(generation)); +}; + +format [localize LSTRING(statGen), _gen]; diff --git a/addons/nightvision/script_component.hpp b/addons/nightvision/script_component.hpp index 7f80b1b4fa..2bf48a8d05 100644 --- a/addons/nightvision/script_component.hpp +++ b/addons/nightvision/script_component.hpp @@ -19,6 +19,9 @@ // Effect Settings / Magic values to tweak: +#define NVG_GREEN_PRESET colorPreset[] = {0, {0.0, 0.0, 0.0, 0.0}, {1.3, 1.2, 0.0, 0.9}, {6, 1, 1, 0.0}} +#define NVG_WHITE_PRESET colorPreset[] = {0.0, {0.0, 0.0, 0.0, 0.0}, {1.1, 0.8, 1.9, 0.9}, {1, 1, 6, 0.0}} + // Decreases fog when in air vehicles #define ST_NVG_AIR_FOG_MULTIPLIER 0.5 diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index 62c6a59bad..3b5b548451 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -117,6 +117,14 @@ 夜視鏡 (三代, 棕色) GG Gözlüğü (3. Jen Kahverengi)
+ + NV Goggles (Gen3, Brown, WP) + 暗視装置 (第3世代、ブラウン) + + + Night Vision Goggles, White Phosphor + 暗視装置、白色蛍光体 + NV Goggles (Gen3, Green) Noktovizor (Gen3, zelený) @@ -134,6 +142,10 @@ 夜視鏡 (三代, 綠色) GG Gözlüğü (3. Jen Yeşil) + + NV Goggles (Gen3, Green, WP) + 暗視装置 (第3世代、グリーン、白色蛍光) + NV Goggles (Gen3, Black) Noktovizor (Gen3, černý) @@ -151,6 +163,10 @@ 夜視鏡 (三代, 黑色) GG Gözlüğü (3. Jen Siyah) + + NV Goggles (Gen3, Black, WP) + 暗視装置 (第3世代、ブラック、白色蛍光) + NV Goggles (Gen4, Brown) JVN (Gen4, marron) @@ -162,6 +178,10 @@ 야투경 (4세대, 갈색) Gafas de visión nocturna (Gen4, Marrón) + + NV Goggles (Gen4, Brown, WP) + 暗視装置 (第4世代、ブラウン、白色蛍光) + NV Goggles (Gen4, Black) JVN (Gen4, noires) @@ -173,6 +193,10 @@ 야투경 (4세대, 검정색) Gafas de visión nocturna (Gen4, Negro) + + NV Goggles (Gen4, Black, WP) + 暗視装置 (第3世代、ブラック、白色蛍光) + NV Goggles (Gen4, Green) JVN (Gen4, vertes) @@ -184,6 +208,10 @@ 야투경 (4세대, 녹색) Gafas de visión nocturna (Gen4, Verde) + + NV Goggles (Gen4, Green, WP) + 暗視装置 (第3世代、グリーン、白色蛍光) + NV Goggles (Wide, Brown) JVN (Large, marron) @@ -195,6 +223,10 @@ 야투경 (넓음, 갈색) Gafas de visión nocturna (Panorámicas, Marrón) + + NV Goggles (Wide, Brown, WP) + 暗視装置 (ワイド、ブラウン、白色蛍光) + NV Goggles (Wide, Black) JVN (Large, noires) @@ -206,6 +238,10 @@ 야투경 (넓음, 검정색) Gafas de visión nocturna (Panorámicas, Negro) + + NV Goggles (Wide, Black, WP) + 暗視装置 (ワイド、ブラック、白色蛍光) + NV Goggles (Wide, Green) JVN (Large, vertes) @@ -217,6 +253,10 @@ 야투경 (넓음, 녹색) Gafas de visión nocturna (Panorámicas, Verde) + + NV Goggles (Wide, Green, WP) + 暗視装置 (ワイド、グリーン、白色蛍光) + Brightness: %1 Helligkeit: %1 @@ -393,7 +433,7 @@ Aim Down Sights Blur - 照準器を覗く時にぼかし + 照準時のぼかし効果 Visierunschärfe 瞄準具模糊程度 瞄准具模糊程度 @@ -466,5 +506,13 @@ Efecto obturador por los fogonazos de la boca del cañón 총구화염에 의한 셔터효과를 구현합니다 + + Night Vision Generation + 暗視装置の世代 + + + Gen %1 + 第%1世代 + diff --git a/addons/novehicleclanlogo/stringtable.xml b/addons/novehicleclanlogo/stringtable.xml index 7dddfc4f59..a611d7ba5c 100644 --- a/addons/novehicleclanlogo/stringtable.xml +++ b/addons/novehicleclanlogo/stringtable.xml @@ -7,6 +7,7 @@ 차량에서 클랜 로고 제거 Убрать логотип кланов с техники Suprimir logo del clan de los vehículos + 乗り物から部隊ロゴを削除
Prevents clan logo from being displayed on vehicles controlled by players. @@ -14,6 +15,7 @@ 플레이어가 조종하는 차량에 클랜 로고가 표시되지 않도록 합니다. Не отображать логотипы кланов на технике контроллируемой игроками. Previene que se muestre el logo del clan en los vehículos controlados por jugadores. + プレイヤーが操作する乗り物に部隊ロゴが表示されないようにする。 diff --git a/addons/parachute/functions/fnc_cutParachute.sqf b/addons/parachute/functions/fnc_cutParachute.sqf index 711a8ddb80..b98620c3ed 100644 --- a/addons/parachute/functions/fnc_cutParachute.sqf +++ b/addons/parachute/functions/fnc_cutParachute.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: joko, Jonas, SilentSpike + * Author: joko, Jonas, kymckay * Perform the cut parachute action (move unit out and delete) * * Arguments: diff --git a/addons/parachute/functions/fnc_handleReserve.sqf b/addons/parachute/functions/fnc_handleReserve.sqf index 370da43f3a..5a6a096c9a 100644 --- a/addons/parachute/functions/fnc_handleReserve.sqf +++ b/addons/parachute/functions/fnc_handleReserve.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: joko, Jonas, SilentSpike + * Author: joko, Jonas, kymckay * Cache reserve parachute on player unit when their inventory changes and add it when they open their parachute * * Arguments: diff --git a/addons/pylons/stringtable.xml b/addons/pylons/stringtable.xml index d8286e4cb3..efdb7ab271 100644 --- a/addons/pylons/stringtable.xml +++ b/addons/pylons/stringtable.xml @@ -18,7 +18,7 @@ Loadouts for %1 - %1の兵装 + %1 の兵装 Armamenti per %1 %1用的武裝配置 %1用的武器配置 @@ -94,7 +94,7 @@ %1 is already configuring this aircraft! - %1はすでにこの機体へ設定されています! + %1 はすでにこの機体へ設定されています! % sta già configurando questo aereo! %1已經正在定義此飛機的武裝配置! %1已经正在定义此飞机的武器配置! @@ -109,7 +109,7 @@ Replacing pylon %1 out of %2... - パイロン%1を作業し残り%2・・・ + %2 中 %1 のパイロンを交換しています・・・ Sostituendo pilone %1 al posto di %2... 共有%2個派龍架,正在整補%1號派龍架中... 共有%2个发射架,正在整装%1号挂架... @@ -124,7 +124,7 @@ Stopped at pylon %1! - パイロン%1で停止しました! + パイロン %1 で中断しました! Fermato al pilone %1! 已停止在%1號派龍架! 已在整装%1号挂架时停止! diff --git a/addons/realisticnames/addon.toml b/addons/realisticnames/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/realisticnames/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/realisticnames/config.cpp b/addons/realisticnames/config.cpp index e8f4afae46..e98d18f0b6 100644 --- a/addons/realisticnames/config.cpp +++ b/addons/realisticnames/config.cpp @@ -1,5 +1,12 @@ #include "script_component.hpp" +#if __has_include("\z\ace\addons\norealisticnames\script_component.hpp") +#define PATCH_SKIP "No Realistic Names" +#endif + +#ifdef PATCH_SKIP +ACE_PATCH_NOT_LOADED(ADDON,PATCH_SKIP) +#else class CfgPatches { class ADDON { name = COMPONENT_NAME; @@ -20,3 +27,5 @@ class CfgPatches { #include "CfgMagazines.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" + +#endif diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 9f474e68ef..efce83a658 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -114,7 +114,7 @@ Lança-mísseis Mini-Spike (AC) Mini-Spike rakétarendszer (Tankelhárító) Lanciatore Mini-Spike (AC) - ミニスパイク ランチャー (対戦) + ミニスパイク ランチャー (対戦車) 스파이크 미사일 발사기 (대전차) "迷你長釘"導彈發射器 (反坦克) "迷你长钉"(反坦) @@ -369,7 +369,7 @@ HEMTT Transporte HEMTT szállítójármű HEMTT da trasporto - HEMTT 輸送型 + HEMTT 輸送 HEMTT 수송 重型增程機動戰術卡車 (運輸) HEMTT(运输) @@ -386,7 +386,7 @@ HEMTT Transporte (coberto) HEMTT szállítójármű (ponyvás) HEMTT da trasporto (coperto) - HEMTT 輸送型 (幌) + HEMTT 輸送 (幌) HEMTT 수송 (덮개) 重型增程機動戰術卡車 (運輸, 棚布) HEMTT(运输,棚布) @@ -420,7 +420,7 @@ HEMTT Contêiner HEMTT (konténer) HEMTT portacontainer - HEMTT コンテナ型 + HEMTT コンテナ HEMTT 컨테이너 重型增程機動戰術卡車 (貨櫃) HEMTT(货柜) @@ -437,7 +437,7 @@ HEMTT Médico HEMTT (egészségügyi) HEMTT Medico - HEMTT 救急車 + HEMTT 衛生 HEMTT 의료 重型增程機動戰術卡車 (醫療) HEMTT(医疗) @@ -454,7 +454,7 @@ HEMTT Munições HEMTT (lőszerszállító) HEMTT di rifornimento munizioni - HEMTT 弾薬給弾型 + HEMTT 弾薬 HEMTT 탄약 重型增程機動戰術卡車 (彈藥) HEMTT(弹药) @@ -471,7 +471,7 @@ HEMTT Combustível HEMTT (üzemanyag-szállító) HEMTT di rifornimento carburante - HEMTT 燃料給油車 + HEMTT 燃料 HEMTT 연료 重型增程機動戰術卡車 (燃油) HEMTT(燃油) @@ -488,7 +488,7 @@ HEMTT Reparador HEMTT (szerelő-jármű) HEMTT Riparatore - HEMTT 修理型 + HEMTT 修理 HEMTT 수리 重型增程機動戰術卡車 (維修) HEMTT(维修) @@ -607,7 +607,7 @@ KamAZ Transporte KamAZ szállítójármű KamAZ da trasporto - KamAZ 輸送型 + KamAZ 輸送 카마즈 수송 "卡瑪斯"卡車 (運輸) "卡玛兹"(运输) @@ -624,7 +624,7 @@ KamAZ Transporte (coberto) KamAZ szállítójármű (ponyvás) KamAZ da trasporto (coperto) - KamAZ 輸送型 (幌) + KamAZ 輸送 (幌) 카마즈 수송 (덮개) "卡瑪斯"卡車 (運輸, 棚布) "卡玛兹"(运输,棚布) @@ -641,7 +641,7 @@ KamAZ Munições KamAZ (lőszerszállító) KamAZ di rifornimento munizioni - KamAZ 弾薬給弾型 + KamAZ 弾薬 카마즈 탄약 "卡瑪斯"卡車 (彈藥) "卡玛兹"(弹药) @@ -658,7 +658,7 @@ KamAZ Combustível KamAZ (üzemanyag-szállító) KamAZ di rifornimento carburante - KamzAZ 燃料給油車 + KamAZ 燃料 카마즈 연료 "卡瑪斯"卡車 (燃油) "卡玛兹"(燃油) @@ -675,7 +675,7 @@ KamAZ Reparador KamAZ (szerelő-jármű) KamAZ riparatore - KamzAZ 修理型 + KamAZ 修理 카마즈 수리 "卡瑪斯"卡車 (維修) "卡玛兹"(维修) @@ -692,7 +692,7 @@ KamAZ Médico KamAZ (egészségügyi) KamAZ Medico - KamAZ 救急車 + KamAZ 衛生 카마즈 의료 "卡瑪斯"卡車 (醫療) "卡玛兹"(医疗) @@ -861,7 +861,7 @@ Typhoon Transporte Typhoon szállítójármű Typhoon da trasporto - タイフーン 輸送型 + タイフーン 輸送 타이푼 수송 "颱風"卡車 (運輸) "台风"(运输) @@ -878,7 +878,7 @@ Typhoon Transporte (coberto) Typhoon szállítójármű (ponyvás) Typhoon da trasporto (coperto) - タイフーン 輸送型 (幌) + タイフーン 輸送 (幌) 타이푼 수송 (덮개) "颱風"卡車 (運輸, 棚布) "台风"(运输,棚布) @@ -895,7 +895,7 @@ Typhoon Dispositivo Typhoon (eszköz) Typhoon per dispositivo - タイフーン デバイス型 + タイフーン デバイス 타이푼 장치 "颱風"卡車 (精密設備) "台风"(装置) @@ -912,7 +912,7 @@ Typhoon Munições Typhoon (lőszerszállító) Typhoon di rifornimento munizioni - タイフーン 弾薬給弾型 + タイフーン 弾薬 타이푼 탄약 "颱風"卡車 (彈藥) "台风"(弹药) @@ -929,7 +929,7 @@ Typhoon Combustível Typhoon (üzemanyag-szállító) Typhoon di rifornimento carburante - タイフーン 燃料給油車 + タイフーン 燃料 타이푼 연료 "颱風"卡車 (燃油) "台风"(燃油) @@ -946,7 +946,7 @@ Typhoon Reparador Typhoon (szerelő-jármű) Typhoon riparatore - タイフーン 修理型 + タイフーン 修理 타이푼 수리 "颱風"卡車 (維修) "台风"(维修) @@ -963,7 +963,7 @@ Typhoon Médico Typhoon (egészségügyi) Typhoon medico - タイフーン 救急車 + タイフーン 衛生 타이푼 의료 "颱風"卡車 (醫療) "台风"(医疗) @@ -1216,7 +1216,7 @@ Ka-60 Kasatka (preto e branco) Ka-60 Касатка (чёрно-белый) Ka-60 Kasatka (blanco y negro) - Ka-60 カサートカ (黒 & 白) + Ka-60 カサートカ (黒 & 白) Ka-60 카사트카 (검정 및 하양) Ka-60 "逆戟鯨"直升機 (黑&白) Ka-60 "虎鲸"(黑白) @@ -1783,7 +1783,7 @@ Mini-Spike (ПТРК) Mini-Spike (AT) Mini-Spike (AT) - ミニスパイク (対地) + ミニスパイク (対戦車) 스파이크 미사일 (대전차) "迷你長釘"導彈發射器 (反坦克) "迷你长钉"(反坦) @@ -1884,7 +1884,7 @@ MX (Cáqui) MX (카키) MX(卡其色) - MX(カーキ) + MX (カーキ) MX (Haki) @@ -1934,7 +1934,7 @@ MXC (Cáqui) MXC (카키) MXC(卡其色) - MXC(カーキ) + MXC (カーキ) MXC (Haki) @@ -1984,7 +1984,7 @@ MX 3GL (Cáqui) MX 3GL (카키) MX 3GL(卡其色) - MX 3GL(カーキ) + MX 3GL (カーキ) MX 3GL (Haki) @@ -2034,7 +2034,7 @@ MX LSW (Cáqui) MX LSW (카키) MX LSW(卡其色) - MX LSW(カーキ) + MX LSW (カーキ) MX LSW (Haki) @@ -2084,7 +2084,7 @@ MXM (Cáqui) MXM (카키) MXM(卡其色) - MXM(カーキ) + MXM (カーキ) MXM (Haki) @@ -3620,7 +3620,7 @@ "北极星"("迷你长钉"反坦) "北極星"先進佈署越野車("迷你長釘"反坦克導彈發射器) Polaris DAGOR (Mini-Spike AT) - ポラリス DAGOR (ミニスパイク対戦) + ポラリス DAGOR (ミニスパイク 対戦車) Polaris DAGOR (Mini-Spike AT) Polaris DAGOR (ПТ Mini-Spike) Polaris DAGOR (Mini-Spike AT) diff --git a/addons/rearm/Cfg3DEN.hpp b/addons/rearm/Cfg3DEN.hpp index 05581e7206..e5e52dbcd0 100644 --- a/addons/rearm/Cfg3DEN.hpp +++ b/addons/rearm/Cfg3DEN.hpp @@ -1,6 +1,6 @@ +#define VANILLA_REARMCARGO (if (getAmmoCargo _this > 0) then {getAmmoCargo _this} else {-1}) #define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default}) -#define DEFAULT_REARMCARGO GET_NUMBER(configOf _this >> QQGVAR(defaultSupply),-1) - +#define DEFAULT_REARMCARGO GET_NUMBER(configOf _this >> 'GVAR(defaultSupply)',VANILLA_REARMCARGO) class Cfg3DEN { class Object { diff --git a/addons/rearm/CfgVehicles.hpp b/addons/rearm/CfgVehicles.hpp index 221b01b249..9d36d5baae 100644 --- a/addons/rearm/CfgVehicles.hpp +++ b/addons/rearm/CfgVehicles.hpp @@ -102,66 +102,51 @@ class CfgVehicles { class Truck_03_base_F; class O_Truck_03_ammo_F: Truck_03_base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class Truck_02_base_F; class Truck_02_Ammo_base_F: Truck_02_base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class B_Truck_01_mover_F; class B_Truck_01_ammo_F: B_Truck_01_mover_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class B_APC_Tracked_01_base_F; class B_APC_Tracked_01_CRV_F: B_APC_Tracked_01_base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class Heli_Transport_04_base_F; class O_Heli_Transport_04_ammo_F: Heli_Transport_04_base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class Pod_Heli_Transport_04_base_F; class Land_Pod_Heli_Transport_04_ammo_F: Pod_Heli_Transport_04_base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; class Slingload_01_Base_F; class B_Slingload_01_Ammo_F: Slingload_01_Base_F { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; - class ReammoBox_F; - class NATO_Box_Base: ReammoBox_F {}; + class NATO_Box_Base; class Box_NATO_AmmoVeh_F: NATO_Box_Base { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; - class EAST_Box_Base: ReammoBox_F {}; + class EAST_Box_Base; class Box_East_AmmoVeh_F: EAST_Box_Base { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; - class IND_Box_Base: ReammoBox_F {}; + class IND_Box_Base; class Box_IND_AmmoVeh_F: IND_Box_Base { - transportAmmo = 0; GVAR(defaultSupply) = 1200; }; - class Box_IND_AmmoOrd_F; - class Box_IDAP_AmmoOrd_F: Box_IND_AmmoOrd_F { - transportAmmo = 0; // not sure why this one has 240 - }; // Dummy Vehicles class ThingX; diff --git a/addons/rearm/XEH_postInit.sqf b/addons/rearm/XEH_postInit.sqf index 3a6d72fcbe..f156fb71d6 100644 --- a/addons/rearm/XEH_postInit.sqf +++ b/addons/rearm/XEH_postInit.sqf @@ -1,33 +1,45 @@ #include "script_component.hpp" +GVAR(hardpointGroupsCache) = [] call CBA_fnc_createNamespace; GVAR(configTypesAdded) = []; -["CBA_settingsInitialized", { - TRACE_2("settingsInit",GVAR(level),GVAR(supply)); - ["LandVehicle", "Init", {_this call FUNC(initSupplyVehicle)}, true, ["StaticWeapon"], true] call CBA_fnc_addClassEventHandler; - ["ReammoBox_F", "Init", {_this call FUNC(initSupplyVehicle)}, true, [], true] call CBA_fnc_addClassEventHandler; -}] call CBA_fnc_addEventHandler; +GVAR(magazineNameCache) = [] call CBA_fnc_createNamespace; +GVAR(originalMagazineNames) = []; -["ace_unconscious", LINKFUNC(handleUnconscious)] call CBA_fnc_addEventHandler; [QGVAR(initSupplyVehicle), { TRACE_1("initSupplyVehicle EH",_this); // Warning: this can run before settings are init [FUNC(initSupplyVehicle), _this] call EFUNC(common,runAfterSettingsInit); }] call CBA_fnc_addEventHandler; -["vehicle", { - params ["_unit"]; - [_unit] call FUNC(dropAmmo); -}] call CBA_fnc_addPlayerEventHandler; +["CBA_settingsInitialized", { + TRACE_3("settingsInit",GVAR(enabled),GVAR(level),GVAR(supply)); -if (isServer) then { - addMissionEventHandler ["HandleDisconnect", {params ["_unit"]; [_unit] call FUNC(dropAmmo)}]; -}; + // need these events before enabled check for zeus rearm + [QGVAR(rearmEntireVehicleSuccessEH), LINKFUNC(rearmEntireVehicleSuccess)] call CBA_fnc_addEventHandler; + [QGVAR(rearmEntireVehicleSuccessLocalEH), LINKFUNC(rearmEntireVehicleSuccessLocal)] call CBA_fnc_addEventHandler; + [QGVAR(makeDummyEH), LINKFUNC(makeDummy)] call CBA_fnc_addEventHandler; + [QGVAR(rearmSuccessEH), LINKFUNC(rearmSuccess)] call CBA_fnc_addEventHandler; + [QGVAR(rearmSuccessLocalEH), LINKFUNC(rearmSuccessLocal)] call CBA_fnc_addEventHandler; -[QGVAR(makeDummyEH), LINKFUNC(makeDummy)] call CBA_fnc_addEventHandler; -[QGVAR(rearmEntireVehicleSuccessEH), LINKFUNC(rearmEntireVehicleSuccess)] call CBA_fnc_addEventHandler; -[QGVAR(rearmEntireVehicleSuccessLocalEH), LINKFUNC(rearmEntireVehicleSuccessLocal)] call CBA_fnc_addEventHandler; -[QGVAR(rearmSuccessEH), LINKFUNC(rearmSuccess)] call CBA_fnc_addEventHandler; -[QGVAR(rearmSuccessLocalEH), LINKFUNC(rearmSuccessLocal)] call CBA_fnc_addEventHandler; + if (!GVAR(enabled)) exitWith {}; + ["AllVehicles", "Init", LINKFUNC(initSupplyVehicle), true, ["Man", "StaticWeapon"], true] call CBA_fnc_addClassEventHandler; + ["ReammoBox_F", "Init", LINKFUNC(initSupplyVehicle), true, [], true] call CBA_fnc_addClassEventHandler; + ["House", "Init", LINKFUNC(initSupplyVehicle), true, [], true] call CBA_fnc_addClassEventHandler; -GVAR(magazineNameCache) = [] call CBA_fnc_createNamespace; -GVAR(originalMagazineNames) = []; + // placed in editor static objects don't trigger init + { + _x call FUNC(initSupplyVehicle); + } forEach allMissionObjects "Static"; + + ["ace_unconscious", LINKFUNC(handleUnconscious)] call CBA_fnc_addEventHandler; + + ["vehicle", { + params ["_unit"]; + [_unit] call FUNC(dropAmmo); + }] call CBA_fnc_addPlayerEventHandler; + + if (isServer) then { + addMissionEventHandler ["HandleDisconnect", {params ["_unit"]; [_unit] call FUNC(dropAmmo)}]; + }; + +}] call CBA_fnc_addEventHandler; diff --git a/addons/rearm/dev/test_debugConfigs.sqf b/addons/rearm/dev/test_debugConfigs.sqf index 8b61bf195f..cbe09c1f17 100644 --- a/addons/rearm/dev/test_debugConfigs.sqf +++ b/addons/rearm/dev/test_debugConfigs.sqf @@ -5,10 +5,17 @@ private _testPass = true; -INFO("Showing CfgVehicles with vanilla transportAmmo"); +INFO("Showing CfgVehicles with vanilla transportAmmo and without XEH"); + +private _badCfgVehicles = toString { + getNumber (_x >> "scope") == 2 + && {getNumber (_x >> "transportAmmo") > 0} + && {!isText (_x >> "EventHandlers" >> "CBA_Extended_EventHandlers" >> "init")} +}; + { - WARNING_2("Type [%1] needs config [transportAmmo: %2]", configName _x, getNumber (_x >> 'transportAmmo')); + diag_log text format ["Class %1: %2 [%3] needs XEH", configName _x, configName inheritsFrom _x, configSourceMod _x]; _testPass = false; -} forEach (configProperties [configFile >> "CfgVehicles", "(isClass _x) && {(getNumber (_x >> 'transportAmmo')) > 0}", true]); +} forEach (_badCfgVehicles configClasses (configFile >> "CfgVehicles")); _testPass diff --git a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf index 37b642222a..2fd907ff6f 100644 --- a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf +++ b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf @@ -27,7 +27,7 @@ TRACE_2("addVehicleMagazinesToSupply",_truck,_vehicle); if (isNull _truck) exitWith {}; if (_vehicle isEqualType objNull) then {_vehicle = typeOf _vehicle}; if (_vehicle == "") exitWith { - ERROR_1("VehicleType [%1] is empty in ace_rearm_fnc_addVehicleMagazinesToSupply",_string); + ERROR_1("VehicleType [%1] is empty in ace_rearm_fnc_addVehicleMagazinesToSupply",_vehicle); }; private _turrets = [_vehicle] call FUNC(getAllRearmTurrets); { diff --git a/addons/rearm/functions/fnc_initSupplyVehicle.sqf b/addons/rearm/functions/fnc_initSupplyVehicle.sqf index e748062e65..efd181388f 100644 --- a/addons/rearm/functions/fnc_initSupplyVehicle.sqf +++ b/addons/rearm/functions/fnc_initSupplyVehicle.sqf @@ -15,16 +15,26 @@ * Public: No */ -if (!hasInterface) exitWith {}; // For now we just add actions, so no need non-clients +if (!GVAR(enabled)) exitWith {}; params ["_vehicle"]; + private _typeOf = typeOf _vehicle; private _configOf = configOf _vehicle; TRACE_2("initSupplyVehicle",_vehicle,_typeOf); +if (local _vehicle && {getAmmoCargo _vehicle > 0}) then { + _vehicle setAmmoCargo 0; +}; + +if (!hasInterface) exitWith {}; // For now we just add actions, so no need non-clients + if (!alive _vehicle) exitWith {}; private _configSupply = getNumber (_configOf >> QGVAR(defaultSupply)); +if (_configSupply == 0) then { + _configSupply = getNumber (_config >> "transportAmmo"); +}; private _isSupplyVehicle = _vehicle getVariable [QGVAR(isSupplyVehicle), false]; private _oldRearmConfig = isClass (_configOf >> "ACE_Actions" >> "ACE_MainActions" >> QGVAR(takeAmmo)); TRACE_3("",_configSupply,_isSupplyVehicle,_oldRearmConfig); diff --git a/addons/rearm/functions/fnc_isSource.sqf b/addons/rearm/functions/fnc_isSource.sqf index 93f45be6a1..fc37d905c5 100644 --- a/addons/rearm/functions/fnc_isSource.sqf +++ b/addons/rearm/functions/fnc_isSource.sqf @@ -4,8 +4,7 @@ * Returns if vehicle or object is a rearm source. * * Arguments: - * 0: target - * 1: check for vanilla rearm vehicle (default: false) + * 0: Target * * Return Value: * None @@ -15,10 +14,7 @@ * * Public: Yes */ -params [ - ["_target", objNull, [objNull]], - ["_testVanillaRearm", false, [false]] - ]; +params [["_target", objNull, [objNull]]]; if ((_target getVariable [QGVAR(currentSupply), 0]) < 0) exitWith {false}; @@ -27,4 +23,4 @@ private _vanillaCargoConfig = getNumber (_vehCfg >> "transportAmmo"); private _rearmCargoConfig = getNumber (_vehCfg >> QGVAR(defaultSupply)); private _supplyVehicle = _target getVariable [QGVAR(isSupplyVehicle), false]; -_rearmCargoConfig > 0 || {_supplyVehicle} || {_testVanillaRearm && _vanillaCargoConfig > 0} +_rearmCargoConfig > 0 || {_supplyVehicle} || {_vanillaCargoConfig > 0} diff --git a/addons/rearm/functions/fnc_makeSource.sqf b/addons/rearm/functions/fnc_makeSource.sqf index 51aa515cdf..3084871efc 100644 --- a/addons/rearm/functions/fnc_makeSource.sqf +++ b/addons/rearm/functions/fnc_makeSource.sqf @@ -41,7 +41,11 @@ private _currentSupply = if (_addToCurrent) then { _source setVariable [QGVAR(currentSupply), _currentSupply + _rearmCargo, true]; -private _rearmCargoConfig = getNumber (configOf _source >> QGVAR(defaultSupply)); +private _config = configOf _source; +private _rearmCargoConfig = getNumber (_config >> QGVAR(defaultSupply)); +if (_rearmCargoConfig == 0) then { + _rearmCargoConfig = getNumber (_config >> "transportAmmo"); +}; // initialize if it's not a config rearm vehicle if (!(_rearmCargoConfig > 0 && _source getVariable [QGVAR(isSupplyVehicle), false])) then { diff --git a/addons/rearm/initSettings.sqf b/addons/rearm/initSettings.sqf index c2d6136bd7..d83ac3c760 100644 --- a/addons/rearm/initSettings.sqf +++ b/addons/rearm/initSettings.sqf @@ -1,7 +1,19 @@ +private _category = [LELSTRING(OptionsMenu,CategoryLogistics), LLSTRING(DisplayName)]; + +[ + QGVAR(enabled), "CHECKBOX", + ELSTRING(common,Enabled), + _category, + true, + true, + {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true +] call CBA_fnc_addSetting; + [ QGVAR(level), "LIST", [LSTRING(RearmSettings_level_DisplayName), LSTRING(RearmSettings_level_Description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize LSTRING(DisplayName)], + _category, [[0,1,2],[LSTRING(RearmSettings_vehicle), LSTRING(RearmSettings_magazine), LSTRING(RearmSettings_caliber)],0], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(level), _this] call EFUNC(common,cbaSettings_settingChanged)} @@ -10,7 +22,7 @@ [ QGVAR(supply), "LIST", [LSTRING(RearmSettings_supply_DisplayName), LSTRING(RearmSettings_supply_Description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize LSTRING(DisplayName)], + _category, [[0,1,2],[LSTRING(RearmSettings_unlimited), LSTRING(RearmSettings_limited), LSTRING(RearmSettings_magazineSupply)],0], // [values, titles, defaultIndex] true, // isGlobal {[QGVAR(supply), _this] call EFUNC(common,cbaSettings_settingChanged)} @@ -18,8 +30,8 @@ [ QGVAR(distance), "SLIDER", - [localize LSTRING(RearmSettings_distance_DisplayName), localize LSTRING(RearmSettings_distance_Description)], - [localize ELSTRING(OptionsMenu,CategoryLogistics), localize LSTRING(DisplayName)], + [LLSTRING(RearmSettings_distance_DisplayName), LLSTRING(RearmSettings_distance_Description)], + _category, [10, 50, 20, 0], true, // isGlobal {[QGVAR(supply), _this] call EFUNC(common,cbaSettings_settingChanged)} diff --git a/addons/rearm/stringtable.xml b/addons/rearm/stringtable.xml index 8aa42344b4..88be22aae3 100644 --- a/addons/rearm/stringtable.xml +++ b/addons/rearm/stringtable.xml @@ -215,7 +215,7 @@ Checking remaining ammunition... Überprüfe verbleibende Munition... Controllando le munizioni rimanenti - 残弾薬を確認中… + 残弾薬を確認中・・・ 正在检查剩余的弹药... 正在檢查剩餘的彈藥中... Sprawdzanie ilości amunicji... @@ -230,7 +230,7 @@ There is ammunition worth %1 points left. Es ist noch Munition für %1 Punkte übrig. E' presente una penalità delle munizioni %1 punti rimanenti. - 弾薬は%1残っています。 + 弾薬は %1 残っています。 还剩下%1多的弹药。 還剩下%1多的彈藥. Pozostało %1 punktów amunicji. @@ -245,7 +245,7 @@ The following ammunition is left:%1 Folgende Munition ist übrig:%1 Mancano le seguenti:%1 - この弾薬の残りは:%1 + この弾薬の残りは: %1 以下剩余的弹药:%1 以下剩餘的彈藥:%1 Pozostała amunicja: %1 @@ -297,7 +297,7 @@ Riarmando %1 con %2... Rearmando %1 con %2... Réarmement de %1 avec %2... - %1に%2を再武装中… + %1 に %2 を再武装中・・・ %2을 %1에 재보급 중... 正在整装%2到%1... %2正整裝到%1中... @@ -312,7 +312,7 @@ Riarmando %1... Rearmando %1... Réarmement de %1... - %1を再武装中… + %1 を再武装中・・・ %1 재보급 중... 正在整装%1... 整裝%1中... @@ -327,7 +327,7 @@ Sto prendendo %1 per %2... Tomando %1 para %2... Prise de %1 pour %2... - %1を%2用として取得中… + %1 を %2 用として取得中・・・ %2를 위해 %1 가져오는 중... 正在拿取%1给%2... 拿取%1給%2中... @@ -389,7 +389,7 @@ Sto riponendo %1 in %2... Guardando %1 en %2... Stocke %1 dans %2... - %1を%2へ格納中… + %1 を %2 へ格納中・・・ %2에 %1 보관 중... 正在储存%1到%2... 儲存%1到%2中... @@ -403,7 +403,7 @@ Sto raccogliendo le munizioni... Levantando munición... Ramassage des munitions... - 弾薬を拾得中… + 弾薬を拾得中・・・ 탄약 줍는 중... 正在捡起弹药... 撿起彈藥中... diff --git a/addons/refuel/stringtable.xml b/addons/refuel/stringtable.xml index 7afbdba62b..a8b0e672aa 100644 --- a/addons/refuel/stringtable.xml +++ b/addons/refuel/stringtable.xml @@ -53,11 +53,13 @@ Cargo Flow Rate 화물 주유량 Caudal de llenado de la carga + 貨物流量 How fast should a fuel source's tank be filled? 연료 공급처의 저장 탱크를 얼마나 빨리 채웁니까? Cómo de rápido puede llenarse una fuente de combustible. + どのくらいの速さで給油源へ給油しますか? Refuel @@ -304,6 +306,7 @@ Betankung beginnen (Container) 연료 재급유 시작 (컨테이너) Iniciando repostado (contenedor) + 給油を始める (コンテナ) Couldn't turn on fuel nozzle @@ -503,6 +506,7 @@ 펌프/호스 상호작용 시간 Время взаимодействия со шлангом Tiempo de interacción con la Bomba/Manguera + ポンプとホースのインタラクション時間 How long refuel interactions take in seconds. @@ -510,6 +514,7 @@ 연료 재보급 상호작용에 걸리는 시간(초)입니다. Время в секундах, которое занимает взаимодействие со шлангом. Cuanto tiempo en segundos tardan las interacciones de repostado. + 燃料補給にかかる時間 (秒) Fuel Cargo Volume diff --git a/addons/reload/ACE_UI.hpp b/addons/reload/ACE_UI.hpp index cfc2a26f9c..6dae3e5147 100644 --- a/addons/reload/ACE_UI.hpp +++ b/addons/reload/ACE_UI.hpp @@ -1,7 +1,7 @@ class ACE_UI { class ammoCount { class conditions { - ADDON = "cameraOn == (getConnectedUAV ACE_player)"; + ADDON = "false"; }; }; }; diff --git a/addons/reload/CfgEventHandlers.hpp b/addons/reload/CfgEventHandlers.hpp index 13d082c8bf..f76ea983d1 100644 --- a/addons/reload/CfgEventHandlers.hpp +++ b/addons/reload/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); diff --git a/addons/reload/CfgVehicles.hpp b/addons/reload/CfgVehicles.hpp index f6723510e0..ff0df195d3 100644 --- a/addons/reload/CfgVehicles.hpp +++ b/addons/reload/CfgVehicles.hpp @@ -14,16 +14,16 @@ class CfgVehicles { class ACE_Actions { class ACE_Weapon { - class GVAR(LinkBelt) { - displayName = CSTRING(LinkBelt); - distance = 2.0; + class GVAR(linkBelt) { + displayName = CSTRING(linkBelt); + distance = 2; condition = QUOTE(([ARR_2(_player, _target)] call FUNC(getAmmoToLinkBelt)) > 0); statement = QUOTE([ARR_2(_player, _target)] call FUNC(startLinkingBelt)); exceptions[] = {"isNotInside"}; }; - class GVAR(CheckAmmo) { + class GVAR(checkAmmo) { displayName = CSTRING(checkAmmo); - distance = 2.0; + distance = 2; condition = QUOTE(call FUNC(canCheckAmmo)); statement = QUOTE(call FUNC(checkAmmo)); exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; @@ -36,9 +36,9 @@ class CfgVehicles { class StaticWeapon: LandVehicle { class ACE_Actions { class ACE_MainActions { - class GVAR(CheckAmmo) { + class GVAR(checkAmmo) { displayName = CSTRING(checkAmmo); - distance = 2.0; + distance = 2; condition = QUOTE(call FUNC(canCheckAmmo)); statement = QUOTE(call FUNC(checkAmmo)); exceptions[] = {"isNotInside", "isNotSwimming", "isNotSitting"}; diff --git a/addons/reload/XEH_PREP.hpp b/addons/reload/XEH_PREP.hpp index 20fc53724e..578bc2ce9f 100644 --- a/addons/reload/XEH_PREP.hpp +++ b/addons/reload/XEH_PREP.hpp @@ -1,4 +1,3 @@ - PREP(canCheckAmmo); PREP(canCheckAmmoSelf); PREP(getAmmoToLinkBelt); diff --git a/addons/reload/XEH_postInit.sqf b/addons/reload/XEH_postInit.sqf index 26f7f303ff..65ce1d0b4b 100644 --- a/addons/reload/XEH_postInit.sqf +++ b/addons/reload/XEH_postInit.sqf @@ -1,63 +1,55 @@ // by esteldunedain #include "script_component.hpp" -if (!hasInterface) exitWith {}; - -// Add keybinds -["ACE3 Weapons", QGVAR(checkAmmo), localize LSTRING(checkAmmo), { - // Conditions: canInteract - if !([ACE_player, vehicle ACE_player, ["isNotInside", "isNotSwimming", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if !(ACE_player call FUNC(canCheckAmmoSelf)) exitWith {false}; - // Ignore if controlling UAV (blocks radar keybind) - if (!isNull (ACE_controlledUAV param [0, objNull])) exitWith {false}; - - // Statement - [ACE_player, ACE_player] call FUNC(checkAmmo); - true -}, {false}, [19, [false, true, false]], false] call CBA_fnc_addKeybind; - +// To propagate the setAmmo change, do it on all clients +// See https://github.com/acemod/ACE3/issues/1119 and https://feedback.bistudio.com/T167015 [QGVAR(syncAmmo), { - //To propagate the setAmmo change, do it on all clients params ["_unit", "_weapon", "_ammo"]; TRACE_3("syncAmmo EH",_unit,_weapon,_ammo); - _unit setAmmo [_weapon, _ammo]; }] call CBA_fnc_addEventHandler; // Listen for attempts to link ammo [QGVAR(ammoLinked), { - params ["_receiver", "_giver", "_magazine"]; - - private _magazineType = currentMagazine _receiver; - private _magazineCfg = configFile >> "CfgMagazines" >> _magazineType; + params ["_target", "_unit", "_magazineInfo"]; + _magazineInfo params ["_magazine", "_ammo"]; // Return the magazine if it's the wrong type - if (_magazineType != (_magazine select 0)) exitWith { - [QGVAR(ammoReturned), [_giver,_receiver,_magazine], [_giver]] call CBA_fnc_targetEvent; + if (currentMagazine _target != _magazine) exitWith { + [QGVAR(ammoReturned), [_unit, _target, _magazineInfo, false], _unit] call CBA_fnc_targetEvent; }; - private _ammoCount = _receiver ammo currentWeapon _receiver; - private _ammoMissing = getNumber (_magazineCfg >> "count") - _ammoCount; + private _currentWeapon = currentWeapon _target; + private _currentAmmo = _target ammo _currentWeapon; + private _magazineCfg = configFile >> "CfgMagazines" >> _magazine; + private _ammoMissing = getNumber (_magazineCfg >> "count") - _currentAmmo; // Return the magazine if the belt is full or empty - if ((_ammoCount == 0) || _ammoMissing == 0) exitWith { - [QGVAR(ammoReturned), [_giver,_receiver,_magazine], [_giver]] call CBA_fnc_targetEvent; + if (_currentAmmo == 0 || {_ammoMissing == 0}) exitWith { + [QGVAR(ammoReturned), [_unit, _target, _magazineInfo, false], _unit] call CBA_fnc_targetEvent; }; // Add the ammo - private _ammoAdded = _ammoMissing min (_magazine select 1); - [QGVAR(syncAmmo), [_receiver, currentWeapon _receiver, _ammoCount + _ammoAdded]] call CBA_fnc_globalEvent; + private _ammoAdded = _ammoMissing min _ammo; + [QGVAR(syncAmmo), [_target, _currentWeapon, _currentAmmo + _ammoAdded]] call CBA_fnc_globalEvent; - if ((_magazine select 1) - _ammoAdded > 0) then { - [QGVAR(ammoReturned), [_giver, _receiver, [_magazineType, (_magazine select 1) - _ammoAdded]], [_giver]] call CBA_fnc_targetEvent; + // Return left over ammo to reloading unit + if (_ammo - _ammoAdded > 0) then { + [QGVAR(ammoReturned), [_unit, _target, [_magazine, _ammo - _ammoAdded], true], _unit] call CBA_fnc_targetEvent; }; }] call CBA_fnc_addEventHandler; // Listen for returned magazines [QGVAR(ammoReturned), { - params ["_receiver", "", "_magazine"]; - TRACE_2("ammoReturned EH",_receiver,_magazine); + params ["_unit", "_target", "_magazineInfo", "_success"]; + TRACE_3("ammoReturned EH",_unit,_target,_magazineInfo); - _receiver addMagazine _magazine; + // If inventory is full, magazine will be dropped on the ground + [_unit, _magazineInfo select 0, _magazineInfo select 1, true] call CBA_fnc_addMagazine; + + [[LSTRING(BeltNotLinked), LSTRING(BeltLinked)] select _success] call EFUNC(common,displayTextStructured); }] call CBA_fnc_addEventHandler; + +if (!hasInterface) exitWith {}; + +#include "initKeybinds.sqf" diff --git a/addons/reload/functions/fnc_canCheckAmmo.sqf b/addons/reload/functions/fnc_canCheckAmmo.sqf index 9632d0b4b1..652e521ec7 100644 --- a/addons/reload/functions/fnc_canCheckAmmo.sqf +++ b/addons/reload/functions/fnc_canCheckAmmo.sqf @@ -1,13 +1,13 @@ #include "script_component.hpp" /* - * Author: CAA-Picard - * Check if the player can check the ammo of the target. + * Author: CAA-Picard, johnb43 + * Check if a unit can check the ammo of the target. * * Arguments: - * 0: Target + * 0: Unit equipped with the weapon * * Return Value: - * Can link belt + * Can check ammo * * Example: * [cursorObject] call ace_reload_fnc_canCheckAmmo @@ -17,26 +17,18 @@ params ["_target"]; -// Return true for static weapons if they have been fired once, @todo 1.40 this work-around doesn't work anymore +// Static weapons if (_target isKindOf "StaticWeapon") exitWith { - if (currentMagazine _target != "") exitWith {true}; - - // no check ammo action on destroyed static weapons + // No check ammo action on destroyed static weapons if (!alive _target) exitWith {false}; - private _found = false; + if (currentMagazine _target != "") exitWith {true}; - { - if (_x select 2) exitWith { - _found = true; - }; - false - } count magazinesAmmoFull _target; - - _found + // Check for loaded magazines + (magazinesAmmoFull _target) findIf {_x select 2} != -1 }; -// Return false for all other vehicles +// All other vehicles if !(_target isKindOf "CAManBase") exitWith {false}; // For men diff --git a/addons/reload/functions/fnc_canCheckAmmoSelf.sqf b/addons/reload/functions/fnc_canCheckAmmoSelf.sqf index 2c8c03dcce..14439af09f 100644 --- a/addons/reload/functions/fnc_canCheckAmmoSelf.sqf +++ b/addons/reload/functions/fnc_canCheckAmmoSelf.sqf @@ -7,10 +7,10 @@ * 0: Player * * Return Value: - * Can check ammo + * Can check ammo for self * * Example: - * [cursorObject] call ace_reload_fnc_canCheckAmmoSelf + * [player] call ace_reload_fnc_canCheckAmmoSelf * * Public: No */ diff --git a/addons/reload/functions/fnc_checkAmmo.sqf b/addons/reload/functions/fnc_checkAmmo.sqf index 995e72dc3f..3cb3aa891a 100644 --- a/addons/reload/functions/fnc_checkAmmo.sqf +++ b/addons/reload/functions/fnc_checkAmmo.sqf @@ -1,11 +1,11 @@ #include "script_component.hpp" /* - * Author: commy2 and esteldunedain - * Count the ammo of the currently loaded magazine or count rifle grenades. Play animation and display message. + * Author: commy2, esteldunedain + * Play animation and display message. * * Arguments: - * 0: Target. - * 1: Player + * 0: Unit equipped with the weapon + * 1: Unit wanting to check the ammo * * Return Value: * None @@ -16,13 +16,14 @@ * Public: No */ -params ["_target", "_player"]; +params ["_target", "_unit"]; -if (_player == _target) then { +if (_unit == _target) then { if ((vehicle _target) isKindOf "StaticWeapon") then { _target = vehicle _target; }; - [_player, "Gear", 1] call EFUNC(common,doGesture); + + [_unit, "Gear", 1] call EFUNC(common,doGesture); }; -[FUNC(displayAmmo), [_target], 1] call CBA_fnc_waitAndExecute; +[FUNC(displayAmmo), _target, 1] call CBA_fnc_waitAndExecute; diff --git a/addons/reload/functions/fnc_displayAmmo.sqf b/addons/reload/functions/fnc_displayAmmo.sqf index 329c385935..06da24a7e4 100644 --- a/addons/reload/functions/fnc_displayAmmo.sqf +++ b/addons/reload/functions/fnc_displayAmmo.sqf @@ -1,16 +1,16 @@ #include "script_component.hpp" /* - * Author: commy2 and esteldunedain + * Author: commy2, esteldunedain * Display the ammo of the currently loaded magazine of the target or count rifle grenades. * * Arguments: - * 0: Target + * 0: Unit equipped with the weapon * * Return Value: * None * * Example: - * player call ace_reload_fnc_displayAmmo + * [player] call ace_reload_fnc_displayAmmo * * Public: No */ @@ -21,59 +21,58 @@ params ["_target"]; private _isStaticWeapon = _target isKindOf "StaticWeapon"; -if (_isStaticWeapon) then { - [currentWeapon _target, currentMuzzle _target, "", currentMagazine _target] -} else { - weaponState _target -} params ["_weapon", "_muzzle", "", "_magazine"]; +// currentWeapon, currentMagazine and weaponState return "" for static weapons before they have been entered once +(if (_isStaticWeapon) then { + private _weapon = currentWeapon _target; -// currentWeapon returns "" for static weapons before they are shot once -if (_isStaticWeapon) then { if (_weapon == "") then { - if (count (weapons _target) == 1) then { - _weapon = (weapons _target) select 0; - _muzzle = _weapon; + private _weapons = weapons _target; + + if (count _weapons == 1) then { + _weapon = _weapons select 0; }; }; + private _magazine = currentMagazine _target; + if (_magazine == "") then { // Try to get magazine using magazinesAmmoFull - private _magazines = magazinesAmmoFull _target; - { if (_x select 2) exitWith { _magazine = _x select 0; }; - } forEach _magazines; + } forEach magazinesAmmoFull _target; }; - // For static weapons the muzzle seemingly never returns anything for static weapons with/without people inside - if (_muzzle == "") then { - _muzzle = _weapon; - }; -}; + // currentMuzzle always returns "" + [_weapon, _weapon, "", _magazine] +} else { + weaponState _target +}) params ["_weapon", "_muzzle", "", "_magazine"]; TRACE_3("",_weapon,_muzzle,_magazine); -if ("" in [_weapon, _magazine]) exitWith {}; +if ("" == _weapon) exitWith {}; private _ammo = _target ammo _muzzle; -private _magazineConfig = configFile >> "CfgMagazines" >> _magazine; -private _maxRounds = getNumber (_magazineConfig >> "count") max 1; +private _magazineCfg = configFile >> "CfgMagazines" >> _magazine; +private _maxRounds = getNumber (_magazineCfg >> "count") max 1; private _count = -1; // Show a count instead of ammo bars (ignore if -1) -if (_muzzle != _weapon) then { - // grenade launcher (or some kind of seconday muzzle) - if (_ammo > 0) then { - if (_maxRounds == 1) then { // singleShot so show count of identical mags available instead of ammo bars - _count = 1 + ({_x == _magazine} count magazines _target); - }; - } else { - if (_maxRounds <= 3) then { // empty GL/3GL - don't have a real magazine so just show count of any compatible mag - _magazine = ""; - private _compatibleMagazines = [configFile >> "CfgWeapons" >> _weapon >> _muzzle] call CBA_fnc_compatibleMagazines; - _count = {_x in _compatibleMagazines} count (magazines _target); // safe because everything is config case - }; +// If secondary muzzle is selected or no magazine in current muzzle +if (_muzzle != _weapon || {_magazine == ""}) then { + // Check if no or empty magazine; If true, just show count of compatible magazines + if (_ammo == 0) exitWith { + _magazine = ""; // Make sure, as it could also be secondary muzzle being selected + + private _compatibleMagazines = compatibleMagazines [_weapon, _muzzle]; + + _count = {_x in _compatibleMagazines} count (magazines _target); + }; + + // singleShot, so show count of identical mags available instead of ammo bars + if (_ammo > 0 && {_maxRounds == 1}) exitWith { + _count = 1 + ({_x == _magazine} count (magazines _target)); }; }; @@ -83,21 +82,29 @@ private _ammoBarsStructuredText = if (_count >= 0) then { if (_maxRounds >= COUNT_BARS) then { _count = round (COUNT_BARS * _ammo / _maxRounds); - if (_ammo > 0) then {_count = _count max 1}; - if (_ammo < _maxRounds) then {_count = _count min (COUNT_BARS - 1)}; + if (_ammo > 0) then { + _count = _count max 1; + }; + + if (_ammo < _maxRounds) then { + _count = _count min (COUNT_BARS - 1); + }; } else { _count = _ammo; }; - private _color = [((2 * (1 - _ammo / _maxRounds)) min 1), ((2 * _ammo / _maxRounds) min 1), 0]; + private _color = [(2 * (1 - _ammo / _maxRounds)) min 1, (2 * _ammo / _maxRounds) min 1, 0]; private _string = ""; + for "_a" from 1 to _count do { _string = _string + "|"; }; + private _text = [_string, _color] call EFUNC(common,stringToColoredText); _string = ""; + for "_a" from (_count + 1) to (_maxRounds min COUNT_BARS) do { _string = _string + "|"; }; @@ -105,16 +112,21 @@ private _ammoBarsStructuredText = if (_count >= 0) then { composeText [_text, [_string, "#808080"] call EFUNC(common,stringToColoredText)]; }; - if (_isStaticWeapon) then { - //Vehicle mags (usualy) don't have pictures, so just show the text above ammo count - private _loadedName = getText (_magazineConfig >> "displaynameshort"); + // Vehicle mags usually don't have pictures, so just show the text above ammo count + private _loadedName = getText (_magazineCfg >> "displayNameShort"); + + if (_loadedName == "") then { + _loadedName = getText (_magazineCfg >> "displayName"); + }; + _loadedName = parseText format ["%1", _loadedName]; + private _text = composeText [_loadedName, linebreak, _ammoBarsStructuredText]; [_text] call EFUNC(common,displayTextStructured); } else { if (_magazine != "") then { - private _picture = getText (_magazineConfig >> "picture"); + private _picture = getText (_magazineCfg >> "picture"); [_ammoBarsStructuredText, _picture] call EFUNC(common,displayTextPicture); } else { [_ammoBarsStructuredText, 1] call EFUNC(common,displayTextStructured); diff --git a/addons/reload/functions/fnc_getAmmoToLinkBelt.sqf b/addons/reload/functions/fnc_getAmmoToLinkBelt.sqf index 3701b32d8b..87f2c56a1c 100644 --- a/addons/reload/functions/fnc_getAmmoToLinkBelt.sqf +++ b/addons/reload/functions/fnc_getAmmoToLinkBelt.sqf @@ -1,11 +1,11 @@ #include "script_component.hpp" /* * Author: esteldunedain, phyma - * Check if the target has an MG equiped with belt system that the player can link + * Check if the target has an MG equipped with belt system that a unit can link. * * Arguments: - * 0: Player - * 1: Target + * 0: Unit wanting to link the belt + * 1: Unit equipped with the weapon * * Return Value: * Maximum ammo of magazine (-1 on error) @@ -16,12 +16,12 @@ * Public: No */ -params ["_player", "_target"]; +params ["_unit", "_target"]; -if (vehicle _target != _target) exitWith {-1}; +if !(isNull objectParent _target) exitWith {-1}; -private _magazineType = currentMagazine _target; -private _magazineCfg = configFile >> "CfgMagazines" >> _magazineType; +private _magazine = currentMagazine _target; +private _magazineCfg = configFile >> "CfgMagazines" >> _magazine; if (getNumber (_magazineCfg >> "ACE_isBelt") == 0) exitWith {-1}; @@ -29,14 +29,13 @@ if (getNumber (_magazineCfg >> "ACE_isBelt") == 0) exitWith {-1}; private _ammoCount = _target ammo currentWeapon _target; // Exit if the belt is full or empty -if (_ammoCount == 0 || getNumber (_magazineCfg >> "count") - _ammoCount == 0) exitWith {-1}; +if (_ammoCount == 0 || {getNumber (_magazineCfg >> "count") - _ammoCount == 0}) exitWith {-1}; -// Check if the player has any of the same magazines -// Calculate max ammo +// Check if the unit has any of the same magazines and calculate max ammo private _maxAmmo = 0; { _maxAmmo = _maxAmmo max (_x select 1); -} forEach (magazinesAmmo _player select {_x select 0 == _magazineType}); +} forEach (magazinesAmmo _unit select {(_x select 0) == _magazine}); _maxAmmo diff --git a/addons/reload/functions/fnc_onTake.sqf b/addons/reload/functions/fnc_onTake.sqf index 9f379ff643..3b5cda0873 100644 --- a/addons/reload/functions/fnc_onTake.sqf +++ b/addons/reload/functions/fnc_onTake.sqf @@ -1,6 +1,7 @@ #include "script_component.hpp" /* - * Author: ? + * Author: jokoho48 + * Called from "Take" EH. * * Arguments: * 0: Unit @@ -11,17 +12,18 @@ * None * * Example: - * [bob, backpackContainer bob, "ACE_Banana"] call ace_reload_fnc_onTake + * [player, backpackContainer player, "ACE_Banana"] call ace_reload_fnc_onTake * * Public: No */ params ["_unit", "_container", "_item"]; + if ( - _unit == ACE_player - && {GVAR(DisplayText)} - && {_item == currentMagazine _unit} - && {_container in [uniformContainer _unit, vestContainer _unit, backpackContainer _unit]} + _unit == ACE_player && + {GVAR(displayText)} && + {_item == currentMagazine _unit} && + {_container in [uniformContainer _unit, vestContainer _unit, backpackContainer _unit]} ) then { _unit call FUNC(displayAmmo); }; diff --git a/addons/reload/functions/fnc_startLinkingBelt.sqf b/addons/reload/functions/fnc_startLinkingBelt.sqf index 54fc1921d7..0e71836430 100644 --- a/addons/reload/functions/fnc_startLinkingBelt.sqf +++ b/addons/reload/functions/fnc_startLinkingBelt.sqf @@ -1,58 +1,59 @@ #include "script_component.hpp" /* - * Author: esteldunedain - * Start linking the belt + * Author: esteldunedain, johnb43 + * Start linking the belt. * * Arguments: - * 0: Player - * 1: Target + * 0: Unit linking the belt + * 1: Unit equipped with the weapon * * Return Value: * None * * Example: - * [bob, kevin] call ace_reload_fnc_startLinkingBelt + * [player, cursorTarget] call ace_reload_fnc_startLinkingBelt * * Public: No */ -params ["_player", "_target"]; +params ["_unit", "_target"]; -if (vehicle _target != _target) exitWith {false}; +if !(isNull objectParent _target) exitWith {false}; -private _magazineType = currentMagazine _target; +private _magazine = currentMagazine _target; +private _ammo = [_unit, _target] call FUNC(getAmmoToLinkBelt); - -private _maxAmmo = [_player, _target] call FUNC(getAmmoToLinkBelt); - -//if _maxAmmo is below 0 we quit -if (_maxAmmo <= 0) exitWith {}; +// If _ammo is below 0 we quit +if (_ammo <= 0) exitWith {}; // Condition to call each frame private _condition = { - (_this select 0) params ["_player", "_target"]; - ([_player, _target, []] call EFUNC(common,canInteractWith)) && ((_player distance _target) < 3) && ((speed _target) < 1) + (_this select 0) params ["_unit", "_target"]; + + ([_unit, _target, []] call EFUNC(common,canInteractWith)) && {(_unit distance _target) < 3} && {(speed _target) < 1} }; private _onFinish = { - (_this select 0) params ["_player", "_target", "_magazine"]; + (_this select 0) params ["_unit", "_target", "_magazineInfo"]; + + // Remove the magazine with given remaining ammo; If not possible, quit + if !([_unit, _magazineInfo select 0, _magazineInfo select 1] call EFUNC(common,removeSpecificMagazine)) exitWith { + [LSTRING(BeltNotLinked)] call EFUNC(common,displayTextStructured); + }; // Raise event on remote unit - [QGVAR(ammoLinked), [_target, _player, _magazine], [_target]] call CBA_fnc_targetEvent; + [QGVAR(ammoLinked), [_target, _unit, _magazineInfo], _target] call CBA_fnc_targetEvent; }; private _onFailure = { - (_this select 0) params ["_player", "_target", "_magazine"]; - [_player, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); + (_this select 0) params ["_unit"]; - // Add back the magazine with the former ammo count - _player addMagazine _magazine; + [_unit, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); + + [LSTRING(BeltNotLinked)] call EFUNC(common,displayTextStructured); }; -[_player, "PutDown"] call EFUNC(common,doGesture); - -// Remove the magazine with maximum remaining ammo -[_player, _magazineType, _maxAmmo] call EFUNC(common,removeSpecificMagazine); +[_unit, "PutDown"] call EFUNC(common,doGesture); // Call progress bar -[4, [_player, _target, [_magazineType, _maxAmmo]], _onFinish, _onFailure, (localize LSTRING(LinkingBelt)), _condition, ["isNotInside"]] call EFUNC(common,progressBar); +[4, [_unit, _target, [_magazine, _ammo]], _onFinish, _onFailure, LLSTRING(LinkingBelt), _condition, ["isNotInside"]] call EFUNC(common,progressBar); diff --git a/addons/reload/initKeybinds.sqf b/addons/reload/initKeybinds.sqf new file mode 100644 index 0000000000..cf2ae07ffb --- /dev/null +++ b/addons/reload/initKeybinds.sqf @@ -0,0 +1,16 @@ +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +// Add Keybinds +["ACE3 Weapons", QGVAR(checkAmmo), LSTRING(checkAmmo), { + // Conditions: canInteract + if !([ACE_player, vehicle ACE_player, ["isNotInside", "isNotSwimming", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Ignore if controlling UAV (blocks radar keybind) + if (!isNull (ACE_controlledUAV param [0, objNull])) exitWith {false}; + // Conditions: specific + if !(ACE_player call FUNC(canCheckAmmoSelf)) exitWith {false}; + + // Statement + [ACE_player, ACE_player] call FUNC(checkAmmo); + + true +}, {false}, [DIK_R, [false, true, false]], false] call CBA_fnc_addKeybind; // Ctrl + R diff --git a/addons/reload/initSettings.sqf b/addons/reload/initSettings.sqf index 23856d6668..1110ee125b 100644 --- a/addons/reload/initSettings.sqf +++ b/addons/reload/initSettings.sqf @@ -1,18 +1,15 @@ - [ QGVAR(displayText), "CHECKBOX", [LSTRING(SettingDisplayTextName), LSTRING(SettingDisplayTextDesc)], - localize ELSTRING(common,ACEKeybindCategoryWeapons), - true, - 0 + ELSTRING(common,ACEKeybindCategoryWeapons), + true // default value ] call CBA_fnc_addSetting; [ QGVAR(showCheckAmmoSelf), "CHECKBOX", [LSTRING(SettingShowCheckAmmoSelf), LSTRING(SettingShowCheckAmmoSelfDesc)], - localize ELSTRING(common,ACEKeybindCategoryWeapons), - false, // default value - 0 // isGlobal + ELSTRING(common,ACEKeybindCategoryWeapons), + false // default value ] call CBA_fnc_addSetting; diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index d02599705d..ce26ac7ec8 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -129,5 +129,17 @@ 正在连接弹链... 連接彈鏈中... + + Belt was linked + Bande a été attachée + Gurt wurde angehängt + ベルトがリンクされた + + + Belt could not be linked + Bande n'a pas pu être attachée + Gurt konnte nicht angehängt werden + ベルトはリンクされなかった + diff --git a/addons/reloadlaunchers/CfgEventHandlers.hpp b/addons/reloadlaunchers/CfgEventHandlers.hpp index 6c29240403..f6503c2479 100644 --- a/addons/reloadlaunchers/CfgEventHandlers.hpp +++ b/addons/reloadlaunchers/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); diff --git a/addons/reloadlaunchers/CfgVehicles.hpp b/addons/reloadlaunchers/CfgVehicles.hpp index eccd30d1f7..6ce2f4b852 100644 --- a/addons/reloadlaunchers/CfgVehicles.hpp +++ b/addons/reloadlaunchers/CfgVehicles.hpp @@ -1,4 +1,3 @@ - class CfgVehicles { class Man; class CAManBase: Man { diff --git a/addons/reloadlaunchers/CfgWeapons.hpp b/addons/reloadlaunchers/CfgWeapons.hpp index 678528502e..75a688bf28 100644 --- a/addons/reloadlaunchers/CfgWeapons.hpp +++ b/addons/reloadlaunchers/CfgWeapons.hpp @@ -1,4 +1,3 @@ - class CfgWeapons { class Launcher_Base_F; class launch_Titan_base: Launcher_Base_F { @@ -7,6 +6,9 @@ class CfgWeapons { class launch_RPG32_F: Launcher_Base_F { GVAR(enabled) = 1; }; + class launch_RPG7_F: Launcher_Base_F { + GVAR(enabled) = 1; + }; class launch_MRAWS_base_F: Launcher_Base_F { GVAR(enabled) = 1; }; diff --git a/addons/reloadlaunchers/XEH_PREP.hpp b/addons/reloadlaunchers/XEH_PREP.hpp index b730d2780e..4d63905e75 100644 --- a/addons/reloadlaunchers/XEH_PREP.hpp +++ b/addons/reloadlaunchers/XEH_PREP.hpp @@ -1,4 +1,3 @@ - PREP(addMissileReloadActions); PREP(canLoad); PREP(getLoadableMissiles); diff --git a/addons/reloadlaunchers/XEH_postInit.sqf b/addons/reloadlaunchers/XEH_postInit.sqf index 8c18d430c4..af5fba3bf5 100644 --- a/addons/reloadlaunchers/XEH_postInit.sqf +++ b/addons/reloadlaunchers/XEH_postInit.sqf @@ -1,4 +1,26 @@ // by commy2 #include "script_component.hpp" -[QGVAR(reloadLauncher), {_this call DFUNC(reloadLauncher)}] call CBA_fnc_addEventHandler; +[QGVAR(reloadStarted), { + params ["_unit", "_target"]; + + // Don't show notification if target is local AI + if (GVAR(displayStatusText) && {!local _unit} && {_target call EFUNC(common,isPlayer)}) then { + private _message = format [LLSTRING(LoadingStarted), _unit call EFUNC(common,getName)]; + + [_message] call EFUNC(common,displayTextStructured); + }; +}] call CBA_fnc_addEventHandler; + +[QGVAR(reloadAborted), { + params ["_unit", "_target"]; + + // Don't show notification if target is local AI + if (GVAR(displayStatusText) && {!local _unit} && {_target call EFUNC(common,isPlayer)}) then { + private _message = format [LLSTRING(LoadingAborted), _unit call EFUNC(common,getName)]; + + [_message] call EFUNC(common,displayTextStructured); + }; +}] call CBA_fnc_addEventHandler; + +[QGVAR(reloadLauncher), LINKFUNC(reloadLauncher)] call CBA_fnc_addEventHandler; diff --git a/addons/reloadlaunchers/XEH_preInit.sqf b/addons/reloadlaunchers/XEH_preInit.sqf index b47cf6628d..9361d05015 100644 --- a/addons/reloadlaunchers/XEH_preInit.sqf +++ b/addons/reloadlaunchers/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/reloadlaunchers/config.cpp b/addons/reloadlaunchers/config.cpp index 09f01e0594..bf9a5fa928 100644 --- a/addons/reloadlaunchers/config.cpp +++ b/addons/reloadlaunchers/config.cpp @@ -15,6 +15,5 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" - #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf b/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf index 42af3e5027..05b766dd95 100644 --- a/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf +++ b/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf @@ -1,17 +1,17 @@ #include "script_component.hpp" /* * Author: commy2 - * Create one action per reloadable missile + * Create one action per reloadable missile. * * Arguments: - * 1: Target - * 0: Player + * 0: Unit equipped with the launcher + * 1: Unit wanting to execute the reload * * Return Value: * Children actions * * Example: - * [bob, kevin] call ace_reloadlaunchers_fnc_addMissileReloadActions + * [cursorTarget, player] call ace_reloadlaunchers_fnc_addMissileReloadActions * * Public: No * @@ -20,8 +20,9 @@ params ["_target", "_unit"]; TRACE_2("params",_target,_unit); -//Fast exit for common case: +// Fast exit for common cases private _weapon = secondaryWeapon _target; + if ((_weapon == "") || {(getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(enabled))) == 0}) exitWith { TRACE_1("weapon not supported",_weapon); [] @@ -32,16 +33,18 @@ private _actions = []; private _loadableMissiles = [_unit, _weapon] call FUNC(getLoadableMissiles); TRACE_2("",_weapon,_loadableMissiles); +private _cfgMagazines = configFile >> "CfgMagazines"; + { private _name = format [QGVAR(Missile_%1), _x]; - private _displayName = format [localize LSTRING(LoadMagazine), getText (configFile >> "CfgMagazines" >> _x >> "displayName")]; + private _displayName = format [LLSTRING(LoadMagazine), getText (_cfgMagazines >> _x >> "displayName")]; private _statement = { - (_this select 2) call DFUNC(load); + (_this select 2) call FUNC(load); }; private _condition = { - (_this select 2) call DFUNC(canLoad) + (_this select 2) call FUNC(canLoad) }; private _action = [_name, _displayName, "", _statement, _condition, {}, [_unit, _target, _weapon, _x], "", 4] call EFUNC(interact_menu,createAction); diff --git a/addons/reloadlaunchers/functions/fnc_canLoad.sqf b/addons/reloadlaunchers/functions/fnc_canLoad.sqf index af08ed8013..3786aed06b 100644 --- a/addons/reloadlaunchers/functions/fnc_canLoad.sqf +++ b/addons/reloadlaunchers/functions/fnc_canLoad.sqf @@ -1,19 +1,19 @@ #include "script_component.hpp" /* - * Author: commy2 - * Check of the unit can reload the launcher of target unit. + * Author: commy2, johnb43 + * Check if the unit can reload the launcher of the target unit. * * Arguments: - * 0: Unit to do the reloading - * 1: Unit eqipped with launcher - * 2: weapon name - * 3: missile name + * 0: Unit wanting to execute the reload + * 1: Unit equipped with the launcher + * 2: Launcher name + * 3: Missile name * * Return Value: * None * * Example: - * [bob, kevin, "weapon", "missile"] call ace_reloadlaunchers_fnc_canLoad + * [player, cursorTarget, "launch_RPG32_F", "RPG32_F"] call ace_reloadlaunchers_fnc_canLoad * * Public: No */ @@ -21,21 +21,24 @@ params ["_unit", "_target", "_weapon", "_magazine"]; TRACE_4("params",_unit,_target,_weapon,_magazine); -if (!alive _target) exitWith {false}; -if (vehicle _target != _target) exitWith {false}; +// Target must be awake +if !(_target call EFUNC(common,isAwake)) exitWith {false}; + +// Target must not be in a vehicle +if !(isNull objectParent _target) exitWith {false}; if !([_unit, _target, ["isNotInside", "isNotSwimming"]] call EFUNC(common,canInteractWith)) exitWith {false}; -// target is awake -if (_target getVariable ["ACE_isUnconscious", false]) exitWith {false}; +// Target must not be captive +if (_target getVariable [QEGVAR(captives,isHandcuffed), false] || {_target getVariable [QEGVAR(captives,isSurrendering), false]}) exitWith {false}; -// has secondary weapon equipped -if !(_weapon in weapons _target) exitWith {false}; - -// check if the target really needs to be reloaded -if (count secondaryWeaponMagazine _target > 0) exitWith {false}; - -// check if the launcher is compatible +// Check if the launcher is compatible if (getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(enabled)) == 0) exitWith {false}; -// check if the magazine compatible with targets launcher +// Check if target has its secondary weapon equipped +if !(_weapon in weapons _target) exitWith {false}; + +// Check if the target's launcher's primary muzzle really needs to be reloaded +if (_target ammo _weapon != 0) exitWith {false}; + +// Check if the magazine is compatible with target's launcher _magazine in ([_unit, _weapon] call FUNC(getLoadableMissiles)) diff --git a/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf b/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf index 6bded89110..1a661b4722 100644 --- a/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf +++ b/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf @@ -1,17 +1,17 @@ #include "script_component.hpp" /* - * Author: commy2 - * Return all magazine types from reloaders inventory that are compatible with given weapon. + * Author: commy2, johnb43 + * Return all magazine types from reloader's inventory that are compatible with the given launcher. * * Arguments: - * 0: Unit to to the reload - * 1: A launcher + * 0: Unit wanting to execute the reload + * 1: Launcher name * * Return Value: * Reloable magazines * * Example: - * [bob, launcher] call ace_reloadlaunchers_fnc_getLoadableMissiles + * [player, "launch_RPG32_F"] call ace_reloadlaunchers_fnc_getLoadableMissiles * * Public: No */ @@ -19,11 +19,5 @@ params ["_unit", "_weapon"]; TRACE_2("params",_unit,_weapon); -// get available magazines of reloader, Note: "magazines" does not include currently loaded magazines -private _magazines = magazines _unit; - -// case sensitvity -_magazines = _magazines apply {toLower _x}; - -// get reloaders magazine types compatible with targets launcher. No duplicates. -getArray (configFile >> "CfgWeapons" >> _weapon >> "magazines") select {toLower _x in _magazines} // return +// Look for primary muzzle magazines only +(compatibleMagazines [_weapon, "this"]) arrayIntersect (magazines _unit) diff --git a/addons/reloadlaunchers/functions/fnc_load.sqf b/addons/reloadlaunchers/functions/fnc_load.sqf index 27d4cafbf2..6542b44c22 100644 --- a/addons/reloadlaunchers/functions/fnc_load.sqf +++ b/addons/reloadlaunchers/functions/fnc_load.sqf @@ -1,19 +1,19 @@ #include "script_component.hpp" /* - * Author: commy2 - * Reload a launcher + * Author: commy2, johnb43, drofseh + * Start reloading a launcher, reload started by the unit who has the missile. * * Arguments: - * 0: Unit with magazine - * 1: Unit with launcher - * 2: weapon name - * 3: missile name + * 0: Unit executing the reload + * 1: Unit equipped with the launcher + * 2: Launcher name + * 3: Missile name * * Return Value: * None * * Example: - * [bob, kevin, "weapon", "missile"] call ace_reloadlaunchers_fnc_load + * [player, cursorTarget, "launch_RPG32_F", "RPG32_F"] call ace_reloadlaunchers_fnc_load * * Public: No */ @@ -21,30 +21,67 @@ params ["_unit", "_target", "_weapon", "_magazine"]; TRACE_4("params",_unit,_target,_weapon,_magazine); -private _reloadTime = if (isNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(buddyReloadTime))) then { - getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(buddyReloadTime)) +private _config = configFile >> "CfgWeapons" >> _weapon >> QGVAR(buddyReloadTime); + +private _reloadTime = if (isNumber _config) then { + getNumber _config } else { - 2.5 + getNumber (configFile >> "CfgWeapons" >> _weapon >> "magazineReloadTime") min 2.5 }; -// do animation +// Play animation [_unit] call EFUNC(common,goKneeling); -// show progress bar +// Notify unit that is being reloaded that reload has been started +[QGVAR(reloadStarted), [_unit, _target], _target] call CBA_fnc_targetEvent; +// Show progress bar private _onSuccess = { - (_this select 0 select 0) removeMagazine (_this select 0 select 3); - [QGVAR(reloadLauncher), _this select 0, _this select 0 select 1] call CBA_fnc_targetEvent; + (_this select 0) params ["_unit", "_target", "_weapon", "_magazine"]; - [localize LSTRING(LauncherLoaded)] call DEFUNC(common,displayTextStructured); + // Check if the unit has any of the same magazines and calculate max ammo + private _maxAmmo = 0; + + { + _maxAmmo = _maxAmmo max (_x select 1); + } forEach (magazinesAmmo _unit select {(_x select 0) == _magazine}); + + // Check if the launcher can still be loaded; If possible, then try to remove magazine + if !(_maxAmmo > 0 && {[_unit, _target, _weapon, _magazine] call FUNC(canLoad)} && {[_unit, _magazine, _maxAmmo] call EFUNC(common,removeSpecificMagazine)}) exitWith { + // Notify unit that was being reloaded that reload has been stopped + [QGVAR(reloadAborted), [_unit, _target], _target] call CBA_fnc_targetEvent; + + // Notify reloading unit about failure + if (GVAR(displayStatusText)) then { + [LSTRING(LauncherNotLoaded)] call EFUNC(common,displayTextStructured); + }; + }; + + // Reload target's launcher + [QGVAR(reloadLauncher), [_unit, _target, _weapon, _magazine, _maxAmmo], _target] call CBA_fnc_targetEvent; + + // Notify reloading unit about success + if (GVAR(displayStatusText)) then { + [LSTRING(LauncherLoaded)] call EFUNC(common,displayTextStructured); + }; }; private _onFailure = { - [localize ELSTRING(common,ActionAborted)] call DEFUNC(common,displayTextStructured); + (_this select 0) params ["_unit", "_target"]; + + // Notify unit that was being reloaded that reload has been stopped + [QGVAR(reloadAborted), [_unit, _target], _target] call CBA_fnc_targetEvent; + + // Notify reloading unit about failure + if (GVAR(displayStatusText)) then { + [LSTRING(LauncherNotLoaded)] call EFUNC(common,displayTextStructured); + }; }; private _condition = { - (_this select 0) call DFUNC(canLoad) && {(_this select 0 select 0) distance (_this select 0 select 1) < 4} + (_this select 0) params ["_unit", "_target"]; + + (_this select 0) call FUNC(canLoad) && {_unit distance _target < 4} }; -[_reloadTime, [_unit, _target, _weapon, _magazine], _onSuccess, _onFailure, localize LSTRING(LoadingLauncher), _condition, ["isNotInside", "isNotSwimming"]] call EFUNC(common,progressBar); +[_reloadTime, [_unit, _target, _weapon, _magazine], _onSuccess, _onFailure, LLSTRING(LoadingLauncher), _condition, ["isNotInside", "isNotSwimming"]] call EFUNC(common,progressBar); diff --git a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf index 1765a3350c..2c159fbd25 100644 --- a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf +++ b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf @@ -1,29 +1,32 @@ #include "script_component.hpp" /* - * Author: commy2 - * Reload a launcher + * Author: commy2, johnb43, drofseh + * Reload a launcher for the unit who has the launcher. + * If the ammo argument is nil, a full magazine will be given. * * Arguments: - * 0: Unit to do the reloading - * 1: Target to rload - * 2: weapon name - * 3: missile name + * 0: Unit executing the reload + * 1: Unit equipped with the launcher + * 2: Launcher name + * 3: Missile name + * 4: Ammo count * * Return Value: * None * * Example: - * [bob, kevin, "weapon", "missile"] call ace_reloadlaunchers_fnc_reloadLauncher + * [player, cursorTarget, "launch_RPG32_F", "RPG32_F"] call ace_reloadlaunchers_fnc_reloadLauncher * * Public: No */ -params ["_unit","_target","_weapon","_magazine"]; -TRACE_4("params",_unit,_target,_weapon,_magazine); +params ["_unit", "_target", "_weapon", "_magazine", "_ammo"]; +TRACE_5("params",_unit,_target,_weapon,_magazine,_ammo); -_target selectWeapon _weapon; +// Add magazine to launcher immediately +_target addWeaponItem [_weapon, [_magazine, _ammo], true]; -if (currentWeapon _target != _weapon) exitWith {}; -if (currentMagazine _target != "") exitWith {}; - -_target addWeaponItem [_weapon, _magazine, true]; +// Don't show notification if target is local AI +if (GVAR(displayStatusText) && {!local _unit} && {_target call EFUNC(common,isPlayer)}) then { + [LSTRING(LauncherLoaded)] call EFUNC(common,displayTextStructured); +}; diff --git a/addons/reloadlaunchers/initSettings.sqf b/addons/reloadlaunchers/initSettings.sqf new file mode 100644 index 0000000000..687a74ef37 --- /dev/null +++ b/addons/reloadlaunchers/initSettings.sqf @@ -0,0 +1,8 @@ +[ + QGVAR(displayStatusText), + "CHECKBOX", + [LSTRING(SettingDisplayStatusTextName), LSTRING(SettingDisplayStatusTextDesc)], + ELSTRING(common,ACEKeybindCategoryWeapons), + true, + 2 +] call CBA_fnc_addSetting; diff --git a/addons/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml index 75653f6add..2887f93691 100644 --- a/addons/reloadlaunchers/stringtable.xml +++ b/addons/reloadlaunchers/stringtable.xml @@ -1,6 +1,14 @@ + + Display notifications for buddy loading + バディ装填時の通知表示 + + + Displays notifications when an assistant loads a gunner's launcher. + 助手が射手のランチャーを装填した際に通知を表示します。 + Load launcher Panzerabwehr laden @@ -12,12 +20,24 @@ Kilövö betöltése Carica lanciamissili Recarregar lançador - ランチャーに装填 + ランチャーを装填 무기 재장전 装填发射器 裝載發射器 Fırlatıcıyı Yükle + + %1 is loading your launcher + %1 lädt deine Panzerabwehr + %1 charge ton lanceur + %1 がランチャーを装填しています + + + %1 stopped loading your launcher + %1 hat aufgehört, deine Panzerabwehr zu laden + %1 a arrêté de charger ton lanceur + %1 がランチャーの装填を中断しました + Loading launcher... Chargement du lanceur... @@ -29,7 +49,7 @@ Kilövő betöltés alatt... Caricando il lanciamissili... Recarregando lançador... - ランチャーに装填中・・・ + ランチャーを装填中・・・ 무기 재장전 중... 正在装填发射器... 裝載發射器中... @@ -46,7 +66,7 @@ Kilövő betöltve Lanciamissili caricato Lançador Carregado - ランチャーに装填完了 + ランチャーの装填完了 무기 재장전됨 发射器装填完毕 發射器裝載完畢 @@ -63,11 +83,17 @@ %1 betöltése Caricato %1 Recarregar %1 - %1 を装填 + %1 を装填します %1 장전 装填%1 裝載%1 %1 Yüklendi + + Launcher could not be loaded + Panzerabwehr konnte nicht geladen werden + Lanceur n'a pas pu être chargé + ランチャーを装填できませんでした + diff --git a/addons/repair/CfgActions.hpp b/addons/repair/CfgActions.hpp deleted file mode 100644 index 5dbd0ca7a6..0000000000 --- a/addons/repair/CfgActions.hpp +++ /dev/null @@ -1,9 +0,0 @@ -class CfgActions { - class None; - class Repair: None { - show = 0; - }; - class RepairVehicle: None { - show = 0; - }; -}; diff --git a/addons/repair/CfgEden.hpp b/addons/repair/CfgEden.hpp index d9df86a036..2cd1ed9e2e 100644 --- a/addons/repair/CfgEden.hpp +++ b/addons/repair/CfgEden.hpp @@ -1,7 +1,8 @@ +#define VANILLA_ISREPAIRVEHICLE (parseNumber (getRepairCargo _this > 0)) #define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default}) #define DEFAULT_ISENGINEER ([ARR_2(0,1)] select (_this getUnitTrait 'engineer')) -#define DEFAULT_ISREPAIRVEHICLE GET_NUMBER(configOf _this >> QQGVAR(canRepair),0) +#define DEFAULT_ISREPAIRVEHICLE GET_NUMBER(configOf _this >> QQGVAR(canRepair),VANILLA_ISREPAIRVEHICLE) class ctrlToolbox; @@ -69,7 +70,7 @@ class Cfg3DEN { property = QGVAR(editorLoadedTracks); control = "Edit"; expression = "_this setVariable ['%s',_value];"; - defaultValue = "[0,1] select (_this isKindOf 'Tank')"; // must match pre init script + defaultValue = "parseNumber (_this isKindOf 'Tank')"; // must match post init script validate = "number"; condition = "objectHasInventoryCargo"; typeName = "NUMBER"; @@ -78,7 +79,7 @@ class Cfg3DEN { displayName = CSTRING(editorLoadedWheels); tooltip = CSTRING(editorLoadedWheels_tooltip); property = QGVAR(editorLoadedWheels); - defaultValue = "[0,1] select (_this isKindOf 'Car')"; // must match pre init script + defaultValue = "parseNumber (_this isKindOf 'Car')"; // must match post init script }; }; }; diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index c1641e52ec..6a58e07a6f 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -3,10 +3,6 @@ class ACE_MainActions { \ class GVAR(Repair) { \ displayName = CSTRING(Repair); \ - condition = "true"; \ - statement = ""; \ - runOnHover = 1; \ - showDisabled = 0; \ icon = "\A3\ui_f\data\igui\cfg\actions\repair_ca.paa"; \ distance = 4; \ exceptions[] = {"isNotSwimming", "isNotOnLadder"}; \ @@ -418,40 +414,6 @@ class CfgVehicles { }; }; - // disable vanilla repair - // "getNumber (_x >> ""transportRepair"") > 0" configClasses (configFile >> "CfgVehicles") - class ReammoBox_F; - class Land_RepairDepot_01_base_F: ReammoBox_F { // TanksDLC - Repair Depo Thing - GVAR(canRepair) = 1; - transportRepair = 0; - }; - class Van_02_base_F; - class Van_02_service_base_F: Van_02_base_F { // OrangeDLC - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class Slingload_01_Base_F; - class B_Slingload_01_Repair_F: Slingload_01_Base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class Helicopter_Base_H; - class Heli_Transport_04_base_F: Helicopter_Base_H { - GVAR(hitpointGroups)[] = { {"HitEngine", {"HitEngine1", "HitEngine2"}} }; - }; - class O_Heli_Transport_04_repair_F: Heli_Transport_04_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class Pod_Heli_Transport_04_base_F; - class Land_Pod_Heli_Transport_04_repair_F: Pod_Heli_Transport_04_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - class Heli_Transport_02_base_F; class I_Heli_Transport_02_F: Heli_Transport_02_base_F { GVAR(hitpointPositions)[] = {{"HitVRotor", {-1,-9.4,1.8}}, {"HitHRotor", {0,1.8,1.3}}}; @@ -463,41 +425,10 @@ class CfgVehicles { }; class B_APC_Tracked_01_base_F; - class B_APC_Tracked_01_CRV_F: B_APC_Tracked_01_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - class B_APC_Tracked_01_AA_F: B_APC_Tracked_01_base_F { GVAR(hitpointPositions)[] = {{"HitTurret", {0,-2,0}}}; }; - class Offroad_01_base_F; - class Offroad_01_repair_base_F: Offroad_01_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class B_Truck_01_mover_F; - class B_Truck_01_Repair_F: B_Truck_01_mover_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class B_Truck_01_fuel_F: B_Truck_01_mover_F { // the fuel hemet apparently can repair. GJ BI - transportRepair = 0; - }; - - class Truck_02_base_F; - class Truck_02_box_base_F: Truck_02_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; - - class Truck_02_medical_base_F: Truck_02_box_base_F { - GVAR(canRepair) = 0; - }; - class Car_F: Car { class HitPoints; }; @@ -517,10 +448,6 @@ class CfgVehicles { }; }; }; - class O_Truck_03_repair_F: Truck_03_base_F { - GVAR(canRepair) = 1; - transportRepair = 0; - }; class Quadbike_01_base_F: Car_F { GVAR(hitpointPositions)[] = { {"HitEngine", {0, 0.5, -0.7}}, {"HitFuel", {0, 0, -0.5}} }; diff --git a/addons/repair/XEH_postInit.sqf b/addons/repair/XEH_postInit.sqf index 2cbbd8c3e1..f717e56651 100644 --- a/addons/repair/XEH_postInit.sqf +++ b/addons/repair/XEH_postInit.sqf @@ -1,20 +1,86 @@ #include "script_component.hpp" -[QGVAR(setVehicleDamage), {_this call FUNC(setDamage)}] call CBA_fnc_addEventHandler; -[QGVAR(setVehicleHitPointDamage), {_this call FUNC(setHitPointDamage)}] call CBA_fnc_addEventHandler; +["CBA_settingsInitialized", { -// wheels -[QGVAR(setWheelHitPointDamage), { - params ["_object", "_hitPoint", "_damage"]; - private _damageDisabled = !isDamageAllowed _object; + if !GVAR(enabled) exitWith {}; - if (_damageDisabled) then { - _object allowDamage true; + [QGVAR(setVehicleDamage), {_this call FUNC(setDamage)}] call CBA_fnc_addEventHandler; + [QGVAR(setVehicleHitPointDamage), {_this call FUNC(setHitPointDamage)}] call CBA_fnc_addEventHandler; + [QGVAR(setWheelHitPointDamage), { + params ["_object", "_hitPoint", "_damage"]; + private _damageDisabled = !isDamageAllowed _object; + + if (_damageDisabled) then { + _object allowDamage true; + }; + + _object setHitPointDamage [_hitPoint, _damage]; + + if (_damageDisabled) then { + _object allowDamage false; + }; + }] call CBA_fnc_addEventHandler; + + + // placed in editor static objects don't trigger init + { + if (local _x && {getRepairCargo _x > 0}) then { + _x setRepairCargo 0; + TRACE_3("setRepairCargo static",_x,typeOf _x,getRepairCargo _x); + }; + } forEach allMissionObjects "Static"; + + ["All", "InitPost", { + params ["_vehicle"]; + if !(local _vehicle && {getRepairCargo _vehicle > 0}) exitWith {}; + _vehicle setRepairCargo 0; + TRACE_3("setRepairCargo vehicle",_vehicle,typeOf _vehicle,getRepairCargo _vehicle); + }, true, ["Man"], true] call CBA_fnc_addClassEventHandler; + + ["CAManBase", "InitPost", { + params ["_unit"]; + if !(local _unit && {_unit getUnitTrait "engineer"}) exitWith {}; + _unit setUnitTrait ["engineer", false]; + if (_unit getVariable ["ACE_IsEngineer", -1] isEqualTo -1) then { + _unit setVariable ["ACE_IsEngineer", true, true]; + }; + TRACE_3("setUnitTrait",_unit,typeOf _unit,_unit getUnitTrait "engineer"); + }, true, [], true] call CBA_fnc_addClassEventHandler; + + + GVAR(allToolKits) = call (uiNamespace getVariable QGVAR(allToolKits)); + + ["ACE_RepairItem_Base", "killed", { + params ["_object"]; + + [{deleteVehicle _this}, _object, 5] call CBA_fnc_waitAndExecute; + }, true, [], true] call CBA_fnc_addClassEventHandler; + + // load tracks and wheels + if (isServer) then { + private _fnc_addSpareItems = { + if (!GVAR(addSpareParts)) exitWith {}; + params ["_vehicle"]; + + private _spareTracks = _vehicle getVariable QGVAR(editorLoadedTracks); + if (isNil "_spareTracks") then { + _spareTracks = parseNumber (_vehicle isKindOf "Tank"); // must match eden attribute default + }; + if (_spareTracks > 0) then { + [_vehicle, _spareTracks, "ACE_Track"] call FUNC(addSpareParts); + }; + + private _spareWheels = _vehicle getVariable QGVAR(editorLoadedWheels); + if (isNil "_spareWheels") then { + _spareWheels = parseNumber (_vehicle isKindOf "Car"); // must match eden attribute default + }; + if (_spareWheels > 0) then { + [_vehicle, _spareWheels, "ACE_Wheel"] call FUNC(addSpareParts); + }; + }; + + ["Tank", "initPost", _fnc_addSpareItems, true, [], true] call CBA_fnc_addClassEventHandler; + ["Car", "initPost", _fnc_addSpareItems, true, [], true] call CBA_fnc_addClassEventHandler; }; - _object setHitPointDamage [_hitPoint, _damage]; - - if (_damageDisabled) then { - _object allowDamage false; - }; }] call CBA_fnc_addEventHandler; diff --git a/addons/repair/XEH_preInit.sqf b/addons/repair/XEH_preInit.sqf index 2fd97fbf01..9361d05015 100644 --- a/addons/repair/XEH_preInit.sqf +++ b/addons/repair/XEH_preInit.sqf @@ -8,39 +8,4 @@ PREP_RECOMPILE_END; #include "initSettings.sqf" -GVAR(allToolKits) = call (uiNamespace getVariable QGVAR(allToolKits)); - -["ACE_RepairItem_Base", "killed", { - params ["_object"]; - - [{deleteVehicle _this}, _object, 5] call CBA_fnc_waitAndExecute; -}] call CBA_fnc_addClassEventHandler; - -// load tracks and wheels -if (isServer) then { - private _fnc_addSpareItems = { - if (!GVAR(addSpareParts)) exitWith {}; - params ["_vehicle"]; - - private _spareTracks = _vehicle getVariable QGVAR(editorLoadedTracks); - if (isNil "_spareTracks") then { - _spareTracks = [0, 1] select (_vehicle isKindOf "Tank"); // must match eden attribute default - }; - if (_spareTracks > 0) then { - [_vehicle, _spareTracks, "ACE_Track"] call FUNC(addSpareParts); - }; - - private _spareWheels = _vehicle getVariable QGVAR(editorLoadedWheels); - if (isNil "_spareWheels") then { - _spareWheels = [0, 1] select (_vehicle isKindOf "Car"); // must match eden attribute default - }; - if (_spareWheels > 0) then { - [_vehicle, _spareWheels, "ACE_Wheel"] call FUNC(addSpareParts); - }; - }; - - ["Tank", "initPost", _fnc_addSpareItems] call CBA_fnc_addClassEventHandler; - ["Car", "initPost", _fnc_addSpareItems] call CBA_fnc_addClassEventHandler; -}; - ADDON = true; diff --git a/addons/repair/config.cpp b/addons/repair/config.cpp index 1dbe9b46b1..05ee4bac01 100644 --- a/addons/repair/config.cpp +++ b/addons/repair/config.cpp @@ -16,7 +16,6 @@ class CfgPatches { #include "ACE_Repair.hpp" #include "ACE_Settings.hpp" -#include "CfgActions.hpp" #include "CfgEden.hpp" #include "CfgEventHandlers.hpp" #include "CfgMoves.hpp" diff --git a/addons/repair/functions/fnc_addRepairActions.sqf b/addons/repair/functions/fnc_addRepairActions.sqf index 20607ca940..16f88bf3d5 100644 --- a/addons/repair/functions/fnc_addRepairActions.sqf +++ b/addons/repair/functions/fnc_addRepairActions.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: commy2, SilentSpike + * Author: commy2, kymckay * Checks if the vehicles class already has the actions initialized, otherwise add all available repair options. Calleed from init EH. * * Arguments: @@ -15,7 +15,11 @@ * Public: No */ -if (!hasInterface) exitWith {}; +if !(EGVAR(common,settingsInitFinished)) exitWith { + EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(addRepairActions), _this]; +}; + +if !(hasInterface && {GVAR(enabled)}) exitWith {}; params ["_vehicle"]; private _type = typeOf _vehicle; @@ -53,7 +57,7 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi // Wheels should always be unique if (_selection in _processedSelections) exitWith {TRACE_3("Duplicate Wheel",_hitpoint,_forEachIndex,_selection);}; - private _position = compile format ["_target selectionPosition ['%1', 'HitPoints'];", _selection]; + private _position = compile format ["_target selectionPosition ['%1', 'HitPoints', 'AveragePoint'];", _selection]; TRACE_3("Adding Wheel Actions",_hitpoint,_forEachIndex,_selection); diff --git a/addons/repair/functions/fnc_getHitPointsToIgnore.sqf b/addons/repair/functions/fnc_getHitPointsToIgnore.sqf index 24f2d9a207..457647dd8f 100644 --- a/addons/repair/functions/fnc_getHitPointsToIgnore.sqf +++ b/addons/repair/functions/fnc_getHitPointsToIgnore.sqf @@ -18,7 +18,7 @@ params ["_vehicle"]; private _type = typeOf _vehicle; -TRACE_2("getHitPointsToIgnore", _vehicle,_type); +TRACE_2("getHitPointsToIgnore",_vehicle,_type); private _initializedClasses = missionNamespace getVariable [QGVAR(hitPointsToIgnoreInitializedClasses), createHashMap]; if (_type in _initializedClasses) exitWith {_initializedClasses get _type}; @@ -62,16 +62,6 @@ private _processedSelections = []; continue }; - if (_hitpoint select [0,1] isEqualTo "#" || {_hitpoint select [0,9] isEqualTo "hit_light"}) then { // skip lights - TRACE_3("Skipping light",_hitpoint,_forEachIndex,_selection); - /*#ifdef DEBUG_MODE_FULL - systemChat format ["Skipping light, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; - #endif*/ - _hitPointsToIgnore pushBackUnique _hitpoint; - _processedSelections pushBack _selection; - continue - }; - if (_hitpoint select [0,7] isEqualTo "hitera_" || {_hitpoint select [0,8] isEqualTo "hitslat_"} || {_hitpoint select [0,4] isEqualTo "era_"}) then { // skip era/slat TRACE_3("Skipping ERA/Slat HitPoint",_hitpoint,_forEachIndex,_selection); /*#ifdef DEBUG_MODE_FULL @@ -118,12 +108,19 @@ private _processedSelections = []; /*#ifdef DEBUG_MODE_FULL systemChat format ["Skipping depends hitpoint, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; #endif*/ + + private _groupIndex = _hitpointGroups findIf {_x # 0 == _hitpoint}; + if (_groupIndex != -1) then { + ERROR_2("[%1] hitpoint [%2] is both a group-parent and a depends and will be unrepairable",_type,_hitpoint); + ERROR_1("group: %1",_hitpointGroups # _groupIndex); + }; + _hitPointsToIgnore pushBackUnique _hitpoint; _processedSelections pushBack _selection; continue }; - if ((_hitpointGroups findIf {(_x select 1) == _hitpoint}) != -1) then { // skip child hitpoints + if (ANY_OF(_hitpointGroups, ANY_OF(_x select 1, _x == _hitpoint))) then { // skip child hitpoints TRACE_3("Skipping child hitpoint",_hitpoint,_forEachIndex,_selection); /*#ifdef DEBUG_MODE_FULL systemChat format ["Skipping child hitpoint, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; diff --git a/addons/repair/functions/fnc_isInRepairFacility.sqf b/addons/repair/functions/fnc_isInRepairFacility.sqf index a0a1615cd9..788845f11d 100644 --- a/addons/repair/functions/fnc_isInRepairFacility.sqf +++ b/addons/repair/functions/fnc_isInRepairFacility.sqf @@ -10,20 +10,32 @@ * Is inside a repair facility * * Example: - * [unit] call ace_repair_fnc_isInRepairFacility + * player call ace_repair_fnc_isInRepairFacility * * Public: Yes */ -#define CHECK_OBJECTS(var) ((var) findIf {(_x getVariable ["ACE_isRepairFacility", getNumber (configOf _x >> QGVAR(canRepair))] > 0) && {!(_x isKindOf "AllVehicles")} && {alive _x}} != -1) +#define CHECK_OBJECTS(var) ((var) findIf _checkObject != -1) -params [["_object", objNull, [objNull]]]; -TRACE_1("params",_object); +params [["_unit", objNull, [objNull]]]; +TRACE_1("params",_unit); +private _checkObject = { + private _config = configOf _x; + private _canRepair = getNumber (_config >> QGVAR(canRepair)); + if (_canRepair == 0) then { + _canRepair = getNumber (_config >> "transportRepair"); + }; -private _fnc_check = { - private _position = _object modelToWorldVisual [0, 0, eyePos _object select 2]; - CHECK_OBJECTS(lineIntersectsWith [ARR_3(_position, _position vectorAdd [ARR_3(0, 0, 10)], _object)]) || {CHECK_OBJECTS(_object nearObjects 7.5)} + _x getVariable ["ACE_isRepairFacility", _canRepair > 0] in [1, true] // can be integer or boolean + && {!(_x isKindOf "AllVehicles")} // check if it's not repair vehicle + && {alive _x} }; -[[], _fnc_check, _object, QGVAR(inRepairFacilityCache), IN_REPAIR_FACILITY_CACHE_EXPIRY] call EFUNC(common,cachedCall); +private _fnc_check = { + private _position = _unit modelToWorldVisual [0, 0, eyePos _unit select 2]; + CHECK_OBJECTS(lineIntersectsWith [ARR_3(_position, _position vectorAdd [ARR_3(0, 0, 10)], _unit)]) + || {CHECK_OBJECTS(_unit nearObjects 7.5)} +}; + +[[], _fnc_check, _unit, QGVAR(inRepairFacilityCache), IN_REPAIR_FACILITY_CACHE_EXPIRY] call EFUNC(common,cachedCall); diff --git a/addons/repair/functions/fnc_isRepairVehicle.sqf b/addons/repair/functions/fnc_isRepairVehicle.sqf index dd2f69f34c..dd2b1329a2 100644 --- a/addons/repair/functions/fnc_isRepairVehicle.sqf +++ b/addons/repair/functions/fnc_isRepairVehicle.sqf @@ -10,7 +10,7 @@ * Is engineering vehicle * * Example: - * [vehicle] call ace_repair_fnc_isRepairVehicle + * cursorObject call ace_repair_fnc_isRepairVehicle * * Public: Yes */ @@ -20,6 +20,11 @@ TRACE_1("params",_vehicle); if (_vehicle isKindOf "CAManBase") exitWith {false}; +private _config = configOf _vehicle; +private _canRepair = getNumber (_config >> QGVAR(canRepair)); +if (_canRepair == 0) then { + _canRepair = getNumber (_config >> "transportRepair"); +}; // Value can be integer or boolean -private _value = _vehicle getVariable ["ACE_isRepairVehicle", getNumber (configOf _vehicle >> QGVAR(canRepair))]; +private _value = _vehicle getVariable ["ACE_isRepairVehicle", _canRepair > 0]; _value in [1, true] // return diff --git a/addons/repair/functions/fnc_setDamage.sqf b/addons/repair/functions/fnc_setDamage.sqf index 13549ca54d..4840624105 100644 --- a/addons/repair/functions/fnc_setDamage.sqf +++ b/addons/repair/functions/fnc_setDamage.sqf @@ -6,7 +6,7 @@ * Arguments: * 0: Local Vehicle to Damage * 1: Total Damage - # 2: Use destruction effects + * 2: Use destruction effects * * Return Value: * None diff --git a/addons/repair/initSettings.sqf b/addons/repair/initSettings.sqf index 066e944a50..3ba13e9ee6 100644 --- a/addons/repair/initSettings.sqf +++ b/addons/repair/initSettings.sqf @@ -1,5 +1,15 @@ private _category = format ["ACE %1", LLSTRING(Repair)]; +[ + QGVAR(enabled), "CHECKBOX", + ELSTRING(common,Enabled), + _category, + true, + true, + {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true +] call CBA_fnc_addSetting; + [ QGVAR(displayTextOnRepair), "CHECKBOX", [LSTRING(SettingDisplayTextName), LSTRING(SettingDisplayTextDesc)], diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index 4929e0f31a..c55873dedb 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -39,6 +39,7 @@ Wheel Rad Rueda + タイヤ Change Wheel @@ -268,9 +269,11 @@ Full Repair Time Coefficient + 完全修理時間係数 Modifies how long it takes to perform a Full Repair.\nThe repair time is based on based on the amount of repairs needed for each part, including those normally inaccessible. + 完全修復にかかる時間を変更します。\n修理時間は、通常アクセスできない部品も含め、各部品に必要な修理量に基づいて決定されます。 Boost engineer training when in repair vehicles or facilities. Untrained becomes engineer, engineer becomes advanced engineer. @@ -372,7 +375,7 @@ Přidat náhradní díly do vozidla (vyžaduje úložný prostor)? Aggiungi parti di ricambio ai veicoli (richiede componente Cargo)? Ajoute des pièces de rechange aux véhicules (nécessite le système de cargaison). - 車両へ予備部品を追加しますか(カーゴ コンポーネントが必要)? + 車両へ予備部品を追加しますか? (カーゴ コンポーネントが必要) 차량에 예비 부품을 더합니까?(짐칸 요소 필요) 添加载具备件(需相关货物组件)? 添加載具備件 (需相關貨物組件)? @@ -1221,6 +1224,7 @@ Erlaube Radwechsel Wymiana kół Разрешить замену колес + タイヤ交換の許可 Who can remove and replace wheels? @@ -1240,10 +1244,12 @@ Allow Wheel Patching Erlaube Radflicken + タイヤ補修を許可 Who can patch wheels? Wer kann Radflicken durchführen? + 誰がタイヤの補修を出来るようにしますか? Allow Repair @@ -1875,7 +1881,7 @@ Vyžaduje opravu kol Requisiti riparazione ruote Exigences pour réparation des roues - タイヤの修理を必要 + タイヤ修理の要求 바퀴 교체 요구사항 维修轮胎限制 維修輪胎限制 @@ -1898,10 +1904,12 @@ Wheel Patch Requirements Bedingungen für die Radflicken + タイヤ補修の要求 Items required to patch a wheel. Gegenstänge, die zum Reifenflicken benötigt werden. + タイヤ補修にアイテムを必要としますか? Misc Repair Requirements @@ -2070,49 +2078,63 @@ Part Repair Time + 部分修理時間 Time in seconds to complete a repair. + 修理完了までの時間 Wheel Change Time + タイヤ交換時間 Time in seconds to remove or change a wheel. + タイヤの取り外しまたは交換にかかる時間。 Patch Wheel Radflicken + タイヤを補修する Patching Wheel... Radflicken... + タイヤを補修しています・・・ Wheel Patch Time + タイヤ補修時間 Time it takes to patch a wheel by 5%. + タイヤを5%補修するのにかかる時間。 Patch Wheel Threshold + タイヤ補修しきい値 Maximum level to which a wheel can be patched. + タイヤを補修できる最大の度合い。 Wheel Patch Location + タイヤ補修場所 Where the wheel can be patched. + タイヤを補修できる場所。 On the ground Auf dem Boden + 地上 On a vehicle An einem Fahrzeug + 車両上 diff --git a/addons/slideshow/GUI.hpp b/addons/slideshow/GUI.hpp new file mode 100644 index 0000000000..87b42aa570 --- /dev/null +++ b/addons/slideshow/GUI.hpp @@ -0,0 +1,35 @@ +class GVAR(mapDisplay) { + onLoad = QUOTE(call FUNC(mapImage_init)); + idd = -1; + class Controls {}; +}; + +class ctrlMap; +class GVAR(mapNormal): ctrlMap { + maxSatelliteAlpha = 0; + sizeExLabel = 0; + sizeExUnits = 0; + sizeExInfo = 0; + sizeExLevel = 0; + sizeEx = 0; + scaleMin = 0.005; + scaleMax = 10; + showCountourInterval = 0; + drawShaded = 0.15; + shadedSea = 0.15; + showMarkers = 0; +}; +class GVAR(mapTopo): GVAR(mapNormal) { + drawShaded = 0.35; + shadedSea = 0.35; + sizeExLevel = 0.02; + colorCountlines[] = {0.647059, 0.533333, 0.286275, 0.5}; + colorMainCountlines[] = {0.858824, 0, 0,0.5}; + ptsPerSquareObj = 2000; // don't show buildings +}; +class GVAR(mapSat): GVAR(mapNormal) { + // ref https://feedback.bistudio.com/T170918 - may have problems loading sat textures + maxSatelliteAlpha = 0.95; + colorForest[] = {0, 1, 0, 0}; + colorForestBorder[] = {0, 1, 0, 0}; +}; diff --git a/addons/slideshow/XEH_PREP.hpp b/addons/slideshow/XEH_PREP.hpp index ca31404b53..52c5cb4217 100644 --- a/addons/slideshow/XEH_PREP.hpp +++ b/addons/slideshow/XEH_PREP.hpp @@ -1,5 +1,6 @@ - PREP(addSlideActions); PREP(autoTransition); PREP(createSlideshow); +PREP(mapImage); +PREP(mapImage_init); PREP(moduleInit); diff --git a/addons/slideshow/config.cpp b/addons/slideshow/config.cpp index 93378a3e82..8b375b7f74 100644 --- a/addons/slideshow/config.cpp +++ b/addons/slideshow/config.cpp @@ -16,3 +16,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" +#include "GUI.hpp" diff --git a/addons/slideshow/functions/fnc_mapImage.sqf b/addons/slideshow/functions/fnc_mapImage.sqf new file mode 100644 index 0000000000..0d985d5e57 --- /dev/null +++ b/addons/slideshow/functions/fnc_mapImage.sqf @@ -0,0 +1,67 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Returns a procedural texture that will display a custom map. + * Needs to be run on all machines. + * + * Arguments: + * 0: Position (default: center of map) + * 1: Scale (1.0 fits entire map in x-dimension) (default: 1.25) + * 2: Markers (default: []) + * - 0: Position 2D/3D (default: [0, 0, 0]) + * - 1: Text (default: "") + * - 2: Marker Type or Icon Name (default: "mil_dot") + * - 3: Color (default: [1, 0, 0, 1]) + * 3: Map Type (0: Normal, 1: Topographic, 2: Satellite) or any custom class (even mission config) (default: 0) + * 4: Code to run on init (will be passed [_map, _display, _displayID]) (default: {}) + * 5: Resolution (default: 4096) + * + * Return Value: + * Procedural Texture + * + * Example: + * [] call ace_slideshow_fnc_mapImage + * [getPos player, 0.3, [], 1] call ace_slideshow_fnc_mapImage + * [[5000, 5000], 0.5, [[getpos player, "obj"]], 2, {}] call ace_slideshow_fnc_mapImage + * + * Public: Yes + */ + +params [ + ["_pos", [worldSize / 2, worldSize / 2], [[]]], + ["_scale", 1.25, [0]], + ["_markers", [], [[]]], + ["_mapType", 0, [0, ""]], // 2.14 may allow config type as well + ["_userCode", {}, [{}]], + ["_resolution", 4096, [0]] +]; +TRACE_6("",_pos,_scale,count _markers,_mapType,_userCode isEqualTo {},_resolution); + +_markers = _markers apply { // convert marker array to draw command + _x params [["_xPos", [0,0,0], [[]]], ["_xText", "", [""]], ["_xIcon", "mil_dot", [""]], ["_xColor", [1,0,0,1], [[]]]]; + private _size = 0; + private _config = configFile >> "CfgMarkers" >> _xIcon; + if (isClass _config) then { + _size = 0.5 * getNumber (_config >> "size"); + _xIcon = getText (_config >> "icon"); // don't swap order + } else { + if (_xIcon != "") then { _size = 16 }; // could be a file or a CfgVehicleIcons class + }; + [_xIcon, _xColor, _xPos, _size, _size, 0, _xText, 0, 0.08] +}; + +if (_mapType isEqualType 0) then { + _mapType = [QGVAR(mapNormal), QGVAR(mapTopo), QGVAR(mapSat)] select _mapType; +}; +if ((!isClass (configFile >> _mapType)) && {(!isClass (missionConfigFile >> _mapType))}) then { + ERROR_1("bad map type %1",_mapType); +}; + +// set data in hash +if (isNil QGVAR(mapData)) then { GVAR(mapData) = createHashMap; }; +private _displayID = format ["ace_s_%1", count GVAR(mapData)]; +TRACE_1("setting hash",_displayID); +GVAR(mapData) set [_displayID, [_pos, _scale, _markers, _mapType, _userCode]]; + +// return texture name +format ['#(rgb,%1,%1,1)ui("%2","%3")', _resolution, QGVAR(mapDisplay), _displayID] diff --git a/addons/slideshow/functions/fnc_mapImage_init.sqf b/addons/slideshow/functions/fnc_mapImage_init.sqf new file mode 100644 index 0000000000..1c84b98740 --- /dev/null +++ b/addons/slideshow/functions/fnc_mapImage_init.sqf @@ -0,0 +1,67 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Initializes the map texture display. + * + * Arguments: + * 0: Display (default: displayNull) + * 1: Disply ID (default: "") + * + * Return Value: + * None + * + * Example: + * [findDisplay "ace_s_0"] call ace_slideshow_fnc_mapImage_init + * + * Public: No + */ + +params [["_display", displayNull], ["_displayID", ""]]; // only one of these will be valid +// On primary call from the display's onload we will only have the actual display +if (_displayID == "") then { _displayID = displayUniqueName _display; }; +// On the delayed call (due to hash missing) we will only have the displayID +if (isNull _display) then { _display = findDisplay _displayID; }; +TRACE_2("mapImage_init",_display,_displayID); + +// seems like display can sometimes not exist even though it does +// it won't be updated correctly, seems to depend on resolution, seems to be fixed mostly by the 2nd update run +if (isNull findDisplay _displayID) then { WARNING_1("possible problem with texture %1",_displayID); }; + +// make sure data exists in hash, there can be a race if server broadcasts texture before client can finish init.sqf +if (isNil QGVAR(mapData) || {!(_displayID in GVAR(mapData))}) exitWith { + WARNING_1("texture %1 has no data in hash",_displayID); + if (!isNull (param [0, displayNull])) then { // not a retry, checking using value from _this + [FUNC(mapImage_init), [displayNull, _displayID], 5] call CBA_fnc_waitAndExecute; + }; +}; + +(GVAR(mapData) get _displayID) params ["_posCenter", "_scale", "_markers", "_mapType", "_userCode"]; +TRACE_4("data",_posCenter,_scale,count _markers,_mapType); + +private _map = _display ctrlCreate [_mapType, -1]; +_map ctrlSetPosition [0, 0, 1, 1]; +_map ctrlCommit 0; +_map ctrlMapSetPosition []; + +_map ctrlMapAnimAdd [0, _scale, _posCenter]; +ctrlMapAnimCommit _map; + +[_map, _display, _displayID] call _userCode; + +// add drawEH to draw markers next update (they will get drawn 3 times total) +_map setVariable ["markers", _markers]; +_map ctrlAddEventHandler ["draw", { + params ["_map"]; + private _markers = _map getVariable ["markers", []]; + TRACE_2("drawing markers",_map,count _markers); + { _map drawIcon _x } forEach _markers; +}]; + +private _update = { + private _display = findDisplay _this; + if (isNull _display) exitWith {}; + TRACE_2("updating",_display,displayUniqueName _display); + displayUpdate _display; +}; +[_update, _displayID] call CBA_fnc_execNextFrame; // update after a frame so the map anim has time to take effect +[_update, _displayID, 2] call CBA_fnc_waitAndExecute; // update a bit later so textures hopefully have time to load diff --git a/addons/slideshow/stringtable.xml b/addons/slideshow/stringtable.xml index 4d6289cc89..d5d55b934e 100644 --- a/addons/slideshow/stringtable.xml +++ b/addons/slideshow/stringtable.xml @@ -222,7 +222,7 @@ Doba trvání každého snímku. Výchozí: 0 (Automatické posouvání je zakázáno) Durata di ogni diapositiva. Default: 0 (Transizioni Automatiche Disabilitate) Länge der Diavorführung pro Bild. Standard: 0 (Automatischer Wechsel deaktiviert) - 各スライドの持続時間。標準:0 (自動的な切り替えは無効) + 各スライドの持続時間。標準:0 (自動的な切り替えは無効) 매 슬라이드의 지속 시간. 기본설정: 0 (자동 전환 비활성화) 每張幻燈片顯示的時間。 預設:0 (自動換圖已禁用) 每张幻灯片显示的时间。 预设:0(自动换图已禁用) diff --git a/addons/spectator/config.cpp b/addons/spectator/config.cpp index 44f98b6931..a50e3f34ed 100644 --- a/addons/spectator/config.cpp +++ b/addons/spectator/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; author = ECSTRING(common,ACETeam); - authors[] = {"F3 Project","Head","SilentSpike","voiper"}; + authors[] = {"F3 Project","Head","kymckay","voiper"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/spectator/functions/fnc_cam.sqf b/addons/spectator/functions/fnc_cam.sqf index d61fff40c1..4c12095c81 100644 --- a/addons/spectator/functions/fnc_cam.sqf +++ b/addons/spectator/functions/fnc_cam.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Handles camera initialisation and destruction * * Arguments: diff --git a/addons/spectator/functions/fnc_cam_prepareTarget.sqf b/addons/spectator/functions/fnc_cam_prepareTarget.sqf index 21ced5addd..42c4841d9b 100644 --- a/addons/spectator/functions/fnc_cam_prepareTarget.sqf +++ b/addons/spectator/functions/fnc_cam_prepareTarget.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Moves the spectator camera to a position relative to the camera focus. * Used for 3PP camera and teleporting, etc. * diff --git a/addons/spectator/functions/fnc_cam_resetTarget.sqf b/addons/spectator/functions/fnc_cam_resetTarget.sqf index 5286d944e3..a2993d8a66 100644 --- a/addons/spectator/functions/fnc_cam_resetTarget.sqf +++ b/addons/spectator/functions/fnc_cam_resetTarget.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Removes the current camera interest and detaches dummy target. * * Arguments: diff --git a/addons/spectator/functions/fnc_cam_setCameraMode.sqf b/addons/spectator/functions/fnc_cam_setCameraMode.sqf index 3943823f8a..0c0ee23ca7 100644 --- a/addons/spectator/functions/fnc_cam_setCameraMode.sqf +++ b/addons/spectator/functions/fnc_cam_setCameraMode.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to select the camera mode * * Intended to run even if new mode == old mode, as it handles focus diff --git a/addons/spectator/functions/fnc_cam_setTarget.sqf b/addons/spectator/functions/fnc_cam_setTarget.sqf index 4587af8c34..7028991347 100644 --- a/addons/spectator/functions/fnc_cam_setTarget.sqf +++ b/addons/spectator/functions/fnc_cam_setTarget.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Sets the current camera interest using dummy target. * * Arguments: diff --git a/addons/spectator/functions/fnc_cam_setVisionMode.sqf b/addons/spectator/functions/fnc_cam_setVisionMode.sqf index ccc761934d..eb1927366c 100644 --- a/addons/spectator/functions/fnc_cam_setVisionMode.sqf +++ b/addons/spectator/functions/fnc_cam_setVisionMode.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Function used to select the camera vision mode * * Arguments: diff --git a/addons/spectator/functions/fnc_cam_tick.sqf b/addons/spectator/functions/fnc_cam_tick.sqf index 3ec0dbe5e6..c8411dc579 100644 --- a/addons/spectator/functions/fnc_cam_tick.sqf +++ b/addons/spectator/functions/fnc_cam_tick.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to perform camera ticks * * Updates camera position in follow mode diff --git a/addons/spectator/functions/fnc_cam_toggleSlow.sqf b/addons/spectator/functions/fnc_cam_toggleSlow.sqf index e6b8732cdb..e4cdcb80d4 100644 --- a/addons/spectator/functions/fnc_cam_toggleSlow.sqf +++ b/addons/spectator/functions/fnc_cam_toggleSlow.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Function used to set camera slow speed mode * * Arguments: diff --git a/addons/spectator/functions/fnc_compat_counter.sqf b/addons/spectator/functions/fnc_compat_counter.sqf index 158bcbd0a5..bac87d7448 100644 --- a/addons/spectator/functions/fnc_compat_counter.sqf +++ b/addons/spectator/functions/fnc_compat_counter.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Handles integrating the counter respawn template into the spectator UI * * Should be called from both RscRespawnCounter XEH and spectator init to account for arbitrary order diff --git a/addons/spectator/functions/fnc_compat_spectatorBI.sqf b/addons/spectator/functions/fnc_compat_spectatorBI.sqf index f8817468f1..539b00659c 100644 --- a/addons/spectator/functions/fnc_compat_spectatorBI.sqf +++ b/addons/spectator/functions/fnc_compat_spectatorBI.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Handles "compatibility" (i.e. override) for BI spectator respawn types 1, 4 & 5 * * Called from the RscDisplayEGSpectator XEH diff --git a/addons/spectator/functions/fnc_compat_zeus.sqf b/addons/spectator/functions/fnc_compat_zeus.sqf index a8f190bdd4..2fc514f3a7 100644 --- a/addons/spectator/functions/fnc_compat_zeus.sqf +++ b/addons/spectator/functions/fnc_compat_zeus.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Handles compatibility with curator interface (i.e. re-opens spectator if applicable) * * Called from the RscDisplayCurator XEH diff --git a/addons/spectator/functions/fnc_getCameraAttributes.sqf b/addons/spectator/functions/fnc_getCameraAttributes.sqf index 9998d37431..d6cc7b6122 100644 --- a/addons/spectator/functions/fnc_getCameraAttributes.sqf +++ b/addons/spectator/functions/fnc_getCameraAttributes.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Returns the current spectator camera attributes (see setCameraAttributes for details). * * Arguments: diff --git a/addons/spectator/functions/fnc_getGroupIcon.sqf b/addons/spectator/functions/fnc_getGroupIcon.sqf index a408df73dc..a4bd6fcb06 100644 --- a/addons/spectator/functions/fnc_getGroupIcon.sqf +++ b/addons/spectator/functions/fnc_getGroupIcon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Function used to get an appropriate icon for provided group. Approximate. * * Arguments: diff --git a/addons/spectator/functions/fnc_getTargetEntities.sqf b/addons/spectator/functions/fnc_getTargetEntities.sqf index 162967a1aa..6d57c1313e 100644 --- a/addons/spectator/functions/fnc_getTargetEntities.sqf +++ b/addons/spectator/functions/fnc_getTargetEntities.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Gets the possible entities to spectate based on settings. * Optionally includes dead units for the list and switching. * diff --git a/addons/spectator/functions/fnc_handleFired.sqf b/addons/spectator/functions/fnc_handleFired.sqf index b2efb97a5d..8705562c64 100644 --- a/addons/spectator/functions/fnc_handleFired.sqf +++ b/addons/spectator/functions/fnc_handleFired.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to add projectiles to be drawn when a unit fires * * Arguments: diff --git a/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf b/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf index 267ce5615f..9c6e461395 100644 --- a/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf +++ b/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Read spectator settings from module * * Arguments: diff --git a/addons/spectator/functions/fnc_players.sqf b/addons/spectator/functions/fnc_players.sqf index f79c6ce5e9..198727977c 100644 --- a/addons/spectator/functions/fnc_players.sqf +++ b/addons/spectator/functions/fnc_players.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Return all of the player entities who are currently in ace spectator * * Arguments: diff --git a/addons/spectator/functions/fnc_respawnTemplate.sqf b/addons/spectator/functions/fnc_respawnTemplate.sqf index 9cd54ac005..9833549d00 100644 --- a/addons/spectator/functions/fnc_respawnTemplate.sqf +++ b/addons/spectator/functions/fnc_respawnTemplate.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * The ace_spectator respawn template, compatible with types 1,2,3,4 & 5 * * Handles killed and respawned events as per BI's respawn framework: diff --git a/addons/spectator/functions/fnc_setCameraAttributes.sqf b/addons/spectator/functions/fnc_setCameraAttributes.sqf index 91db9c70c7..4212634880 100644 --- a/addons/spectator/functions/fnc_setCameraAttributes.sqf +++ b/addons/spectator/functions/fnc_setCameraAttributes.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Sets the spectator camera attributes as desired. Local effect. * All values are optional and default to no change. * diff --git a/addons/spectator/functions/fnc_setFocus.sqf b/addons/spectator/functions/fnc_setFocus.sqf index f524341a1f..84c354ec83 100644 --- a/addons/spectator/functions/fnc_setFocus.sqf +++ b/addons/spectator/functions/fnc_setFocus.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: AACO, SilentSpike + * Author: AACO, kymckay * Function used to set the camera focus * * Arguments: diff --git a/addons/spectator/functions/fnc_setSpectator.sqf b/addons/spectator/functions/fnc_setSpectator.sqf index d9942cc3ab..58627d1379 100644 --- a/addons/spectator/functions/fnc_setSpectator.sqf +++ b/addons/spectator/functions/fnc_setSpectator.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Enter/exit spectator mode for the local player * * Client will be able to communicate in ACRE/TFAR as appropriate diff --git a/addons/spectator/functions/fnc_switchFocus.sqf b/addons/spectator/functions/fnc_switchFocus.sqf index 8083a15e0f..97e9f36969 100644 --- a/addons/spectator/functions/fnc_switchFocus.sqf +++ b/addons/spectator/functions/fnc_switchFocus.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Function used to switch to next or previous camera focus * * Arguments: diff --git a/addons/spectator/functions/fnc_ui.sqf b/addons/spectator/functions/fnc_ui.sqf index f97dea3eb8..f885b161a8 100644 --- a/addons/spectator/functions/fnc_ui.sqf +++ b/addons/spectator/functions/fnc_ui.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Handles UI initialisation and destruction * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_draw3D.sqf b/addons/spectator/functions/fnc_ui_draw3D.sqf index 6affd3f8b6..fa863e12b5 100644 --- a/addons/spectator/functions/fnc_ui_draw3D.sqf +++ b/addons/spectator/functions/fnc_ui_draw3D.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to draw the 3D icons and track the cursor object * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_handleKeyDown.sqf b/addons/spectator/functions/fnc_ui_handleKeyDown.sqf index 25a50d140b..7905ced24d 100644 --- a/addons/spectator/functions/fnc_ui_handleKeyDown.sqf +++ b/addons/spectator/functions/fnc_ui_handleKeyDown.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" #include "\a3\ui_f\hpp\defineDIKCodes.inc" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to handle key down event * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_handleKeyUp.sqf b/addons/spectator/functions/fnc_ui_handleKeyUp.sqf index cf08d4caf6..b47ead7990 100644 --- a/addons/spectator/functions/fnc_ui_handleKeyUp.sqf +++ b/addons/spectator/functions/fnc_ui_handleKeyUp.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" #include "\a3\ui_f\hpp\defineDIKCodes.inc" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Function used to handle key up event * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_handleListClick.sqf b/addons/spectator/functions/fnc_ui_handleListClick.sqf index 225623668d..49266b1995 100644 --- a/addons/spectator/functions/fnc_ui_handleListClick.sqf +++ b/addons/spectator/functions/fnc_ui_handleListClick.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to handle list single/double clicks * * Expected behaviour: diff --git a/addons/spectator/functions/fnc_ui_handleLoad.sqf b/addons/spectator/functions/fnc_ui_handleLoad.sqf index bc6493e3f5..9f1a23fcc5 100644 --- a/addons/spectator/functions/fnc_ui_handleLoad.sqf +++ b/addons/spectator/functions/fnc_ui_handleLoad.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike, Jonpas + * Author: kymckay, Jonpas * Function used to handle load event. * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_handleMouseButtonDblClick.sqf b/addons/spectator/functions/fnc_ui_handleMouseButtonDblClick.sqf index ec7632e207..773beb4941 100644 --- a/addons/spectator/functions/fnc_ui_handleMouseButtonDblClick.sqf +++ b/addons/spectator/functions/fnc_ui_handleMouseButtonDblClick.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to handle mouse button double clicks * * Expected behaviour: diff --git a/addons/spectator/functions/fnc_ui_handleMouseButtonDown.sqf b/addons/spectator/functions/fnc_ui_handleMouseButtonDown.sqf index da74c071ba..d83d3c5a17 100644 --- a/addons/spectator/functions/fnc_ui_handleMouseButtonDown.sqf +++ b/addons/spectator/functions/fnc_ui_handleMouseButtonDown.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to handle mouse down event * * Expected behaviour: diff --git a/addons/spectator/functions/fnc_ui_toggleUI.sqf b/addons/spectator/functions/fnc_ui_toggleUI.sqf index 7e6716ba5e..44aec76ab5 100644 --- a/addons/spectator/functions/fnc_ui_toggleUI.sqf +++ b/addons/spectator/functions/fnc_ui_toggleUI.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to toggle the whole user interface * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_updateCamButtons.sqf b/addons/spectator/functions/fnc_ui_updateCamButtons.sqf index 77a8b3ca17..12c2182da0 100644 --- a/addons/spectator/functions/fnc_ui_updateCamButtons.sqf +++ b/addons/spectator/functions/fnc_ui_updateCamButtons.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Used to update the docked camera buttons * Disables unavailable, highlights current * diff --git a/addons/spectator/functions/fnc_ui_updateHelp.sqf b/addons/spectator/functions/fnc_ui_updateHelp.sqf index d1187ae355..bd08397acd 100644 --- a/addons/spectator/functions/fnc_ui_updateHelp.sqf +++ b/addons/spectator/functions/fnc_ui_updateHelp.sqf @@ -1,7 +1,7 @@ #include "script_component.hpp" #include "\a3\ui_f\hpp\defineDIKCodes.inc" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Updates spectator UI help element * * Note that there are some redundant conditions in this file diff --git a/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf b/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf index db3065c360..e3a63f811b 100644 --- a/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf +++ b/addons/spectator/functions/fnc_ui_updateIconsToDraw.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used update the things to 3D draw * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_updateListEntities.sqf b/addons/spectator/functions/fnc_ui_updateListEntities.sqf index 228dd86a27..1c1e05796b 100644 --- a/addons/spectator/functions/fnc_ui_updateListEntities.sqf +++ b/addons/spectator/functions/fnc_ui_updateListEntities.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Updates spectator UI list of units/groups * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_updateListFocus.sqf b/addons/spectator/functions/fnc_ui_updateListFocus.sqf index 3ac112e2cb..c62471e2ca 100644 --- a/addons/spectator/functions/fnc_ui_updateListFocus.sqf +++ b/addons/spectator/functions/fnc_ui_updateListFocus.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, AACO, SilentSpike + * Author: Nelson Duarte, AACO, kymckay * Function used to update the list current selection * * Arguments: diff --git a/addons/spectator/functions/fnc_ui_updateWidget.sqf b/addons/spectator/functions/fnc_ui_updateWidget.sqf index 68a0c1fe4f..c07c8502f4 100644 --- a/addons/spectator/functions/fnc_ui_updateWidget.sqf +++ b/addons/spectator/functions/fnc_ui_updateWidget.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Nelson Duarte, SilentSpike + * Author: Nelson Duarte, kymckay * Updates spectator UI unit info widget * * Arguments: diff --git a/addons/spectator/functions/fnc_updateCameraModes.sqf b/addons/spectator/functions/fnc_updateCameraModes.sqf index c3adf327da..3b1b73c09a 100644 --- a/addons/spectator/functions/fnc_updateCameraModes.sqf +++ b/addons/spectator/functions/fnc_updateCameraModes.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Adds or removes spectator camera modes from the selection available to the local player. * Possible camera modes are: * - 0: Free diff --git a/addons/spectator/functions/fnc_updateSides.sqf b/addons/spectator/functions/fnc_updateSides.sqf index 1f612a3080..b5142dd842 100644 --- a/addons/spectator/functions/fnc_updateSides.sqf +++ b/addons/spectator/functions/fnc_updateSides.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Adds or removes sides from the selection available to spectate. Local effect. * * Default selection is [west,east,resistance,civilian] diff --git a/addons/spectator/functions/fnc_updateUnits.sqf b/addons/spectator/functions/fnc_updateUnits.sqf index a32198c3de..9ac8c3f98e 100644 --- a/addons/spectator/functions/fnc_updateUnits.sqf +++ b/addons/spectator/functions/fnc_updateUnits.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Adds and removed units from the spectator list. Local effect. * * Arguments: diff --git a/addons/spectator/functions/fnc_updateVisionModes.sqf b/addons/spectator/functions/fnc_updateVisionModes.sqf index ba19bca86b..1a437d2d38 100644 --- a/addons/spectator/functions/fnc_updateVisionModes.sqf +++ b/addons/spectator/functions/fnc_updateVisionModes.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Adds or removes spectator vision modes from the selection available to the local player. * * Possible vision modes are: diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index cd26231ce3..5b92878c98 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -51,7 +51,7 @@ AI Enabled KI Sichtbarkeit - AI にも有効化 + AIにも有効化 AI Abilitate 可觀察AI 可观察 AI @@ -67,7 +67,7 @@ Make AI viewable in spectator Macht KI-Einheiten den Zuschauern sichtbar - スペクテイターで AI 視点を可能に + スペクテイターでAI視点を可能に Permette la visibilità delle AI in spettatore 開啟此功能後可在觀察者模式下觀察AI單位 开启此功能后可在观察者模式下观察 AI 单位。 diff --git a/addons/tagging/stringtable.xml b/addons/tagging/stringtable.xml index 34fb6cd7da..2c50e76254 100644 --- a/addons/tagging/stringtable.xml +++ b/addons/tagging/stringtable.xml @@ -352,9 +352,11 @@ Vehicle ID Marking + 車両IDマーキング Replaces clan tag with stenciled text + 部隊タグをステンシルテキストに置き換える diff --git a/addons/towing/config.cpp b/addons/towing/config.cpp index 548ac69582..d4d1b5e854 100644 --- a/addons/towing/config.cpp +++ b/addons/towing/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common", "ace_logistics_rope"}; author = ECSTRING(common,ACETeam); - authors[] = {"Dani (TCVM)"}; + authors[] = {"tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/towing/functions/fnc_attachRopePFH.sqf b/addons/towing/functions/fnc_attachRopePFH.sqf index 50cfeac5fe..cc011d0791 100644 --- a/addons/towing/functions/fnc_attachRopePFH.sqf +++ b/addons/towing/functions/fnc_attachRopePFH.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * PFH which allows the user to attach a rope to the given target vehicle * * Arguments: diff --git a/addons/towing/functions/fnc_canStartTow.sqf b/addons/towing/functions/fnc_canStartTow.sqf index 8f9d2136db..c4ae3b907d 100644 --- a/addons/towing/functions/fnc_canStartTow.sqf +++ b/addons/towing/functions/fnc_canStartTow.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Condition for whether or not we can tow from this object * * Arguments: diff --git a/addons/towing/functions/fnc_detach.sqf b/addons/towing/functions/fnc_detach.sqf index f593d5309f..da8f6692d6 100644 --- a/addons/towing/functions/fnc_detach.sqf +++ b/addons/towing/functions/fnc_detach.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Detaches child from parent, and gives rope item back * * Arguments: diff --git a/addons/towing/functions/fnc_isSuitableSimulation.sqf b/addons/towing/functions/fnc_isSuitableSimulation.sqf index 025b43937e..386a21b7af 100644 --- a/addons/towing/functions/fnc_isSuitableSimulation.sqf +++ b/addons/towing/functions/fnc_isSuitableSimulation.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Condition for whether or not this object is a simulation type which can be a tow parent (TankX or CarX) * * Arguments: diff --git a/addons/towing/functions/fnc_onMouseButtonDown.sqf b/addons/towing/functions/fnc_onMouseButtonDown.sqf index 174ad27ebb..77ac003143 100644 --- a/addons/towing/functions/fnc_onMouseButtonDown.sqf +++ b/addons/towing/functions/fnc_onMouseButtonDown.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Handles mouse interaction for attaching rope * * Arguments: diff --git a/addons/towing/functions/fnc_onMouseButtonUp.sqf b/addons/towing/functions/fnc_onMouseButtonUp.sqf index ba98e16373..f326833a30 100644 --- a/addons/towing/functions/fnc_onMouseButtonUp.sqf +++ b/addons/towing/functions/fnc_onMouseButtonUp.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Handles mouse interaction for attaching rope * * Arguments: diff --git a/addons/towing/functions/fnc_startTow.sqf b/addons/towing/functions/fnc_startTow.sqf index 18955ae397..06d478ce27 100644 --- a/addons/towing/functions/fnc_startTow.sqf +++ b/addons/towing/functions/fnc_startTow.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Start rope attach PFH * * Arguments: diff --git a/addons/towing/functions/fnc_towStateMachinePFH.sqf b/addons/towing/functions/fnc_towStateMachinePFH.sqf index fb11cadd75..9c27464d6e 100644 --- a/addons/towing/functions/fnc_towStateMachinePFH.sqf +++ b/addons/towing/functions/fnc_towStateMachinePFH.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Called per frame. Handles current unit state for attaching a rope to two vehicles * * Arguments: diff --git a/addons/towing/stringtable.xml b/addons/towing/stringtable.xml index 08aa997e1d..00553d818e 100644 --- a/addons/towing/stringtable.xml +++ b/addons/towing/stringtable.xml @@ -128,6 +128,7 @@ Dodaj linkę holowniczą do ekwipunku pojazdów 차량 소지품에 견인줄 추가 Añadir cuerda de remolcado al inventario del vehículo + 車両のインベントリに牽引ロープを追加する diff --git a/addons/trenches/ACE_Arsenal_Stats.hpp b/addons/trenches/ACE_Arsenal_Stats.hpp index ab467ea588..d8f79f3e5c 100644 --- a/addons/trenches/ACE_Arsenal_Stats.hpp +++ b/addons/trenches/ACE_Arsenal_Stats.hpp @@ -6,7 +6,7 @@ class EGVAR(arsenal,stats) { stats[] = {QGVAR(entrenchingTool)}; displayName = CSTRING(EntrenchingToolName); showText = 1; - textStatement = QUOTE(localize 'STR_ACE_Common_Yes'); // using localization macros in QUOTE is a PITA + textStatement = QUOTE(localize QUOTE(ELSTRING(common,yes))); condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) > 0); tabs[] = {{0,1,5}, {7}}; }; diff --git a/addons/trenches/stringtable.xml b/addons/trenches/stringtable.xml index 6a7addd39d..4e9ca33ab6 100644 --- a/addons/trenches/stringtable.xml +++ b/addons/trenches/stringtable.xml @@ -233,6 +233,7 @@ 참호 위장시키기 Камуфлировать окоп Camuflar trinchera + 塹壕を偽装 Removing Trench diff --git a/addons/ui/functions/fnc_setAdvancedElement.sqf b/addons/ui/functions/fnc_setAdvancedElement.sqf index 96453f1cfb..179355343f 100644 --- a/addons/ui/functions/fnc_setAdvancedElement.sqf +++ b/addons/ui/functions/fnc_setAdvancedElement.sqf @@ -33,9 +33,10 @@ _cachedElement params ["_idd", "_elements", "_location", "_conditions"]; // Exit if main vehicle type condition not fitting private _canUseWeaponOrInCargo = ACE_player call CBA_fnc_canUseWeapon || {-1 < vehicle ACE_player getCargoIndex ACE_player}; +private _inUAVCamera = !isNull getConnectedUAVUnit player; // explictly using player if ( - (_canUseWeaponOrInCargo && {_location == VEHICLE_ONLY}) - || {!_canUseWeaponOrInCargo && {_location == GROUND_ONLY}} + (_canUseWeaponOrInCargo && {!_inUAVCamera} && {_location == VEHICLE_ONLY}) + || {(!_canUseWeaponOrInCargo || {_inUAVCamera}) && {_location == GROUND_ONLY}} ) exitWith { TRACE_3("skip location",_this,_canUseWeaponOrInCargo,_location); false @@ -51,7 +52,7 @@ if ( }; _show = false; }; -} count _conditions; +} forEach _conditions; // Get setting from scripted API if (!_force) then { @@ -85,8 +86,7 @@ private _success = false; _control ctrlSetFade _fade; _control ctrlCommit 0; - } count _displays; - nil -} count _elements; + } forEach _displays; +} forEach _elements; _success diff --git a/addons/vehicle_damage/config.cpp b/addons/vehicle_damage/config.cpp index 1d13491c82..6b4f7cf685 100644 --- a/addons/vehicle_damage/config.cpp +++ b/addons/vehicle_damage/config.cpp @@ -9,7 +9,7 @@ class CfgPatches { // ammo/vehicle config defines touch all of these requiredAddons[] = { "ace_common", "ace_cookoff" }; author = ECSTRING(common,ACETeam); - authors[] = {"Dani (TCVM)"}; + authors[] = {"tcvm"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/vehicle_damage/functions/fnc_abandon.sqf b/addons/vehicle_damage/functions/fnc_abandon.sqf index b818581fd2..7ba8e5802e 100644 --- a/addons/vehicle_damage/functions/fnc_abandon.sqf +++ b/addons/vehicle_damage/functions/fnc_abandon.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Forces the AI currently in a vehicle to bail out. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_addDamage.sqf b/addons/vehicle_damage/functions/fnc_addDamage.sqf index c5ff04292e..b6c8071f50 100644 --- a/addons/vehicle_damage/functions/fnc_addDamage.sqf +++ b/addons/vehicle_damage/functions/fnc_addDamage.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Sets vehicle damage based on HitIndex. Failing that it falls back to HitPoint name. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_addEventHandler.sqf b/addons/vehicle_damage/functions/fnc_addEventHandler.sqf index f08c58f574..f73a5d7336 100644 --- a/addons/vehicle_damage/functions/fnc_addEventHandler.sqf +++ b/addons/vehicle_damage/functions/fnc_addEventHandler.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Adds the event handler to a vehicle. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf b/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf index ae787f2805..9e1f646fc2 100644 --- a/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf +++ b/addons/vehicle_damage/functions/fnc_calculatePenetrationInfo.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Calculates whether or not hit penetrated given armour or not. Only enabled with advanced penetration simulation turned on. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_detonate.sqf b/addons/vehicle_damage/functions/fnc_detonate.sqf index d29daed48d..132a6d67cc 100644 --- a/addons/vehicle_damage/functions/fnc_detonate.sqf +++ b/addons/vehicle_damage/functions/fnc_detonate.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Detonates vehicle ammo and heavily wounds all inside. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleBail.sqf b/addons/vehicle_damage/functions/fnc_handleBail.sqf index 860403c8d0..595f563177 100644 --- a/addons/vehicle_damage/functions/fnc_handleBail.sqf +++ b/addons/vehicle_damage/functions/fnc_handleBail.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Handles whether or not the crew should bail. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleCookoff.sqf b/addons/vehicle_damage/functions/fnc_handleCookoff.sqf index 9d97b393f3..5a907f4162 100644 --- a/addons/vehicle_damage/functions/fnc_handleCookoff.sqf +++ b/addons/vehicle_damage/functions/fnc_handleCookoff.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Checks hitpoint damage and determines if a vehicle should cookoff. * * Arguments: @@ -9,7 +9,8 @@ * 2: Intensity of cookoff * 3: Person who instigated cookoff (default: objNull) * 4: Part of vehicle which got hit (default: "") - * 5: Whether or not the vehicle can spawn ring-fire effect (default: false) + * 5: Whether or not the vehicle can spawn ring-fire effect (default: false) + * 6: Can Jet (default: true) * * Return Value: * If cooked off @@ -20,7 +21,7 @@ * Public: No */ -params ["_vehicle", "_chanceOfFire", "_intensity", ["_injurer", objNull], ["_hitPart", ""], ["_canRing", false]]; +params ["_vehicle", "_chanceOfFire", "_intensity", ["_injurer", objNull], ["_hitPart", ""], ["_canRing", false], ["_canJet", true]]; private _alreadyCookingOff = _vehicle getVariable [QGVAR(cookingOff), false]; @@ -31,6 +32,10 @@ if (!_alreadyCookingOff && { _chanceOfFire >= random 1 }) exitWith { _canRing = ([_configOf >> QGVAR(canHaveFireRing), "number", 0] call CBA_fnc_getConfigEntry) == 1; }; + if (_canJet) then { + _canJet = ([_configOf >> QEGVAR(cookoff,canHaveFireJet), "number", 1] call CBA_fnc_getConfigEntry) == 1; + }; + private _delayWithSmoke = _chanceOfFire < random 1; private _detonateAfterCookoff = (_fireDetonateChance / 4) > random 1; @@ -39,7 +44,8 @@ if (!_alreadyCookingOff && { _chanceOfFire >= random 1 }) exitWith { _source = ["hit_engine_point", "HitPoints"]; }; - [QEGVAR(cookOff,cookOff), [_vehicle, _intensity, _injurer, _delayWithSmoke, _fireDetonateChance, _detonateAfterCookoff, _source, _canRing]] call CBA_fnc_localEvent; + // sending nil for _maxIntensity (9th param) to use default value in ace_cookoff_fnc_cookOff + [QEGVAR(cookOff,cookOff), [_vehicle, _intensity, _injurer, _delayWithSmoke, _fireDetonateChance, _detonateAfterCookoff, _source, _canRing, nil, _canJet]] call CBA_fnc_localEvent; _vehicle setVariable [QGVAR(cookingOff), true]; LOG_4("Cooking-off [%1] with a chance-of-fire [%2] - Delayed Smoke | Detonate after cookoff [%3 | %4]",_vehicle,_chanceOfFire,_delayWithSmoke,_detonateAfterCookoff); [_vehicle] spawn FUNC(abandon); diff --git a/addons/vehicle_damage/functions/fnc_handleDamage.sqf b/addons/vehicle_damage/functions/fnc_handleDamage.sqf index ce2a816997..fae2a7d2cd 100644 --- a/addons/vehicle_damage/functions/fnc_handleDamage.sqf +++ b/addons/vehicle_damage/functions/fnc_handleDamage.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Called by "HandleDamage" event handler. Sets up hit array for this frame's damage. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleDetonation.sqf b/addons/vehicle_damage/functions/fnc_handleDetonation.sqf index 4a01a0ada6..867cc8c964 100644 --- a/addons/vehicle_damage/functions/fnc_handleDetonation.sqf +++ b/addons/vehicle_damage/functions/fnc_handleDetonation.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Checks hitpoint damage and determines if a vehicle should cookoff. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf b/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf index 2dca6de8c6..1b9b785dca 100644 --- a/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf +++ b/addons/vehicle_damage/functions/fnc_handleVehicleDamage.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Process vehicle hit. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_injureOccupants.sqf b/addons/vehicle_damage/functions/fnc_injureOccupants.sqf index 3e1f29a09d..726fbf11a8 100644 --- a/addons/vehicle_damage/functions/fnc_injureOccupants.sqf +++ b/addons/vehicle_damage/functions/fnc_injureOccupants.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Injures occupants in a vehicle based on percent chance of injury. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_knockOut.sqf b/addons/vehicle_damage/functions/fnc_knockOut.sqf index 773e4f9400..6a08ea175b 100644 --- a/addons/vehicle_damage/functions/fnc_knockOut.sqf +++ b/addons/vehicle_damage/functions/fnc_knockOut.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Knock out vehicle from battle. Destroy all internal hitpoints. * * Arguments: diff --git a/addons/vehicle_damage/functions/fnc_processHit.sqf b/addons/vehicle_damage/functions/fnc_processHit.sqf index b27425b4d2..7c4f2e4604 100644 --- a/addons/vehicle_damage/functions/fnc_processHit.sqf +++ b/addons/vehicle_damage/functions/fnc_processHit.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Dani (TCVM) + * Author: tcvm * Process hit by projectile against vehicle and apply appropiate damage to part. * * Arguments: diff --git a/addons/vehicles/functions/fnc_autoThrottle.sqf b/addons/vehicles/functions/fnc_autoThrottle.sqf index 9f55efd603..558414562a 100644 --- a/addons/vehicles/functions/fnc_autoThrottle.sqf +++ b/addons/vehicles/functions/fnc_autoThrottle.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Brandon (TCVM) + * Author: tcvm * Toggle speed limiter for Driver in Plane. Uses a simple PID controller to manage thrust * * Arguments: diff --git a/addons/viewdistance/stringtable.xml b/addons/viewdistance/stringtable.xml index e389c6096e..2d6ae9bd96 100644 --- a/addons/viewdistance/stringtable.xml +++ b/addons/viewdistance/stringtable.xml @@ -390,7 +390,7 @@ Látótávolság: Дальность видимости: Distanza Visiva: - 視界距離: + 視界距離: 시야: 视距: 視野距離: @@ -423,7 +423,7 @@ Ez a beállítás érvénytelen! A maximum mennyiség Настройка не верна! Текущий предел Questa opzione è invalida! Il limite è - このオプションは無効です!制限は + このオプションは無効です! 制限は 이 옵션은 불가능합니다! 제한은 该选项是无效的! 限制是 該選項是無效的! 限制是 diff --git a/addons/weaponselect/initSettings.sqf b/addons/weaponselect/initSettings.sqf index 507a4b5851..029c5201cb 100644 --- a/addons/weaponselect/initSettings.sqf +++ b/addons/weaponselect/initSettings.sqf @@ -1,7 +1,7 @@ [ QGVAR(displayText), "CHECKBOX", [LSTRING(SettingDisplayTextName), LSTRING(SettingDisplayTextDesc)], - localize ELSTRING(common,ACEKeybindCategoryWeapons), + ELSTRING(common,ACEKeybindCategoryWeapons), true, // default value false, // isGlobal {[QGVAR(displayText), _this] call EFUNC(common,cbaSettings_settingChanged)} diff --git a/addons/weather/functions/fnc_calculateWindChill.sqf b/addons/weather/functions/fnc_calculateWindChill.sqf index f657cba638..ffb93db9d3 100644 --- a/addons/weather/functions/fnc_calculateWindChill.sqf +++ b/addons/weather/functions/fnc_calculateWindChill.sqf @@ -23,5 +23,5 @@ params ["_t", "_v"]; if (_t > 10) exitWith { _t }; if (_v < 1.39) exitWith { _t }; -_v = _v * 3,6; // wind speed in km/h +_v = _v * 3.6; // wind speed in km/h (13.12 + 0.6215 * _t - 11.37 * _v ^ 0.16 + 0.3965 * _t * _v ^ 0.16) diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index fba513760e..3856828230 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -32,7 +32,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common", "ace_ai"}; author = ECSTRING(common,ACETeam); - authors[] = {"SilentSpike", "mharis001"}; + authors[] = {"kymckay", "mharis001"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; diff --git a/addons/zeus/functions/fnc_getModuleDestination.sqf b/addons/zeus/functions/fnc_getModuleDestination.sqf index 2066d5887e..e5a8d99151 100644 --- a/addons/zeus/functions/fnc_getModuleDestination.sqf +++ b/addons/zeus/functions/fnc_getModuleDestination.sqf @@ -5,14 +5,13 @@ * * Arguments: * 0: The souce object - * 1: Code to run when position is ready - * - Code is passed - * 0: Successful - * 1: Object - * 2: Position ASL - * 3: State of Shift - * 4: State of Ctrl - * 5: State of Alt + * 1: Code to run when position is ready (will be passed the following array) + * - 0: Successful + * - 1: Object + * - 2: Position ASL + * - 3: State of Shift + * - 4: State of Ctrl + * - 5: State of Alt * 2: Text (default: "") * 3: Icon image file (default: "\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa") * 4: Icon color (default: [1,0,0,1]) diff --git a/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf b/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf index 8e507ebb35..cf01ce8940 100644 --- a/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf +++ b/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Contextually removes addons (given in ACE_Curator) from zeus based on their required addon(s) * * ACE_Curator format: diff --git a/addons/zeus/functions/fnc_moduleCaptive.sqf b/addons/zeus/functions/fnc_moduleCaptive.sqf index 6420559a3f..80e39c8055 100644 --- a/addons/zeus/functions/fnc_moduleCaptive.sqf +++ b/addons/zeus/functions/fnc_moduleCaptive.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Flips the capture state of the unit the module is placed on. * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf b/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf index 4659fba2d5..fc0f56a634 100644 --- a/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf +++ b/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * PV event handler to update the AI skill on all machines when set by zeus module * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleGroupSide.sqf b/addons/zeus/functions/fnc_moduleGroupSide.sqf index 087838ed30..53dda7a6ad 100644 --- a/addons/zeus/functions/fnc_moduleGroupSide.sqf +++ b/addons/zeus/functions/fnc_moduleGroupSide.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike, Brett + * Author: kymckay, Brett * Zeus module function to change side of a group on dialog confirmation * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSearchNearby.sqf b/addons/zeus/functions/fnc_moduleSearchNearby.sqf index 9515ab3fdc..9272c47bf4 100644 --- a/addons/zeus/functions/fnc_moduleSearchNearby.sqf +++ b/addons/zeus/functions/fnc_moduleSearchNearby.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Commands the group the module is placed on to search the nearest building * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSetMedic.sqf b/addons/zeus/functions/fnc_moduleSetMedic.sqf index 63b962d429..026c9238c5 100644 --- a/addons/zeus/functions/fnc_moduleSetMedic.sqf +++ b/addons/zeus/functions/fnc_moduleSetMedic.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike, Glowbal + * Author: kymckay, Glowbal * Assigns a medic role from the medical module to a unit * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf b/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf index ec8106d9ff..99a2ea5926 100644 --- a/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf +++ b/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike, Glowbal + * Author: kymckay, Glowbal * Assigns a medic role from the medical module to a unit * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf b/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf index fa3ced078c..853eabbf65 100644 --- a/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf +++ b/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike, Glowbal + * Author: kymckay, Glowbal * Assigns a medic role from the medical module to a unit * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSimulation.sqf b/addons/zeus/functions/fnc_moduleSimulation.sqf index 69d7abe36c..b875e35e6d 100644 --- a/addons/zeus/functions/fnc_moduleSimulation.sqf +++ b/addons/zeus/functions/fnc_moduleSimulation.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Fisher, SilentSpike + * Author: Fisher, kymckay * Toggle Simulation on object. * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleSurrender.sqf b/addons/zeus/functions/fnc_moduleSurrender.sqf index 5fc0ae9e0c..3b6534d558 100644 --- a/addons/zeus/functions/fnc_moduleSurrender.sqf +++ b/addons/zeus/functions/fnc_moduleSurrender.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Flips the surrender state of the unit the module is placed on. * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf b/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf index c120ee14f9..ed432fc259 100644 --- a/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf +++ b/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Zeus module function to teleport players on dialog confirmation * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleUnconscious.sqf b/addons/zeus/functions/fnc_moduleUnconscious.sqf index 6ee1e8fa60..2d60483eee 100644 --- a/addons/zeus/functions/fnc_moduleUnconscious.sqf +++ b/addons/zeus/functions/fnc_moduleUnconscious.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Flips the unconscious state of the unit the module is placed on. * * Arguments: diff --git a/addons/zeus/functions/fnc_moduleZeusSettings.sqf b/addons/zeus/functions/fnc_moduleZeusSettings.sqf index 6024126952..59032402ff 100644 --- a/addons/zeus/functions/fnc_moduleZeusSettings.sqf +++ b/addons/zeus/functions/fnc_moduleZeusSettings.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Module for adjusting various aspects of zeus * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_attributeRadius.sqf b/addons/zeus/functions/fnc_ui_attributeRadius.sqf index d8a0c46305..46d4cac180 100644 --- a/addons/zeus/functions/fnc_ui_attributeRadius.sqf +++ b/addons/zeus/functions/fnc_ui_attributeRadius.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Initializes the "Radius" Zeus module attribute. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_defendArea.sqf b/addons/zeus/functions/fnc_ui_defendArea.sqf index aaa05adbbf..b8ee0a04a9 100644 --- a/addons/zeus/functions/fnc_ui_defendArea.sqf +++ b/addons/zeus/functions/fnc_ui_defendArea.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Initializes the "Defend Area" Zeus module display. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_editableObjects.sqf b/addons/zeus/functions/fnc_ui_editableObjects.sqf index b21b50ea26..f98910f14f 100644 --- a/addons/zeus/functions/fnc_ui_editableObjects.sqf +++ b/addons/zeus/functions/fnc_ui_editableObjects.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: Fisher, SilentSpike, mharis001 + * Author: Fisher, kymckay, mharis001 * Initializes the "Editable Objects" Zeus module display. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_groupSide.sqf b/addons/zeus/functions/fnc_ui_groupSide.sqf index e74ab97c9e..04daa8c813 100644 --- a/addons/zeus/functions/fnc_ui_groupSide.sqf +++ b/addons/zeus/functions/fnc_ui_groupSide.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Initalises the `group side` zeus module display * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_patrolArea.sqf b/addons/zeus/functions/fnc_ui_patrolArea.sqf index 93cae24aa5..ca43481c1f 100644 --- a/addons/zeus/functions/fnc_ui_patrolArea.sqf +++ b/addons/zeus/functions/fnc_ui_patrolArea.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Initializes the "Patrol Area" Zeus module display. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_searchArea.sqf b/addons/zeus/functions/fnc_ui_searchArea.sqf index db2748e629..d9bcee346d 100644 --- a/addons/zeus/functions/fnc_ui_searchArea.sqf +++ b/addons/zeus/functions/fnc_ui_searchArea.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike + * Author: kymckay * Initializes the "Search Area" Zeus module display. * * Arguments: diff --git a/addons/zeus/functions/fnc_ui_teleportPlayers.sqf b/addons/zeus/functions/fnc_ui_teleportPlayers.sqf index 0594554dc5..9ff16965b2 100644 --- a/addons/zeus/functions/fnc_ui_teleportPlayers.sqf +++ b/addons/zeus/functions/fnc_ui_teleportPlayers.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" /* - * Author: SilentSpike, mharis001 + * Author: kymckay, mharis001 * Initalizes the "Teleport Players" Zeus module display. * * Arguments: diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 759c6b2f30..4769f897ca 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -419,7 +419,7 @@ Compétence globale de l'IA Мастерство ботов Globální zkušenosti AI - 総合的 AI スキル + 総合的AIスキル Globalne umiejętności AI Globale KI-Fähigkeit 서버 인공지능 실력 @@ -571,7 +571,7 @@ L'IA se met à couvert. Должны ли боты искать укрытия AI se bude snažit vyhledávat krytí - AI は遮蔽を取るようになります + AIは遮蔽を取るようになります Czy AI powinno szukać osłon Soll KI nach Deckung suchen 인공지능이 엄폐물을 찾아갑니다 @@ -601,7 +601,7 @@ L'IA passe automatiquement en mode combat. Должны ли боты автоматически переходить в режим боя AI se automaticky přepne do bojového režimu - AI は自動的に戦闘状態へ切り替えます + AIは自動的に戦闘状態へ切り替えます Czy AI powinno automatycznie przechodzić w tryb walki Soll KI automatisch in Kampfmodus umschalten 인공지능이 자동적으로 교전 상태에 돌입합니다 @@ -1134,7 +1134,7 @@ Spieler und KI's Giocati e AI Gracze i SI - プレイヤーと AI + プレイヤーとAI Игроки и ИИ Jogadores e IA Jugadores e IA diff --git a/docs/team.md b/docs/team.md index b98dbeec5f..f4a0fb5009 100644 --- a/docs/team.md +++ b/docs/team.md @@ -38,7 +38,7 @@ This lists all the maintainers responsible for project management and the overal - Coding, Performance, SME - [jokoho48](https://github.com/jokoho48){:target="_blank"} - Scripting, Model Editing / Import -- [SilentSpike](https://github.com/kymckay){:target="_blank"} +- [kymckay](https://github.com/kymckay){:target="_blank"} - Scripting, Config - [Ruthberg](https://github.com/ulteq){:target="_blank"} - Scripting, Config @@ -59,7 +59,7 @@ This lists all the maintainers responsible for project management and the overal - [Giallustio](https://github.com/Giallustio){:target="_blank"} - [654wak654](https://github.com/654wak654){:target="_blank"} - [mharis001](https://github.com/mharis001){:target="_blank"} -- [Brandon (TCVM)](https://github.com/TheCandianVendingMachine){:target="_blank"} +- [tcvm](https://github.com/TheCandianVendingMachine){:target="_blank"} - [veteran29](https://github.com/veteran29){:target="_blank"} - [Dahlgren](https://github.com/Dahlgren){:target="_blank"} - [BrettMayson](https://github.com/BrettMayson){:target="_blank"} diff --git a/docs/tools/combine_events.py b/docs/tools/combine_events.py index d0ac980389..92bc002820 100644 --- a/docs/tools/combine_events.py +++ b/docs/tools/combine_events.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# Author: Jonpas, SilentSpike +# Author: Jonpas, kymckay import os import sys diff --git a/docs/tools/document_functions.py b/docs/tools/document_functions.py index f91c237090..84f676deea 100644 --- a/docs/tools/document_functions.py +++ b/docs/tools/document_functions.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -Author: SilentSpike +Author: kymckay Crawl function headers to produce appropriate documentation of public functions. Supported header sections: @@ -67,6 +67,10 @@ class FunctionFile: self.debug = debug self.lint_private = lint_private + for lineNumber, line in enumerate(self.header.splitlines()): + if (not (line.startswith(" * ") or line in ["", " *", "/*", "*/", " */"])): + self.feedback(f"header formating on line {lineNumber+1}: ({line})", 1) + # Preemptively cut away the comment characters (and leading/trailing whitespace) self.header_text = "\n".join([x[3:].strip() for x in self.header.splitlines()]) @@ -160,18 +164,30 @@ class FunctionFile: self.feedback("No blank line after arguments list", 1) arguments = [] + expectedMainIndex = 0 + expectedSubIndex = 0 for argument in lines: - valid = re.match(r"^(\d+):\s(.+?)\<([\s\w,\|]+?)\>( )?(\s\(default: (.+)\))?$", argument) + valid = re.match(r"^(- ){0,1}(\d+):\s(.+?)\<([\s\w,\|]+?)\>( )?(\s\(default: (.+)\))?$", argument) if valid: - arg_index = valid.group(1) - arg_name = valid.group(2) - arg_types = valid.group(3) - arg_default = valid.group(6) + arg_isSubIndex = valid.group(1) is not None + arg_index = valid.group(2) + arg_name = valid.group(3) + arg_types = valid.group(4) + arg_default = valid.group(7) arg_notes = [] - if arg_index != str(len(arguments)): - self.feedback("Argument index {} does not match listed order".format(arg_index), 1) + if arg_isSubIndex: + expectedIndex = expectedSubIndex + expectedSubIndex = expectedSubIndex + 1 + else: + expectedIndex = expectedMainIndex + expectedMainIndex = expectedMainIndex + 1 + expectedSubIndex = 0 + + if int(arg_index) != expectedIndex: + print(f"line|{argument}|") + self.feedback(f"Argument index {arg_index} does not match listed order {expectedIndex}", 1) if arg_default is None: arg_default = "" @@ -255,7 +271,7 @@ class FunctionFile: self.errors += 1 def write(self, message, indent=2): - to_print = [" "]*indent + to_print = [" "] * indent to_print.append(message) print("".join(to_print)) diff --git a/docs/wiki/development/coding-guidelines.md b/docs/wiki/development/coding-guidelines.md index 567951c55b..786a5d74e8 100644 --- a/docs/wiki/development/coding-guidelines.md +++ b/docs/wiki/development/coding-guidelines.md @@ -188,7 +188,9 @@ Every function should have a header of the following format appear before any co * * Arguments: * 0: The first argument - * 1: The second argument + * 1: The second argument which contains sub values + * - 0: Number of bannanas + * - 1: Bannana Color * 2: Multiple input types * 3: Optional input (default: true) * 4: Optional input with multiple types (default: {true}) diff --git a/docs/wiki/feature/arsenal.md b/docs/wiki/feature/arsenal.md index 5b1d8ee4d8..c1394e0230 100644 --- a/docs/wiki/feature/arsenal.md +++ b/docs/wiki/feature/arsenal.md @@ -29,6 +29,7 @@ ACE Arsenal has a pretty large number of improvements over BI Virtual Arsenal, h - An other setting to invert horizontal camera controls. - Settings to disable the "Default loadouts" and "Public loadouts" tabs. - Custom sub item categories for misc items +- Items can be saved as favorites to filter for your preferences. * Items not currently available in ACE Arsenal but in the unit's inventory, unique items will be omitted when loading loadouts and they can only be removed from containers. @@ -66,14 +67,26 @@ You can import loadouts from Virtual Arsenal into ACE Arsenal, face, voice, insi - In the 3DEN top toolbar, click on the `TOOLS` tab - Click on `Import BI VA Loadouts to Ace Arsenal` -## 2. Shortcuts +## 2. Favorites + +To switch between displaying all items or just favorites, press the `Items:` button on the bottom of the interface. + +Items can be saved to favorites by pressing Shift + 2x LMB. Favorites are saved to your profile, along with loadouts, and persist between missions and mod changes. + +Favorited items will be shown in a light gold color by default, but this can be changed under `ACE Arsenal -> Favorites Color` in CBA Settings. + +It is also possible to toggle between showing all items or favorites by default upon opening the arsenal via `ACE Arsenal -> Default to Favorites` in CBA Settings. + +Those settings cannot be overwritten by mission makers and are exclusively player preference. + +## 3. Shortcuts
Note:

Ctrl + V does NOT work in multiplayer due to a BI safety, however Ctrl + C does since it's using the ACE3 clipboard extension.

-### 2.1 Outside of search bars +### 3.1 Outside of search bars - Ctrl + C: Export current loadout to clipboard. - Ctrl + V: Import loadout from clipboard. @@ -81,13 +94,14 @@ You can import loadouts from Virtual Arsenal into ACE Arsenal, face, voice, insi - Arrow keys can be used to naviguate the left and right panels. - Shift + LMB on the `+` or `-` buttons on the right panel to add or remove 5 of the selected item. - Ctrl + F Selects the left search bar. +- Shift + 2x LMB on an item will add or remove it from favorites.
Note:

Shift + arrow keys can be used to add or remove a large amount of items in a short amount of time from the right panel.

-### 2.2 Inside of search bars +### 3.2 Inside of search bars - Search bars support copy / cut and paste (same limitations as importing apply in multiplayer). - Ctrl + A is supported. diff --git a/docs/wiki/feature/fastroping.md b/docs/wiki/feature/fastroping.md index 7178bca3fa..78eff817b4 100644 --- a/docs/wiki/feature/fastroping.md +++ b/docs/wiki/feature/fastroping.md @@ -1,8 +1,8 @@ --- layout: wiki -title: Fast-Roping +title: Fastroping component: fastroping -description: System for adding fast roping capabilities to helicopters. +description: System for adding fastroping capabilities to helicopters. group: feature category: realism parent: wiki @@ -14,10 +14,10 @@ version: --- ## 1. Overview -The fast roping module adds the possibility to do fast roping insertions from helicopters. +The fast roping module adds the possibility to do fastroping insertions from helicopters. ## 2. Usage -If you are sitting in the back of a helicopter that has fast roping capabilities, open your interaction menu to deploy the ropes. Depending on the helicopter and its FRIES (abbr. for Fast Rope Insertion Extraction System) the deployment of the ropes is a two step process: +If you are sitting in the back of a helicopter that has fastroping capabilities, open your interaction menu to deploy the ropes. Depending on the helicopter and its FRIES (abbr. for FastRope Insertion Extraction System) the deployment of the ropes is a two step process: 1. FRIES preparation, usually consisting of opening the helicopters doors and the extension of the hooks (not necessary for some helicopters) 2. Rope deployment diff --git a/docs/wiki/framework/arsenal-framework.md b/docs/wiki/framework/arsenal-framework.md index ceb738266e..75a59bc9b8 100644 --- a/docs/wiki/framework/arsenal-framework.md +++ b/docs/wiki/framework/arsenal-framework.md @@ -174,7 +174,13 @@ To do so: This loadout list can be exported to the clipboard by using Shift + LMB. on the export button, doing the same on the import button will import the list currently in the clipboard. -### 4.2 Adding default loadouts via script +You can also save one of your personal loadouts as a default loadout by Shift + LMB on the save button while highlighting or saving a loadout in My Loadouts. + +### 4.2 Adding default loadouts ingame + +Players with Zeus access can save default loadouts ingame, doing so will make the saved loadout available to all players. The procedure is the same as with 3DEN, but loadouts cannot be exported or imported in Multiplayer. Default loadouts are not deleted when their creator disconnects, unlike Public Loadouts. + +### 4.3 Adding default loadouts via script `ace_arsenal_fnc_addDefaultLoadout` @@ -182,9 +188,10 @@ This loadout list can be exported to the clipboard by using Shift + < ---| -------- | ---- | ------------------------ 0 | Name of loadout | String | Required 1 | getUnitLoadout array or CBA extended loadout array | Array | Required +2 | Add loadout globally | Boolean | Optional (default: `false`) Example: -`["Squad Leader", getUnitLoadout sql1] call ace_arsenal_fnc_addDefaultLoadout` +`["Squad Leader", getUnitLoadout sql1, true] call ace_arsenal_fnc_addDefaultLoadout` If a loadout with the same name exists, it will be overwritten. @@ -249,6 +256,8 @@ Example: }, {true}]] call ace_arsenal_fnc_addStat; ``` +If a stat already exists (so same class ID and tab), it will ignore the new addition. + ### 5.3 Removing stats via a function `ace_arsenal_fnc_removeStat` @@ -343,7 +352,7 @@ The argument passed to the condition is: 1 | Stat class ID | String | Required 2 | Title | String | Required 3 | Algorithm | Code | Required -4 | Condition | Code | Optional (default: `true`) +4 | Condition | Code | Optional (default: `{true}`) Return Value: - Array of sort IDs @@ -366,6 +375,8 @@ Example: Sorting method IDs are unique and are generated in the same fashion as the stat IDs (see `5.3 Removing stats via a function`). +If a sorting method already exists (so same class ID and tab), it will ignore the new addition. + ### 6.3 Removing sorting methods via a function `ace_arsenal_fnc_removeSort` @@ -382,7 +393,89 @@ For config added sorts the classname is used, for function added ones the string The same numbers are used for sorting methods as for stats (see `5.4 Stat tab numbers`). -## 7. Eventhandlers +## 7. Actions + +ACE Arsenal actions are customizable, this will show you how. + +### 7.1 Adding actions via config + +```cpp +class ace_arsenal_actions { + class TAG_myActions { + displayName = "My Actions"; + condition = QUOTE(true); + scopeEditor = 2; // Only actions with scopeEditor = 2 are shown in 3DEN. Actions working with variables should take object variables being reset between editor view and mission start into account. + tabs[] = {0,5}; + class text { + // A simple text label + text = "My text"; + }; + class statement { + // Statement output as text + textStatement = QUOTE([_this select 0] call tag_fnc_myTextStatement); + }; + class button { + label = "My Action"; + condition = QUOTE(true); + statement = QUOTE(_this call tag_fnc_myAction); + }; + }; +}; +``` +The focused unit object is passed to the condition and statement functions. + +### 7.2 Adding sorting methods via a function + +`ace_arsenal_fnc_addAction` + +| | Argument | Type | Optional (default value) +--- | -------- | ---- | ------------------------ +0 | Tabs to add the sort to | Array of numbers | Required +1 | Action class ID | String | Required +2 | Title | String | Required +3 | Actions | Array of arrays | Required +4 | Condition | Code | Optional (default: `{true}`) +5 | Scope editor | Number | Optional (default: `2`) + +Return Value: +- Array of action IDs + +Example: +```sqf +[[0, 5], "TAG_myActions", "My Actions", [ + ["text", "Text", {true}, "Text"], + ["statement", "Statement", {true}, "", {[_this select 0] call tag_fnc_myTextStatement}], + ["button", "Button", {true}, "", {}, {_this call tag_fnc_myAction}] +]] call ace_arsenal_fnc_addAction; +``` + +The example above results in the same actions as in `7.1 Adding actions via config`. + +Action IDs are unique and are generated as a string in the following fashion: +`_rootClassName + "~" + _class + "~" + _tab` + +The example above returns: +`["TAG_myActions~text~0","TAG_myActions~statement~0","TAG_myActions~button~0","TAG_myActions~text~5","TAG_myActions~statement~5","TAG_myActions~button~5"]` + +If an action already exists (so same class ID and tab within an action), it will ignore the new addition. + +### 7.3 Removing actions via a function + +`ace_arsenal_fnc_removeAction` + +| | Argument | Type | Optional (default value) +---| -------- | ---- | ------------------------ +0 | Array of IDs | Array | Required + +Action IDs are unique and their generation is explained in `7.2 Adding sorting methods via a function`. + +For config added actions the classname is used, for function added ones the string provided is used. + +### 7.4 Action tab numbers + +The same numbers are used for actions as for stats (see `5.4 Stat tab numbers`). + +## 8. Eventhandlers All are local. @@ -409,9 +502,9 @@ All are local. | ace_arsenal_loadoutsTabChanged | loadouts screen display (DISPLAY), tab control (CONTROL) | 3.12.3 | | ace_arsenal_loadoutsListFilled | loadouts screen display (DISPLAY), tab control (CONTROL) | 3.12.3 | -## 8. Custom sub item categories +## 9. Custom sub item categories -### 8.1 Adding a sub item category +### 9.1 Adding a sub item category `ace_arsenal_fnc_addRightPanelButton` diff --git a/docs/wiki/framework/fastroping-framework.md b/docs/wiki/framework/fastroping-framework.md index 3979243d7c..fad016a8bf 100644 --- a/docs/wiki/framework/fastroping-framework.md +++ b/docs/wiki/framework/fastroping-framework.md @@ -1,7 +1,7 @@ --- layout: wiki -title: Fast Roping Framework -description: Explains the config values and functions used for making a helicopter fast roping capable. +title: Fastroping Framework +description: Explains the config values and functions used for making a helicopter fastroping capable. group: framework order: 5 parent: wiki @@ -12,7 +12,7 @@ version: patch: 0 --- -If you want to prepare a helicopter from your addon for fast roping, there's a few ways to do that. +If you want to prepare a helicopter from your addon for fastroping, there's a few ways to do that. ## 1. Using simple rope origin points @@ -37,7 +37,7 @@ You can also use more or less than two rope origins. You can additionally execut ## 2. Using a FRIES -If your helicopter is not fast roping capable by default, you can make it take a FRIES. A FRIES is just a simple model that gets attached to the helicopter with its own rope origin points. ACE3 already includes two FRIES that are used in real life and can be attached to most helicopters. +If your helicopter is not fastroping capable by default, you can make it take a FRIES. A FRIES is just a simple model that gets attached to the helicopter with its own rope origin points. ACE3 already includes two FRIES that are used in real life and can be attached to most helicopters. To make your helicopter FRIES capable, you need to add the following config entries: @@ -52,10 +52,10 @@ ace_fastroping_ropeOrigins[] = {"ropeOriginLeft", "ropeOriginRight"}; Let us go through each of them: -- `ace_fastroping_enabled = 2` tells ACE that your helicopter is fast roping capabale but needs a FRIES for that. +- `ace_fastroping_enabled = 2` tells ACE that your helicopter is fastroping capabale but needs a FRIES for that. - `ace_fastroping_friesType` defines the object that will be used as a FRIES on your helicopter - `ace_fastroping_friesAttachmentPoint` defines the coordinates at which the FRIES will be attached to. -- See 3.3 for more information about `ace_fastroping_onCut` and `ace_fastroping_onPrepare`. Note: These two entries are necessary for fast roping with a FRIES. +- See 3.3 for more information about `ace_fastroping_onCut` and `ace_fastroping_onPrepare`. Note: These two entries are necessary for fastroping with a FRIES. - `ace_fastroping_ropeOrigins` defines the memory points or coordinates from the FRIES where the ropes will be attached to. ## 2.1 Using one of the given FRIES diff --git a/docs/wiki/framework/slideshow-framework.md b/docs/wiki/framework/slideshow-framework.md index 5d27cbc697..0697116039 100644 --- a/docs/wiki/framework/slideshow-framework.md +++ b/docs/wiki/framework/slideshow-framework.md @@ -58,3 +58,65 @@ _Note: Set Name argument added in 3.9.1._ 4 | `5` | 5s slide duration before change to next image 5 | `"My Slides"` | Main interaction point name, for easier distinguishing of multiple slideshow sets 6 | `1` | Uses texture selection 1 for objects with multiple options + +### 2.2 Create Map Images + +`ace_slideshow_fnc_mapImage` + +```sqf + * Returns a procedural texture that will display a custom map. + * Needs to be run on all machines. + * + * Arguments: + * 0: Position (default: center of map) + * 1: Scale (1.0 fits entire map in x-dimension) (default: 1.25) + * 2: Markers (default: []) + * - 0: Position 2D/3D (default: [0, 0, 0]) + * - 1: Text (default: "") + * - 2: Marker Type or Icon Name (default: "mil_dot") + * - 3: Color (default: [1, 0, 0, 1]) + * 3: Map Type (0: Normal, 1: Topographic, 2: Satelite) or any custom class (even mission config) (default: 0) + * 4: Code to run on init (will be passed [_map, _display, _displayID]) (default: {}) + * 5: Resolution (default: 4096) +``` + +### 2.2.1 Map Slideshow Example + +```sqf +tex1 = [] call ace_slideshow_fnc_mapImage; +tex2 = [(getPos aWhiteboard), 0.5, [[getpos aWhiteboard, "you", "mil_start"]], 0] call ace_slideshow_fnc_mapImage; +tex3 = [[4000, 4000], 0.5, [[[5000, 5000], "target", "mil_objective"]], 2] call ace_slideshow_fnc_mapImage; +[[aWhiteboard], [], [tex1, tex2, tex3], ["Full", "Sat Start", "Sat Objective"]] call ace_slideshow_fnc_createSlideshow; +``` + +### 2.2.2 Map Slideshow Advanced Example + +```sqf +private _initCode = { + params ["_map", "", "_displayID"]; + + // Add custom draw event handler (will only be called when display is actually updated) + _map ctrlAddEventHandler ["draw", { + params ["_map"]; + _map drawIcon ["\A3\Drones_F\Air_F_Gamma\UAV_02\Data\UI\Map_UAV_02_CA.paa", [0, 0, 1, 1], getPos theUAV, 24, 24, getDir theUAV]; + }]; + + // Live update the map + [{ + params ["_displayID","_idPFH"]; + private _display = findDisplay _displayID; + if (isNull _display) exitWith { + systemChat format ["%1 - removing pfeh", _this]; + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + displayUpdate _display; + + private _map = _display displayCtrl 1; + _map ctrlMapAnimAdd [0, 0.3, getpos theUAV]; + ctrlMapAnimCommit _map; + }, 0, _displayID ] call CBA_fnc_addPerFrameHandler; +}; + +tex4 = [nil, 0.3, [[getpos aComputer, "you", "mil_start"]], 2, _initCode] call ace_slideshow_fnc_mapImage; +[[aComputer, aComputer2], [], [tex4], ["Sat Follow UAV"]] call ace_slideshow_fnc_createSlideshow; +``` diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index 727d499d0d..8a70cd0653 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -157,7 +157,7 @@ endif() option(ENABLE_GTEST "ENABLE_GTEST" ON) if (ENABLE_GTEST) include(FetchContent) - FetchContent_Declare(googletest GIT_REPOSITORY https://github.com/google/googletest.git) + FetchContent_Declare(googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG main) # For Windows: Prevent overriding the parent project's compiler/linker settings set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) diff --git a/include/a3/ui_f/hpp/defineResincl.inc b/include/a3/ui_f/hpp/defineResincl.inc index 818fd438ce..12b897259a 100644 --- a/include/a3/ui_f/hpp/defineResincl.inc +++ b/include/a3/ui_f/hpp/defineResincl.inc @@ -1448,6 +1448,9 @@ enum #define IDC_OPTIONS_MAPDUCKING_VALUE 119 #define IDC_OPTIONS_MAPDUCKING_SLIDER 120 +#define IDC_OPTIONS_UI_VALUE 121 +#define IDC_OPTIONS_UI_SLIDER 122 + // microphone adjustment #define IDC_OPTIONS_MIC_PROGRESS_BAR 1001 #define IDC_OPTIONS_MIC_PROGRESS 1002 diff --git a/optionals/compat_rhs_afrf3/CfgMagazines.hpp b/optionals/compat_rhs_afrf3/CfgMagazines.hpp deleted file mode 100644 index 65641a73fb..0000000000 --- a/optionals/compat_rhs_afrf3/CfgMagazines.hpp +++ /dev/null @@ -1,308 +0,0 @@ -class cfgMagazines { - class VehicleMagazine; - class rhs_30Rnd_545x39_7N6_AK; - - class rhs_100Rnd_762x54mmR: rhs_30Rnd_545x39_7N6_AK { - ace_isbelt = 1; - }; - class rhs_mag_127x108mm_50: VehicleMagazine { - ace_isbelt = 1; - }; - class rhs_mag_127x108mm_150: rhs_mag_127x108mm_50 { - ace_isbelt = 0; - }; - class rhs_mag_127x108mm_1470: rhs_mag_127x108mm_50 { - ace_isbelt = 0; - }; - class RHS_mag_VOG30_30: VehicleMagazine { - ace_isbelt = 1; - }; - class RHS_mag_GPD30_30: RHS_mag_VOG30_30 {}; - - // RHS magazines for crew handled ammo - class rhs_mag_9M131M; - class GVAR(mag_9M131M): rhs_mag_9M131M { - scope = 2; - displayName = CSTRING(mag_9M131M_displayName); - type = 256; - count = 1; - mass = 55; - model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_metis_emptytube.p3d"; - picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; - }; - class rhs_mag_9M131F; - class GVAR(mag_9M131F): rhs_mag_9M131F { - scope = 2; - displayName = CSTRING(mag_9M131F_displayName); - type = 256; - count = 1; - mass = 55; - model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_metis_emptytube.p3d"; - picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; - }; - class rhs_mag_9m133; - class GVAR(mag_9m133): rhs_mag_9m133 { - scope = 2; - displayName = CSTRING(mag_9m133_displayName); - type = 256; - count = 1; - mass = 55; - model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; - picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; - }; - class rhs_mag_9m133f; - class GVAR(mag_9m133f): rhs_mag_9m133f { - scope = 2; - displayName = CSTRING(mag_9m133f_displayName); - type = 256; - count = 1; - mass = 55; - model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; - picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; - }; - class rhs_mag_9m1331; - class GVAR(mag_9m1331): rhs_mag_9m1331 { - scope = 2; - displayName = CSTRING(mag_9m1331_displayName); - type = 256; - count = 1; - mass = 55; - model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; - picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; - }; - class rhs_mag_9m133m2; - class GVAR(mag_9m133m2): rhs_mag_9m133m2 { - scope = 2; - displayName = CSTRING(mag_9m133m2_displayName); - type = 256; - count = 1; - mass = 55; - model = "rhsafrf\addons\rhs_heavyweapons\atgm\rhs_kornet_emptytube.p3d"; - picture = "\A3\Weapons_F_Tank\Launchers\Vorona\Data\UI\icon_rocket_vorona_HEAT_F_ca.paa"; - }; - class rhs_mag_PG9V; - class GVAR(mag_PG9V): rhs_mag_PG9V { - scope = 2; - displayName = CSTRING(mag_PG9V_displayName); - type = 256; - count = 1; - mass = 80; - model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; - picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; - }; - class rhs_mag_PG9N; - class GVAR(mag_PG9N): rhs_mag_PG9N { - scope = 2; - displayName = CSTRING(mag_PG9N_displayName); - type = 256; - count = 1; - mass = 80; - model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; - picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; - }; - class rhs_mag_PG9VNT; - class GVAR(mag_PG9VNT): rhs_mag_PG9VNT { - scope = 2; - displayName = CSTRING(mag_PG9VNT_displayName); - type = 256; - count = 1; - mass = 80; - model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; - picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; - }; - class rhs_mag_OG9VM; - class GVAR(mag_OG9VM): rhs_mag_OG9VM { - scope = 2; - displayName = CSTRING(mag_OG9VM_displayName); - type = 256; - count = 1; - mass = 80; - model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; - picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; - }; - class rhs_mag_OG9V; - class GVAR(mag_OG9V): rhs_mag_OG9V { - scope = 2; - displayName = CSTRING(mag_OG9V_displayName); - type = 256; - count = 1; - mass = 80; - model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; - picture = "\A3\Weapons_F_Exp\Launchers\RPG7\Data\UI\icon_rocket_RPG7_CA.paa"; - }; - - class GVAR(mag_VOG30_30): RHS_mag_VOG30_30 { - scope = 2; - displayName = CSTRING(mag_VOG30_30_displayName); - type = 256; - count = 30; - mass = 40; - model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; - picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); - }; - class GVAR(mag_GPD30_30): RHS_mag_GPD30_30 { - scope = 2; - displayName = CSTRING(mag_GPD30_30_displayName); - type = 256; - count = 30; - mass = 40; - model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; - picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); - }; - class RHS_mag_VOG17m_30; - class GVAR(mag_VOG17m_30): RHS_mag_VOG17m_30 { - scope = 2; - displayName = CSTRING(mag_VOG17m_30_displayName); - type = 256; - count = 30; - mass = 40; - model = "\A3\Structures_F_EPB\Items\Military\Ammobox_rounds_F.p3d"; - picture = QPATHTOEF(csw,UI\ammoBox_50bmg_ca.paa); - }; - - // ACE Explosives - class ATMine_Range_Mag; - class rhs_mine_tm62m_mag: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_tm62m"; - class ACE_Triggers { - SupportedTriggers[] = {"PressurePlate"}; - class PressurePlate { - digDistance = 0.09; - }; - }; - }; - - class rhs_mine_pmn2_mag: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_pmn2"; - class ACE_Triggers { - SupportedTriggers[] = {"PressurePlate"}; - class PressurePlate { - digDistance = 0.02; - }; - }; - }; - - class rhs_mag_mine_ptm1: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_ptm1"; - class ACE_Triggers { - SupportedTriggers[] = {"PressurePlate"}; - class PressurePlate { - digDistance = 0.04; - }; - }; - }; - - class rhs_mag_mine_pfm1: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_pfm1"; - class ACE_Triggers { - SupportedTriggers[] = {"PressurePlate"}; - class PressurePlate { - digDistance = 0.02; - }; - }; - }; - - class rhs_ec75_mag: ATMine_Range_Mag { - ace_explosives_DelayTime = 1; - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec75"; - useAction = 0; - class ACE_Triggers { - SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; - class Timer { - FuseTime = 0.5; - }; - class Command { - FuseTime = 0.5; - }; - class MK16_Transmitter: Command {}; - class DeadmanSwitch: Command {}; - }; - }; - - class rhs_ec75_sand_mag: rhs_ec75_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec75_sand"; - }; - - class rhs_ec200_mag: rhs_ec75_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec200"; - }; - - class rhs_ec200_sand_mag: rhs_ec200_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec200_sand"; - }; - - class rhs_ec400_mag: rhs_ec75_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec400"; - }; - - class rhs_ec400_sand_mag: rhs_ec400_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_ec400_sand"; - }; - - class rhs_mine_msk40p_white_mag: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_msk40p_white"; - class ACE_Triggers { - SupportedTriggers[] = {"Tripwire"}; - class Tripwire { - digDistance = 0.07; - }; - }; - }; - - class rhs_mine_msk40p_red_mag: rhs_mine_msk40p_white_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_msk40p_red"; - }; - - class rhs_mine_msk40p_green_mag: rhs_mine_msk40p_white_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_msk40p_green"; - }; - - class rhs_mine_msk40p_blue_mag: rhs_mine_msk40p_white_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_msk40p_blue"; - }; - - class rhs_mine_sm320_white_mag: rhs_mine_msk40p_white_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_sm320_white"; - class ACE_Triggers { - SupportedTriggers[] = {"Tripwire"}; - class Tripwire { - digDistance = 0.05; - }; - }; - }; - - class rhs_mine_sm320_red_mag: rhs_mine_sm320_white_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_sm320_red"; - }; - - class rhs_mine_sm320_green_mag: rhs_mine_sm320_white_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_sm320_green"; - }; - - class rhs_mine_ozm72_a_mag: ATMine_Range_Mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_ozm72_a"; - class ACE_Triggers { - SupportedTriggers[] = {"Tripwire"}; - class Tripwire { - digDistance = 0.04; - }; - }; - }; - - class rhs_mine_ozm72_b_mag: rhs_mine_ozm72_a_mag { - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_ozm72_b"; - }; - - class rhs_mine_ozm72_c_mag: rhs_mine_ozm72_a_mag { - ace_explosives_DelayTime = 1; - ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_ozm72_c"; - useAction = 0; - class ACE_Triggers { - SupportedTriggers[] = {"Command", "MK16_Transmitter"}; - class Command { - FuseTime = 0.5; - }; - class MK16_Transmitter: Command {}; - }; - }; -}; diff --git a/optionals/compat_rhs_afrf3/CfgWeapons.hpp b/optionals/compat_rhs_afrf3/CfgWeapons.hpp deleted file mode 100644 index 4435846ac0..0000000000 --- a/optionals/compat_rhs_afrf3/CfgWeapons.hpp +++ /dev/null @@ -1,399 +0,0 @@ -class CfgWeapons { - - class NVGoggles; - class rhs_1PN138: NVGoggles { // Monocular - modelOptics = ""; - EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_4096.paa); - EGVAR(nightvision,bluRadius) = 0.13; - }; - - class hgun_Rook40_F; - class rhs_weap_pya: hgun_Rook40_F { - ACE_barrelTwist = 254.0; - ACE_barrelLength = 111.76; - }; - class Pistol_Base_F; - class rhs_weap_makarov_pm: rhs_weap_pya { - ACE_barrelTwist = 240.03; - ACE_barrelLength = 93.472; - }; - class rhs_weap_ak74m_Base_F; - class rhs_weap_ak74m: rhs_weap_ak74m_Base_F { - ACE_RailHeightAboveBore = -0.456233; - ACE_barrelTwist = 199.898; - ACE_barrelLength = 414.02; - }; - class rhs_weap_ak103_base; - class rhs_weap_ak104: rhs_weap_ak103_base { - ACE_barrelLength = 314.96; - }; - class rhs_weap_ak105: rhs_weap_ak74m { - ACE_barrelLength = 314.96; - }; - class rhs_weap_akm: rhs_weap_ak74m { - ACE_RailHeightAboveBore = -0.456233;//from rhs_weap_akmn and rhs_weap_ak74m - ACE_barrelTwist = 199.898; - ACE_barrelLength = 414.02; - }; - class rhs_weap_aks74; - class rhs_weap_aks74u: rhs_weap_aks74 { - ACE_RailHeightAboveBore = -0.30262; - ACE_barrelTwist = 160.02; - ACE_barrelLength = 210.82; - }; - class rhs_weap_asval: rhs_weap_ak74m { - ACE_barrelTwist = 210.82; - ACE_barrelLength = 200.66; - }; - class rhs_weap_svd: rhs_weap_ak74m { - ACE_RailHeightAboveBore = -0.617396; - ACE_barrelTwist = 238.76; - ACE_barrelLength = 619.76; - }; - class rhs_weap_svdp; - class rhs_weap_svdp_npz: rhs_weap_svdp { - ACE_RailHeightAboveBore = 4.3348; - }; - class rhs_weap_svdp_wd: rhs_weap_svdp { - ACE_RailHeightAboveBore = -0.617396; - }; - class rhs_weap_svdp_wd_npz: rhs_weap_svdp_wd { - ACE_RailHeightAboveBore = 4.3348; - }; - class rhs_weap_svds: rhs_weap_svdp { - ACE_RailHeightAboveBore = -0.617396; - ACE_barrelTwist = 238.76; - ACE_barrelLength = 563.88; - }; - class rhs_weap_svds_npz: rhs_weap_svds { - ACE_RailHeightAboveBore = 4.3348; - }; - class rhs_weap_rpk_base; - class rhs_weap_rpk74_base: rhs_weap_rpk_base { - ACE_barrelLength = 590.00; - ACE_barrelTwist = 195.072; - }; - class rhs_pkp_base; - class rhs_weap_pkp: rhs_pkp_base { - ACE_barrelTwist = 240.03; - ACE_barrelLength = 657.86; - }; - class rhs_weap_pkm: rhs_weap_pkp { - EGVAR(overheating,allowSwapBarrel) = 1; - ACE_barrelTwist = 240.03; - ACE_barrelLength = 645.16; - }; - class rhs_weap_orsis_Base_F; - class rhs_weap_t5000: rhs_weap_orsis_Base_F { // http://en.orsis.com/production/catalog/19046/ - ACE_barrelTwist = 254.0; // 1:10" - ACE_barrelLength = 698.5; // 27.5" - ACE_RailHeightAboveBore = 2.12198; - }; - class rhs_acc_sniper_base; - class rhs_acc_pso1m2: rhs_acc_sniper_base { - ACE_ScopeHeightAboveRail = 4.41386; - ACE_ScopeAdjust_Vertical[] = {0, 0}; - ACE_ScopeAdjust_Horizontal[] = {-10, 10}; - ACE_ScopeAdjust_VerticalIncrement = 0.5; - ACE_ScopeAdjust_HorizontalIncrement = 0.5; - }; - class rhs_acc_pso1m21: rhs_acc_pso1m2 { - ACE_ScopeHeightAboveRail = 7.75566; - ACE_ScopeAdjust_Vertical[] = {0, 0}; - ACE_ScopeAdjust_Horizontal[] = {-10, 10}; - ACE_ScopeAdjust_VerticalIncrement = 0.5; - ACE_ScopeAdjust_HorizontalIncrement = 0.5; - }; - class ItemCore; - class InventoryOpticsItem_Base_F; - class rhs_acc_dh520x56: ItemCore { // http://nightvision.ru/catalog/4/item/35 - ACE_ScopeHeightAboveRail = 4.71476; - ACE_ScopeAdjust_Vertical[] = {0, 33}; - ACE_ScopeAdjust_Horizontal[] = {-9, 9}; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo: InventoryOpticsItem_Base_F { - class OpticsModes { - class dedal_520 { - discreteDistance[] = {100}; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - - class Launcher; - class Launcher_Base_F: Launcher { - class WeaponSlotsInfo; - }; - - class rhs_weap_strela; - class rhs_weap_igla: rhs_weap_strela { - EGVAR(overpressure,range) = 6; - EGVAR(overpressure,angle) = 40; - EGVAR(overpressure,damage) = 0.6; - EGVAR(overpressure,offset) = 1.65; - }; - - class rhs_weap_rpg7: Launcher_Base_F { - EGVAR(reloadlaunchers,enabled) = 1; - EGVAR(overpressure,angle) = 40; - EGVAR(overpressure,offset) = 0.9; - }; - - class rhs_weap_rpg26: Launcher_Base_F { - EGVAR(overpressure,range) = 10; - EGVAR(overpressure,angle) = 50; - EGVAR(overpressure,offset) = 0.65; - }; - - class rhs_weap_rpg18: rhs_weap_rpg26 { - EGVAR(overpressure,angle) = 45; - EGVAR(overpressure,offset) = 1; - }; - - #define HEARING_PROTECTION_VICCREW EGVAR(hearing,protection) = 0.85; EGVAR(hearing,lowerVolume) = 0.6; - #define HEARING_PROTECTION_EARMUFF EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0.5; - #define HEARING_PROTECTION_PELTOR EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0; - class H_HelmetB; - class rhs_tsh4: H_HelmetB { - HEARING_PROTECTION_VICCREW - }; - - class rhs_6b47_bare; - class rhs_6b48: rhs_6b47_bare { - HEARING_PROTECTION_VICCREW - }; - - class rhs_zsh7a: H_HelmetB { - HEARING_PROTECTION_VICCREW - }; - class rhs_zsh7a_alt: rhs_zsh7a { - ACE_Protection = 1; - }; - class rhs_zsh7a_mike; - class rhs_zsh7a_mike_alt: rhs_zsh7a_mike { - ACE_Protection = 1; - }; - class rhs_zsh7a_mike_green; - class rhs_zsh7a_mike_green_alt: rhs_zsh7a_mike_green { - ACE_Protection = 1; - }; - - class rhs_gssh18: H_HelmetB { - HEARING_PROTECTION_EARMUFF - }; - - class rhs_6b47; - class rhs_6b47_6m2: rhs_6b47 { - HEARING_PROTECTION_PELTOR - }; - class rhs_6b47_6m2_1: rhs_6b47 { - HEARING_PROTECTION_PELTOR - }; - - class rhs_6m2: H_HelmetB { - HEARING_PROTECTION_PELTOR - }; - - class rhs_weap_d81; - class rhs_weap_2a70: rhs_weap_d81 { // "Low pressure" 100mm cannon - ace_overpressure_range = 15; - ace_overpressure_damage = 0.5; - }; - class cannon_120mm; - class rhs_weap_2a28_base: cannon_120mm { // "Low pressure" - ace_overpressure_range = 15; - ace_overpressure_damage = 0.5; - }; - - CREATE_CSW_PROXY(rhs_weap_2b14); - CREATE_CSW_PROXY(rhs_weap_nsvt_effects); - CREATE_CSW_PROXY(rhs_weap_KORD); - CREATE_CSW_PROXY(RHS_weap_AGS30); - CREATE_CSW_PROXY(rhs_weap_SPG9); - CREATE_CSW_PROXY(rhs_weap_9K133_launcher); - CREATE_CSW_PROXY(rhs_weap_9K115_2_launcher); - - class GVAR(2b14_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "weapon"; - deployTime = 20; - pickupTime = 25; - class assembleTo { - EGVAR(csw,mortarBaseplate) = "rhs_2b14_82mm_msv"; - }; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - // One WeaponSlot with a positive value for iconScale forces game to use icon overlay method. - // Required, because the inventory icon has no accessory variants. - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 670; // 2B14 Mortar Weight - }; - displayName = ECSTRING(CSW,2b14_tube); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_2b14_82mm_msv_ca.paa"; - }; - - class GVAR(nsv_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "weapon"; - deployTime = 4; - pickupTime = 4; - class assembleTo { - EGVAR(csw,kordTripodLow) = "RHS_NSV_TriPod_MSV"; - }; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 550; - }; - displayName = ECSTRING(CSW,nsv_gun); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\RHS_NSV_TriPod_MSV_ca.paa"; - }; - - class GVAR(kord_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "weapon"; - deployTime = 4; - pickupTime = 4; - class assembleTo { - EGVAR(csw,kordTripod) = "rhs_KORD_high_MSV"; - EGVAR(csw,kordTripodLow) = "rhs_KORD_MSV"; - }; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 550; - }; - displayName = ECSTRING(CSW,kord_gun); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_KORD_MSV_ca.paa"; - }; - - class GVAR(ags30_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "weapon"; - deployTime = 4; - pickupTime = 4; - class assembleTo { - EGVAR(csw,sag30Tripod) = "RHS_AGS30_TriPod_MSV"; - }; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 400; // https://odin.tradoc.army.mil/mediawiki/index.php/AGS-17_Russian_30mm_Automatic_Grenade_Launcher - }; - displayName = ECSTRING(CSW,ags30_gun); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\RHS_AGS30_TriPod_MSV_ca.paa"; - }; - - class GVAR(spg9_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "weapon"; - deployTime = 4; - pickupTime = 4; - class assembleTo { - EGVAR(csw,spg9Tripod) = "rhs_SPG9_INS"; - }; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 1000; - }; - displayName = ECSTRING(csw,spg9_tube); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_SPG9_INS_ca.paa"; - }; - - class GVAR(spg9m_carry): GVAR(spg9_carry) { - class ACE_CSW: ACE_CSW { - class assembleTo { - EGVAR(csw,spg9Tripod) = "rhs_SPG9M_MSV"; - }; - }; - displayName = ECSTRING(csw,spg9m_tube); - author = ECSTRING(common,ACETeam); - }; - - class GVAR(metis_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "mount"; - deployTime = 4; - pickupTime = 4; - deploy = "rhs_Metis_9k115_2_msv"; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 300; - }; - displayName = ECSTRING(csw,metis_tube); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_Metis_9k115_2_msv_ca.paa"; - }; - - class GVAR(kornet_carry): Launcher_Base_F { - dlc = "ace"; - class ACE_CSW { - type = "mount"; - deployTime = 4; - pickupTime = 4; - deploy = "rhs_Kornet_9M133_2_msv"; - }; - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot { - iconScale = 0.1; - }; - mass = 600; - }; - displayName = ECSTRING(csw,kornet_launcher); - author = ECSTRING(common,ACETeam); - scope = 2; - model = QPATHTOEF(apl,ACE_CSW_Bag.p3d); - modes[] = {}; - picture = "\rhsafrf\addons\rhs_heavyweapons\data\ico\rhs_Kornet_9M133_2_msv_ca.paa"; - }; - - class rhs_uniform_flora; - class rhs_uniform_df15: rhs_uniform_flora { - ACE_GForceCoef = 0.8; - }; -}; diff --git a/optionals/compat_rhs_afrf3/meta.cpp b/optionals/compat_rhs_afrf3/meta.cpp deleted file mode 100644 index e418f622df..0000000000 --- a/optionals/compat_rhs_afrf3/meta.cpp +++ /dev/null @@ -1,2 +0,0 @@ -protocol = 1; -publishedid = 773131200; diff --git a/optionals/compat_rhs_saf3/CfgAmmo.hpp b/optionals/compat_rhs_saf3/CfgAmmo.hpp deleted file mode 100644 index 9517d0c5a3..0000000000 --- a/optionals/compat_rhs_saf3/CfgAmmo.hpp +++ /dev/null @@ -1,58 +0,0 @@ -class CfgAmmo { - - // ACE Ballistics - class BulletBase; - class rhs_ammo_792x57_Ball: BulletBase { - ACE_caliber = 8.077; - ACE_bulletLength = 28.651; - ACE_bulletMass = 12.7008; - ACE_ammoTempMuzzleVelocityShifts[] = {-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[] = {0.315}; - ACE_velocityBoundaries[] = {}; - ACE_standardAtmosphere = "ASM"; - ACE_dragModel = 1; - ACE_muzzleVelocities[] = {785, 800, 815}; - ACE_barrelLengths[] = {508.0, 599.948, 660.4}; - }; - - class rhs_B_762x39_Ball; - class rhssaf_ammo_762x39_m82_api: rhs_B_762x39_Ball { - ACE_Caliber = 7.8994; - ACE_bulletMass = 7.6074; - ACE_bulletLength = 27.2796; - ACE_muzzleVelocities[] = {650, 700, 748}; - ACE_barrelLengths[] = {206.85, 329.62, 412.75}; - }; - - // ACE Explosives - class DirectionalBombBase; - class rhssaf_mine_mrud_a_ammo: DirectionalBombBase { - ace_explosives_defuseObjectPosition[] = {-0.034, 0, 0.202}; - }; - - class rhssaf_mine_mrud_d_ammo: rhssaf_mine_mrud_a_ammo { - ace_explosives_defuseObjectPosition[] = {0.0325, 0, 0.18}; - }; - - class MineBase; - class rhssaf_mine_pma3_ammo: MineBase { - ace_explosives_defuseObjectPosition[] = {0, 0, 0.025}; - }; - - class rhssaf_mine_tma4_ammo: MineBase { - ace_explosives_defuseObjectPosition[] = {0, 0, 0.045}; - }; - - class PipeBombBase; - class rhssaf_tm100_ammo: PipeBombBase { - ace_explosives_defuseObjectPosition[] = {-0.055, 0, 0.014}; - }; - - class rhssaf_tm200_ammo: rhssaf_tm100_ammo { - ace_explosives_defuseObjectPosition[] = {-0.055, 0, 0.018}; - }; - - class rhssaf_tm500_ammo: rhssaf_tm100_ammo { - ace_explosives_defuseObjectPosition[] = {-0.056, 0, 0.032}; - }; -}; diff --git a/optionals/compat_rhs_usf3/meta.cpp b/optionals/compat_rhs_usf3/meta.cpp deleted file mode 100644 index 4dcda17c97..0000000000 --- a/optionals/compat_rhs_usf3/meta.cpp +++ /dev/null @@ -1,2 +0,0 @@ -protocol = 1; -publishedid = 773125288; diff --git a/optionals/compat_rhs_usf3/script_component.hpp b/optionals/compat_rhs_usf3/script_component.hpp deleted file mode 100644 index 4ba21abd49..0000000000 --- a/optionals/compat_rhs_usf3/script_component.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#define COMPONENT compat_rhs_usf3 -#define COMPONENT_BEAUTIFIED RHS USF Compatibility - -#include "\z\ace\addons\main\script_mod.hpp" - -#include "\z\ace\addons\main\script_macros.hpp" -#include "\z\ace\addons\fastroping\script_macros.hpp" diff --git a/optionals/compat_sog/CfgVehicles/units.hpp b/optionals/compat_sog/CfgVehicles/units.hpp deleted file mode 100644 index 0458ac18b8..0000000000 --- a/optionals/compat_sog/CfgVehicles/units.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#if __has_include("\x\grad_trenches\addons\main\config.bin") -#else -class Man; -class CAManBase: Man { - class ACE_SelfActions { - class ACE_Equipment { - class EGVAR(trenches,digEnvelopeSmall); - class GVAR(digSpiderhole): EGVAR(trenches,digEnvelopeSmall) { - displayName = CSTRING(Action_DigSpiderhole); - statement = QUOTE([ARR_2({_this call EFUNC(trenches,placeTrench)},[ARR_2(_this select 0,'vn_o_vc_spiderhole_01')])] call CBA_fnc_execNextFrame); - }; - class GVAR(digSpiderholeAngled): EGVAR(trenches,digEnvelopeSmall) { - displayName = CSTRING(Action_DigSpiderholeAngled); - statement = QUOTE([ARR_2({_this call EFUNC(trenches,placeTrench)},[ARR_2(_this select 0,'vn_o_vc_spiderhole_02')])] call CBA_fnc_execNextFrame); - }; - class GVAR(digSpiderholeDual): EGVAR(trenches,digEnvelopeSmall) { - displayName = CSTRING(Action_DigSpiderholeDual); - statement = QUOTE([ARR_2({_this call EFUNC(trenches,placeTrench)},[ARR_2(_this select 0,'vn_o_vc_spiderhole_03')])] call CBA_fnc_execNextFrame); - }; - }; - }; -}; -#endif - -class vn_b_men_aircrew_base; -class vn_b_men_jetpilot_01: vn_b_men_aircrew_base { - ACE_GForceCoef = 0.55; -}; - -class vn_o_men_aircrew_01; -class vn_o_men_aircrew_05: vn_o_men_aircrew_01 { - ACE_GForceCoef = 0.55; -}; - -class vn_i_men_aircrew_base; -class vn_i_men_jetpilot_01: vn_i_men_aircrew_base { - ACE_GForceCoef = 0.55; -}; diff --git a/optionals/nomedical/$PBOPREFIX$ b/optionals/nomedical/$PBOPREFIX$ new file mode 100644 index 0000000000..3f6d8ad8e6 --- /dev/null +++ b/optionals/nomedical/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\nomedical diff --git a/optionals/nomedical/config.cpp b/optionals/nomedical/config.cpp new file mode 100644 index 0000000000..e392061445 --- /dev/null +++ b/optionals/nomedical/config.cpp @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {}; + author = ECSTRING(common,ACETeam); + authors[] = {"Dystopian"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; diff --git a/optionals/nomedical/script_component.hpp b/optionals/nomedical/script_component.hpp new file mode 100644 index 0000000000..8fb8b9c73b --- /dev/null +++ b/optionals/nomedical/script_component.hpp @@ -0,0 +1,6 @@ +#define COMPONENT nomedical +#define COMPONENT_BEAUTIFIED No Medical + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/norealisticnames/$PBOPREFIX$ b/optionals/norealisticnames/$PBOPREFIX$ new file mode 100644 index 0000000000..f4a3ddedba --- /dev/null +++ b/optionals/norealisticnames/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\norealisticnames diff --git a/optionals/norealisticnames/config.cpp b/optionals/norealisticnames/config.cpp new file mode 100644 index 0000000000..e392061445 --- /dev/null +++ b/optionals/norealisticnames/config.cpp @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {}; + author = ECSTRING(common,ACETeam); + authors[] = {"Dystopian"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; diff --git a/optionals/norealisticnames/script_component.hpp b/optionals/norealisticnames/script_component.hpp new file mode 100644 index 0000000000..ed570dd357 --- /dev/null +++ b/optionals/norealisticnames/script_component.hpp @@ -0,0 +1,6 @@ +#define COMPONENT norealisticnames +#define COMPONENT_BEAUTIFIED No Realistic Names + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/tools/check_strings.py b/tools/check_strings.py index 7d56d52e01..5e5f62d4f7 100644 --- a/tools/check_strings.py +++ b/tools/check_strings.py @@ -73,6 +73,7 @@ def main(argv): for filename in xml_list: allDefinedStrings = allDefinedStrings + getDefinedStrings(filename) for filename in sqf_list: + if ("compat_rhs" in filename): continue #ignore strings in sub-configs for rhs/csw allUsedStrings = allUsedStrings + getStringUsage(filename) allDefinedStrings = list(sorted(set(allDefinedStrings))) diff --git a/tools/make.py b/tools/make.py index 1e03725e98..59bf68ef01 100644 --- a/tools/make.py +++ b/tools/make.py @@ -40,6 +40,7 @@ if sys.version_info[0] == 2: import os import os.path +import pathlib import shutil import platform import glob @@ -241,6 +242,19 @@ def mikero_windows_registry(path, access=winreg.KEY_READ): def find_depbo_tools(): """Use registry entries to find DePBO-based tools.""" + # try running pboProject once if it's not in registry + try: + pboProject = mikero_windows_registry("pboProject") + print(f"pboProject found normally via registry") + except: + print(f"pboProject not in registry") + pboProject = shutil.which('pboProject') + if (pboProject is None): + print("pboProject not in sys path") + else: + print(f"pboProject startup") + ret = subprocess.call([pboProject, "-P"]) + requiredToolPaths = {"pboProject": None, "rapify": None, "MakePbo": None} failed = False @@ -1538,6 +1552,16 @@ See the make.cfg file for additional build options. if len(failedBuilds) > 0: for failedBuild in failedBuilds: print("- {} build failed!".format(failedBuild)) + failedBuild_path = pathlib.Path( + "P:/temp").joinpath(f"{failedBuild}.packing.log") + if (failedBuild_path.exists()): + print(f" Log {failedBuild_path} tail:") + with open(failedBuild_path) as failedBuild_file: + lines = failedBuild_file.readlines() + for index, line in enumerate(lines[-3:]): + print(f" {len(lines) + index -2}: {line}", end='') + else: + print(f" Log {failedBuild_path} does not exist") if len(missingFiles) > 0: for missingFile in missingFiles: print("- {} not found!".format(missingFile)) diff --git a/tools/stringtable_validator.py b/tools/stringtable_validator.py index 7bafa16231..c28af96fd8 100644 --- a/tools/stringtable_validator.py +++ b/tools/stringtable_validator.py @@ -155,6 +155,7 @@ def main(): for root, _, files in os.walk(root_dir): for file in fnmatch.filter(files, "stringtable.xml"): + if (".hemttout" in root): continue stringtable_files.append(os.path.join(root, file)) stringtable_files.sort() diff --git a/tools/updateIncludes.py b/tools/updateIncludes.py index 721b6b363d..6ed0b2a469 100644 --- a/tools/updateIncludes.py +++ b/tools/updateIncludes.py @@ -3,7 +3,7 @@ import os import shutil -include_base_path = os.path.join(os.path.dirname(os.getcwd()), "include") +include_base_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "include") p_drive_path = "P:\\" if not os.path.exists(p_drive_path): @@ -16,6 +16,10 @@ for root, _dirs, files in os.walk(include_base_path): continue file_r_path = os.path.join(include_base_path, relative_path, file) file_v_path = os.path.join(p_drive_path, relative_path, file) + if (file_v_path.endswith(".p3d")): + print(f"ignoring p3d {file_v_path}") + continue if not os.path.isfile(file_v_path): raise Exception("Missing p-drive file {}".format(file_v_path)) shutil.copyfile(file_v_path, file_r_path) + print(f"copying {file_v_path}")